@j-solution/components 1.8.0 → 1.9.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (267) hide show
  1. package/README.md +415 -416
  2. package/assets/jwms-portal-frontend-Di6lStzZ.css +1 -0
  3. package/assets/styles/j-components.css +1 -1
  4. package/assets/styles/main.css +29 -29
  5. package/assets/styles/themes.css +422 -422
  6. package/components/atoms/JAvatar.vue.cjs.map +1 -1
  7. package/components/atoms/JAvatar.vue.js.map +1 -1
  8. package/components/atoms/JBadge.vue.cjs.map +1 -1
  9. package/components/atoms/JBadge.vue.js.map +1 -1
  10. package/components/atoms/JButton.vue.cjs +1 -1
  11. package/components/atoms/JButton.vue.js +1 -1
  12. package/components/atoms/JButton.vue2.cjs.map +1 -1
  13. package/components/atoms/JButton.vue2.js.map +1 -1
  14. package/components/atoms/JCombo.vue.cjs.map +1 -1
  15. package/components/atoms/JCombo.vue.js.map +1 -1
  16. package/components/atoms/JDatepicker.vue.cjs.map +1 -1
  17. package/components/atoms/JDatepicker.vue.js.map +1 -1
  18. package/components/atoms/JDivider.vue.cjs.map +1 -1
  19. package/components/atoms/JDivider.vue.js.map +1 -1
  20. package/components/atoms/JEditor.vue.cjs +1 -1
  21. package/components/atoms/JEditor.vue.js +2 -2
  22. package/components/atoms/JEditor.vue2.cjs.map +1 -1
  23. package/components/atoms/JEditor.vue2.js.map +1 -1
  24. package/components/atoms/JGrid.vue.cjs +1 -1
  25. package/components/atoms/JGrid.vue.js +2 -2
  26. package/components/atoms/JGrid.vue2.cjs +1 -1
  27. package/components/atoms/JGrid.vue2.cjs.map +1 -1
  28. package/components/atoms/JGrid.vue2.js +72 -85
  29. package/components/atoms/JGrid.vue2.js.map +1 -1
  30. package/components/atoms/JIcon.vue.cjs.map +1 -1
  31. package/components/atoms/JIcon.vue.js.map +1 -1
  32. package/components/atoms/JImage.vue.cjs.map +1 -1
  33. package/components/atoms/JImage.vue.js.map +1 -1
  34. package/components/atoms/JKbd.vue.cjs.map +1 -1
  35. package/components/atoms/JKbd.vue.js.map +1 -1
  36. package/components/atoms/JLabel.vue.cjs.map +1 -1
  37. package/components/atoms/JLabel.vue.js.map +1 -1
  38. package/components/atoms/JPreview.vue.cjs +1 -1
  39. package/components/atoms/JPreview.vue.js +7 -7
  40. package/components/atoms/JPreview.vue2.cjs.map +1 -1
  41. package/components/atoms/JPreview.vue2.js.map +1 -1
  42. package/components/atoms/JProgress.vue.cjs.map +1 -1
  43. package/components/atoms/JProgress.vue.js.map +1 -1
  44. package/components/atoms/JRadio.vue.cjs.map +1 -1
  45. package/components/atoms/JRadio.vue.js.map +1 -1
  46. package/components/atoms/JSearchCombo.vue.cjs.map +1 -1
  47. package/components/atoms/JSearchCombo.vue.js.map +1 -1
  48. package/components/atoms/JSectionTitle.vue2.cjs +1 -1
  49. package/components/atoms/JSectionTitle.vue2.cjs.map +1 -1
  50. package/components/atoms/JSectionTitle.vue2.js +5 -8
  51. package/components/atoms/JSectionTitle.vue2.js.map +1 -1
  52. package/components/atoms/JSpinner.vue.cjs.map +1 -1
  53. package/components/atoms/JSpinner.vue.js.map +1 -1
  54. package/components/atoms/JToast.vue.cjs.map +1 -1
  55. package/components/atoms/JToast.vue.js.map +1 -1
  56. package/components/atoms/JTooltip.vue.cjs.map +1 -1
  57. package/components/atoms/JTooltip.vue.js.map +1 -1
  58. package/components/molecules/JAlert.vue.cjs +1 -1
  59. package/components/molecules/JAlert.vue.cjs.map +1 -1
  60. package/components/molecules/JAlert.vue.js +2 -5
  61. package/components/molecules/JAlert.vue.js.map +1 -1
  62. package/components/molecules/JBreadcrumb.vue.cjs.map +1 -1
  63. package/components/molecules/JBreadcrumb.vue.js.map +1 -1
  64. package/components/molecules/JEmptyState.vue2.cjs +1 -1
  65. package/components/molecules/JEmptyState.vue2.cjs.map +1 -1
  66. package/components/molecules/JEmptyState.vue2.js +15 -18
  67. package/components/molecules/JEmptyState.vue2.js.map +1 -1
  68. package/components/molecules/JFormField.vue2.cjs +1 -1
  69. package/components/molecules/JFormField.vue2.cjs.map +1 -1
  70. package/components/molecules/JFormField.vue2.js +2 -5
  71. package/components/molecules/JFormField.vue2.js.map +1 -1
  72. package/components/molecules/JTabs.vue.cjs +1 -1
  73. package/components/molecules/JTabs.vue.js +1 -1
  74. package/components/molecules/JTabs.vue2.cjs.map +1 -1
  75. package/components/molecules/JTabs.vue2.js.map +1 -1
  76. package/components/molecules/JTitlebar.vue.cjs +1 -1
  77. package/components/molecules/JTitlebar.vue.cjs.map +1 -1
  78. package/components/molecules/JTitlebar.vue.js +16 -19
  79. package/components/molecules/JTitlebar.vue.js.map +1 -1
  80. package/components/organisms/JDynamicForm.vue2.cjs +1 -1
  81. package/components/organisms/JDynamicForm.vue2.cjs.map +1 -1
  82. package/components/organisms/JDynamicForm.vue2.js +2 -5
  83. package/components/organisms/JDynamicForm.vue2.js.map +1 -1
  84. package/components/organisms/JDynamicTabs.vue.cjs.map +1 -1
  85. package/components/organisms/JDynamicTabs.vue.js.map +1 -1
  86. package/components/organisms/JFilterBar.vue.cjs +1 -1
  87. package/components/organisms/JFilterBar.vue.js +2 -2
  88. package/components/organisms/JFilterBar.vue2.cjs +1 -1
  89. package/components/organisms/JFilterBar.vue2.cjs.map +1 -1
  90. package/components/organisms/JFilterBar.vue2.js +14 -12
  91. package/components/organisms/JFilterBar.vue2.js.map +1 -1
  92. package/components/organisms/JFormModal.vue.cjs +1 -1
  93. package/components/organisms/JFormModal.vue.cjs.map +1 -1
  94. package/components/organisms/JFormModal.vue.js +14 -17
  95. package/components/organisms/JFormModal.vue.js.map +1 -1
  96. package/components/organisms/JModal.vue.cjs +1 -1
  97. package/components/organisms/JModal.vue.cjs.map +1 -1
  98. package/components/organisms/JModal.vue.js +2 -5
  99. package/components/organisms/JModal.vue.js.map +1 -1
  100. package/components/organisms/JPageContainer.vue.cjs.map +1 -1
  101. package/components/organisms/JPageContainer.vue.js.map +1 -1
  102. package/components/organisms/JSearchPanel.vue2.cjs +1 -1
  103. package/components/organisms/JSearchPanel.vue2.cjs.map +1 -1
  104. package/components/organisms/JSearchPanel.vue2.js +20 -23
  105. package/components/organisms/JSearchPanel.vue2.js.map +1 -1
  106. package/components/organisms/JSidebar/JSidebar.vue.cjs +2 -0
  107. package/components/organisms/JSidebar/JSidebar.vue.cjs.map +1 -0
  108. package/components/organisms/JSidebar/JSidebar.vue.js +189 -0
  109. package/components/organisms/JSidebar/JSidebar.vue.js.map +1 -0
  110. package/components/organisms/JSidebar/JSidebar.vue2.cjs +2 -0
  111. package/components/organisms/JSidebar/JSidebar.vue2.cjs.map +1 -0
  112. package/components/organisms/JSidebar/JSidebar.vue2.js +5 -0
  113. package/components/organisms/JSidebar/JSidebar.vue2.js.map +1 -0
  114. package/components/organisms/JSidebar/JSidebarGroup.vue.cjs +2 -0
  115. package/components/organisms/JSidebar/JSidebarGroup.vue.cjs.map +1 -0
  116. package/components/organisms/JSidebar/JSidebarGroup.vue.js +89 -0
  117. package/components/organisms/JSidebar/JSidebarGroup.vue.js.map +1 -0
  118. package/components/organisms/JSidebar/JSidebarGroup.vue2.cjs +2 -0
  119. package/components/organisms/JSidebar/JSidebarGroup.vue2.cjs.map +1 -0
  120. package/components/organisms/JSidebar/JSidebarGroup.vue2.js +5 -0
  121. package/components/organisms/JSidebar/JSidebarGroup.vue2.js.map +1 -0
  122. package/components/organisms/JSidebar/JSidebarItem.vue.cjs +2 -0
  123. package/components/organisms/JSidebar/JSidebarItem.vue.cjs.map +1 -0
  124. package/components/organisms/JSidebar/JSidebarItem.vue.js +79 -0
  125. package/components/organisms/JSidebar/JSidebarItem.vue.js.map +1 -0
  126. package/components/organisms/JSidebar/JSidebarItem.vue2.cjs +2 -0
  127. package/components/organisms/JSidebar/JSidebarItem.vue2.cjs.map +1 -0
  128. package/components/organisms/JSidebar/JSidebarItem.vue2.js +5 -0
  129. package/components/organisms/JSidebar/JSidebarItem.vue2.js.map +1 -0
  130. package/components/organisms/JSidebarAdvanced.vue.cjs +1 -1
  131. package/components/organisms/JSidebarAdvanced.vue.js +7 -7
  132. package/components/organisms/JSidebarAdvanced.vue2.cjs.map +1 -1
  133. package/components/organisms/JSidebarAdvanced.vue2.js.map +1 -1
  134. package/components/organisms/JSidebarSimple.vue.cjs +1 -1
  135. package/components/organisms/JSidebarSimple.vue.js +2 -2
  136. package/components/organisms/JSidebarSimple.vue2.cjs.map +1 -1
  137. package/components/organisms/JSidebarSimple.vue2.js.map +1 -1
  138. package/components/shadcn/AccordionTrigger.vue.cjs.map +1 -1
  139. package/components/shadcn/AccordionTrigger.vue.js.map +1 -1
  140. package/components/shadcn/Card.vue.cjs.map +1 -1
  141. package/components/shadcn/Card.vue.js.map +1 -1
  142. package/components/shadcn/CardContent.vue.cjs.map +1 -1
  143. package/components/shadcn/CardContent.vue.js.map +1 -1
  144. package/components/shadcn/CardDescription.vue.cjs.map +1 -1
  145. package/components/shadcn/CardDescription.vue.js.map +1 -1
  146. package/components/shadcn/CardFooter.vue.cjs.map +1 -1
  147. package/components/shadcn/CardFooter.vue.js.map +1 -1
  148. package/components/shadcn/CardHeader.vue.cjs.map +1 -1
  149. package/components/shadcn/CardHeader.vue.js.map +1 -1
  150. package/components/shadcn/CardTitle.vue.cjs.map +1 -1
  151. package/components/shadcn/CardTitle.vue.js.map +1 -1
  152. package/components/shadcn/Checkbox.vue.cjs.map +1 -1
  153. package/components/shadcn/Checkbox.vue.js.map +1 -1
  154. package/components/shadcn/Combobox.vue.cjs.map +1 -1
  155. package/components/shadcn/Combobox.vue.js.map +1 -1
  156. package/components/shadcn/ComboboxAnchor.vue.cjs.map +1 -1
  157. package/components/shadcn/ComboboxAnchor.vue.js.map +1 -1
  158. package/components/shadcn/ComboboxEmpty.vue.cjs.map +1 -1
  159. package/components/shadcn/ComboboxEmpty.vue.js.map +1 -1
  160. package/components/shadcn/ComboboxGroup.vue.cjs.map +1 -1
  161. package/components/shadcn/ComboboxGroup.vue.js.map +1 -1
  162. package/components/shadcn/ComboboxInput.vue.cjs.map +1 -1
  163. package/components/shadcn/ComboboxInput.vue.js.map +1 -1
  164. package/components/shadcn/ComboboxItem.vue.cjs.map +1 -1
  165. package/components/shadcn/ComboboxItem.vue.js.map +1 -1
  166. package/components/shadcn/ComboboxList.vue.cjs.map +1 -1
  167. package/components/shadcn/ComboboxList.vue.js.map +1 -1
  168. package/components/shadcn/ComboboxTrigger.vue.cjs.map +1 -1
  169. package/components/shadcn/ComboboxTrigger.vue.js.map +1 -1
  170. package/components/shadcn/ContextMenu.vue.cjs.map +1 -1
  171. package/components/shadcn/ContextMenu.vue.js.map +1 -1
  172. package/components/shadcn/ContextMenuContent.vue.cjs.map +1 -1
  173. package/components/shadcn/ContextMenuContent.vue.js.map +1 -1
  174. package/components/shadcn/ContextMenuGroup.vue.cjs.map +1 -1
  175. package/components/shadcn/ContextMenuGroup.vue.js.map +1 -1
  176. package/components/shadcn/ContextMenuItem.vue.cjs.map +1 -1
  177. package/components/shadcn/ContextMenuItem.vue.js.map +1 -1
  178. package/components/shadcn/ContextMenuLabel.vue.cjs.map +1 -1
  179. package/components/shadcn/ContextMenuLabel.vue.js.map +1 -1
  180. package/components/shadcn/ContextMenuSeparator.vue.cjs.map +1 -1
  181. package/components/shadcn/ContextMenuSeparator.vue.js.map +1 -1
  182. package/components/shadcn/ContextMenuSub.vue.cjs.map +1 -1
  183. package/components/shadcn/ContextMenuSub.vue.js.map +1 -1
  184. package/components/shadcn/ContextMenuSubContent.vue.cjs.map +1 -1
  185. package/components/shadcn/ContextMenuSubContent.vue.js.map +1 -1
  186. package/components/shadcn/ContextMenuSubTrigger.vue.cjs.map +1 -1
  187. package/components/shadcn/ContextMenuSubTrigger.vue.js.map +1 -1
  188. package/components/shadcn/ContextMenuTrigger.vue.cjs.map +1 -1
  189. package/components/shadcn/ContextMenuTrigger.vue.js.map +1 -1
  190. package/components/shadcn/Field.vue.cjs.map +1 -1
  191. package/components/shadcn/Field.vue.js.map +1 -1
  192. package/components/shadcn/FieldContent.vue.cjs.map +1 -1
  193. package/components/shadcn/FieldContent.vue.js.map +1 -1
  194. package/components/shadcn/FieldDescription.vue.cjs.map +1 -1
  195. package/components/shadcn/FieldDescription.vue.js.map +1 -1
  196. package/components/shadcn/FieldError.vue.cjs.map +1 -1
  197. package/components/shadcn/FieldError.vue.js.map +1 -1
  198. package/components/shadcn/FieldGroup.vue.cjs.map +1 -1
  199. package/components/shadcn/FieldGroup.vue.js.map +1 -1
  200. package/components/shadcn/FieldLabel.vue.cjs.map +1 -1
  201. package/components/shadcn/FieldLabel.vue.js.map +1 -1
  202. package/components/shadcn/Input.vue.cjs.map +1 -1
  203. package/components/shadcn/Input.vue.js.map +1 -1
  204. package/components/shadcn/Label.vue.cjs.map +1 -1
  205. package/components/shadcn/Label.vue.js.map +1 -1
  206. package/components/shadcn/RadioGroup.vue.cjs.map +1 -1
  207. package/components/shadcn/RadioGroup.vue.js.map +1 -1
  208. package/components/shadcn/RadioGroupItem.vue.cjs.map +1 -1
  209. package/components/shadcn/RadioGroupItem.vue.js.map +1 -1
  210. package/components/shadcn/Select.vue.cjs.map +1 -1
  211. package/components/shadcn/Select.vue.js.map +1 -1
  212. package/components/shadcn/SelectContent.vue.cjs.map +1 -1
  213. package/components/shadcn/SelectContent.vue.js.map +1 -1
  214. package/components/shadcn/SelectGroup.vue.cjs.map +1 -1
  215. package/components/shadcn/SelectGroup.vue.js.map +1 -1
  216. package/components/shadcn/SelectItem.vue.cjs.map +1 -1
  217. package/components/shadcn/SelectItem.vue.js.map +1 -1
  218. package/components/shadcn/SelectLabel.vue.cjs.map +1 -1
  219. package/components/shadcn/SelectLabel.vue.js.map +1 -1
  220. package/components/shadcn/SelectScrollDownButton.vue2.cjs.map +1 -1
  221. package/components/shadcn/SelectScrollDownButton.vue2.js.map +1 -1
  222. package/components/shadcn/SelectScrollUpButton.vue2.cjs.map +1 -1
  223. package/components/shadcn/SelectScrollUpButton.vue2.js.map +1 -1
  224. package/components/shadcn/SelectTrigger.vue.cjs.map +1 -1
  225. package/components/shadcn/SelectTrigger.vue.js.map +1 -1
  226. package/components/shadcn/SelectValue.vue.cjs.map +1 -1
  227. package/components/shadcn/SelectValue.vue.js.map +1 -1
  228. package/components/shadcn/Separator.vue.cjs.map +1 -1
  229. package/components/shadcn/Separator.vue.js.map +1 -1
  230. package/components/shadcn/Switch.vue.cjs.map +1 -1
  231. package/components/shadcn/Switch.vue.js.map +1 -1
  232. package/components/shadcn/Tabs.vue.cjs.map +1 -1
  233. package/components/shadcn/Tabs.vue.js.map +1 -1
  234. package/components/shadcn/TabsContent.vue.cjs.map +1 -1
  235. package/components/shadcn/TabsContent.vue.js.map +1 -1
  236. package/components/shadcn/TabsTrigger.vue.cjs.map +1 -1
  237. package/components/shadcn/TabsTrigger.vue.js.map +1 -1
  238. package/components/shadcn/Textarea.vue.cjs.map +1 -1
  239. package/components/shadcn/Textarea.vue.js.map +1 -1
  240. package/components/shadcn/Toaster.vue.cjs.map +1 -1
  241. package/components/shadcn/Toaster.vue.js.map +1 -1
  242. package/components/shadcn/index.cjs.map +1 -1
  243. package/components/shadcn/index.js.map +1 -1
  244. package/components/shadcn/resizable/ResizableHandle.vue.cjs.map +1 -1
  245. package/components/shadcn/resizable/ResizableHandle.vue.js.map +1 -1
  246. package/components/shadcn/resizable/ResizablePanelGroup.vue.cjs.map +1 -1
  247. package/components/shadcn/resizable/ResizablePanelGroup.vue.js.map +1 -1
  248. package/components/templates/JLayout.vue.cjs.map +1 -1
  249. package/components/templates/JLayout.vue.js.map +1 -1
  250. package/components/templates/JLayoutSimple.vue.cjs +1 -1
  251. package/components/templates/JLayoutSimple.vue.cjs.map +1 -1
  252. package/components/templates/JLayoutSimple.vue.js +36 -30
  253. package/components/templates/JLayoutSimple.vue.js.map +1 -1
  254. package/index.cjs +1 -1
  255. package/index.js +22 -20
  256. package/lib/styleTypePreset.cjs.map +1 -1
  257. package/lib/styleTypePreset.js.map +1 -1
  258. package/lib/theme-utils.cjs.map +1 -1
  259. package/lib/theme-utils.js.map +1 -1
  260. package/package.json +1 -1
  261. package/tailwind.config.js +81 -81
  262. package/types/index.d.ts +119 -107
  263. package/types/sidebar.types.cjs +2 -0
  264. package/types/sidebar.types.cjs.map +1 -0
  265. package/types/sidebar.types.js +5 -0
  266. package/types/sidebar.types.js.map +1 -0
  267. package/assets/jwms-portal-frontend-BtHTA-UF.css +0 -1
@@ -1 +1 @@
1
- {"version":3,"file":"JAvatar.vue.cjs","sources":["../../../../src/components/atoms/JAvatar.vue"],"sourcesContent":["<script setup lang=\"ts\">\r\nimport { computed } from 'vue'\r\nimport Avatar from '@/components/shadcn/Avatar.vue'\r\nimport AvatarFallback from '@/components/shadcn/AvatarFallback.vue'\r\nimport AvatarImage from '@/components/shadcn/AvatarImage.vue'\r\n\r\ntype StyleType =\r\n | 'default' // 기본 스타일\r\n | 'primary' // 강조 스타일 (파랑)\r\n | 'success' // 성공 스타일 (초록)\r\n | 'warning' // 경고 스타일 (주황)\r\n | 'danger' // 위험 스타일 (빨강)\r\n\r\ntype Size = 'xs' | 'sm' | 'md' | 'lg' | 'xl'\n\r\ntype Shape = 'circle' | 'square' | 'rounded'\r\n\r\ntype Status = 'online' | 'offline' | 'away' | 'busy'\r\n\r\nconst props = withDefaults(\r\n defineProps<{\r\n src?: string\r\n alt?: string\r\n fallback?: string\r\n class?: string\r\n /** 스타일 프리셋 */\r\n styletype?: StyleType\r\n /** 아바타 크기 */\r\n size?: Size\r\n /** 아바타 모양 */\r\n shape?: Shape\r\n /** 상태 표시 */\r\n status?: Status\r\n }>(),\r\n {\n alt: '',\n fallback: '?',\n styletype: 'default',\n size: 'sm',\n shape: 'circle',\n },\n)\r\n\r\n/**\r\n * styletype -> class 매핑\r\n */\r\nconst STYLE_PRESETS: Record<StyleType, { class: string }> = {\r\n default: { class: '' },\r\n primary: { \r\n class: 'bg-blue-500 text-white',\r\n },\r\n success: { \r\n class: 'bg-green-500 text-white',\r\n },\r\n warning: { \r\n class: 'bg-amber-500 text-white',\r\n },\r\n danger: { \r\n class: 'bg-red-500 text-white',\r\n },\r\n}\r\n\r\n/**\r\n * size -> class 매핑\r\n */\r\nconst SIZE_PRESETS: Record<Size, { class: string }> = {\n xs: { \n class: 'h-6 w-6 text-[10px]',\n },\n sm: { \n class: 'h-8 w-8 text-xs',\n },\n md: { \n class: 'h-10 w-10 text-sm',\n },\n lg: { \n class: 'h-12 w-12 text-base',\n },\n xl: { \n class: 'h-16 w-16 text-lg',\n },\n}\n\r\n/**\r\n * shape -> class 매핑\r\n */\r\nconst SHAPE_PRESETS: Record<Shape, { class: string }> = {\r\n circle: { \r\n class: 'rounded-full',\r\n },\r\n square: { \r\n class: 'rounded-none',\r\n },\r\n rounded: { \r\n class: 'rounded-lg',\r\n },\r\n}\r\n\r\n/**\r\n * status -> class 매핑\r\n */\r\nconst STATUS_PRESETS: Record<Status, { class: string }> = {\r\n online: { \r\n class: 'ring-2 ring-green-500 ring-offset-2',\r\n },\r\n offline: { \r\n class: 'ring-2 ring-gray-400 ring-offset-2',\r\n },\r\n away: { \r\n class: 'ring-2 ring-yellow-500 ring-offset-2',\r\n },\r\n busy: { \r\n class: 'ring-2 ring-red-500 ring-offset-2',\r\n },\r\n}\r\n\r\n/** 최종 바인딩: 직접 넘긴 class가 있으면 styletype, size, shape, status 기본값과 병합 */\r\nconst mapped = computed(() => {\r\n const stylePreset = STYLE_PRESETS[props.styletype!]\r\n const sizePreset = SIZE_PRESETS[props.size!]\r\n const shapePreset = SHAPE_PRESETS[props.shape!]\r\n const statusPreset = props.status ? STATUS_PRESETS[props.status] : { class: '' }\r\n const finalClass = [stylePreset.class, sizePreset.class, shapePreset.class, statusPreset.class, props.class].filter(Boolean).join(' ')\r\n \r\n return {\r\n class: finalClass,\r\n }\r\n})\r\n</script>\r\n\r\n<template>\r\n <Avatar v-bind=\"mapped\">\r\n <AvatarImage v-if=\"props.src\" :src=\"props.src\" :alt=\"props.alt\" />\r\n <AvatarFallback v-else>{{ props.fallback }}</AvatarFallback>\r\n </Avatar>\r\n</template>\r\n"],"names":["props","__props","STYLE_PRESETS","SIZE_PRESETS","SHAPE_PRESETS","STATUS_PRESETS","mapped","computed","stylePreset","sizePreset","shapePreset","statusPreset","_openBlock","_createBlock","Avatar","AvatarImage","AvatarFallback","_createTextVNode","_toDisplayString"],"mappings":"scAmBA,MAAMA,EAAQC,EA2BRC,EAAsD,CAC1D,QAAS,CAAE,MAAO,EAAA,EAClB,QAAS,CACP,MAAO,wBAAA,EAET,QAAS,CACP,MAAO,yBAAA,EAET,QAAS,CACP,MAAO,yBAAA,EAET,OAAQ,CACN,MAAO,uBAAA,CACT,EAMIC,EAAgD,CACpD,GAAI,CACF,MAAO,qBAAA,EAET,GAAI,CACF,MAAO,iBAAA,EAET,GAAI,CACF,MAAO,mBAAA,EAET,GAAI,CACF,MAAO,qBAAA,EAET,GAAI,CACF,MAAO,mBAAA,CACT,EAMIC,EAAkD,CACtD,OAAQ,CACN,MAAO,cAAA,EAET,OAAQ,CACN,MAAO,cAAA,EAET,QAAS,CACP,MAAO,YAAA,CACT,EAMIC,EAAoD,CACxD,OAAQ,CACN,MAAO,qCAAA,EAET,QAAS,CACP,MAAO,oCAAA,EAET,KAAM,CACJ,MAAO,sCAAA,EAET,KAAM,CACJ,MAAO,mCAAA,CACT,EAIIC,EAASC,EAAAA,SAAS,IAAM,CAC5B,MAAMC,EAAcN,EAAcF,EAAM,SAAU,EAC5CS,EAAaN,EAAaH,EAAM,IAAK,EACrCU,EAAcN,EAAcJ,EAAM,KAAM,EACxCW,EAAeX,EAAM,OAASK,EAAeL,EAAM,MAAM,EAAI,CAAE,MAAO,EAAA,EAG5E,MAAO,CACL,MAHiB,CAACQ,EAAY,MAAOC,EAAW,MAAOC,EAAY,MAAOC,EAAa,MAAOX,EAAM,KAAK,EAAE,OAAO,OAAO,EAAE,KAAK,GAAG,CAG5H,CAEX,CAAC,gBAICY,EAAAA,UAAA,EAAAC,EAAAA,YAGSC,EAAAA,8CAHOR,EAAA,KAAM,CAAA,EAAA,mBACpB,IAAkE,CAA/CN,EAAM,mBAAzBa,EAAAA,YAAkEE,EAAAA,QAAA,OAAnC,IAAKf,EAAM,IAAM,IAAKA,EAAM,GAAA,wCAC3Da,EAAAA,YAA4DG,EAAAA,QAAA,CAAA,IAAA,GAAA,mBAArC,IAAoB,CAAjBC,EAAAA,gBAAAC,EAAAA,gBAAAlB,EAAM,QAAQ,EAAA,CAAA,CAAA"}
1
+ {"version":3,"file":"JAvatar.vue.cjs","sources":["../../../../src/components/atoms/JAvatar.vue"],"sourcesContent":["<script setup lang=\"ts\">\nimport { computed } from 'vue'\nimport Avatar from '@/components/shadcn/Avatar.vue'\nimport AvatarFallback from '@/components/shadcn/AvatarFallback.vue'\nimport AvatarImage from '@/components/shadcn/AvatarImage.vue'\n\ntype StyleType =\n | 'default' // 기본 스타일\n | 'primary' // 강조 스타일 (파랑)\n | 'success' // 성공 스타일 (초록)\n | 'warning' // 경고 스타일 (주황)\n | 'danger' // 위험 스타일 (빨강)\n\ntype Size = 'xs' | 'sm' | 'md' | 'lg' | 'xl'\n\ntype Shape = 'circle' | 'square' | 'rounded'\n\ntype Status = 'online' | 'offline' | 'away' | 'busy'\n\nconst props = withDefaults(\n defineProps<{\n src?: string\n alt?: string\n fallback?: string\n class?: string\n /** 스타일 프리셋 */\n styletype?: StyleType\n /** 아바타 크기 */\n size?: Size\n /** 아바타 모양 */\n shape?: Shape\n /** 상태 표시 */\n status?: Status\n }>(),\n {\n alt: '',\n fallback: '?',\n styletype: 'default',\n size: 'sm',\n shape: 'circle',\n },\n)\n\n/**\n * styletype -> class 매핑\n */\nconst STYLE_PRESETS: Record<StyleType, { class: string }> = {\n default: { class: '' },\n primary: { \n class: 'bg-blue-500 text-white',\n },\n success: { \n class: 'bg-green-500 text-white',\n },\n warning: { \n class: 'bg-amber-500 text-white',\n },\n danger: { \n class: 'bg-red-500 text-white',\n },\n}\n\n/**\n * size -> class 매핑\n */\nconst SIZE_PRESETS: Record<Size, { class: string }> = {\n xs: { \n class: 'h-6 w-6 text-[10px]',\n },\n sm: { \n class: 'h-8 w-8 text-xs',\n },\n md: { \n class: 'h-10 w-10 text-sm',\n },\n lg: { \n class: 'h-12 w-12 text-base',\n },\n xl: { \n class: 'h-16 w-16 text-lg',\n },\n}\n\n/**\n * shape -> class 매핑\n */\nconst SHAPE_PRESETS: Record<Shape, { class: string }> = {\n circle: { \n class: 'rounded-full',\n },\n square: { \n class: 'rounded-none',\n },\n rounded: { \n class: 'rounded-lg',\n },\n}\n\n/**\n * status -> class 매핑\n */\nconst STATUS_PRESETS: Record<Status, { class: string }> = {\n online: { \n class: 'ring-2 ring-green-500 ring-offset-2',\n },\n offline: { \n class: 'ring-2 ring-gray-400 ring-offset-2',\n },\n away: { \n class: 'ring-2 ring-yellow-500 ring-offset-2',\n },\n busy: { \n class: 'ring-2 ring-red-500 ring-offset-2',\n },\n}\n\n/** 최종 바인딩: 직접 넘긴 class가 있으면 styletype, size, shape, status 기본값과 병합 */\nconst mapped = computed(() => {\n const stylePreset = STYLE_PRESETS[props.styletype!]\n const sizePreset = SIZE_PRESETS[props.size!]\n const shapePreset = SHAPE_PRESETS[props.shape!]\n const statusPreset = props.status ? STATUS_PRESETS[props.status] : { class: '' }\n const finalClass = [stylePreset.class, sizePreset.class, shapePreset.class, statusPreset.class, props.class].filter(Boolean).join(' ')\n \n return {\n class: finalClass,\n }\n})\n</script>\n\n<template>\n <Avatar v-bind=\"mapped\">\n <AvatarImage v-if=\"props.src\" :src=\"props.src\" :alt=\"props.alt\" />\n <AvatarFallback v-else>{{ props.fallback }}</AvatarFallback>\n </Avatar>\n</template>\n"],"names":["props","__props","STYLE_PRESETS","SIZE_PRESETS","SHAPE_PRESETS","STATUS_PRESETS","mapped","computed","stylePreset","sizePreset","shapePreset","statusPreset","_openBlock","_createBlock","Avatar","AvatarImage","AvatarFallback","_createTextVNode","_toDisplayString"],"mappings":"scAmBA,MAAMA,EAAQC,EA2BRC,EAAsD,CAC1D,QAAS,CAAE,MAAO,EAAA,EAClB,QAAS,CACP,MAAO,wBAAA,EAET,QAAS,CACP,MAAO,yBAAA,EAET,QAAS,CACP,MAAO,yBAAA,EAET,OAAQ,CACN,MAAO,uBAAA,CACT,EAMIC,EAAgD,CACpD,GAAI,CACF,MAAO,qBAAA,EAET,GAAI,CACF,MAAO,iBAAA,EAET,GAAI,CACF,MAAO,mBAAA,EAET,GAAI,CACF,MAAO,qBAAA,EAET,GAAI,CACF,MAAO,mBAAA,CACT,EAMIC,EAAkD,CACtD,OAAQ,CACN,MAAO,cAAA,EAET,OAAQ,CACN,MAAO,cAAA,EAET,QAAS,CACP,MAAO,YAAA,CACT,EAMIC,EAAoD,CACxD,OAAQ,CACN,MAAO,qCAAA,EAET,QAAS,CACP,MAAO,oCAAA,EAET,KAAM,CACJ,MAAO,sCAAA,EAET,KAAM,CACJ,MAAO,mCAAA,CACT,EAIIC,EAASC,EAAAA,SAAS,IAAM,CAC5B,MAAMC,EAAcN,EAAcF,EAAM,SAAU,EAC5CS,EAAaN,EAAaH,EAAM,IAAK,EACrCU,EAAcN,EAAcJ,EAAM,KAAM,EACxCW,EAAeX,EAAM,OAASK,EAAeL,EAAM,MAAM,EAAI,CAAE,MAAO,EAAA,EAG5E,MAAO,CACL,MAHiB,CAACQ,EAAY,MAAOC,EAAW,MAAOC,EAAY,MAAOC,EAAa,MAAOX,EAAM,KAAK,EAAE,OAAO,OAAO,EAAE,KAAK,GAAG,CAG5H,CAEX,CAAC,gBAICY,EAAAA,UAAA,EAAAC,EAAAA,YAGSC,EAAAA,8CAHOR,EAAA,KAAM,CAAA,EAAA,mBACpB,IAAkE,CAA/CN,EAAM,mBAAzBa,EAAAA,YAAkEE,EAAAA,QAAA,OAAnC,IAAKf,EAAM,IAAM,IAAKA,EAAM,GAAA,wCAC3Da,EAAAA,YAA4DG,EAAAA,QAAA,CAAA,IAAA,GAAA,mBAArC,IAAoB,CAAjBC,EAAAA,gBAAAC,EAAAA,gBAAAlB,EAAM,QAAQ,EAAA,CAAA,CAAA"}
@@ -1 +1 @@
1
- {"version":3,"file":"JAvatar.vue.js","sources":["../../../../src/components/atoms/JAvatar.vue"],"sourcesContent":["<script setup lang=\"ts\">\r\nimport { computed } from 'vue'\r\nimport Avatar from '@/components/shadcn/Avatar.vue'\r\nimport AvatarFallback from '@/components/shadcn/AvatarFallback.vue'\r\nimport AvatarImage from '@/components/shadcn/AvatarImage.vue'\r\n\r\ntype StyleType =\r\n | 'default' // 기본 스타일\r\n | 'primary' // 강조 스타일 (파랑)\r\n | 'success' // 성공 스타일 (초록)\r\n | 'warning' // 경고 스타일 (주황)\r\n | 'danger' // 위험 스타일 (빨강)\r\n\r\ntype Size = 'xs' | 'sm' | 'md' | 'lg' | 'xl'\n\r\ntype Shape = 'circle' | 'square' | 'rounded'\r\n\r\ntype Status = 'online' | 'offline' | 'away' | 'busy'\r\n\r\nconst props = withDefaults(\r\n defineProps<{\r\n src?: string\r\n alt?: string\r\n fallback?: string\r\n class?: string\r\n /** 스타일 프리셋 */\r\n styletype?: StyleType\r\n /** 아바타 크기 */\r\n size?: Size\r\n /** 아바타 모양 */\r\n shape?: Shape\r\n /** 상태 표시 */\r\n status?: Status\r\n }>(),\r\n {\n alt: '',\n fallback: '?',\n styletype: 'default',\n size: 'sm',\n shape: 'circle',\n },\n)\r\n\r\n/**\r\n * styletype -> class 매핑\r\n */\r\nconst STYLE_PRESETS: Record<StyleType, { class: string }> = {\r\n default: { class: '' },\r\n primary: { \r\n class: 'bg-blue-500 text-white',\r\n },\r\n success: { \r\n class: 'bg-green-500 text-white',\r\n },\r\n warning: { \r\n class: 'bg-amber-500 text-white',\r\n },\r\n danger: { \r\n class: 'bg-red-500 text-white',\r\n },\r\n}\r\n\r\n/**\r\n * size -> class 매핑\r\n */\r\nconst SIZE_PRESETS: Record<Size, { class: string }> = {\n xs: { \n class: 'h-6 w-6 text-[10px]',\n },\n sm: { \n class: 'h-8 w-8 text-xs',\n },\n md: { \n class: 'h-10 w-10 text-sm',\n },\n lg: { \n class: 'h-12 w-12 text-base',\n },\n xl: { \n class: 'h-16 w-16 text-lg',\n },\n}\n\r\n/**\r\n * shape -> class 매핑\r\n */\r\nconst SHAPE_PRESETS: Record<Shape, { class: string }> = {\r\n circle: { \r\n class: 'rounded-full',\r\n },\r\n square: { \r\n class: 'rounded-none',\r\n },\r\n rounded: { \r\n class: 'rounded-lg',\r\n },\r\n}\r\n\r\n/**\r\n * status -> class 매핑\r\n */\r\nconst STATUS_PRESETS: Record<Status, { class: string }> = {\r\n online: { \r\n class: 'ring-2 ring-green-500 ring-offset-2',\r\n },\r\n offline: { \r\n class: 'ring-2 ring-gray-400 ring-offset-2',\r\n },\r\n away: { \r\n class: 'ring-2 ring-yellow-500 ring-offset-2',\r\n },\r\n busy: { \r\n class: 'ring-2 ring-red-500 ring-offset-2',\r\n },\r\n}\r\n\r\n/** 최종 바인딩: 직접 넘긴 class가 있으면 styletype, size, shape, status 기본값과 병합 */\r\nconst mapped = computed(() => {\r\n const stylePreset = STYLE_PRESETS[props.styletype!]\r\n const sizePreset = SIZE_PRESETS[props.size!]\r\n const shapePreset = SHAPE_PRESETS[props.shape!]\r\n const statusPreset = props.status ? STATUS_PRESETS[props.status] : { class: '' }\r\n const finalClass = [stylePreset.class, sizePreset.class, shapePreset.class, statusPreset.class, props.class].filter(Boolean).join(' ')\r\n \r\n return {\r\n class: finalClass,\r\n }\r\n})\r\n</script>\r\n\r\n<template>\r\n <Avatar v-bind=\"mapped\">\r\n <AvatarImage v-if=\"props.src\" :src=\"props.src\" :alt=\"props.alt\" />\r\n <AvatarFallback v-else>{{ props.fallback }}</AvatarFallback>\r\n </Avatar>\r\n</template>\r\n"],"names":["props","__props","STYLE_PRESETS","SIZE_PRESETS","SHAPE_PRESETS","STATUS_PRESETS","mapped","computed","stylePreset","sizePreset","shapePreset","statusPreset","_openBlock","_createBlock","Avatar","AvatarImage","AvatarFallback","_createTextVNode","_toDisplayString"],"mappings":";;;;;;;;;;;;;;;;;AAmBA,UAAMA,IAAQC,GA2BRC,IAAsD;AAAA,MAC1D,SAAS,EAAE,OAAO,GAAA;AAAA,MAClB,SAAS;AAAA,QACP,OAAO;AAAA,MAAA;AAAA,MAET,SAAS;AAAA,QACP,OAAO;AAAA,MAAA;AAAA,MAET,SAAS;AAAA,QACP,OAAO;AAAA,MAAA;AAAA,MAET,QAAQ;AAAA,QACN,OAAO;AAAA,MAAA;AAAA,IACT,GAMIC,IAAgD;AAAA,MACpD,IAAI;AAAA,QACF,OAAO;AAAA,MAAA;AAAA,MAET,IAAI;AAAA,QACF,OAAO;AAAA,MAAA;AAAA,MAET,IAAI;AAAA,QACF,OAAO;AAAA,MAAA;AAAA,MAET,IAAI;AAAA,QACF,OAAO;AAAA,MAAA;AAAA,MAET,IAAI;AAAA,QACF,OAAO;AAAA,MAAA;AAAA,IACT,GAMIC,IAAkD;AAAA,MACtD,QAAQ;AAAA,QACN,OAAO;AAAA,MAAA;AAAA,MAET,QAAQ;AAAA,QACN,OAAO;AAAA,MAAA;AAAA,MAET,SAAS;AAAA,QACP,OAAO;AAAA,MAAA;AAAA,IACT,GAMIC,IAAoD;AAAA,MACxD,QAAQ;AAAA,QACN,OAAO;AAAA,MAAA;AAAA,MAET,SAAS;AAAA,QACP,OAAO;AAAA,MAAA;AAAA,MAET,MAAM;AAAA,QACJ,OAAO;AAAA,MAAA;AAAA,MAET,MAAM;AAAA,QACJ,OAAO;AAAA,MAAA;AAAA,IACT,GAIIC,IAASC,EAAS,MAAM;AAC5B,YAAMC,IAAcN,EAAcF,EAAM,SAAU,GAC5CS,IAAaN,EAAaH,EAAM,IAAK,GACrCU,IAAcN,EAAcJ,EAAM,KAAM,GACxCW,IAAeX,EAAM,SAASK,EAAeL,EAAM,MAAM,IAAI,EAAE,OAAO,GAAA;AAG5E,aAAO;AAAA,QACL,OAHiB,CAACQ,EAAY,OAAOC,EAAW,OAAOC,EAAY,OAAOC,EAAa,OAAOX,EAAM,KAAK,EAAE,OAAO,OAAO,EAAE,KAAK,GAAG;AAAA,MAG5H;AAAA,IAEX,CAAC;sBAICY,EAAA,GAAAC,EAGSC,OAHOR,EAAA,KAAM,CAAA,GAAA;AAAA,iBACpB,MAAkE;AAAA,QAA/CN,EAAM,YAAzBa,EAAkEE,GAAA;AAAA;UAAnC,KAAKf,EAAM;AAAA,UAAM,KAAKA,EAAM;AAAA,QAAA,qCAC3Da,EAA4DG,GAAA,EAAA,KAAA,KAAA;AAAA,qBAArC,MAAoB;AAAA,YAAjBC,EAAAC,EAAAlB,EAAM,QAAQ,GAAA,CAAA;AAAA,UAAA;;;;;;;;"}
1
+ {"version":3,"file":"JAvatar.vue.js","sources":["../../../../src/components/atoms/JAvatar.vue"],"sourcesContent":["<script setup lang=\"ts\">\nimport { computed } from 'vue'\nimport Avatar from '@/components/shadcn/Avatar.vue'\nimport AvatarFallback from '@/components/shadcn/AvatarFallback.vue'\nimport AvatarImage from '@/components/shadcn/AvatarImage.vue'\n\ntype StyleType =\n | 'default' // 기본 스타일\n | 'primary' // 강조 스타일 (파랑)\n | 'success' // 성공 스타일 (초록)\n | 'warning' // 경고 스타일 (주황)\n | 'danger' // 위험 스타일 (빨강)\n\ntype Size = 'xs' | 'sm' | 'md' | 'lg' | 'xl'\n\ntype Shape = 'circle' | 'square' | 'rounded'\n\ntype Status = 'online' | 'offline' | 'away' | 'busy'\n\nconst props = withDefaults(\n defineProps<{\n src?: string\n alt?: string\n fallback?: string\n class?: string\n /** 스타일 프리셋 */\n styletype?: StyleType\n /** 아바타 크기 */\n size?: Size\n /** 아바타 모양 */\n shape?: Shape\n /** 상태 표시 */\n status?: Status\n }>(),\n {\n alt: '',\n fallback: '?',\n styletype: 'default',\n size: 'sm',\n shape: 'circle',\n },\n)\n\n/**\n * styletype -> class 매핑\n */\nconst STYLE_PRESETS: Record<StyleType, { class: string }> = {\n default: { class: '' },\n primary: { \n class: 'bg-blue-500 text-white',\n },\n success: { \n class: 'bg-green-500 text-white',\n },\n warning: { \n class: 'bg-amber-500 text-white',\n },\n danger: { \n class: 'bg-red-500 text-white',\n },\n}\n\n/**\n * size -> class 매핑\n */\nconst SIZE_PRESETS: Record<Size, { class: string }> = {\n xs: { \n class: 'h-6 w-6 text-[10px]',\n },\n sm: { \n class: 'h-8 w-8 text-xs',\n },\n md: { \n class: 'h-10 w-10 text-sm',\n },\n lg: { \n class: 'h-12 w-12 text-base',\n },\n xl: { \n class: 'h-16 w-16 text-lg',\n },\n}\n\n/**\n * shape -> class 매핑\n */\nconst SHAPE_PRESETS: Record<Shape, { class: string }> = {\n circle: { \n class: 'rounded-full',\n },\n square: { \n class: 'rounded-none',\n },\n rounded: { \n class: 'rounded-lg',\n },\n}\n\n/**\n * status -> class 매핑\n */\nconst STATUS_PRESETS: Record<Status, { class: string }> = {\n online: { \n class: 'ring-2 ring-green-500 ring-offset-2',\n },\n offline: { \n class: 'ring-2 ring-gray-400 ring-offset-2',\n },\n away: { \n class: 'ring-2 ring-yellow-500 ring-offset-2',\n },\n busy: { \n class: 'ring-2 ring-red-500 ring-offset-2',\n },\n}\n\n/** 최종 바인딩: 직접 넘긴 class가 있으면 styletype, size, shape, status 기본값과 병합 */\nconst mapped = computed(() => {\n const stylePreset = STYLE_PRESETS[props.styletype!]\n const sizePreset = SIZE_PRESETS[props.size!]\n const shapePreset = SHAPE_PRESETS[props.shape!]\n const statusPreset = props.status ? STATUS_PRESETS[props.status] : { class: '' }\n const finalClass = [stylePreset.class, sizePreset.class, shapePreset.class, statusPreset.class, props.class].filter(Boolean).join(' ')\n \n return {\n class: finalClass,\n }\n})\n</script>\n\n<template>\n <Avatar v-bind=\"mapped\">\n <AvatarImage v-if=\"props.src\" :src=\"props.src\" :alt=\"props.alt\" />\n <AvatarFallback v-else>{{ props.fallback }}</AvatarFallback>\n </Avatar>\n</template>\n"],"names":["props","__props","STYLE_PRESETS","SIZE_PRESETS","SHAPE_PRESETS","STATUS_PRESETS","mapped","computed","stylePreset","sizePreset","shapePreset","statusPreset","_openBlock","_createBlock","Avatar","AvatarImage","AvatarFallback","_createTextVNode","_toDisplayString"],"mappings":";;;;;;;;;;;;;;;;;AAmBA,UAAMA,IAAQC,GA2BRC,IAAsD;AAAA,MAC1D,SAAS,EAAE,OAAO,GAAA;AAAA,MAClB,SAAS;AAAA,QACP,OAAO;AAAA,MAAA;AAAA,MAET,SAAS;AAAA,QACP,OAAO;AAAA,MAAA;AAAA,MAET,SAAS;AAAA,QACP,OAAO;AAAA,MAAA;AAAA,MAET,QAAQ;AAAA,QACN,OAAO;AAAA,MAAA;AAAA,IACT,GAMIC,IAAgD;AAAA,MACpD,IAAI;AAAA,QACF,OAAO;AAAA,MAAA;AAAA,MAET,IAAI;AAAA,QACF,OAAO;AAAA,MAAA;AAAA,MAET,IAAI;AAAA,QACF,OAAO;AAAA,MAAA;AAAA,MAET,IAAI;AAAA,QACF,OAAO;AAAA,MAAA;AAAA,MAET,IAAI;AAAA,QACF,OAAO;AAAA,MAAA;AAAA,IACT,GAMIC,IAAkD;AAAA,MACtD,QAAQ;AAAA,QACN,OAAO;AAAA,MAAA;AAAA,MAET,QAAQ;AAAA,QACN,OAAO;AAAA,MAAA;AAAA,MAET,SAAS;AAAA,QACP,OAAO;AAAA,MAAA;AAAA,IACT,GAMIC,IAAoD;AAAA,MACxD,QAAQ;AAAA,QACN,OAAO;AAAA,MAAA;AAAA,MAET,SAAS;AAAA,QACP,OAAO;AAAA,MAAA;AAAA,MAET,MAAM;AAAA,QACJ,OAAO;AAAA,MAAA;AAAA,MAET,MAAM;AAAA,QACJ,OAAO;AAAA,MAAA;AAAA,IACT,GAIIC,IAASC,EAAS,MAAM;AAC5B,YAAMC,IAAcN,EAAcF,EAAM,SAAU,GAC5CS,IAAaN,EAAaH,EAAM,IAAK,GACrCU,IAAcN,EAAcJ,EAAM,KAAM,GACxCW,IAAeX,EAAM,SAASK,EAAeL,EAAM,MAAM,IAAI,EAAE,OAAO,GAAA;AAG5E,aAAO;AAAA,QACL,OAHiB,CAACQ,EAAY,OAAOC,EAAW,OAAOC,EAAY,OAAOC,EAAa,OAAOX,EAAM,KAAK,EAAE,OAAO,OAAO,EAAE,KAAK,GAAG;AAAA,MAG5H;AAAA,IAEX,CAAC;sBAICY,EAAA,GAAAC,EAGSC,OAHOR,EAAA,KAAM,CAAA,GAAA;AAAA,iBACpB,MAAkE;AAAA,QAA/CN,EAAM,YAAzBa,EAAkEE,GAAA;AAAA;UAAnC,KAAKf,EAAM;AAAA,UAAM,KAAKA,EAAM;AAAA,QAAA,qCAC3Da,EAA4DG,GAAA,EAAA,KAAA,KAAA;AAAA,qBAArC,MAAoB;AAAA,YAAjBC,EAAAC,EAAAlB,EAAM,QAAQ,GAAA,CAAA;AAAA,UAAA;;;;;;;;"}
@@ -1 +1 @@
1
- {"version":3,"file":"JBadge.vue.cjs","sources":["../../../../src/components/atoms/JBadge.vue"],"sourcesContent":["<script setup lang=\"ts\">\r\nimport { computed } from 'vue'\r\nimport Badge from '@/components/shadcn/Badge.vue'\r\n\r\ntype StyleType =\r\n | 'default' // 기본 스타일\r\n | 'primary' // 강조 스타일 (파랑)\r\n | 'success' // 성공 스타일 (초록)\r\n | 'warning' // 경고 스타일 (주황)\r\n | 'danger' // 위험 스타일 (빨강)\r\n\r\nconst props = withDefaults(\r\n defineProps<{\r\n variant?: 'default' | 'secondary' | 'destructive' | 'outline'\r\n class?: string\r\n /** 스타일 프리셋 */\r\n styletype?: StyleType\r\n /** 배지 크기 */\n size?: 'xs' | 'sm' | 'md' | 'lg'\n }>(),\r\n {\n variant: 'default',\n styletype: 'default',\n size: 'sm',\n },\n)\r\n\r\n/**\r\n * styletype -> variant, class 매핑\r\n */\r\nconst STYLE_PRESETS: Record<StyleType, { variant?: string; class: string }> = {\r\n default: { class: '' },\r\n primary: { \r\n variant: 'default',\r\n class: 'bg-blue-500 text-white hover:bg-blue-600',\r\n },\r\n success: { \r\n variant: 'default',\r\n class: 'bg-green-500 text-white hover:bg-green-600',\r\n },\r\n warning: { \r\n variant: 'default',\r\n class: 'bg-amber-500 text-white hover:bg-amber-600',\r\n },\r\n danger: { \r\n variant: 'default',\r\n class: 'bg-red-500 text-white hover:bg-red-600',\r\n },\r\n}\r\n\r\n/**\r\n * size -> class 매핑\r\n */\r\nconst SIZE_PRESETS: Record<'xs' | 'sm' | 'md' | 'lg', string> = {\n xs: 'text-[10px] px-1 py-0.5 leading-tight',\n sm: 'text-xs px-1.5 py-0.5',\n md: 'text-xs px-2 py-1',\n lg: 'text-sm px-2.5 py-1',\n}\n\r\n/** 최종 바인딩: 직접 넘긴 props가 있으면 styletype 기본값과 병합 */\r\nconst mapped = computed(() => {\r\n const preset = STYLE_PRESETS[props.styletype!]\r\n const sizeClass = SIZE_PRESETS[props.size!]\r\n \r\n const finalVariant = props.variant || preset.variant\r\n let styleClass = ''\r\n \r\n // variant에 따른 스타일 처리\r\n if (finalVariant === 'outline') {\r\n // outline: 테두리 색상만 적용 (styletype 색상 사용)\r\n styleClass = getOutlineStyleClass(props.styletype!)\r\n } else if (finalVariant === 'secondary') {\r\n // secondary: 고정된 회색 계열 스타일 (styletype 무시)\r\n styleClass = 'bg-gray-100 text-gray-800 hover:bg-gray-200'\r\n } else if (finalVariant === 'destructive') {\r\n // destructive: 고정된 빨간색 계열 스타일 (styletype 무시)\r\n styleClass = 'bg-red-500 text-white hover:bg-red-600'\r\n } else {\r\n // default: styletype의 배경색 스타일 적용\r\n styleClass = preset.class\r\n }\r\n \r\n const finalClass = [styleClass, sizeClass, props.class].filter(Boolean).join(' ')\r\n \r\n return {\r\n variant: finalVariant,\r\n class: finalClass,\r\n }\r\n})\r\n\r\n/**\r\n * outline variant용 스타일 클래스\r\n */\r\nconst getOutlineStyleClass = (styletype: StyleType): string => {\r\n const outlineStyles: Record<StyleType, string> = {\r\n default: 'border-gray-300 text-gray-700',\r\n primary: 'border-blue-500 text-blue-600',\r\n success: 'border-green-500 text-green-600',\r\n warning: 'border-amber-500 text-amber-600',\r\n danger: 'border-red-500 text-red-600',\r\n }\r\n return outlineStyles[styletype] || ''\r\n}\r\n</script>\r\n\r\n<template>\r\n <Badge v-bind=\"mapped\">\r\n <slot />\r\n </Badge>\r\n</template>\r\n"],"names":["props","__props","STYLE_PRESETS","SIZE_PRESETS","mapped","computed","preset","sizeClass","finalVariant","styleClass","getOutlineStyleClass","finalClass","styletype","_openBlock","_createBlock","Badge","_renderSlot","_ctx"],"mappings":"qTAWA,MAAMA,EAAQC,EAmBRC,EAAwE,CAC5E,QAAS,CAAE,MAAO,EAAA,EAClB,QAAS,CACP,QAAS,UACT,MAAO,0CAAA,EAET,QAAS,CACP,QAAS,UACT,MAAO,4CAAA,EAET,QAAS,CACP,QAAS,UACT,MAAO,4CAAA,EAET,OAAQ,CACN,QAAS,UACT,MAAO,wCAAA,CACT,EAMIC,EAA0D,CAC9D,GAAI,wCACJ,GAAI,wBACJ,GAAI,oBACJ,GAAI,qBAAA,EAIAC,EAASC,EAAAA,SAAS,IAAM,CAC5B,MAAMC,EAASJ,EAAcF,EAAM,SAAU,EACvCO,EAAYJ,EAAaH,EAAM,IAAK,EAEpCQ,EAAeR,EAAM,SAAWM,EAAO,QAC7C,IAAIG,EAAa,GAGbD,IAAiB,UAEnBC,EAAaC,EAAqBV,EAAM,SAAU,EACzCQ,IAAiB,YAE1BC,EAAa,8CACJD,IAAiB,cAE1BC,EAAa,yCAGbA,EAAaH,EAAO,MAGtB,MAAMK,EAAa,CAACF,EAAYF,EAAWP,EAAM,KAAK,EAAE,OAAO,OAAO,EAAE,KAAK,GAAG,EAEhF,MAAO,CACL,QAASQ,EACT,MAAOG,CAAA,CAEX,CAAC,EAKKD,EAAwBE,IACqB,CAC/C,QAAS,gCACT,QAAS,gCACT,QAAS,kCACT,QAAS,kCACT,OAAQ,6BAAA,GAEWA,CAAS,GAAK,iBAKnCC,EAAAA,UAAA,EAAAC,EAAAA,YAEQC,EAAAA,8CAFOX,EAAA,KAAM,CAAA,EAAA,mBACnB,IAAQ,CAARY,aAAQC,EAAA,OAAA,SAAA,CAAA"}
1
+ {"version":3,"file":"JBadge.vue.cjs","sources":["../../../../src/components/atoms/JBadge.vue"],"sourcesContent":["<script setup lang=\"ts\">\nimport { computed } from 'vue'\nimport Badge from '@/components/shadcn/Badge.vue'\n\ntype StyleType =\n | 'default' // 기본 스타일\n | 'primary' // 강조 스타일 (파랑)\n | 'success' // 성공 스타일 (초록)\n | 'warning' // 경고 스타일 (주황)\n | 'danger' // 위험 스타일 (빨강)\n\nconst props = withDefaults(\n defineProps<{\n variant?: 'default' | 'secondary' | 'destructive' | 'outline'\n class?: string\n /** 스타일 프리셋 */\n styletype?: StyleType\n /** 배지 크기 */\n size?: 'xs' | 'sm' | 'md' | 'lg'\n }>(),\n {\n variant: 'default',\n styletype: 'default',\n size: 'sm',\n },\n)\n\n/**\n * styletype -> variant, class 매핑\n */\nconst STYLE_PRESETS: Record<StyleType, { variant?: string; class: string }> = {\n default: { class: '' },\n primary: { \n variant: 'default',\n class: 'bg-blue-500 text-white hover:bg-blue-600',\n },\n success: { \n variant: 'default',\n class: 'bg-green-500 text-white hover:bg-green-600',\n },\n warning: { \n variant: 'default',\n class: 'bg-amber-500 text-white hover:bg-amber-600',\n },\n danger: { \n variant: 'default',\n class: 'bg-red-500 text-white hover:bg-red-600',\n },\n}\n\n/**\n * size -> class 매핑\n */\nconst SIZE_PRESETS: Record<'xs' | 'sm' | 'md' | 'lg', string> = {\n xs: 'text-[10px] px-1 py-0.5 leading-tight',\n sm: 'text-xs px-1.5 py-0.5',\n md: 'text-xs px-2 py-1',\n lg: 'text-sm px-2.5 py-1',\n}\n\n/** 최종 바인딩: 직접 넘긴 props가 있으면 styletype 기본값과 병합 */\nconst mapped = computed(() => {\n const preset = STYLE_PRESETS[props.styletype!]\n const sizeClass = SIZE_PRESETS[props.size!]\n \n const finalVariant = props.variant || preset.variant\n let styleClass = ''\n \n // variant에 따른 스타일 처리\n if (finalVariant === 'outline') {\n // outline: 테두리 색상만 적용 (styletype 색상 사용)\n styleClass = getOutlineStyleClass(props.styletype!)\n } else if (finalVariant === 'secondary') {\n // secondary: 고정된 회색 계열 스타일 (styletype 무시)\n styleClass = 'bg-gray-100 text-gray-800 hover:bg-gray-200'\n } else if (finalVariant === 'destructive') {\n // destructive: 고정된 빨간색 계열 스타일 (styletype 무시)\n styleClass = 'bg-red-500 text-white hover:bg-red-600'\n } else {\n // default: styletype의 배경색 스타일 적용\n styleClass = preset.class\n }\n \n const finalClass = [styleClass, sizeClass, props.class].filter(Boolean).join(' ')\n \n return {\n variant: finalVariant,\n class: finalClass,\n }\n})\n\n/**\n * outline variant용 스타일 클래스\n */\nconst getOutlineStyleClass = (styletype: StyleType): string => {\n const outlineStyles: Record<StyleType, string> = {\n default: 'border-gray-300 text-gray-700',\n primary: 'border-blue-500 text-blue-600',\n success: 'border-green-500 text-green-600',\n warning: 'border-amber-500 text-amber-600',\n danger: 'border-red-500 text-red-600',\n }\n return outlineStyles[styletype] || ''\n}\n</script>\n\n<template>\n <Badge v-bind=\"mapped\">\n <slot />\n </Badge>\n</template>\n"],"names":["props","__props","STYLE_PRESETS","SIZE_PRESETS","mapped","computed","preset","sizeClass","finalVariant","styleClass","getOutlineStyleClass","finalClass","styletype","_openBlock","_createBlock","Badge","_renderSlot","_ctx"],"mappings":"qTAWA,MAAMA,EAAQC,EAmBRC,EAAwE,CAC5E,QAAS,CAAE,MAAO,EAAA,EAClB,QAAS,CACP,QAAS,UACT,MAAO,0CAAA,EAET,QAAS,CACP,QAAS,UACT,MAAO,4CAAA,EAET,QAAS,CACP,QAAS,UACT,MAAO,4CAAA,EAET,OAAQ,CACN,QAAS,UACT,MAAO,wCAAA,CACT,EAMIC,EAA0D,CAC9D,GAAI,wCACJ,GAAI,wBACJ,GAAI,oBACJ,GAAI,qBAAA,EAIAC,EAASC,EAAAA,SAAS,IAAM,CAC5B,MAAMC,EAASJ,EAAcF,EAAM,SAAU,EACvCO,EAAYJ,EAAaH,EAAM,IAAK,EAEpCQ,EAAeR,EAAM,SAAWM,EAAO,QAC7C,IAAIG,EAAa,GAGbD,IAAiB,UAEnBC,EAAaC,EAAqBV,EAAM,SAAU,EACzCQ,IAAiB,YAE1BC,EAAa,8CACJD,IAAiB,cAE1BC,EAAa,yCAGbA,EAAaH,EAAO,MAGtB,MAAMK,EAAa,CAACF,EAAYF,EAAWP,EAAM,KAAK,EAAE,OAAO,OAAO,EAAE,KAAK,GAAG,EAEhF,MAAO,CACL,QAASQ,EACT,MAAOG,CAAA,CAEX,CAAC,EAKKD,EAAwBE,IACqB,CAC/C,QAAS,gCACT,QAAS,gCACT,QAAS,kCACT,QAAS,kCACT,OAAQ,6BAAA,GAEWA,CAAS,GAAK,iBAKnCC,EAAAA,UAAA,EAAAC,EAAAA,YAEQC,EAAAA,8CAFOX,EAAA,KAAM,CAAA,EAAA,mBACnB,IAAQ,CAARY,aAAQC,EAAA,OAAA,SAAA,CAAA"}
@@ -1 +1 @@
1
- {"version":3,"file":"JBadge.vue.js","sources":["../../../../src/components/atoms/JBadge.vue"],"sourcesContent":["<script setup lang=\"ts\">\r\nimport { computed } from 'vue'\r\nimport Badge from '@/components/shadcn/Badge.vue'\r\n\r\ntype StyleType =\r\n | 'default' // 기본 스타일\r\n | 'primary' // 강조 스타일 (파랑)\r\n | 'success' // 성공 스타일 (초록)\r\n | 'warning' // 경고 스타일 (주황)\r\n | 'danger' // 위험 스타일 (빨강)\r\n\r\nconst props = withDefaults(\r\n defineProps<{\r\n variant?: 'default' | 'secondary' | 'destructive' | 'outline'\r\n class?: string\r\n /** 스타일 프리셋 */\r\n styletype?: StyleType\r\n /** 배지 크기 */\n size?: 'xs' | 'sm' | 'md' | 'lg'\n }>(),\r\n {\n variant: 'default',\n styletype: 'default',\n size: 'sm',\n },\n)\r\n\r\n/**\r\n * styletype -> variant, class 매핑\r\n */\r\nconst STYLE_PRESETS: Record<StyleType, { variant?: string; class: string }> = {\r\n default: { class: '' },\r\n primary: { \r\n variant: 'default',\r\n class: 'bg-blue-500 text-white hover:bg-blue-600',\r\n },\r\n success: { \r\n variant: 'default',\r\n class: 'bg-green-500 text-white hover:bg-green-600',\r\n },\r\n warning: { \r\n variant: 'default',\r\n class: 'bg-amber-500 text-white hover:bg-amber-600',\r\n },\r\n danger: { \r\n variant: 'default',\r\n class: 'bg-red-500 text-white hover:bg-red-600',\r\n },\r\n}\r\n\r\n/**\r\n * size -> class 매핑\r\n */\r\nconst SIZE_PRESETS: Record<'xs' | 'sm' | 'md' | 'lg', string> = {\n xs: 'text-[10px] px-1 py-0.5 leading-tight',\n sm: 'text-xs px-1.5 py-0.5',\n md: 'text-xs px-2 py-1',\n lg: 'text-sm px-2.5 py-1',\n}\n\r\n/** 최종 바인딩: 직접 넘긴 props가 있으면 styletype 기본값과 병합 */\r\nconst mapped = computed(() => {\r\n const preset = STYLE_PRESETS[props.styletype!]\r\n const sizeClass = SIZE_PRESETS[props.size!]\r\n \r\n const finalVariant = props.variant || preset.variant\r\n let styleClass = ''\r\n \r\n // variant에 따른 스타일 처리\r\n if (finalVariant === 'outline') {\r\n // outline: 테두리 색상만 적용 (styletype 색상 사용)\r\n styleClass = getOutlineStyleClass(props.styletype!)\r\n } else if (finalVariant === 'secondary') {\r\n // secondary: 고정된 회색 계열 스타일 (styletype 무시)\r\n styleClass = 'bg-gray-100 text-gray-800 hover:bg-gray-200'\r\n } else if (finalVariant === 'destructive') {\r\n // destructive: 고정된 빨간색 계열 스타일 (styletype 무시)\r\n styleClass = 'bg-red-500 text-white hover:bg-red-600'\r\n } else {\r\n // default: styletype의 배경색 스타일 적용\r\n styleClass = preset.class\r\n }\r\n \r\n const finalClass = [styleClass, sizeClass, props.class].filter(Boolean).join(' ')\r\n \r\n return {\r\n variant: finalVariant,\r\n class: finalClass,\r\n }\r\n})\r\n\r\n/**\r\n * outline variant용 스타일 클래스\r\n */\r\nconst getOutlineStyleClass = (styletype: StyleType): string => {\r\n const outlineStyles: Record<StyleType, string> = {\r\n default: 'border-gray-300 text-gray-700',\r\n primary: 'border-blue-500 text-blue-600',\r\n success: 'border-green-500 text-green-600',\r\n warning: 'border-amber-500 text-amber-600',\r\n danger: 'border-red-500 text-red-600',\r\n }\r\n return outlineStyles[styletype] || ''\r\n}\r\n</script>\r\n\r\n<template>\r\n <Badge v-bind=\"mapped\">\r\n <slot />\r\n </Badge>\r\n</template>\r\n"],"names":["props","__props","STYLE_PRESETS","SIZE_PRESETS","mapped","computed","preset","sizeClass","finalVariant","styleClass","getOutlineStyleClass","finalClass","styletype","_openBlock","_createBlock","Badge","_renderSlot","_ctx"],"mappings":";;;;;;;;;;;AAWA,UAAMA,IAAQC,GAmBRC,IAAwE;AAAA,MAC5E,SAAS,EAAE,OAAO,GAAA;AAAA,MAClB,SAAS;AAAA,QACP,SAAS;AAAA,QACT,OAAO;AAAA,MAAA;AAAA,MAET,SAAS;AAAA,QACP,SAAS;AAAA,QACT,OAAO;AAAA,MAAA;AAAA,MAET,SAAS;AAAA,QACP,SAAS;AAAA,QACT,OAAO;AAAA,MAAA;AAAA,MAET,QAAQ;AAAA,QACN,SAAS;AAAA,QACT,OAAO;AAAA,MAAA;AAAA,IACT,GAMIC,IAA0D;AAAA,MAC9D,IAAI;AAAA,MACJ,IAAI;AAAA,MACJ,IAAI;AAAA,MACJ,IAAI;AAAA,IAAA,GAIAC,IAASC,EAAS,MAAM;AAC5B,YAAMC,IAASJ,EAAcF,EAAM,SAAU,GACvCO,IAAYJ,EAAaH,EAAM,IAAK,GAEpCQ,IAAeR,EAAM,WAAWM,EAAO;AAC7C,UAAIG,IAAa;AAGjB,MAAID,MAAiB,YAEnBC,IAAaC,EAAqBV,EAAM,SAAU,IACzCQ,MAAiB,cAE1BC,IAAa,gDACJD,MAAiB,gBAE1BC,IAAa,2CAGbA,IAAaH,EAAO;AAGtB,YAAMK,IAAa,CAACF,GAAYF,GAAWP,EAAM,KAAK,EAAE,OAAO,OAAO,EAAE,KAAK,GAAG;AAEhF,aAAO;AAAA,QACL,SAASQ;AAAA,QACT,OAAOG;AAAA,MAAA;AAAA,IAEX,CAAC,GAKKD,IAAuB,CAACE,OACqB;AAAA,MAC/C,SAAS;AAAA,MACT,SAAS;AAAA,MACT,SAAS;AAAA,MACT,SAAS;AAAA,MACT,QAAQ;AAAA,IAAA,GAEWA,CAAS,KAAK;sBAKnCC,EAAA,GAAAC,EAEQC,OAFOX,EAAA,KAAM,CAAA,GAAA;AAAA,iBACnB,MAAQ;AAAA,QAARY,EAAQC,EAAA,QAAA,SAAA;AAAA,MAAA;;;;;"}
1
+ {"version":3,"file":"JBadge.vue.js","sources":["../../../../src/components/atoms/JBadge.vue"],"sourcesContent":["<script setup lang=\"ts\">\nimport { computed } from 'vue'\nimport Badge from '@/components/shadcn/Badge.vue'\n\ntype StyleType =\n | 'default' // 기본 스타일\n | 'primary' // 강조 스타일 (파랑)\n | 'success' // 성공 스타일 (초록)\n | 'warning' // 경고 스타일 (주황)\n | 'danger' // 위험 스타일 (빨강)\n\nconst props = withDefaults(\n defineProps<{\n variant?: 'default' | 'secondary' | 'destructive' | 'outline'\n class?: string\n /** 스타일 프리셋 */\n styletype?: StyleType\n /** 배지 크기 */\n size?: 'xs' | 'sm' | 'md' | 'lg'\n }>(),\n {\n variant: 'default',\n styletype: 'default',\n size: 'sm',\n },\n)\n\n/**\n * styletype -> variant, class 매핑\n */\nconst STYLE_PRESETS: Record<StyleType, { variant?: string; class: string }> = {\n default: { class: '' },\n primary: { \n variant: 'default',\n class: 'bg-blue-500 text-white hover:bg-blue-600',\n },\n success: { \n variant: 'default',\n class: 'bg-green-500 text-white hover:bg-green-600',\n },\n warning: { \n variant: 'default',\n class: 'bg-amber-500 text-white hover:bg-amber-600',\n },\n danger: { \n variant: 'default',\n class: 'bg-red-500 text-white hover:bg-red-600',\n },\n}\n\n/**\n * size -> class 매핑\n */\nconst SIZE_PRESETS: Record<'xs' | 'sm' | 'md' | 'lg', string> = {\n xs: 'text-[10px] px-1 py-0.5 leading-tight',\n sm: 'text-xs px-1.5 py-0.5',\n md: 'text-xs px-2 py-1',\n lg: 'text-sm px-2.5 py-1',\n}\n\n/** 최종 바인딩: 직접 넘긴 props가 있으면 styletype 기본값과 병합 */\nconst mapped = computed(() => {\n const preset = STYLE_PRESETS[props.styletype!]\n const sizeClass = SIZE_PRESETS[props.size!]\n \n const finalVariant = props.variant || preset.variant\n let styleClass = ''\n \n // variant에 따른 스타일 처리\n if (finalVariant === 'outline') {\n // outline: 테두리 색상만 적용 (styletype 색상 사용)\n styleClass = getOutlineStyleClass(props.styletype!)\n } else if (finalVariant === 'secondary') {\n // secondary: 고정된 회색 계열 스타일 (styletype 무시)\n styleClass = 'bg-gray-100 text-gray-800 hover:bg-gray-200'\n } else if (finalVariant === 'destructive') {\n // destructive: 고정된 빨간색 계열 스타일 (styletype 무시)\n styleClass = 'bg-red-500 text-white hover:bg-red-600'\n } else {\n // default: styletype의 배경색 스타일 적용\n styleClass = preset.class\n }\n \n const finalClass = [styleClass, sizeClass, props.class].filter(Boolean).join(' ')\n \n return {\n variant: finalVariant,\n class: finalClass,\n }\n})\n\n/**\n * outline variant용 스타일 클래스\n */\nconst getOutlineStyleClass = (styletype: StyleType): string => {\n const outlineStyles: Record<StyleType, string> = {\n default: 'border-gray-300 text-gray-700',\n primary: 'border-blue-500 text-blue-600',\n success: 'border-green-500 text-green-600',\n warning: 'border-amber-500 text-amber-600',\n danger: 'border-red-500 text-red-600',\n }\n return outlineStyles[styletype] || ''\n}\n</script>\n\n<template>\n <Badge v-bind=\"mapped\">\n <slot />\n </Badge>\n</template>\n"],"names":["props","__props","STYLE_PRESETS","SIZE_PRESETS","mapped","computed","preset","sizeClass","finalVariant","styleClass","getOutlineStyleClass","finalClass","styletype","_openBlock","_createBlock","Badge","_renderSlot","_ctx"],"mappings":";;;;;;;;;;;AAWA,UAAMA,IAAQC,GAmBRC,IAAwE;AAAA,MAC5E,SAAS,EAAE,OAAO,GAAA;AAAA,MAClB,SAAS;AAAA,QACP,SAAS;AAAA,QACT,OAAO;AAAA,MAAA;AAAA,MAET,SAAS;AAAA,QACP,SAAS;AAAA,QACT,OAAO;AAAA,MAAA;AAAA,MAET,SAAS;AAAA,QACP,SAAS;AAAA,QACT,OAAO;AAAA,MAAA;AAAA,MAET,QAAQ;AAAA,QACN,SAAS;AAAA,QACT,OAAO;AAAA,MAAA;AAAA,IACT,GAMIC,IAA0D;AAAA,MAC9D,IAAI;AAAA,MACJ,IAAI;AAAA,MACJ,IAAI;AAAA,MACJ,IAAI;AAAA,IAAA,GAIAC,IAASC,EAAS,MAAM;AAC5B,YAAMC,IAASJ,EAAcF,EAAM,SAAU,GACvCO,IAAYJ,EAAaH,EAAM,IAAK,GAEpCQ,IAAeR,EAAM,WAAWM,EAAO;AAC7C,UAAIG,IAAa;AAGjB,MAAID,MAAiB,YAEnBC,IAAaC,EAAqBV,EAAM,SAAU,IACzCQ,MAAiB,cAE1BC,IAAa,gDACJD,MAAiB,gBAE1BC,IAAa,2CAGbA,IAAaH,EAAO;AAGtB,YAAMK,IAAa,CAACF,GAAYF,GAAWP,EAAM,KAAK,EAAE,OAAO,OAAO,EAAE,KAAK,GAAG;AAEhF,aAAO;AAAA,QACL,SAASQ;AAAA,QACT,OAAOG;AAAA,MAAA;AAAA,IAEX,CAAC,GAKKD,IAAuB,CAACE,OACqB;AAAA,MAC/C,SAAS;AAAA,MACT,SAAS;AAAA,MACT,SAAS;AAAA,MACT,SAAS;AAAA,MACT,QAAQ;AAAA,IAAA,GAEWA,CAAS,KAAK;sBAKnCC,EAAA,GAAAC,EAEQC,OAFOX,EAAA,KAAM,CAAA,GAAA;AAAA,iBACnB,MAAQ;AAAA,QAARY,EAAQC,EAAA,QAAA,SAAA;AAAA,MAAA;;;;;"}
@@ -3,5 +3,5 @@
3
3
  for (const [t_key, t_val] of t_opts)
4
4
  t_merged[t_key] = t_val;
5
5
  return t_merged;
6
- };,u=t(e.default,[["__scopeId","data-v-90794cf0"]]);exports.default=u;
6
+ };,u=t(e.default,[["__scopeId","data-v-9058e7ee"]]);exports.default=u;
7
7
  //# sourceMappingURL=JButton.vue.cjs.map
@@ -6,7 +6,7 @@ const t = (t_comp, t_opts) => {
6
6
  t_merged[t_key] = t_val;
7
7
  return t_merged;
8
8
  };
9
- const p = /* @__PURE__ */ t(o, [["__scopeId", "data-v-90794cf0"]]);
9
+ const p = /* @__PURE__ */ t(o, [["__scopeId", "data-v-9058e7ee"]]);
10
10
  export {
11
11
  p as default
12
12
  };
@@ -1 +1 @@
1
- {"version":3,"file":"JButton.vue2.cjs","sources":["../../../../src/components/atoms/JButton.vue"],"sourcesContent":["<script setup lang=\"ts\">\r\nimport { computed } from 'vue'\r\nimport { Loader2 } from 'lucide-vue-next'\r\nimport { Button, type ButtonVariants } from '@/components/shadcn'\r\n\r\ntype StyleType =\r\n | 'default' // 기본 스타일 (primary)\r\n | 'primary' // 강조 버튼 (파랑)\r\n | 'secondary' // 보조 버튼 (회색)\r\n | 'success' // 성공 버튼 (초록)\r\n | 'warning' // 경고 버튼 (주황)\r\n | 'danger' // 위험 버튼 (빨강)\r\n | 'outline' // 아웃라인 버튼\r\n | 'ghost' // 고스트 버튼\r\n | 'link' // 링크 스타일\r\n | 'sm' // 작은 크기\r\n | 'lg' // 큰 크기\r\n | 'icon' // 아이콘 전용\r\n\r\nconst props = withDefaults(\r\n defineProps<{\r\n /** 버튼 타입 */\r\n type?: 'button' | 'submit' | 'reset'\r\n /** 비활성화 상태 */\r\n disabled?: boolean\r\n /** 로딩 상태 */\r\n loading?: boolean\r\n /** shadcn variant */\r\n variant?: ButtonVariants['variant']\r\n /** shadcn size */\r\n size?: ButtonVariants['size']\r\n /** 추가 CSS 클래스 */\r\n class?: string\r\n /** 스타일 프리셋 (variant + size 조합) */\r\n styletype?: StyleType\r\n }>(),\r\n {\r\n type: 'button',\r\n disabled: false,\r\n loading: false,\r\n styletype: 'default',\r\n },\r\n)\r\n\r\nconst emit = defineEmits<{\r\n click: [event: MouseEvent]\r\n}>()\r\n\r\n/**\r\n * styletype -> variant/size 매핑\r\n */\r\nconst STYLE_PRESETS: Record<StyleType, { variant: ButtonVariants['variant']; size?: ButtonVariants['size']; class?: string }> = {\r\n default: { \r\n variant: 'default',\r\n },\r\n primary: { \r\n variant: 'default',\r\n },\r\n secondary: { \r\n variant: 'secondary',\r\n },\r\n success: { \r\n variant: 'default',\r\n class: 'bg-green-600 hover:bg-green-700',\r\n },\r\n warning: { \r\n variant: 'default',\r\n class: 'bg-amber-500 hover:bg-amber-600',\r\n },\r\n danger: { \r\n variant: 'destructive',\r\n },\r\n outline: { \r\n variant: 'outline',\r\n },\r\n ghost: { \r\n variant: 'ghost',\r\n },\r\n link: { \r\n variant: 'link',\r\n },\r\n sm: { \r\n variant: 'default',\r\n size: 'sm',\r\n },\r\n lg: { \r\n variant: 'default',\r\n size: 'lg',\r\n },\r\n icon: { \r\n variant: 'default',\r\n size: 'icon',\r\n },\r\n}\r\n\r\nconst preset = computed(() => {\r\n const styleKey = props.styletype || 'default'\r\n return STYLE_PRESETS[styleKey] ?? STYLE_PRESETS.default\r\n})\r\n\r\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\r\nconst isDisabled = computed(() => props.disabled || props.loading)\r\n\r\nconst handleClick = (event: MouseEvent) => {\r\n if (!isDisabled.value) {\r\n emit('click', event)\r\n }\r\n}\r\n</script>\r\n\r\n<template>\r\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: all 0.2s ease;\n}\n\n:deep(button:not(:disabled):hover) {\n transform: translateY(-1px);\n box-shadow: 0 1px 2px 0 rgb(0 0 0 / 0.05);\n}\n\n:deep(button:not(:disabled):active) {\n transform: translateY(0);\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"}
1
+ {"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: all 0.2s ease;\n}\n\n:deep(button:not(:disabled):hover) {\n transform: translateY(-1px);\n box-shadow: 0 1px 2px 0 rgb(0 0 0 / 0.05);\n}\n\n:deep(button:not(:disabled):active) {\n transform: translateY(0);\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"}
@@ -1 +1 @@
1
- {"version":3,"file":"JButton.vue2.js","sources":["../../../../src/components/atoms/JButton.vue"],"sourcesContent":["<script setup lang=\"ts\">\r\nimport { computed } from 'vue'\r\nimport { Loader2 } from 'lucide-vue-next'\r\nimport { Button, type ButtonVariants } from '@/components/shadcn'\r\n\r\ntype StyleType =\r\n | 'default' // 기본 스타일 (primary)\r\n | 'primary' // 강조 버튼 (파랑)\r\n | 'secondary' // 보조 버튼 (회색)\r\n | 'success' // 성공 버튼 (초록)\r\n | 'warning' // 경고 버튼 (주황)\r\n | 'danger' // 위험 버튼 (빨강)\r\n | 'outline' // 아웃라인 버튼\r\n | 'ghost' // 고스트 버튼\r\n | 'link' // 링크 스타일\r\n | 'sm' // 작은 크기\r\n | 'lg' // 큰 크기\r\n | 'icon' // 아이콘 전용\r\n\r\nconst props = withDefaults(\r\n defineProps<{\r\n /** 버튼 타입 */\r\n type?: 'button' | 'submit' | 'reset'\r\n /** 비활성화 상태 */\r\n disabled?: boolean\r\n /** 로딩 상태 */\r\n loading?: boolean\r\n /** shadcn variant */\r\n variant?: ButtonVariants['variant']\r\n /** shadcn size */\r\n size?: ButtonVariants['size']\r\n /** 추가 CSS 클래스 */\r\n class?: string\r\n /** 스타일 프리셋 (variant + size 조합) */\r\n styletype?: StyleType\r\n }>(),\r\n {\r\n type: 'button',\r\n disabled: false,\r\n loading: false,\r\n styletype: 'default',\r\n },\r\n)\r\n\r\nconst emit = defineEmits<{\r\n click: [event: MouseEvent]\r\n}>()\r\n\r\n/**\r\n * styletype -> variant/size 매핑\r\n */\r\nconst STYLE_PRESETS: Record<StyleType, { variant: ButtonVariants['variant']; size?: ButtonVariants['size']; class?: string }> = {\r\n default: { \r\n variant: 'default',\r\n },\r\n primary: { \r\n variant: 'default',\r\n },\r\n secondary: { \r\n variant: 'secondary',\r\n },\r\n success: { \r\n variant: 'default',\r\n class: 'bg-green-600 hover:bg-green-700',\r\n },\r\n warning: { \r\n variant: 'default',\r\n class: 'bg-amber-500 hover:bg-amber-600',\r\n },\r\n danger: { \r\n variant: 'destructive',\r\n },\r\n outline: { \r\n variant: 'outline',\r\n },\r\n ghost: { \r\n variant: 'ghost',\r\n },\r\n link: { \r\n variant: 'link',\r\n },\r\n sm: { \r\n variant: 'default',\r\n size: 'sm',\r\n },\r\n lg: { \r\n variant: 'default',\r\n size: 'lg',\r\n },\r\n icon: { \r\n variant: 'default',\r\n size: 'icon',\r\n },\r\n}\r\n\r\nconst preset = computed(() => {\r\n const styleKey = props.styletype || 'default'\r\n return STYLE_PRESETS[styleKey] ?? STYLE_PRESETS.default\r\n})\r\n\r\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\r\nconst isDisabled = computed(() => props.disabled || props.loading)\r\n\r\nconst handleClick = (event: MouseEvent) => {\r\n if (!isDisabled.value) {\r\n emit('click', event)\r\n }\r\n}\r\n</script>\r\n\r\n<template>\r\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: all 0.2s ease;\n}\n\n:deep(button:not(:disabled):hover) {\n transform: translateY(-1px);\n box-shadow: 0 1px 2px 0 rgb(0 0 0 / 0.05);\n}\n\n:deep(button:not(:disabled):active) {\n transform: translateY(0);\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":";;;;;;;;;;;;;;;;;AAmBA,UAAMA,IAAQC,GAyBRC,IAAOC,GAOPC,IAA0H;AAAA,MAC9H,SAAS;AAAA,QACP,SAAS;AAAA,MAAA;AAAA,MAEX,SAAS;AAAA,QACP,SAAS;AAAA,MAAA;AAAA,MAEX,WAAW;AAAA,QACT,SAAS;AAAA,MAAA;AAAA,MAEX,SAAS;AAAA,QACP,SAAS;AAAA,QACT,OAAO;AAAA,MAAA;AAAA,MAET,SAAS;AAAA,QACP,SAAS;AAAA,QACT,OAAO;AAAA,MAAA;AAAA,MAET,QAAQ;AAAA,QACN,SAAS;AAAA,MAAA;AAAA,MAEX,SAAS;AAAA,QACP,SAAS;AAAA,MAAA;AAAA,MAEX,OAAO;AAAA,QACL,SAAS;AAAA,MAAA;AAAA,MAEX,MAAM;AAAA,QACJ,SAAS;AAAA,MAAA;AAAA,MAEX,IAAI;AAAA,QACF,SAAS;AAAA,QACT,MAAM;AAAA,MAAA;AAAA,MAER,IAAI;AAAA,QACF,SAAS;AAAA,QACT,MAAM;AAAA,MAAA;AAAA,MAER,MAAM;AAAA,QACJ,SAAS;AAAA,QACT,MAAM;AAAA,MAAA;AAAA,IACR,GAGIC,IAASC,EAAS,MAAM;AAC5B,YAAMC,IAAWP,EAAM,aAAa;AACpC,aAAOI,EAAcG,CAAQ,KAAKH,EAAc;AAAA,IAClD,CAAC,GAEKI,IAAeF,EAAS,MAAMN,EAAM,WAAWK,EAAO,OAAO,OAAO,GACpEI,IAAYH,EAAS,MAAMN,EAAM,QAAQK,EAAO,OAAO,QAAQ,IAAI,GACnEK,IAAaJ,EAAS,MAAM,CAACD,EAAO,OAAO,OAAOL,EAAM,KAAK,EAAE,OAAO,OAAO,EAAE,KAAK,GAAG,CAAC,GAExFW,IAAaL,EAAS,MAAMN,EAAM,YAAYA,EAAM,OAAO,GAE3DY,IAAc,CAACC,MAAsB;AACzC,MAAKF,EAAW,SACdT,EAAK,SAASW,CAAK;AAAA,IAEvB;2BAIEC,EAUSC,EAAAC,CAAA,GAAA;AAAA,MATN,MAAMf,EAAA;AAAA,MACN,SAASO,EAAA;AAAA,MACT,MAAMC,EAAA;AAAA,MACN,SAAOC,EAAA,KAAU;AAAA,MACjB,UAAUC,EAAA;AAAA,MACV,SAAOC;AAAA,IAAA;iBAER,MAA4D;AAAA,QAA7CX,EAAA,gBAAfa,EAA4DC,EAAAE,CAAA,GAAA;AAAA;UAApC,OAAM;AAAA,QAAA;QAC9BC,EAAQC,EAAA,QAAA,WAAA,CAAA,GAAA,QAAA,EAAA;AAAA,MAAA;;;;;"}
1
+ {"version":3,"file":"JButton.vue2.js","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: all 0.2s ease;\n}\n\n:deep(button:not(:disabled):hover) {\n transform: translateY(-1px);\n box-shadow: 0 1px 2px 0 rgb(0 0 0 / 0.05);\n}\n\n:deep(button:not(:disabled):active) {\n transform: translateY(0);\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":";;;;;;;;;;;;;;;;;AAmBA,UAAMA,IAAQC,GAyBRC,IAAOC,GAOPC,IAA0H;AAAA,MAC9H,SAAS;AAAA,QACP,SAAS;AAAA,MAAA;AAAA,MAEX,SAAS;AAAA,QACP,SAAS;AAAA,MAAA;AAAA,MAEX,WAAW;AAAA,QACT,SAAS;AAAA,MAAA;AAAA,MAEX,SAAS;AAAA,QACP,SAAS;AAAA,QACT,OAAO;AAAA,MAAA;AAAA,MAET,SAAS;AAAA,QACP,SAAS;AAAA,QACT,OAAO;AAAA,MAAA;AAAA,MAET,QAAQ;AAAA,QACN,SAAS;AAAA,MAAA;AAAA,MAEX,SAAS;AAAA,QACP,SAAS;AAAA,MAAA;AAAA,MAEX,OAAO;AAAA,QACL,SAAS;AAAA,MAAA;AAAA,MAEX,MAAM;AAAA,QACJ,SAAS;AAAA,MAAA;AAAA,MAEX,IAAI;AAAA,QACF,SAAS;AAAA,QACT,MAAM;AAAA,MAAA;AAAA,MAER,IAAI;AAAA,QACF,SAAS;AAAA,QACT,MAAM;AAAA,MAAA;AAAA,MAER,MAAM;AAAA,QACJ,SAAS;AAAA,QACT,MAAM;AAAA,MAAA;AAAA,IACR,GAGIC,IAASC,EAAS,MAAM;AAC5B,YAAMC,IAAWP,EAAM,aAAa;AACpC,aAAOI,EAAcG,CAAQ,KAAKH,EAAc;AAAA,IAClD,CAAC,GAEKI,IAAeF,EAAS,MAAMN,EAAM,WAAWK,EAAO,OAAO,OAAO,GACpEI,IAAYH,EAAS,MAAMN,EAAM,QAAQK,EAAO,OAAO,QAAQ,IAAI,GACnEK,IAAaJ,EAAS,MAAM,CAACD,EAAO,OAAO,OAAOL,EAAM,KAAK,EAAE,OAAO,OAAO,EAAE,KAAK,GAAG,CAAC,GAExFW,IAAaL,EAAS,MAAMN,EAAM,YAAYA,EAAM,OAAO,GAE3DY,IAAc,CAACC,MAAsB;AACzC,MAAKF,EAAW,SACdT,EAAK,SAASW,CAAK;AAAA,IAEvB;2BAIEC,EAUSC,EAAAC,CAAA,GAAA;AAAA,MATN,MAAMf,EAAA;AAAA,MACN,SAASO,EAAA;AAAA,MACT,MAAMC,EAAA;AAAA,MACN,SAAOC,EAAA,KAAU;AAAA,MACjB,UAAUC,EAAA;AAAA,MACV,SAAOC;AAAA,IAAA;iBAER,MAA4D;AAAA,QAA7CX,EAAA,gBAAfa,EAA4DC,EAAAE,CAAA,GAAA;AAAA;UAApC,OAAM;AAAA,QAAA;QAC9BC,EAAQC,EAAA,QAAA,WAAA,CAAA,GAAA,QAAA,EAAA;AAAA,MAAA;;;;;"}
@@ -1 +1 @@
1
- {"version":3,"file":"JCombo.vue.cjs","sources":["../../../../src/components/atoms/JCombo.vue"],"sourcesContent":["<script setup lang=\"ts\">\r\nimport { computed } from 'vue'\r\nimport { Select, SelectContent, SelectItem, SelectTrigger, SelectValue } from '@/components/shadcn'\r\n\r\n// 빈 문자열 value를 위한 내부 플레이스홀더\r\n// reka-ui SelectItem이 빈 문자열을 처리하지 못하는 버그 우회\r\nconst EMPTY_VALUE_PLACEHOLDER = '__EMPTY_STRING__'\r\n\r\nexport interface Option {\r\n value: string | number\r\n label: string\r\n}\r\n\r\ntype StyleType =\r\n | 'default' // 기본 스타일\r\n | 'error' // 에러 상태\r\n | 'success' // 성공 상태\r\n | 'warning' // 경고 상태\r\n | 'sm' // 작은 크기\r\n | 'lg' // 큰 크기\r\n\r\nconst props = withDefaults(\r\n defineProps<{\r\n modelValue?: string | number\r\n options?: Option[]\r\n placeholder?: string\r\n disabled?: boolean\r\n required?: boolean\r\n name?: string\r\n id?: string\r\n multiple?: boolean\r\n class?: string\r\n /** 스타일 프리셋 */\r\n styletype?: StyleType\r\n }>(),\r\n {\r\n options: () => [],\r\n placeholder: '선택하세요',\r\n disabled: false,\r\n required: false,\r\n multiple: false,\r\n styletype: 'default',\r\n },\r\n)\r\n\r\nconst emit = defineEmits<{\r\n 'update:modelValue': [value: string | number]\r\n 'change': [value: string | number]\r\n 'focus': [event: FocusEvent]\r\n 'blur': [event: FocusEvent]\r\n}>()\r\n\r\n/**\r\n * styletype -> class 매핑\r\n */\r\nconst STYLE_PRESETS: Record<StyleType, { class: string }> = {\r\n default: { class: '' },\r\n error: { \r\n class: 'border-destructive focus:ring-destructive',\r\n },\r\n success: { \r\n class: 'border-green-500 focus:ring-green-500',\r\n },\r\n warning: { \r\n class: 'border-amber-500 focus:ring-amber-500',\r\n },\r\n sm: { \r\n class: 'h-8 text-xs px-2',\r\n },\r\n lg: { \r\n class: 'h-12 text-base px-4',\r\n },\r\n}\r\n\r\nconst triggerClass = computed(() => {\r\n const styleKey = props.styletype || 'default'\r\n const preset = STYLE_PRESETS[styleKey] ?? STYLE_PRESETS.default\r\n return [preset?.class, props.class].filter(Boolean).join(' ')\r\n})\r\n\r\n/**\r\n * 외부 value를 내부 value로 변환\r\n * 빈 문자열 -> __EMPTY_STRING__\r\n */\r\nconst toInternalValue = (value: string | number | undefined): string => {\r\n if (value === '' || value === undefined) {\r\n return EMPTY_VALUE_PLACEHOLDER\r\n }\r\n return String(value)\r\n}\r\n\r\n/**\r\n * 내부 value를 외부 value로 변환\r\n * __EMPTY_STRING__ -> ''\r\n */\r\nconst toExternalValue = (value: string): string | number => {\r\n if (value === EMPTY_VALUE_PLACEHOLDER) {\r\n return ''\r\n }\r\n return value\r\n}\r\n\r\n/**\r\n * 옵션의 value를 내부 형식으로 변환\r\n * 빈 문자열 value를 가진 옵션 -> __EMPTY_STRING__으로 변환\r\n */\r\nconst processedOptions = computed(() => {\r\n return props.options.map((option) => ({\r\n ...option,\r\n value: toInternalValue(option.value),\r\n }))\r\n})\r\n\r\n/**\r\n * 현재 modelValue를 내부 형식으로 변환\r\n */\r\nconst internalModelValue = computed(() => toInternalValue(props.modelValue))\r\n\r\nconst handleChange = (internalValue: string) => {\r\n const externalValue = toExternalValue(internalValue)\r\n emit('update:modelValue', externalValue)\r\n emit('change', externalValue)\r\n}\r\n</script>\r\n\r\n<template>\r\n <Select\r\n :model-value=\"internalModelValue\"\r\n :disabled=\"disabled\"\r\n :required=\"required\"\r\n :name=\"name\"\r\n @update:model-value=\"(value) => handleChange(value as string)\"\r\n @focus=\"emit('focus', $event as FocusEvent)\"\r\n @blur=\"emit('blur', $event as FocusEvent)\"\r\n >\r\n <SelectTrigger :id=\"id\" :class=\"triggerClass\">\r\n <SelectValue :placeholder=\"placeholder\" />\r\n </SelectTrigger>\r\n <SelectContent>\r\n <SelectItem\r\n v-for=\"option in processedOptions\"\r\n :key=\"option.value\"\r\n :value=\"option.value\"\r\n >\r\n {{ option.label }}\r\n </SelectItem>\r\n </SelectContent>\r\n </Select>\r\n</template>\r\n"],"names":["EMPTY_VALUE_PLACEHOLDER","props","__props","emit","__emit","STYLE_PRESETS","triggerClass","computed","styleKey","toInternalValue","value","toExternalValue","processedOptions","option","internalModelValue","handleChange","internalValue","externalValue","_createBlock","_unref","Select","_cache","$event","_createVNode","SelectTrigger","SelectValue","SelectContent","_createElementBlock","_Fragment","_renderList","SelectItem","_createTextVNode","_toDisplayString"],"mappings":"6XAMMA,EAA0B,yWAehC,MAAMC,EAAQC,EAwBRC,EAAOC,EAUPC,EAAsD,CAC1D,QAAS,CAAE,MAAO,EAAA,EAClB,MAAO,CACL,MAAO,2CAAA,EAET,QAAS,CACP,MAAO,uCAAA,EAET,QAAS,CACP,MAAO,uCAAA,EAET,GAAI,CACF,MAAO,kBAAA,EAET,GAAI,CACF,MAAO,qBAAA,CACT,EAGIC,EAAeC,EAAAA,SAAS,IAAM,CAClC,MAAMC,EAAWP,EAAM,WAAa,UAEpC,MAAO,EADQI,EAAcG,CAAQ,GAAKH,EAAc,UACxC,MAAOJ,EAAM,KAAK,EAAE,OAAO,OAAO,EAAE,KAAK,GAAG,CAC9D,CAAC,EAMKQ,EAAmBC,GACnBA,IAAU,IAAMA,IAAU,OACrBV,EAEF,OAAOU,CAAK,EAOfC,EAAmBD,GACnBA,IAAUV,EACL,GAEFU,EAOHE,EAAmBL,EAAAA,SAAS,IACzBN,EAAM,QAAQ,IAAKY,IAAY,CACpC,GAAGA,EACH,MAAOJ,EAAgBI,EAAO,KAAK,CAAA,EACnC,CACH,EAKKC,EAAqBP,EAAAA,SAAS,IAAME,EAAgBR,EAAM,UAAU,CAAC,EAErEc,EAAgBC,GAA0B,CAC9C,MAAMC,EAAgBN,EAAgBK,CAAa,EACnDb,EAAK,oBAAqBc,CAAa,EACvCd,EAAK,SAAUc,CAAa,CAC9B,8BAIEC,EAAAA,YAqBSC,EAAAA,MAAAC,EAAAA,OAAA,EAAA,CApBN,cAAaN,EAAA,MACb,SAAUZ,EAAA,SACV,SAAUA,EAAA,SACV,KAAMA,EAAA,KACN,sBAAkBmB,EAAA,CAAA,IAAAA,EAAA,CAAA,EAAGX,GAAUK,EAAaL,CAAK,GACjD,QAAKW,EAAA,CAAA,IAAAA,EAAA,CAAA,EAAAC,GAAEnB,EAAI,QAAUmB,CAAM,GAC3B,OAAID,EAAA,CAAA,IAAAA,EAAA,CAAA,EAAAC,GAAEnB,EAAI,OAASmB,CAAM,EAAA,qBAE1B,IAEgB,CAFhBC,cAEgBJ,EAAAA,MAAAK,EAAAA,OAAA,EAAA,CAFA,GAAItB,EAAA,GAAK,uBAAOI,EAAA,KAAY,CAAA,qBAC1C,IAA0C,CAA1CiB,EAAAA,YAA0CJ,EAAAA,MAAAM,SAAA,EAAA,CAA5B,YAAavB,EAAA,aAAW,KAAA,EAAA,CAAA,aAAA,CAAA,CAAA,0BAExCqB,EAAAA,YAQgBJ,EAAAA,MAAAO,SAAA,EAAA,KAAA,mBANZ,IAAkC,kBADpCC,EAAAA,mBAMaC,EAAAA,SAAA,KAAAC,EAAAA,WALMjB,EAAA,MAAVC,kBADTK,EAAAA,YAMaC,EAAAA,MAAAW,EAAAA,OAAA,EAAA,CAJV,IAAKjB,EAAO,MACZ,MAAOA,EAAO,KAAA,qBAEf,IAAkB,CAAfkB,EAAAA,gBAAAC,EAAAA,gBAAAnB,EAAO,KAAK,EAAA,CAAA,CAAA"}
1
+ {"version":3,"file":"JCombo.vue.cjs","sources":["../../../../src/components/atoms/JCombo.vue"],"sourcesContent":["<script setup lang=\"ts\">\nimport { computed } from 'vue'\nimport { Select, SelectContent, SelectItem, SelectTrigger, SelectValue } from '@/components/shadcn'\n\n// 빈 문자열 value를 위한 내부 플레이스홀더\n// reka-ui SelectItem이 빈 문자열을 처리하지 못하는 버그 우회\nconst EMPTY_VALUE_PLACEHOLDER = '__EMPTY_STRING__'\n\nexport interface Option {\n value: string | number\n label: string\n}\n\ntype StyleType =\n | 'default' // 기본 스타일\n | 'error' // 에러 상태\n | 'success' // 성공 상태\n | 'warning' // 경고 상태\n | 'sm' // 작은 크기\n | 'lg' // 큰 크기\n\nconst props = withDefaults(\n defineProps<{\n modelValue?: string | number\n options?: Option[]\n placeholder?: string\n disabled?: boolean\n required?: boolean\n name?: string\n id?: string\n multiple?: boolean\n class?: string\n /** 스타일 프리셋 */\n styletype?: StyleType\n }>(),\n {\n options: () => [],\n placeholder: '선택하세요',\n disabled: false,\n required: false,\n multiple: false,\n styletype: 'default',\n },\n)\n\nconst emit = defineEmits<{\n 'update:modelValue': [value: string | number]\n 'change': [value: string | number]\n 'focus': [event: FocusEvent]\n 'blur': [event: FocusEvent]\n}>()\n\n/**\n * styletype -> class 매핑\n */\nconst STYLE_PRESETS: Record<StyleType, { class: string }> = {\n default: { class: '' },\n error: { \n class: 'border-destructive focus:ring-destructive',\n },\n success: { \n class: 'border-green-500 focus:ring-green-500',\n },\n warning: { \n class: 'border-amber-500 focus:ring-amber-500',\n },\n sm: { \n class: 'h-8 text-xs px-2',\n },\n lg: { \n class: 'h-12 text-base px-4',\n },\n}\n\nconst triggerClass = computed(() => {\n const styleKey = props.styletype || 'default'\n const preset = STYLE_PRESETS[styleKey] ?? STYLE_PRESETS.default\n return [preset?.class, props.class].filter(Boolean).join(' ')\n})\n\n/**\n * 외부 value를 내부 value로 변환\n * 빈 문자열 -> __EMPTY_STRING__\n */\nconst toInternalValue = (value: string | number | undefined): string => {\n if (value === '' || value === undefined) {\n return EMPTY_VALUE_PLACEHOLDER\n }\n return String(value)\n}\n\n/**\n * 내부 value를 외부 value로 변환\n * __EMPTY_STRING__ -> ''\n */\nconst toExternalValue = (value: string): string | number => {\n if (value === EMPTY_VALUE_PLACEHOLDER) {\n return ''\n }\n return value\n}\n\n/**\n * 옵션의 value를 내부 형식으로 변환\n * 빈 문자열 value를 가진 옵션 -> __EMPTY_STRING__으로 변환\n */\nconst processedOptions = computed(() => {\n return props.options.map((option) => ({\n ...option,\n value: toInternalValue(option.value),\n }))\n})\n\n/**\n * 현재 modelValue를 내부 형식으로 변환\n */\nconst internalModelValue = computed(() => toInternalValue(props.modelValue))\n\nconst handleChange = (internalValue: string) => {\n const externalValue = toExternalValue(internalValue)\n emit('update:modelValue', externalValue)\n emit('change', externalValue)\n}\n</script>\n\n<template>\n <Select\n :model-value=\"internalModelValue\"\n :disabled=\"disabled\"\n :required=\"required\"\n :name=\"name\"\n @update:model-value=\"(value) => handleChange(value as string)\"\n @focus=\"emit('focus', $event as FocusEvent)\"\n @blur=\"emit('blur', $event as FocusEvent)\"\n >\n <SelectTrigger :id=\"id\" :class=\"triggerClass\">\n <SelectValue :placeholder=\"placeholder\" />\n </SelectTrigger>\n <SelectContent>\n <SelectItem\n v-for=\"option in processedOptions\"\n :key=\"option.value\"\n :value=\"option.value\"\n >\n {{ option.label }}\n </SelectItem>\n </SelectContent>\n </Select>\n</template>\n"],"names":["EMPTY_VALUE_PLACEHOLDER","props","__props","emit","__emit","STYLE_PRESETS","triggerClass","computed","styleKey","toInternalValue","value","toExternalValue","processedOptions","option","internalModelValue","handleChange","internalValue","externalValue","_createBlock","_unref","Select","_cache","$event","_createVNode","SelectTrigger","SelectValue","SelectContent","_createElementBlock","_Fragment","_renderList","SelectItem","_createTextVNode","_toDisplayString"],"mappings":"6XAMMA,EAA0B,yWAehC,MAAMC,EAAQC,EAwBRC,EAAOC,EAUPC,EAAsD,CAC1D,QAAS,CAAE,MAAO,EAAA,EAClB,MAAO,CACL,MAAO,2CAAA,EAET,QAAS,CACP,MAAO,uCAAA,EAET,QAAS,CACP,MAAO,uCAAA,EAET,GAAI,CACF,MAAO,kBAAA,EAET,GAAI,CACF,MAAO,qBAAA,CACT,EAGIC,EAAeC,EAAAA,SAAS,IAAM,CAClC,MAAMC,EAAWP,EAAM,WAAa,UAEpC,MAAO,EADQI,EAAcG,CAAQ,GAAKH,EAAc,UACxC,MAAOJ,EAAM,KAAK,EAAE,OAAO,OAAO,EAAE,KAAK,GAAG,CAC9D,CAAC,EAMKQ,EAAmBC,GACnBA,IAAU,IAAMA,IAAU,OACrBV,EAEF,OAAOU,CAAK,EAOfC,EAAmBD,GACnBA,IAAUV,EACL,GAEFU,EAOHE,EAAmBL,EAAAA,SAAS,IACzBN,EAAM,QAAQ,IAAKY,IAAY,CACpC,GAAGA,EACH,MAAOJ,EAAgBI,EAAO,KAAK,CAAA,EACnC,CACH,EAKKC,EAAqBP,EAAAA,SAAS,IAAME,EAAgBR,EAAM,UAAU,CAAC,EAErEc,EAAgBC,GAA0B,CAC9C,MAAMC,EAAgBN,EAAgBK,CAAa,EACnDb,EAAK,oBAAqBc,CAAa,EACvCd,EAAK,SAAUc,CAAa,CAC9B,8BAIEC,EAAAA,YAqBSC,EAAAA,MAAAC,EAAAA,OAAA,EAAA,CApBN,cAAaN,EAAA,MACb,SAAUZ,EAAA,SACV,SAAUA,EAAA,SACV,KAAMA,EAAA,KACN,sBAAkBmB,EAAA,CAAA,IAAAA,EAAA,CAAA,EAAGX,GAAUK,EAAaL,CAAK,GACjD,QAAKW,EAAA,CAAA,IAAAA,EAAA,CAAA,EAAAC,GAAEnB,EAAI,QAAUmB,CAAM,GAC3B,OAAID,EAAA,CAAA,IAAAA,EAAA,CAAA,EAAAC,GAAEnB,EAAI,OAASmB,CAAM,EAAA,qBAE1B,IAEgB,CAFhBC,cAEgBJ,EAAAA,MAAAK,EAAAA,OAAA,EAAA,CAFA,GAAItB,EAAA,GAAK,uBAAOI,EAAA,KAAY,CAAA,qBAC1C,IAA0C,CAA1CiB,EAAAA,YAA0CJ,EAAAA,MAAAM,SAAA,EAAA,CAA5B,YAAavB,EAAA,aAAW,KAAA,EAAA,CAAA,aAAA,CAAA,CAAA,0BAExCqB,EAAAA,YAQgBJ,EAAAA,MAAAO,SAAA,EAAA,KAAA,mBANZ,IAAkC,kBADpCC,EAAAA,mBAMaC,EAAAA,SAAA,KAAAC,EAAAA,WALMjB,EAAA,MAAVC,kBADTK,EAAAA,YAMaC,EAAAA,MAAAW,EAAAA,OAAA,EAAA,CAJV,IAAKjB,EAAO,MACZ,MAAOA,EAAO,KAAA,qBAEf,IAAkB,CAAfkB,EAAAA,gBAAAC,EAAAA,gBAAAnB,EAAO,KAAK,EAAA,CAAA,CAAA"}
@@ -1 +1 @@
1
- {"version":3,"file":"JCombo.vue.js","sources":["../../../../src/components/atoms/JCombo.vue"],"sourcesContent":["<script setup lang=\"ts\">\r\nimport { computed } from 'vue'\r\nimport { Select, SelectContent, SelectItem, SelectTrigger, SelectValue } from '@/components/shadcn'\r\n\r\n// 빈 문자열 value를 위한 내부 플레이스홀더\r\n// reka-ui SelectItem이 빈 문자열을 처리하지 못하는 버그 우회\r\nconst EMPTY_VALUE_PLACEHOLDER = '__EMPTY_STRING__'\r\n\r\nexport interface Option {\r\n value: string | number\r\n label: string\r\n}\r\n\r\ntype StyleType =\r\n | 'default' // 기본 스타일\r\n | 'error' // 에러 상태\r\n | 'success' // 성공 상태\r\n | 'warning' // 경고 상태\r\n | 'sm' // 작은 크기\r\n | 'lg' // 큰 크기\r\n\r\nconst props = withDefaults(\r\n defineProps<{\r\n modelValue?: string | number\r\n options?: Option[]\r\n placeholder?: string\r\n disabled?: boolean\r\n required?: boolean\r\n name?: string\r\n id?: string\r\n multiple?: boolean\r\n class?: string\r\n /** 스타일 프리셋 */\r\n styletype?: StyleType\r\n }>(),\r\n {\r\n options: () => [],\r\n placeholder: '선택하세요',\r\n disabled: false,\r\n required: false,\r\n multiple: false,\r\n styletype: 'default',\r\n },\r\n)\r\n\r\nconst emit = defineEmits<{\r\n 'update:modelValue': [value: string | number]\r\n 'change': [value: string | number]\r\n 'focus': [event: FocusEvent]\r\n 'blur': [event: FocusEvent]\r\n}>()\r\n\r\n/**\r\n * styletype -> class 매핑\r\n */\r\nconst STYLE_PRESETS: Record<StyleType, { class: string }> = {\r\n default: { class: '' },\r\n error: { \r\n class: 'border-destructive focus:ring-destructive',\r\n },\r\n success: { \r\n class: 'border-green-500 focus:ring-green-500',\r\n },\r\n warning: { \r\n class: 'border-amber-500 focus:ring-amber-500',\r\n },\r\n sm: { \r\n class: 'h-8 text-xs px-2',\r\n },\r\n lg: { \r\n class: 'h-12 text-base px-4',\r\n },\r\n}\r\n\r\nconst triggerClass = computed(() => {\r\n const styleKey = props.styletype || 'default'\r\n const preset = STYLE_PRESETS[styleKey] ?? STYLE_PRESETS.default\r\n return [preset?.class, props.class].filter(Boolean).join(' ')\r\n})\r\n\r\n/**\r\n * 외부 value를 내부 value로 변환\r\n * 빈 문자열 -> __EMPTY_STRING__\r\n */\r\nconst toInternalValue = (value: string | number | undefined): string => {\r\n if (value === '' || value === undefined) {\r\n return EMPTY_VALUE_PLACEHOLDER\r\n }\r\n return String(value)\r\n}\r\n\r\n/**\r\n * 내부 value를 외부 value로 변환\r\n * __EMPTY_STRING__ -> ''\r\n */\r\nconst toExternalValue = (value: string): string | number => {\r\n if (value === EMPTY_VALUE_PLACEHOLDER) {\r\n return ''\r\n }\r\n return value\r\n}\r\n\r\n/**\r\n * 옵션의 value를 내부 형식으로 변환\r\n * 빈 문자열 value를 가진 옵션 -> __EMPTY_STRING__으로 변환\r\n */\r\nconst processedOptions = computed(() => {\r\n return props.options.map((option) => ({\r\n ...option,\r\n value: toInternalValue(option.value),\r\n }))\r\n})\r\n\r\n/**\r\n * 현재 modelValue를 내부 형식으로 변환\r\n */\r\nconst internalModelValue = computed(() => toInternalValue(props.modelValue))\r\n\r\nconst handleChange = (internalValue: string) => {\r\n const externalValue = toExternalValue(internalValue)\r\n emit('update:modelValue', externalValue)\r\n emit('change', externalValue)\r\n}\r\n</script>\r\n\r\n<template>\r\n <Select\r\n :model-value=\"internalModelValue\"\r\n :disabled=\"disabled\"\r\n :required=\"required\"\r\n :name=\"name\"\r\n @update:model-value=\"(value) => handleChange(value as string)\"\r\n @focus=\"emit('focus', $event as FocusEvent)\"\r\n @blur=\"emit('blur', $event as FocusEvent)\"\r\n >\r\n <SelectTrigger :id=\"id\" :class=\"triggerClass\">\r\n <SelectValue :placeholder=\"placeholder\" />\r\n </SelectTrigger>\r\n <SelectContent>\r\n <SelectItem\r\n v-for=\"option in processedOptions\"\r\n :key=\"option.value\"\r\n :value=\"option.value\"\r\n >\r\n {{ option.label }}\r\n </SelectItem>\r\n </SelectContent>\r\n </Select>\r\n</template>\r\n"],"names":["EMPTY_VALUE_PLACEHOLDER","props","__props","emit","__emit","STYLE_PRESETS","triggerClass","computed","styleKey","toInternalValue","value","toExternalValue","processedOptions","option","internalModelValue","handleChange","internalValue","externalValue","_createBlock","_unref","Select","_cache","$event","_createVNode","SelectTrigger","SelectValue","SelectContent","_createElementBlock","_Fragment","_renderList","SelectItem","_createTextVNode","_toDisplayString"],"mappings":";;;;;;;AAMA,MAAMA,IAA0B;;;;;;;;;;;;;;;;AAehC,UAAMC,IAAQC,GAwBRC,IAAOC,GAUPC,IAAsD;AAAA,MAC1D,SAAS,EAAE,OAAO,GAAA;AAAA,MAClB,OAAO;AAAA,QACL,OAAO;AAAA,MAAA;AAAA,MAET,SAAS;AAAA,QACP,OAAO;AAAA,MAAA;AAAA,MAET,SAAS;AAAA,QACP,OAAO;AAAA,MAAA;AAAA,MAET,IAAI;AAAA,QACF,OAAO;AAAA,MAAA;AAAA,MAET,IAAI;AAAA,QACF,OAAO;AAAA,MAAA;AAAA,IACT,GAGIC,IAAeC,EAAS,MAAM;AAClC,YAAMC,IAAWP,EAAM,aAAa;AAEpC,aAAO,EADQI,EAAcG,CAAQ,KAAKH,EAAc,UACxC,OAAOJ,EAAM,KAAK,EAAE,OAAO,OAAO,EAAE,KAAK,GAAG;AAAA,IAC9D,CAAC,GAMKQ,IAAkB,CAACC,MACnBA,MAAU,MAAMA,MAAU,SACrBV,IAEF,OAAOU,CAAK,GAOfC,IAAkB,CAACD,MACnBA,MAAUV,IACL,KAEFU,GAOHE,IAAmBL,EAAS,MACzBN,EAAM,QAAQ,IAAI,CAACY,OAAY;AAAA,MACpC,GAAGA;AAAA,MACH,OAAOJ,EAAgBI,EAAO,KAAK;AAAA,IAAA,EACnC,CACH,GAKKC,IAAqBP,EAAS,MAAME,EAAgBR,EAAM,UAAU,CAAC,GAErEc,IAAe,CAACC,MAA0B;AAC9C,YAAMC,IAAgBN,EAAgBK,CAAa;AACnD,MAAAb,EAAK,qBAAqBc,CAAa,GACvCd,EAAK,UAAUc,CAAa;AAAA,IAC9B;2BAIEC,EAqBSC,EAAAC,CAAA,GAAA;AAAA,MApBN,eAAaN,EAAA;AAAA,MACb,UAAUZ,EAAA;AAAA,MACV,UAAUA,EAAA;AAAA,MACV,MAAMA,EAAA;AAAA,MACN,uBAAkBmB,EAAA,CAAA,MAAAA,EAAA,CAAA,IAAA,CAAGX,MAAUK,EAAaL,CAAK;AAAA,MACjD,SAAKW,EAAA,CAAA,MAAAA,EAAA,CAAA,IAAA,CAAAC,MAAEnB,EAAI,SAAUmB,CAAM;AAAA,MAC3B,QAAID,EAAA,CAAA,MAAAA,EAAA,CAAA,IAAA,CAAAC,MAAEnB,EAAI,QAASmB,CAAM;AAAA,IAAA;iBAE1B,MAEgB;AAAA,QAFhBC,EAEgBJ,EAAAK,CAAA,GAAA;AAAA,UAFA,IAAItB,EAAA;AAAA,UAAK,SAAOI,EAAA,KAAY;AAAA,QAAA;qBAC1C,MAA0C;AAAA,YAA1CiB,EAA0CJ,EAAAM,CAAA,GAAA,EAA5B,aAAavB,EAAA,eAAW,MAAA,GAAA,CAAA,aAAA,CAAA;AAAA,UAAA;;;QAExCqB,EAQgBJ,EAAAO,CAAA,GAAA,MAAA;AAAA,qBANZ,MAAkC;AAAA,oBADpCC,EAMaC,GAAA,MAAAC,EALMjB,EAAA,OAAgB,CAA1BC,YADTK,EAMaC,EAAAW,CAAA,GAAA;AAAA,cAJV,KAAKjB,EAAO;AAAA,cACZ,OAAOA,EAAO;AAAA,YAAA;yBAEf,MAAkB;AAAA,gBAAfkB,EAAAC,EAAAnB,EAAO,KAAK,GAAA,CAAA;AAAA,cAAA;;;;;;;;;;;"}
1
+ {"version":3,"file":"JCombo.vue.js","sources":["../../../../src/components/atoms/JCombo.vue"],"sourcesContent":["<script setup lang=\"ts\">\nimport { computed } from 'vue'\nimport { Select, SelectContent, SelectItem, SelectTrigger, SelectValue } from '@/components/shadcn'\n\n// 빈 문자열 value를 위한 내부 플레이스홀더\n// reka-ui SelectItem이 빈 문자열을 처리하지 못하는 버그 우회\nconst EMPTY_VALUE_PLACEHOLDER = '__EMPTY_STRING__'\n\nexport interface Option {\n value: string | number\n label: string\n}\n\ntype StyleType =\n | 'default' // 기본 스타일\n | 'error' // 에러 상태\n | 'success' // 성공 상태\n | 'warning' // 경고 상태\n | 'sm' // 작은 크기\n | 'lg' // 큰 크기\n\nconst props = withDefaults(\n defineProps<{\n modelValue?: string | number\n options?: Option[]\n placeholder?: string\n disabled?: boolean\n required?: boolean\n name?: string\n id?: string\n multiple?: boolean\n class?: string\n /** 스타일 프리셋 */\n styletype?: StyleType\n }>(),\n {\n options: () => [],\n placeholder: '선택하세요',\n disabled: false,\n required: false,\n multiple: false,\n styletype: 'default',\n },\n)\n\nconst emit = defineEmits<{\n 'update:modelValue': [value: string | number]\n 'change': [value: string | number]\n 'focus': [event: FocusEvent]\n 'blur': [event: FocusEvent]\n}>()\n\n/**\n * styletype -> class 매핑\n */\nconst STYLE_PRESETS: Record<StyleType, { class: string }> = {\n default: { class: '' },\n error: { \n class: 'border-destructive focus:ring-destructive',\n },\n success: { \n class: 'border-green-500 focus:ring-green-500',\n },\n warning: { \n class: 'border-amber-500 focus:ring-amber-500',\n },\n sm: { \n class: 'h-8 text-xs px-2',\n },\n lg: { \n class: 'h-12 text-base px-4',\n },\n}\n\nconst triggerClass = computed(() => {\n const styleKey = props.styletype || 'default'\n const preset = STYLE_PRESETS[styleKey] ?? STYLE_PRESETS.default\n return [preset?.class, props.class].filter(Boolean).join(' ')\n})\n\n/**\n * 외부 value를 내부 value로 변환\n * 빈 문자열 -> __EMPTY_STRING__\n */\nconst toInternalValue = (value: string | number | undefined): string => {\n if (value === '' || value === undefined) {\n return EMPTY_VALUE_PLACEHOLDER\n }\n return String(value)\n}\n\n/**\n * 내부 value를 외부 value로 변환\n * __EMPTY_STRING__ -> ''\n */\nconst toExternalValue = (value: string): string | number => {\n if (value === EMPTY_VALUE_PLACEHOLDER) {\n return ''\n }\n return value\n}\n\n/**\n * 옵션의 value를 내부 형식으로 변환\n * 빈 문자열 value를 가진 옵션 -> __EMPTY_STRING__으로 변환\n */\nconst processedOptions = computed(() => {\n return props.options.map((option) => ({\n ...option,\n value: toInternalValue(option.value),\n }))\n})\n\n/**\n * 현재 modelValue를 내부 형식으로 변환\n */\nconst internalModelValue = computed(() => toInternalValue(props.modelValue))\n\nconst handleChange = (internalValue: string) => {\n const externalValue = toExternalValue(internalValue)\n emit('update:modelValue', externalValue)\n emit('change', externalValue)\n}\n</script>\n\n<template>\n <Select\n :model-value=\"internalModelValue\"\n :disabled=\"disabled\"\n :required=\"required\"\n :name=\"name\"\n @update:model-value=\"(value) => handleChange(value as string)\"\n @focus=\"emit('focus', $event as FocusEvent)\"\n @blur=\"emit('blur', $event as FocusEvent)\"\n >\n <SelectTrigger :id=\"id\" :class=\"triggerClass\">\n <SelectValue :placeholder=\"placeholder\" />\n </SelectTrigger>\n <SelectContent>\n <SelectItem\n v-for=\"option in processedOptions\"\n :key=\"option.value\"\n :value=\"option.value\"\n >\n {{ option.label }}\n </SelectItem>\n </SelectContent>\n </Select>\n</template>\n"],"names":["EMPTY_VALUE_PLACEHOLDER","props","__props","emit","__emit","STYLE_PRESETS","triggerClass","computed","styleKey","toInternalValue","value","toExternalValue","processedOptions","option","internalModelValue","handleChange","internalValue","externalValue","_createBlock","_unref","Select","_cache","$event","_createVNode","SelectTrigger","SelectValue","SelectContent","_createElementBlock","_Fragment","_renderList","SelectItem","_createTextVNode","_toDisplayString"],"mappings":";;;;;;;AAMA,MAAMA,IAA0B;;;;;;;;;;;;;;;;AAehC,UAAMC,IAAQC,GAwBRC,IAAOC,GAUPC,IAAsD;AAAA,MAC1D,SAAS,EAAE,OAAO,GAAA;AAAA,MAClB,OAAO;AAAA,QACL,OAAO;AAAA,MAAA;AAAA,MAET,SAAS;AAAA,QACP,OAAO;AAAA,MAAA;AAAA,MAET,SAAS;AAAA,QACP,OAAO;AAAA,MAAA;AAAA,MAET,IAAI;AAAA,QACF,OAAO;AAAA,MAAA;AAAA,MAET,IAAI;AAAA,QACF,OAAO;AAAA,MAAA;AAAA,IACT,GAGIC,IAAeC,EAAS,MAAM;AAClC,YAAMC,IAAWP,EAAM,aAAa;AAEpC,aAAO,EADQI,EAAcG,CAAQ,KAAKH,EAAc,UACxC,OAAOJ,EAAM,KAAK,EAAE,OAAO,OAAO,EAAE,KAAK,GAAG;AAAA,IAC9D,CAAC,GAMKQ,IAAkB,CAACC,MACnBA,MAAU,MAAMA,MAAU,SACrBV,IAEF,OAAOU,CAAK,GAOfC,IAAkB,CAACD,MACnBA,MAAUV,IACL,KAEFU,GAOHE,IAAmBL,EAAS,MACzBN,EAAM,QAAQ,IAAI,CAACY,OAAY;AAAA,MACpC,GAAGA;AAAA,MACH,OAAOJ,EAAgBI,EAAO,KAAK;AAAA,IAAA,EACnC,CACH,GAKKC,IAAqBP,EAAS,MAAME,EAAgBR,EAAM,UAAU,CAAC,GAErEc,IAAe,CAACC,MAA0B;AAC9C,YAAMC,IAAgBN,EAAgBK,CAAa;AACnD,MAAAb,EAAK,qBAAqBc,CAAa,GACvCd,EAAK,UAAUc,CAAa;AAAA,IAC9B;2BAIEC,EAqBSC,EAAAC,CAAA,GAAA;AAAA,MApBN,eAAaN,EAAA;AAAA,MACb,UAAUZ,EAAA;AAAA,MACV,UAAUA,EAAA;AAAA,MACV,MAAMA,EAAA;AAAA,MACN,uBAAkBmB,EAAA,CAAA,MAAAA,EAAA,CAAA,IAAA,CAAGX,MAAUK,EAAaL,CAAK;AAAA,MACjD,SAAKW,EAAA,CAAA,MAAAA,EAAA,CAAA,IAAA,CAAAC,MAAEnB,EAAI,SAAUmB,CAAM;AAAA,MAC3B,QAAID,EAAA,CAAA,MAAAA,EAAA,CAAA,IAAA,CAAAC,MAAEnB,EAAI,QAASmB,CAAM;AAAA,IAAA;iBAE1B,MAEgB;AAAA,QAFhBC,EAEgBJ,EAAAK,CAAA,GAAA;AAAA,UAFA,IAAItB,EAAA;AAAA,UAAK,SAAOI,EAAA,KAAY;AAAA,QAAA;qBAC1C,MAA0C;AAAA,YAA1CiB,EAA0CJ,EAAAM,CAAA,GAAA,EAA5B,aAAavB,EAAA,eAAW,MAAA,GAAA,CAAA,aAAA,CAAA;AAAA,UAAA;;;QAExCqB,EAQgBJ,EAAAO,CAAA,GAAA,MAAA;AAAA,qBANZ,MAAkC;AAAA,oBADpCC,EAMaC,GAAA,MAAAC,EALMjB,EAAA,OAAgB,CAA1BC,YADTK,EAMaC,EAAAW,CAAA,GAAA;AAAA,cAJV,KAAKjB,EAAO;AAAA,cACZ,OAAOA,EAAO;AAAA,YAAA;yBAEf,MAAkB;AAAA,gBAAfkB,EAAAC,EAAAnB,EAAO,KAAK,GAAA,CAAA;AAAA,cAAA;;;;;;;;;;;"}
@@ -1 +1 @@
1
- {"version":3,"file":"JDatepicker.vue.cjs","sources":["../../../../src/components/atoms/JDatepicker.vue"],"sourcesContent":["<script setup lang=\"ts\">\r\nimport { computed, ref, watch } from 'vue'\r\nimport { Calendar as CalendarIcon } from 'lucide-vue-next'\r\nimport { type DateValue, parseDate } from '@internationalized/date'\r\nimport {\r\n Calendar,\r\n Popover,\r\n PopoverContent,\r\n PopoverTrigger,\r\n Button,\r\n} from '@/components/shadcn'\r\nimport { cn } from '@/lib/utils'\r\n\r\n// Props 정의\r\nconst props = withDefaults(\r\n defineProps<{\r\n /** v-model로 양방향 데이터 바인딩 (ISO 8601 문자열: YYYY-MM-DD) */\r\n modelValue?: string | null\r\n /** Input 요소의 id */\r\n id?: string\r\n /** 입력 전 표시되는 안내문 */\r\n placeholder?: string\r\n /** 비활성화 상태 */\r\n disabled?: boolean\r\n /** 필수 입력 여부 */\r\n required?: boolean\r\n /** form 데이터 전송 시 키 이름 */\r\n name?: string\r\n /** 추가 CSS 클래스 */\r\n class?: string\r\n /** 스타일 테마 지정 */\r\n styletype?: 'default' | 'sm' | 'lg'\r\n }>(),\r\n {\r\n placeholder: '날짜를 선택하세요',\r\n styletype: 'default',\r\n }\r\n)\r\n\r\n// 이벤트 정의\r\nconst emit = defineEmits<{\r\n 'update:modelValue': [value: string | null]\r\n 'change': [value: string | null]\r\n 'focus': [event: FocusEvent]\r\n 'blur': [event: FocusEvent]\r\n}>()\r\n\r\n// 스타일 프리셋\nconst STYLE_PRESETS: Record<string, { buttonClass: string }> = {\n default: {\n buttonClass: 'h-8 text-xs px-2.5',\n },\n sm: {\n buttonClass: 'h-7 text-[11px] px-2',\n },\n lg: {\n buttonClass: 'h-9 text-sm px-3',\n },\n}\n\r\n// 내부 상태로 DateValue 관리\r\nconst internalDate = ref<DateValue | undefined>()\r\n\r\n// modelValue를 DateValue로 변환\r\nconst convertToDateValue = (value: string | null | undefined): DateValue | undefined => {\r\n if (!value) return undefined\r\n \r\n try {\r\n // ISO 8601 문자열을 직접 parseDate로 변환\r\n return parseDate(value)\r\n } catch {\r\n return undefined\r\n }\r\n}\r\n\r\n// DateValue를 ISO 문자열로 변환\r\nconst convertToString = (date: DateValue | undefined): string | null => {\r\n if (!date) return null\r\n return `${date.year}-${String(date.month).padStart(2, '0')}-${String(date.day).padStart(2, '0')}`\r\n}\r\n\r\n// modelValue 변경 감지\r\nwatch(\r\n () => props.modelValue,\r\n (newValue) => {\r\n const converted = convertToDateValue(newValue)\r\n if (JSON.stringify(internalDate.value) !== JSON.stringify(converted)) {\r\n internalDate.value = converted\r\n }\r\n },\r\n { immediate: true }\r\n)\r\n\r\n// 내부 날짜 변경 시 emit\r\nconst handleDateChange = (date: DateValue | undefined) => {\r\n internalDate.value = date\r\n const stringValue = convertToString(date)\r\n \r\n if (stringValue !== props.modelValue) {\r\n emit('update:modelValue', stringValue)\r\n emit('change', stringValue)\r\n }\r\n}\r\n\r\n// 포맷팅된 날짜 표시\r\nconst formattedDate = computed(() => {\r\n if (!internalDate.value) return props.placeholder\r\n \r\n const date = new Date(\r\n internalDate.value.year,\r\n internalDate.value.month - 1,\r\n internalDate.value.day\r\n )\r\n \r\n return new Intl.DateTimeFormat('ko-KR', {\r\n year: 'numeric',\r\n month: 'long',\r\n day: 'numeric',\r\n }).format(date)\r\n})\r\n\r\n// 버튼 클래스 계산\r\nconst buttonClass = computed(() => {\r\n const styleKey = props.styletype || 'default'\r\n const preset = STYLE_PRESETS[styleKey] ?? STYLE_PRESETS.default\r\n const userClass = props.class || ''\r\n \r\n return cn(\r\n 'w-full justify-start text-left font-normal',\r\n preset?.buttonClass ?? 'h-10',\r\n !internalDate.value && 'text-muted-foreground',\r\n userClass\r\n )\r\n})\r\n</script>\r\n\r\n<template>\r\n <Popover>\r\n <PopoverTrigger as-child>\r\n <Button\r\n :id=\"id\"\r\n :name=\"name\"\r\n :disabled=\"disabled\"\r\n :class=\"buttonClass\"\r\n variant=\"outline\"\r\n @focus=\"emit('focus', $event)\"\r\n @blur=\"emit('blur', $event)\"\r\n >\r\n <CalendarIcon class=\"mr-2 h-4 w-4\" />\r\n {{ formattedDate }}\r\n </Button>\r\n </PopoverTrigger>\r\n <PopoverContent class=\"w-auto p-0\">\r\n <Calendar\r\n v-model=\"internalDate\"\r\n :locale=\"'ko-KR'\"\r\n initial-focus\r\n @update:model-value=\"handleDateChange\"\r\n />\r\n </PopoverContent>\r\n </Popover>\r\n</template>\r\n\r\n"],"names":["props","__props","emit","__emit","STYLE_PRESETS","internalDate","ref","convertToDateValue","value","parseDate","convertToString","date","watch","newValue","converted","handleDateChange","stringValue","formattedDate","computed","buttonClass","styleKey","preset","userClass","cn","_createBlock","_unref","Popover","_createVNode","PopoverTrigger","Button","_cache","$event","CalendarIcon","_createTextVNode","PopoverContent","Calendar"],"mappings":"yuBAcA,MAAMA,EAAQC,EA0BRC,EAAOC,EAQPC,EAAyD,CAC7D,QAAS,CACP,YAAa,oBAAA,EAEf,GAAI,CACF,YAAa,sBAAA,EAEf,GAAI,CACF,YAAa,kBAAA,CACf,EAIIC,EAAeC,EAAAA,IAAA,EAGfC,EAAsBC,GAA4D,CACtF,GAAKA,EAEL,GAAI,CAEF,OAAOC,EAAAA,UAAUD,CAAK,CACxB,MAAQ,CACN,MACF,CACF,EAGME,EAAmBC,GAClBA,EACE,GAAGA,EAAK,IAAI,IAAI,OAAOA,EAAK,KAAK,EAAE,SAAS,EAAG,GAAG,CAAC,IAAI,OAAOA,EAAK,GAAG,EAAE,SAAS,EAAG,GAAG,CAAC,GAD7E,KAKpBC,EAAAA,MACE,IAAMZ,EAAM,WACXa,GAAa,CACZ,MAAMC,EAAYP,EAAmBM,CAAQ,EACzC,KAAK,UAAUR,EAAa,KAAK,IAAM,KAAK,UAAUS,CAAS,IACjET,EAAa,MAAQS,EAEzB,EACA,CAAE,UAAW,EAAA,CAAK,EAIpB,MAAMC,EAAoBJ,GAAgC,CACxDN,EAAa,MAAQM,EACrB,MAAMK,EAAcN,EAAgBC,CAAI,EAEpCK,IAAgBhB,EAAM,aACxBE,EAAK,oBAAqBc,CAAW,EACrCd,EAAK,SAAUc,CAAW,EAE9B,EAGMC,EAAgBC,EAAAA,SAAS,IAAM,CACnC,GAAI,CAACb,EAAa,MAAO,OAAOL,EAAM,YAEtC,MAAMW,EAAO,IAAI,KACfN,EAAa,MAAM,KACnBA,EAAa,MAAM,MAAQ,EAC3BA,EAAa,MAAM,GAAA,EAGrB,OAAO,IAAI,KAAK,eAAe,QAAS,CACtC,KAAM,UACN,MAAO,OACP,IAAK,SAAA,CACN,EAAE,OAAOM,CAAI,CAChB,CAAC,EAGKQ,EAAcD,EAAAA,SAAS,IAAM,CACjC,MAAME,EAAWpB,EAAM,WAAa,UAC9BqB,EAASjB,EAAcgB,CAAQ,GAAKhB,EAAc,QAClDkB,EAAYtB,EAAM,OAAS,GAEjC,OAAOuB,EAAAA,GACL,6CACAF,GAAQ,aAAe,OACvB,CAAChB,EAAa,OAAS,wBACvBiB,CAAA,CAEJ,CAAC,8BAICE,EAAAA,YAuBUC,EAAAA,MAAAC,EAAAA,OAAA,EAAA,KAAA,mBAtBR,IAaiB,CAbjBC,EAAAA,YAaiBF,EAAAA,MAAAG,EAAAA,OAAA,EAAA,CAbD,WAAA,IAAQ,mBACtB,IAWS,CAXTD,cAWSF,EAAAA,MAAAI,EAAAA,OAAA,EAAA,CAVN,GAAI5B,EAAA,GACJ,KAAMA,EAAA,KACN,SAAUA,EAAA,SACV,uBAAOkB,EAAA,KAAW,EACnB,QAAQ,UACP,QAAKW,EAAA,CAAA,IAAAA,EAAA,CAAA,EAAAC,GAAE7B,EAAI,QAAU6B,CAAM,GAC3B,OAAID,EAAA,CAAA,IAAAA,EAAA,CAAA,EAAAC,GAAE7B,EAAI,OAAS6B,CAAM,EAAA,qBAE1B,IAAqC,CAArCJ,EAAAA,YAAqCF,EAAAA,MAAAO,EAAAA,QAAA,EAAA,CAAvB,MAAM,eAAc,EAAGC,EAAAA,gBAAA,sBAClChB,EAAA,KAAa,EAAA,CAAA,CAAA,oDAGpBU,EAAAA,YAOiBF,EAAAA,MAAAS,EAAAA,OAAA,EAAA,CAPD,MAAM,cAAY,mBAChC,IAKE,CALFP,cAKEF,EAAAA,MAAAU,EAAAA,OAAA,EAAA,YAJS9B,EAAA,4CAAAA,EAAY,MAAA0B,GAGAhB,CAAA,EAFpB,OAAQ,QACT,gBAAA,EAAA"}
1
+ {"version":3,"file":"JDatepicker.vue.cjs","sources":["../../../../src/components/atoms/JDatepicker.vue"],"sourcesContent":["<script setup lang=\"ts\">\nimport { computed, ref, watch } from 'vue'\nimport { Calendar as CalendarIcon } from 'lucide-vue-next'\nimport { type DateValue, parseDate } from '@internationalized/date'\nimport {\n Calendar,\n Popover,\n PopoverContent,\n PopoverTrigger,\n Button,\n} from '@/components/shadcn'\nimport { cn } from '@/lib/utils'\n\n// Props 정의\nconst props = withDefaults(\n defineProps<{\n /** v-model로 양방향 데이터 바인딩 (ISO 8601 문자열: YYYY-MM-DD) */\n modelValue?: string | null\n /** Input 요소의 id */\n id?: string\n /** 입력 전 표시되는 안내문 */\n placeholder?: string\n /** 비활성화 상태 */\n disabled?: boolean\n /** 필수 입력 여부 */\n required?: boolean\n /** form 데이터 전송 시 키 이름 */\n name?: string\n /** 추가 CSS 클래스 */\n class?: string\n /** 스타일 테마 지정 */\n styletype?: 'default' | 'sm' | 'lg'\n }>(),\n {\n placeholder: '날짜를 선택하세요',\n styletype: 'default',\n }\n)\n\n// 이벤트 정의\nconst emit = defineEmits<{\n 'update:modelValue': [value: string | null]\n 'change': [value: string | null]\n 'focus': [event: FocusEvent]\n 'blur': [event: FocusEvent]\n}>()\n\n// 스타일 프리셋\nconst STYLE_PRESETS: Record<string, { buttonClass: string }> = {\n default: {\n buttonClass: 'h-8 text-xs px-2.5',\n },\n sm: {\n buttonClass: 'h-7 text-[11px] px-2',\n },\n lg: {\n buttonClass: 'h-9 text-sm px-3',\n },\n}\n\n// 내부 상태로 DateValue 관리\nconst internalDate = ref<DateValue | undefined>()\n\n// modelValue를 DateValue로 변환\nconst convertToDateValue = (value: string | null | undefined): DateValue | undefined => {\n if (!value) return undefined\n \n try {\n // ISO 8601 문자열을 직접 parseDate로 변환\n return parseDate(value)\n } catch {\n return undefined\n }\n}\n\n// DateValue를 ISO 문자열로 변환\nconst convertToString = (date: DateValue | undefined): string | null => {\n if (!date) return null\n return `${date.year}-${String(date.month).padStart(2, '0')}-${String(date.day).padStart(2, '0')}`\n}\n\n// modelValue 변경 감지\nwatch(\n () => props.modelValue,\n (newValue) => {\n const converted = convertToDateValue(newValue)\n if (JSON.stringify(internalDate.value) !== JSON.stringify(converted)) {\n internalDate.value = converted\n }\n },\n { immediate: true }\n)\n\n// 내부 날짜 변경 시 emit\nconst handleDateChange = (date: DateValue | undefined) => {\n internalDate.value = date\n const stringValue = convertToString(date)\n \n if (stringValue !== props.modelValue) {\n emit('update:modelValue', stringValue)\n emit('change', stringValue)\n }\n}\n\n// 포맷팅된 날짜 표시\nconst formattedDate = computed(() => {\n if (!internalDate.value) return props.placeholder\n \n const date = new Date(\n internalDate.value.year,\n internalDate.value.month - 1,\n internalDate.value.day\n )\n \n return new Intl.DateTimeFormat('ko-KR', {\n year: 'numeric',\n month: 'long',\n day: 'numeric',\n }).format(date)\n})\n\n// 버튼 클래스 계산\nconst buttonClass = computed(() => {\n const styleKey = props.styletype || 'default'\n const preset = STYLE_PRESETS[styleKey] ?? STYLE_PRESETS.default\n const userClass = props.class || ''\n \n return cn(\n 'w-full justify-start text-left font-normal',\n preset?.buttonClass ?? 'h-10',\n !internalDate.value && 'text-muted-foreground',\n userClass\n )\n})\n</script>\n\n<template>\n <Popover>\n <PopoverTrigger as-child>\n <Button\n :id=\"id\"\n :name=\"name\"\n :disabled=\"disabled\"\n :class=\"buttonClass\"\n variant=\"outline\"\n @focus=\"emit('focus', $event)\"\n @blur=\"emit('blur', $event)\"\n >\n <CalendarIcon class=\"mr-2 h-4 w-4\" />\n {{ formattedDate }}\n </Button>\n </PopoverTrigger>\n <PopoverContent class=\"w-auto p-0\">\n <Calendar\n v-model=\"internalDate\"\n :locale=\"'ko-KR'\"\n initial-focus\n @update:model-value=\"handleDateChange\"\n />\n </PopoverContent>\n </Popover>\n</template>\n\n"],"names":["props","__props","emit","__emit","STYLE_PRESETS","internalDate","ref","convertToDateValue","value","parseDate","convertToString","date","watch","newValue","converted","handleDateChange","stringValue","formattedDate","computed","buttonClass","styleKey","preset","userClass","cn","_createBlock","_unref","Popover","_createVNode","PopoverTrigger","Button","_cache","$event","CalendarIcon","_createTextVNode","PopoverContent","Calendar"],"mappings":"yuBAcA,MAAMA,EAAQC,EA0BRC,EAAOC,EAQPC,EAAyD,CAC7D,QAAS,CACP,YAAa,oBAAA,EAEf,GAAI,CACF,YAAa,sBAAA,EAEf,GAAI,CACF,YAAa,kBAAA,CACf,EAIIC,EAAeC,EAAAA,IAAA,EAGfC,EAAsBC,GAA4D,CACtF,GAAKA,EAEL,GAAI,CAEF,OAAOC,EAAAA,UAAUD,CAAK,CACxB,MAAQ,CACN,MACF,CACF,EAGME,EAAmBC,GAClBA,EACE,GAAGA,EAAK,IAAI,IAAI,OAAOA,EAAK,KAAK,EAAE,SAAS,EAAG,GAAG,CAAC,IAAI,OAAOA,EAAK,GAAG,EAAE,SAAS,EAAG,GAAG,CAAC,GAD7E,KAKpBC,EAAAA,MACE,IAAMZ,EAAM,WACXa,GAAa,CACZ,MAAMC,EAAYP,EAAmBM,CAAQ,EACzC,KAAK,UAAUR,EAAa,KAAK,IAAM,KAAK,UAAUS,CAAS,IACjET,EAAa,MAAQS,EAEzB,EACA,CAAE,UAAW,EAAA,CAAK,EAIpB,MAAMC,EAAoBJ,GAAgC,CACxDN,EAAa,MAAQM,EACrB,MAAMK,EAAcN,EAAgBC,CAAI,EAEpCK,IAAgBhB,EAAM,aACxBE,EAAK,oBAAqBc,CAAW,EACrCd,EAAK,SAAUc,CAAW,EAE9B,EAGMC,EAAgBC,EAAAA,SAAS,IAAM,CACnC,GAAI,CAACb,EAAa,MAAO,OAAOL,EAAM,YAEtC,MAAMW,EAAO,IAAI,KACfN,EAAa,MAAM,KACnBA,EAAa,MAAM,MAAQ,EAC3BA,EAAa,MAAM,GAAA,EAGrB,OAAO,IAAI,KAAK,eAAe,QAAS,CACtC,KAAM,UACN,MAAO,OACP,IAAK,SAAA,CACN,EAAE,OAAOM,CAAI,CAChB,CAAC,EAGKQ,EAAcD,EAAAA,SAAS,IAAM,CACjC,MAAME,EAAWpB,EAAM,WAAa,UAC9BqB,EAASjB,EAAcgB,CAAQ,GAAKhB,EAAc,QAClDkB,EAAYtB,EAAM,OAAS,GAEjC,OAAOuB,EAAAA,GACL,6CACAF,GAAQ,aAAe,OACvB,CAAChB,EAAa,OAAS,wBACvBiB,CAAA,CAEJ,CAAC,8BAICE,EAAAA,YAuBUC,EAAAA,MAAAC,EAAAA,OAAA,EAAA,KAAA,mBAtBR,IAaiB,CAbjBC,EAAAA,YAaiBF,EAAAA,MAAAG,EAAAA,OAAA,EAAA,CAbD,WAAA,IAAQ,mBACtB,IAWS,CAXTD,cAWSF,EAAAA,MAAAI,EAAAA,OAAA,EAAA,CAVN,GAAI5B,EAAA,GACJ,KAAMA,EAAA,KACN,SAAUA,EAAA,SACV,uBAAOkB,EAAA,KAAW,EACnB,QAAQ,UACP,QAAKW,EAAA,CAAA,IAAAA,EAAA,CAAA,EAAAC,GAAE7B,EAAI,QAAU6B,CAAM,GAC3B,OAAID,EAAA,CAAA,IAAAA,EAAA,CAAA,EAAAC,GAAE7B,EAAI,OAAS6B,CAAM,EAAA,qBAE1B,IAAqC,CAArCJ,EAAAA,YAAqCF,EAAAA,MAAAO,EAAAA,QAAA,EAAA,CAAvB,MAAM,eAAc,EAAGC,EAAAA,gBAAA,sBAClChB,EAAA,KAAa,EAAA,CAAA,CAAA,oDAGpBU,EAAAA,YAOiBF,EAAAA,MAAAS,EAAAA,OAAA,EAAA,CAPD,MAAM,cAAY,mBAChC,IAKE,CALFP,cAKEF,EAAAA,MAAAU,EAAAA,OAAA,EAAA,YAJS9B,EAAA,4CAAAA,EAAY,MAAA0B,GAGAhB,CAAA,EAFpB,OAAQ,QACT,gBAAA,EAAA"}
@@ -1 +1 @@
1
- {"version":3,"file":"JDatepicker.vue.js","sources":["../../../../src/components/atoms/JDatepicker.vue"],"sourcesContent":["<script setup lang=\"ts\">\r\nimport { computed, ref, watch } from 'vue'\r\nimport { Calendar as CalendarIcon } from 'lucide-vue-next'\r\nimport { type DateValue, parseDate } from '@internationalized/date'\r\nimport {\r\n Calendar,\r\n Popover,\r\n PopoverContent,\r\n PopoverTrigger,\r\n Button,\r\n} from '@/components/shadcn'\r\nimport { cn } from '@/lib/utils'\r\n\r\n// Props 정의\r\nconst props = withDefaults(\r\n defineProps<{\r\n /** v-model로 양방향 데이터 바인딩 (ISO 8601 문자열: YYYY-MM-DD) */\r\n modelValue?: string | null\r\n /** Input 요소의 id */\r\n id?: string\r\n /** 입력 전 표시되는 안내문 */\r\n placeholder?: string\r\n /** 비활성화 상태 */\r\n disabled?: boolean\r\n /** 필수 입력 여부 */\r\n required?: boolean\r\n /** form 데이터 전송 시 키 이름 */\r\n name?: string\r\n /** 추가 CSS 클래스 */\r\n class?: string\r\n /** 스타일 테마 지정 */\r\n styletype?: 'default' | 'sm' | 'lg'\r\n }>(),\r\n {\r\n placeholder: '날짜를 선택하세요',\r\n styletype: 'default',\r\n }\r\n)\r\n\r\n// 이벤트 정의\r\nconst emit = defineEmits<{\r\n 'update:modelValue': [value: string | null]\r\n 'change': [value: string | null]\r\n 'focus': [event: FocusEvent]\r\n 'blur': [event: FocusEvent]\r\n}>()\r\n\r\n// 스타일 프리셋\nconst STYLE_PRESETS: Record<string, { buttonClass: string }> = {\n default: {\n buttonClass: 'h-8 text-xs px-2.5',\n },\n sm: {\n buttonClass: 'h-7 text-[11px] px-2',\n },\n lg: {\n buttonClass: 'h-9 text-sm px-3',\n },\n}\n\r\n// 내부 상태로 DateValue 관리\r\nconst internalDate = ref<DateValue | undefined>()\r\n\r\n// modelValue를 DateValue로 변환\r\nconst convertToDateValue = (value: string | null | undefined): DateValue | undefined => {\r\n if (!value) return undefined\r\n \r\n try {\r\n // ISO 8601 문자열을 직접 parseDate로 변환\r\n return parseDate(value)\r\n } catch {\r\n return undefined\r\n }\r\n}\r\n\r\n// DateValue를 ISO 문자열로 변환\r\nconst convertToString = (date: DateValue | undefined): string | null => {\r\n if (!date) return null\r\n return `${date.year}-${String(date.month).padStart(2, '0')}-${String(date.day).padStart(2, '0')}`\r\n}\r\n\r\n// modelValue 변경 감지\r\nwatch(\r\n () => props.modelValue,\r\n (newValue) => {\r\n const converted = convertToDateValue(newValue)\r\n if (JSON.stringify(internalDate.value) !== JSON.stringify(converted)) {\r\n internalDate.value = converted\r\n }\r\n },\r\n { immediate: true }\r\n)\r\n\r\n// 내부 날짜 변경 시 emit\r\nconst handleDateChange = (date: DateValue | undefined) => {\r\n internalDate.value = date\r\n const stringValue = convertToString(date)\r\n \r\n if (stringValue !== props.modelValue) {\r\n emit('update:modelValue', stringValue)\r\n emit('change', stringValue)\r\n }\r\n}\r\n\r\n// 포맷팅된 날짜 표시\r\nconst formattedDate = computed(() => {\r\n if (!internalDate.value) return props.placeholder\r\n \r\n const date = new Date(\r\n internalDate.value.year,\r\n internalDate.value.month - 1,\r\n internalDate.value.day\r\n )\r\n \r\n return new Intl.DateTimeFormat('ko-KR', {\r\n year: 'numeric',\r\n month: 'long',\r\n day: 'numeric',\r\n }).format(date)\r\n})\r\n\r\n// 버튼 클래스 계산\r\nconst buttonClass = computed(() => {\r\n const styleKey = props.styletype || 'default'\r\n const preset = STYLE_PRESETS[styleKey] ?? STYLE_PRESETS.default\r\n const userClass = props.class || ''\r\n \r\n return cn(\r\n 'w-full justify-start text-left font-normal',\r\n preset?.buttonClass ?? 'h-10',\r\n !internalDate.value && 'text-muted-foreground',\r\n userClass\r\n )\r\n})\r\n</script>\r\n\r\n<template>\r\n <Popover>\r\n <PopoverTrigger as-child>\r\n <Button\r\n :id=\"id\"\r\n :name=\"name\"\r\n :disabled=\"disabled\"\r\n :class=\"buttonClass\"\r\n variant=\"outline\"\r\n @focus=\"emit('focus', $event)\"\r\n @blur=\"emit('blur', $event)\"\r\n >\r\n <CalendarIcon class=\"mr-2 h-4 w-4\" />\r\n {{ formattedDate }}\r\n </Button>\r\n </PopoverTrigger>\r\n <PopoverContent class=\"w-auto p-0\">\r\n <Calendar\r\n v-model=\"internalDate\"\r\n :locale=\"'ko-KR'\"\r\n initial-focus\r\n @update:model-value=\"handleDateChange\"\r\n />\r\n </PopoverContent>\r\n </Popover>\r\n</template>\r\n\r\n"],"names":["props","__props","emit","__emit","STYLE_PRESETS","internalDate","ref","convertToDateValue","value","parseDate","convertToString","date","watch","newValue","converted","handleDateChange","stringValue","formattedDate","computed","buttonClass","styleKey","preset","userClass","cn","_createBlock","_unref","Popover","_createVNode","PopoverTrigger","Button","_cache","$event","CalendarIcon","_createTextVNode","PopoverContent","Calendar"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;AAcA,UAAMA,IAAQC,GA0BRC,IAAOC,GAQPC,IAAyD;AAAA,MAC7D,SAAS;AAAA,QACP,aAAa;AAAA,MAAA;AAAA,MAEf,IAAI;AAAA,QACF,aAAa;AAAA,MAAA;AAAA,MAEf,IAAI;AAAA,QACF,aAAa;AAAA,MAAA;AAAA,IACf,GAIIC,IAAeC,EAAA,GAGfC,IAAqB,CAACC,MAA4D;AACtF,UAAKA;AAEL,YAAI;AAEF,iBAAOC,EAAUD,CAAK;AAAA,QACxB,QAAQ;AACN;AAAA,QACF;AAAA,IACF,GAGME,IAAkB,CAACC,MAClBA,IACE,GAAGA,EAAK,IAAI,IAAI,OAAOA,EAAK,KAAK,EAAE,SAAS,GAAG,GAAG,CAAC,IAAI,OAAOA,EAAK,GAAG,EAAE,SAAS,GAAG,GAAG,CAAC,KAD7E;AAKpB,IAAAC;AAAA,MACE,MAAMZ,EAAM;AAAA,MACZ,CAACa,MAAa;AACZ,cAAMC,IAAYP,EAAmBM,CAAQ;AAC7C,QAAI,KAAK,UAAUR,EAAa,KAAK,MAAM,KAAK,UAAUS,CAAS,MACjET,EAAa,QAAQS;AAAA,MAEzB;AAAA,MACA,EAAE,WAAW,GAAA;AAAA,IAAK;AAIpB,UAAMC,IAAmB,CAACJ,MAAgC;AACxD,MAAAN,EAAa,QAAQM;AACrB,YAAMK,IAAcN,EAAgBC,CAAI;AAExC,MAAIK,MAAgBhB,EAAM,eACxBE,EAAK,qBAAqBc,CAAW,GACrCd,EAAK,UAAUc,CAAW;AAAA,IAE9B,GAGMC,IAAgBC,EAAS,MAAM;AACnC,UAAI,CAACb,EAAa,MAAO,QAAOL,EAAM;AAEtC,YAAMW,IAAO,IAAI;AAAA,QACfN,EAAa,MAAM;AAAA,QACnBA,EAAa,MAAM,QAAQ;AAAA,QAC3BA,EAAa,MAAM;AAAA,MAAA;AAGrB,aAAO,IAAI,KAAK,eAAe,SAAS;AAAA,QACtC,MAAM;AAAA,QACN,OAAO;AAAA,QACP,KAAK;AAAA,MAAA,CACN,EAAE,OAAOM,CAAI;AAAA,IAChB,CAAC,GAGKQ,IAAcD,EAAS,MAAM;AACjC,YAAME,IAAWpB,EAAM,aAAa,WAC9BqB,IAASjB,EAAcgB,CAAQ,KAAKhB,EAAc,SAClDkB,IAAYtB,EAAM,SAAS;AAEjC,aAAOuB;AAAA,QACL;AAAA,QACAF,GAAQ,eAAe;AAAA,QACvB,CAAChB,EAAa,SAAS;AAAA,QACvBiB;AAAA,MAAA;AAAA,IAEJ,CAAC;2BAICE,EAuBUC,EAAAC,CAAA,GAAA,MAAA;AAAA,iBAtBR,MAaiB;AAAA,QAbjBC,EAaiBF,EAAAG,CAAA,GAAA,EAbD,YAAA,MAAQ;AAAA,qBACtB,MAWS;AAAA,YAXTD,EAWSF,EAAAI,CAAA,GAAA;AAAA,cAVN,IAAI5B,EAAA;AAAA,cACJ,MAAMA,EAAA;AAAA,cACN,UAAUA,EAAA;AAAA,cACV,SAAOkB,EAAA,KAAW;AAAA,cACnB,SAAQ;AAAA,cACP,SAAKW,EAAA,CAAA,MAAAA,EAAA,CAAA,IAAA,CAAAC,MAAE7B,EAAI,SAAU6B,CAAM;AAAA,cAC3B,QAAID,EAAA,CAAA,MAAAA,EAAA,CAAA,IAAA,CAAAC,MAAE7B,EAAI,QAAS6B,CAAM;AAAA,YAAA;yBAE1B,MAAqC;AAAA,gBAArCJ,EAAqCF,EAAAO,CAAA,GAAA,EAAvB,OAAM,gBAAc;AAAA,gBAAGC,EAAA,QAClChB,EAAA,KAAa,GAAA,CAAA;AAAA,cAAA;;;;;;QAGpBU,EAOiBF,EAAAS,CAAA,GAAA,EAPD,OAAM,gBAAY;AAAA,qBAChC,MAKE;AAAA,YALFP,EAKEF,EAAAU,CAAA,GAAA;AAAA,0BAJS9B,EAAA;AAAA;uCAAAA,EAAY,QAAA0B;AAAA,gBAGAhB;AAAA,cAAA;AAAA,cAFpB,QAAQ;AAAA,cACT,iBAAA;AAAA,YAAA;;;;;;;;;"}
1
+ {"version":3,"file":"JDatepicker.vue.js","sources":["../../../../src/components/atoms/JDatepicker.vue"],"sourcesContent":["<script setup lang=\"ts\">\nimport { computed, ref, watch } from 'vue'\nimport { Calendar as CalendarIcon } from 'lucide-vue-next'\nimport { type DateValue, parseDate } from '@internationalized/date'\nimport {\n Calendar,\n Popover,\n PopoverContent,\n PopoverTrigger,\n Button,\n} from '@/components/shadcn'\nimport { cn } from '@/lib/utils'\n\n// Props 정의\nconst props = withDefaults(\n defineProps<{\n /** v-model로 양방향 데이터 바인딩 (ISO 8601 문자열: YYYY-MM-DD) */\n modelValue?: string | null\n /** Input 요소의 id */\n id?: string\n /** 입력 전 표시되는 안내문 */\n placeholder?: string\n /** 비활성화 상태 */\n disabled?: boolean\n /** 필수 입력 여부 */\n required?: boolean\n /** form 데이터 전송 시 키 이름 */\n name?: string\n /** 추가 CSS 클래스 */\n class?: string\n /** 스타일 테마 지정 */\n styletype?: 'default' | 'sm' | 'lg'\n }>(),\n {\n placeholder: '날짜를 선택하세요',\n styletype: 'default',\n }\n)\n\n// 이벤트 정의\nconst emit = defineEmits<{\n 'update:modelValue': [value: string | null]\n 'change': [value: string | null]\n 'focus': [event: FocusEvent]\n 'blur': [event: FocusEvent]\n}>()\n\n// 스타일 프리셋\nconst STYLE_PRESETS: Record<string, { buttonClass: string }> = {\n default: {\n buttonClass: 'h-8 text-xs px-2.5',\n },\n sm: {\n buttonClass: 'h-7 text-[11px] px-2',\n },\n lg: {\n buttonClass: 'h-9 text-sm px-3',\n },\n}\n\n// 내부 상태로 DateValue 관리\nconst internalDate = ref<DateValue | undefined>()\n\n// modelValue를 DateValue로 변환\nconst convertToDateValue = (value: string | null | undefined): DateValue | undefined => {\n if (!value) return undefined\n \n try {\n // ISO 8601 문자열을 직접 parseDate로 변환\n return parseDate(value)\n } catch {\n return undefined\n }\n}\n\n// DateValue를 ISO 문자열로 변환\nconst convertToString = (date: DateValue | undefined): string | null => {\n if (!date) return null\n return `${date.year}-${String(date.month).padStart(2, '0')}-${String(date.day).padStart(2, '0')}`\n}\n\n// modelValue 변경 감지\nwatch(\n () => props.modelValue,\n (newValue) => {\n const converted = convertToDateValue(newValue)\n if (JSON.stringify(internalDate.value) !== JSON.stringify(converted)) {\n internalDate.value = converted\n }\n },\n { immediate: true }\n)\n\n// 내부 날짜 변경 시 emit\nconst handleDateChange = (date: DateValue | undefined) => {\n internalDate.value = date\n const stringValue = convertToString(date)\n \n if (stringValue !== props.modelValue) {\n emit('update:modelValue', stringValue)\n emit('change', stringValue)\n }\n}\n\n// 포맷팅된 날짜 표시\nconst formattedDate = computed(() => {\n if (!internalDate.value) return props.placeholder\n \n const date = new Date(\n internalDate.value.year,\n internalDate.value.month - 1,\n internalDate.value.day\n )\n \n return new Intl.DateTimeFormat('ko-KR', {\n year: 'numeric',\n month: 'long',\n day: 'numeric',\n }).format(date)\n})\n\n// 버튼 클래스 계산\nconst buttonClass = computed(() => {\n const styleKey = props.styletype || 'default'\n const preset = STYLE_PRESETS[styleKey] ?? STYLE_PRESETS.default\n const userClass = props.class || ''\n \n return cn(\n 'w-full justify-start text-left font-normal',\n preset?.buttonClass ?? 'h-10',\n !internalDate.value && 'text-muted-foreground',\n userClass\n )\n})\n</script>\n\n<template>\n <Popover>\n <PopoverTrigger as-child>\n <Button\n :id=\"id\"\n :name=\"name\"\n :disabled=\"disabled\"\n :class=\"buttonClass\"\n variant=\"outline\"\n @focus=\"emit('focus', $event)\"\n @blur=\"emit('blur', $event)\"\n >\n <CalendarIcon class=\"mr-2 h-4 w-4\" />\n {{ formattedDate }}\n </Button>\n </PopoverTrigger>\n <PopoverContent class=\"w-auto p-0\">\n <Calendar\n v-model=\"internalDate\"\n :locale=\"'ko-KR'\"\n initial-focus\n @update:model-value=\"handleDateChange\"\n />\n </PopoverContent>\n </Popover>\n</template>\n\n"],"names":["props","__props","emit","__emit","STYLE_PRESETS","internalDate","ref","convertToDateValue","value","parseDate","convertToString","date","watch","newValue","converted","handleDateChange","stringValue","formattedDate","computed","buttonClass","styleKey","preset","userClass","cn","_createBlock","_unref","Popover","_createVNode","PopoverTrigger","Button","_cache","$event","CalendarIcon","_createTextVNode","PopoverContent","Calendar"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;AAcA,UAAMA,IAAQC,GA0BRC,IAAOC,GAQPC,IAAyD;AAAA,MAC7D,SAAS;AAAA,QACP,aAAa;AAAA,MAAA;AAAA,MAEf,IAAI;AAAA,QACF,aAAa;AAAA,MAAA;AAAA,MAEf,IAAI;AAAA,QACF,aAAa;AAAA,MAAA;AAAA,IACf,GAIIC,IAAeC,EAAA,GAGfC,IAAqB,CAACC,MAA4D;AACtF,UAAKA;AAEL,YAAI;AAEF,iBAAOC,EAAUD,CAAK;AAAA,QACxB,QAAQ;AACN;AAAA,QACF;AAAA,IACF,GAGME,IAAkB,CAACC,MAClBA,IACE,GAAGA,EAAK,IAAI,IAAI,OAAOA,EAAK,KAAK,EAAE,SAAS,GAAG,GAAG,CAAC,IAAI,OAAOA,EAAK,GAAG,EAAE,SAAS,GAAG,GAAG,CAAC,KAD7E;AAKpB,IAAAC;AAAA,MACE,MAAMZ,EAAM;AAAA,MACZ,CAACa,MAAa;AACZ,cAAMC,IAAYP,EAAmBM,CAAQ;AAC7C,QAAI,KAAK,UAAUR,EAAa,KAAK,MAAM,KAAK,UAAUS,CAAS,MACjET,EAAa,QAAQS;AAAA,MAEzB;AAAA,MACA,EAAE,WAAW,GAAA;AAAA,IAAK;AAIpB,UAAMC,IAAmB,CAACJ,MAAgC;AACxD,MAAAN,EAAa,QAAQM;AACrB,YAAMK,IAAcN,EAAgBC,CAAI;AAExC,MAAIK,MAAgBhB,EAAM,eACxBE,EAAK,qBAAqBc,CAAW,GACrCd,EAAK,UAAUc,CAAW;AAAA,IAE9B,GAGMC,IAAgBC,EAAS,MAAM;AACnC,UAAI,CAACb,EAAa,MAAO,QAAOL,EAAM;AAEtC,YAAMW,IAAO,IAAI;AAAA,QACfN,EAAa,MAAM;AAAA,QACnBA,EAAa,MAAM,QAAQ;AAAA,QAC3BA,EAAa,MAAM;AAAA,MAAA;AAGrB,aAAO,IAAI,KAAK,eAAe,SAAS;AAAA,QACtC,MAAM;AAAA,QACN,OAAO;AAAA,QACP,KAAK;AAAA,MAAA,CACN,EAAE,OAAOM,CAAI;AAAA,IAChB,CAAC,GAGKQ,IAAcD,EAAS,MAAM;AACjC,YAAME,IAAWpB,EAAM,aAAa,WAC9BqB,IAASjB,EAAcgB,CAAQ,KAAKhB,EAAc,SAClDkB,IAAYtB,EAAM,SAAS;AAEjC,aAAOuB;AAAA,QACL;AAAA,QACAF,GAAQ,eAAe;AAAA,QACvB,CAAChB,EAAa,SAAS;AAAA,QACvBiB;AAAA,MAAA;AAAA,IAEJ,CAAC;2BAICE,EAuBUC,EAAAC,CAAA,GAAA,MAAA;AAAA,iBAtBR,MAaiB;AAAA,QAbjBC,EAaiBF,EAAAG,CAAA,GAAA,EAbD,YAAA,MAAQ;AAAA,qBACtB,MAWS;AAAA,YAXTD,EAWSF,EAAAI,CAAA,GAAA;AAAA,cAVN,IAAI5B,EAAA;AAAA,cACJ,MAAMA,EAAA;AAAA,cACN,UAAUA,EAAA;AAAA,cACV,SAAOkB,EAAA,KAAW;AAAA,cACnB,SAAQ;AAAA,cACP,SAAKW,EAAA,CAAA,MAAAA,EAAA,CAAA,IAAA,CAAAC,MAAE7B,EAAI,SAAU6B,CAAM;AAAA,cAC3B,QAAID,EAAA,CAAA,MAAAA,EAAA,CAAA,IAAA,CAAAC,MAAE7B,EAAI,QAAS6B,CAAM;AAAA,YAAA;yBAE1B,MAAqC;AAAA,gBAArCJ,EAAqCF,EAAAO,CAAA,GAAA,EAAvB,OAAM,gBAAc;AAAA,gBAAGC,EAAA,QAClChB,EAAA,KAAa,GAAA,CAAA;AAAA,cAAA;;;;;;QAGpBU,EAOiBF,EAAAS,CAAA,GAAA,EAPD,OAAM,gBAAY;AAAA,qBAChC,MAKE;AAAA,YALFP,EAKEF,EAAAU,CAAA,GAAA;AAAA,0BAJS9B,EAAA;AAAA;uCAAAA,EAAY,QAAA0B;AAAA,gBAGAhB;AAAA,cAAA;AAAA,cAFpB,QAAQ;AAAA,cACT,iBAAA;AAAA,YAAA;;;;;;;;;"}
@@ -1 +1 @@
1
- {"version":3,"file":"JDivider.vue.cjs","sources":["../../../../src/components/atoms/JDivider.vue"],"sourcesContent":["<script setup lang=\"ts\">\nimport { computed } from 'vue'\nimport { Separator } from '@/components/shadcn'\n\ntype StyleType = 'default' | 'primary' | 'secondary' | 'muted' | 'sm' | 'lg'\n\nconst props = withDefaults(\n defineProps<{\n /** 구분선 방향 */\n orientation?: 'horizontal' | 'vertical'\n /** 구분선 스타일 테마 */\n styletype?: StyleType\n /** 추가 CSS 클래스 */\n class?: string\n }>(),\n {\n orientation: 'horizontal',\n styletype: 'default',\n },\n)\n\nconst STYLE_PRESETS: Record<StyleType, { class?: string }> = {\n default: { class: 'bg-border' },\n primary: { class: 'bg-primary' },\n secondary: { class: 'bg-secondary' },\n muted: { class: 'bg-muted' },\n sm: { class: 'h-px' },\n lg: { class: 'h-0.5' },\n}\n\nconst mapped = computed(() => {\n const styleKey = props.styletype || 'default'\n const preset = STYLE_PRESETS[styleKey] ?? STYLE_PRESETS.default\n const finalClass = [preset?.class, props.class].filter(Boolean).join(' ')\n\n return {\n orientation: props.orientation,\n class: finalClass,\n }\n})\n</script>\n\n<template>\n <Separator v-bind=\"mapped\" />\n</template>\n"],"names":["props","__props","STYLE_PRESETS","mapped","computed","styleKey","finalClass","_openBlock","_createBlock","_unref"],"mappings":"mVAMA,MAAMA,EAAQC,EAeRC,EAAuD,CAC3D,QAAS,CAAE,MAAO,WAAA,EAClB,QAAS,CAAE,MAAO,YAAA,EAClB,UAAW,CAAE,MAAO,cAAA,EACpB,MAAO,CAAE,MAAO,UAAA,EAChB,GAAI,CAAE,MAAO,MAAA,EACb,GAAI,CAAE,MAAO,OAAA,CAAQ,EAGjBC,EAASC,EAAAA,SAAS,IAAM,CAC5B,MAAMC,EAAWL,EAAM,WAAa,UAE9BM,EAAa,EADJJ,EAAcG,CAAQ,GAAKH,EAAc,UAC5B,MAAOF,EAAM,KAAK,EAAE,OAAO,OAAO,EAAE,KAAK,GAAG,EAExE,MAAO,CACL,YAAaA,EAAM,YACnB,MAAOM,CAAA,CAEX,CAAC,gBAICC,EAAAA,UAAA,EAAAC,EAAAA,YAA6BC,EAAAA,uDAAVN,EAAA,KAAM,CAAA,EAAA,KAAA,EAAA"}
1
+ {"version":3,"file":"JDivider.vue.cjs","sources":["../../../../src/components/atoms/JDivider.vue"],"sourcesContent":["<script setup lang=\"ts\">\r\nimport { computed } from 'vue'\r\nimport { Separator } from '@/components/shadcn'\r\n\r\ntype StyleType = 'default' | 'primary' | 'secondary' | 'muted' | 'sm' | 'lg'\r\n\r\nconst props = withDefaults(\r\n defineProps<{\r\n /** 구분선 방향 */\r\n orientation?: 'horizontal' | 'vertical'\r\n /** 구분선 스타일 테마 */\r\n styletype?: StyleType\r\n /** 추가 CSS 클래스 */\r\n class?: string\r\n }>(),\r\n {\r\n orientation: 'horizontal',\r\n styletype: 'default',\r\n },\r\n)\r\n\r\nconst STYLE_PRESETS: Record<StyleType, { class?: string }> = {\r\n default: { class: 'bg-border' },\r\n primary: { class: 'bg-primary' },\r\n secondary: { class: 'bg-secondary' },\r\n muted: { class: 'bg-muted' },\r\n sm: { class: 'h-px' },\r\n lg: { class: 'h-0.5' },\r\n}\r\n\r\nconst mapped = computed(() => {\r\n const styleKey = props.styletype || 'default'\r\n const preset = STYLE_PRESETS[styleKey] ?? STYLE_PRESETS.default\r\n const finalClass = [preset?.class, props.class].filter(Boolean).join(' ')\r\n\r\n return {\r\n orientation: props.orientation,\r\n class: finalClass,\r\n }\r\n})\r\n</script>\r\n\r\n<template>\r\n <Separator v-bind=\"mapped\" />\r\n</template>\r\n"],"names":["props","__props","STYLE_PRESETS","mapped","computed","styleKey","finalClass","_openBlock","_createBlock","_unref"],"mappings":"mVAMA,MAAMA,EAAQC,EAeRC,EAAuD,CAC3D,QAAS,CAAE,MAAO,WAAA,EAClB,QAAS,CAAE,MAAO,YAAA,EAClB,UAAW,CAAE,MAAO,cAAA,EACpB,MAAO,CAAE,MAAO,UAAA,EAChB,GAAI,CAAE,MAAO,MAAA,EACb,GAAI,CAAE,MAAO,OAAA,CAAQ,EAGjBC,EAASC,EAAAA,SAAS,IAAM,CAC5B,MAAMC,EAAWL,EAAM,WAAa,UAE9BM,EAAa,EADJJ,EAAcG,CAAQ,GAAKH,EAAc,UAC5B,MAAOF,EAAM,KAAK,EAAE,OAAO,OAAO,EAAE,KAAK,GAAG,EAExE,MAAO,CACL,YAAaA,EAAM,YACnB,MAAOM,CAAA,CAEX,CAAC,gBAICC,EAAAA,UAAA,EAAAC,EAAAA,YAA6BC,EAAAA,uDAAVN,EAAA,KAAM,CAAA,EAAA,KAAA,EAAA"}
@@ -1 +1 @@
1
- {"version":3,"file":"JDivider.vue.js","sources":["../../../../src/components/atoms/JDivider.vue"],"sourcesContent":["<script setup lang=\"ts\">\nimport { computed } from 'vue'\nimport { Separator } from '@/components/shadcn'\n\ntype StyleType = 'default' | 'primary' | 'secondary' | 'muted' | 'sm' | 'lg'\n\nconst props = withDefaults(\n defineProps<{\n /** 구분선 방향 */\n orientation?: 'horizontal' | 'vertical'\n /** 구분선 스타일 테마 */\n styletype?: StyleType\n /** 추가 CSS 클래스 */\n class?: string\n }>(),\n {\n orientation: 'horizontal',\n styletype: 'default',\n },\n)\n\nconst STYLE_PRESETS: Record<StyleType, { class?: string }> = {\n default: { class: 'bg-border' },\n primary: { class: 'bg-primary' },\n secondary: { class: 'bg-secondary' },\n muted: { class: 'bg-muted' },\n sm: { class: 'h-px' },\n lg: { class: 'h-0.5' },\n}\n\nconst mapped = computed(() => {\n const styleKey = props.styletype || 'default'\n const preset = STYLE_PRESETS[styleKey] ?? STYLE_PRESETS.default\n const finalClass = [preset?.class, props.class].filter(Boolean).join(' ')\n\n return {\n orientation: props.orientation,\n class: finalClass,\n }\n})\n</script>\n\n<template>\n <Separator v-bind=\"mapped\" />\n</template>\n"],"names":["props","__props","STYLE_PRESETS","mapped","computed","styleKey","finalClass","_openBlock","_createBlock","_unref"],"mappings":";;;;;;;;;;;AAMA,UAAMA,IAAQC,GAeRC,IAAuD;AAAA,MAC3D,SAAS,EAAE,OAAO,YAAA;AAAA,MAClB,SAAS,EAAE,OAAO,aAAA;AAAA,MAClB,WAAW,EAAE,OAAO,eAAA;AAAA,MACpB,OAAO,EAAE,OAAO,WAAA;AAAA,MAChB,IAAI,EAAE,OAAO,OAAA;AAAA,MACb,IAAI,EAAE,OAAO,QAAA;AAAA,IAAQ,GAGjBC,IAASC,EAAS,MAAM;AAC5B,YAAMC,IAAWL,EAAM,aAAa,WAE9BM,IAAa,EADJJ,EAAcG,CAAQ,KAAKH,EAAc,UAC5B,OAAOF,EAAM,KAAK,EAAE,OAAO,OAAO,EAAE,KAAK,GAAG;AAExE,aAAO;AAAA,QACL,aAAaA,EAAM;AAAA,QACnB,OAAOM;AAAA,MAAA;AAAA,IAEX,CAAC;sBAICC,EAAA,GAAAC,EAA6BC,UAAVN,EAAA,KAAM,CAAA,GAAA,MAAA,EAAA;AAAA;;"}
1
+ {"version":3,"file":"JDivider.vue.js","sources":["../../../../src/components/atoms/JDivider.vue"],"sourcesContent":["<script setup lang=\"ts\">\r\nimport { computed } from 'vue'\r\nimport { Separator } from '@/components/shadcn'\r\n\r\ntype StyleType = 'default' | 'primary' | 'secondary' | 'muted' | 'sm' | 'lg'\r\n\r\nconst props = withDefaults(\r\n defineProps<{\r\n /** 구분선 방향 */\r\n orientation?: 'horizontal' | 'vertical'\r\n /** 구분선 스타일 테마 */\r\n styletype?: StyleType\r\n /** 추가 CSS 클래스 */\r\n class?: string\r\n }>(),\r\n {\r\n orientation: 'horizontal',\r\n styletype: 'default',\r\n },\r\n)\r\n\r\nconst STYLE_PRESETS: Record<StyleType, { class?: string }> = {\r\n default: { class: 'bg-border' },\r\n primary: { class: 'bg-primary' },\r\n secondary: { class: 'bg-secondary' },\r\n muted: { class: 'bg-muted' },\r\n sm: { class: 'h-px' },\r\n lg: { class: 'h-0.5' },\r\n}\r\n\r\nconst mapped = computed(() => {\r\n const styleKey = props.styletype || 'default'\r\n const preset = STYLE_PRESETS[styleKey] ?? STYLE_PRESETS.default\r\n const finalClass = [preset?.class, props.class].filter(Boolean).join(' ')\r\n\r\n return {\r\n orientation: props.orientation,\r\n class: finalClass,\r\n }\r\n})\r\n</script>\r\n\r\n<template>\r\n <Separator v-bind=\"mapped\" />\r\n</template>\r\n"],"names":["props","__props","STYLE_PRESETS","mapped","computed","styleKey","finalClass","_openBlock","_createBlock","_unref"],"mappings":";;;;;;;;;;;AAMA,UAAMA,IAAQC,GAeRC,IAAuD;AAAA,MAC3D,SAAS,EAAE,OAAO,YAAA;AAAA,MAClB,SAAS,EAAE,OAAO,aAAA;AAAA,MAClB,WAAW,EAAE,OAAO,eAAA;AAAA,MACpB,OAAO,EAAE,OAAO,WAAA;AAAA,MAChB,IAAI,EAAE,OAAO,OAAA;AAAA,MACb,IAAI,EAAE,OAAO,QAAA;AAAA,IAAQ,GAGjBC,IAASC,EAAS,MAAM;AAC5B,YAAMC,IAAWL,EAAM,aAAa,WAE9BM,IAAa,EADJJ,EAAcG,CAAQ,KAAKH,EAAc,UAC5B,OAAOF,EAAM,KAAK,EAAE,OAAO,OAAO,EAAE,KAAK,GAAG;AAExE,aAAO;AAAA,QACL,aAAaA,EAAM;AAAA,QACnB,OAAOM;AAAA,MAAA;AAAA,IAEX,CAAC;sBAICC,EAAA,GAAAC,EAA6BC,UAAVN,EAAA,KAAM,CAAA,GAAA,MAAA,EAAA;AAAA;;"}
@@ -3,5 +3,5 @@
3
3
  for (const [t_key, t_val] of t_opts)
4
4
  t_merged[t_key] = t_val;
5
5
  return t_merged;
6
- };,u=t(e.default,[["__scopeId","data-v-24e74219"]]);exports.default=u;
6
+ };,u=t(e.default,[["__scopeId","data-v-f2b1f27c"]]);exports.default=u;
7
7
  //# sourceMappingURL=JEditor.vue.cjs.map
@@ -6,8 +6,8 @@ const t = (t_comp, t_opts) => {
6
6
  t_merged[t_key] = t_val;
7
7
  return t_merged;
8
8
  };
9
- const _ = /* @__PURE__ */ t(o, [["__scopeId", "data-v-24e74219"]]);
9
+ const p = /* @__PURE__ */ t(o, [["__scopeId", "data-v-f2b1f27c"]]);
10
10
  export {
11
- _ as default
11
+ p as default
12
12
  };
13
13
  //# sourceMappingURL=JEditor.vue.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"JEditor.vue2.cjs","sources":["../../../../src/components/atoms/JEditor.vue"],"sourcesContent":["<script setup lang=\"ts\">\nimport { ref, computed, onMounted, onUnmounted } from 'vue'\nimport { MdEditor } from 'md-editor-v3'\nimport 'md-editor-v3/lib/style.css'\n\nconst props = withDefaults(\n defineProps<{\n /** 마크다운 내용 (v-model) */\n modelValue?: string\n /** 플레이스홀더 텍스트 */\n placeholder?: string\n /** 비활성화 상태 */\n disabled?: boolean\n /** 읽기 전용 상태 */\n readonly?: boolean\n /** 에디터 높이 */\n height?: string | number\n /** 테마 (light/dark) - 설정하지 않으면 자동으로 다크모드 감지 */\n theme?: 'light' | 'dark'\n /** 추가 CSS 클래스 */\n class?: string\n }>(),\n {\n modelValue: '',\n placeholder: '마크다운을 입력하세요...',\n disabled: false,\n readonly: false,\n height: '300px',\n },\n)\n\nconst emit = defineEmits<{\n 'update:modelValue': [value: string]\n 'change': [value: string]\n 'save': [value: string]\n}>()\n\n// 다크모드 상태\nconst isDarkMode = ref(false)\n\n// 다크모드 감지 함수\nconst detectDarkMode = () => {\n isDarkMode.value = document.documentElement.classList.contains('dark')\n}\n\n// 현재 테마 계산 (props.theme이 있으면 그것 사용, 없으면 자동 감지)\nconst currentTheme = computed(() => {\n if (props.theme) {\n return props.theme\n }\n return isDarkMode.value ? 'dark' : 'light'\n})\n\n// MutationObserver로 다크모드 변경 감지\nlet darkModeObserver: MutationObserver | null = null\n\nonMounted(() => {\n // 초기 다크모드 상태 감지\n detectDarkMode()\n \n // MutationObserver로 class 변경 감지\n darkModeObserver = new MutationObserver(() => {\n detectDarkMode()\n })\n \n darkModeObserver.observe(document.documentElement, {\n attributes: true,\n attributeFilter: ['class'],\n })\n})\n\nonUnmounted(() => {\n if (darkModeObserver) {\n darkModeObserver.disconnect()\n }\n})\n\nconst handleChange = (value: string) => {\n emit('update:modelValue', value)\n emit('change', value)\n}\n\nconst handleSave = (value: string) => {\n emit('save', value)\n}\n</script>\n\r\n<template>\n <div :class=\"['j-editor-wrapper', props.class]\">\n <MdEditor\n :model-value=\"modelValue\"\n :placeholder=\"placeholder\"\n :disabled=\"disabled\"\n :read-only=\"readonly\"\n :editor-class-name=\"'j-editor'\"\n :preview-class-name=\"'j-editor-preview'\"\n :style=\"{ height: typeof height === 'number' ? `${height}px` : height }\"\n :theme=\"currentTheme\"\n language=\"en-US\"\n @update:model-value=\"handleChange\"\n @on-save=\"handleSave\"\n />\n </div>\n</template>\n\r\n<style scoped>\r\n.j-editor-wrapper {\r\n @apply w-full;\r\n}\r\n</style>\r\n"],"names":["props","__props","emit","__emit","isDarkMode","ref","detectDarkMode","currentTheme","computed","darkModeObserver","onMounted","onUnmounted","handleChange","value","handleSave","_createElementBlock","_normalizeClass","_createVNode","_unref","MdEditor","_normalizeStyle"],"mappings":"+jBAKA,MAAMA,EAAQC,EA0BRC,EAAOC,EAOPC,EAAaC,EAAAA,IAAI,EAAK,EAGtBC,EAAiB,IAAM,CAC3BF,EAAW,MAAQ,SAAS,gBAAgB,UAAU,SAAS,MAAM,CACvE,EAGMG,EAAeC,EAAAA,SAAS,IACxBR,EAAM,MACDA,EAAM,MAERI,EAAW,MAAQ,OAAS,OACpC,EAGD,IAAIK,EAA4C,KAEhDC,EAAAA,UAAU,IAAM,CAEdJ,EAAA,EAGAG,EAAmB,IAAI,iBAAiB,IAAM,CAC5CH,EAAA,CACF,CAAC,EAEDG,EAAiB,QAAQ,SAAS,gBAAiB,CACjD,WAAY,GACZ,gBAAiB,CAAC,OAAO,CAAA,CAC1B,CACH,CAAC,EAEDE,EAAAA,YAAY,IAAM,CACZF,GACFA,EAAiB,WAAA,CAErB,CAAC,EAED,MAAMG,EAAgBC,GAAkB,CACtCX,EAAK,oBAAqBW,CAAK,EAC/BX,EAAK,SAAUW,CAAK,CACtB,EAEMC,EAAcD,GAAkB,CACpCX,EAAK,OAAQW,CAAK,CACpB,8BAIEE,EAAAA,mBAcM,MAAA,CAdA,MAAKC,EAAAA,eAAA,CAAA,mBAAuBhB,EAAM,KAAK,CAAA,CAAA,GAC3CiB,cAYEC,EAAAA,MAAAC,EAAAA,QAAA,EAAA,CAXC,cAAalB,EAAA,WACb,YAAaA,EAAA,YACb,SAAUA,EAAA,SACV,YAAWA,EAAA,SACX,oBAAmB,WACnB,qBAAoB,mBACpB,MAAKmB,EAAAA,eAAA,CAAA,OAAA,OAAmBnB,EAAA,QAAM,SAAA,GAAmBA,EAAA,MAAM,KAAOA,EAAA,OAAM,EACpE,MAAOM,EAAA,MACR,SAAS,QACR,sBAAoBK,EACpB,SAASE,CAAA"}
1
+ {"version":3,"file":"JEditor.vue2.cjs","sources":["../../../../src/components/atoms/JEditor.vue"],"sourcesContent":["<script setup lang=\"ts\">\nimport { ref, computed, onMounted, onUnmounted } from 'vue'\nimport { MdEditor } from 'md-editor-v3'\nimport 'md-editor-v3/lib/style.css'\n\nconst props = withDefaults(\n defineProps<{\n /** 마크다운 내용 (v-model) */\n modelValue?: string\n /** 플레이스홀더 텍스트 */\n placeholder?: string\n /** 비활성화 상태 */\n disabled?: boolean\n /** 읽기 전용 상태 */\n readonly?: boolean\n /** 에디터 높이 */\n height?: string | number\n /** 테마 (light/dark) - 설정하지 않으면 자동으로 다크모드 감지 */\n theme?: 'light' | 'dark'\n /** 추가 CSS 클래스 */\n class?: string\n }>(),\n {\n modelValue: '',\n placeholder: '마크다운을 입력하세요...',\n disabled: false,\n readonly: false,\n height: '300px',\n },\n)\n\nconst emit = defineEmits<{\n 'update:modelValue': [value: string]\n 'change': [value: string]\n 'save': [value: string]\n}>()\n\n// 다크모드 상태\nconst isDarkMode = ref(false)\n\n// 다크모드 감지 함수\nconst detectDarkMode = () => {\n isDarkMode.value = document.documentElement.classList.contains('dark')\n}\n\n// 현재 테마 계산 (props.theme이 있으면 그것 사용, 없으면 자동 감지)\nconst currentTheme = computed(() => {\n if (props.theme) {\n return props.theme\n }\n return isDarkMode.value ? 'dark' : 'light'\n})\n\n// MutationObserver로 다크모드 변경 감지\nlet darkModeObserver: MutationObserver | null = null\n\nonMounted(() => {\n // 초기 다크모드 상태 감지\n detectDarkMode()\n \n // MutationObserver로 class 변경 감지\n darkModeObserver = new MutationObserver(() => {\n detectDarkMode()\n })\n \n darkModeObserver.observe(document.documentElement, {\n attributes: true,\n attributeFilter: ['class'],\n })\n})\n\nonUnmounted(() => {\n if (darkModeObserver) {\n darkModeObserver.disconnect()\n }\n})\n\nconst handleChange = (value: string) => {\n emit('update:modelValue', value)\n emit('change', value)\n}\n\nconst handleSave = (value: string) => {\n emit('save', value)\n}\n</script>\n\n<template>\n <div :class=\"['j-editor-wrapper', props.class]\">\n <MdEditor\n :model-value=\"modelValue\"\n :placeholder=\"placeholder\"\n :disabled=\"disabled\"\n :read-only=\"readonly\"\n :editor-class-name=\"'j-editor'\"\n :preview-class-name=\"'j-editor-preview'\"\n :style=\"{ height: typeof height === 'number' ? `${height}px` : height }\"\n :theme=\"currentTheme\"\n language=\"en-US\"\n @update:model-value=\"handleChange\"\n @on-save=\"handleSave\"\n />\n </div>\n</template>\n\n<style scoped>\n.j-editor-wrapper {\n @apply w-full;\n}\n</style>\n"],"names":["props","__props","emit","__emit","isDarkMode","ref","detectDarkMode","currentTheme","computed","darkModeObserver","onMounted","onUnmounted","handleChange","value","handleSave","_createElementBlock","_normalizeClass","_createVNode","_unref","MdEditor","_normalizeStyle"],"mappings":"+jBAKA,MAAMA,EAAQC,EA0BRC,EAAOC,EAOPC,EAAaC,EAAAA,IAAI,EAAK,EAGtBC,EAAiB,IAAM,CAC3BF,EAAW,MAAQ,SAAS,gBAAgB,UAAU,SAAS,MAAM,CACvE,EAGMG,EAAeC,EAAAA,SAAS,IACxBR,EAAM,MACDA,EAAM,MAERI,EAAW,MAAQ,OAAS,OACpC,EAGD,IAAIK,EAA4C,KAEhDC,EAAAA,UAAU,IAAM,CAEdJ,EAAA,EAGAG,EAAmB,IAAI,iBAAiB,IAAM,CAC5CH,EAAA,CACF,CAAC,EAEDG,EAAiB,QAAQ,SAAS,gBAAiB,CACjD,WAAY,GACZ,gBAAiB,CAAC,OAAO,CAAA,CAC1B,CACH,CAAC,EAEDE,EAAAA,YAAY,IAAM,CACZF,GACFA,EAAiB,WAAA,CAErB,CAAC,EAED,MAAMG,EAAgBC,GAAkB,CACtCX,EAAK,oBAAqBW,CAAK,EAC/BX,EAAK,SAAUW,CAAK,CACtB,EAEMC,EAAcD,GAAkB,CACpCX,EAAK,OAAQW,CAAK,CACpB,8BAIEE,EAAAA,mBAcM,MAAA,CAdA,MAAKC,EAAAA,eAAA,CAAA,mBAAuBhB,EAAM,KAAK,CAAA,CAAA,GAC3CiB,cAYEC,EAAAA,MAAAC,EAAAA,QAAA,EAAA,CAXC,cAAalB,EAAA,WACb,YAAaA,EAAA,YACb,SAAUA,EAAA,SACV,YAAWA,EAAA,SACX,oBAAmB,WACnB,qBAAoB,mBACpB,MAAKmB,EAAAA,eAAA,CAAA,OAAA,OAAmBnB,EAAA,QAAM,SAAA,GAAmBA,EAAA,MAAM,KAAOA,EAAA,OAAM,EACpE,MAAOM,EAAA,MACR,SAAS,QACR,sBAAoBK,EACpB,SAASE,CAAA"}
@@ -1 +1 @@
1
- {"version":3,"file":"JEditor.vue2.js","sources":["../../../../src/components/atoms/JEditor.vue"],"sourcesContent":["<script setup lang=\"ts\">\nimport { ref, computed, onMounted, onUnmounted } from 'vue'\nimport { MdEditor } from 'md-editor-v3'\nimport 'md-editor-v3/lib/style.css'\n\nconst props = withDefaults(\n defineProps<{\n /** 마크다운 내용 (v-model) */\n modelValue?: string\n /** 플레이스홀더 텍스트 */\n placeholder?: string\n /** 비활성화 상태 */\n disabled?: boolean\n /** 읽기 전용 상태 */\n readonly?: boolean\n /** 에디터 높이 */\n height?: string | number\n /** 테마 (light/dark) - 설정하지 않으면 자동으로 다크모드 감지 */\n theme?: 'light' | 'dark'\n /** 추가 CSS 클래스 */\n class?: string\n }>(),\n {\n modelValue: '',\n placeholder: '마크다운을 입력하세요...',\n disabled: false,\n readonly: false,\n height: '300px',\n },\n)\n\nconst emit = defineEmits<{\n 'update:modelValue': [value: string]\n 'change': [value: string]\n 'save': [value: string]\n}>()\n\n// 다크모드 상태\nconst isDarkMode = ref(false)\n\n// 다크모드 감지 함수\nconst detectDarkMode = () => {\n isDarkMode.value = document.documentElement.classList.contains('dark')\n}\n\n// 현재 테마 계산 (props.theme이 있으면 그것 사용, 없으면 자동 감지)\nconst currentTheme = computed(() => {\n if (props.theme) {\n return props.theme\n }\n return isDarkMode.value ? 'dark' : 'light'\n})\n\n// MutationObserver로 다크모드 변경 감지\nlet darkModeObserver: MutationObserver | null = null\n\nonMounted(() => {\n // 초기 다크모드 상태 감지\n detectDarkMode()\n \n // MutationObserver로 class 변경 감지\n darkModeObserver = new MutationObserver(() => {\n detectDarkMode()\n })\n \n darkModeObserver.observe(document.documentElement, {\n attributes: true,\n attributeFilter: ['class'],\n })\n})\n\nonUnmounted(() => {\n if (darkModeObserver) {\n darkModeObserver.disconnect()\n }\n})\n\nconst handleChange = (value: string) => {\n emit('update:modelValue', value)\n emit('change', value)\n}\n\nconst handleSave = (value: string) => {\n emit('save', value)\n}\n</script>\n\r\n<template>\n <div :class=\"['j-editor-wrapper', props.class]\">\n <MdEditor\n :model-value=\"modelValue\"\n :placeholder=\"placeholder\"\n :disabled=\"disabled\"\n :read-only=\"readonly\"\n :editor-class-name=\"'j-editor'\"\n :preview-class-name=\"'j-editor-preview'\"\n :style=\"{ height: typeof height === 'number' ? `${height}px` : height }\"\n :theme=\"currentTheme\"\n language=\"en-US\"\n @update:model-value=\"handleChange\"\n @on-save=\"handleSave\"\n />\n </div>\n</template>\n\r\n<style scoped>\r\n.j-editor-wrapper {\r\n @apply w-full;\r\n}\r\n</style>\r\n"],"names":["props","__props","emit","__emit","isDarkMode","ref","detectDarkMode","currentTheme","computed","darkModeObserver","onMounted","onUnmounted","handleChange","value","handleSave","_createElementBlock","_normalizeClass","_createVNode","_unref","MdEditor","_normalizeStyle"],"mappings":";;;;;;;;;;;;;;;;AAKA,UAAMA,IAAQC,GA0BRC,IAAOC,GAOPC,IAAaC,EAAI,EAAK,GAGtBC,IAAiB,MAAM;AAC3B,MAAAF,EAAW,QAAQ,SAAS,gBAAgB,UAAU,SAAS,MAAM;AAAA,IACvE,GAGMG,IAAeC,EAAS,MACxBR,EAAM,QACDA,EAAM,QAERI,EAAW,QAAQ,SAAS,OACpC;AAGD,QAAIK,IAA4C;AAEhD,IAAAC,EAAU,MAAM;AAEd,MAAAJ,EAAA,GAGAG,IAAmB,IAAI,iBAAiB,MAAM;AAC5C,QAAAH,EAAA;AAAA,MACF,CAAC,GAEDG,EAAiB,QAAQ,SAAS,iBAAiB;AAAA,QACjD,YAAY;AAAA,QACZ,iBAAiB,CAAC,OAAO;AAAA,MAAA,CAC1B;AAAA,IACH,CAAC,GAEDE,EAAY,MAAM;AAChB,MAAIF,KACFA,EAAiB,WAAA;AAAA,IAErB,CAAC;AAED,UAAMG,IAAe,CAACC,MAAkB;AACtC,MAAAX,EAAK,qBAAqBW,CAAK,GAC/BX,EAAK,UAAUW,CAAK;AAAA,IACtB,GAEMC,IAAa,CAACD,MAAkB;AACpC,MAAAX,EAAK,QAAQW,CAAK;AAAA,IACpB;2BAIEE,EAcM,OAAA;AAAA,MAdA,OAAKC,EAAA,CAAA,oBAAuBhB,EAAM,KAAK,CAAA;AAAA,IAAA;MAC3CiB,EAYEC,EAAAC,CAAA,GAAA;AAAA,QAXC,eAAalB,EAAA;AAAA,QACb,aAAaA,EAAA;AAAA,QACb,UAAUA,EAAA;AAAA,QACV,aAAWA,EAAA;AAAA,QACX,qBAAmB;AAAA,QACnB,sBAAoB;AAAA,QACpB,OAAKmB,EAAA,EAAA,QAAA,OAAmBnB,EAAA,UAAM,WAAA,GAAmBA,EAAA,MAAM,OAAOA,EAAA,QAAM;AAAA,QACpE,OAAOM,EAAA;AAAA,QACR,UAAS;AAAA,QACR,uBAAoBK;AAAA,QACpB,UAASE;AAAA,MAAA;;;;"}
1
+ {"version":3,"file":"JEditor.vue2.js","sources":["../../../../src/components/atoms/JEditor.vue"],"sourcesContent":["<script setup lang=\"ts\">\nimport { ref, computed, onMounted, onUnmounted } from 'vue'\nimport { MdEditor } from 'md-editor-v3'\nimport 'md-editor-v3/lib/style.css'\n\nconst props = withDefaults(\n defineProps<{\n /** 마크다운 내용 (v-model) */\n modelValue?: string\n /** 플레이스홀더 텍스트 */\n placeholder?: string\n /** 비활성화 상태 */\n disabled?: boolean\n /** 읽기 전용 상태 */\n readonly?: boolean\n /** 에디터 높이 */\n height?: string | number\n /** 테마 (light/dark) - 설정하지 않으면 자동으로 다크모드 감지 */\n theme?: 'light' | 'dark'\n /** 추가 CSS 클래스 */\n class?: string\n }>(),\n {\n modelValue: '',\n placeholder: '마크다운을 입력하세요...',\n disabled: false,\n readonly: false,\n height: '300px',\n },\n)\n\nconst emit = defineEmits<{\n 'update:modelValue': [value: string]\n 'change': [value: string]\n 'save': [value: string]\n}>()\n\n// 다크모드 상태\nconst isDarkMode = ref(false)\n\n// 다크모드 감지 함수\nconst detectDarkMode = () => {\n isDarkMode.value = document.documentElement.classList.contains('dark')\n}\n\n// 현재 테마 계산 (props.theme이 있으면 그것 사용, 없으면 자동 감지)\nconst currentTheme = computed(() => {\n if (props.theme) {\n return props.theme\n }\n return isDarkMode.value ? 'dark' : 'light'\n})\n\n// MutationObserver로 다크모드 변경 감지\nlet darkModeObserver: MutationObserver | null = null\n\nonMounted(() => {\n // 초기 다크모드 상태 감지\n detectDarkMode()\n \n // MutationObserver로 class 변경 감지\n darkModeObserver = new MutationObserver(() => {\n detectDarkMode()\n })\n \n darkModeObserver.observe(document.documentElement, {\n attributes: true,\n attributeFilter: ['class'],\n })\n})\n\nonUnmounted(() => {\n if (darkModeObserver) {\n darkModeObserver.disconnect()\n }\n})\n\nconst handleChange = (value: string) => {\n emit('update:modelValue', value)\n emit('change', value)\n}\n\nconst handleSave = (value: string) => {\n emit('save', value)\n}\n</script>\n\n<template>\n <div :class=\"['j-editor-wrapper', props.class]\">\n <MdEditor\n :model-value=\"modelValue\"\n :placeholder=\"placeholder\"\n :disabled=\"disabled\"\n :read-only=\"readonly\"\n :editor-class-name=\"'j-editor'\"\n :preview-class-name=\"'j-editor-preview'\"\n :style=\"{ height: typeof height === 'number' ? `${height}px` : height }\"\n :theme=\"currentTheme\"\n language=\"en-US\"\n @update:model-value=\"handleChange\"\n @on-save=\"handleSave\"\n />\n </div>\n</template>\n\n<style scoped>\n.j-editor-wrapper {\n @apply w-full;\n}\n</style>\n"],"names":["props","__props","emit","__emit","isDarkMode","ref","detectDarkMode","currentTheme","computed","darkModeObserver","onMounted","onUnmounted","handleChange","value","handleSave","_createElementBlock","_normalizeClass","_createVNode","_unref","MdEditor","_normalizeStyle"],"mappings":";;;;;;;;;;;;;;;;AAKA,UAAMA,IAAQC,GA0BRC,IAAOC,GAOPC,IAAaC,EAAI,EAAK,GAGtBC,IAAiB,MAAM;AAC3B,MAAAF,EAAW,QAAQ,SAAS,gBAAgB,UAAU,SAAS,MAAM;AAAA,IACvE,GAGMG,IAAeC,EAAS,MACxBR,EAAM,QACDA,EAAM,QAERI,EAAW,QAAQ,SAAS,OACpC;AAGD,QAAIK,IAA4C;AAEhD,IAAAC,EAAU,MAAM;AAEd,MAAAJ,EAAA,GAGAG,IAAmB,IAAI,iBAAiB,MAAM;AAC5C,QAAAH,EAAA;AAAA,MACF,CAAC,GAEDG,EAAiB,QAAQ,SAAS,iBAAiB;AAAA,QACjD,YAAY;AAAA,QACZ,iBAAiB,CAAC,OAAO;AAAA,MAAA,CAC1B;AAAA,IACH,CAAC,GAEDE,EAAY,MAAM;AAChB,MAAIF,KACFA,EAAiB,WAAA;AAAA,IAErB,CAAC;AAED,UAAMG,IAAe,CAACC,MAAkB;AACtC,MAAAX,EAAK,qBAAqBW,CAAK,GAC/BX,EAAK,UAAUW,CAAK;AAAA,IACtB,GAEMC,IAAa,CAACD,MAAkB;AACpC,MAAAX,EAAK,QAAQW,CAAK;AAAA,IACpB;2BAIEE,EAcM,OAAA;AAAA,MAdA,OAAKC,EAAA,CAAA,oBAAuBhB,EAAM,KAAK,CAAA;AAAA,IAAA;MAC3CiB,EAYEC,EAAAC,CAAA,GAAA;AAAA,QAXC,eAAalB,EAAA;AAAA,QACb,aAAaA,EAAA;AAAA,QACb,UAAUA,EAAA;AAAA,QACV,aAAWA,EAAA;AAAA,QACX,qBAAmB;AAAA,QACnB,sBAAoB;AAAA,QACpB,OAAKmB,EAAA,EAAA,QAAA,OAAmBnB,EAAA,UAAM,WAAA,GAAmBA,EAAA,MAAM,OAAOA,EAAA,QAAM;AAAA,QACpE,OAAOM,EAAA;AAAA,QACR,UAAS;AAAA,QACR,uBAAoBK;AAAA,QACpB,UAASE;AAAA,MAAA;;;;"}
@@ -3,5 +3,5 @@
3
3
  for (const [t_key, t_val] of t_opts)
4
4
  t_merged[t_key] = t_val;
5
5
  return t_merged;
6
- };,u=t(e.default,[["__scopeId","data-v-17ece534"]]);exports.default=u;
6
+ };,u=t(e.default,[["__scopeId","data-v-34dad0c7"]]);exports.default=u;
7
7
  //# sourceMappingURL=JGrid.vue.cjs.map
@@ -6,8 +6,8 @@ const r = (r_comp, r_opts) => {
6
6
  r_merged[r_key] = r_val;
7
7
  return r_merged;
8
8
  };
9
- const p = /* @__PURE__ */ r(o, [["__scopeId", "data-v-17ece534"]]);
9
+ const m = /* @__PURE__ */ r(o, [["__scopeId", "data-v-34dad0c7"]]);
10
10
  export {
11
- p as default
11
+ m as default
12
12
  };
13
13
  //# sourceMappingURL=JGrid.vue.js.map
@@ -1,2 +1,2 @@
1
- "use strict";Object.defineProperties(exports,{__esModule:{value:!0},[Symbol.toStringTag]:{value:"Module"}});const a=require("vue"),R=require("ag-grid-vue3"),T=require("../../lib/utils.cjs"),C=require("ag-grid-community"),N=require("ag-grid-enterprise");;/* empty css */;/* empty css */;/* empty css */const A=a.defineComponent({__name:"JGrid",props:{class:{},rowData:{},columnDefs:{},theme:{default:"ag-theme-balham"},pagination:{type:Boolean,default:!0},checkbox:{type:Boolean,default:!1},rowNumbers:{type:Boolean,default:!0},actionButtons:{default:void 0},autoDetectDarkMode:{type:Boolean,default:!0},summaryColumn:{type:Boolean,default:!1},hiddenColumn:{type:Boolean,default:!1},enableGrouping:{type:Boolean,default:!0},enablePivot:{type:Boolean,default:!1},enableExcelExport:{type:Boolean,default:!1},enableTreeData:{type:Boolean,default:!1},getDataPath:{type:Function,default:void 0},autoGroupColumnDef:{default:void 0},selectedRows:{default:()=>[]},columnHover:{type:Boolean,default:!0},enableColumnsToolPanel:{type:Boolean,default:!0},statusBar:{type:Boolean,default:!0},compactFooter:{type:Boolean,default:!1},rowGroupPanelShow:{default:"never"},groupDefaultExpanded:{default:-1},pivotPanelShow:{default:"never"},pivotMode:{type:Boolean,default:!1}},emits:["rowClicked","rowDoubleClicked","cellClicked","selectionChanged","cellValueChanged","gridReady","update:selectedRows"],setup(d,{expose:b,emit:w}){C.ModuleRegistry.registerModules([C.AllCommunityModule,N.AllEnterpriseModule]);const e=d,r=w,n=a.ref(null),c=a.ref(null),p=a.ref(!1),f=()=>{p.value=document.documentElement.classList.contains("dark")},y=a.computed(()=>{if(!e.autoDetectDarkMode)return e.theme;const t=e.theme;return p.value?t.includes("-dark")?t:`${t}-dark`:t.replace(/-dark$/,"")}),x=t=>{const u=e.actionButtons||[],h=t.data,v=u.filter(o=>o.show?o.show(h):!0);if(v.length===0)return"";const i=document.createElement("div");return i.className="flex items-center gap-1",v.forEach(o=>{const l=document.createElement("button");l.className="px-2 py-1 text-xs border rounded transition-colors",o.styletype==="danger"?l.className+=" bg-red-50 border-red-400 text-red-700 hover:bg-red-100 dark:bg-red-950 dark:border-red-700 dark:text-red-400 dark:hover:bg-red-900":l.className+=" bg-gray-50 border-gray-400 text-gray-700 hover:bg-gray-100 dark:bg-gray-800 dark:border-gray-600 dark:text-gray-300 dark:hover:bg-gray-700",o.tooltip&&(l.title=o.tooltip),o.label?l.textContent=o.label:o.icon&&(o.icon==="pencil"?l.textContent="수정":o.icon==="trash2"||o.icon==="trash"?l.textContent="삭제":o.icon==="eye"?l.textContent="보기":o.icon==="copy"?l.textContent="복사":o.icon==="download"?l.textContent="다운로드":o.icon==="circleX"?l.textContent="비활성화":o.icon==="circleCheckBig"?l.textContent="활성화":l.textContent=o.icon),l.addEventListener("click",E=>{E.stopPropagation(),o.onClick(h)}),i.appendChild(l)}),i},m=a.computed(()=>!e.actionButtons||e.actionButtons.length===0?null:{colId:"actionButtons",headerName:"작업",field:"_actions",width:120,minWidth:80,maxWidth:200,lockPosition:"left",sortable:!1,filter:!1,resizable:!0,suppressNavigable:!0,suppressHeaderMenuButton:!0,cellRenderer:x,cellStyle:{display:"flex",justifyContent:"center",alignItems:"center"}}),g=a.computed(()=>{const t=[];return e.checkbox&&t.push({colId:"rowSelection",headerName:"",width:50,minWidth:50,maxWidth:50,lockPosition:"left",checkboxSelection:!0,headerCheckboxSelection:!0,sortable:!1,filter:!1,resizable:!1,suppressNavigable:!0,suppressHeaderMenuButton:!0,cellStyle:{display:"flex",justifyContent:"center",alignItems:"center"}}),m.value&&t.push(m.value),t.push(...e.columnDefs),t}),k=a.computed(()=>({pagination:e.pagination,rowSelection:e.checkbox?"multiple":void 0,suppressRowClickSelection:e.checkbox,rowNumbers:e.rowNumbers,columnHoverHighlight:e.columnHover,sideBar:e.enableColumnsToolPanel||e.enableGrouping||e.enablePivot?{toolPanels:[{id:"columns",labelDefault:"Columns",labelKey:"columns",iconKey:"columns",toolPanel:"agColumnsToolPanel",toolPanelParams:{suppressRowGroups:!e.enableGrouping,suppressValues:!e.enablePivot,suppressPivots:!e.enablePivot,suppressPivotMode:!e.enablePivot}}],defaultToolPanel:""}:void 0,statusBar:e.statusBar&&!e.compactFooter?{statusPanels:[{statusPanel:"agTotalAndFilteredRowCountComponent",align:"left"},{statusPanel:"agSelectedRowCountComponent",align:"left"},{statusPanel:"agAggregationComponent",align:"right"}]}:void 0,rowGroupPanelShow:e.rowGroupPanelShow!=="never"?e.rowGroupPanelShow:void 0,pivotPanelShow:e.pivotPanelShow!=="never"?e.pivotPanelShow:void 0,pivotMode:e.pivotMode,groupDefaultExpanded:e.groupDefaultExpanded,suppressAggFuncInHeader:!1,treeData:e.enableTreeData||void 0,getDataPath:e.enableTreeData?e.getDataPath||(u=>u.path||[]):void 0,autoGroupColumnDef:e.enableTreeData&&e.autoGroupColumnDef?e.autoGroupColumnDef:void 0}));b({gridApi:n,gridColumnApi:c,exportToExcel:()=>{n.value&&e.enableExcelExport&&n.value.exportDataAsExcel({fileName:"grid-export.xlsx"})}});const D=t=>{n.value=t.api,c.value=t.api,r("gridReady",t)},P=t=>{r("rowClicked",t)},B=t=>{r("rowDoubleClicked",t)},G=t=>{r("cellClicked",t)},M=t=>{r("selectionChanged",t),r("update:selectedRows",t.api.getSelectedRows())},S=t=>{r("cellValueChanged",t)};let s=null;return a.onMounted(()=>{e.autoDetectDarkMode&&(f(),s=new MutationObserver(()=>{f()}),s.observe(document.documentElement,{attributes:!0,attributeFilter:["class"]}))}),a.onUnmounted(()=>{s&&s.disconnect()}),a.watch(()=>e.columnDefs,()=>{n.value&&n.value.setGridOption("columnDefs",g.value)},{deep:!0}),a.watch(()=>e.rowData,()=>{n.value&&n.value.setGridOption("rowData",e.rowData)},{deep:!0}),(t,u)=>(a.openBlock(),a.createElementBlock("div",{class:a.normalizeClass(a.unref(T.cn)("ag-grid-container",e.class))},[a.createVNode(a.unref(R.AgGridVue),{"column-defs":g.value,"row-data":d.rowData,"grid-options":k.value,class:a.normalizeClass(y.value),style:{height:"100%",width:"100%"},onGridReady:D,onRowClicked:P,onRowDoubleClicked:B,onCellClicked:G,onSelectionChanged:M,onCellValueChanged:S},null,8,["column-defs","row-data","grid-options","class"])],2))}});exports.default=A;
1
+ "use strict";Object.defineProperties(exports,{__esModule:{value:!0},[Symbol.toStringTag]:{value:"Module"}});const a=require("vue"),G=require("ag-grid-vue3"),E=require("../../lib/utils.cjs"),u=require("ag-grid-community"),R=require("ag-grid-enterprise"),F=a.defineComponent({__name:"JGrid",props:{class:{},rowData:{},columnDefs:{},pagination:{type:Boolean,default:!0},checkbox:{type:Boolean,default:!1},rowNumbers:{type:Boolean,default:!0},actionButtons:{default:void 0},summaryColumn:{type:Boolean,default:!1},hiddenColumn:{type:Boolean,default:!1},enableGrouping:{type:Boolean,default:!0},enablePivot:{type:Boolean,default:!1},enableExcelExport:{type:Boolean,default:!1},enableTreeData:{type:Boolean,default:!1},getDataPath:{type:Function,default:void 0},autoGroupColumnDef:{default:void 0},selectedRows:{default:()=>[]},columnHover:{type:Boolean,default:!0},enableColumnsToolPanel:{type:Boolean,default:!0},statusBar:{type:Boolean,default:!0},compactFooter:{type:Boolean,default:!1},rowGroupPanelShow:{default:"never"},groupDefaultExpanded:{default:-1},pivotPanelShow:{default:"never"},pivotMode:{type:Boolean,default:!1}},emits:["rowClicked","rowDoubleClicked","cellClicked","selectionChanged","cellValueChanged","gridReady","update:selectedRows"],setup(d,{expose:h,emit:C}){u.ModuleRegistry.registerModules([u.AllCommunityModule,R.AllEnterpriseModule]);const v=u.themeQuartz.withParams({browserColorScheme:"inherit",cellHorizontalPaddingScale:1,columnBorder:!0,fontSize:13,headerBackgroundColor:"#FFFFFF",headerFontWeight:500,headerVerticalPaddingScale:.7,iconSize:14,oddRowBackgroundColor:"#CBE6F175",rowVerticalPaddingScale:.5}),e=d,r=C,n=a.ref(null),c=a.ref(null),w=o=>{const i=e.actionButtons||[],g=o.data,m=i.filter(t=>t.show?t.show(g):!0);if(m.length===0)return"";const s=document.createElement("div");return s.className="flex items-center gap-1",m.forEach(t=>{const l=document.createElement("button");l.className="px-2 py-1 text-xs border rounded transition-colors",t.styletype==="danger"?l.className+=" bg-red-50 border-red-400 text-red-700 hover:bg-red-100 dark:bg-red-950 dark:border-red-700 dark:text-red-400 dark:hover:bg-red-900":l.className+=" bg-gray-50 border-gray-400 text-gray-700 hover:bg-gray-100 dark:bg-gray-800 dark:border-gray-600 dark:text-gray-300 dark:hover:bg-gray-700",t.tooltip&&(l.title=t.tooltip),t.label?l.textContent=t.label:t.icon&&(t.icon==="pencil"?l.textContent="수정":t.icon==="trash2"||t.icon==="trash"?l.textContent="삭제":t.icon==="eye"?l.textContent="보기":t.icon==="copy"?l.textContent="복사":t.icon==="download"?l.textContent="다운로드":t.icon==="circleX"?l.textContent="비활성화":t.icon==="circleCheckBig"?l.textContent="활성화":l.textContent=t.icon),l.addEventListener("click",S=>{S.stopPropagation(),t.onClick(g)}),s.appendChild(l)}),s},p=a.computed(()=>!e.actionButtons||e.actionButtons.length===0?null:{colId:"actionButtons",headerName:"작업",field:"_actions",width:120,minWidth:80,maxWidth:200,lockPosition:"left",sortable:!1,filter:!1,resizable:!0,suppressNavigable:!0,suppressHeaderMenuButton:!0,cellRenderer:w,cellStyle:{display:"flex",justifyContent:"center",alignItems:"center"}}),f=a.computed(()=>{const o=[];return e.checkbox&&o.push({colId:"rowSelection",headerName:"",width:50,minWidth:50,maxWidth:50,lockPosition:"left",checkboxSelection:!0,headerCheckboxSelection:!0,sortable:!1,filter:!1,resizable:!1,suppressNavigable:!0,suppressHeaderMenuButton:!0,cellStyle:{display:"flex",justifyContent:"center",alignItems:"center"}}),p.value&&o.push(p.value),o.push(...e.columnDefs),o}),x=a.computed(()=>({theme:v,pagination:e.pagination,rowSelection:e.checkbox?"multiple":void 0,suppressRowClickSelection:e.checkbox,rowNumbers:e.rowNumbers,columnHoverHighlight:e.columnHover,sideBar:e.enableColumnsToolPanel||e.enableGrouping||e.enablePivot?{toolPanels:[{id:"columns",labelDefault:"Columns",labelKey:"columns",iconKey:"columns",toolPanel:"agColumnsToolPanel",toolPanelParams:{suppressRowGroups:!e.enableGrouping,suppressValues:!e.enablePivot,suppressPivots:!e.enablePivot,suppressPivotMode:!e.enablePivot}}],defaultToolPanel:""}:void 0,statusBar:e.statusBar&&!e.compactFooter?{statusPanels:[{statusPanel:"agTotalAndFilteredRowCountComponent",align:"left"},{statusPanel:"agSelectedRowCountComponent",align:"left"},{statusPanel:"agAggregationComponent",align:"right"}]}:void 0,rowGroupPanelShow:e.rowGroupPanelShow!=="never"?e.rowGroupPanelShow:void 0,pivotPanelShow:e.pivotPanelShow!=="never"?e.pivotPanelShow:void 0,pivotMode:e.pivotMode,groupDefaultExpanded:e.groupDefaultExpanded,suppressAggFuncInHeader:!1,treeData:e.enableTreeData||void 0,getDataPath:e.enableTreeData?e.getDataPath||(i=>i.path||[]):void 0,autoGroupColumnDef:e.enableTreeData&&e.autoGroupColumnDef?e.autoGroupColumnDef:void 0}));h({gridApi:n,gridColumnApi:c,exportToExcel:()=>{n.value&&e.enableExcelExport&&n.value.exportDataAsExcel({fileName:"grid-export.xlsx"})}});const y=o=>{n.value=o.api,c.value=o.api,r("gridReady",o)},b=o=>{r("rowClicked",o)},P=o=>{r("rowDoubleClicked",o)},B=o=>{r("cellClicked",o)},k=o=>{r("selectionChanged",o),r("update:selectedRows",o.api.getSelectedRows())},D=o=>{r("cellValueChanged",o)};return a.watch(()=>e.columnDefs,()=>{n.value&&n.value.setGridOption("columnDefs",f.value)},{deep:!0}),a.watch(()=>e.rowData,()=>{n.value&&n.value.setGridOption("rowData",e.rowData)},{deep:!0}),(o,i)=>(a.openBlock(),a.createElementBlock("div",{class:a.normalizeClass(a.unref(E.cn)("ag-grid-container",e.class))},[a.createVNode(a.unref(G.AgGridVue),{"column-defs":f.value,"row-data":d.rowData,"grid-options":x.value,style:{height:"100%",width:"100%"},onGridReady:y,onRowClicked:b,onRowDoubleClicked:P,onCellClicked:B,onSelectionChanged:k,onCellValueChanged:D},null,8,["column-defs","row-data","grid-options"])],2))}});exports.default=F;
2
2
  //# sourceMappingURL=JGrid.vue2.cjs.map