{"version":3,"file":"useBreakpoint.cjs","sources":["../../../src/composables/useBreakpoint.ts"],"sourcesContent":["import { ref, readonly, onMounted, onUnmounted } from 'vue'\n\ntype Breakpoint = 'mobile' | 'tablet' | 'desktop'\n\nconst BREAKPOINTS = {\n  md: 768,\n  lg: 1024,\n} as const\n\n/**\n * useBreakpoint - 반응형 브레이크포인트 감지 composable\n *\n * @returns isMobile (<768px), isTablet (768~1023px), isDesktop (>=1024px), breakpoint\n *\n * @example\n * ```vue\n * const { isMobile, isDesktop } = useBreakpoint()\n * // template: v-if=\"isMobile\"\n * ```\n */\nexport function useBreakpoint() {\n  const breakpoint = ref<Breakpoint>('desktop')\n  const isMobile = ref(false)\n  const isTablet = ref(false)\n  const isDesktop = ref(true)\n\n  let mdQuery: MediaQueryList | null = null\n  let lgQuery: MediaQueryList | null = null\n\n  function update() {\n    const mdMatch = mdQuery?.matches ?? true\n    const lgMatch = lgQuery?.matches ?? true\n\n    if (!mdMatch) {\n      breakpoint.value = 'mobile'\n      isMobile.value = true\n      isTablet.value = false\n      isDesktop.value = false\n    } else if (!lgMatch) {\n      breakpoint.value = 'tablet'\n      isMobile.value = false\n      isTablet.value = true\n      isDesktop.value = false\n    } else {\n      breakpoint.value = 'desktop'\n      isMobile.value = false\n      isTablet.value = false\n      isDesktop.value = true\n    }\n  }\n\n  onMounted(() => {\n    if (typeof window === 'undefined') return\n\n    mdQuery = window.matchMedia(`(min-width: ${BREAKPOINTS.md}px)`)\n    lgQuery = window.matchMedia(`(min-width: ${BREAKPOINTS.lg}px)`)\n\n    mdQuery.addEventListener('change', update)\n    lgQuery.addEventListener('change', update)\n\n    update()\n  })\n\n  onUnmounted(() => {\n    mdQuery?.removeEventListener('change', update)\n    lgQuery?.removeEventListener('change', update)\n  })\n\n  return {\n    breakpoint: readonly(breakpoint),\n    isMobile: readonly(isMobile),\n    isTablet: readonly(isTablet),\n    isDesktop: readonly(isDesktop),\n  }\n}\n"],"names":["BREAKPOINTS","useBreakpoint","breakpoint","ref","isMobile","isTablet","isDesktop","mdQuery","lgQuery","update","mdMatch","lgMatch","onMounted","onUnmounted","readonly"],"mappings":"uGAIMA,EAAc,CAClB,GAAI,IACJ,GAAI,IACN,EAaO,SAASC,GAAgB,CAC9B,MAAMC,EAAaC,EAAAA,IAAgB,SAAS,EACtCC,EAAWD,EAAAA,IAAI,EAAK,EACpBE,EAAWF,EAAAA,IAAI,EAAK,EACpBG,EAAYH,EAAAA,IAAI,EAAI,EAE1B,IAAII,EAAiC,KACjCC,EAAiC,KAErC,SAASC,GAAS,CAChB,MAAMC,EAAUH,GAAS,SAAW,GAC9BI,EAAUH,GAAS,SAAW,GAE/BE,EAKOC,GAMVT,EAAW,MAAQ,UACnBE,EAAS,MAAQ,GACjBC,EAAS,MAAQ,GACjBC,EAAU,MAAQ,KARlBJ,EAAW,MAAQ,SACnBE,EAAS,MAAQ,GACjBC,EAAS,MAAQ,GACjBC,EAAU,MAAQ,KARlBJ,EAAW,MAAQ,SACnBE,EAAS,MAAQ,GACjBC,EAAS,MAAQ,GACjBC,EAAU,MAAQ,GAYtB,CAEAM,OAAAA,EAAAA,UAAU,IAAM,CACV,OAAO,OAAW,MAEtBL,EAAU,OAAO,WAAW,eAAeP,EAAY,EAAE,KAAK,EAC9DQ,EAAU,OAAO,WAAW,eAAeR,EAAY,EAAE,KAAK,EAE9DO,EAAQ,iBAAiB,SAAUE,CAAM,EACzCD,EAAQ,iBAAiB,SAAUC,CAAM,EAEzCA,EAAA,EACF,CAAC,EAEDI,EAAAA,YAAY,IAAM,CAChBN,GAAS,oBAAoB,SAAUE,CAAM,EAC7CD,GAAS,oBAAoB,SAAUC,CAAM,CAC/C,CAAC,EAEM,CACL,WAAYK,EAAAA,SAASZ,CAAU,EAC/B,SAAUY,EAAAA,SAASV,CAAQ,EAC3B,SAAUU,EAAAA,SAAST,CAAQ,EAC3B,UAAWS,EAAAA,SAASR,CAAS,CAAA,CAEjC"}