{"version":3,"file":"JSearchCombo.vue.cjs","sources":["../../../../src/components/atoms/JSearchCombo.vue"],"sourcesContent":["<script setup lang=\"ts\">\nimport { computed } from 'vue'\nimport { Check, ChevronsUpDown, Search } from 'lucide-vue-next'\nimport { cn } from '@/lib/utils'\nimport {\n  Button,\n  Combobox,\n  ComboboxAnchor,\n  ComboboxEmpty,\n  ComboboxGroup,\n  ComboboxInput,\n  ComboboxItem,\n  ComboboxList,\n  ComboboxTrigger,\n} from '@/components/shadcn'\n\nexport interface ComboboxOption {\n  value: string | number\n  label: string\n}\n\ntype StyleType =\n  | 'default'   // 기본 스타일\n  | 'error'     // 에러 상태\n  | 'success'   // 성공 상태\n  | 'warning'   // 경고 상태\n  | 'sm'        // 작은 크기\n  | 'lg'        // 큰 크기\n\nconst props = withDefaults(\n  defineProps<{\n    modelValue?: ComboboxOption\n    options?: ComboboxOption[]\n    placeholder?: string\n    searchPlaceholder?: string\n    emptyText?: string\n    disabled?: boolean\n    required?: boolean\n    name?: string\n    id?: string\n    multiple?: boolean\n    class?: string\n    /** 스타일 프리셋 */\n    styletype?: StyleType\n  }>(),\n  {\n    options: () => [],\n    placeholder: '선택해주세요.',\n    searchPlaceholder: '',\n    emptyText: '검색 결과가 없습니다.',\n    disabled: false,\n    required: false,\n    multiple: false,\n    styletype: 'default',\n  },\n)\n\nconst emit = defineEmits<{\n  'update:modelValue': [value: ComboboxOption | undefined]\n  'change': [value: ComboboxOption | undefined]\n  'focus': [event: FocusEvent]\n  'blur': [event: FocusEvent]\n}>()\n\n/**\n * styletype -> variant/class 매핑\n */\nconst STYLE_PRESETS: Record<StyleType, { variant: 'default' | 'outline' | 'destructive' | 'secondary' | 'ghost' | 'link', buttonClass?: string, inputClass?: string }> = {\n  default: { \n    variant: 'outline',\n    buttonClass: 'h-7 text-xs px-2.5',\n  },\n  error: { \n    variant: 'outline',\n    buttonClass: 'h-7 text-xs px-2.5 border-destructive text-destructive',\n    inputClass: 'border-destructive focus:ring-destructive',\n  },\n  success: { \n    variant: 'outline',\n    buttonClass: 'h-7 text-xs px-2.5 border-green-500 text-green-700',\n    inputClass: 'border-green-500 focus:ring-green-500',\n  },\n  warning: { \n    variant: 'outline',\n    buttonClass: 'h-7 text-xs px-2.5 border-amber-500 text-amber-700',\n    inputClass: 'border-amber-500 focus:ring-amber-500',\n  },\n  sm: { \n    variant: 'outline',\n    buttonClass: 'h-7 text-[11px] px-2',\n    inputClass: 'h-7 text-[11px] px-2 py-1',\n  },\n  lg: { \n    variant: 'outline',\n    buttonClass: 'h-10 text-sm px-3',\n    inputClass: 'h-10 text-sm px-3 py-2',\n  },\n}\n\nconst preset = computed(() => {\n  const styleKey = props.styletype || 'default'\n  return STYLE_PRESETS[styleKey] ?? STYLE_PRESETS.default\n})\n\nconst buttonClass = computed(() => {\n  return cn('justify-between', preset.value?.buttonClass, props.class)\n})\n\nconst inputClass = computed(() => {\n  return cn('pl-8 pr-2 py-1 focus-visible:ring-0 border-0 border-b rounded-none h-7 text-xs', preset.value?.inputClass)\n})\n\nconst handleChange = (value: ComboboxOption | undefined) => {\n  emit('update:modelValue', value)\n  emit('change', value)\n}\n</script>\n\n<template>\n  <Combobox \n    :model-value=\"modelValue\" \n    by=\"label\" \n    :disabled=\"disabled\"\n    :required=\"required\"\n    :name=\"name\"\n    @update:model-value=\"(value) => handleChange(value as ComboboxOption | undefined)\"\n  >\n    <ComboboxAnchor as-child>\n      <ComboboxTrigger as-child>\n        <Button \n          :id=\"id\"\n          :variant=\"preset.variant\" \n          :class=\"buttonClass\"\n          :disabled=\"disabled\"\n          @focus=\"emit('focus', $event as FocusEvent)\"\n          @blur=\"emit('blur', $event as FocusEvent)\"\n        >\n          {{ modelValue?.label ?? placeholder }}\n          <ChevronsUpDown class=\"ml-2 h-3.5 w-3.5 shrink-0 opacity-50\" />\n        </Button>\n      </ComboboxTrigger>\n    </ComboboxAnchor>\n\n    <ComboboxList>\n      <div class=\"relative w-full max-w-sm items-center\">\n        <ComboboxInput :class=\"inputClass\" :placeholder=\"searchPlaceholder\" />\n        <span class=\"absolute start-0 inset-y-0 flex items-center justify-center px-2.5\">\n          <Search class=\"size-3.5 text-muted-foreground\" />\n        </span>\n      </div>\n\n      <ComboboxEmpty>\n        {{ emptyText }}\n      </ComboboxEmpty>\n\n      <ComboboxGroup>\n        <ComboboxItem\n          v-for=\"option in options\"\n          :key=\"option.value\"\n          :value=\"option\"\n        >\n          {{ option.label }}\n\n          <Check v-if=\"modelValue?.value === option.value\" :class=\"cn('ml-auto h-3.5 w-3.5')\" />\n        </ComboboxItem>\n      </ComboboxGroup>\n    </ComboboxList>\n  </Combobox>\n</template>\n"],"names":["props","__props","emit","__emit","STYLE_PRESETS","preset","computed","styleKey","buttonClass","cn","inputClass","handleChange","value","_createBlock","_unref","Combobox","_cache","_createVNode","ComboboxAnchor","ComboboxTrigger","Button","$event","_createTextVNode","_toDisplayString","ChevronsUpDown","ComboboxList","_createElementVNode","_hoisted_1","ComboboxInput","_hoisted_2","Search","ComboboxEmpty","ComboboxGroup","_createElementBlock","_Fragment","_renderList","option","ComboboxItem","Check"],"mappings":"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"}