{"version":3,"file":"JButton.vue2.cjs","sources":["../../../../src/components/atoms/JButton.vue"],"sourcesContent":["<script setup lang=\"ts\">\nimport { computed } from 'vue'\nimport { Loader2 } from 'lucide-vue-next'\nimport { Button, type ButtonVariants } from '@/components/shadcn'\n\ntype StyleType =\n  | 'default'      // 기본 스타일 (primary)\n  | 'primary'      // 강조 버튼 (파랑)\n  | 'secondary'    // 보조 버튼 (회색)\n  | 'success'      // 성공 버튼 (초록)\n  | 'warning'      // 경고 버튼 (주황)\n  | 'danger'       // 위험 버튼 (빨강)\n  | 'outline'      // 아웃라인 버튼\n  | 'ghost'        // 고스트 버튼\n  | 'link'         // 링크 스타일\n  | 'sm'           // 작은 크기\n  | 'lg'           // 큰 크기\n  | 'icon'         // 아이콘 전용\n\nconst props = withDefaults(\n  defineProps<{\n    /** 버튼 타입 */\n    type?: 'button' | 'submit' | 'reset'\n    /** 비활성화 상태 */\n    disabled?: boolean\n    /** 로딩 상태 */\n    loading?: boolean\n    /** shadcn variant */\n    variant?: ButtonVariants['variant']\n    /** shadcn size */\n    size?: ButtonVariants['size']\n    /** 추가 CSS 클래스 */\n    class?: string\n    /** 스타일 프리셋 (variant + size 조합) */\n    styletype?: StyleType\n  }>(),\n  {\n    type: 'button',\n    disabled: false,\n    loading: false,\n    styletype: 'default',\n  },\n)\n\nconst emit = defineEmits<{\n  click: [event: MouseEvent]\n}>()\n\n/**\n * styletype -> variant/size 매핑\n */\nconst STYLE_PRESETS: Record<StyleType, { variant: ButtonVariants['variant']; size?: ButtonVariants['size']; class?: string }> = {\n  default: { \n    variant: 'default',\n  },\n  primary: { \n    variant: 'default',\n  },\n  secondary: { \n    variant: 'secondary',\n  },\n  success: { \n    variant: 'default',\n    class: 'bg-green-600 hover:bg-green-700',\n  },\n  warning: { \n    variant: 'default',\n    class: 'bg-amber-500 hover:bg-amber-600',\n  },\n  danger: { \n    variant: 'destructive',\n  },\n  outline: { \n    variant: 'outline',\n  },\n  ghost: { \n    variant: 'ghost',\n  },\n  link: { \n    variant: 'link',\n  },\n  sm: { \n    variant: 'default',\n    size: 'sm',\n  },\n  lg: { \n    variant: 'default',\n    size: 'lg',\n  },\n  icon: { \n    variant: 'default',\n    size: 'icon',\n  },\n}\n\nconst preset = computed(() => {\n  const styleKey = props.styletype || 'default'\n  return STYLE_PRESETS[styleKey] ?? STYLE_PRESETS.default\n})\n\nconst finalVariant = computed(() => props.variant || preset.value?.variant)\nconst finalSize = computed(() => props.size || preset.value?.size || 'sm')\nconst finalClass = computed(() => [preset.value?.class, props.class].filter(Boolean).join(' '))\n\nconst isDisabled = computed(() => props.disabled || props.loading)\n\nconst handleClick = (event: MouseEvent) => {\n  if (!isDisabled.value) {\n    emit('click', event)\n  }\n}\n</script>\n\n<template>\n  <Button\n    :type=\"type\"\n    :variant=\"finalVariant\"\n    :size=\"finalSize\"\n    :class=\"finalClass\"\n    :disabled=\"isDisabled\"\n    @click=\"handleClick\"\n  >\n    <Loader2 v-if=\"loading\" class=\"mr-2 h-4 w-4 animate-spin\" />\n    <slot />\n  </Button>\n</template>\n\n<style scoped>\n/* ========================================\n   패턴 10: Button 향상 효과\n   ======================================== */\n:deep(button) {\n  transition: background-color 0.15s ease, border-color 0.15s ease, color 0.15s ease;\n}\n\n:deep(button:not(:disabled):hover) {\n  box-shadow: 0 0 0 0 transparent;\n}\n\n:deep(button:not(:disabled):active) {\n  box-shadow: inset 0 1px 2px rgb(0 0 0 / 0.08);\n}\n</style>\n"],"names":["props","__props","emit","__emit","STYLE_PRESETS","preset","computed","styleKey","finalVariant","finalSize","finalClass","isDisabled","handleClick","event","_createBlock","_unref","Button","Loader2","_renderSlot","_ctx"],"mappings":"kdAmBA,MAAMA,EAAQC,EAyBRC,EAAOC,EAOPC,EAA0H,CAC9H,QAAS,CACP,QAAS,SAAA,EAEX,QAAS,CACP,QAAS,SAAA,EAEX,UAAW,CACT,QAAS,WAAA,EAEX,QAAS,CACP,QAAS,UACT,MAAO,iCAAA,EAET,QAAS,CACP,QAAS,UACT,MAAO,iCAAA,EAET,OAAQ,CACN,QAAS,aAAA,EAEX,QAAS,CACP,QAAS,SAAA,EAEX,MAAO,CACL,QAAS,OAAA,EAEX,KAAM,CACJ,QAAS,MAAA,EAEX,GAAI,CACF,QAAS,UACT,KAAM,IAAA,EAER,GAAI,CACF,QAAS,UACT,KAAM,IAAA,EAER,KAAM,CACJ,QAAS,UACT,KAAM,MAAA,CACR,EAGIC,EAASC,EAAAA,SAAS,IAAM,CAC5B,MAAMC,EAAWP,EAAM,WAAa,UACpC,OAAOI,EAAcG,CAAQ,GAAKH,EAAc,OAClD,CAAC,EAEKI,EAAeF,EAAAA,SAAS,IAAMN,EAAM,SAAWK,EAAO,OAAO,OAAO,EACpEI,EAAYH,EAAAA,SAAS,IAAMN,EAAM,MAAQK,EAAO,OAAO,MAAQ,IAAI,EACnEK,EAAaJ,EAAAA,SAAS,IAAM,CAACD,EAAO,OAAO,MAAOL,EAAM,KAAK,EAAE,OAAO,OAAO,EAAE,KAAK,GAAG,CAAC,EAExFW,EAAaL,EAAAA,SAAS,IAAMN,EAAM,UAAYA,EAAM,OAAO,EAE3DY,EAAeC,GAAsB,CACpCF,EAAW,OACdT,EAAK,QAASW,CAAK,CAEvB,8BAIEC,EAAAA,YAUSC,EAAAA,MAAAC,EAAAA,OAAA,EAAA,CATN,KAAMf,EAAA,KACN,QAASO,EAAA,MACT,KAAMC,EAAA,MACN,uBAAOC,EAAA,KAAU,EACjB,SAAUC,EAAA,MACV,QAAOC,CAAA,qBAER,IAA4D,CAA7CX,EAAA,uBAAfa,EAAAA,YAA4DC,EAAAA,MAAAE,EAAAA,OAAA,EAAA,OAApC,MAAM,2BAAA,gCAC9BC,EAAAA,WAAQC,EAAA,OAAA,UAAA,CAAA,EAAA,OAAA,EAAA,CAAA"}