{"version":3,"file":"JTextarea.vue.cjs","sources":["../../../../src/components/atoms/JTextarea.vue"],"sourcesContent":["<script setup lang=\"ts\">\r\nimport { computed } from 'vue'\r\nimport { Textarea } from '@/components/shadcn'\r\n\r\ntype StyleType =\r\n  | 'default'   // 기본 스타일\r\n  | 'error'     // 에러 상태\r\n  | 'success'   // 성공 상태\r\n  | 'warning'   // 경고 상태\r\n  | 'sm'        // 작은 크기\r\n  | 'lg'        // 큰 크기\r\n\r\nconst props = withDefaults(\r\n  defineProps<{\r\n    modelValue?: string\r\n    placeholder?: string\r\n    disabled?: boolean\r\n    readonly?: boolean\r\n    required?: boolean\r\n    name?: string\r\n    id?: string\r\n    rows?: number\r\n    class?: string\r\n    /** 스타일 프리셋 */\r\n    styletype?: StyleType\r\n  }>(),\r\n  {\r\n    placeholder: '',\r\n    disabled: false,\r\n    readonly: false,\r\n    required: false,\r\n    rows: 3,\r\n    styletype: 'default',\r\n  },\r\n)\r\n\r\nconst emit = defineEmits<{\r\n  'update:modelValue': [value: string]\r\n  'change': [value: string]\r\n  'focus': [event: FocusEvent]\r\n  'blur': [event: FocusEvent]\r\n}>()\r\n\r\n/**\r\n * styletype -> class 매핑\r\n */\r\nconst STYLE_PRESETS: Record<StyleType, { class: string; rows?: number }> = {\r\n  default: { class: '' },\r\n  error: { \r\n    class: 'border-destructive focus-visible:ring-destructive',\r\n  },\r\n  success: { \r\n    class: 'border-green-500 focus-visible:ring-green-500',\r\n  },\r\n  warning: { \r\n    class: 'border-amber-500 focus-visible:ring-amber-500',\r\n  },\r\n  sm: { \r\n    class: 'text-xs px-2 py-1.5 min-h-[60px]',\r\n    rows: 2,\r\n  },\r\n  lg: { \r\n    class: 'text-base px-4 py-3 min-h-[120px]',\r\n    rows: 5,\r\n  },\r\n}\r\n\r\n/** 최종 바인딩 */\r\nconst mapped = computed(() => {\r\n  const styleKey = props.styletype || 'default'\r\n  const preset = STYLE_PRESETS[styleKey] ?? STYLE_PRESETS.default\r\n  const finalClass = [preset?.class, props.class].filter(Boolean).join(' ')\r\n  const finalRows = props.rows ?? preset?.rows ?? 3\r\n  \r\n  return {\r\n    placeholder: props.placeholder,\r\n    disabled: props.disabled,\r\n    readonly: props.readonly,\r\n    required: props.required,\r\n    name: props.name,\r\n    id: props.id,\r\n    rows: finalRows,\r\n    class: finalClass,\r\n  }\r\n})\r\n\r\nconst handleInput = (value: string | number) => {\r\n  const strValue = String(value)\r\n  emit('update:modelValue', strValue)\r\n  emit('change', strValue)\r\n}\r\n</script>\r\n\r\n<template>\r\n  <Textarea \r\n    v-bind=\"mapped\" \r\n    :model-value=\"modelValue as string\" \r\n    @update:model-value=\"handleInput\"\r\n    @focus=\"emit('focus', $event)\"\r\n    @blur=\"emit('blur', $event)\"\r\n  />\r\n</template>\r\n"],"names":["props","__props","emit","__emit","STYLE_PRESETS","mapped","computed","styleKey","preset","finalClass","finalRows","handleInput","value","strValue","_createBlock","_unref","Textarea","_mergeProps","_cache","$event"],"mappings":"4hBAYA,MAAMA,EAAQC,EAwBRC,EAAOC,EAUPC,EAAqE,CACzE,QAAS,CAAE,MAAO,EAAA,EAClB,MAAO,CACL,MAAO,mDAAA,EAET,QAAS,CACP,MAAO,+CAAA,EAET,QAAS,CACP,MAAO,+CAAA,EAET,GAAI,CACF,MAAO,mCACP,KAAM,CAAA,EAER,GAAI,CACF,MAAO,oCACP,KAAM,CAAA,CACR,EAIIC,EAASC,EAAAA,SAAS,IAAM,CAC5B,MAAMC,EAAWP,EAAM,WAAa,UAC9BQ,EAASJ,EAAcG,CAAQ,GAAKH,EAAc,QAClDK,EAAa,CAACD,GAAQ,MAAOR,EAAM,KAAK,EAAE,OAAO,OAAO,EAAE,KAAK,GAAG,EAClEU,EAAYV,EAAM,MAAQQ,GAAQ,MAAQ,EAEhD,MAAO,CACL,YAAaR,EAAM,YACnB,SAAUA,EAAM,SAChB,SAAUA,EAAM,SAChB,SAAUA,EAAM,SAChB,KAAMA,EAAM,KACZ,GAAIA,EAAM,GACV,KAAMU,EACN,MAAOD,CAAA,CAEX,CAAC,EAEKE,EAAeC,GAA2B,CAC9C,MAAMC,EAAW,OAAOD,CAAK,EAC7BV,EAAK,oBAAqBW,CAAQ,EAClCX,EAAK,SAAUW,CAAQ,CACzB,8BAIEC,EAAAA,YAMEC,EAAAA,MAAAC,EAAAA,OAAA,EANFC,EAAAA,WAMEZ,EAAA,MALc,CACb,cAAaJ,EAAA,WACb,sBAAoBU,EACpB,QAAKO,EAAA,CAAA,IAAAA,EAAA,CAAA,EAAAC,GAAEjB,EAAI,QAAUiB,CAAM,GAC3B,OAAID,EAAA,CAAA,IAAAA,EAAA,CAAA,EAAAC,GAAEjB,EAAI,OAASiB,CAAM,EAAA"}