{"version":3,"file":"JSwitch.vue.cjs","sources":["../../../../src/components/atoms/JSwitch.vue"],"sourcesContent":["<script setup lang=\"ts\">\nimport { computed, ref, watch } from 'vue'\nimport { Switch } from '@/components/shadcn'\n\ntype StyleType =\n  | 'default'   // 기본 스타일\n  | 'primary'   // 강조 스타일 (파랑)\n  | 'success'   // 성공 스타일 (초록)\n  | 'danger'    // 위험 스타일 (빨강)\n  | 'sm'        // 작은 크기\n  | 'lg'        // 큰 크기\n\nconst props = withDefaults(\n  defineProps<{\n    modelValue?: string\n    disabled?: boolean\n    name?: string\n    id?: string\n    class?: string\n    /** 스타일 프리셋 */\n    styletype?: StyleType\n    /** 상태 라벨 노출 여부 */\n    showStateLabel?: boolean\n    /** 활성(Y) 상태 라벨 */\n    activeLabel?: string\n    /** 비활성(N) 상태 라벨 */\n    inactiveLabel?: string\n  }>(),\n  {\n    modelValue: 'N',\n    disabled: false,\n    styletype: 'default',\n    showStateLabel: true,\n    activeLabel: '활성',\n    inactiveLabel: '비활성',\n  },\n)\n\nconst emit = defineEmits<{\n  'update:modelValue': [value: string]\n  'change': [value: string]\n}>()\n\n/**\n * styletype -> class 매핑\n */\nconst UNCHECKED_BASE = [\n  'data-[state=unchecked]:bg-secondary',\n  'data-[state=unchecked]:border data-[state=unchecked]:border-border/60',\n  'data-[state=unchecked]:hover:bg-secondary/80',\n].join(' ')\n\nconst STYLE_PRESETS: Record<StyleType, { class: string }> = {\n  default: { class: UNCHECKED_BASE },\n  primary: {\n    class: `${UNCHECKED_BASE} data-[state=checked]:bg-blue-500`,\n  },\n  success: {\n    class: `${UNCHECKED_BASE} data-[state=checked]:bg-green-600`,\n  },\n  danger: {\n    class: `${UNCHECKED_BASE} data-[state=checked]:bg-destructive`,\n  },\n  sm: {\n    class: `${UNCHECKED_BASE} h-5 w-9`,\n  },\n  lg: {\n    class: `${UNCHECKED_BASE} h-7 w-14`,\n  },\n}\n\n/** 최종 바인딩 */\nconst computedClass = computed(() => {\n  const styleKey = props.styletype || 'default'\n  const preset = STYLE_PRESETS[styleKey] ?? STYLE_PRESETS.default\n  // disabled:opacity-100: shadcn Switch 내부의 disabled:opacity-50을 중화 — wrapper span에서 통합 관리\n  return [preset?.class, props.class, 'disabled:opacity-100'].filter(Boolean).join(' ')\n})\n\n// 내부 상태로 boolean checked 관리\nconst internalChecked = ref<boolean>(props.modelValue === 'Y')\n\n// modelValue 변경 감지하여 내부 상태 동기화\nwatch(\n  () => props.modelValue,\n  (newValue) => {\n    const shouldBeChecked = newValue === 'Y'\n    if (internalChecked.value !== shouldBeChecked) {\n      internalChecked.value = shouldBeChecked\n    }\n  },\n  { immediate: true }\n)\n\n// 내부 상태 변경 시 modelValue로 emit\nwatch(internalChecked, (newChecked) => {\n  const value = newChecked ? 'Y' : 'N'\n  if (value !== props.modelValue) {\n    emit('update:modelValue', value)\n    emit('change', value)\n  }\n})\n</script>\n\n<template>\n  <span\n    class=\"inline-flex items-center gap-2\"\n    :class=\"{ 'opacity-50': props.disabled }\"\n  >\n    <Switch\n      :id=\"props.id\"\n      v-model=\"internalChecked\"\n      :disabled=\"props.disabled\"\n      :name=\"props.name\"\n      :class=\"computedClass\"\n    />\n    <span\n      v-if=\"props.showStateLabel\"\n      class=\"text-xs select-none transition-colors\"\n      :class=\"internalChecked ? 'text-primary font-medium' : 'text-muted-foreground'\"\n    >\n      {{ internalChecked ? props.activeLabel : props.inactiveLabel }}\n    </span>\n  </span>\n</template>\n"],"names":["props","__props","emit","__emit","UNCHECKED_BASE","STYLE_PRESETS","computedClass","computed","styleKey","internalChecked","ref","watch","newValue","shouldBeChecked","newChecked","value","_createElementBlock","_normalizeClass","_createVNode","_unref","Switch","$event","_toDisplayString"],"mappings":"sgBAYA,MAAMA,EAAQC,EA0BRC,EAAOC,EAQPC,EAAiB,CACrB,sCACA,wEACA,8CAAA,EACA,KAAK,GAAG,EAEJC,EAAsD,CAC1D,QAAS,CAAE,MAAOD,CAAA,EAClB,QAAS,CACP,MAAO,GAAGA,CAAc,mCAAA,EAE1B,QAAS,CACP,MAAO,GAAGA,CAAc,oCAAA,EAE1B,OAAQ,CACN,MAAO,GAAGA,CAAc,sCAAA,EAE1B,GAAI,CACF,MAAO,GAAGA,CAAc,UAAA,EAE1B,GAAI,CACF,MAAO,GAAGA,CAAc,WAAA,CAC1B,EAIIE,EAAgBC,EAAAA,SAAS,IAAM,CACnC,MAAMC,EAAWR,EAAM,WAAa,UAGpC,MAAO,EAFQK,EAAcG,CAAQ,GAAKH,EAAc,UAExC,MAAOL,EAAM,MAAO,sBAAsB,EAAE,OAAO,OAAO,EAAE,KAAK,GAAG,CACtF,CAAC,EAGKS,EAAkBC,EAAAA,IAAaV,EAAM,aAAe,GAAG,EAG7DW,OAAAA,EAAAA,MACE,IAAMX,EAAM,WACXY,GAAa,CACZ,MAAMC,EAAkBD,IAAa,IACjCH,EAAgB,QAAUI,IAC5BJ,EAAgB,MAAQI,EAE5B,EACA,CAAE,UAAW,EAAA,CAAK,EAIpBF,QAAMF,EAAkBK,GAAe,CACrC,MAAMC,EAAQD,EAAa,IAAM,IAC7BC,IAAUf,EAAM,aAClBE,EAAK,oBAAqBa,CAAK,EAC/Bb,EAAK,SAAUa,CAAK,EAExB,CAAC,wBAICC,EAAAA,mBAkBO,OAAA,CAjBL,MAAKC,EAAAA,eAAA,CAAC,iCAAgC,CAAA,aACdjB,EAAM,SAAQ,CAAA,CAAA,GAEtCkB,cAMEC,EAAAA,MAAAC,EAAAA,OAAA,EAAA,CALC,GAAIpB,EAAM,cACFS,EAAA,2CAAAA,EAAe,MAAAY,GACvB,SAAUrB,EAAM,SAChB,KAAMA,EAAM,KACZ,uBAAOM,EAAA,KAAa,CAAA,wDAGfN,EAAM,8BADdgB,EAAAA,mBAMO,OAAA,OAJL,MAAKC,EAAAA,eAAA,CAAC,wCACER,EAAA,MAAe,2BAAA,uBAAA,CAAA,CAAA,EAEpBa,kBAAAb,EAAA,MAAkBT,EAAM,YAAcA,EAAM,aAAa,EAAA,CAAA"}