{"version":3,"file":"JPopover.vue.cjs","sources":["../../../../src/components/atoms/JPopover.vue"],"sourcesContent":["<!-- TODO: 컴포넌트 래핑 초안 - 스타일 및 기능 개선 필요 -->\r\n<script setup lang=\"ts\">\r\nimport { computed } from 'vue'\r\nimport { Popover, PopoverContent, PopoverTrigger } from '@/components/shadcn'\r\n\r\ntype StyleType =\r\n  | 'default'     // 기본 스타일 (중간 크기)\r\n  | 'default-sm'  // 기본 스타일 (작은 크기)\r\n  | 'default-lg'  // 기본 스타일 (큰 크기)\r\n  | 'default-xl'  // 기본 스타일 (매우 큰 크기)\r\n  | 'card'        // 카드 스타일 (중간 크기)\r\n  | 'card-sm'     // 카드 스타일 (작은 크기)\r\n  | 'card-lg'     // 카드 스타일 (큰 크기)\r\n  | 'card-xl'     // 카드 스타일 (매우 큰 크기)\r\n  | 'minimal'     // 최소한의 스타일 (중간 크기)\r\n  | 'minimal-sm'  // 최소한의 스타일 (작은 크기)\r\n  | 'minimal-lg'  // 최소한의 스타일 (큰 크기)\r\n  | 'minimal-xl'  // 최소한의 스타일 (매우 큰 크기)\r\n  | 'outlined'    // 테두리 스타일 (중간 크기)\r\n  | 'outlined-sm' // 테두리 스타일 (작은 크기)\r\n  | 'outlined-lg' // 테두리 스타일 (큰 크기)\r\n  | 'outlined-xl' // 테두리 스타일 (매우 큰 크기)\r\n  | 'auto'        // 콘텐츠 기반 동적 크기 (뷰포트 인지 max-width)\r\n\r\ntype PositionType =\r\n  | 'top'       // 위쪽\r\n  | 'bottom'    // 아래쪽\r\n  | 'left'      // 왼쪽\r\n  | 'right'     // 오른쪽\r\n\r\nconst props = withDefaults(\r\n  defineProps<{\r\n    /** 팝오버 열림 상태 */\r\n    open?: boolean\r\n    /** 비활성화 상태 */\r\n    disabled?: boolean\r\n    /** 모달 모드 여부 */\r\n    modal?: boolean\r\n    /** 스타일 프리셋 (크기 포함) */\r\n    styletype?: StyleType\r\n    /** 위치 프리셋 */\r\n    position?: PositionType\r\n    /** 정렬 방식 */\r\n    align?: 'start' | 'center' | 'end'\r\n    /** 사이드 오프셋 */\r\n    sideOffset?: number\r\n    /** 정렬 오프셋 */\r\n    alignOffset?: number\r\n  }>(),\r\n  {\r\n    open: undefined,\r\n    disabled: false,\r\n    modal: false, // modal 기본값 false\r\n    styletype: 'default',\r\n    position: 'bottom',\r\n    align: 'center',\r\n    sideOffset: 4,\r\n    alignOffset: 0,\r\n  },\r\n)\r\n\r\nconst emits = defineEmits<{\r\n  /** 열림 상태 변경 이벤트 */\r\n  'update:open': [open: boolean]\r\n  /** 열림 이벤트 */\r\n  openChange: [open: boolean]\r\n}>()\r\n\r\n/**\r\n * styletype -> class 매핑 (크기 포함)\r\n */\r\nconst STYLE_PRESETS: Record<StyleType, { class: string }> = {\r\n  // 기본 스타일\r\n  'default': { class: 'w-72 p-4' },\r\n  'default-sm': { class: 'w-48 p-2' },\r\n  'default-lg': { class: 'w-96 p-6' },\r\n  'default-xl': { class: 'w-[32rem] p-8' },\r\n  \r\n  // 카드 스타일\r\n  'card': { class: 'w-72 p-4 border-2 shadow-lg' },\r\n  'card-sm': { class: 'w-48 p-2 border-2 shadow-lg' },\r\n  'card-lg': { class: 'w-96 p-6 border-2 shadow-lg' },\r\n  'card-xl': { class: 'w-[32rem] p-8 border-2 shadow-lg' },\r\n  \r\n  // 미니멀 스타일\r\n  'minimal': { class: 'w-72 p-4 border-0 shadow-sm' },\r\n  'minimal-sm': { class: 'w-48 p-2 border-0 shadow-sm' },\r\n  'minimal-lg': { class: 'w-96 p-6 border-0 shadow-sm' },\r\n  'minimal-xl': { class: 'w-[32rem] p-8 border-0 shadow-sm' },\r\n  \r\n  // 아웃라인 스타일\r\n  'outlined': { class: 'w-72 p-4 border-2 border-gray-300' },\r\n  'outlined-sm': { class: 'w-48 p-2 border-2 border-gray-300' },\r\n  'outlined-lg': { class: 'w-96 p-6 border-2 border-gray-300' },\r\n  'outlined-xl': { class: 'w-[32rem] p-8 border-2 border-gray-300' },\r\n\r\n  'auto': { class: 'max-w-[min(20rem,var(--reka-popover-content-available-width,20rem))] p-3' },\r\n}\r\n\r\n/** 최종 바인딩: Popover 루트에 전달할 props */\r\nconst rootProps = computed(() => {\r\n  \r\n  // open이 제공되면 controlled component\r\n  // open이 없으면 defaultOpen=false (uncontrolled, 기본 닫힘)\r\n  if (props.open !== undefined) {\r\n    return {\r\n      open: props.open,\r\n      disabled: props.disabled,\r\n      modal: props.modal,\r\n    }\r\n  } else {\r\n    return {\r\n      defaultOpen: false,\r\n      disabled: props.disabled,\r\n      modal: props.modal,\r\n    }\r\n  }\r\n})\r\n\r\n/** PopoverTrigger에 전달할 props */\r\nconst triggerProps = computed(() => {\r\n  return {\r\n    disabled: props.disabled,\r\n  }\r\n})\r\n\r\n/** PopoverContent에 전달할 props */\r\nconst contentProps = computed(() => {\r\n  const propsObj: Record<string, any> = {\r\n    side: props.position,\r\n    align: props.align,\r\n    sideOffset: props.sideOffset,\r\n    alignOffset: props.alignOffset,\r\n    avoidCollisions: true,\r\n    collisionSide: true,\r\n    collisionAlign: true,\r\n    collisionPadding: 0,\r\n    sticky: 'partial',\r\n    hideWhenDetached: false,\r\n  }\r\n  \r\n  // modal이 true일 때 외부 클릭을 막음\r\n  if (props.modal === true) {\r\n    propsObj.onInteractOutside = (event: Event) => {\r\n      event.preventDefault()\r\n      event.stopPropagation()\r\n    }\r\n  }\r\n  \r\n  return propsObj\r\n})\r\n\r\n/** PopoverContent에 전달할 클래스 */\r\nconst contentClass = computed(() => {\r\n  const styleKey = props.styletype || 'default'\r\n  const stylePreset = STYLE_PRESETS[styleKey] ?? STYLE_PRESETS['default']\r\n  return stylePreset?.class || ''\r\n})\r\n\r\nconst handleOpenChange = (open: boolean) => {\r\n  emits('update:open', open)\r\n  emits('openChange', open)\r\n}\r\n</script>\r\n\r\n<template>\r\n  <Popover \r\n    v-bind=\"rootProps\"\r\n    @update:open=\"handleOpenChange\"\r\n  >\r\n    <PopoverTrigger v-bind=\"triggerProps\" as-child>\r\n      <slot name=\"trigger\" />\r\n    </PopoverTrigger>\r\n    <PopoverContent \r\n      v-bind=\"contentProps\"\r\n      :class=\"[\r\n        'z-50 rounded-md border bg-popover text-popover-foreground shadow-md outline-none overflow-hidden data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0 data-[state=closed]:zoom-out-95 data-[state=open]:zoom-in-95 data-[side=bottom]:slide-in-from-top-2 data-[side=left]:slide-in-from-right-2 data-[side=right]:slide-in-from-left-2 data-[side=top]:slide-in-from-bottom-2',\r\n        contentClass\r\n      ]\"\r\n    >\r\n      <slot />\r\n    </PopoverContent>\r\n  </Popover>\r\n</template>\r\n"],"names":["props","__props","emits","__emit","STYLE_PRESETS","rootProps","computed","triggerProps","contentProps","propsObj","event","contentClass","styleKey","handleOpenChange","open","_openBlock","_createBlock","_unref","_mergeProps","_createVNode","_renderSlot","_ctx","PopoverContent"],"mappings":"unBA8BA,MAAMA,EAAQC,EA+BRC,EAAQC,EAURC,EAAsD,CAE1D,QAAW,CAAE,MAAO,UAAA,EACpB,aAAc,CAAE,MAAO,UAAA,EACvB,aAAc,CAAE,MAAO,UAAA,EACvB,aAAc,CAAE,MAAO,eAAA,EAGvB,KAAQ,CAAE,MAAO,6BAAA,EACjB,UAAW,CAAE,MAAO,6BAAA,EACpB,UAAW,CAAE,MAAO,6BAAA,EACpB,UAAW,CAAE,MAAO,kCAAA,EAGpB,QAAW,CAAE,MAAO,6BAAA,EACpB,aAAc,CAAE,MAAO,6BAAA,EACvB,aAAc,CAAE,MAAO,6BAAA,EACvB,aAAc,CAAE,MAAO,kCAAA,EAGvB,SAAY,CAAE,MAAO,mCAAA,EACrB,cAAe,CAAE,MAAO,mCAAA,EACxB,cAAe,CAAE,MAAO,mCAAA,EACxB,cAAe,CAAE,MAAO,wCAAA,EAExB,KAAQ,CAAE,MAAO,0EAAA,CAA2E,EAIxFC,EAAYC,EAAAA,SAAS,IAIrBN,EAAM,OAAS,OACV,CACL,KAAMA,EAAM,KACZ,SAAUA,EAAM,SAChB,MAAOA,EAAM,KAAA,EAGR,CACL,YAAa,GACb,SAAUA,EAAM,SAChB,MAAOA,EAAM,KAAA,CAGlB,EAGKO,EAAeD,EAAAA,SAAS,KACrB,CACL,SAAUN,EAAM,QAAA,EAEnB,EAGKQ,EAAeF,EAAAA,SAAS,IAAM,CAClC,MAAMG,EAAgC,CACpC,KAAMT,EAAM,SACZ,MAAOA,EAAM,MACb,WAAYA,EAAM,WAClB,YAAaA,EAAM,YACnB,gBAAiB,GACjB,cAAe,GACf,eAAgB,GAChB,iBAAkB,EAClB,OAAQ,UACR,iBAAkB,EAAA,EAIpB,OAAIA,EAAM,QAAU,KAClBS,EAAS,kBAAqBC,GAAiB,CAC7CA,EAAM,eAAA,EACNA,EAAM,gBAAA,CACR,GAGKD,CACT,CAAC,EAGKE,EAAeL,EAAAA,SAAS,IAAM,CAClC,MAAMM,EAAWZ,EAAM,WAAa,UAEpC,OADoBI,EAAcQ,CAAQ,GAAKR,EAAc,UACzC,OAAS,EAC/B,CAAC,EAEKS,EAAoBC,GAAkB,CAC1CZ,EAAM,cAAeY,CAAI,EACzBZ,EAAM,aAAcY,CAAI,CAC1B,gBAIEC,YAAA,EAAAC,cAgBUC,EAAAA,iBAhBVC,aAgBUb,QAfS,CAChB,gBAAaQ,CAAA,CAAgB,EAAA,mBAE9B,IAEiB,CAFjBM,cAEiBF,EAAAA,iBAFjBC,EAAAA,WAEiBX,QAFmB,CAAE,WAAA,EAAA,CAAQ,EAAA,mBAC5C,IAAuB,CAAvBa,aAAuBC,EAAA,OAAA,SAAA,CAAA,YAEzBF,EAAAA,YAQiBF,EAAAA,MAAAK,EAAAA,OAAA,EARjBJ,EAAAA,WAQiBV,EAAA,MAPK,CACnB,MAAK,qbAA2cG,EAAA,KAAA,uBAKjd,IAAQ,CAARS,aAAQC,EAAA,OAAA,SAAA,CAAA"}