{"version":3,"file":"JFormField.vue2.cjs","sources":["../../../../src/components/molecules/JFormField.vue"],"sourcesContent":["<script setup lang=\"ts\">\nimport { computed, ref } from 'vue'\nimport { Field, FieldContent, FieldLabel, FieldError, FieldGroup } from '@/components/shadcn'\nimport { JInput, JTextarea, JCheckbox, JSwitch, JCombo, JRadio, JSearchCombo, JSearchInput, JDatepicker, JEditor, JIcon, JPopover } from '@/components/atoms'\nimport JDateRangeField from '@/components/molecules/JDateRangeField.vue'\nimport JNumberRangeField from '@/components/molecules/JNumberRangeField.vue'\nimport { cn } from '@/lib/utils'\nimport { useBreakpoint } from '@/composables/useBreakpoint'\n\n// 컴포넌트 타입 정의\ntype ComponentType = 'input' | 'textarea' | 'checkbox' | 'switch' | 'combo' | 'radio' | 'searchCombo' | 'searchInput' | 'datepicker' | 'editor' | 'dateRange' | 'numberRange'\n\n// FormField 자체의 props (레이아웃 관련)\nconst FORM_FIELD_PROPS = [\n  'class',\n  'label',\n  'description',\n  'errorMsg',\n  'type',\n  'inlineLabel',\n  'orientation',\n  'labelAlign',\n  'labelWidth',\n  'radioDirection',\n  'editorHeight',\n  'fillHeight',\n  'rangeOptions',\n] as const\n\nconst props = withDefaults(\n  defineProps<{\n    // ============ FormField 자체 props (레이아웃만) ============\n    /** 추가 클래스 (외부 커스터마이징용) */\n    class?: string\n    /** 필드 레이블 */\n    label?: string\n    /** 필드 설명 (레이블 아래 표시) */\n    description?: string\n    /** 에러 메시지 */\n    errorMsg?: string\n    /** 컴포넌트 타입 (렌더링할 컴포넌트 지정) */\n    type?: ComponentType\n    /** 체크박스/스위치 타입일 때만 사용하는 옆 라벨 */\n    inlineLabel?: string\n    /** 레이블과 컨트롤의 배치 방향 */\n    orientation?: 'vertical' | 'horizontal' | 'responsive'\n    /** 레이블 텍스트 정렬 */\n    labelAlign?: 'left' | 'middle' | 'right'\n    /** 레이블 영역 너비 (horizontal orientation일 때만 적용) */\n    labelWidth?: string\n\n    // ============ 내부 컴포넌트로 전달할 공통 props ============\n    /** Input 요소의 id (label for와 연결) */\n    id?: string\n    /** v-model로 양방향 데이터 바인딩 */\n    modelValue?: any\n    /** 입력 전 표시되는 안내문 (Input/Textarea/Select/Combobox) */\n    placeholder?: string\n    /** 비활성화 상태 (전체) */\n    disabled?: boolean\n    /** 읽기 전용 상태 (Input/Textarea) */\n    readonly?: boolean\n    /** 필수 입력/선택 여부 (전체) */\n    required?: boolean\n    /** form 데이터 전송 시 키 이름 (전체) */\n    name?: string\n    /** 스타일 테마 지정 (J-prefixed 컴포넌트의 styleType) */\n    styleType?: string\n\n    // ============ Input 전용 props ============\n    /** Input 타입 (text, email, password 등) */\n    inputType?: string\n\n\n    // ============ Select/Combobox/Radio 전용 props ============\n    /** 선택 가능한 항목 배열 */\n    options?: Array<{ label: string; value: string | number; disabled?: boolean }>\n    \n    // ============ Select/Combobox 전용 props ============\n    /** 다중 선택 허용 여부 */\n    multiple?: boolean\n\n\n    // ============ Radio 전용 props ============\n    /** Radio 옵션 나열 방향 */\n    radioDirection?: 'horizontal' | 'vertical'\n\n    // ============ Switch 전용 props ============\n    /** 상태 라벨 노출 여부 (기본: true) */\n    showStateLabel?: boolean\n    /** 활성(Y) 상태 라벨 텍스트 (기본: '활성') */\n    activeLabel?: string\n    /** 비활성(N) 상태 라벨 텍스트 (기본: '비활성') */\n    inactiveLabel?: string\n\n    // ============ Editor 전용 props ============\n    /** 에디터 높이 (기본값: '300px') */\n    editorHeight?: string | number\n    /** 에디터가 남은 세로 공간을 모두 채우도록 확장 (type='editor'일 때만 적용) */\n    fillHeight?: boolean\n\n    // ============ SearchInput 전용 props ============\n    /** 찾기 버튼 텍스트 (기본: '찾기') */\n    buttonText?: string\n    /** 찾기 버튼만 별도 비활성화 */\n    buttonDisabled?: boolean\n    /** 찾기 버튼에 돋보기 아이콘 표시 (기본: true) */\n    showIcon?: boolean\n\n    // ============ Range 타입 전용 props (dateRange / numberRange) ============\n    /** 범위 입력 옵션 */\n    rangeOptions?: {\n      min?: string | number\n      max?: string | number\n      step?: number\n      suffix?: string\n      separator?: string\n      placeholder?: { start?: string; end?: string }\n    }\n  }>(),\n  {\n    type: 'input',\n    orientation: 'horizontal',\n    labelAlign: 'left',\n    labelWidth: '80px',\n    radioDirection: 'horizontal',\n  }\n)\n\n// 이벤트 정의\nconst emit = defineEmits<{\n  'update:modelValue': [value: any]\n  'change': [value: any]\n  'focus': [event: FocusEvent]\n  'blur': [event: FocusEvent]\n  'save': [value: string]\n  'search': []\n}>()\n\n// description 팝오버 상태\nconst descOpen = ref(false)\nlet descTimer: ReturnType<typeof setTimeout> | null = null\nconst showDesc = () => {\n  if (descTimer) clearTimeout(descTimer)\n  descOpen.value = true\n}\nconst hideDesc = () => {\n  if (descTimer) clearTimeout(descTimer)\n  descTimer = setTimeout(() => { descOpen.value = false }, 100)\n}\n\n// 내부 에러 상태 (props.error가 없을 때만 사용)\nconst internalError = ref<string>('')\n\n// 최종 에러 메시지 (외부 errorMsg가 우선)\nconst finalError = computed(() => props.errorMsg || internalError.value)\n\n// FormField 자체 props와 내부 컴포넌트 props 분리\nconst controlProps = computed(() => {\n  const result: Record<string, any> = {}\n  const propsObj = props as Record<string, any>\n  \n  for (const key in propsObj) {\n    // FormField 자체 props는 제외\n    if (!FORM_FIELD_PROPS.includes(key as any)) {\n      result[key] = propsObj[key]\n    }\n  }\n  \n  // inputType을 type으로 변환 (JInput 컴포넌트에서 사용)\n  if (props.inputType && props.type === 'input') {\n    result.type = props.inputType\n    delete result.inputType // inputType은 제거\n    \n    // placeholder가 없으면 inputType에 따라 기본값 설정\n    if (!props.placeholder) {\n      const defaultPlaceholders: Record<string, string> = {\n        'text': '텍스트를 입력하세요',\n        'email': '이메일을 입력하세요',\n        'password': '비밀번호를 입력하세요',\n        'tel': '전화번호를 입력하세요',\n        'url': 'URL을 입력하세요',\n        'number': '숫자를 입력하세요',\n        'search': '검색어를 입력하세요',\n        'date': '날짜를 선택하세요',\n        'time': '시간을 선택하세요',\n        'datetime-local': '날짜와 시간을 선택하세요',\n        'month': '월을 선택하세요',\n        'week': '주를 선택하세요',\n      }\n      \n      result.placeholder = defaultPlaceholders[props.inputType] || '입력하세요'\n    }\n  }\n  \n  // radioDirection을 styletype으로 변환 (JRadio 컴포넌트에서 사용)\n  if (props.radioDirection && props.type === 'radio') {\n    result.styletype = props.radioDirection\n    delete result.radioDirection // radioDirection은 제거\n  }\n\n  // editorHeight를 height로 변환 (JEditor 컴포넌트에서 사용)\n  if (props.type === 'editor') {\n    result.height = props.fillHeight ? '100%' : (props.editorHeight ?? '300px')\n    delete result.editorHeight\n    delete result.fillHeight\n  }\n\n  return result\n})\n\n  // Built-in validation\n  const validateField = (currentValue?: any) => {\n    internalError.value = ''\n\n    // 현재 값 또는 props.modelValue 사용\n    const value = currentValue !== undefined ? currentValue : props.modelValue\n\n    // Required 체크\n    if (props.required) {\n      if (props.type === 'checkbox' || props.type === 'switch') {\n        if (value !== 'Y') {\n          internalError.value = '필수 항목입니다.'\n          return\n        }\n      } else if (props.type === 'dateRange') {\n        const v = value as { start: string | null; end: string | null }\n        if (!v?.start || !v?.end) {\n          internalError.value = '시작일과 종료일을 모두 입력해 주세요.'\n          return\n        }\n      } else if (props.type === 'numberRange') {\n        const v = value as { start: number | null; end: number | null }\n        if (v?.start == null || v?.end == null) {\n          internalError.value = '최소값과 최대값을 모두 입력해 주세요.'\n          return\n        }\n      } else {\n        if (value === null || value === undefined || value === '') {\n          internalError.value = '필수 입력 항목입니다.'\n          return\n        }\n      }\n    }\n\n    // Range 순서 검증 (required 여부 무관)\n    if (props.type === 'dateRange') {\n      const v = value as { start: string | null; end: string | null }\n      if (v?.start && v?.end && v.start > v.end) {\n        internalError.value = '시작일은 종료일 이전이어야 합니다.'\n      }\n    } else if (props.type === 'numberRange') {\n      const v = value as { start: number | null; end: number | null }\n      if (v?.start != null && v?.end != null && v.start > v.end) {\n        internalError.value = '최소값은 최대값보다 클 수 없습니다.'\n      }\n    }\n  }\n\n  // 초기 로드 시 validation 실행 (blur 이벤트에서만)\n  const shouldValidateOnMount = computed(() => {\n    // Storybook에서 초기값이 있는 경우 validation 스킵\n    if (props.modelValue !== null && props.modelValue !== undefined && props.modelValue !== '') {\n      return false\n    }\n    return true\n  })\n\n// 이벤트 핸들러\nconst handleUpdateModelValue = (value: any) => {\n  emit('update:modelValue', value)\n  \n  // 값이 변경되면 즉시 validation 실행 (현재 값 전달)\n  validateField(value)\n}\n\nconst handleChange = (value: any) => {\n  emit('change', value)\n  \n  // change 이벤트에서도 validation 실행 (현재 값 전달)\n  validateField(value)\n}\n\nconst handleSave = (value: string) => {\n  emit('save', value)\n}\n\nconst handleSearch = () => {\n  emit('search')\n}\n\nconst handleFocus = (event: FocusEvent) => {\n  emit('focus', event)\n}\n\n  const handleBlur = (event: FocusEvent) => {\n    // blur 시에만 validation 실행 (초기 로드 시에는 실행하지 않음)\n    if (shouldValidateOnMount.value) {\n      validateField()\n    }\n    emit('blur', event)\n  }\n\n// 레이블 정렬 클래스 (레이블 영역 내에서 레이블의 위치 제어)\nconst labelAlignClass = computed(() => {\n  // horizontal일 때는 레이블 영역 내에서 레이블의 위치를 제어\n  const mapHorizontal = { \n    left: 'justify-start',    // 레이블 영역의 왼쪽에 레이블 위치\n    middle: 'justify-center', // 레이블 영역의 가운데에 레이블 위치\n    right: 'justify-end'      // 레이블 영역의 오른쪽에 레이블 위치 (input과 가까이)\n  }\n  // vertical일 때는 텍스트 정렬만 제어\n  const mapVertical = { left: 'text-left', middle: 'text-center', right: 'text-right' }\n  return effectiveOrientation.value === 'horizontal' ? mapHorizontal[props.labelAlign] : mapVertical[props.labelAlign]\n})\n\n/** 행높이 토큰 클래스 매핑 */\nconst densityClass = computed(() => {\n  switch (props.styleType) {\n    case 'md': return 'form-density-md'\n    case 'lg': return 'form-density-lg'\n    default:   return 'form-density-sm'  // 기본값 변경: md → sm (컴팩트 디자인)\n  }\n})\n\n/** 컨트롤 클래스 (datepicker는 최대 너비 제한, radio vertical은 높이 제한 없음) */\nconst controlClass = computed(() => {\n  const baseClass = 'h-[var(--ctl-h)] leading-[var(--ctl-h)]'\n\n  if (props.type === 'datepicker') {\n    return `${baseClass} max-w-xs`\n  }\n\n  // Editor: fillHeight면 h-full, 아니면 높이 제한 없음\n  if (props.type === 'editor') {\n    return props.fillHeight ? 'h-full w-full' : ''\n  }\n\n  // Radio vertical: 고정 높이 제한 없음\n  if (props.type === 'radio' && props.radioDirection === 'vertical') {\n    return ''\n  }\n\n  return baseClass\n})\n\ntype MappedComponentType = Exclude<ComponentType, 'dateRange' | 'numberRange'>\n\n// 컴포넌트 매핑 (dateRange/numberRange는 별도 템플릿 분기에서 직접 렌더)\nconst componentMap: Record<MappedComponentType, any> = {\n  input: JInput,\n  textarea: JTextarea,\n  checkbox: JCheckbox,\n  switch: JSwitch,\n  combo: JCombo,\n  radio: JRadio,\n  searchCombo: JSearchCombo,\n  searchInput: JSearchInput,\n  datepicker: JDatepicker,\n  editor: JEditor,\n}\n\n// type에 따라 렌더링할 컴포넌트 결정 (range 타입은 별도 분기)\nconst resolvedComponent = computed(() => {\n  return componentMap[props.type as MappedComponentType] || JInput\n})\n\n/** fillHeight + editor 조합 여부 */\nconst fillHeightEditor = computed(() => props.fillHeight && props.type === 'editor')\n\n/** responsive orientation: 모바일에서 vertical, 데스크톱에서 horizontal */\nconst { isDesktop } = useBreakpoint()\nconst effectiveOrientation = computed(() => {\n  if (props.orientation === 'responsive') {\n    return isDesktop.value ? 'horizontal' : 'vertical'\n  }\n  return props.orientation\n})\n\n// 외부에서 수동으로 에러 클리어 가능하도록 expose\ndefineExpose({\n  clearError: () => { internalError.value = '' }\n})\n</script>\n\n<template>\n  <div :class=\"cn(fillHeightEditor ? 'flex-1 flex flex-col min-h-0' : type === 'editor' ? 'flex-1 min-w-0' : 'space-y-2 flex-1 min-w-0', densityClass, props.class)\">\n    <FieldGroup :class=\"fillHeightEditor ? 'flex-1 flex flex-col min-h-0' : ''\">\n      <Field\n:class=\"[\n          effectiveOrientation === 'horizontal'\n            ? 'grid grid-cols-[var(--label-w,8rem)_1fr] items-start space-y-0 gap-2'\n            : type === 'editor' ? 'space-y-0 gap-0' : 'space-y-1 gap-1',\n          fillHeightEditor ? 'flex-1 min-h-0' : ''\n        ]\"\n        :style=\"effectiveOrientation === 'horizontal' && labelWidth ? `--label-w:${labelWidth};` : ''\"\n      >\n        <!-- 메인 라벨 (필수표기 포함) -->\n        <FieldLabel \n          :for=\"id\" \n          :class=\"[\n            'text-xs font-medium whitespace-nowrap',  // 컴팩트 디자인 + 라벨-값 weight 차별화\n            effectiveOrientation === 'horizontal'\n              ? (type === 'editor' ? 'flex items-start pt-1 w-full' : 'flex items-center h-[var(--ctl-h)] w-full')\n              : 'flex items-center',\n            labelAlignClass\n          ]\"\n        >\n          {{ label }}\n          <span v-if=\"required\" class=\"text-destructive ml-0.5\">*</span>\n          <template v-if=\"description\">\n            <JPopover :open=\"descOpen\" position=\"right\" align=\"start\" :side-offset=\"6\" styletype=\"auto\" @update:open=\"descOpen = $event\">\n              <template #trigger>\n                <button\n                  type=\"button\"\n                  class=\"ml-1 inline-flex items-center shrink-0 text-muted-foreground hover:text-foreground focus:outline-none focus-visible:ring-1 focus-visible:ring-ring rounded\"\n                  @mouseenter=\"showDesc\"\n                  @mouseleave=\"hideDesc\"\n                  @focus=\"showDesc\"\n                  @blur=\"hideDesc\"\n                  @click.stop.prevent=\"descOpen = !descOpen\"\n                >\n                  <JIcon name=\"info\" size=\"xs\" />\n                  <span class=\"sr-only\">설명 보기</span>\n                </button>\n              </template>\n              <div\n                class=\"text-[11px] text-foreground leading-relaxed border-l-2 border-primary pl-2\"\n                @mouseenter=\"showDesc\"\n                @mouseleave=\"hideDesc\"\n              >\n                <slot name=\"description\">{{ description }}</slot>\n              </div>\n            </JPopover>\n            <span class=\"sr-only\">{{ description }}</span>\n          </template>\n        </FieldLabel>\n\n        <FieldContent\n          :class=\"[\n            effectiveOrientation === 'horizontal'\n            ? 'min-h-[var(--ctl-h)] flex flex-col justify-start gap-0.5 mt-0'\n            : 'space-y-2 gap-0',\n            fillHeightEditor ? 'flex-1 flex flex-col min-h-0' : ''\n          ]\"\n        >\n          <!-- 체크박스/스위치: 항상 가로 정렬로 컨트롤 + 인라인 라벨 묶기 -->\n          <FieldGroup v-if=\"type === 'checkbox' || type === 'switch'\" data-slot=\"checkbox-group\">\n            <!-- 부모 orientation과 무관하게 수평 정렬 고정 -->\n            <Field orientation=\"horizontal\" class=\"flex gap-2 space-y-0 h-[var(--ctl-h)] leading-[var(--ctl-h)] items-center\">\n              <component\n                :is=\"resolvedComponent\"\n                v-bind=\"controlProps\"\n                @update:model-value=\"handleUpdateModelValue\"\n                @change=\"handleChange\"\n                @focus=\"handleFocus\"\n                @blur=\"handleBlur\"\n              />\n              <FieldLabel\n                v-if=\"inlineLabel && type === 'checkbox'\"\n                :for=\"id\"\n                class=\"text-xs font-normal m-0 h-[var(--ctl-h)] leading-[var(--ctl-h)]\"\n              >\n                {{ inlineLabel }}\n              </FieldLabel>\n            </Field>\n          </FieldGroup>\n\n          <!-- Radio 버튼: radioDirection에 따라 분기 처리 -->\n          <FieldGroup v-else-if=\"type === 'radio'\">\n            <component\n              :is=\"resolvedComponent\"\n              v-bind=\"controlProps\"\n              :class=\"controlClass\"\n              @update:model-value=\"handleUpdateModelValue\"\n              @change=\"handleChange\"\n              @focus=\"handleFocus\"\n              @blur=\"handleBlur\"\n            />\n          </FieldGroup>\n\n          <!-- Range 타입: JDateRangeField / JNumberRangeField -->\n          <FieldGroup v-else-if=\"type === 'dateRange' || type === 'numberRange'\">\n            <JDateRangeField\n              v-if=\"type === 'dateRange'\"\n              :id=\"id\"\n              :model-value=\"modelValue\"\n              :disabled=\"disabled\"\n              :required=\"required\"\n              :name=\"name\"\n              v-bind=\"(rangeOptions as any)\"\n              @update:model-value=\"handleUpdateModelValue\"\n              @change=\"handleChange\"\n              @focus=\"handleFocus\"\n              @blur=\"handleBlur\"\n            />\n            <JNumberRangeField\n              v-else\n              :id=\"id\"\n              :model-value=\"modelValue\"\n              :disabled=\"disabled\"\n              :required=\"required\"\n              :name=\"name\"\n              v-bind=\"(rangeOptions as any)\"\n              @update:model-value=\"handleUpdateModelValue\"\n              @change=\"handleChange\"\n              @focus=\"handleFocus\"\n              @blur=\"handleBlur\"\n            />\n          </FieldGroup>\n\n          <!-- 그 외 컨트롤: orientation 규칙 그대로 따름 -->\n          <FieldGroup v-else :class=\"fillHeightEditor ? 'flex-1 flex flex-col min-h-0' : ''\">\n            <component\n              :is=\"resolvedComponent\"\n              v-bind=\"controlProps\"\n              :class=\"controlClass\"\n              @update:model-value=\"handleUpdateModelValue\"\n              @change=\"handleChange\"\n              @focus=\"handleFocus\"\n              @blur=\"handleBlur\"\n              @save=\"handleSave\"\n              @search=\"handleSearch\"\n            />\n          </FieldGroup>\n          \n          <!-- 에러: 컨트롤 바로 아래 표시 -->\n          <FieldContent v-if=\"finalError\">\n            <FieldError>\n              {{ finalError }}\n            </FieldError>\n          </FieldContent>\n        </FieldContent>\n      </Field>\n    </FieldGroup>\n  </div>\n</template>\n\n\n\n<style scoped>\n/* 높이 토큰(밀도) — :root의 --j-ctl-h-* 를 참조, 앱에서 override 가능 */\n.form-density-sm { --ctl-h: var(--j-ctl-h-sm, 1.75rem); }\n.form-density-md { --ctl-h: var(--j-ctl-h-md, 2.25rem); }\n.form-density-lg { --ctl-h: var(--j-ctl-h-lg, 2.5rem);  }\n</style>\n"],"names":["FORM_FIELD_PROPS","props","__props","emit","__emit","descOpen","ref","descTimer","showDesc","hideDesc","internalError","finalError","computed","controlProps","result","propsObj","key","defaultPlaceholders","validateField","currentValue","value","v","shouldValidateOnMount","handleUpdateModelValue","handleChange","handleSave","handleSearch","handleFocus","event","handleBlur","labelAlignClass","mapHorizontal","mapVertical","effectiveOrientation","densityClass","controlClass","baseClass","componentMap","JInput","JTextarea","JCheckbox","JSwitch","JCombo","JRadio","JSearchCombo","JSearchInput","JDatepicker","JEditor","resolvedComponent","fillHeightEditor","isDesktop","useBreakpoint","__expose","_createElementBlock","_normalizeClass","_unref","cn","_createVNode","FieldGroup","Field","_normalizeStyle","FieldLabel","_createTextVNode","_toDisplayString","_hoisted_1","_Fragment","JPopover","_cache","$event","_createElementVNode","_withModifiers","JIcon","_renderSlot","_ctx","_hoisted_2","FieldContent","_createBlock","_openBlock","_resolveDynamicComponent","_mergeProps","JDateRangeField","JNumberRangeField","FieldError"],"mappings":"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"}