{"file":"index-CziXD_wA.js","mappings":"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","names":["_push","_parent","_ssrRenderList","_createBlock","_Fragment","_renderList","_createVNode","_ssrRenderAttrs","_mergeProps","_ssrRenderClass","bettingStats","emit","isConnected","_ssrRenderAttr","_imports_0","_unref","_imports_1","_","_scopeId","_ssrInterpolate","_ssrRenderComponent","AnimatePresence","_toDisplayString","_imports_2","_imports_3","_imports_4","_imports_5","_vShow","upWinAmount","downWinAmount","gameResetCounter","animationStates","_openBlock","apiClient"],"sources":["../../../../composables/useToast.js","../../../../components/common/RollingDigit.vue","../../../../components/common/RollingCounter.vue","../../../../assets/images/btc_logo.svg","../../../../assets/images/user.png","../../../../assets/images/guide_step1_1.png","../../../../assets/images/guide_step1_2.png","../../../../assets/images/guide_step1_3.png","../../../../assets/images/guide_step2_1.png","../../../../assets/images/guide_step3_1.png","../../../../assets/images/guide_step4_1.png","../../../../assets/images/guide_step4_2.png","../../../../composables/useBettingStats.js","../../../../node_modules/nuxt/dist/app/compat/interval.js","../../../../components/main/ChartSection.vue","../../../../assets/images/winner_bg.png","../../../../assets/images/coin_01.svg","../../../../assets/images/coin_02.svg","../../../../assets/images/coin_03.svg","../../../../assets/images/coin_04.svg","../../../../components/main/BettingStatus.vue","../../../../components/main/BettingHistory.vue","../../../../components/main/RankingHistory.vue","../../../../components/layout/Footer.vue","../../../../composables/useContainerQuery.js","../../../../pages/index.vue"],"sourcesContent":["import { ref } from 'vue';\n\nconst toasts = ref([]);\nlet toastId = 0;\n\nexport const useToast = () => {\n  const showToast = (message, type = 'info', duration = 3000) => {\n    const id = toastId++;\n    const toast = {\n      id,\n      message,\n      type, // 'success', 'error', 'warning', 'info'\n      visible: true\n    };\n\n    toasts.value.push(toast);\n\n    // duration 후 자동 제거\n    if (duration > 0) {\n      setTimeout(() => {\n        removeToast(id);\n      }, duration);\n    }\n\n    return id;\n  };\n\n  const removeToast = (id) => {\n    const index = toasts.value.findIndex(t => t.id === id);\n    if (index !== -1) {\n      toasts.value.splice(index, 1);\n    }\n  };\n\n  return {\n    toasts,\n    showToast,\n    removeToast\n  };\n};\n","<script setup>\nimport { motion } from \"motion-v\";\nimport { computed, ref, onMounted, watch, nextTick } from \"vue\";\nimport { useResizeListener } from \"@/composables/useDevice\";\n\nconst props = defineProps({\n  digit: {\n    type: Number,\n    required: true,\n  },\n  height: {\n    type: Number,\n    default: null,\n  },\n  typography: {\n    type: String,\n    default: null,\n  },\n  duration: {\n    type: Number,\n    default: 0.5,\n  },\n});\n\nconst digitWindowRef = ref(null);\nconst actualHeight = ref(null);\n\n// 높이를 재계산하는 함수\nconst updateHeight = () => {\n  if (props.typography && digitWindowRef.value && process.client) {\n    nextTick(() => {\n      if (!digitWindowRef.value) return;\n      const computedStyle = window.getComputedStyle(digitWindowRef.value);\n      const newHeight = parseFloat(computedStyle.height);\n      if (newHeight && newHeight !== actualHeight.value) {\n        actualHeight.value = newHeight;\n      }\n    });\n  }\n};\n\n// typography가 있을 때만 전역 resize 이벤트에 등록\nuseResizeListener(() => {\n  if (props.typography) {\n    updateHeight();\n  }\n});\n\n// typography가 있으면 실제 높이를 읽어옴\nonMounted(() => {\n  if (!process.client) return;\n  updateHeight();\n});\n\nwatch(\n  () => props.typography,\n  () => {\n    updateHeight();\n  }\n);\n\n// 실제 높이 계산\nconst digitHeight = computed(() => {\n  if (props.typography) {\n    return actualHeight.value || props.height || 0;\n  }\n  return props.height || 0;\n});\n\nconst yPosition = computed(() => {\n  const h = digitHeight.value;\n  if (!h) return 0;\n  return -1 * props.digit * h;\n});\n</script>\n\n<template>\n  <div\n    ref=\"digitWindowRef\"\n    class=\"digit-window\"\n    :class=\"{ [`digit-window--${typography}`]: typography }\"\n    :data-typography=\"typography || undefined\"\n    :style=\"height && !typography ? { height: `${height}px` } : {}\"\n  >\n    <motion.div\n      class=\"digit-strip\"\n      :key=\"`digit-${digit}`\"\n      :animate=\"{ y: yPosition }\"\n      :transition=\"{\n        type: 'spring',\n        stiffness: 60,\n        damping: 12,\n        mass: 1,\n        bounce: 0.4,\n      }\"\n    >\n      <div\n        v-for=\"n in 10\"\n        :key=\"n\"\n        class=\"digit-num\"\n        :style=\"\n          height && !typography\n            ? { height: `${height}px`, lineHeight: `${height}px` }\n            : {}\n        \"\n      >\n        {{ n - 1 }}\n      </div>\n    </motion.div>\n  </div>\n</template>\n\n<style scoped></style>\n","<script setup>\nimport { computed } from \"vue\";\nimport RollingDigit from \"./RollingDigit.vue\";\n\nconst props = defineProps({\n  value: {\n    type: Number,\n    required: true,\n  },\n  fontSize: {\n    type: [Number, String],\n    default: null,\n  },\n  typography: {\n    type: String,\n    default: null,\n    validator: (value) =>\n      !value || [\"h1\", \"h2\", \"h3\", \"h4\", \"p1\", \"p2\"].includes(value),\n  },\n  duration: {\n    type: Number,\n    default: 0.5,\n  },\n  prefix: {\n    type: String,\n    default: \"\",\n  },\n  suffix: {\n    type: String,\n    default: \"\",\n  },\n});\n\n// 숫자를 포맷팅된 문자열 배열로 분리\nconst splitValue = computed(() => {\n  const formatted = new Intl.NumberFormat(\"ko-KR\").format(props.value);\n  return formatted.split(\"\");\n});\n</script>\n\n<template>\n  <div class=\"rolling-counter__container\">\n    <template v-if=\"prefix\"\n      ><span>{{ prefix }}</span></template\n    >\n    <span\n      class=\"rolling-counter\"\n      :class=\"{ [`rolling-counter--${typography}`]: typography }\"\n      :data-typography=\"typography || undefined\"\n    >\n      <template\n        v-for=\"(char, index) in splitValue\"\n        :key=\"`${value}-${index}-${char}`\"\n      >\n        <RollingDigit\n          v-if=\"/^[0-9]$/.test(char)\"\n          :key=\"`digit-${value}-${index}-${char}`\"\n          :digit=\"parseInt(char)\"\n          :height=\"fontSize\"\n          :typography=\"typography\"\n          :duration=\"duration\"\n        />\n        <span v-else class=\"rolling-counter__char\">{{ char }}</span>\n      </template>\n    </span>\n    <template v-if=\"suffix\"\n      ><span>{{ suffix }}</span></template\n    >\n  </div>\n</template>\n\n<style scoped>\n\n</style>\n","export default \"data:image/svg+xml,%3csvg%20width='30'%20height='30'%20viewBox='0%200%2030%2030'%20fill='none'%20xmlns='http://www.w3.org/2000/svg'%3e%3cpath%20d='M29.539%2018.6296C27.5346%2026.6647%2019.3996%2031.5551%2011.3645%2029.5507C3.33534%2027.5464%20-1.55507%2019.4114%200.449292%2011.3763C2.44778%203.3353%2010.5828%20-1.55511%2018.6179%200.449251C26.653%202.45362%2031.5434%2010.5886%2029.539%2018.6237V18.6296Z'%20fill='url(%23paint0_linear_3250_3187)'/%3e%3cpath%20d='M21.6038%2012.8659C21.9036%2010.8674%2020.3812%209.79762%2018.3063%209.08051L18.9822%206.37668L17.3364%205.96522L16.6781%208.59852C16.2431%208.49272%2015.8023%208.38692%2015.3615%208.28699L16.0198%205.63606L14.374%205.22461L13.698%207.92844C13.3395%207.84615%2012.9868%207.76386%2012.6459%207.68157C12.6459%207.67569%2010.377%207.10554%2010.377%207.10554L9.94203%208.86303C9.94203%208.86303%2011.1646%209.14517%2011.1352%209.1628C11.7994%209.32738%2011.9229%209.76823%2011.8994%2010.1209L11.1294%2013.2009C11.1764%2013.2127%2011.2352%2013.2303%2011.2998%2013.2538C11.2469%2013.2421%2011.1881%2013.2244%2011.1235%2013.2127L10.0478%2017.5271C9.96554%2017.7269%209.75981%2018.0326%209.29546%2017.915C9.31309%2017.9385%208.10225%2017.6152%208.10225%2017.6152L7.28522%2019.4962L9.42477%2020.031C9.82447%2020.131%2010.2124%2020.2368%2010.6004%2020.3367L9.91852%2023.0699L11.5643%2023.4814L12.2403%2020.7775C12.687%2020.901%2013.1278%2021.0127%2013.5511%2021.1185L12.881%2023.8105L14.5268%2024.222L15.2086%2021.4946C18.0124%2022.0236%2020.1225%2021.812%2021.0101%2019.2728C21.7272%2017.2273%2020.9748%2016.0517%2019.4995%2015.2817C20.5751%2015.0348%2021.3863%2014.3295%2021.5979%2012.8659H21.6038ZM17.8419%2018.1384C17.3305%2020.1839%2013.892%2019.0788%2012.7752%2018.8026L13.6804%2015.1818C14.7972%2015.458%2018.3709%2016.0106%2017.8419%2018.1442V18.1384ZM18.3533%2012.8365C17.8889%2014.6939%2015.0264%2013.7534%2014.0977%2013.5183L14.9147%2010.2326C15.8434%2010.4618%2018.8353%2010.8968%2018.3533%2012.8365Z'%20fill='white'/%3e%3cdefs%3e%3clinearGradient%20id='paint0_linear_3250_3187'%20x1='16.0328'%20y1='-0.597015'%20x2='16.0328'%20y2='29.4978'%20gradientUnits='userSpaceOnUse'%3e%3cstop%20stop-color='%23F9AA4B'/%3e%3cstop%20offset='1'%20stop-color='%23F7931A'/%3e%3c/linearGradient%3e%3c/defs%3e%3c/svg%3e\"","export default \"data:image/png;base64,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\"","export default \"data:image/png;base64,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\"","export default \"__VITE_ASSET__CFWGTcr$__\"","export default \"__VITE_ASSET__Dszn8nGc__\"","export default \"__VITE_ASSET__DDvm21An__\"","export default \"__VITE_ASSET__Cj3X5tBP__\"","export default \"__VITE_ASSET__BS8YY1F___\"","export default \"__VITE_ASSET__ByGQc$8k__\"","import { ref, computed } from 'vue';\n\n// ===== 전역 상태 =====\n// 게임 리셋 카운터 (motion 컴포넌트 강제 리렌더링용)\nconst gameResetCounter = ref(0);\n\n// 애니메이션 완료 상태 (전역 관리 - 컴포넌트 재마운트 시에도 유지)\nconst animationStates = ref({\n  upAnimationComplete: false,\n  downAnimationComplete: false,\n  upCountAnimationComplete: false,\n  downCountAnimationComplete: false,\n  upResultExpanded: false,\n  downResultExpanded: false,\n  upWidthAnimationComplete: false,\n  downWidthAnimationComplete: false,\n  bothCountAnimationsComplete: false,\n});\n\n// 전역 배팅 통계 상태\nconst bettingStats = ref({\n  // UP 관련 통계\n  upTotalBetting: 0, // 내가 UP에 배팅한 총 금액\n  upExpectedProfit: 0, // UP 예상 수익\n  upWin: 0, // UP에 배팅한 모든 금액 (실제 배팅만)\n  upPeopleCount: 0, // UP 배팅 참여자 수\n  upParticipants: [], // UP 참여자 목록 (빈 배열로 시작)\n  upShowResult: false, // 게임 종료 시 결과 영역 표시 여부\n\n  // DOWN 관련 통계\n  downTotalBetting: 0, // 내가 DOWN에 배팅한 총 금액\n  downExpectedProfit: 0, // DOWN 예상 수익\n  downLose: 0, // DOWN에 배팅한 모든 금액 (실제 배팅만)\n  downPeopleCount: 0, // DOWN 배팅 참여자 수\n  downParticipants: [], // DOWN 참여자 목록 (빈 배열로 시작)\n  downShowResult: false, // 게임 종료 시 결과 영역 표시 여부\n\n  // 결과 정보 (승자: 'up' | 'down' | null)\n  winner: null,\n});\n\n// ===== 계산된 값 =====\n// UP 승리 금액 계산 (동적, 참여자 금액 변경 시 자동 업데이트)\nconst upWinAmount = computed(() => {\n  const total = bettingStats.value.upParticipants.reduce((sum, p) => sum + p.amount, 0);\n  return Math.floor(total * 1.2); // 테스트용: 기존 값 * 1.2\n});\n\n// DOWN 승리 금액 계산 (동적, 참여자 금액 변경 시 자동 업데이트)\nconst downWinAmount = computed(() => {\n  const total = bettingStats.value.downParticipants.reduce((sum, p) => sum + p.amount, 0);\n  return Math.floor(total * 1.2); // 테스트용: 기존 값 * 1.2\n});\n\n// ===== 배팅 관리 =====\n// 내 베팅 추가/업데이트\nconst addMyBetting = (direction, amount, userInfo = null) => {\n  // TotalBetting 값을 가져옴\n  const totalBetting = direction === 'up'\n    ? bettingStats.value.upTotalBetting\n    : bettingStats.value.downTotalBetting;\n\n  // 사용자 정보 기본값\n  const userName = userInfo?.nickname || userInfo?.name || 'You';\n\n  if (direction === 'up') {\n    // 기존 내 베팅 찾기\n    const existingMyBetting = bettingStats.value.upParticipants.find(p => p.isMy);\n\n    if (existingMyBetting) {\n      // 이미 베팅이 있으면 amount만 업데이트\n      existingMyBetting.amount = totalBetting;\n      existingMyBetting.name = userName;\n    } else {\n      // 없으면 새로 추가\n      const myBetting = {\n        id: `my-${direction}-${Date.now()}`,\n        name: userName,\n        amount: totalBetting,\n        isMy: true,\n      };\n      bettingStats.value.upParticipants.unshift(myBetting);\n    }\n  } else {\n    // 기존 내 베팅 찾기\n    const existingMyBetting = bettingStats.value.downParticipants.find(p => p.isMy);\n\n    if (existingMyBetting) {\n      // 이미 베팅이 있으면 amount만 업데이트\n      existingMyBetting.amount = totalBetting;\n      existingMyBetting.name = userName;\n    } else {\n      // 없으면 새로 추가\n      const myBetting = {\n        id: `my-${direction}-${Date.now()}`,\n        name: userName,\n        amount: totalBetting,\n        isMy: true,\n      };\n      bettingStats.value.downParticipants.unshift(myBetting);\n    }\n  }\n};\n\n// ===== 게임 결과 관리 =====\n// 승자 설정 (외부에서 'up' 또는 'down'을 넘겨서 제어)\nconst setWinner = (direction) => {\n  if (direction === 'up' || direction === 'down' || direction === null) {\n    bettingStats.value.winner = direction;\n  }\n};\n\n// 패자 설정 (direction을 넘기면 반대편을 승자로 설정)\nconst setLoser = (direction) => {\n  if (direction === 'up') {\n    bettingStats.value.winner = 'down';\n  } else if (direction === 'down') {\n    bettingStats.value.winner = 'up';\n  } else if (direction === null) {\n    bettingStats.value.winner = null;\n  }\n};\n\n// ===== 게임 데이터 초기화 =====\n// 게임 데이터 초기화 함수 (새 게임 시작 시 호출)\nconst resetGameData = () => {\n  // 애니메이션 상태 초기화\n  animationStates.value = {\n    upAnimationComplete: false,\n    downAnimationComplete: false,\n    upCountAnimationComplete: false,\n    downCountAnimationComplete: false,\n    upResultExpanded: false,\n    downResultExpanded: false,\n    upWidthAnimationComplete: false,\n    downWidthAnimationComplete: false,\n    bothCountAnimationsComplete: false,\n  };\n\n  // 결과 화면 즉시 숨김 (애니메이션 없이)\n  bettingStats.value.upShowResult = false;\n  bettingStats.value.downShowResult = false;\n\n  // 내 배팅 데이터 초기화\n  bettingStats.value.upTotalBetting = 0;\n  bettingStats.value.downTotalBetting = 0;\n  bettingStats.value.upPeopleCount = 0;\n  bettingStats.value.downPeopleCount = 0;\n  bettingStats.value.upExpectedProfit = 0;\n  bettingStats.value.downExpectedProfit = 0;\n\n  // 모든 참여자 제거 (서버에서 새 라운드 데이터 받을 때까지)\n  bettingStats.value.upParticipants = [];\n  bettingStats.value.downParticipants = [];\n\n  // 배팅 금액 초기화\n  bettingStats.value.upWin = 0;\n  bettingStats.value.downLose = 0;\n\n  // 승자 초기화\n  bettingStats.value.winner = null;\n};\n\n// 게임 데이터 완전 초기화 함수 (모든 데이터 제거, 빈 상태로 시작)\nconst resetGameDataEmpty = () => {\n  // 게임 리셋 카운터 증가 (motion 컴포넌트 강제 리렌더링)\n  gameResetCounter.value += 1;\n  \n  // 애니메이션 상태 초기화\n  animationStates.value = {\n    upAnimationComplete: false,\n    downAnimationComplete: false,\n    upCountAnimationComplete: false,\n    downCountAnimationComplete: false,\n    upResultExpanded: false,\n    downResultExpanded: false,\n    upWidthAnimationComplete: false,\n    downWidthAnimationComplete: false,\n    bothCountAnimationsComplete: false,\n  };\n  \n  // 결과 화면 즉시 숨김 (애니메이션 없이)\n  bettingStats.value.upShowResult = false;\n  bettingStats.value.downShowResult = false;\n  \n  // 모든 배팅 데이터 초기화\n  bettingStats.value.upTotalBetting = 0;\n  bettingStats.value.downTotalBetting = 0;\n  bettingStats.value.upPeopleCount = 0;\n  bettingStats.value.downPeopleCount = 0;\n  bettingStats.value.upExpectedProfit = 0;\n  bettingStats.value.downExpectedProfit = 0;\n  \n  // 모든 참여자 제거 (더미 + 내 베팅 모두)\n  bettingStats.value.upParticipants = [];\n  bettingStats.value.downParticipants = [];\n  \n  // 배팅 금액 초기화\n  bettingStats.value.upWin = 0;\n  bettingStats.value.downLose = 0;\n  \n  // 승자 설정 (기본적으로 UP이 승자)\n  bettingStats.value.winner = 'up';\n};\n\n// ===== Export =====\nexport const useBettingStats = () => {\n  return {\n    bettingStats,\n    upWinAmount,\n    downWinAmount,\n    addMyBetting,\n    setWinner,\n    setLoser,\n    resetGameData,\n    resetGameDataEmpty,\n    gameResetCounter,\n    animationStates, // 애니메이션 상태 전역 관리\n  };\n};\n\n","import { createError } from \"../composables/error.js\";\nconst intervalError = \"[nuxt] `setInterval` should not be used on the server. Consider wrapping it with an `onNuxtReady`, `onBeforeMount` or `onMounted` lifecycle hook, or ensure you only call it in the browser by checking `import.meta.client`.\";\nexport const setInterval = import.meta.client ? globalThis.setInterval : () => {\n  if (import.meta.dev) {\n    throw createError({\n      statusCode: 500,\n      message: intervalError\n    });\n  }\n  console.error(intervalError);\n};\n","<script setup>\nimport { motion, AnimatePresence } from \"motion-v\";\nimport { ref, computed, onMounted, onUnmounted, watch, nextTick } from \"vue\";\nimport { useDevice } from \"@/composables/useDevice\";\nimport { useBettingStats } from \"@/composables/useBettingStats\";\nimport { useAuth } from \"@/composables/useAuth\";\nimport { useBet } from \"@/composables/useBet\";\nimport { useSocket } from \"@/composables/useSocket\";\nimport apiClient from \"@/composables/common/axios\";\nimport chartExampleImage from \"@/assets/images/chart_example.png\";\n\n// ===== 상수 =====\nconst CIRCLE_RADIUS = 46;\nconst GAME_DURATION_MS = 30000; // 게임 총 시간 (30초로 변경 - Socket.io 서버와 동기화)\nconst DANGER_THRESHOLD_MS = 5000; // 위험 모드 진입 시간 (종료 5초 전)\nconst MID_GAME_ELAPSED_MS = 10000; // 중간 입장 테스트용 경과 시간 (10초)\nconst TRIGGER_THRESHOLD = 10; // 애니메이션 시작 트리거 값\nconst HISTORY_MAX_PC = 10;\nconst HISTORY_MAX_MOBILE = 3;\n\n// ===== Props =====\nconst props = defineProps({\n  showBettingStatus: {\n    type: Boolean,\n    default: false,\n  },\n});\n\n// ===== Composables =====\nconst { isMobile } = useDevice();\nconst { isLoggedIn, currentUser, refreshUser } = useAuth();\nconst { placeBet } = useBet();\nconst { connect, disconnect, on, off, emit, isConnected, updateUser } = useSocket();\nconst { showToast } = useToast();\n\n// ===== Refs =====\nconst chartCanvas = ref(null);\nconst historyData = ref([]);\nconst bettingDirections = ref([]);\nconst hoveredHistoryId = ref(null);\nconst previousHoveredId = ref(null);\n\n// 모달 refs\nconst playGuideModal = ref(null);\n\n// 가이드 모달 스텝 관리\nconst currentStep = ref(1);\nconst totalSteps = 4;\n\n// 애니메이션 관련\nconst shouldStartAnimation = ref(false);\nconst isAnimationComplete = ref(false);\nconst triggerValue = ref(0);\n\n// 게임 상태\nconst serverState = ref({\n  gameId: null,\n  status: \"WAITING\", // 'WAITING' | 'PLAYING' | 'FINISHED'\n  startTime: null,\n  endTime: null,\n  dangerTime: null,\n  totalDuration: GAME_DURATION_MS,\n});\n\n// 화면 표시 상태\nconst displayTime = ref(0);\nconst progressRate = ref(0);\nconst isDanger = ref(false);\n\n// 선택된 배팅 금액\nconst selectedAmount = ref(null);\n\n// input에 직접 입력한 값 (문자열, 콤마 포함)\nconst inputValue = ref(\"\");\n\n// 마지막 베팅 금액 (베팅 후 유지)\nconst lastBetAmount = ref(null);\n\n// 각 금액별 클릭 횟수 추적\nconst amountClickCount = ref({\n  10000: 0,\n  25000: 0,\n  50000: 0,\n  100000: 0,\n  500000: 0,\n});\n\n// 테스트 버튼 영역 표시 여부\nconst showTestButtons = ref(true);\n\n// 배팅 성공 알림 표시 여부\nconst showBettingSuccess = ref(false);\n\n// 잔고 주기적 갱신 타이머\nconst balanceInterval = ref(null);\n\n// 배팅 마감 토스트 마지막 표시 시간\nconst lastBettingCloseToast = ref(0);\n\n// 로그인 상태 변경 시 타이머 제어\nwatch(isLoggedIn, (newValue) => {\n  if (newValue) {\n    // 로그인 시 타이머 시작\n    if (!balanceInterval.value) {\n      balanceInterval.value = setInterval(() => {\n        refreshUser();\n      }, 3000);\n    }\n  } else {\n    // 로그아웃 시 타이머 정리\n    if (balanceInterval.value) {\n      clearInterval(balanceInterval.value);\n      balanceInterval.value = null;\n    }\n  }\n});\n\n// 배팅 마감 토스트 표시 (displayTime이 3초 이하가 되면)\nwatch(displayTime, (newTime, oldTime) => {\n  const now = Date.now();\n\n  // 3초 이하로 떨어졌을 때만 (한 라운드당 1회)\n  if (newTime <= 3000 && oldTime > 3000) {\n    // 25초 이상 지났을 때만 토스트 표시 (30초 라운드 기준, 라운드당 1회)\n    if (now - lastBettingCloseToast.value > 25000) {\n      lastBettingCloseToast.value = now;\n      showToast('배팅이 마감되었습니다.', 'warning');\n    }\n  }\n});\n\n// ===== 계산된 값 =====\nconst circumference = 2 * Math.PI * CIRCLE_RADIUS;\nconst maxHistoryCount = computed(() =>\n  isMobile.value ? HISTORY_MAX_MOBILE : HISTORY_MAX_PC\n);\n\n// ===== 더미 데이터 =====\n// 더미 요율 생성 함수 (90300 ~ 90400 사이 랜덤 값)\nconst generateDummyRate = () => {\n  const base = 90300;\n  const random = Math.random() * 100;\n  return (base + random).toFixed(5);\n};\n\nconst apiHistoryData = [\n  {\n    id: 1,\n    direction: \"up\",\n    label: \"승리\",\n    startRate: generateDummyRate(),\n    endRate: generateDummyRate(),\n  },\n  {\n    id: 2,\n    direction: \"down\",\n    label: \"패배\",\n    startRate: generateDummyRate(),\n    endRate: generateDummyRate(),\n  },\n  {\n    id: 3,\n    direction: \"down\",\n    label: \"패배\",\n    startRate: generateDummyRate(),\n    endRate: generateDummyRate(),\n  },\n  {\n    id: 4,\n    direction: \"up\",\n    label: \"승리\",\n    startRate: generateDummyRate(),\n    endRate: generateDummyRate(),\n  },\n  {\n    id: 5,\n    direction: \"up\",\n    label: \"승리\",\n    startRate: generateDummyRate(),\n    endRate: generateDummyRate(),\n  },\n  {\n    id: 6,\n    direction: \"up\",\n    label: \"승리\",\n    startRate: generateDummyRate(),\n    endRate: generateDummyRate(),\n  },\n  {\n    id: 7,\n    direction: \"down\",\n    label: \"패배\",\n    startRate: generateDummyRate(),\n    endRate: generateDummyRate(),\n  },\n  {\n    id: 8,\n    direction: \"up\",\n    label: \"승리\",\n    startRate: generateDummyRate(),\n    endRate: generateDummyRate(),\n  },\n  {\n    id: 9,\n    direction: \"down\",\n    label: \"패배\",\n    startRate: generateDummyRate(),\n    endRate: generateDummyRate(),\n  },\n  {\n    id: 10,\n    direction: \"up\",\n    label: \"승리\",\n    startRate: generateDummyRate(),\n    endRate: generateDummyRate(),\n  },\n  {\n    id: 11,\n    direction: \"up\",\n    label: \"승리\",\n    startRate: generateDummyRate(),\n    endRate: generateDummyRate(),\n  },\n];\n\n// 배팅 통계 (composable에서 가져옴)\nconst { bettingStats, addMyBetting, resetGameData, resetGameDataEmpty } =\n  useBettingStats();\n\n// 차트 메타 정보\nconst chartMeta = ref({\n  winRate: 0, // 24시간 승률 (%)\n  realtimePlayers: 0, // 24시간 실시간 플레이어 (명)\n  dailyPayout: 0, // 24시간 승리 지급액\n  totalPayout: 0, // 총 지급된 승리 금액\n});\n\n// 통계 조회\nconst fetchGameStats = async () => {\n  try {\n    const response = await apiClient.get('/api/stats.php?action=game_stats');\n    if (response.data.success) {\n      chartMeta.value = response.data.stats;\n      // // console.log('[Stats] Loaded:', response.data.stats);\n    }\n  } catch (error) {\n    console.error('[Stats] Fetch failed:', error);\n  }\n};\n\n// ===== RequestAnimationFrame 관리 =====\nlet rafId = null;\n\n// ===== Computed =====\nconst circleAnimation = computed(() => {\n  // 음수로 해야 시계 방향으로 감소\n  const offset = circumference * (progressRate.value - 1);\n  return { strokeDashoffset: offset };\n});\n\n// 내가 베팅한 총 금액\nconst myTotalBetting = computed(() => {\n  return (\n    bettingStats.value.upTotalBetting + bettingStats.value.downTotalBetting\n  );\n});\n\n// input에 표시할 값 (콤마 포함)\nconst displayInputValue = computed(() => {\n  return inputValue.value;\n});\n\n// 각 금액별 클릭 횟수 getter\nconst getClickCount = (amount) => {\n  return amountClickCount.value[amount] || 0;\n};\n\n// 정렬된 히스토리 데이터 (id 오름차순: 가장 오래된 것부터 최근 것까지)\nconst sortedHistoryData = computed(() => {\n  return [...historyData.value].sort((a, b) => a.id - b.id);\n});\n\n// 가장 최근 게임의 id\nconst latestGameId = computed(() => {\n  if (sortedHistoryData.value.length === 0) return null;\n  return sortedHistoryData.value[sortedHistoryData.value.length - 1].id;\n});\n\n// 숫자 포맷팅 함수 (콤마 추가)\nconst formatNumber = (num) => {\n  if (!num && num !== 0) return \"\";\n  return num.toString().replace(/\\B(?=(\\d{3})+(?!\\d))/g, \",\");\n};\n\n// 문자열에서 숫자만 추출하는 함수\nconst extractNumber = (str) => {\n  return str.replace(/[^0-9]/g, \"\");\n};\n\n// 키 입력 핸들러 (숫자만 허용)\nconst handleKeyPress = (event) => {\n  // 숫자, 백스페이스, 삭제, 화살표, 탭 키만 허용\n  const allowedKeys = [\n    \"Backspace\",\n    \"Delete\",\n    \"ArrowLeft\",\n    \"ArrowRight\",\n    \"ArrowUp\",\n    \"ArrowDown\",\n    \"Tab\",\n    \"Home\",\n    \"End\",\n  ];\n\n  if (allowedKeys.includes(event.key)) {\n    return;\n  }\n\n  // 숫자만 허용\n  if (!/[0-9]/.test(event.key)) {\n    event.preventDefault();\n  }\n};\n\n// input 값 변경 핸들러\nconst handleInputChange = (event) => {\n  const rawValue = event.target.value;\n  // 숫자만 추출\n  const numbersOnly = extractNumber(rawValue);\n\n  if (numbersOnly === \"\") {\n    inputValue.value = \"\";\n    selectedAmount.value = null;\n    return;\n  }\n\n  // 숫자로 변환\n  const numValue = parseInt(numbersOnly, 10);\n\n  // selectedAmount 업데이트\n  selectedAmount.value = numValue;\n\n  // 콤마가 포함된 형식으로 표시\n  inputValue.value = formatNumber(numValue);\n};\n\n// 미리보기용 총 배팅금 (내가 베팅한 금액 + 선택한 금액)\nconst previewTotalBetting = computed(() => {\n  const existingBet = myTotalBetting.value;\n  const selected = selectedAmount.value || 0;\n  return existingBet + selected;\n});\n\n// 배팅 가능 여부 (게임 진행 중이고 남은 시간이 0초 이상일 때)\nconst canBet = computed(() => {\n  // 게임이 진행 중이어야 함\n  if (!isGamePlaying.value) return false;\n\n  // 남은 시간이 0초 초과일 때만 배팅 가능 (displayTime은 초 단위)\n  return displayTime.value > 0;\n});\n\n// 배팅 마감 상태 (게임은 진행 중이지만 남은 시간이 0초 이하)\nconst isBettingClosed = computed(() => {\n  return isGamePlaying.value && displayTime.value <= 0;\n});\n\n// 게임 타이머가 돌아가는 동안 여부\nconst isGamePlaying = computed(() => {\n  return shouldStartAnimation.value;\n});\n\n// ===== Watchers =====\nwatch(triggerValue, (newValue) => {\n  if (newValue > TRIGGER_THRESHOLD && !shouldStartAnimation.value) {\n    shouldStartAnimation.value = true;\n  }\n});\n\nwatch(isMobile, () => {\n  if (historyData.value.length > 0) {\n    adjustHistoryData();\n  }\n});\n\n// 가이드 모달 스텝 네비게이션\nconst goToPreviousStep = () => {\n  if (currentStep.value > 1) {\n    currentStep.value--;\n  }\n};\n\nconst goToNextStep = () => {\n  if (currentStep.value < totalSteps) {\n    currentStep.value++;\n  }\n};\n\nconst isFirstStep = computed(() => currentStep.value === 1);\nconst isLastStep = computed(() => currentStep.value === totalSteps);\n\n// 모달이 열릴 때 스텝을 1로 리셋\nconst handleModalOpen = () => {\n  currentStep.value = 1;\n};\n\n// hoveredHistoryId 변경 시 이전 요소의 애니메이션 즉시 종료\nwatch(hoveredHistoryId, (newId, oldId) => {\n  if (oldId && oldId !== newId && process.client) {\n    // 이전 요소의 애니메이션을 즉시 종료하기 위해 DOM에서 제거\n    previousHoveredId.value = oldId;\n    nextTick(() => {\n      previousHoveredId.value = null;\n    });\n  }\n});\n\n// ===== 게임 루프 =====\nconst updateGameLoop = () => {\n  if (!serverState.value.endTime) return;\n\n  const now = Date.now();\n  const timeLeftMs = serverState.value.endTime - now;\n\n  // 게임 종료 처리\n  if (timeLeftMs <= 0) {\n    displayTime.value = 0;\n    progressRate.value = 1;\n    shouldStartAnimation.value = false;\n    isDanger.value = false;\n    isAnimationComplete.value = true;\n    // 게임 종료 시 결과 영역 표시 (UP/DOWN 모두)\n    bettingStats.value.upShowResult = true;\n    bettingStats.value.downShowResult = true;\n    if (rafId) cancelAnimationFrame(rafId);\n    return;\n  }\n\n  // 진행률 계산 (0 ~ 1)\n  const currentProgress = 1 - timeLeftMs / serverState.value.totalDuration;\n  progressRate.value = Math.max(0, Math.min(1, currentProgress));\n\n  // 화면 표시용 초 단위\n  displayTime.value = Math.ceil(timeLeftMs / 1000);\n\n  // 위험 모드 감지\n  isDanger.value = now >= serverState.value.dangerTime;\n\n  // 다음 프레임 요청\n  rafId = requestAnimationFrame(updateGameLoop);\n};\n\n// ===== 더미 API 함수 =====\nconst fetchServerGameStatus = (type) => {\n  return new Promise((resolve) => {\n    const now = Date.now();\n    const elapsed = type === \"MID\" ? MID_GAME_ELAPSED_MS : 0;\n    const serverStartTime = now - elapsed;\n\n    resolve({\n      gameId: 101,\n      status: \"PLAYING\",\n      startTime: serverStartTime,\n      endTime: serverStartTime + GAME_DURATION_MS,\n      dangerTime: serverStartTime + GAME_DURATION_MS - DANGER_THRESHOLD_MS,\n      totalDuration: GAME_DURATION_MS,\n      serverTimestamp: now,\n    });\n  });\n};\n\n// ===== 게임 제어 =====\nconst syncAndStartGame = async (type) => {\n  if (rafId) cancelAnimationFrame(rafId);\n  isAnimationComplete.value = false;\n  // 배팅 성공 알림 숨기기\n  showBettingSuccess.value = false;\n\n  const data = await fetchServerGameStatus(type);\n  serverState.value = data;\n  shouldStartAnimation.value = true;\n\n  updateGameLoop();\n};\n\n// 빈 상태로 새 게임 시작 (모든 데이터 제거)\nconst startNewGameEmpty = async (type) => {\n  // 게임 데이터 완전 초기화 (모든 데이터 제거, 빈 상태)\n  resetGameDataEmpty();\n\n  // 베팅 방향 초기화\n  bettingDirections.value = [];\n\n  // 배팅 성공 알림 숨기기\n  showBettingSuccess.value = false;\n\n  // 게임 시작\n  await syncAndStartGame(type);\n};\n\n// ===== Canvas 초기화 =====\nconst initCanvas = () => {\n  if (!chartCanvas.value) return;\n\n  const canvas = chartCanvas.value;\n  const ctx = canvas.getContext(\"2d\");\n  const img = new Image();\n\n  img.onload = () => {\n    canvas.width = img.width;\n    canvas.height = img.height;\n    ctx.drawImage(img, 0, 0);\n  };\n\n  img.src = chartExampleImage;\n};\n\n// ===== Lifecycle Hooks =====\nonMounted(() => {\n  if (process.client) {\n    initCanvas();\n    fetchBettingHistory(); // 배팅 이력 조회\n    fetchGameStats(); // 게임 통계 조회\n\n    // Socket.io 연결\n    const socket = connect(\n      currentUser.value?.id,\n      currentUser.value?.nickname,\n      currentUser.value?.avatar\n    );\n\n    // 실시간 가격 업데이트\n    on('price:update', (data) => {\n      if (data.price) {\n        // 가격 업데이트 로직 (필요시 구현)\n        // // console.log('[Socket] Price:', data.price);\n      }\n    });\n\n    // 라운드 정보 업데이트\n    on('round:update', (data) => {\n      // // console.log('[Socket] Round update:', data);\n      if (data.round_id) {\n        // 라운드가 변경되었으면 게임 데이터 초기화\n        const isNewRound = serverState.value.gameId && serverState.value.gameId !== data.round_id;\n\n        serverState.value.gameId = data.round_id;\n        serverState.value.status = data.status === 'betting' ? 'PLAYING' : 'WAITING';\n        serverState.value.startTime = data.round_start_time;\n\n        // 새 라운드 시작 시 배팅 데이터 초기화\n        if (isNewRound) {\n          // // console.log('[Round] New round started, resetting game data');\n          resetGameData();\n        }\n      }\n    });\n\n    // 타이머 틱\n    on('round:tick', (data) => {\n      // // console.log('[Socket] Round tick:', data);\n      if (data.remaining !== undefined) {\n        // // console.log('[Timer] Updating displayTime to:', data.remaining);\n\n        // 라라곤과 동일한 로직: 5~20초일 때만 타이머 숫자 표시\n        const shouldShowTimer = data.remaining > 5 && data.remaining <= 20;\n\n        if (shouldShowTimer) {\n          // 타이머 표시 (15~1초로 변환)\n          displayTime.value = data.remaining - 5;\n          progressRate.value = (data.remaining - 5) / 15; // 0-1 값으로 계산\n          isDanger.value = data.remaining <= 10; // 10초 이하일 때 빨간색\n          shouldStartAnimation.value = true;\n        } else {\n          // 로딩 바 표시\n          shouldStartAnimation.value = false;\n        }\n      }\n    });\n\n    // 결과 업데이트\n    on('results:update', (data) => {\n      // // console.log('[Socket] Results update:', data);\n      if (data.results && Array.isArray(data.results)) {\n        // // console.log('[History] Received', data.results.length, 'results');\n        historyData.value = data.results.map(r => ({\n          id: r.id,\n          direction: r.direction,\n          label: r.direction === 'up' ? '승리' : '패배',\n          startRate: r.startRate,\n          endRate: r.endRate\n        }));\n      }\n\n      // 배팅 이력도 새로고침 (결과가 확정되었으므로)\n      if (currentUser.value) {\n        fetchBettingHistory();\n      }\n    });\n\n    // 잔액 업데이트\n    on('balance:update', (data) => {\n      // // console.log('[Socket] Balance update event received:', data);\n      if (data.balance !== undefined) {\n        const { updateBalance } = useAuth();\n        const newBalance = Number(data.balance);\n        // // console.log('[Socket] Updating balance to:', newBalance);\n        updateBalance(newBalance);\n        // // console.log('[Socket] Balance update completed');\n      } else {\n        // console.warn('[Socket] Balance update event missing balance value:', data);\n      }\n    });\n\n    // 배팅 결과\n    on('bet:result', (data) => {\n      // // console.log('[Socket] Bet result:', data);\n    });\n\n    // 정산 결과\n    on('bet:settled', (data) => {\n      // // console.log('[Socket] Bet settled:', data);\n\n      // 배팅 이력 즉시 새로고침\n      fetchBettingHistory();\n\n      // 잔액 새로고침 (서버에서 balance:update도 보내지만 확실하게)\n      if (isLoggedIn.value) {\n        const { refreshUser } = useAuth();\n        refreshUser().then(() => {\n          // console.log('[Bet Settled] User balance refreshed');\n        });\n      }\n\n      // 결과 알림 표시 로직\n      if (data.result === '승리') {\n        showBettingSuccess.value = true;\n        setTimeout(() => {\n          showBettingSuccess.value = false;\n        }, 3000);\n      }\n    });\n\n    // 현재 라운드 배팅 정보 업데이트\n    on('bets:update', (data) => {\n      // // console.log('[Socket] Bets update:', data);\n\n      // UP/DOWN 배팅 금액 업데이트\n      bettingStats.value.upWin = data.upTotal || 0;\n      bettingStats.value.downLose = data.downTotal || 0;\n\n      // 참여자 수 업데이트\n      bettingStats.value.upPeopleCount = data.upCount || 0;\n      bettingStats.value.downPeopleCount = data.downCount || 0;\n\n      // 참여자 목록 업데이트 (서버에서 받은 데이터 사용)\n      if (data.upBets && Array.isArray(data.upBets)) {\n        // 내 배팅을 찾아서 isMy: true 설정\n        bettingStats.value.upParticipants = data.upBets.map(bet => {\n          const isMyBet = currentUser.value && bet.id === `user-${currentUser.value.id}`;\n          return {\n            ...bet,\n            isMy: isMyBet\n          };\n        });\n      }\n\n      if (data.downBets && Array.isArray(data.downBets)) {\n        // 내 배팅을 찾아서 isMy: true 설정\n        bettingStats.value.downParticipants = data.downBets.map(bet => {\n          const isMyBet = currentUser.value && bet.id === `user-${currentUser.value.id}`;\n          return {\n            ...bet,\n            isMy: isMyBet\n          };\n        });\n      }\n    });\n\n    // 소켓 연결 및 이벤트 리스너 설정 후 히스토리 데이터 요청\n    fetchHistoryData();\n\n    // 잔고 주기적 갱신 (3초마다)\n    if (isLoggedIn.value) {\n      balanceInterval.value = setInterval(() => {\n        refreshUser();\n      }, 3000);\n    }\n  }\n});\n\nonUnmounted(() => {\n  if (rafId) cancelAnimationFrame(rafId);\n\n  // 잔고 갱신 타이머 정리\n  if (balanceInterval.value) {\n    clearInterval(balanceInterval.value);\n    balanceInterval.value = null;\n  }\n\n  // Socket.io 이벤트 리스너 제거\n  off('price:update');\n  off('round:update');\n  off('round:tick');\n  off('results:update');\n  off('balance:update');\n  off('bet:result');\n  off('bet:settled');\n  off('bets:update');\n\n  // 연결 해제 (필요시)\n  // disconnect();\n});\n\n// ===== 로그인 후 chat:join 재전송 (한 번만) =====\nlet userUpdated = false;\nwatch([currentUser, isConnected], ([user, connected]) => {\n  if (!userUpdated && user?.id && connected) {\n    updateUser(user.id, user.nickname, user.avatar);\n    userUpdated = true;\n  }\n});\n\n// ===== 배팅 핸들러 =====\nconst handleBet = async (direction) => {\n  // canBet computed에서 이미 체크됨 (isGamePlaying && displayTime >= 3)\n  // 버튼이 disabled 상태면 여기까지 오지 않음\n\n  // 로그인 확인\n  if (!isLoggedIn.value) {\n    alert('로그인이 필요합니다.');\n    return;\n  }\n\n  // 선택된 금액 사용\n  const amount = selectedAmount.value;\n\n  if (!amount || amount < 1000) {\n    alert('베팅 금액을 선택해주세요.');\n    return;\n  }\n\n  // API 호출하여 실제 베팅 처리\n  const result = await placeBet(direction.toUpperCase(), amount, serverState.value.gameId);\n\n  // // console.log('[Bet] 배팅 결과:', result);\n\n  if (!result.success) {\n    alert(result.message || '베팅에 실패했습니다.');\n    return;\n  }\n\n  // 베팅 성공 - UI 업데이트\n  // 방향에 따라 내 배팅 금액 및 전체 금액 업데이트\n  if (direction === \"up\") {\n    // 내가 배팅한 총 금액 누적\n    bettingStats.value.upTotalBetting += amount;\n    // 전체 배팅 금액에 추가 (더미 + 내 금액)\n    bettingStats.value.upWin += amount;\n    // 최초 1회만 참여자 수 증가 (같은 방향에 중복 베팅 방지)\n    if (!bettingDirections.value.includes(\"up\")) {\n      bettingStats.value.upPeopleCount += 1;\n    }\n    // 예상 수익 업데이트 (전체 금액 기준)\n    bettingStats.value.upExpectedProfit = Math.floor(\n      bettingStats.value.upWin * 1.5\n    );\n  } else {\n    // 내가 배팅한 총 금액 누적\n    bettingStats.value.downTotalBetting += amount;\n    // 전체 배팅 금액에 추가 (더미 + 내 금액)\n    bettingStats.value.downLose += amount;\n    // 최초 1회만 참여자 수 증가 (같은 방향에 중복 베팅 방지)\n    if (!bettingDirections.value.includes(\"down\")) {\n      bettingStats.value.downPeopleCount += 1;\n    }\n    // 예상 수익 업데이트 (전체 금액 기준)\n    bettingStats.value.downExpectedProfit = Math.floor(\n      bettingStats.value.downLose * 1.5\n    );\n  }\n\n  // 베팅 방향 추가\n  bettingDirections.value.push(direction);\n\n  // 내 베팅 정보를 참여자 목록 맨 위에 추가\n  addMyBetting(direction, amount, currentUser.value);\n\n  // 잔액 업데이트 (API 응답에서 받은 새 잔액)\n  if (result.new_balance !== undefined) {\n    const { updateBalance } = useAuth();\n    updateBalance(result.new_balance);\n    // // console.log('[Bet] Balance updated:', result.new_balance);\n  }\n\n  // 마지막 베팅 금액 저장\n  lastBetAmount.value = amount;\n\n  // 베팅 후 선택된 금액 및 input 초기화\n  selectedAmount.value = null;\n  inputValue.value = \"\";\n\n  // 모든 금액별 클릭 횟수 초기화\n  Object.keys(amountClickCount.value).forEach((key) => {\n    amountClickCount.value[key] = 0;\n  });\n\n  // 배팅 성공 알림 표시 (3초 후 자동 닫힘)\n  showBettingSuccess.value = true;\n  setTimeout(() => {\n    showBettingSuccess.value = false;\n  }, 3000);\n};\n\n// 배팅 금액 선택 핸들러\nconst handleAmountClick = (amount) => {\n  // 다른 금액 버튼의 클릭 횟수 초기화\n  Object.keys(amountClickCount.value).forEach((key) => {\n    const keyAmount = parseInt(key, 10);\n    if (keyAmount !== amount) {\n      amountClickCount.value[keyAmount] = 0;\n    }\n  });\n\n  // 현재 금액의 클릭 횟수 증가\n  amountClickCount.value[amount] += 1;\n\n  // 누적 금액 계산\n  const totalAmount = amount * amountClickCount.value[amount];\n\n  // 선택된 금액 및 input 업데이트\n  selectedAmount.value = totalAmount;\n  inputValue.value = formatNumber(totalAmount);\n};\n\n// 초기화 핸들러\nconst handleReset = () => {\n  if (selectedAmount.value) {\n    selectedAmount.value = null;\n    inputValue.value = \"\";\n    lastBetAmount.value = null;\n    // 모든 금액별 클릭 횟수 초기화\n    Object.keys(amountClickCount.value).forEach((key) => {\n      amountClickCount.value[key] = 0;\n    });\n  }\n};\n\n// ===== 히스토리 관리 =====\nconst findOldestItemIndex = () => {\n  return historyData.value.reduce((minIndex, current, index, arr) => {\n    return current.id < arr[minIndex].id ? index : minIndex;\n  }, 0);\n};\n\nconst addHistoryItem = (direction, label, id) => {\n  // 최대 개수 초과 시 가장 오래된 항목 삭제\n  if (historyData.value.length >= maxHistoryCount.value) {\n    const oldestIndex = findOldestItemIndex();\n    historyData.value.splice(oldestIndex, 1);\n  }\n\n  // 새로운 항목 추가\n  historyData.value.push({\n    id,\n    direction,\n    label: label || (direction === \"up\" ? \"승리\" : \"패배\"),\n    startRate: generateDummyRate(),\n    endRate: generateDummyRate(),\n  });\n};\n\n// 배팅 이력 데이터\nconst bettingHistory = ref([]);\n\n// 배팅 이력 API 조회\nconst fetchBettingHistory = async () => {\n  try {\n    // 로그인 안되어 있으면 호출하지 않음\n    if (!currentUser.value) {\n      // // console.log('[Betting History] Not logged in');\n      bettingHistory.value = [];\n      return;\n    }\n\n    const response = await apiClient.get('/api/user.php?action=history&limit=20');\n\n    if (response.data.success) {\n      bettingHistory.value = response.data.history;\n      // // console.log('[Betting History] Loaded:', bettingHistory.value.length, 'items');\n    } else {\n      if (response.data.message === '로그인이 필요합니다.') {\n        // // console.log('[Betting History] Login required');\n        bettingHistory.value = [];\n      } else {\n        console.error('[Betting History] Error:', response.data.message);\n      }\n    }\n  } catch (error) {\n    console.error('[Betting History] Fetch failed:', error);\n    bettingHistory.value = [];\n  }\n};\n\n// 히스토리 데이터 조회 (게임 결과)\nconst fetchHistoryData = async () => {\n  const { emit, isConnected } = useSocket();\n\n  // 소켓이 연결될 때까지 기다림 (최대 5초)\n  let retries = 0;\n  while (!isConnected.value && retries < 10) {\n    await new Promise(resolve => setTimeout(resolve, 500));\n    retries++;\n  }\n\n  if (isConnected.value) {\n    emit('get:history');\n  }\n};\n\n// 히스토리 데이터 개수 조정\nconst adjustHistoryData = () => {\n  if (historyData.value.length > maxHistoryCount.value) {\n    const sortedData = [...historyData.value].sort((a, b) => a.id - b.id);\n    const itemsToRemove = sortedData.slice(\n      0,\n      historyData.value.length - maxHistoryCount.value\n    );\n    const idsToRemove = new Set(itemsToRemove.map((item) => item.id));\n\n    historyData.value = historyData.value.filter(\n      (item) => !idsToRemove.has(item.id)\n    );\n  }\n};\n\ndefineExpose({\n  syncAndStartGame,\n  triggerValue,\n  isAnimationComplete, // 애니메이션 완료 상태\n  addHistoryItem, // 히스토리 추가 함수\n  fetchHistoryData, // 히스토리 데이터 조회 함수\n});\n</script>\n<template>\n  <div class=\"chart\">\n    <div class=\"chart__container\">\n      <!-- 헤더 영역 (BTC 로고, 제목, 도움말 버튼) -->\n      <section class=\"chart__header\">\n        <div class=\"chart__header-row\">\n          <!-- BTC 로고 -->\n          <img\n            src=\"@/assets/images/btc_logo.svg\"\n            alt=\"BTC\"\n            class=\"chart__logo\"\n          />\n          <!-- 차트 제목 -->\n          <h2 class=\"chart__title\">\n            BTC<span class=\"chart__sub-title\">/USDT</span>\n          </h2>\n          <!-- 도움말 버튼 -->\n          <button\n            type=\"button\"\n            class=\"chart__btn-help ico-before ico-question\"\n            @click=\"\n              () => {\n                playGuideModal?.open();\n                handleModalOpen();\n              }\n            \"\n          >\n            <span class=\"blind\">작동방식</span>\n          </button>\n        </div>\n      </section>\n\n      <!-- 통계 영역 (UP/DOWN 배팅 정보, 타이머) -->\n      <section class=\"chart__section chart__section--stats\">\n        <div class=\"chart__stats\">\n          <!-- UP 배팅 카드 -->\n          <div class=\"chart__stat-card chart__stat-card--up\">\n            <!-- UP 배팅 정보 (총 배팅금, 예상 수익) -->\n            <dl class=\"chart__stat-info\">\n              <dt>총 배팅금</dt>\n              <dd>\n                <CommonRollingCounter\n                  :value=\"bettingStats.upTotalBetting\"\n                  prefix=\"₩\"\n                  typography=\"h4\"\n                />\n              </dd>\n              <dt v-if=\"!isMobile\">예상 수익</dt>\n              <dd v-if=\"!isMobile\">\n                <CommonRollingCounter\n                  :value=\"bettingStats.upExpectedProfit\"\n                  prefix=\"₩\"\n                  typography=\"h4\"\n                />\n              </dd>\n            </dl>\n\n            <!-- UP 결과 표시 영역 -->\n            <div class=\"chart__stat-result\">\n              <div class=\"chart__stats-group\">\n                <!-- 내가 UP에 베팅했을 때 표시되는 아이콘 -->\n                <motion.div\n                  v-if=\"bettingDirections.includes('up')\"\n                  :initial=\"{ opacity: 0, scale: 0, x: 0, y: 0 }\"\n                  :animate=\"{ opacity: 1, scale: 1, x: 0, y: 0 }\"\n                  :transition=\"{\n                    type: 'spring',\n                    stiffness: 300,\n                    damping: 15,\n                    mass: 0.8,\n                    bounce: 0.6,\n                  }\"\n                >\n                  <img src=\"@/assets/images/user.png\" alt=\"\" />\n                </motion.div>\n                <!-- UP 배지 -->\n                <span class=\"badge badge--up ico-after ico-up\">UP 승리</span>\n              </div>\n              <!-- UP 총 배팅금 (K 단위) -->\n              <strong class=\"chart__stat-value point-primary\">\n                <CommonRollingCounter\n                  :value=\"Math.floor(bettingStats.upWin / 1000)\"\n                  suffix=\"K\"\n                  typography=\"h1\"\n                />\n              </strong>\n            </div>\n          </div>\n\n          <!-- 게임 타이머 영역 -->\n          <div class=\"chart__timer\">\n            <!-- 타이머 원형 SVG -->\n            <svg\n              viewBox=\"0 0 100 100\"\n              fill=\"none\"\n              xmlns=\"http://www.w3.org/2000/svg\"\n            >\n              <!-- 타이머 배경 원 -->\n              <circle\n                cx=\"50\"\n                cy=\"50\"\n                r=\"46\"\n                class=\"chart__timer-circle chart__timer-circle--bg\"\n              />\n              <!-- 타이머 진행 원 (애니메이션) -->\n              <motion.circle\n                cx=\"50\"\n                cy=\"50\"\n                r=\"46\"\n                :class=\"[\n                  'chart__timer-circle',\n                  'chart__timer-circle--fg',\n                  shouldStartAnimation && 'chart__timer-circle--warning',\n                  isDanger && 'chart__timer-circle--danger',\n                ]\"\n                :stroke-dasharray=\"circumference\"\n                :animate=\"\n                  shouldStartAnimation\n                    ? circleAnimation\n                    : { strokeDashoffset: 0 }\n                \"\n                :transition=\"{ duration: 0 }\"\n                transform=\"rotate(-90 50 50)\"\n                stroke-linecap=\"round\"\n              />\n            </svg>\n            <!-- 타이머 텍스트 (게임 진행 중일 때만 표시) -->\n            <motion.div\n              v-if=\"shouldStartAnimation\"\n              class=\"chart__timer-text\"\n              :class=\"{ 'chart__timer-text--danger': isDanger }\"\n              :initial=\"{ opacity: 0, scale: 0, x: 0, y: 0 }\"\n              :animate=\"{ opacity: 1, scale: 1, x: 0, y: 0 }\"\n              :transition=\"{\n                type: 'spring',\n                stiffness: 200,\n                damping: 15,\n                mass: 0.8,\n                bounce: 0.3,\n              }\"\n            >\n              <!-- 남은 시간 숫자 -->\n              <motion.span\n                class=\"chart__timer-num\"\n                :key=\"displayTime\"\n                :initial=\"isDanger ? { scale: 1.5 } : {}\"\n                :animate=\"isDanger ? { scale: 1 } : {}\"\n                :transition=\"{\n                  type: 'spring',\n                  stiffness: 400,\n                  damping: 7,\n                  mass: 0.8,\n                  bounce: 0.5,\n                }\"\n              >\n                {{ displayTime }}\n              </motion.span>\n              <!-- 시간 단위 -->\n              <span class=\"chart__timer-unit\">초</span>\n            </motion.div>\n\n            <!-- 게임 시작 전 대기 아이콘 (바 차트) -->\n            <div class=\"chart__timer-circle-group\" v-if=\"!shouldStartAnimation\">\n              <motion.i\n                v-for=\"(bar, index) in 5\"\n                :key=\"index\"\n                class=\"chart__timer-circle-bar\"\n                :animate=\"{ height: isMobile ? [10, 30, 10] : [10, 40, 10] }\"\n                :transition=\"{\n                  duration: 1,\n                  repeat: Infinity,\n                  ease: [0.42, 0, 0.58, 1.2],\n                  delay: index * 0.12,\n                }\"\n              ></motion.i>\n            </div>\n          </div>\n\n          <!-- DOWN 배팅 카드 -->\n          <div class=\"chart__stat-card chart__stat-card--down\">\n            <!-- DOWN 결과 표시 영역 -->\n            <div class=\"chart__stat-result\">\n              <div class=\"chart__stats-group\">\n                <!-- DOWN 배지 -->\n                <span class=\"badge badge--down ico-after ico-down\"\n                  >Down 패배</span\n                >\n                <!-- 내가 DOWN에 베팅했을 때 표시되는 아이콘 -->\n                <motion.div\n                  v-if=\"bettingDirections.includes('down')\"\n                  :initial=\"{ opacity: 0, scale: 0, x: 0, y: 0 }\"\n                  :animate=\"{ opacity: 1, scale: 1, x: 0, y: 0 }\"\n                  :transition=\"{\n                    type: 'spring',\n                    stiffness: 300,\n                    damping: 15,\n                    mass: 0.8,\n                    bounce: 0.6,\n                  }\"\n                >\n                  <img src=\"@/assets/images/user.png\" alt=\"\" />\n                </motion.div>\n              </div>\n              <!-- DOWN 총 배팅금 (K 단위) -->\n              <strong class=\"chart__stat-value point-secondary\">\n                <CommonRollingCounter\n                  :value=\"Math.floor(bettingStats.downLose / 1000)\"\n                  suffix=\"K\"\n                  typography=\"h1\"\n                />\n              </strong>\n            </div>\n\n            <!-- DOWN 배팅 정보 (총 배팅금, 예상 수익) -->\n            <dl class=\"chart__stat-info\">\n              <dt>총 배팅금</dt>\n              <dd>\n                <CommonRollingCounter\n                  :value=\"bettingStats.downTotalBetting\"\n                  prefix=\"₩\"\n                  typography=\"h4\"\n                />\n              </dd>\n              <dt v-if=\"!isMobile\">예상 수익</dt>\n              <dd v-if=\"!isMobile\">\n                <CommonRollingCounter\n                  :value=\"bettingStats.downExpectedProfit\"\n                  prefix=\"₩\"\n                  typography=\"h4\"\n                />\n              </dd>\n            </dl>\n          </div>\n        </div>\n      </section>\n\n      <!-- 차트 그래프 영역 -->\n      <div class=\"chart__section-wrapper\">\n        <section class=\"chart__section chart__section--graph\">\n          <!-- 차트 iframe -->\n          <div class=\"chart__canvas\">\n            <iframe\n              id=\"bcChartIframe\"\n              src=\"/btc/index.php\"\n              style=\"width: 100%; height: 100%; border: none; background: #000;\"\n              allow=\"accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture\"\n              loading=\"eager\"\n            ></iframe>\n          </div>\n\n          <!-- 차트 메타 정보 영역 -->\n          <div class=\"chart__meta\">\n            <!-- 차트 통계 정보 -->\n            <div class=\"chart__meta-stats\">\n              <!-- 24시간 승률 (데스크탑만) -->\n              <div class=\"chart__meta-info\" v-if=\"!isMobile\">\n                <strong class=\"chart__meta-value\">\n                  <CommonRollingCounter\n                    :value=\"chartMeta.winRate\"\n                    suffix=\" %\"\n                    typography=\"h4\"\n                  />\n                </strong>\n                <span class=\"chart__meta-label\">24시간 승률</span>\n              </div>\n              <!-- 24시간 실시간 플레이어 -->\n              <div class=\"chart__meta-info\">\n                <strong class=\"chart__meta-value\">\n                  <CommonRollingCounter\n                    :value=\"chartMeta.realtimePlayers\"\n                    suffix=\" 명\"\n                    typography=\"h4\"\n                  />\n                </strong>\n                <span class=\"chart__meta-label\">24시간 실시간 플레이어</span>\n              </div>\n              <!-- 24시간 승리 지급액 (데스크탑만) -->\n              <div class=\"chart__meta-info\" v-if=\"!isMobile\">\n                <strong class=\"chart__meta-value\">\n                  <CommonRollingCounter\n                    :value=\"chartMeta.dailyPayout\"\n                    prefix=\"₩\"\n                    typography=\"h4\"\n                  />\n                </strong>\n                <span class=\"chart__meta-label\">24시간 승리 지급액</span>\n              </div>\n              <!-- 총 지급된 승리 금액 -->\n              <div class=\"chart__meta-info\">\n                <strong class=\"chart__meta-value\">\n                  <CommonRollingCounter\n                    :value=\"chartMeta.totalPayout\"\n                    prefix=\"₩\"\n                    typography=\"h4\"\n                  />\n                </strong>\n                <span class=\"chart__meta-label\">총 지급된 승리 금액</span>\n              </div>\n            </div>\n\n            <!-- 게임 히스토리 (승리/패배 기록) -->\n            <ul class=\"chart__history\">\n              <li\n                v-for=\"item in sortedHistoryData\"\n                :key=\"item.id\"\n                :data-history=\"item.id\"\n                :class=\"[\n                  'chart__history-dot',\n                  `chart__history-dot--${item.direction}`,\n                  'ico-before',\n                  `ico-${item.direction}`,\n                  { 'chart__history-dot--latest': item.id === latestGameId },\n                ]\"\n                @mouseenter=\"hoveredHistoryId = item.id\"\n                @mouseleave=\"hoveredHistoryId = null\"\n              >\n                <span class=\"blind\">{{ item.label }}</span>\n                <AnimatePresence mode=\"wait\">\n                  <motion.div\n                    v-if=\"\n                      hoveredHistoryId === item.id &&\n                      previousHoveredId !== item.id\n                    \"\n                    :key=\"`history-info-${hoveredHistoryId}`\"\n                    class=\"chart__history-info ico-after ico-polygon\"\n                    :initial=\"{ opacity: 0, scale: 0.8, x: 0, y: 0 }\"\n                    :animate=\"{ opacity: 1, scale: 1, x: 0, y: 0 }\"\n                    :exit=\"{ opacity: 0, scale: 0.8, x: 0, y: 0 }\"\n                    :transition=\"{\n                      type: 'spring',\n                      stiffness: 400,\n                      damping: 15,\n                      mass: 0.8,\n                      bounce: 0.6,\n                    }\"\n                  >\n                    <div\n                      class=\"chart__history-info-value chart__history-info-value--start\"\n                    >\n                      <span>시작 요율</span>\n                      <strong>{{ item.startRate }}</strong>\n                    </div>\n                    <div\n                      class=\"chart__history-info-value chart__history-info-value--end\"\n                    >\n                      <span>최종 요율</span>\n                      <strong>{{ item.endRate }}</strong>\n                    </div>\n                  </motion.div>\n                </AnimatePresence>\n              </li>\n            </ul>\n          </div>\n        </section>\n      </div>\n\n      <!-- 베팅 상태 영역 (조건부 표시) -->\n      <!-- 모바일에서만 표시 (현재는 사용 안함) -->\n      <!--\n      <section v-if=\"props.showBettingStatus\" class=\"betting-status\">\n        <MainBettingStatus />\n      </section>\n      -->\n\n      <!-- 배팅 입력 영역 -->\n      <section v-if=\"isLoggedIn\" class=\"chart__section chart__section--betting\">\n        <!-- 배경 장식 요소 -->\n        <div class=\"chart__decorations\">\n          <div class=\"blob blob--red\"></div>\n          <div class=\"blob blob--green\"></div>\n        </div>\n\n        <!-- 총 배팅금 미리보기 -->\n        <div class=\"chart__bet-summary\">\n          <span class=\"chart__bet-label\">총 배팅금</span>\n          <strong class=\"chart__bet-total\">\n            <CommonRollingCounter\n              :value=\"previewTotalBetting\"\n              prefix=\"₩\"\n              typography=\"p1\"\n            />\n          </strong>\n        </div>\n\n        <!-- 금액 입력 영역 -->\n        <div class=\"chart__input-group\">\n          <div class=\"chart__amount-wrap\">\n            <i class=\"ico-prefix\"></i>\n            <!-- 금액 직접 입력 input -->\n            <input\n              class=\"chart__amount\"\n              type=\"text\"\n              :value=\"displayInputValue\"\n              @input=\"handleInputChange\"\n              @keypress=\"handleKeyPress\"\n              placeholder=\"금액 입력\"\n            />\n          </div>\n          <!-- 입력 초기화 버튼 -->\n          <button\n            type=\"button\"\n            class=\"chart__btn-reset btn-ghost-light ico-before ico-refresh\"\n            @click=\"handleReset\"\n          >\n            초기화\n          </button>\n        </div>\n\n        <!-- 배팅 컨트롤 영역 -->\n        <div class=\"chart__controls\">\n          <!-- 금액 선택 버튼 그룹 -->\n          <div class=\"chart__control-group\">\n            <!-- 10K 버튼 -->\n            <div class=\"btn-blur-wrap\">\n              <button\n                class=\"btn btn-blur btn-md\"\n                :class=\"{ active: getClickCount(10000) > 0 }\"\n                @click=\"handleAmountClick(10000)\"\n              >\n                10K\n                <span v-if=\"getClickCount(10000) >= 2\" class=\"chart__chip-badge\"\n                  >x{{ getClickCount(10000) }}</span\n                >\n              </button>\n            </div>\n            <!-- 25K 버튼 -->\n            <div class=\"btn-blur-wrap\">\n              <button\n                class=\"btn btn-blur btn-md\"\n                :class=\"{ active: getClickCount(25000) > 0 }\"\n                @click=\"handleAmountClick(25000)\"\n              >\n                25K\n                <span v-if=\"getClickCount(25000) >= 2\" class=\"chart__chip-badge\"\n                  >x{{ getClickCount(25000) }}</span\n                >\n              </button>\n            </div>\n            <!-- 50K 버튼 -->\n            <div class=\"btn-blur-wrap\">\n              <button\n                class=\"btn btn-blur btn-md\"\n                :class=\"{ active: getClickCount(50000) > 0 }\"\n                @click=\"handleAmountClick(50000)\"\n              >\n                50K\n                <span v-if=\"getClickCount(50000) >= 2\" class=\"chart__chip-badge\"\n                  >x{{ getClickCount(50000) }}</span\n                >\n              </button>\n            </div>\n            <!-- 100K 버튼 -->\n            <div class=\"btn-blur-wrap\">\n              <button\n                class=\"btn btn-blur btn-md\"\n                :class=\"{ active: getClickCount(100000) > 0 }\"\n                @click=\"handleAmountClick(100000)\"\n              >\n                100K\n                <span\n                  v-if=\"getClickCount(100000) >= 2\"\n                  class=\"chart__chip-badge\"\n                  >x{{ getClickCount(100000) }}</span\n                >\n              </button>\n            </div>\n            <!-- 500K 버튼 -->\n            <div class=\"btn-blur-wrap\">\n              <button\n                class=\"btn btn-blur btn-md\"\n                :class=\"{ active: getClickCount(500000) > 0 }\"\n                @click=\"handleAmountClick(500000)\"\n              >\n                500K\n                <span\n                  v-if=\"getClickCount(500000) >= 2\"\n                  class=\"chart__chip-badge\"\n                  >x{{ getClickCount(500000) }}</span\n                >\n              </button>\n            </div>\n          </div>\n\n          <!-- 방향 선택 버튼 그룹 -->\n          <div class=\"chart__control-group\">\n            <!-- UP 배팅 버튼 -->\n            <button\n              type=\"button\"\n              class=\"chart__btn-action chart__btn-action--up btn-gradient btn-lg ico-after ico-up-white\"\n              :class=\"{ 'chart__btn-action--disabled': !canBet }\"\n              :disabled=\"!canBet\"\n              :title=\"isBettingClosed ? '배팅이 마감되었습니다' : ''\"\n              @click=\"handleBet('up')\"\n            >\n              UP\n            </button>\n            <!-- DOWN 배팅 버튼 -->\n            <button\n              type=\"button\"\n              class=\"chart__btn-action chart__btn-action--down btn-danger btn-lg ico-after ico-down-white\"\n              :class=\"{ 'chart__btn-action--disabled': !canBet }\"\n              :disabled=\"!canBet\"\n              :title=\"isBettingClosed ? '배팅이 마감되었습니다' : ''\"\n              @click=\"handleBet('down')\"\n            >\n              DOWN\n            </button>\n          </div>\n        </div>\n      </section>\n\n      <!-- 비로그인 상태: 로그인 필요 메시지 -->\n      <section v-else class=\"chart__section chart__section--betting chart__section--login-required\">\n        <div class=\"login-required-message\">\n          <i class=\"bi bi-lock\"></i>\n          <p>배팅하려면 로그인이 필요합니다</p>\n          <NuxtLink to=\"/intro\" class=\"btn btn-primary\">로그인</NuxtLink>\n        </div>\n      </section>\n    </div>\n  </div>\n\n  <!-- 애니메이션 테스트 버튼 -->\n  <!-- <div\n    v-show=\"showTestButtons\"\n    style=\"\n      position: fixed;\n      bottom: 0;\n      right: 0;\n      display: flex;\n      flex-direction: column;\n      gap: 0.8rem;\n      z-index: 1000;\n      background: rgba(0, 0, 0, 0.8);\n      padding: 1.6rem;\n      border-radius: 0.8rem;\n    \"\n  >\n    <div\n      style=\"\n        display: flex;\n        justify-content: space-between;\n        align-items: center;\n        margin-bottom: 0.4rem;\n      \"\n    >\n      <span style=\"color: white; font-weight: bold\">테스트 버튼</span>\n      <button\n        type=\"button\"\n        @click=\"showTestButtons = false\"\n        style=\"\n          background: rgba(255, 255, 255, 0.2);\n          border: none;\n          color: white;\n          width: 2.4rem;\n          height: 2.4rem;\n          border-radius: 0.4rem;\n          cursor: pointer;\n          display: flex;\n          align-items: center;\n          justify-content: center;\n          font-size: 1.6rem;\n          line-height: 1;\n        \"\n      >\n        ×\n      </button>\n    </div>\n    <div style=\"display: flex; gap: 0.8rem; flex-wrap: wrap\">\n      <button\n        type=\"button\"\n        @click=\"() => syncAndStartGame('NEW')\"\n        class=\"btn-primary\"\n      >\n        게임 시작 (New Game)\n      </button>\n      <button\n        type=\"button\"\n        @click=\"() => syncAndStartGame('MID')\"\n        class=\"btn-primary\"\n      >\n        중간 입장 (10초 지남 / 5초 남음)\n      </button>\n      <button\n        type=\"button\"\n        @click=\"() => startNewGameEmpty('NEW')\"\n        class=\"btn-primary\"\n      >\n        2번째 게임 시작 (빈 데이터)\n      </button>\n    </div>\n  </div> -->\n\n  <AnimatePresence>\n    <motion.div\n      class=\"betting-success ico-before ico-check\"\n      v-if=\"showBettingSuccess\"\n      :initial=\"{\n        opacity: 0,\n        x: -100,\n      }\"\n      :animate=\"{\n        opacity: 1,\n        x: 0,\n        transition: {\n          type: 'spring',\n          stiffness: 400,\n          damping: 20,\n        },\n      }\"\n      :exit=\"{\n        opacity: 0,\n        x: -100,\n        transition: {\n          duration: 0.15,\n          ease: [0.4, 0, 0.2, 1],\n        },\n      }\"\n    >\n      <p>주문이 성공적으로 완료되었습니다!</p>\n      <button\n        type=\"button\"\n        class=\"ico-close\"\n        @click=\"showBettingSuccess = false\"\n      ></button>\n    </motion.div>\n  </AnimatePresence>\n\n  <Modal ref=\"playGuideModal\" title=\"작동방식\" type=\"b\">\n    <template #default=\"{ close }\">\n      <div class=\"modal__content-body\">\n        <div class=\"modal__content-guide\">\n          <motion.div\n            v-show=\"isMobile || currentStep === 1\"\n            class=\"modal__content-guide-item\"\n            :initial=\"isMobile ? {} : { opacity: 0, x: 50 }\"\n            :animate=\"isMobile || currentStep !== 1 ? {} : { opacity: 1, x: 0 }\"\n            :transition=\"{\n              type: 'spring',\n              stiffness: 300,\n              damping: 30,\n              mass: 0.8,\n            }\"\n          >\n            <strong class=\"modal__content-guide-title\"\n              ><span>1.</span> 향후 가격 방향 선택</strong\n            >\n            <div\n              class=\"modal__content-guide-desc modal__content-guide-desc--flex\"\n            >\n              <div class=\"modal__content-guide-desc-item\">\n                <div class=\"modal__content-guide-desc-thumb\">\n                  <img\n                    src=\"@/assets/images/guide_step1_1.png\"\n                    alt=\"CountDown Timer\"\n                  />\n                </div>\n                <p>\n                  카운트다운의 지정된 시간 내에 주문하려면 <br />\n                  위쪽 또는 아래쪽 방향을 선택합니다.\n                </p>\n              </div>\n              <div class=\"modal__content-guide-desc-item\">\n                <div class=\"modal__content-guide-desc-thumb\">\n                  <img\n                    src=\"@/assets/images/guide_step1_2.png\"\n                    alt=\"Betting Up\"\n                  />\n                </div>\n                <p>\n                  가격이 오를 것 같으면 UP을 선택하여 <br />\n                  트렌드와 함께 하세요.\n                </p>\n              </div>\n              <div class=\"modal__content-guide-desc-item\">\n                <div class=\"modal__content-guide-desc-thumb\">\n                  <img\n                    src=\"@/assets/images/guide_step1_3.png\"\n                    alt=\"Betting Down\"\n                  />\n                </div>\n                <p>\n                  가격이 하락할 것 같으면 DOWN를 선택해 <br />\n                  하락을 잡으세요.\n                </p>\n              </div>\n            </div>\n            </motion.div>\n            <motion.div\n              v-show=\"isMobile || currentStep === 2\"\n              key=\"step-2\"\n              class=\"modal__content-guide-item\"\n              :initial=\"isMobile ? {} : { opacity: 0, x: 50 }\"\n              :animate=\"isMobile || currentStep !== 2 ? {} : { opacity: 1, x: 0 }\"\n              :transition=\"{\n                type: 'spring',\n                stiffness: 300,\n                damping: 30,\n                mass: 0.8,\n              }\"\n            >\n            <strong class=\"modal__content-guide-title\"\n              ><span>2.</span> UP과 DOWN 방향에서 펀드 풀의 총\n              주문 금액과 목록에서 본인 및 다른 사용자의 주문 상태를 확인할 수\n              있습니다.</strong\n            >\n            <div class=\"modal__content-guide-desc\">\n              <img src=\"@/assets/images/guide_step2_1.png\" alt=\"Fund Pool\" />\n            </div>\n          </motion.div>\n          <motion.div\n            v-show=\"isMobile || currentStep === 3\"\n            class=\"modal__content-guide-item\"\n            :initial=\"isMobile ? {} : { opacity: 0, x: 50 }\"\n            :animate=\"isMobile || currentStep !== 3 ? {} : { opacity: 1, x: 0 }\"\n            :transition=\"{\n              type: 'spring',\n              stiffness: 300,\n              damping: 30,\n              mass: 0.8,\n            }\"\n          >\n            <strong class=\"modal__content-guide-title\"\n              ><span>3.</span> 시스템 정산 대기</strong\n            >\n            <div class=\"modal__content-guide-desc\">\n              <div class=\"modal__content-guide-desc-item\">\n                <img\n                  src=\"@/assets/images/guide_step3_1.png\"\n                  alt=\"System Settlement\"\n                  class=\"modal__content-guide-img-fit\"\n                />\n                <p>\n                  카운트다운이 종료되면 준비 정산 프로세스에 들어갑니다.\n                  시스템은 카운트다운이 종료된 후 시작가(첫 번째 플래그)를\n                  기록합니다. <br />\n                  K-라인이 일정 시간 동안 실행되면 시스템은 종료 가격(두 번째\n                  플래그)을 기록합니다. 종료 가격과 시작 가격을 비교합니다.\n                  <br />\n                  종가가 시작가보다 높으면 상승 방향을 선택한 트레이더가\n                  승리합니다. 그렇지 않으면 DOWN 방향을 선택한 트레이더가\n                  승리합니다.\n                </p>\n              </div>\n            </div>\n          </motion.div>\n          <motion.div\n            v-show=\"isMobile || currentStep === 4\"\n            class=\"modal__content-guide-item\"\n            :initial=\"isMobile ? {} : { opacity: 0, x: 50 }\"\n            :animate=\"isMobile || currentStep !== 4 ? {} : { opacity: 1, x: 0 }\"\n            :transition=\"{\n              type: 'spring',\n              stiffness: 300,\n              damping: 30,\n              mass: 0.8,\n            }\"\n          >\n            <strong class=\"modal__content-guide-title\"\n              ><span>4.</span> 향후 가격 방향 선택</strong\n            >\n            <div class=\"modal__content-guide-desc\">\n              <div class=\"modal__content-guide-desc-item\">\n                <div class=\"modal__content-guide-thumb-wrap\">\n                  <img\n                    src=\"@/assets/images/guide_step4_1.png\"\n                    alt=\"System Settlement\"\n                  />\n                  <img\n                    src=\"@/assets/images/guide_step4_2.png\"\n                    alt=\"System Settlement\"\n                  />\n                </div>\n                <p>\n                  시스템은 업/다운 자금 풀의 승패 결과를 표시합니다. 수익이 발생하면 수익 금액이 표시됩니다.\n                </p>\n              </div>\n            </div>\n          </motion.div>\n        </div>\n      </div>\n      <div v-if=\"!isMobile\" class=\"modal__content-footer modal__content-footer--between\">\n        <div class=\"modal__content-guide-pagination\">\n          <span>{{ currentStep }}</span\n          >/<span>{{ totalSteps }}</span>\n        </div>\n        <div class=\"modal__content-guide-nav\">\n          <button\n            type=\"button\"\n            class=\"btn-gray btn-md-plus\"\n            :class=\"{ disabled: isFirstStep }\"\n            @click=\"goToPreviousStep\"\n          >\n            이전\n          </button>\n          <button\n            type=\"button\"\n            class=\"btn-gray btn-md-plus\"\n            :class=\"{ disabled: isLastStep }\"\n            @click=\"goToNextStep\"\n          >\n            다음\n          </button>\n        </div>\n      </div>\n    </template>\n  </Modal>\n</template>\n<style scoped></style>\n","export default \"__VITE_ASSET__Ke8Bni6z__\"","export default \"__VITE_ASSET__B0hdK_lj__\"","export default \"__VITE_ASSET__BiSgUqSM__\"","export default \"__VITE_ASSET__BGhCOWuw__\"","export default \"__VITE_ASSET__CewAwRuh__\"","<script setup>\nimport { useBettingStats } from \"@/composables/useBettingStats\";\nimport { motion, AnimatePresence } from \"motion-v\";\nimport { useDevice } from \"@/composables/useDevice\";\nimport { useAuth } from \"@/composables/useAuth\";\nimport { computed, ref, watch, onUnmounted, onMounted, nextTick } from \"vue\";\n\n// ===== Composables =====\nconst {\n  bettingStats,\n  upWinAmount,\n  downWinAmount,\n  gameResetCounter,\n  animationStates,\n} = useBettingStats();\nconst { isMobile } = useDevice();\nconst { isLoggedIn } = useAuth();\n\n// ===== 계산된 값 =====\n// 로그인 상태에 따른 최대 표시 인원 (비로그인: 6명, 로그인: 12명)\n// 최대 표시 인원을 클라이언트에서만 결정\nconst maxDisplayCount = ref(6); // 초기값은 6명\n\n// UP 참여자 총 수\nconst upTotalPeopleCount = computed(() => {\n  return bettingStats.value.upParticipants.length;\n});\n\n// DOWN 참여자 총 수\nconst downTotalPeopleCount = computed(() => {\n  return bettingStats.value.downParticipants.length;\n});\n\n// UP 표시할 참여자 목록 (로그인 상태에 따라 최대 인원 제한)\nconst upDisplayParticipants = computed(() => {\n  return bettingStats.value.upParticipants.slice(0, maxDisplayCount.value);\n});\n\n// DOWN 표시할 참여자 목록 (로그인 상태에 따라 최대 인원 제한)\nconst downDisplayParticipants = computed(() => {\n  return bettingStats.value.downParticipants.slice(0, maxDisplayCount.value);\n});\n\n// UP 더보기 버튼 표시 여부 (최대 표시 인원 초과 시)\nconst showUpMore = computed(() => {\n  return bettingStats.value.upParticipants.length > maxDisplayCount.value;\n});\n\n// DOWN 더보기 버튼 표시 여부 (최대 표시 인원 초과 시)\nconst showDownMore = computed(() => {\n  return bettingStats.value.downParticipants.length > maxDisplayCount.value;\n});\n\n// UP 더보기 버튼에 표시할 숫자 (전체 - 최대 표시 인원)\nconst upMoreCount = computed(() => {\n  return bettingStats.value.upParticipants.length - maxDisplayCount.value;\n});\n\n// DOWN 더보기 버튼에 표시할 숫자 (전체 - 최대 표시 인원)\nconst downMoreCount = computed(() => {\n  return bettingStats.value.downParticipants.length - maxDisplayCount.value;\n});\n\n// UP 더보기 버튼 preview에 표시할 참여자 (최대 표시 인원 다음부터 4명)\nconst upMorePreviewParticipants = computed(() => {\n  return bettingStats.value.upParticipants.slice(\n    maxDisplayCount.value,\n    maxDisplayCount.value + 4\n  );\n});\n\n// DOWN 더보기 버튼 preview에 표시할 참여자 (최대 표시 인원 다음부터 4명)\nconst downMorePreviewParticipants = computed(() => {\n  return bettingStats.value.downParticipants.slice(\n    maxDisplayCount.value,\n    maxDisplayCount.value + 4\n  );\n});\n\n// UP에 베팅한 총 금액\nconst upTotalAmount = computed(() => {\n  return bettingStats.value.upParticipants.reduce(\n    (sum, participant) => sum + participant.amount,\n    0\n  );\n});\n\n// DOWN에 베팅한 총 금액\nconst downTotalAmount = computed(() => {\n  return bettingStats.value.downParticipants.reduce(\n    (sum, participant) => sum + participant.amount,\n    0\n  );\n});\n\n// ===== 애니메이션 상태 =====\n\n// ===== 애니메이션 상태 =====\n// UP 애니메이션 완료 상태 (전역 상태와 동기화)\nconst upAnimationComplete = computed({\n  get: () => animationStates.value.upAnimationComplete,\n  set: (val) => {\n    animationStates.value.upAnimationComplete = val;\n  },\n});\n// DOWN 애니메이션 완료 상태 (전역 상태와 동기화)\nconst downAnimationComplete = computed({\n  get: () => animationStates.value.downAnimationComplete,\n  set: (val) => {\n    animationStates.value.downAnimationComplete = val;\n  },\n});\n\n// ===== 애니메이션 값 =====\n// UP 금액 애니메이션 값\nconst upAnimationValue = ref(0);\n// DOWN 금액 애니메이션 값\nconst downAnimationValue = ref(0);\n// 승리 금액 애니메이션 값\nconst winAmountAnimationValue = ref(0);\n\n// ===== 애니메이션 제어 =====\n// UP 애니메이션 시작 여부\nconst upAnimationStarted = ref(false);\n// DOWN 애니메이션 시작 여부\nconst downAnimationStarted = ref(false);\n// 승리 금액 애니메이션 시작 여부\nconst winAmountAnimationStarted = ref(false);\n\n// ===== 카운트 애니메이션 =====\n// UP 카운트 애니메이션 완료 여부 (전역 상태와 동기화)\nconst upCountAnimationComplete = computed({\n  get: () => animationStates.value.upCountAnimationComplete,\n  set: (val) => {\n    animationStates.value.upCountAnimationComplete = val;\n  },\n});\n// DOWN 카운트 애니메이션 완료 여부 (전역 상태와 동기화)\nconst downCountAnimationComplete = computed({\n  get: () => animationStates.value.downCountAnimationComplete,\n  set: (val) => {\n    animationStates.value.downCountAnimationComplete = val;\n  },\n});\n\n// 두 카운트 애니메이션이 모두 완료되었는지 확인 (전역 상태와 동기화)\nconst bothCountAnimationsComplete = computed(() => {\n  const upShowResult = bettingStats.value.upShowResult;\n  const downShowResult = bettingStats.value.downShowResult;\n\n  if (!upShowResult || !downShowResult) return false;\n\n  const isComplete =\n    upCountAnimationComplete.value && downCountAnimationComplete.value;\n  animationStates.value.bothCountAnimationsComplete = isComplete;\n  return isComplete;\n});\n\n// ===== 결과 영역 애니메이션 =====\n// UP 결과 영역 width 확장 상태 (전역 상태와 동기화)\nconst upResultExpanded = computed({\n  get: () => animationStates.value.upResultExpanded,\n  set: (val) => {\n    animationStates.value.upResultExpanded = val;\n  },\n});\n// DOWN 결과 영역 width 확장 상태 (전역 상태와 동기화)\nconst downResultExpanded = computed({\n  get: () => animationStates.value.downResultExpanded,\n  set: (val) => {\n    animationStates.value.downResultExpanded = val;\n  },\n});\n\n// UP width 애니메이션 완료 여부 (전역 상태와 동기화)\nconst upWidthAnimationComplete = computed({\n  get: () => animationStates.value.upWidthAnimationComplete,\n  set: (val) => {\n    animationStates.value.upWidthAnimationComplete = val;\n  },\n});\n// DOWN width 애니메이션 완료 여부 (전역 상태와 동기화)\nconst downWidthAnimationComplete = computed({\n  get: () => animationStates.value.downWidthAnimationComplete,\n  set: (val) => {\n    animationStates.value.downWidthAnimationComplete = val;\n  },\n});\n\n// ===== 애니메이션 타이머 =====\n// UP 애니메이션 타이머 저장 (정리용)\nconst upAnimationTimers = ref([]);\n// DOWN 애니메이션 타이머 저장 (정리용)\nconst downAnimationTimers = ref([]);\n// 승리 금액 애니메이션 타이머 저장 (정리용)\nconst winAmountAnimationTimers = ref([]);\n// 승리 UI 자동 숨김 타이머 저장 (정리용)\nconst winUIHideTimer = ref(null);\n\n// ===== Info Group 렌더링 상태 =====\n// UP info-group 렌더링 완료 여부\nconst upInfoGroupRendered = ref(false);\n// DOWN info-group 렌더링 완료 여부\nconst downInfoGroupRendered = ref(false);\n\n// ===== 모달 상태 =====\n// 참여자 더보기 모달 열림 상태\nconst isMoreModalOpen = ref(false);\n// 선택된 방향 ('up' | 'down')\nconst selectedDirection = ref(null);\n\n// 모달 열기\nconst openMoreModal = (direction) => {\n  selectedDirection.value = direction;\n  isMoreModalOpen.value = true;\n};\n\n// 모달 닫기\nconst closeMoreModal = () => {\n  isMoreModalOpen.value = false;\n  selectedDirection.value = null;\n};\n\n// 선택된 방향의 참여자 목록 (최대 표시 인원 다음부터)\nconst selectedParticipants = computed(() => {\n  if (selectedDirection.value === \"up\") {\n    return bettingStats.value.upParticipants.slice(maxDisplayCount.value);\n  } else if (selectedDirection.value === \"down\") {\n    return bettingStats.value.downParticipants.slice(maxDisplayCount.value);\n  }\n  return [];\n});\n\n// 모달 제목\nconst modalTitle = computed(() => {\n  return selectedDirection.value === \"up\" ? \"UP PLAYERS\" : \"DOWN PLAYERS\";\n});\n\n// ===== 트랜지션 설정 =====\n// Content 영역 사라지는 트랜지션\nconst contentExitTransition = {\n  type: \"spring\",\n  stiffness: 300,\n  damping: 20,\n  mass: 0.8,\n  bounce: 0.2,\n};\n\n// 즉시 전환 트랜지션 (애니메이션 없음)\nconst instantTransition = {\n  duration: 0,\n};\n\n// Result 영역 나타나는 트랜지션\nconst resultEnterTransition = {\n  type: \"spring\",\n  stiffness: 250,\n  damping: 20,\n  mass: 1,\n  bounce: 0.2,\n};\n\n// ===== 승자 여부 =====\n// UP이 승자인지 여부\nconst isUpWinner = computed(() => bettingStats.value.winner === \"up\");\n// DOWN이 승자인지 여부\nconst isDownWinner = computed(() => bettingStats.value.winner === \"down\");\n\n// ===== 애니메이션 완료 여부 =====\n// UP 애니메이션 완전 완료 여부 (width 애니메이션까지 완료된 경우)\nconst upAnimationFullyComplete = computed(() => {\n  return animationStates.value.upWidthAnimationComplete;\n});\n\n// DOWN 애니메이션 완전 완료 여부 (width 애니메이션까지 완료된 경우)\nconst downAnimationFullyComplete = computed(() => {\n  return animationStates.value.downWidthAnimationComplete;\n});\n\n// ===== 애니메이션 함수 =====\n// 금액 카운트 애니메이션 시작 (승자/패자 공통)\nconst startAmountAnimation = (startValue, targetValue, isUp, onComplete) => {\n  // 기존 타이머 정리\n  const timers = isUp ? upAnimationTimers : downAnimationTimers;\n  timers.value.forEach((timer) => clearTimeout(timer));\n  timers.value = [];\n\n  if (startValue === targetValue) {\n    if (isUp) {\n      upAnimationValue.value = targetValue;\n    } else {\n      downAnimationValue.value = targetValue;\n    }\n    // 즉시 완료 콜백 실행\n    if (onComplete) {\n      onComplete();\n    }\n    return;\n  }\n\n  // 목표값까지 애니메이션\n  const diff = Math.abs(targetValue - startValue);\n  const each = Math.ceil(diff / 50);\n  const isIncreasing = targetValue > startValue;\n  const stepDelay = 20;\n  let time = 0;\n  let lastTimer = null;\n\n  const updateValue = (value) => {\n    if (isUp) {\n      upAnimationValue.value = value;\n    } else {\n      downAnimationValue.value = value;\n    }\n  };\n\n  if (isIncreasing) {\n    // 증가 애니메이션 (승자)\n    for (let i = startValue; i <= targetValue; i += each) {\n      const timer = setTimeout(() => {\n        updateValue(i);\n      }, stepDelay * time);\n\n      timers.value.push(timer);\n      lastTimer = timer;\n\n      // 딱 떨어지지 않는 숫자를 마지막에 목표값으로 만들어주기 위함\n      if (i + each > targetValue) {\n        const finalTimer = setTimeout(() => {\n          updateValue(targetValue);\n          // 애니메이션 완료 콜백 실행\n          if (onComplete) {\n            onComplete();\n          }\n        }, stepDelay * (time + 1));\n        timers.value.push(finalTimer);\n        lastTimer = finalTimer;\n      }\n      time++;\n    }\n  } else {\n    // 감소 애니메이션 (패자)\n    for (let i = startValue; i >= targetValue; i -= each) {\n      const timer = setTimeout(() => {\n        updateValue(i);\n      }, stepDelay * time);\n\n      timers.value.push(timer);\n      lastTimer = timer;\n\n      // 딱 떨어지지 않는 숫자를 마지막에 목표값으로 만들어주기 위함\n      if (i - each < targetValue) {\n        const finalTimer = setTimeout(() => {\n          updateValue(targetValue);\n          // 애니메이션 완료 콜백 실행\n          if (onComplete) {\n            onComplete();\n          }\n        }, stepDelay * (time + 1));\n        timers.value.push(finalTimer);\n        lastTimer = finalTimer;\n      }\n      time++;\n    }\n  }\n};\n\n// 승리 금액 카운트 애니메이션 시작\nconst startWinAmountAnimation = (targetValue, onComplete) => {\n  // 기존 타이머 정리\n  winAmountAnimationTimers.value.forEach((timer) => clearTimeout(timer));\n  winAmountAnimationTimers.value = [];\n\n  const startValue = 0;\n\n  if (targetValue === 0) {\n    winAmountAnimationValue.value = 0;\n    if (onComplete) {\n      onComplete();\n    }\n    return;\n  }\n\n  // 목표값까지 애니메이션\n  const diff = targetValue;\n  const each = Math.ceil(diff / 50);\n  const stepDelay = 30;\n  let time = 0;\n\n  for (let i = startValue; i <= targetValue; i += each) {\n    const timer = setTimeout(() => {\n      winAmountAnimationValue.value = i;\n    }, stepDelay * time);\n\n    winAmountAnimationTimers.value.push(timer);\n\n    if (i + each > targetValue) {\n      const finalTimer = setTimeout(() => {\n        winAmountAnimationValue.value = targetValue;\n        // 애니메이션 완료 콜백 실행\n        if (onComplete) {\n          onComplete();\n        }\n      }, stepDelay * (time + 1));\n      winAmountAnimationTimers.value.push(finalTimer);\n    }\n    time++;\n  }\n};\n\n// 숫자 포맷팅 함수 (콤마 추가)\nconst formatNumber = (num) => {\n  if (!num && num !== 0) return \"\";\n  return num.toString().replace(/\\B(?=(\\d{3})+(?!\\d))/g, \",\");\n};\n\n// ===== 표시 값 =====\n// UP 화면 표시 금액 (K 단위, 애니메이션 시작 후 애니메이션 값 사용)\nconst upDisplayAmountK = computed(() => {\n  const base = Math.floor(upTotalAmount.value / 1000);\n  if (!bettingStats.value.upShowResult) return formatNumber(base);\n  const value = upAnimationStarted.value ? upAnimationValue.value : base;\n  return formatNumber(value);\n});\n\n// DOWN 화면 표시 금액 (K 단위, 애니메이션 시작 후 애니메이션 값 사용)\nconst downDisplayAmountK = computed(() => {\n  const base = Math.floor(downTotalAmount.value / 1000);\n  if (!bettingStats.value.downShowResult) return formatNumber(base);\n  const value = downAnimationStarted.value ? downAnimationValue.value : base;\n  return formatNumber(value);\n});\n\n// 내가 베팅한 쪽이 이겼는지 확인\nconst hasMyBetting = computed(() => {\n  return (\n    bettingStats.value.upTotalBetting > 0 ||\n    bettingStats.value.downTotalBetting > 0\n  );\n});\n\nconst myBettingWon = computed(() => {\n  if (!hasMyBetting.value) return false;\n\n  const upBet = bettingStats.value.upTotalBetting > 0;\n  const downBet = bettingStats.value.downTotalBetting > 0;\n\n  if (upBet && isUpWinner.value) return true;\n  if (downBet && isDownWinner.value) return true;\n\n  return false;\n});\n\n// 내가 실제로 얻은 금액 계산 (베팅 금액의 20% 수익)\nconst myWinAmount = computed(() => {\n  if (!myBettingWon.value) return 0;\n\n  if (bettingStats.value.upTotalBetting > 0 && isUpWinner.value) {\n    // UP에 베팅했고 UP이 이겼을 때: 내 베팅 금액의 20% 수익\n    return Math.floor(bettingStats.value.upTotalBetting * 0.2);\n  } else if (bettingStats.value.downTotalBetting > 0 && isDownWinner.value) {\n    // DOWN에 베팅했고 DOWN이 이겼을 때: 내 베팅 금액의 20% 수익\n    return Math.floor(bettingStats.value.downTotalBetting * 0.2);\n  }\n\n  return 0;\n});\n\n// 승리 UI 표시 여부\nconst showWinUI = ref(false);\n\n// 승리 금액 화면 표시 (포맷팅된 값)\nconst displayWinAmount = computed(() => {\n  return formatNumber(winAmountAnimationValue.value);\n});\n\n// UP Content 영역 애니메이션 중 여부\nconst upContentAnimating = computed(() => {\n  return bettingStats.value.upShowResult;\n});\n\n// DOWN Content 영역 애니메이션 중 여부\nconst downContentAnimating = computed(() => {\n  return bettingStats.value.downShowResult;\n});\n\n// ===== 애니메이션 핸들러 =====\n// showResult 변경 시 애니메이션 처리 (UP/DOWN 통합 함수)\nconst handleResultAnimation = (isUp) => {\n  const showResult = isUp\n    ? bettingStats.value.upShowResult\n    : bettingStats.value.downShowResult;\n  const animationComplete = isUp ? upAnimationComplete : downAnimationComplete;\n  const animationStarted = isUp ? upAnimationStarted : downAnimationStarted;\n  const animationValue = isUp ? upAnimationValue : downAnimationValue;\n  const animationTimers = isUp ? upAnimationTimers : downAnimationTimers;\n  const totalAmount = isUp ? upTotalAmount : downTotalAmount;\n  const isWinner = isUp ? isUpWinner : isDownWinner;\n  const winAmount = isUp ? upWinAmount : downWinAmount;\n  const countAnimationComplete = isUp\n    ? upCountAnimationComplete\n    : downCountAnimationComplete;\n  const resultExpanded = isUp ? upResultExpanded : downResultExpanded;\n\n  if (!showResult) {\n    // 초기화\n    animationComplete.value = false;\n    animationStarted.value = false;\n    animationValue.value = 0;\n    countAnimationComplete.value = false;\n    resultExpanded.value = false;\n    if (isUp) {\n      upWidthAnimationComplete.value = false;\n    } else {\n      downWidthAnimationComplete.value = false;\n    }\n    // 타이머 정리\n    animationTimers.value.forEach((timer) => clearTimeout(timer));\n    animationTimers.value = [];\n  } else {\n    // result 애니메이션이 시작되면 약간의 delay 후 blob/value 시작\n    setTimeout(() => {\n      if (showResult && !animationComplete.value) {\n        animationComplete.value = true;\n      }\n      // 애니메이션이 어느 정도 끝난 뒤 금액 애니메이션 시작\n      setTimeout(() => {\n        if (showResult) {\n          const baseAmount = Math.floor(totalAmount.value / 1000);\n          const targetAmount = isWinner.value\n            ? Math.floor(winAmount.value / 1000) // 승자: 이긴 금액\n            : 0; // 패자: 0\n\n          animationValue.value = baseAmount; // 초기값 설정\n\n          // 카운트 애니메이션 완료 콜백\n          const onCountAnimationComplete = () => {\n            countAnimationComplete.value = true;\n            // 두 카운트 애니메이션이 모두 완료되었는지 확인은 watch에서 처리\n          };\n\n          startAmountAnimation(\n            baseAmount,\n            targetAmount,\n            isUp,\n            onCountAnimationComplete\n          );\n          animationStarted.value = true;\n        }\n      }, 800); // value가 충분히 노출된 뒤 애니메이션 시작\n    }, 200); // result 애니메이션의 약 50-60% 지점에서 시작\n  }\n};\n\n// ===== Watchers =====\n// UP showResult 변경 감지 (애니메이션 완료 상태 초기화 및 blob/value 시작)\n// 단, 이미 완료된 애니메이션이면 다시 실행하지 않음\nwatch(\n  () => bettingStats.value.upShowResult,\n  (newVal, oldVal) => {\n    if (!newVal) {\n      // showResult가 false가 되면 초기화만 수행 (애니메이션 재실행 안 함)\n      return;\n    }\n\n    // 애니메이션 시작 시 모달이 열려있으면 닫기\n    if (isMoreModalOpen.value) {\n      closeMoreModal();\n    }\n\n    // 애니메이션 시작 시 info-group 렌더링 상태 제거\n    upInfoGroupRendered.value = false;\n\n    // showResult가 true이고, 아직 애니메이션이 완료되지 않았을 때만 실행\n    if (!animationStates.value.upAnimationComplete) {\n      handleResultAnimation(true);\n    } else {\n      // 이미 완료된 상태면 즉시 완료 상태로 설정\n      upAnimationStarted.value = true;\n      upAnimationValue.value = isUpWinner.value\n        ? Math.floor(upWinAmount.value / 1000)\n        : 0;\n    }\n  }\n);\n\n// DOWN showResult 변경 감지 (애니메이션 완료 상태 초기화 및 blob/value 시작)\n// 단, 이미 완료된 애니메이션이면 다시 실행하지 않음\nwatch(\n  () => bettingStats.value.downShowResult,\n  (newVal, oldVal) => {\n    if (!newVal) {\n      // showResult가 false가 되면 초기화만 수행 (애니메이션 재실행 안 함)\n      return;\n    }\n\n    // 애니메이션 시작 시 모달이 열려있으면 닫기\n    if (isMoreModalOpen.value) {\n      closeMoreModal();\n    }\n\n    // 애니메이션 시작 시 info-group 렌더링 상태 제거\n    downInfoGroupRendered.value = false;\n\n    // showResult가 true이고, 아직 애니메이션이 완료되지 않았을 때만 실행\n    if (!animationStates.value.downAnimationComplete) {\n      handleResultAnimation(false);\n    } else {\n      // 이미 완료된 상태면 즉시 완료 상태로 설정\n      downAnimationStarted.value = true;\n      downAnimationValue.value = isDownWinner.value\n        ? Math.floor(downWinAmount.value / 1000)\n        : 0;\n    }\n  }\n);\n\n// 두 카운트 애니메이션이 모두 완료되면 width/opacity 애니메이션 시작\nwatch(bothCountAnimationsComplete, (isComplete, oldVal) => {\n  // 이미 완료된 상태면 다시 실행하지 않음\n  if (isComplete && !oldVal) {\n    // 두 애니메이션이 모두 완료된 후 1초 뒤 width/opacity 애니메이션 시작\n    setTimeout(() => {\n      if (\n        bettingStats.value.upShowResult &&\n        !animationStates.value.upResultExpanded\n      ) {\n        upResultExpanded.value = true;\n      }\n      if (\n        bettingStats.value.downShowResult &&\n        !animationStates.value.downResultExpanded\n      ) {\n        downResultExpanded.value = true;\n      }\n\n      // width 애니메이션 완료 감지 (spring 애니메이션 대략 500ms 후)\n      setTimeout(() => {\n        if (\n          bettingStats.value.upShowResult &&\n          !animationStates.value.upWidthAnimationComplete\n        ) {\n          upWidthAnimationComplete.value = true;\n        }\n        if (\n          bettingStats.value.downShowResult &&\n          !animationStates.value.downWidthAnimationComplete\n        ) {\n          downWidthAnimationComplete.value = true;\n        }\n\n        // width 애니메이션 완료 후 승리 금액 카운트 애니메이션 시작 (내가 이겼을 때만)\n        if (!winAmountAnimationStarted.value && myBettingWon.value) {\n          const targetAmount = myWinAmount.value;\n          startWinAmountAnimation(targetAmount, () => {\n            winAmountAnimationStarted.value = true;\n            // 승리 금액 애니메이션 완료 후 2초 뒤에 UI 숨김\n            if (winUIHideTimer.value) {\n              clearTimeout(winUIHideTimer.value);\n            }\n            winUIHideTimer.value = setTimeout(() => {\n              showWinUI.value = false;\n              winUIHideTimer.value = null;\n            }, 2000);\n          });\n        }\n      }, 500);\n    }, 1000);\n  }\n});\n\n// 로그인 상태 변경 감지\nwatch(isLoggedIn, (newValue) => {\n  maxDisplayCount.value = newValue ? 12 : 6;\n});\n\n// gameResetCounter 변경 시 승리 금액 애니메이션 초기화\nwatch(gameResetCounter, () => {\n  winAmountAnimationValue.value = 0;\n  winAmountAnimationStarted.value = false;\n  winAmountAnimationTimers.value.forEach((timer) => clearTimeout(timer));\n  winAmountAnimationTimers.value = [];\n  // 승리 UI도 초기화\n  showWinUI.value = false;\n  if (winUIHideTimer.value) {\n    clearTimeout(winUIHideTimer.value);\n    winUIHideTimer.value = null;\n  }\n});\n\n// 승리 UI 표시 조건 감지 및 자동 숨김 처리\nwatch(\n  [\n    () => upWidthAnimationComplete.value,\n    () => downWidthAnimationComplete.value,\n    () => myBettingWon.value,\n  ],\n  ([upComplete, downComplete, won]) => {\n    const shouldShow =\n      (upComplete || downComplete) && won;\n\n    if (shouldShow && !showWinUI.value) {\n      // 승리 UI 표시\n      showWinUI.value = true;\n\n      // 기존 타이머 정리\n      if (winUIHideTimer.value) {\n        clearTimeout(winUIHideTimer.value);\n        winUIHideTimer.value = null;\n      }\n\n      // 만약 애니메이션이 이미 완료된 상태라면 (이미 마운트된 경우)\n      if (winAmountAnimationStarted.value) {\n        // 즉시 2초 후에 숨김\n        winUIHideTimer.value = setTimeout(() => {\n          showWinUI.value = false;\n          winUIHideTimer.value = null;\n        }, 2000);\n      }\n      // 그렇지 않으면 애니메이션 완료 콜백에서 타이머가 설정됨\n    } else if (!shouldShow && showWinUI.value) {\n      // 조건이 만족되지 않으면 즉시 숨김\n      showWinUI.value = false;\n      if (winUIHideTimer.value) {\n        clearTimeout(winUIHideTimer.value);\n        winUIHideTimer.value = null;\n      }\n    }\n  },\n  { immediate: true }\n);\n\n// ===== 애니메이션 완료 핸들러 =====\n// UP 애니메이션 완료 핸들러 (이미 시작되었으면 무시)\nconst handleUpAnimationComplete = (definition) => {\n  // watch에서 이미 시작했을 수 있으므로 중복 방지\n  if (bettingStats.value.upShowResult && !upAnimationComplete.value) {\n    upAnimationComplete.value = true;\n  }\n};\n\n// DOWN 애니메이션 완료 핸들러 (이미 시작되었으면 무시)\nconst handleDownAnimationComplete = (definition) => {\n  if (bettingStats.value.downShowResult && !downAnimationComplete.value) {\n    downAnimationComplete.value = true;\n  }\n};\n\n// ===== Lifecycle Hooks =====\n// 컴포넌트 마운트 시 이미 완료된 애니메이션 상태 복원\nonMounted(() => {\n  // 클라이언트에서 마운트된 후 로그인 상태 확인\n  maxDisplayCount.value = isLoggedIn.value ? 12 : 6;\n\n  // showResult가 true이고 이미 애니메이션이 완료된 상태면 즉시 완료 상태로 설정\n  if (\n    bettingStats.value.upShowResult &&\n    animationStates.value.upAnimationComplete\n  ) {\n    upAnimationStarted.value = true;\n    upAnimationValue.value = isUpWinner.value\n      ? Math.floor(upWinAmount.value / 1000)\n      : 0;\n  }\n\n  if (\n    bettingStats.value.downShowResult &&\n    animationStates.value.downAnimationComplete\n  ) {\n    downAnimationStarted.value = true;\n    downAnimationValue.value = isDownWinner.value\n      ? Math.floor(downWinAmount.value / 1000)\n      : 0;\n  }\n\n  // 렌더링 완료 후 info-group 클래스 추가\n  nextTick(() => {\n    setTimeout(() => {\n      upInfoGroupRendered.value = true;\n      downInfoGroupRendered.value = true;\n    }, 100);\n  });\n});\n\n// gameResetCounter 변경 시 info-group 렌더링 상태 초기화 및 재설정\nwatch(gameResetCounter, () => {\n  upInfoGroupRendered.value = false;\n  downInfoGroupRendered.value = false;\n\n  nextTick(() => {\n    setTimeout(() => {\n      upInfoGroupRendered.value = true;\n      downInfoGroupRendered.value = true;\n    }, 100);\n  });\n});\n\n// 컴포넌트 언마운트 시 타이머 정리\nonUnmounted(() => {\n  upAnimationTimers.value.forEach((timer) => clearTimeout(timer));\n  downAnimationTimers.value.forEach((timer) => clearTimeout(timer));\n  winAmountAnimationTimers.value.forEach((timer) => clearTimeout(timer));\n  if (winUIHideTimer.value) {\n    clearTimeout(winUIHideTimer.value);\n    winUIHideTimer.value = null;\n  }\n  upAnimationTimers.value = [];\n  downAnimationTimers.value = [];\n  winAmountAnimationTimers.value = [];\n});\n</script>\n\n<template>\n  <!-- 데스크탑 버전 -->\n  <template v-if=\"!isMobile\">\n    <!-- UP 배팅 상태 영역 -->\n    <div class=\"betting-status__list betting-status__list--up\">\n      <!-- UP Content 영역 (참여자 목록) -->\n      <motion.div\n        :key=\"`up-content-${gameResetCounter}`\"\n        class=\"betting-status__content\"\n        :class=\"{ 'betting-status__content--animating': upContentAnimating }\"\n        :initial=\"{ scaleY: 1, opacity: 1, y: 0 }\"\n        :animate=\"\n          bettingStats.upShowResult\n            ? { scaleY: 0.8, opacity: 0, y: 80 }\n            : { scaleY: 1, opacity: 1, y: 0 }\n        \"\n        :transition=\"\n          bettingStats.upShowResult ? contentExitTransition : instantTransition\n        \"\n        style=\"transform-origin: bottom\"\n      >\n        <!-- UP 제목 -->\n        <div class=\"betting-status__title ico-after ico-up-white\">\n          <strong class=\"betting-status__title-text\">UP</strong>\n        </div>\n        <!-- UP 정보 (참여자 수, 총 배팅금) -->\n        <div\n          class=\"betting-status__info\"\n          :class=\"{ 'betting-status__info--rendered': upInfoGroupRendered }\"\n        >\n          <div class=\"betting-status__info-group\">\n            <span\n              class=\"betting-status__info-text betting-status__info-text--person ico-before ico-user-primary\"\n            >\n              <CommonRollingCounter\n                :value=\"upTotalPeopleCount\"\n                typography=\"p1\"\n              />\n            </span>\n            <span\n              class=\"betting-status__info-text betting-status__info-text--price ico-before ico-prefix-primary\"\n            >\n              <CommonRollingCounter\n                :value=\"Math.floor(bettingStats.upWin / 1000)\"\n                suffix=\"K\"\n                typography=\"p1\"\n              />\n            </span>\n          </div>\n        </div>\n        <!-- UP 참여자 목록 -->\n        <div class=\"betting-status__users\">\n          <AnimatePresence>\n            <motion.div\n              v-for=\"(participant, index) in upDisplayParticipants\"\n              :key=\"participant.id\"\n              class=\"betting-status__item\"\n              :class=\"{ 'betting-status__item--my': participant.isMy }\"\n              :initial=\"{\n                x: -100,\n                opacity: 0,\n              }\"\n              :animate=\"{\n                x: 0,\n                opacity: 1,\n              }\"\n              :exit=\"\n                bettingStats.upParticipants.length > maxDisplayCount &&\n                index === maxDisplayCount - 1\n                  ? { duration: 0 }\n                  : {\n                      opacity: 0,\n                      x: -100,\n                    }\n              \"\n              :transition=\"{\n                type: 'spring',\n                stiffness: 200,\n                damping: 18,\n                mass: 0.8,\n                bounce: 0.3,\n              }\"\n            >\n              <img\n                src=\"@/assets/images/user.png\"\n                :alt=\"participant.name\"\n                class=\"betting-status__item-thumb\"\n              />\n              <p class=\"betting-status__item-name\">{{ participant.name }}</p>\n              <strong class=\"betting-status__item-amount\">\n                <CommonRollingCounter\n                  :value=\"Math.floor(participant.amount / 1000)\"\n                  suffix=\"K\"\n                  typography=\"p1\"\n                />\n              </strong>\n            </motion.div>\n          </AnimatePresence>\n        </div>\n\n        <!-- UP 참여자 더보기 -->\n        <div\n          v-if=\"showUpMore\"\n          class=\"betting-status__more\"\n          role=\"button\"\n          @click=\"openMoreModal('up')\"\n        >\n          <div class=\"betting-status__more-preview\">\n            <img\n              v-for=\"participant in upMorePreviewParticipants\"\n              :key=\"participant.id\"\n              src=\"@/assets/images/user.png\"\n              :alt=\"participant.name\"\n            />\n          </div>\n          <div class=\"betting-status__more-text ico-after ico-chevron-right\">\n            <span>{{ upMoreCount }}</span>\n            <span>+</span>\n          </div>\n        </div>\n      </motion.div>\n\n      <!-- UP 결과 영역 (게임 종료 시 표시) -->\n      <motion.div\n        v-if=\"bettingStats.upShowResult\"\n        class=\"betting-status__result\"\n        :class=\"{ 'betting-status__result--complete': upAnimationComplete }\"\n        :initial=\"{ scale: 0.85, opacity: 0, y: -30, width: '100%' }\"\n        :animate=\"\n          upAnimationFullyComplete\n            ? isUpWinner\n              ? { scale: 1, opacity: 1, y: 0, width: 'calc(200% + 1.2rem)' }\n              : { scale: 1, opacity: 1, y: 0, width: '0' }\n            : bothCountAnimationsComplete\n            ? isUpWinner\n              ? {\n                  scale: 1,\n                  opacity: 1,\n                  y: 0,\n                  width: upResultExpanded ? 'calc(200% + 1.2rem)' : '100%',\n                }\n              : {\n                  scale: 1,\n                  opacity: 1,\n                  y: 0,\n                  width: upResultExpanded ? '0' : '100%',\n                }\n            : { scale: 1, opacity: 1, y: 0, width: '100%' }\n        \"\n        :transition=\"\n          upAnimationFullyComplete\n            ? { duration: 0 }\n            : bothCountAnimationsComplete && upResultExpanded\n            ? { type: 'spring', stiffness: 250, damping: 30, mass: 0.8 }\n            : resultEnterTransition\n        \"\n        @animation-complete=\"handleUpAnimationComplete\"\n        style=\"transform-origin: center; overflow: hidden\"\n      >\n        <!-- 결과 배경 blob -->\n        <AnimatePresence>\n          <motion.i\n            v-if=\"upAnimationComplete\"\n            key=\"blob\"\n            class=\"betting-status__result-blob\"\n            :initial=\"\n              upAnimationFullyComplete\n                ? { scale: 1, opacity: 0.6 }\n                : { scale: 0, opacity: 0 }\n            \"\n            :animate=\"{ scale: 1, opacity: 0.6 }\"\n            :transition=\"\n              upAnimationFullyComplete\n                ? { duration: 0 }\n                : {\n                    type: 'spring',\n                    stiffness: 300,\n                    damping: 20,\n                    mass: 0.5,\n                    bounce: 0.2,\n                    delay: 0.55,\n                  }\n            \"\n          >\n          </motion.i>\n        </AnimatePresence>\n        <!-- 결과 값 영역 -->\n        <div class=\"betting-status__result-group\">\n          <AnimatePresence>\n            <motion.div\n              v-if=\"upAnimationComplete\"\n              key=\"value\"\n              class=\"betting-status__result-value\"\n              :initial=\"\n                upAnimationFullyComplete\n                  ? bothCountAnimationsComplete &&\n                    !isUpWinner &&\n                    upResultExpanded\n                    ? { scale: 1, opacity: 0 }\n                    : { scale: 1, opacity: 1 }\n                  : { scale: 0, opacity: 0 }\n              \"\n              :animate=\"\n                bothCountAnimationsComplete && !isUpWinner && upResultExpanded\n                  ? { scale: 1, opacity: 0 }\n                  : { scale: 1, opacity: 1 }\n              \"\n              :transition=\"\n                upAnimationFullyComplete\n                  ? { duration: 0 }\n                  : bothCountAnimationsComplete &&\n                    !isUpWinner &&\n                    upResultExpanded\n                  ? {\n                      scale: {\n                        type: 'spring',\n                        stiffness: 300,\n                        damping: 20,\n                        mass: 0.5,\n                        bounce: 0.2,\n                        delay: 0.4,\n                      },\n                      opacity: { duration: 0 },\n                    }\n                  : {\n                      type: 'spring',\n                      stiffness: 300,\n                      damping: 20,\n                      mass: 0.5,\n                      bounce: 0.2,\n                      delay: 0.4,\n                    }\n              \"\n            >\n              <strong class=\"betting-status__result-value-title\">{{\n                isUpWinner ? \"승자\" : \"패자\"\n              }}</strong>\n              <div\n                class=\"betting-status__result-value-people ico-before ico-user-white\"\n              >\n                <span>{{ upTotalPeopleCount }}</span>\n              </div>\n              <div\n                class=\"betting-status__result-value-amount ico-before ico-prefix-white\"\n              >\n                <strong>{{ upDisplayAmountK }}<span>K</span></strong>\n              </div>\n            </motion.div>\n          </AnimatePresence>\n        </div>\n      </motion.div>\n    </div>\n\n    <!-- DOWN 배팅 상태 영역 -->\n    <div class=\"betting-status__list betting-status__list--down\">\n      <!-- DOWN Content 영역 (참여자 목록) -->\n      <motion.div\n        :key=\"`down-content-${gameResetCounter}`\"\n        class=\"betting-status__content\"\n        :class=\"{\n          'betting-status__content--animating': downContentAnimating,\n        }\"\n        :initial=\"{ scaleY: 1, opacity: 1, y: 0 }\"\n        :animate=\"\n          bettingStats.downShowResult\n            ? { scaleY: 0.8, opacity: 0, y: 80 }\n            : { scaleY: 1, opacity: 1, y: 0 }\n        \"\n        :transition=\"\n          bettingStats.downShowResult\n            ? contentExitTransition\n            : instantTransition\n        \"\n        style=\"transform-origin: bottom\"\n      >\n        <!-- DOWN 제목 -->\n        <div class=\"betting-status__title ico-after ico-down-white\">\n          <strong class=\"betting-status__title-text\">DOWN</strong>\n        </div>\n        <!-- DOWN 정보 (참여자 수, 총 배팅금) -->\n        <div\n          class=\"betting-status__info\"\n          :class=\"{ 'betting-status__info--rendered': downInfoGroupRendered }\"\n        >\n          <div class=\"betting-status__info-group\">\n            <span\n              class=\"betting-status__info-text betting-status__info-text--person ico-before ico-user-secondary\"\n            >\n              <CommonRollingCounter\n                :value=\"downTotalPeopleCount\"\n                typography=\"p1\"\n              />\n            </span>\n            <span\n              class=\"betting-status__info-text betting-status__info-text--price ico-before ico-prefix-secondary\"\n            >\n              <CommonRollingCounter\n                :value=\"Math.floor(bettingStats.downLose / 1000)\"\n                suffix=\"K\"\n                typography=\"p1\"\n              />\n            </span>\n          </div>\n        </div>\n        <!-- DOWN 참여자 목록 -->\n        <div class=\"betting-status__users\">\n          <AnimatePresence>\n            <motion.div\n              v-for=\"(participant, index) in downDisplayParticipants\"\n              :key=\"participant.id\"\n              class=\"betting-status__item\"\n              :class=\"{ 'betting-status__item--my': participant.isMy }\"\n              :initial=\"{\n                x: 200,\n                opacity: 0,\n              }\"\n              :animate=\"{\n                x: 0,\n                opacity: 1,\n              }\"\n              :exit=\"\n                bettingStats.downParticipants.length > maxDisplayCount &&\n                index === maxDisplayCount - 1\n                  ? { duration: 0 }\n                  : {\n                      opacity: 0,\n                      x: 200,\n                    }\n              \"\n              :transition=\"{\n                type: 'spring',\n                stiffness: 200,\n                damping: 18,\n                mass: 0.8,\n                bounce: 0.3,\n              }\"\n            >\n              <img\n                src=\"@/assets/images/user.png\"\n                :alt=\"participant.name\"\n                class=\"betting-status__item-thumb\"\n              />\n              <p class=\"betting-status__item-name\">{{ participant.name }}</p>\n              <strong class=\"betting-status__item-amount\">\n                <CommonRollingCounter\n                  :value=\"Math.floor(participant.amount / 1000)\"\n                  suffix=\"K\"\n                  typography=\"p1\"\n                />\n              </strong>\n            </motion.div>\n          </AnimatePresence>\n        </div>\n\n        <!-- DOWN 참여자 더보기 -->\n        <div\n          v-if=\"showDownMore\"\n          class=\"betting-status__more\"\n          role=\"button\"\n          @click=\"openMoreModal('down')\"\n        >\n          <div class=\"betting-status__more-preview\">\n            <img\n              v-for=\"participant in downMorePreviewParticipants\"\n              :key=\"participant.id\"\n              src=\"@/assets/images/user.png\"\n              :alt=\"participant.name\"\n            />\n          </div>\n          <div class=\"betting-status__more-text ico-after ico-chevron-right\">\n            <span>{{ downMoreCount }}</span>\n            <span>+</span>\n          </div>\n        </div>\n      </motion.div>\n\n      <!-- DOWN 결과 영역 (게임 종료 시 표시) -->\n      <motion.div\n        v-if=\"bettingStats.downShowResult\"\n        class=\"betting-status__result\"\n        :class=\"{ 'betting-status__result--complete': downAnimationComplete }\"\n        :initial=\"{ scale: 0.85, opacity: 0, y: -30, width: '100%' }\"\n        :animate=\"\n          downAnimationFullyComplete\n            ? isDownWinner\n              ? { scale: 1, opacity: 1, y: 0, width: 'calc(200% + 1.2rem)' }\n              : { scale: 1, opacity: 1, y: 0, width: '0' }\n            : bothCountAnimationsComplete\n            ? isDownWinner\n              ? {\n                  scale: 1,\n                  opacity: 1,\n                  y: 0,\n                  width: downResultExpanded ? 'calc(200% + 1.2rem)' : '100%',\n                }\n              : {\n                  scale: 1,\n                  opacity: 1,\n                  y: 0,\n                  width: downResultExpanded ? '0' : '100%',\n                }\n            : { scale: 1, opacity: 1, y: 0, width: '100%' }\n        \"\n        :transition=\"\n          downAnimationFullyComplete\n            ? { duration: 0 }\n            : bothCountAnimationsComplete && downResultExpanded\n            ? { type: 'spring', stiffness: 250, damping: 30, mass: 0.8 }\n            : resultEnterTransition\n        \"\n        @animation-complete=\"handleDownAnimationComplete\"\n        style=\"transform-origin: center; overflow: hidden\"\n      >\n        <!-- 결과 배경 blob -->\n        <AnimatePresence>\n          <motion.i\n            v-if=\"downAnimationComplete\"\n            key=\"blob\"\n            class=\"betting-status__result-blob\"\n            :initial=\"\n              downAnimationFullyComplete\n                ? { scale: 1, opacity: 0.6 }\n                : { scale: 0, opacity: 0 }\n            \"\n            :animate=\"{ scale: 1, opacity: 0.6 }\"\n            :transition=\"\n              downAnimationFullyComplete\n                ? { duration: 0 }\n                : {\n                    type: 'spring',\n                    stiffness: 300,\n                    damping: 20,\n                    mass: 0.5,\n                    bounce: 0.2,\n                    delay: 0.55,\n                  }\n            \"\n          >\n          </motion.i>\n        </AnimatePresence>\n        <!-- 결과 값 영역 -->\n        <div class=\"betting-status__result-group\">\n          <AnimatePresence>\n            <motion.div\n              v-if=\"downAnimationComplete\"\n              key=\"value\"\n              class=\"betting-status__result-value\"\n              :initial=\"\n                downAnimationFullyComplete\n                  ? bothCountAnimationsComplete &&\n                    !isDownWinner &&\n                    downResultExpanded\n                    ? { scale: 1, opacity: 0 }\n                    : { scale: 1, opacity: 1 }\n                  : { scale: 0, opacity: 0 }\n              \"\n              :animate=\"\n                bothCountAnimationsComplete &&\n                !isDownWinner &&\n                downResultExpanded\n                  ? { scale: 1, opacity: 0 }\n                  : { scale: 1, opacity: 1 }\n              \"\n              :transition=\"\n                downAnimationFullyComplete\n                  ? { duration: 0 }\n                  : bothCountAnimationsComplete &&\n                    !isDownWinner &&\n                    downResultExpanded\n                  ? {\n                      scale: {\n                        type: 'spring',\n                        stiffness: 300,\n                        damping: 20,\n                        mass: 0.5,\n                        bounce: 0.2,\n                        delay: 0.4,\n                      },\n                      opacity: { duration: 0 },\n                    }\n                  : {\n                      type: 'spring',\n                      stiffness: 300,\n                      damping: 20,\n                      mass: 0.5,\n                      bounce: 0.2,\n                      delay: 0.4,\n                    }\n              \"\n            >\n              <strong class=\"betting-status__result-value-title\">{{\n                isDownWinner ? \"승자\" : \"패자\"\n              }}</strong>\n              <!-- 결과 참여자 수 -->\n              <div\n                class=\"betting-status__result-value-people ico-before ico-user-white\"\n              >\n                <span>{{ downTotalPeopleCount }}</span>\n              </div>\n              <!-- 결과 금액 -->\n              <div\n                class=\"betting-status__result-value-amount ico-before ico-prefix-white\"\n              >\n                <strong>{{ downDisplayAmountK }}<span>K</span></strong>\n              </div>\n            </motion.div>\n          </AnimatePresence>\n        </div>\n      </motion.div>\n    </div>\n\n    <!-- 참여자 더보기 모달 -->\n    <AnimatePresence>\n      <motion.div\n        v-if=\"isMoreModalOpen\"\n        key=\"more-modal\"\n        class=\"betting-status__more-modal\"\n        :initial=\"{ opacity: 0, y: 80, scale: 0.9 }\"\n        :animate=\"{ opacity: 1, y: 0, scale: 1 }\"\n        :exit=\"{ opacity: 0, y: 30, scale: 0.95 }\"\n        :transition=\"{\n          type: 'spring',\n          stiffness: 300,\n          damping: 15,\n          mass: 0.4,\n          bounce: 0.4,\n        }\"\n      >\n        <div class=\"betting-status__more-modal-header\">\n          <strong>{{ modalTitle }}</strong>\n          <button type=\"button\" class=\"ico-close\" @click=\"closeMoreModal\">\n            <span class=\"blind\">닫기</span>\n          </button>\n        </div>\n        <div class=\"betting-status__more-modal-body\">\n          <div\n            v-for=\"participant in selectedParticipants\"\n            :key=\"participant.id\"\n            class=\"betting-status__more-modal-item\"\n          >\n            <img src=\"@/assets/images/user.png\" alt=\"\" />\n            <strong>\n              <CommonRollingCounter\n                :value=\"Math.floor(participant.amount / 1000)\"\n                suffix=\"K\"\n                typography=\"p1\"\n              />\n            </strong>\n          </div>\n        </div>\n      </motion.div>\n    </AnimatePresence>\n  </template>\n\n  <!-- 모바일 버전 -->\n  <template v-else>\n    <!-- UP 배팅 상태 영역 (모바일) -->\n    <div class=\"betting-status__list betting-status__list--up\">\n      <!-- UP Content 영역 (참여자 목록) -->\n      <motion.div\n        :key=\"`up-content-mobile-${gameResetCounter}`\"\n        class=\"betting-status__content\"\n        :class=\"{ 'betting-status__content--animating': upContentAnimating }\"\n        :initial=\"{ scale: 1, opacity: 1 }\"\n        :animate=\"\n          bettingStats.upShowResult\n            ? { scale: 0.8, opacity: 0 }\n            : { scale: 1, opacity: 1 }\n        \"\n        :transition=\"\n          bettingStats.upShowResult ? contentExitTransition : instantTransition\n        \"\n        style=\"transform-origin: center\"\n      >\n        <!-- UP 정보 (참여자 수, 총 배팅금) -->\n        <div\n          class=\"betting-status__info\"\n          :class=\"{ 'betting-status__info--rendered': upInfoGroupRendered }\"\n        >\n          <span\n            class=\"betting-status__info-text betting-status__info-text--person ico-before ico-user-primary\"\n          >\n            <CommonRollingCounter :value=\"upTotalPeopleCount\" typography=\"p1\" />\n          </span>\n          <span\n            class=\"betting-status__info-text betting-status__info-text--price ico-before ico-prefix-primary\"\n          >\n            <CommonRollingCounter\n              :value=\"Math.floor(bettingStats.upWin / 1000)\"\n              suffix=\"K\"\n              typography=\"p1\"\n            />\n          </span>\n        </div>\n        <!-- UP 참여자 목록 (모바일) -->\n        <div class=\"betting-status__users\">\n          <AnimatePresence>\n            <motion.div\n              v-for=\"participant in bettingStats.upParticipants\"\n              :key=\"participant.id\"\n              class=\"betting-status__item\"\n              :class=\"{ 'betting-status__item--my': participant.isMy }\"\n              :initial=\"{ opacity: 0, scale: 0, x: 0, y: 0 }\"\n              :animate=\"{ opacity: 1, scale: 1, x: 0, y: 0 }\"\n              :exit=\"{ opacity: 0, scale: 0 }\"\n              :transition=\"{\n                type: 'spring',\n                stiffness: 300,\n                damping: 15,\n                mass: 0.8,\n                bounce: 0.6,\n              }\"\n            >\n              <img\n                src=\"@/assets/images/user.png\"\n                :alt=\"participant.name\"\n                class=\"betting-status__item-thumb\"\n              />\n            </motion.div>\n          </AnimatePresence>\n        </div>\n      </motion.div>\n\n      <!-- UP 결과 영역 (게임 종료 시 표시) -->\n      <motion.div\n        v-if=\"bettingStats.upShowResult\"\n        class=\"betting-status__result\"\n        :class=\"{ 'betting-status__result--complete': upAnimationComplete }\"\n        :initial=\"{ opacity: 0, width: '50%' }\"\n        :animate=\"\n          upAnimationFullyComplete\n            ? isUpWinner\n              ? { opacity: 1, width: '100%' }\n              : { opacity: 1, width: '0' }\n            : bothCountAnimationsComplete\n            ? isUpWinner\n              ? { opacity: 1, width: upResultExpanded ? '100%' : '50%' }\n              : { opacity: 1, width: upResultExpanded ? '0' : '50%' }\n            : { opacity: 1, width: '50%' }\n        \"\n        :transition=\"\n          upAnimationFullyComplete\n            ? { duration: 0 }\n            : bothCountAnimationsComplete && upResultExpanded\n            ? { type: 'spring', stiffness: 250, damping: 30, mass: 0.8 }\n            : resultEnterTransition\n        \"\n        style=\"overflow: hidden\"\n      >\n        <!-- 결과 배경 blob -->\n        <AnimatePresence>\n          <motion.i\n            v-if=\"upAnimationComplete\"\n            key=\"blob\"\n            class=\"betting-status__result-blob\"\n            :initial=\"{ scale: 0, opacity: 0 }\"\n            :animate=\"{ scale: 1, opacity: 0.6 }\"\n            :transition=\"{\n              type: 'spring',\n              stiffness: 300,\n              damping: 20,\n              mass: 0.5,\n              bounce: 0.2,\n              delay: 0.55,\n            }\"\n          >\n          </motion.i>\n        </AnimatePresence>\n        <div class=\"betting-status__result-group\">\n          <AnimatePresence>\n            <motion.div\n              v-if=\"upAnimationComplete\"\n              key=\"value\"\n              class=\"betting-status__result-value\"\n              :initial=\"\n                upAnimationFullyComplete\n                  ? bothCountAnimationsComplete &&\n                    !isUpWinner &&\n                    upResultExpanded\n                    ? { scale: 1, opacity: 0 }\n                    : { scale: 1, opacity: 1 }\n                  : { scale: 0, opacity: 0 }\n              \"\n              :animate=\"\n                bothCountAnimationsComplete && !isUpWinner && upResultExpanded\n                  ? { scale: 1, opacity: 0 }\n                  : { scale: 1, opacity: 1 }\n              \"\n              :transition=\"\n                upAnimationFullyComplete\n                  ? { duration: 0 }\n                  : bothCountAnimationsComplete &&\n                    !isUpWinner &&\n                    upResultExpanded\n                  ? {\n                      scale: {\n                        type: 'spring',\n                        stiffness: 300,\n                        damping: 20,\n                        mass: 0.5,\n                        bounce: 0.2,\n                        delay: 0.4,\n                      },\n                      opacity: { duration: 0 },\n                    }\n                  : {\n                      type: 'spring',\n                      stiffness: 300,\n                      damping: 20,\n                      mass: 0.5,\n                      bounce: 0.2,\n                      delay: 0.4,\n                    }\n              \"\n            >\n              <strong class=\"betting-status__result-value-title\">{{\n                isUpWinner ? \"승자\" : \"패자\"\n              }}</strong>\n              <div class=\"betting-status__result-desc\">\n                <span class=\"ico-before ico-user-white\">{{\n                  upTotalPeopleCount\n                }}</span>\n                <span class=\"ico-before ico-prefix-white\"\n                  >{{ upDisplayAmountK }}K</span\n                >\n              </div>\n            </motion.div>\n          </AnimatePresence>\n        </div>\n      </motion.div>\n    </div>\n    <!-- DOWN 배팅 상태 영역 (모바일) -->\n    <div class=\"betting-status__list betting-status__list--down\">\n      <!-- DOWN Content 영역 (참여자 목록) -->\n      <motion.div\n        :key=\"`down-content-mobile-${gameResetCounter}`\"\n        class=\"betting-status__content\"\n        :class=\"{\n          'betting-status__content--animating': downContentAnimating,\n        }\"\n        :initial=\"{ scale: 1, opacity: 1 }\"\n        :animate=\"\n          bettingStats.downShowResult\n            ? { scale: 0.8, opacity: 0 }\n            : { scale: 1, opacity: 1 }\n        \"\n        :transition=\"\n          bettingStats.downShowResult\n            ? contentExitTransition\n            : instantTransition\n        \"\n        style=\"transform-origin: center\"\n      >\n        <!-- DOWN 정보 (참여자 수, 총 배팅금) -->\n        <div\n          class=\"betting-status__info\"\n          :class=\"{ 'betting-status__info--rendered': downInfoGroupRendered }\"\n        >\n          <span\n            class=\"betting-status__info-text betting-status__info-text--person ico-before ico-user-secondary\"\n          >\n            <CommonRollingCounter\n              :value=\"downTotalPeopleCount\"\n              typography=\"p1\"\n            />\n          </span>\n          <span\n            class=\"betting-status__info-text betting-status__info-text--price ico-before ico-prefix-secondary\"\n          >\n            <CommonRollingCounter\n              :value=\"Math.floor(bettingStats.downLose / 1000)\"\n              suffix=\"K\"\n              typography=\"p1\"\n            />\n          </span>\n        </div>\n        <!-- DOWN 참여자 목록 (모바일) -->\n        <div class=\"betting-status__users\">\n          <AnimatePresence>\n            <motion.div\n              v-for=\"participant in bettingStats.downParticipants\"\n              :key=\"participant.id\"\n              class=\"betting-status__item\"\n              :class=\"{ 'betting-status__item--my': participant.isMy }\"\n              :initial=\"{ opacity: 0, scale: 0, x: 0, y: 0 }\"\n              :animate=\"{ opacity: 1, scale: 1, x: 0, y: 0 }\"\n              :exit=\"{ opacity: 0, scale: 0 }\"\n              :transition=\"{\n                type: 'spring',\n                stiffness: 300,\n                damping: 15,\n                mass: 0.8,\n                bounce: 0.6,\n              }\"\n            >\n              <img\n                src=\"@/assets/images/user.png\"\n                :alt=\"participant.name\"\n                class=\"betting-status__item-thumb\"\n              />\n            </motion.div>\n          </AnimatePresence>\n        </div>\n      </motion.div>\n\n      <!-- DOWN 결과 영역 (게임 종료 시 표시) -->\n      <motion.div\n        v-if=\"bettingStats.downShowResult\"\n        class=\"betting-status__result\"\n        :class=\"{ 'betting-status__result--complete': downAnimationComplete }\"\n        :initial=\"{ opacity: 0, width: '50%' }\"\n        :animate=\"\n          downAnimationFullyComplete\n            ? isDownWinner\n              ? { opacity: 1, width: '100%' }\n              : { opacity: 1, width: '0' }\n            : bothCountAnimationsComplete\n            ? isDownWinner\n              ? { opacity: 1, width: downResultExpanded ? '100%' : '50%' }\n              : { opacity: 1, width: downResultExpanded ? '0' : '50%' }\n            : { opacity: 1, width: '50%' }\n        \"\n        :transition=\"\n          downAnimationFullyComplete\n            ? { duration: 0 }\n            : bothCountAnimationsComplete && downResultExpanded\n            ? { type: 'spring', stiffness: 250, damping: 30, mass: 0.8 }\n            : resultEnterTransition\n        \"\n        style=\"overflow: hidden\"\n      >\n        <!-- 결과 배경 blob -->\n        <AnimatePresence>\n          <motion.i\n            v-if=\"downAnimationComplete\"\n            key=\"blob\"\n            class=\"betting-status__result-blob\"\n            :initial=\"{ scale: 0, opacity: 0 }\"\n            :animate=\"{ scale: 1, opacity: 0.6 }\"\n            :transition=\"{\n              type: 'spring',\n              stiffness: 300,\n              damping: 20,\n              mass: 0.5,\n              bounce: 0.2,\n              delay: 0.55,\n            }\"\n          >\n          </motion.i>\n        </AnimatePresence>\n        <div class=\"betting-status__result-group\">\n          <AnimatePresence>\n            <motion.div\n              v-if=\"downAnimationComplete\"\n              key=\"value\"\n              class=\"betting-status__result-value\"\n              :initial=\"\n                downAnimationFullyComplete\n                  ? bothCountAnimationsComplete &&\n                    !isDownWinner &&\n                    downResultExpanded\n                    ? { scale: 1, opacity: 0 }\n                    : { scale: 1, opacity: 1 }\n                  : { scale: 0, opacity: 0 }\n              \"\n              :animate=\"\n                bothCountAnimationsComplete &&\n                !isDownWinner &&\n                downResultExpanded\n                  ? { scale: 1, opacity: 0 }\n                  : { scale: 1, opacity: 1 }\n              \"\n              :transition=\"\n                downAnimationFullyComplete\n                  ? { duration: 0 }\n                  : bothCountAnimationsComplete &&\n                    !isDownWinner &&\n                    downResultExpanded\n                  ? {\n                      scale: {\n                        type: 'spring',\n                        stiffness: 300,\n                        damping: 20,\n                        mass: 0.5,\n                        bounce: 0.2,\n                        delay: 0.4,\n                      },\n                      opacity: { duration: 0 },\n                    }\n                  : {\n                      type: 'spring',\n                      stiffness: 300,\n                      damping: 20,\n                      mass: 0.5,\n                      bounce: 0.2,\n                      delay: 0.4,\n                    }\n              \"\n            >\n              <strong class=\"betting-status__result-value-title\">{{\n                isDownWinner ? \"승자\" : \"패자\"\n              }}</strong>\n              <div class=\"betting-status__result-desc\">\n                <span class=\"ico-before ico-user-white\">{{\n                  downTotalPeopleCount\n                }}</span>\n                <span class=\"ico-before ico-prefix-white\"\n                  >{{ downDisplayAmountK }}K</span\n                >\n              </div>\n            </motion.div>\n          </AnimatePresence>\n        </div>\n      </motion.div>\n    </div>\n  </template>\n\n  <!-- 승리 시 UI -->\n  <AnimatePresence>\n    <motion.div\n      v-show=\"showWinUI\"\n      key=\"win-ui\"\n      class=\"betting-status__win\"\n      :initial=\"{ opacity: 0 }\"\n      :animate=\"{ opacity: 1 }\"\n      :exit=\"{ opacity: 0 }\"\n      :transition=\"{ duration: 0.3 }\"\n    >\n      <div class=\"betting-status__win-content\">\n        <!-- BG Image -->\n        <motion.div\n          class=\"betting-status__win-bg\"\n          :initial=\"{ scale: 0, opacity: 0 }\"\n          :animate=\"{ scale: 1, opacity: 1 }\"\n          :transition=\"{\n            type: 'spring',\n            stiffness: 400,\n            damping: 20,\n            mass: 0.5,\n            bounce: 0.5,\n            delay: 0,\n          }\"\n        >\n          <motion.div\n            class=\"betting-status__win-bg\"\n            :animate=\"{\n              scale: isMobile\n                ? [1, 1.008, 1, 1.005, 1]\n                : [1, 1.02, 1, 1.015, 1],\n            }\"\n            :transition=\"{\n              duration: 3,\n              repeat: Infinity,\n              ease: 'easeInOut',\n              delay: 0.8,\n            }\"\n          >\n            <img src=\"@/assets/images/winner_bg.png\" alt=\"WINNER\" />\n          </motion.div>\n        </motion.div>\n\n        <!-- 코인 이미지 -->\n        <motion.div\n          class=\"betting-status__win-coin betting-status__win-coin--01\"\n          :initial=\"{ scale: 0, opacity: 0, x: -30, y: -40, rotate: -45 }\"\n          :animate=\"{\n            scale: 1,\n            opacity: 1,\n            x: 0,\n            y: isMobile ? [0, -8, 0, -5, 0] : [0, -15, 0, -10, 0],\n            rotate: 0,\n          }\"\n          :transition=\"{\n            scale: {\n              type: 'spring',\n              stiffness: 500,\n              damping: 12,\n              mass: 0.4,\n              bounce: 0.65,\n              delay: 0.4,\n            },\n            opacity: {\n              duration: 0.2,\n              delay: 0.4,\n            },\n            x: {\n              type: 'spring',\n              stiffness: 500,\n              damping: 12,\n              mass: 0.4,\n              bounce: 0.65,\n              delay: 0.4,\n            },\n            rotate: {\n              type: 'spring',\n              stiffness: 450,\n              damping: 15,\n              mass: 0.5,\n              bounce: 0.6,\n              delay: 0.4,\n            },\n            y: {\n              duration: 2.5,\n              repeat: Infinity,\n              ease: 'easeInOut',\n              delay: 0.9,\n            },\n          }\"\n        >\n          <img src=\"@/assets/images/coin_01.svg\" alt=\"\" />\n        </motion.div>\n        <motion.div\n          class=\"betting-status__win-coin betting-status__win-coin--02\"\n          :initial=\"{ scale: 0, opacity: 0, x: 40, y: -30, rotate: 50 }\"\n          :animate=\"{\n            scale: 1,\n            opacity: 1,\n            x: isMobile ? [0, 6, 0, 4, 0] : [0, 12, 0, 8, 0],\n            y: 0,\n            rotate: 0,\n          }\"\n          :transition=\"{\n            scale: {\n              type: 'spring',\n              stiffness: 480,\n              damping: 13,\n              mass: 0.45,\n              bounce: 0.62,\n              delay: 0.48,\n            },\n            opacity: {\n              duration: 0.2,\n              delay: 0.48,\n            },\n            x: {\n              duration: 2.8,\n              repeat: Infinity,\n              ease: 'easeInOut',\n              delay: 1.0,\n            },\n            y: {\n              type: 'spring',\n              stiffness: 480,\n              damping: 13,\n              mass: 0.45,\n              bounce: 0.62,\n              delay: 0.48,\n            },\n            rotate: {\n              type: 'spring',\n              stiffness: 430,\n              damping: 16,\n              mass: 0.55,\n              bounce: 0.58,\n              delay: 0.48,\n            },\n          }\"\n        >\n          <img src=\"@/assets/images/coin_02.svg\" alt=\"\" />\n        </motion.div>\n        <motion.div\n          class=\"betting-status__win-coin betting-status__win-coin--03\"\n          :initial=\"{ scale: 0, opacity: 0, x: -40, y: 50, rotate: -40 }\"\n          :animate=\"{\n            scale: 1,\n            opacity: 1,\n            x: 0,\n            y: isMobile ? [0, 9, 0, 6, 0] : [0, 18, 0, 12, 0],\n            rotate: 0,\n          }\"\n          :transition=\"{\n            scale: {\n              type: 'spring',\n              stiffness: 520,\n              damping: 11,\n              mass: 0.35,\n              bounce: 0.68,\n              delay: 0.56,\n            },\n            opacity: {\n              duration: 0.2,\n              delay: 0.56,\n            },\n            x: {\n              type: 'spring',\n              stiffness: 520,\n              damping: 11,\n              mass: 0.35,\n              bounce: 0.68,\n              delay: 0.56,\n            },\n            y: {\n              duration: 3.2,\n              repeat: Infinity,\n              ease: 'easeInOut',\n              delay: 1.1,\n            },\n            rotate: {\n              type: 'spring',\n              stiffness: 460,\n              damping: 14,\n              mass: 0.48,\n              bounce: 0.63,\n              delay: 0.56,\n            },\n          }\"\n        >\n          <img src=\"@/assets/images/coin_03.svg\" alt=\"\" />\n        </motion.div>\n        <motion.div\n          class=\"betting-status__win-coin betting-status__win-coin--04\"\n          :initial=\"{ scale: 0, opacity: 0, x: 35, y: 45, rotate: 48 }\"\n          :animate=\"{\n            scale: 1,\n            opacity: 1,\n            x: isMobile ? [0, -5, 0, -8, 0] : [0, -10, 0, -15, 0],\n            y: 0,\n            rotate: 0,\n          }\"\n          :transition=\"{\n            scale: {\n              type: 'spring',\n              stiffness: 490,\n              damping: 12,\n              mass: 0.42,\n              bounce: 0.64,\n              delay: 0.64,\n            },\n            opacity: {\n              duration: 0.2,\n              delay: 0.64,\n            },\n            x: {\n              duration: 2.6,\n              repeat: Infinity,\n              ease: 'easeInOut',\n              delay: 1.2,\n            },\n            y: {\n              type: 'spring',\n              stiffness: 490,\n              damping: 12,\n              mass: 0.42,\n              bounce: 0.64,\n              delay: 0.64,\n            },\n            rotate: {\n              type: 'spring',\n              stiffness: 440,\n              damping: 15,\n              mass: 0.52,\n              bounce: 0.6,\n              delay: 0.64,\n            },\n          }\"\n        >\n          <img src=\"@/assets/images/coin_04.svg\" alt=\"\" />\n        </motion.div>\n\n        <!-- 금액 -->\n        <motion.div\n          class=\"betting-status__win-value\"\n          :initial=\"{ scale: 0, opacity: 0, y: 50 }\"\n          :animate=\"{ scale: 1, opacity: 1, y: 0 }\"\n          :transition=\"{\n            type: 'spring',\n            stiffness: 300,\n            damping: 20,\n            mass: 0.6,\n            bounce: 0.6,\n            delay: 0.5,\n          }\"\n        >\n          <span>₩</span>\n          <strong>{{ displayWinAmount }}</strong>\n        </motion.div>\n      </div>\n    </motion.div>\n  </AnimatePresence>\n</template>\n\n<style scoped></style>\n","<script setup>\nimport { ref, onMounted, onUnmounted, watch } from \"vue\";\nimport { motion } from \"motion-v\";\nimport { useAuth } from \"@/composables/useAuth\";\nimport { useSocket } from \"@/composables/useSocket\";\nimport apiClient from \"@/composables/common/axios\";\n\nconst { isLoggedIn, currentUser } = useAuth();\nconst { on, off } = useSocket();\nconst bettingHistory = ref([]);\n\n// API로 배팅 이력 조회\nconst fetchBettingHistory = async () => {\n  try {\n    if (!isLoggedIn.value) {\n      bettingHistory.value = [];\n      return;\n    }\n\n    const response = await apiClient.get('/api/user.php?action=history&limit=20');\n\n    if (response.data.success) {\n      bettingHistory.value = response.data.history;\n    }\n  } catch (error) {\n    console.error('[Betting History Table] Fetch failed:', error);\n    bettingHistory.value = [];\n  }\n};\n\n// 배팅 즉시 \"대기중\" 상태로 추가\nconst addPendingBet = (data) => {\n  if (!isLoggedIn.value) return;\n\n  const now = new Date();\n  const pendingBet = {\n    roundId: data.round_id || 'pending',\n    date: now.toISOString().split('T')[0],\n    time: now.toTimeString().split(' ')[0].substring(0, 5),\n    type: data.bet_type,\n    originalAmount: data.amount,\n    approvedAmount: data.amount,\n    profit: 0,\n    result: '대기중',\n    status: 'pending',\n    startPrice: data.start_price || 0,\n    endPrice: '-',\n    roundResult: '',\n    _isPending: true, // 임시 배팅 플래그\n    _betId: data.bet_id // 배팅 ID 저장\n  };\n\n  // 배열 맨 앞에 추가\n  bettingHistory.value.unshift(pendingBet);\n};\n\n// 배팅 결과 업데이트 (해당 행만 업데이트, 전체 새로고침 X)\nconst updateBetResult = (data) => {\n  // bet_id로 정확히 매칭 (2중 배팅 지원)\n  const index = bettingHistory.value.findIndex(\n    bet => bet._betId === data.bet_id && bet._isPending\n  );\n\n  if (index !== -1) {\n    // 해당 행의 결과만 업데이트\n    const bet = bettingHistory.value[index];\n    bet.result = data.result || '정산완료';\n    bet.profit = data.profit || 0;\n    bet.startPrice = data.entryPrice || bet.startPrice;\n    bet.endPrice = data.exitPrice || 0;\n    bet.roundResult = data.result === '승리' ? 'WIN' : 'LOSE';\n    bet.status = 'settled';\n    bet._isPending = false; // pending 플래그 제거\n  }\n};\n\nonMounted(() => {\n  // 약간의 딜레이 후 배팅 이력 로드\n  setTimeout(() => {\n    fetchBettingHistory();\n  }, 100);\n\n  // Socket.io 이벤트 - 배팅 즉시 추가 (본인 배팅만)\n  on('bet:placed', (data) => {\n    // 타입 비교 문제 방지: 둘 다 숫자로 변환\n    const betUserId = parseInt(data.user_id);\n    const currentUserId = parseInt(currentUser.value?.id);\n\n    if (betUserId === currentUserId) {\n      addPendingBet(data);\n    }\n  });\n\n  // Socket.io 이벤트 - 결과 업데이트 시 배팅 이력 새로고침\n  on('results:update', () => {\n    fetchBettingHistory();\n  });\n\n  // Socket.io 이벤트 - 배팅 정산 완료 시 새로고침\n  on('bet:settled', (data) => {\n    updateBetResult(data);\n  });\n\n  // Socket.io 이벤트 - 배팅 즉시 승인 시 새로고침 (승인이 바로 난 경우)\n  on('bet:approved', () => {\n    fetchBettingHistory();\n  });\n});\n\nonUnmounted(() => {\n  off('bet:placed');\n  off('results:update');\n  off('bet:settled');\n  off('bet:approved');\n});\n\n// 로그인 상태 변경 시 새로고침\nwatch(isLoggedIn, (newVal) => {\n  if (newVal) {\n    fetchBettingHistory();\n  } else {\n    bettingHistory.value = [];\n  }\n});\n\n// 숫자 포맷팅\nconst formatNumber = (num) => {\n  if (num === null || num === undefined) return '0';\n\n  // 이미 문자열이고 콤마가 포함된 경우 그대로 반환\n  if (typeof num === 'string' && num.includes(',')) {\n    return num;\n  }\n\n  // 문자열인 경우 숫자로 변환\n  const numValue = typeof num === 'string' ? parseFloat(num.replace(/,/g, '')) : num;\n\n  // NaN 체크\n  if (isNaN(numValue)) return '0';\n\n  // 숫자를 한국 형식으로 포맷팅\n  return numValue.toLocaleString('ko-KR');\n};\n</script>\n<template>\n  <motion.section\n    class=\"betting-history\"\n    :initial=\"{ opacity: 0, y: 20 }\"\n    :animate=\"{ opacity: 1, y: 0 }\"\n    :transition=\"{\n      type: 'spring',\n      stiffness: 300,\n      damping: 25,\n      mass: 0.8,\n    }\"\n  >\n    <h2 class=\"blind\">배팅이력</h2>\n    <div class=\"table__inner\">\n      <div class=\"table__wrap\">\n        <table class=\"table table--a\">\n          <colgroup>\n            <col width=\"260px\" />\n            <col width=\"140px\" />\n            <col width=\"260px\" />\n            <col width=\"260px\" />\n            <col width=\"260px\" />\n            <col width=\"260px\" />\n            <col width=\"140px\" />\n          </colgroup>\n          <thead class=\"table__head\">\n            <tr class=\"table__row table__row--th\">\n              <th class=\"table__cell table__cell--th\">날짜</th>\n              <th class=\"table__cell table__cell--th\">유형</th>\n              <th class=\"table__cell table__cell--th\">진입가격</th>\n              <th class=\"table__cell table__cell--th\">결산가격</th>\n              <th class=\"table__cell table__cell--th\">배팅</th>\n              <th class=\"table__cell table__cell--th\">수익</th>\n              <th class=\"table__cell table__cell--th\">결과</th>\n            </tr>\n          </thead>\n          <tbody class=\"table__body\">\n            <!-- 로그인 안됐을 때 -->\n            <tr v-if=\"!isLoggedIn\" class=\"table__row table__row--td\">\n              <td class=\"table__cell table__cell--td\" colspan=\"7\">\n                <div class=\"table__empty\">\n                  <i class=\"bi bi-lock\"></i>\n                  <span>로그인 후 배팅이력을 확인할 수 있습니다.</span>\n                </div>\n              </td>\n            </tr>\n\n            <!-- 로그인했지만 데이터 없을 때 -->\n            <tr v-else-if=\"bettingHistory.length === 0\" class=\"table__row table__row--td\">\n              <td class=\"table__cell table__cell--td\" colspan=\"7\">\n                <div class=\"table__empty\">\n                  <span>배팅 내역이 없습니다.</span>\n                </div>\n              </td>\n            </tr>\n\n            <!-- 배팅 이력 표시 -->\n            <tr v-else v-for=\"(item, index) in bettingHistory\" :key=\"item._betId || (item.roundId + '-' + item.type + '-' + index)\" class=\"table__row table__row--td\">\n              <td class=\"table__cell table__cell--td\">\n                <div class=\"table__cell-date\">\n                  <span>{{ item.date }}</span>\n                  <span>{{ item.time }}</span>\n                </div>\n              </td>\n              <td class=\"table__cell table__cell--td\">\n                <span\n                  :class=\"[\n                    'badge',\n                    item.type === 'UP' ? 'badge--up' : 'badge--down',\n                    'ico-after',\n                    item.type === 'UP' ? 'ico-up' : 'ico-down'\n                  ]\"\n                >\n                  {{ item.type }}\n                </span>\n              </td>\n              <td class=\"table__cell table__cell--td\">{{ formatNumber(item.startPrice) }}</td>\n              <td class=\"table__cell table__cell--td\">{{ item.endPrice ? formatNumber(item.endPrice) : '-' }}</td>\n              <td class=\"table__cell table__cell--td\">\n                {{ formatNumber(item.originalAmount) }}\n              </td>\n              <td\n                :class=\"[\n                  'table__cell',\n                  'table__cell--td',\n                  item.result === '승리' ? 'table__cell--primary' : item.result === '패배' ? 'table__cell--secondary' : ''\n                ]\"\n              >\n                <div class=\"table__cell-profit\">\n                  <span v-if=\"item.profit > 0\">+</span>\n                  <span>{{ formatNumber(item.profit) }}</span>\n                </div>\n              </td>\n              <td\n                :class=\"[\n                  'table__cell',\n                  'table__cell--td',\n                  item.result === '승리' ? 'table__cell--primary' : item.result === '패배' ? 'table__cell--secondary' : ''\n                ]\"\n              >\n                {{ item.result }}\n              </td>\n            </tr>\n          </tbody>\n        </table>\n      </div>\n    </div>\n  </motion.section>\n</template>\n<style scoped></style>\n","<script setup>\nimport { ref, onMounted, watch } from \"vue\";\nimport { motion } from \"motion-v\";\nimport apiClient from \"@/composables/common/axios\";\n\n// 필터 상태 관리 ('day' | 'week' | 'month' | 'all')\nconst activeFilter = ref('all');\nconst rankings = ref([]);\nconst isLoading = ref(false);\n\n// 랭킹 데이터 조회\nconst fetchRankings = async () => {\n  isLoading.value = true;\n  try {\n    const response = await apiClient.get(`/api/ranking.php?period=${activeFilter.value}&limit=10`);\n    if (response.data.success) {\n      rankings.value = response.data.rankings;\n      // console.log('[Ranking] Loaded:', rankings.value.length, 'rankings');\n    }\n  } catch (error) {\n    console.error('[Ranking] Fetch failed:', error);\n    rankings.value = [];\n  } finally {\n    isLoading.value = false;\n  }\n};\n\n// 필터 클릭 핸들러\nconst handleFilterClick = (filter) => {\n  activeFilter.value = filter;\n};\n\n// 필터 변경 시 데이터 새로고침\nwatch(activeFilter, () => {\n  fetchRankings();\n});\n\n// 초기 로드\nonMounted(() => {\n  fetchRankings();\n});\n\n// 숫자 포맷팅\nconst formatNumber = (num) => {\n  return num?.toLocaleString('ko-KR') || '0';\n};\n</script>\n<template>\n  <motion.section\n    class=\"ranking-history\"\n    :initial=\"{ opacity: 0, y: 20 }\"\n    :animate=\"{ opacity: 1, y: 0 }\"\n    :transition=\"{\n      type: 'spring',\n      stiffness: 300,\n      damping: 25,\n      mass: 0.8,\n    }\"\n  >\n    <h2 class=\"blind\">순위</h2>\n    <div class=\"ranking-history__filter\">\n      <button\n        type=\"button\"\n        :class=\"[\n          'btn-sm',\n          activeFilter === 'all' ? 'btn-primary' : 'btn-ghost'\n        ]\"\n        @click=\"handleFilterClick('all')\"\n      >\n        전체\n      </button>\n      <button\n        type=\"button\"\n        :class=\"[\n          'btn-sm',\n          activeFilter === 'day' ? 'btn-primary' : 'btn-ghost'\n        ]\"\n        @click=\"handleFilterClick('day')\"\n      >\n        일\n      </button>\n      <button\n        type=\"button\"\n        :class=\"[\n          'btn-sm',\n          activeFilter === 'week' ? 'btn-primary' : 'btn-ghost'\n        ]\"\n        @click=\"handleFilterClick('week')\"\n      >\n        주\n      </button>\n      <button\n        type=\"button\"\n        :class=\"[\n          'btn-sm',\n          activeFilter === 'month' ? 'btn-primary' : 'btn-ghost'\n        ]\"\n        @click=\"handleFilterClick('month')\"\n      >\n        월\n      </button>\n    </div>\n    <div class=\"table__inner\">\n      <div class=\"table__wrap\">\n        <table class=\"table table--a\">\n          <colgroup>\n            <col width=\"400px\" />\n            <col width=\"260px\" />\n            <col width=\"260px\" />\n            <col width=\"260px\" />\n            <col width=\"260px\" />\n            <col width=\"400px\" />\n          </colgroup>\n          <thead class=\"table__head\">\n            <tr class=\"table__row table__row--th\">\n              <th class=\"table__cell table__cell--th\">트레이더</th>\n              <th class=\"table__cell table__cell--th\">트레이딩</th>\n              <th class=\"table__cell table__cell--th\">승리</th>\n              <th class=\"table__cell table__cell--th\">승률</th>\n              <th class=\"table__cell table__cell--th\">순위</th>\n              <th class=\"table__cell table__cell--th\">총 수익</th>\n            </tr>\n          </thead>\n          <tbody class=\"table__body\">\n            <!-- 로딩 중 -->\n            <tr v-if=\"isLoading\" class=\"table__row table__row--td\">\n              <td class=\"table__cell table__cell--td\" colspan=\"6\">\n                <div class=\"table__empty\">\n                  <span>랭킹 데이터를 불러오는 중...</span>\n                </div>\n              </td>\n            </tr>\n\n            <!-- 데이터 없음 -->\n            <tr v-else-if=\"rankings.length === 0\" class=\"table__row table__row--td\">\n              <td class=\"table__cell table__cell--td\" colspan=\"6\">\n                <div class=\"table__empty\">\n                  <span>랭킹 데이터가 없습니다.</span>\n                </div>\n              </td>\n            </tr>\n\n            <!-- 랭킹 목록 -->\n            <tr v-else v-for=\"ranking in rankings\" :key=\"ranking.rank\" class=\"table__row table__row--td\">\n              <td class=\"table__cell table__cell--td\">\n                <div class=\"table__cell-wrap\">\n                  <img\n                    :src=\"`/assets/images/default_avatar_${ranking.avatar || '01'}.png`\"\n                    :alt=\"`${ranking.name} 프로필`\"\n                    @error=\"$event.target.src='/assets/images/default_avatar_01.png'\"\n                  />\n                  <span>{{ ranking.name }}</span>\n                </div>\n              </td>\n              <td class=\"table__cell table__cell--td\">{{ ranking.totalBets }}</td>\n              <td class=\"table__cell table__cell--td\">{{ ranking.wins }}</td>\n              <td class=\"table__cell table__cell--td\">\n                <div class=\"table__cell-profit\">\n                  <span>{{ ranking.winRate }}</span>\n                  <span>%</span>\n                </div>\n              </td>\n              <td class=\"table__cell table__cell--td\">\n                <div class=\"table__cell-profit\">\n                  <span>{{ ranking.profitRate }}</span>\n                  <span>%</span>\n                </div>\n              </td>\n              <td class=\"table__cell table__cell--td table__cell--primary\">\n                <div class=\"table__cell-profit\">\n                  <span>₩</span>\n                  <span>{{ formatNumber(ranking.profit) }}</span>\n                </div>\n              </td>\n            </tr>\n          </tbody>\n        </table>\n      </div>\n    </div>\n  </motion.section>\n</template>\n<style scoped></style>\n","<script setup></script>\n\n<template>\n  <footer class=\"footer\">\n    <div class=\"footer__content\">\n      <h2 class=\"blind\">BITUP</h2>\n      <small>BitUP 플랫폼에 대한 접근은 18세 이하의 개인에게 제한됩니다.</small>\n      <small>Copyright © 2025. All rights reserved.</small>\n    </div>\n  </footer>\n</template>\n\n<style scoped></style>\n","import { ref, onMounted, onBeforeUnmount, nextTick, watch } from \"vue\";\nimport { throttle } from \"./utils/throttle\";\n\nexport const useContainerQuery = (containerElement, breakpoint = \"xl\", throttleDelay = 16) => {\n  const breakpoints = {\n    xs: 375,\n    sm: 576,\n    md: 768,\n    lg: 992,\n    xl: 1200,\n    xxl: 1400,\n  };\n\n  const breakpointValue = breakpoints[breakpoint];\n  if (!breakpointValue) {\n    console.warn(`Breakpoint '${breakpoint}' not found. Available: ${Object.keys(breakpoints).join(', ')}`);\n    return { isBelowBreakpoint: ref(false) };\n  }\n\n  // 초기값: breakpoint보다 크다고 가정 (SSR 대응)\n  const isBelowBreakpoint = ref(false);\n  let resizeObserver = null;\n\n  const update = () => {\n    if (containerElement.value) {\n      const width = containerElement.value.offsetWidth;\n      isBelowBreakpoint.value = width <= breakpointValue;\n    }\n  };\n\n  // throttle 적용 (기본 16ms - 한 프레임)\n  const throttledUpdate = throttle(update, throttleDelay);\n\n  // containerElement가 설정되면 초기화\n  watch(\n    () => containerElement.value,\n    (newValue) => {\n      if (newValue && typeof window !== \"undefined\") {\n        // 즉시 업데이트\n        update();\n        \n        // ResizeObserver를 사용하여 컨테이너 크기 변화 감지\n        if (resizeObserver) {\n          resizeObserver.disconnect();\n        }\n        \n        resizeObserver = new ResizeObserver(() => {\n          throttledUpdate();\n        });\n        \n        resizeObserver.observe(newValue);\n      }\n    },\n    { immediate: true }\n  );\n\n  onMounted(async () => {\n    await nextTick();\n    if (typeof window !== \"undefined\" && containerElement.value) {\n      // 즉시 업데이트\n      update();\n      \n      // watch에서 이미 observer가 설정되었을 수 있으므로 확인\n      if (!resizeObserver) {\n        resizeObserver = new ResizeObserver(() => {\n          throttledUpdate();\n        });\n        resizeObserver.observe(containerElement.value);\n      }\n    }\n  });\n\n  onBeforeUnmount(() => {\n    if (resizeObserver) {\n      resizeObserver.disconnect();\n      resizeObserver = null;\n    }\n  });\n\n  return { isBelowBreakpoint };\n};\n\n","<script setup>\nimport { ref, computed } from \"vue\";\nimport { useChat } from \"@/composables/useSidebar\";\nimport { useContainerQuery } from \"@/composables/useContainerQuery\";\n\ndefinePageMeta({\n  layout: \"main\",\n});\n\nconst { isChatOpen, isNotificationOpen } = useChat();\nconst mainSectionRef = ref(null);\n// xxl (1400px) 기준으로 사용\nconst { isBelowBreakpoint } = useContainerQuery(mainSectionRef, \"xxl\");\n\n// 1400px 초과일 때만 index.vue의 BettingStatus를 보여줌 (XXL 사이즈)\n// 1400px 이하일 때는 ChartSection 내부에 렌더링됨\nconst showBettingStatusOutside = computed(() => !isBelowBreakpoint.value);\n\n// 탭 상태 관리\nconst activeTab = ref(\"betting\"); // 'betting' | 'ranking'\n\n// 탭 클릭 핸들러\nconst handleTabClick = (tab) => {\n  activeTab.value = tab;\n};\n</script>\n\n<template>\n  <div class=\"main\">\n    <main class=\"main__content\">\n      <div\n        ref=\"mainSectionRef\"\n        class=\"main__section main__section--flex\"\n        :class=\"{\n          'main__section--chat-open': isChatOpen || isNotificationOpen,\n        }\"\n      >\n        <!-- 차트 -->\n        <MainChartSection :show-betting-status=\"false\" />\n        <!-- 베팅 상태 (항상 우측에 표시) -->\n        <section class=\"betting-status\">\n          <MainBettingStatus />\n        </section>\n      </div>\n\n      <div\n        class=\"main__section\"\n        :class=\"{\n          'main__section--chat-open': isChatOpen || isNotificationOpen,\n        }\"\n      >\n        <div class=\"main__section-wrapper\">\n          <ul class=\"tab__list\">\n            <li\n              class=\"tab__item\"\n              :class=\"{ 'tab__item--active': activeTab === 'betting' }\"\n            >\n              <button\n                type=\"button\"\n                class=\"tab__btn\"\n                @click=\"handleTabClick('betting')\"\n              >\n                <span class=\"tab__text\">배팅이력</span>\n              </button>\n            </li>\n            <li\n              class=\"tab__item\"\n              :class=\"{ 'tab__item--active': activeTab === 'ranking' }\"\n            >\n              <button\n                type=\"button\"\n                class=\"tab__btn\"\n                @click=\"handleTabClick('ranking')\"\n              >\n                <span class=\"tab__text\">순위</span>\n              </button>\n            </li>\n          </ul>\n          <!-- 배팅이력 -->\n          <MainBettingHistory v-show=\"activeTab === 'betting'\" />\n          <!-- 순위 -->\n          <MainRankingHistory v-show=\"activeTab === 'ranking'\" />\n        </div>\n      </div>\n\n      <LayoutFooter\n        :class=\"{\n          'main__section--chat-open': isChatOpen || isNotificationOpen,\n        }\"\n      />\n    </main>\n\n  </div>\n</template>\n\n<style>\n@import \"@/assets/scss/pages/main.scss\";\n</style>\n"],"version":3}