{"version":3,"file":"JDatepicker.vue.cjs","sources":["../../../../src/components/atoms/JDatepicker.vue"],"sourcesContent":["<script setup lang=\"ts\">\nimport { computed, ref, watch } from 'vue'\nimport { Calendar as CalendarIcon } from 'lucide-vue-next'\nimport { type DateValue, parseDate } from '@internationalized/date'\nimport {\n  Calendar,\n  Popover,\n  PopoverContent,\n  PopoverTrigger,\n  Button,\n} from '@/components/shadcn'\nimport { cn } from '@/lib/utils'\n\n// Props 정의\nconst props = withDefaults(\n  defineProps<{\n    /** v-model로 양방향 데이터 바인딩 (ISO 8601 문자열: YYYY-MM-DD) */\n    modelValue?: string | null\n    /** Input 요소의 id */\n    id?: string\n    /** 입력 전 표시되는 안내문 */\n    placeholder?: string\n    /** 비활성화 상태 */\n    disabled?: boolean\n    /** 필수 입력 여부 */\n    required?: boolean\n    /** form 데이터 전송 시 키 이름 */\n    name?: string\n    /** 추가 CSS 클래스 */\n    class?: string\n    /** 스타일 테마 지정 */\n    styletype?: 'default' | 'sm' | 'lg'\n  }>(),\n  {\n    placeholder: '날짜를 선택하세요',\n    styletype: 'default',\n  }\n)\n\n// 이벤트 정의\nconst emit = defineEmits<{\n  'update:modelValue': [value: string | null]\n  'change': [value: string | null]\n  'focus': [event: FocusEvent]\n  'blur': [event: FocusEvent]\n}>()\n\n// 스타일 프리셋\nconst STYLE_PRESETS: Record<string, { buttonClass: string }> = {\n  default: {\n    buttonClass: 'h-7 text-xs px-2.5',\n  },\n  sm: {\n    buttonClass: 'h-7 text-[11px] px-2',\n  },\n  lg: {\n    buttonClass: 'h-9 text-sm px-3',\n  },\n}\n\n// 내부 상태로 DateValue 관리\nconst internalDate = ref<DateValue | undefined>()\n\n// modelValue를 DateValue로 변환\nconst convertToDateValue = (value: string | null | undefined): DateValue | undefined => {\n  if (!value) return undefined\n  \n  try {\n    // ISO 8601 문자열을 직접 parseDate로 변환\n    return parseDate(value)\n  } catch {\n    return undefined\n  }\n}\n\n// DateValue를 ISO 문자열로 변환\nconst convertToString = (date: DateValue | undefined): string | null => {\n  if (!date) return null\n  return `${date.year}-${String(date.month).padStart(2, '0')}-${String(date.day).padStart(2, '0')}`\n}\n\n// modelValue 변경 감지\nwatch(\n  () => props.modelValue,\n  (newValue) => {\n    const converted = convertToDateValue(newValue)\n    if (JSON.stringify(internalDate.value) !== JSON.stringify(converted)) {\n      internalDate.value = converted\n    }\n  },\n  { immediate: true }\n)\n\n// 내부 날짜 변경 시 emit\nconst handleDateChange = (date: DateValue | undefined) => {\n  internalDate.value = date\n  const stringValue = convertToString(date)\n  \n  if (stringValue !== props.modelValue) {\n    emit('update:modelValue', stringValue)\n    emit('change', stringValue)\n  }\n}\n\n// 포맷팅된 날짜 표시\nconst formattedDate = computed(() => {\n  if (!internalDate.value) return props.placeholder\n  \n  const date = new Date(\n    internalDate.value.year,\n    internalDate.value.month - 1,\n    internalDate.value.day\n  )\n  \n  return new Intl.DateTimeFormat('ko-KR', {\n    year: 'numeric',\n    month: 'long',\n    day: 'numeric',\n  }).format(date)\n})\n\n// 버튼 클래스 계산\nconst buttonClass = computed(() => {\n  const styleKey = props.styletype || 'default'\n  const preset = STYLE_PRESETS[styleKey] ?? STYLE_PRESETS.default\n  const userClass = props.class || ''\n  \n  return cn(\n    'w-full justify-start text-left font-normal',\n    preset?.buttonClass ?? 'h-10',\n    !internalDate.value && 'text-muted-foreground',\n    userClass\n  )\n})\n</script>\n\n<template>\n  <Popover>\n    <PopoverTrigger as-child>\n      <Button\n        :id=\"id\"\n        :name=\"name\"\n        :disabled=\"disabled\"\n        :class=\"buttonClass\"\n        variant=\"outline\"\n        @focus=\"emit('focus', $event)\"\n        @blur=\"emit('blur', $event)\"\n      >\n        <CalendarIcon class=\"mr-2 h-4 w-4\" />\n        {{ formattedDate }}\n      </Button>\n    </PopoverTrigger>\n    <PopoverContent class=\"w-auto p-0\">\n      <Calendar\n        v-model=\"internalDate\"\n        :locale=\"'ko-KR'\"\n        initial-focus\n        @update:model-value=\"handleDateChange\"\n      />\n    </PopoverContent>\n  </Popover>\n</template>\n"],"names":["props","__props","emit","__emit","STYLE_PRESETS","internalDate","ref","convertToDateValue","value","parseDate","convertToString","date","watch","newValue","converted","handleDateChange","stringValue","formattedDate","computed","buttonClass","styleKey","preset","userClass","cn","_createBlock","_unref","Popover","_createVNode","PopoverTrigger","Button","_cache","$event","CalendarIcon","_createTextVNode","PopoverContent","Calendar"],"mappings":"yuBAcA,MAAMA,EAAQC,EA0BRC,EAAOC,EAQPC,EAAyD,CAC7D,QAAS,CACP,YAAa,oBAAA,EAEf,GAAI,CACF,YAAa,sBAAA,EAEf,GAAI,CACF,YAAa,kBAAA,CACf,EAIIC,EAAeC,EAAAA,IAAA,EAGfC,EAAsBC,GAA4D,CACtF,GAAKA,EAEL,GAAI,CAEF,OAAOC,EAAAA,UAAUD,CAAK,CACxB,MAAQ,CACN,MACF,CACF,EAGME,EAAmBC,GAClBA,EACE,GAAGA,EAAK,IAAI,IAAI,OAAOA,EAAK,KAAK,EAAE,SAAS,EAAG,GAAG,CAAC,IAAI,OAAOA,EAAK,GAAG,EAAE,SAAS,EAAG,GAAG,CAAC,GAD7E,KAKpBC,EAAAA,MACE,IAAMZ,EAAM,WACXa,GAAa,CACZ,MAAMC,EAAYP,EAAmBM,CAAQ,EACzC,KAAK,UAAUR,EAAa,KAAK,IAAM,KAAK,UAAUS,CAAS,IACjET,EAAa,MAAQS,EAEzB,EACA,CAAE,UAAW,EAAA,CAAK,EAIpB,MAAMC,EAAoBJ,GAAgC,CACxDN,EAAa,MAAQM,EACrB,MAAMK,EAAcN,EAAgBC,CAAI,EAEpCK,IAAgBhB,EAAM,aACxBE,EAAK,oBAAqBc,CAAW,EACrCd,EAAK,SAAUc,CAAW,EAE9B,EAGMC,EAAgBC,EAAAA,SAAS,IAAM,CACnC,GAAI,CAACb,EAAa,MAAO,OAAOL,EAAM,YAEtC,MAAMW,EAAO,IAAI,KACfN,EAAa,MAAM,KACnBA,EAAa,MAAM,MAAQ,EAC3BA,EAAa,MAAM,GAAA,EAGrB,OAAO,IAAI,KAAK,eAAe,QAAS,CACtC,KAAM,UACN,MAAO,OACP,IAAK,SAAA,CACN,EAAE,OAAOM,CAAI,CAChB,CAAC,EAGKQ,EAAcD,EAAAA,SAAS,IAAM,CACjC,MAAME,EAAWpB,EAAM,WAAa,UAC9BqB,EAASjB,EAAcgB,CAAQ,GAAKhB,EAAc,QAClDkB,EAAYtB,EAAM,OAAS,GAEjC,OAAOuB,EAAAA,GACL,6CACAF,GAAQ,aAAe,OACvB,CAAChB,EAAa,OAAS,wBACvBiB,CAAA,CAEJ,CAAC,8BAICE,EAAAA,YAuBUC,EAAAA,MAAAC,EAAAA,OAAA,EAAA,KAAA,mBAtBR,IAaiB,CAbjBC,EAAAA,YAaiBF,EAAAA,MAAAG,EAAAA,OAAA,EAAA,CAbD,WAAA,IAAQ,mBACtB,IAWS,CAXTD,cAWSF,EAAAA,MAAAI,EAAAA,OAAA,EAAA,CAVN,GAAI5B,EAAA,GACJ,KAAMA,EAAA,KACN,SAAUA,EAAA,SACV,uBAAOkB,EAAA,KAAW,EACnB,QAAQ,UACP,QAAKW,EAAA,CAAA,IAAAA,EAAA,CAAA,EAAAC,GAAE7B,EAAI,QAAU6B,CAAM,GAC3B,OAAID,EAAA,CAAA,IAAAA,EAAA,CAAA,EAAAC,GAAE7B,EAAI,OAAS6B,CAAM,EAAA,qBAE1B,IAAqC,CAArCJ,EAAAA,YAAqCF,EAAAA,MAAAO,EAAAA,QAAA,EAAA,CAAvB,MAAM,eAAc,EAAGC,EAAAA,gBAAA,sBAClChB,EAAA,KAAa,EAAA,CAAA,CAAA,oDAGpBU,EAAAA,YAOiBF,EAAAA,MAAAS,EAAAA,OAAA,EAAA,CAPD,MAAM,cAAY,mBAChC,IAKE,CALFP,cAKEF,EAAAA,MAAAU,EAAAA,OAAA,EAAA,YAJS9B,EAAA,4CAAAA,EAAY,MAAA0B,GAGAhB,CAAA,EAFpB,OAAQ,QACT,gBAAA,EAAA"}