@j-solution/components 1.9.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 (205) hide show
  1. package/README.md +6 -5
  2. package/assets/{jwms-portal-frontend-Ct2Tc7yj.css → jwms-portal-frontend-Di6lStzZ.css} +1 -1
  3. package/assets/styles/j-components.css +1 -1
  4. package/assets/styles/main.css +29 -29
  5. package/components/atoms/JAvatar.vue.cjs.map +1 -1
  6. package/components/atoms/JAvatar.vue.js.map +1 -1
  7. package/components/atoms/JBadge.vue.cjs.map +1 -1
  8. package/components/atoms/JBadge.vue.js.map +1 -1
  9. package/components/atoms/JCombo.vue.cjs.map +1 -1
  10. package/components/atoms/JCombo.vue.js.map +1 -1
  11. package/components/atoms/JDatepicker.vue.cjs.map +1 -1
  12. package/components/atoms/JDatepicker.vue.js.map +1 -1
  13. package/components/atoms/JDivider.vue.cjs.map +1 -1
  14. package/components/atoms/JDivider.vue.js.map +1 -1
  15. package/components/atoms/JEditor.vue.cjs +1 -1
  16. package/components/atoms/JEditor.vue.js +2 -2
  17. package/components/atoms/JEditor.vue2.cjs.map +1 -1
  18. package/components/atoms/JEditor.vue2.js.map +1 -1
  19. package/components/atoms/JGrid.vue.cjs +1 -1
  20. package/components/atoms/JGrid.vue.js +2 -2
  21. package/components/atoms/JGrid.vue2.cjs +1 -1
  22. package/components/atoms/JGrid.vue2.cjs.map +1 -1
  23. package/components/atoms/JGrid.vue2.js +72 -85
  24. package/components/atoms/JGrid.vue2.js.map +1 -1
  25. package/components/atoms/JIcon.vue.cjs.map +1 -1
  26. package/components/atoms/JIcon.vue.js.map +1 -1
  27. package/components/atoms/JImage.vue.cjs.map +1 -1
  28. package/components/atoms/JImage.vue.js.map +1 -1
  29. package/components/atoms/JKbd.vue.cjs.map +1 -1
  30. package/components/atoms/JKbd.vue.js.map +1 -1
  31. package/components/atoms/JPreview.vue.cjs +1 -1
  32. package/components/atoms/JPreview.vue.js +7 -7
  33. package/components/atoms/JPreview.vue2.cjs.map +1 -1
  34. package/components/atoms/JPreview.vue2.js.map +1 -1
  35. package/components/atoms/JProgress.vue.cjs.map +1 -1
  36. package/components/atoms/JProgress.vue.js.map +1 -1
  37. package/components/atoms/JRadio.vue.cjs.map +1 -1
  38. package/components/atoms/JRadio.vue.js.map +1 -1
  39. package/components/atoms/JSearchCombo.vue.cjs.map +1 -1
  40. package/components/atoms/JSearchCombo.vue.js.map +1 -1
  41. package/components/atoms/JSectionTitle.vue2.cjs +1 -1
  42. package/components/atoms/JSectionTitle.vue2.cjs.map +1 -1
  43. package/components/atoms/JSectionTitle.vue2.js +5 -8
  44. package/components/atoms/JSectionTitle.vue2.js.map +1 -1
  45. package/components/atoms/JSpinner.vue.cjs.map +1 -1
  46. package/components/atoms/JSpinner.vue.js.map +1 -1
  47. package/components/atoms/JToast.vue.cjs.map +1 -1
  48. package/components/atoms/JToast.vue.js.map +1 -1
  49. package/components/atoms/JTooltip.vue.cjs.map +1 -1
  50. package/components/atoms/JTooltip.vue.js.map +1 -1
  51. package/components/molecules/JAlert.vue.cjs +1 -1
  52. package/components/molecules/JAlert.vue.cjs.map +1 -1
  53. package/components/molecules/JAlert.vue.js +2 -5
  54. package/components/molecules/JAlert.vue.js.map +1 -1
  55. package/components/molecules/JBreadcrumb.vue.cjs.map +1 -1
  56. package/components/molecules/JBreadcrumb.vue.js.map +1 -1
  57. package/components/molecules/JEmptyState.vue2.cjs +1 -1
  58. package/components/molecules/JEmptyState.vue2.cjs.map +1 -1
  59. package/components/molecules/JEmptyState.vue2.js +15 -18
  60. package/components/molecules/JEmptyState.vue2.js.map +1 -1
  61. package/components/molecules/JFormField.vue2.cjs +1 -1
  62. package/components/molecules/JFormField.vue2.cjs.map +1 -1
  63. package/components/molecules/JFormField.vue2.js +2 -5
  64. package/components/molecules/JFormField.vue2.js.map +1 -1
  65. package/components/molecules/JTitlebar.vue.cjs +1 -1
  66. package/components/molecules/JTitlebar.vue.cjs.map +1 -1
  67. package/components/molecules/JTitlebar.vue.js +16 -19
  68. package/components/molecules/JTitlebar.vue.js.map +1 -1
  69. package/components/organisms/JDynamicForm.vue2.cjs +1 -1
  70. package/components/organisms/JDynamicForm.vue2.cjs.map +1 -1
  71. package/components/organisms/JDynamicForm.vue2.js +2 -5
  72. package/components/organisms/JDynamicForm.vue2.js.map +1 -1
  73. package/components/organisms/JFilterBar.vue.cjs +1 -1
  74. package/components/organisms/JFilterBar.vue.js +2 -2
  75. package/components/organisms/JFilterBar.vue2.cjs.map +1 -1
  76. package/components/organisms/JFilterBar.vue2.js.map +1 -1
  77. package/components/organisms/JFormModal.vue.cjs +1 -1
  78. package/components/organisms/JFormModal.vue.cjs.map +1 -1
  79. package/components/organisms/JFormModal.vue.js +14 -17
  80. package/components/organisms/JFormModal.vue.js.map +1 -1
  81. package/components/organisms/JModal.vue.cjs +1 -1
  82. package/components/organisms/JModal.vue.cjs.map +1 -1
  83. package/components/organisms/JModal.vue.js +2 -5
  84. package/components/organisms/JModal.vue.js.map +1 -1
  85. package/components/organisms/JSearchPanel.vue2.cjs +1 -1
  86. package/components/organisms/JSearchPanel.vue2.cjs.map +1 -1
  87. package/components/organisms/JSearchPanel.vue2.js +20 -23
  88. package/components/organisms/JSearchPanel.vue2.js.map +1 -1
  89. package/components/organisms/JSidebar/JSidebar.vue.cjs.map +1 -1
  90. package/components/organisms/JSidebar/JSidebar.vue.js.map +1 -1
  91. package/components/organisms/JSidebar/JSidebarGroup.vue.cjs.map +1 -1
  92. package/components/organisms/JSidebar/JSidebarGroup.vue.js.map +1 -1
  93. package/components/organisms/JSidebar/JSidebarItem.vue.cjs.map +1 -1
  94. package/components/organisms/JSidebar/JSidebarItem.vue.js.map +1 -1
  95. package/components/organisms/JSidebarAdvanced.vue.cjs +1 -1
  96. package/components/organisms/JSidebarAdvanced.vue.js +7 -7
  97. package/components/organisms/JSidebarAdvanced.vue2.cjs.map +1 -1
  98. package/components/organisms/JSidebarAdvanced.vue2.js.map +1 -1
  99. package/components/organisms/JSidebarSimple.vue.cjs +1 -1
  100. package/components/organisms/JSidebarSimple.vue.js +2 -2
  101. package/components/organisms/JSidebarSimple.vue2.cjs.map +1 -1
  102. package/components/organisms/JSidebarSimple.vue2.js.map +1 -1
  103. package/components/shadcn/AccordionTrigger.vue.cjs.map +1 -1
  104. package/components/shadcn/AccordionTrigger.vue.js.map +1 -1
  105. package/components/shadcn/CardDescription.vue.cjs.map +1 -1
  106. package/components/shadcn/CardDescription.vue.js.map +1 -1
  107. package/components/shadcn/CardFooter.vue.cjs.map +1 -1
  108. package/components/shadcn/CardFooter.vue.js.map +1 -1
  109. package/components/shadcn/CardTitle.vue.cjs.map +1 -1
  110. package/components/shadcn/CardTitle.vue.js.map +1 -1
  111. package/components/shadcn/Checkbox.vue.cjs.map +1 -1
  112. package/components/shadcn/Checkbox.vue.js.map +1 -1
  113. package/components/shadcn/Combobox.vue.cjs.map +1 -1
  114. package/components/shadcn/Combobox.vue.js.map +1 -1
  115. package/components/shadcn/ComboboxAnchor.vue.cjs.map +1 -1
  116. package/components/shadcn/ComboboxAnchor.vue.js.map +1 -1
  117. package/components/shadcn/ComboboxEmpty.vue.cjs.map +1 -1
  118. package/components/shadcn/ComboboxEmpty.vue.js.map +1 -1
  119. package/components/shadcn/ComboboxGroup.vue.cjs.map +1 -1
  120. package/components/shadcn/ComboboxGroup.vue.js.map +1 -1
  121. package/components/shadcn/ComboboxInput.vue.cjs.map +1 -1
  122. package/components/shadcn/ComboboxInput.vue.js.map +1 -1
  123. package/components/shadcn/ComboboxItem.vue.cjs.map +1 -1
  124. package/components/shadcn/ComboboxItem.vue.js.map +1 -1
  125. package/components/shadcn/ComboboxList.vue.cjs.map +1 -1
  126. package/components/shadcn/ComboboxList.vue.js.map +1 -1
  127. package/components/shadcn/ComboboxTrigger.vue.cjs.map +1 -1
  128. package/components/shadcn/ComboboxTrigger.vue.js.map +1 -1
  129. package/components/shadcn/ContextMenu.vue.cjs.map +1 -1
  130. package/components/shadcn/ContextMenu.vue.js.map +1 -1
  131. package/components/shadcn/ContextMenuContent.vue.cjs.map +1 -1
  132. package/components/shadcn/ContextMenuContent.vue.js.map +1 -1
  133. package/components/shadcn/ContextMenuGroup.vue.cjs.map +1 -1
  134. package/components/shadcn/ContextMenuGroup.vue.js.map +1 -1
  135. package/components/shadcn/ContextMenuItem.vue.cjs.map +1 -1
  136. package/components/shadcn/ContextMenuItem.vue.js.map +1 -1
  137. package/components/shadcn/ContextMenuLabel.vue.cjs.map +1 -1
  138. package/components/shadcn/ContextMenuLabel.vue.js.map +1 -1
  139. package/components/shadcn/ContextMenuSeparator.vue.cjs.map +1 -1
  140. package/components/shadcn/ContextMenuSeparator.vue.js.map +1 -1
  141. package/components/shadcn/ContextMenuSub.vue.cjs.map +1 -1
  142. package/components/shadcn/ContextMenuSub.vue.js.map +1 -1
  143. package/components/shadcn/ContextMenuSubContent.vue.cjs.map +1 -1
  144. package/components/shadcn/ContextMenuSubContent.vue.js.map +1 -1
  145. package/components/shadcn/ContextMenuSubTrigger.vue.cjs.map +1 -1
  146. package/components/shadcn/ContextMenuSubTrigger.vue.js.map +1 -1
  147. package/components/shadcn/ContextMenuTrigger.vue.cjs.map +1 -1
  148. package/components/shadcn/ContextMenuTrigger.vue.js.map +1 -1
  149. package/components/shadcn/Field.vue.cjs.map +1 -1
  150. package/components/shadcn/Field.vue.js.map +1 -1
  151. package/components/shadcn/FieldContent.vue.cjs.map +1 -1
  152. package/components/shadcn/FieldContent.vue.js.map +1 -1
  153. package/components/shadcn/FieldDescription.vue.cjs.map +1 -1
  154. package/components/shadcn/FieldDescription.vue.js.map +1 -1
  155. package/components/shadcn/FieldError.vue.cjs.map +1 -1
  156. package/components/shadcn/FieldError.vue.js.map +1 -1
  157. package/components/shadcn/FieldGroup.vue.cjs.map +1 -1
  158. package/components/shadcn/FieldGroup.vue.js.map +1 -1
  159. package/components/shadcn/FieldLabel.vue.cjs.map +1 -1
  160. package/components/shadcn/FieldLabel.vue.js.map +1 -1
  161. package/components/shadcn/Label.vue.cjs.map +1 -1
  162. package/components/shadcn/Label.vue.js.map +1 -1
  163. package/components/shadcn/RadioGroup.vue.cjs.map +1 -1
  164. package/components/shadcn/RadioGroup.vue.js.map +1 -1
  165. package/components/shadcn/RadioGroupItem.vue.cjs.map +1 -1
  166. package/components/shadcn/RadioGroupItem.vue.js.map +1 -1
  167. package/components/shadcn/Select.vue.cjs.map +1 -1
  168. package/components/shadcn/Select.vue.js.map +1 -1
  169. package/components/shadcn/SelectContent.vue.cjs.map +1 -1
  170. package/components/shadcn/SelectContent.vue.js.map +1 -1
  171. package/components/shadcn/SelectGroup.vue.cjs.map +1 -1
  172. package/components/shadcn/SelectGroup.vue.js.map +1 -1
  173. package/components/shadcn/SelectItem.vue.cjs.map +1 -1
  174. package/components/shadcn/SelectItem.vue.js.map +1 -1
  175. package/components/shadcn/SelectLabel.vue.cjs.map +1 -1
  176. package/components/shadcn/SelectLabel.vue.js.map +1 -1
  177. package/components/shadcn/SelectScrollDownButton.vue2.cjs.map +1 -1
  178. package/components/shadcn/SelectScrollDownButton.vue2.js.map +1 -1
  179. package/components/shadcn/SelectScrollUpButton.vue2.cjs.map +1 -1
  180. package/components/shadcn/SelectScrollUpButton.vue2.js.map +1 -1
  181. package/components/shadcn/SelectValue.vue.cjs.map +1 -1
  182. package/components/shadcn/SelectValue.vue.js.map +1 -1
  183. package/components/shadcn/Separator.vue.cjs.map +1 -1
  184. package/components/shadcn/Separator.vue.js.map +1 -1
  185. package/components/shadcn/Switch.vue.cjs.map +1 -1
  186. package/components/shadcn/Switch.vue.js.map +1 -1
  187. package/components/shadcn/Tabs.vue.cjs.map +1 -1
  188. package/components/shadcn/Tabs.vue.js.map +1 -1
  189. package/components/shadcn/TabsTrigger.vue.cjs.map +1 -1
  190. package/components/shadcn/TabsTrigger.vue.js.map +1 -1
  191. package/components/shadcn/Toaster.vue.cjs.map +1 -1
  192. package/components/shadcn/Toaster.vue.js.map +1 -1
  193. package/components/shadcn/resizable/ResizableHandle.vue.cjs.map +1 -1
  194. package/components/shadcn/resizable/ResizableHandle.vue.js.map +1 -1
  195. package/components/shadcn/resizable/ResizablePanelGroup.vue.cjs.map +1 -1
  196. package/components/shadcn/resizable/ResizablePanelGroup.vue.js.map +1 -1
  197. package/lib/styleTypePreset.cjs.map +1 -1
  198. package/lib/styleTypePreset.js.map +1 -1
  199. package/lib/theme-utils.cjs.map +1 -1
  200. package/lib/theme-utils.js.map +1 -1
  201. package/package.json +1 -1
  202. package/tailwind.config.js +81 -81
  203. package/types/index.d.ts +0 -46
  204. package/types/sidebar.types.cjs.map +1 -1
  205. package/types/sidebar.types.js.map +1 -1
@@ -1,29 +1,29 @@
1
- @tailwind base;
2
- @tailwind components;
3
- @tailwind utilities;
4
-
5
- @layer base {
6
- :root {
7
- --radius: 0.5rem;
8
- }
9
-
10
- /* 기본 테마 변수는 themes.css에서 :root에 정의됨 */
11
-
12
- /* 다크 모드는 테마 클래스와 함께 작동 */
13
- .dark {
14
- /* 다크 모드 변수는 각 테마에서 정의됨 */
15
- }
16
- }
17
-
18
- @layer base {
19
- /* 전역 border 스타일 적용 */
20
- * {
21
- @apply border-border;
22
- }
23
-
24
- body {
25
- @apply bg-background text-foreground;
26
- }
27
- }
28
-
29
-
1
+ @tailwind base;
2
+ @tailwind components;
3
+ @tailwind utilities;
4
+
5
+ @layer base {
6
+ :root {
7
+ --radius: 0.5rem;
8
+ }
9
+
10
+ /* 기본 테마 변수는 themes.css에서 :root에 정의됨 */
11
+
12
+ /* 다크 모드는 테마 클래스와 함께 작동 */
13
+ .dark {
14
+ /* 다크 모드 변수는 각 테마에서 정의됨 */
15
+ }
16
+ }
17
+
18
+ @layer base {
19
+ /* 전역 border 스타일 적용 */
20
+ * {
21
+ @apply border-border;
22
+ }
23
+
24
+ body {
25
+ @apply bg-background text-foreground;
26
+ }
27
+ }
28
+
29
+
@@ -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;;;;;"}
@@ -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