{"version":3,"file":"JButtonGroup.vue.cjs","sources":["../../../../src/components/molecules/JButtonGroup.vue"],"sourcesContent":["<script setup lang=\"ts\">\nimport { h, useSlots, computed, cloneVNode, type VNode } from 'vue'\nimport type { ButtonGroupVariants } from '@/components/shadcn/button-group-variants'\nimport { ButtonGroup, ButtonGroupSeparator } from '@/components/shadcn'\n\n// -------------------------\n// props 및 기본값 선언\nconst props = withDefaults(\n  defineProps<{\n    orientation?: ButtonGroupVariants['orientation']  // 수평/수직\n    showButtonSeparators?: boolean         // 버튼 사이 separator 표시 여부 (기본값: true)\n  }>(),\n  {\n    orientation: 'horizontal',\n    showButtonSeparators: true\n  }\n)\n\n// useSlots로 하위 슬롯 노드 접근\nconst slots = useSlots()\n\n// 버튼 사이 separator 표시 여부\nconst shouldShowButtonSeparators = computed(() => props.showButtonSeparators)\n\n// 버튼의 styletype이 outline인지 확인\nconst isButtonOutline = (child: any): boolean => {\n  if (!child || typeof child !== 'object') return false\n  \n  // props에서 styletype 확인\n  const styletype = child.props?.styletype || child.props?.['styletype']\n  return styletype === 'outline'\n}\n\n// slot으로 받은 버튼 리스트에 버튼 사이마다 separator를 자동 삽입\n// outline 버튼의 양옆에는 구분선을 넣지 않음 (outline은 자체 경계가 있어 구분선이 중복됨)\n// outline 버튼이 양옆에 구분선이 없을 때는 왼쪽 border를 복원해야 함\nconst slotWithSeparators = computed(() => {\n  const children = slots.default?.() || []\n  if (!shouldShowButtonSeparators.value) return children\n  \n  const result: VNode[] = []\n  children.forEach((child: VNode, idx: number) => {\n    if (idx > 0) {\n      // 이전 버튼과 현재 버튼 확인\n      const prevChild = children[idx - 1]\n      const isPrevOutline = isButtonOutline(prevChild)\n      const isCurrentOutline = isButtonOutline(child)\n      \n      // outline 버튼이 포함되지 않을 때만 구분선 추가\n      // (outline 버튼은 자체 경계가 있어 양옆에 구분선이 필요 없음)\n      if (!(isPrevOutline || isCurrentOutline)) {\n        result.push(h(ButtonGroupSeparator, {\n          orientation: props.orientation === 'vertical' ? 'horizontal' : 'vertical'\n        }))\n      }\n    }\n    \n    // outline 버튼이 양옆에 구분선이 없을 때 왼쪽 border 복원\n    let childToAdd = child\n    if (isButtonOutline(child)) {\n      const prevChild = idx > 0 ? children[idx - 1] : null\n      const isPrevOutline = prevChild ? isButtonOutline(prevChild) : false\n      \n      // 이전 버튼이 outline이 아니고 (구분선이 없음), 현재 버튼이 첫 번째가 아니면 왼쪽 border 복원\n      if (!isPrevOutline && idx > 0) {\n        // VNode를 복제하면서 class 추가\n        const existingClass = child.props?.class || child.props?.['class'] || ''\n        let newClass: string | Array<string | object> | object\n        \n        if (typeof existingClass === 'string') {\n          // 문자열인 경우: 공백으로 구분하여 추가\n          newClass = `${existingClass} !border-l`\n        } else if (Array.isArray(existingClass)) {\n          // 배열인 경우: 새 클래스를 배열에 추가\n          newClass = [...existingClass, '!border-l']\n        } else if (existingClass && typeof existingClass === 'object') {\n          // 객체인 경우: 객체에 border-l 클래스 추가\n          newClass = { ...existingClass, '!border-l': true }\n        } else {\n          // 기타 경우: 배열로 변환\n          newClass = [existingClass, '!border-l'].filter(Boolean)\n        }\n        \n        // cloneVNode를 사용하여 VNode를 복제하고 props 수정\n        childToAdd = cloneVNode(child, {\n          ...child.props,\n          class: newClass\n        })\n      }\n    }\n    \n    result.push(childToAdd)\n  })\n  return result\n})\n</script>\n\n<template>\n  <!-- 바깥 ButtonGroup: 버튼 모음 내부 그룹을 수직/수평으로 감쌈 -->\n  <ButtonGroup :orientation=\"props.orientation ?? 'horizontal'\">\n    <!-- 내부 ButtonGroup: 버튼들 렌더 + 필요시 버튼 사이 separator 자동 삽입 -->\n    <ButtonGroup :orientation=\"props.orientation ?? 'horizontal'\">\n      <template v-if=\"shouldShowButtonSeparators\">\n        <template v-for=\"(vnode, _idx) in slotWithSeparators\" :key=\"_idx\">\n          <component :is=\"vnode\" />\n        </template>\n      </template>\n      <slot v-else />\n    </ButtonGroup>\n  </ButtonGroup>\n</template>\n\n\n"],"names":["props","__props","slots","useSlots","shouldShowButtonSeparators","computed","isButtonOutline","child","slotWithSeparators","children","result","idx","prevChild","isPrevOutline","isCurrentOutline","h","ButtonGroupSeparator","childToAdd","existingClass","newClass","cloneVNode","_createBlock","_unref","ButtonGroup","_createVNode","_openBlock","_createElementBlock","_Fragment","_renderList","vnode","_idx","_resolveDynamicComponent","_renderSlot","_ctx"],"mappings":"qZAOA,MAAMA,EAAQC,EAYRC,EAAQC,EAAAA,SAAA,EAGRC,EAA6BC,EAAAA,SAAS,IAAML,EAAM,oBAAoB,EAGtEM,EAAmBC,GACnB,CAACA,GAAS,OAAOA,GAAU,SAAiB,IAG9BA,EAAM,OAAO,WAAaA,EAAM,OAAQ,aACrC,UAMjBC,EAAqBH,EAAAA,SAAS,IAAM,CACxC,MAAMI,EAAWP,EAAM,UAAA,GAAe,CAAA,EACtC,GAAI,CAACE,EAA2B,MAAO,OAAOK,EAE9C,MAAMC,EAAkB,CAAA,EACxB,OAAAD,EAAS,QAAQ,CAACF,EAAcI,IAAgB,CAC9C,GAAIA,EAAM,EAAG,CAEX,MAAMC,EAAYH,EAASE,EAAM,CAAC,EAC5BE,EAAgBP,EAAgBM,CAAS,EACzCE,EAAmBR,EAAgBC,CAAK,EAIxCM,GAAiBC,GACrBJ,EAAO,KAAKK,EAAAA,EAAEC,UAAsB,CAClC,YAAahB,EAAM,cAAgB,WAAa,aAAe,UAAA,CAChE,CAAC,CAEN,CAGA,IAAIiB,EAAaV,EACjB,GAAID,EAAgBC,CAAK,EAAG,CAC1B,MAAMK,EAAYD,EAAM,EAAIF,EAASE,EAAM,CAAC,EAAI,KAIhD,GAAI,EAHkBC,EAAYN,EAAgBM,CAAS,EAAI,KAGzCD,EAAM,EAAG,CAE7B,MAAMO,EAAgBX,EAAM,OAAO,OAASA,EAAM,OAAQ,OAAY,GACtE,IAAIY,EAEA,OAAOD,GAAkB,SAE3BC,EAAW,GAAGD,CAAa,aAClB,MAAM,QAAQA,CAAa,EAEpCC,EAAW,CAAC,GAAGD,EAAe,WAAW,EAChCA,GAAiB,OAAOA,GAAkB,SAEnDC,EAAW,CAAE,GAAGD,EAAe,YAAa,EAAA,EAG5CC,EAAW,CAACD,EAAe,WAAW,EAAE,OAAO,OAAO,EAIxDD,EAAaG,EAAAA,WAAWb,EAAO,CAC7B,GAAGA,EAAM,MACT,MAAOY,CAAA,CACR,CACH,CACF,CAEAT,EAAO,KAAKO,CAAU,CACxB,CAAC,EACMP,CACT,CAAC,8BAKCW,EAAAA,YAUcC,EAAAA,MAAAC,EAAAA,OAAA,EAAA,CAVA,YAAavB,EAAM,aAAW,YAAA,qBAE1C,IAOc,CAPdwB,cAOcF,EAAAA,MAAAC,EAAAA,OAAA,EAAA,CAPA,YAAavB,EAAM,aAAW,YAAA,qBAC1C,IAIW,CAJKI,EAAA,OACdqB,EAAAA,UAAA,EAAA,EAAAC,EAAAA,mBAEWC,EAAAA,SAAA,CAAA,IAAA,CAAA,EAAAC,EAAAA,WAFuBpB,EAAA,MAAkB,CAAlCqB,EAAOC,mBACvBT,EAAAA,YAAyBU,EAAAA,wBAATF,CAAK,EAAA,CAAA,IADqCC,EAAI,UAIlEE,aAAeC,EAAA,OAAA,UAAA,CAAA,IAAA,CAAA,CAAA,CAAA"}