{"version":3,"file":"JDrawer.vue2.cjs","sources":["../../../../src/components/organisms/JDrawer.vue"],"sourcesContent":["<template>\n  <Sheet :open=\"open\" @update:open=\"onOpenChange\">\n    <SheetContent\n      :side=\"side\"\n      :show-close=\"showClose\"\n      :class=\"cn(sizeClass, 'p-0', isResizing && 'select-none')\"\n      @escape-key-down=\"onEscapeKeyDown\"\n      @pointer-down-outside=\"onPointerDownOutside\"\n    >\n      <div\n        v-if=\"resizable\"\n        ref=\"handleRef\"\n        class=\"jdrawer-resize-handle\"\n        :class=\"handlePositionClass\"\n        @pointerdown=\"onHandlePointerDown\"\n      />\n\n      <slot name=\"header\">\n        <SheetHeader v-if=\"title || description || $slots['title-suffix'] || $slots.description\">\n          <SheetTitle v-if=\"title\" class=\"flex items-center gap-2\">\n            <span>{{ title }}</span>\n            <slot name=\"title-suffix\" />\n          </SheetTitle>\n          <SheetDescription v-if=\"description || $slots.description\">\n            <slot name=\"description\">{{ description }}</slot>\n          </SheetDescription>\n        </SheetHeader>\n      </slot>\n\n      <div class=\"flex-1 overflow-auto px-6 py-4\">\n        <slot />\n      </div>\n\n      <slot name=\"footer\">\n        <SheetFooter v-if=\"showFooter\" :class=\"$slots['footer-extra'] ? 'justify-between' : ''\">\n          <slot name=\"footer-extra\" />\n          <div class=\"flex gap-2\">\n            <JButton\n              v-if=\"buttonType === 'OkCancel'\"\n              variant=\"outline\"\n              size=\"sm\"\n              @click=\"handleCancel\"\n            >\n              {{ cancelText }}\n            </JButton>\n            <JButton\n              :variant=\"confirmVariant\"\n              :disabled=\"confirmDisabled\"\n              size=\"sm\"\n              @click=\"handleConfirm\"\n            >\n              {{ confirmText }}\n            </JButton>\n          </div>\n        </SheetFooter>\n      </slot>\n    </SheetContent>\n  </Sheet>\n</template>\n\n<script setup lang=\"ts\">\nimport { computed, nextTick, onUnmounted, ref, watch } from 'vue'\nimport {\n  Sheet,\n  SheetContent,\n  SheetDescription,\n  SheetFooter,\n  SheetHeader,\n  SheetTitle,\n} from '@/components/shadcn'\nimport type { ButtonVariants, SheetSide } from '@/components/shadcn'\nimport { JButton } from '@/components/atoms'\nimport { cn } from '@/lib/utils'\n\nexport interface JDrawerProps {\n  open: boolean\n  side?: SheetSide\n  size?: 'sm' | 'md' | 'lg' | 'full'\n  title?: string\n  description?: string\n  showClose?: boolean\n  showFooter?: boolean\n  buttonType?: 'Ok' | 'OkCancel'\n  confirmText?: string\n  cancelText?: string\n  confirmVariant?: ButtonVariants['variant']\n  confirmDisabled?: boolean\n  closeOnOverlayClick?: boolean\n  closeOnEscape?: boolean\n  resizable?: boolean\n  minSize?: number\n  maxSize?: number\n  defaultSize?: number\n}\n\nconst props = withDefaults(defineProps<JDrawerProps>(), {\n  side: 'right',\n  size: 'md',\n  showClose: true,\n  showFooter: false,\n  buttonType: 'OkCancel',\n  confirmText: '확인',\n  cancelText: '취소',\n  confirmVariant: 'default',\n  confirmDisabled: false,\n  closeOnOverlayClick: true,\n  closeOnEscape: true,\n  resizable: true,\n  minSize: 240,\n})\n\nconst emit = defineEmits<{\n  'update:open': [value: boolean]\n  confirm: []\n  cancel: []\n  resize: [size: number]\n  'resize-end': [size: number]\n}>()\n\nconst isHorizontal = computed(() => props.side === 'right' || props.side === 'left')\n\nconst sizeClass = computed(() => {\n  if (isHorizontal.value) {\n    const map: Record<NonNullable<JDrawerProps['size']>, string> = {\n      sm: 'sm:max-w-sm',\n      md: 'sm:max-w-md',\n      lg: 'sm:max-w-lg',\n      full: 'sm:max-w-full',\n    }\n    return map[props.size]\n  } else {\n    const map: Record<NonNullable<JDrawerProps['size']>, string> = {\n      sm: 'max-h-[25vh]',\n      md: 'max-h-[50vh]',\n      lg: 'max-h-[75vh]',\n      full: 'max-h-full',\n    }\n    return map[props.size]\n  }\n})\n\n// ── 리사이즈 상태 ──────────────────────────────────────────────────────────\nconst handleRef = ref<HTMLElement | null>(null)\nconst currentSize = ref<number | null>(null)\nconst isResizing = ref(false)\n\nfunction getPanel(): HTMLElement | null {\n  return handleRef.value?.parentElement ?? null\n}\n\nfunction applySizeToPanel(size: number) {\n  const panel = getPanel()\n  if (!panel) return\n  if (isHorizontal.value) {\n    panel.style.width = `${size}px`\n    panel.style.maxWidth = 'none'\n  } else {\n    panel.style.height = `${size}px`\n    panel.style.maxHeight = 'none'\n  }\n}\n\n// defaultSize 보관\nwatch(\n  () => props.defaultSize,\n  (val) => {\n    if (props.resizable && val != null && currentSize.value == null) {\n      currentSize.value = val\n    }\n  },\n  { immediate: true },\n)\n\n// 재오픈 시 마지막 크기 복원\nwatch(\n  () => props.open,\n  async (isOpen) => {\n    if (!isOpen || !props.resizable) return\n    await nextTick()\n    const restore = currentSize.value ?? props.defaultSize\n    if (restore != null) applySizeToPanel(restore)\n  },\n  { immediate: true },\n)\n\nconst handlePositionClass = computed(() => {\n  switch (props.side) {\n    case 'right':\n      return 'left-0 top-0 h-full w-2 cursor-ew-resize'\n    case 'left':\n      return 'right-0 top-0 h-full w-2 cursor-ew-resize'\n    case 'top':\n      return 'bottom-0 left-0 w-full h-2 cursor-ns-resize'\n    case 'bottom':\n      return 'top-0 left-0 w-full h-2 cursor-ns-resize'\n    default:\n      return 'left-0 top-0 h-full w-2 cursor-ew-resize'\n  }\n})\n\nfunction resolvedMax() {\n  if (props.maxSize != null) return props.maxSize\n  return isHorizontal.value\n    ? Math.floor(window.innerWidth * 0.95)\n    : Math.floor(window.innerHeight * 0.95)\n}\n\nfunction clamp(value: number, min: number, max: number) {\n  return Math.min(Math.max(value, min), max)\n}\n\nfunction measureCurrentSize(): number {\n  const panel = handleRef.value?.parentElement\n  if (!panel) return isHorizontal.value ? 448 : Math.floor(window.innerHeight * 0.5)\n  const rect = panel.getBoundingClientRect()\n  return isHorizontal.value ? rect.width : rect.height\n}\n\nlet startPos = 0\nlet startSize = 0\n\nfunction onPointerMove(e: PointerEvent) {\n  const pos = isHorizontal.value ? e.clientX : e.clientY\n  const delta = pos - startPos\n  // right/bottom 방향: 안쪽으로 끌면 크기 증가이므로 delta 부호 반전\n  const sign = props.side === 'right' || props.side === 'bottom' ? -1 : 1\n  const next = clamp(startSize + sign * delta, props.minSize, resolvedMax())\n  currentSize.value = next\n  applySizeToPanel(next)\n  emit('resize', next)\n}\n\nfunction onPointerUp() {\n  isResizing.value = false\n  window.removeEventListener('pointermove', onPointerMove)\n  if (currentSize.value != null) emit('resize-end', currentSize.value)\n}\n\nfunction onHandlePointerDown(e: PointerEvent) {\n  ;(e.currentTarget as HTMLElement).setPointerCapture(e.pointerId)\n  isResizing.value = true\n  startPos = isHorizontal.value ? e.clientX : e.clientY\n  startSize = currentSize.value ?? measureCurrentSize()\n  window.addEventListener('pointermove', onPointerMove)\n  window.addEventListener('pointerup', onPointerUp, { once: true })\n}\n\nonUnmounted(() => {\n  window.removeEventListener('pointermove', onPointerMove)\n  window.removeEventListener('pointerup', onPointerUp)\n})\n\n// ── 기존 핸들러 ────────────────────────────────────────────────────────────\nconst onOpenChange = (value: boolean) => {\n  emit('update:open', value)\n}\n\nconst onEscapeKeyDown = (event: Event) => {\n  if (!props.closeOnEscape) event.preventDefault()\n}\n\nconst onPointerDownOutside = (event: Event) => {\n  if (!props.closeOnOverlayClick) event.preventDefault()\n}\n\nconst handleConfirm = () => {\n  emit('confirm')\n}\n\nconst handleCancel = () => {\n  emit('cancel')\n  emit('update:open', false)\n}\n</script>\n\n<style scoped>\n.jdrawer-resize-handle {\n  position: absolute;\n  z-index: 10;\n  background: transparent;\n  transition: background 0.15s ease;\n}\n\n.jdrawer-resize-handle::after {\n  content: '';\n  position: absolute;\n  background: hsl(var(--border));\n  transition:\n    background 0.15s ease,\n    width 0.12s ease,\n    height 0.12s ease;\n}\n\n/* 가로 핸들(left/right side): 세로 선 */\n.jdrawer-resize-handle.cursor-ew-resize::after {\n  top: 0;\n  bottom: 0;\n  width: 1px;\n  left: 50%;\n  transform: translateX(-50%);\n}\n\n/* 세로 핸들(top/bottom side): 가로 선 */\n.jdrawer-resize-handle.cursor-ns-resize::after {\n  left: 0;\n  right: 0;\n  height: 1px;\n  top: 50%;\n  transform: translateY(-50%);\n}\n\n/* 그립 도트 인디케이터 */\n.jdrawer-resize-handle::before {\n  content: '';\n  position: absolute;\n  top: 50%;\n  left: 50%;\n  transform: translate(-50%, -50%);\n  width: 3px;\n  height: 20px;\n  background-image: radial-gradient(\n    circle,\n    hsl(var(--muted-foreground) / 0.5) 1px,\n    transparent 1px\n  );\n  background-size: 3px 6px;\n  background-repeat: repeat-y;\n  border-radius: 2px;\n  opacity: 0.5;\n  transition: opacity 0.15s ease;\n  pointer-events: none;\n  z-index: 11;\n}\n\n.jdrawer-resize-handle.cursor-ns-resize::before {\n  width: 20px;\n  height: 3px;\n  background-size: 6px 3px;\n  background-repeat: repeat-x;\n  background-image: radial-gradient(\n    circle,\n    hsl(var(--muted-foreground) / 0.5) 1px,\n    transparent 1px\n  );\n}\n\n/* hover */\n.jdrawer-resize-handle:hover {\n  background: hsl(var(--primary) / 0.04);\n}\n\n.jdrawer-resize-handle:hover::after {\n  background: hsl(var(--primary) / 0.55);\n}\n\n.jdrawer-resize-handle.cursor-ew-resize:hover::after {\n  width: 2px;\n}\n\n.jdrawer-resize-handle.cursor-ns-resize:hover::after {\n  height: 2px;\n}\n\n.jdrawer-resize-handle:hover::before {\n  opacity: 1;\n}\n\n/* active / drag */\n.jdrawer-resize-handle:active {\n  background: hsl(var(--primary) / 0.06);\n}\n\n.jdrawer-resize-handle:active::after {\n  background: hsl(var(--primary));\n}\n\n.jdrawer-resize-handle.cursor-ew-resize:active::after {\n  width: 2px;\n}\n\n.jdrawer-resize-handle.cursor-ns-resize:active::after {\n  height: 2px;\n}\n\n.jdrawer-resize-handle:active::before {\n  opacity: 1;\n  background-image: radial-gradient(circle, hsl(var(--primary) / 0.65) 1px, transparent 1px);\n}\n</style>\n"],"names":["props","__props","emit","__emit","isHorizontal","computed","sizeClass","handleRef","ref","currentSize","isResizing","getPanel","applySizeToPanel","size","panel","watch","val","isOpen","nextTick","restore","handlePositionClass","resolvedMax","clamp","value","min","max","measureCurrentSize","rect","startPos","startSize","onPointerMove","e","delta","sign","next","onPointerUp","onHandlePointerDown","onUnmounted","onOpenChange","onEscapeKeyDown","event","onPointerDownOutside","handleConfirm","handleCancel","_createBlock","_unref","Sheet","_createVNode","SheetContent","_normalizeClass","cn","_createElementBlock","_renderSlot","_ctx","$slots","SheetHeader","SheetTitle","_createElementVNode","SheetDescription","_hoisted_1","SheetFooter","_hoisted_2","JButton"],"mappings":"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"}