@j-solution/components 1.6.1 → 1.8.0

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 (272) hide show
  1. package/README.md +8 -6
  2. package/assets/jwms-portal-frontend-BtHTA-UF.css +1 -0
  3. package/assets/styles/global-utilities.css +34 -0
  4. package/assets/styles/j-components.css +1 -1
  5. package/assets/styles/themes.css +128 -21
  6. package/components/atoms/JAvatar.vue.cjs +1 -1
  7. package/components/atoms/JAvatar.vue.cjs.map +1 -1
  8. package/components/atoms/JAvatar.vue.js +10 -7
  9. package/components/atoms/JAvatar.vue.js.map +1 -1
  10. package/components/atoms/JBadge.vue.cjs +1 -1
  11. package/components/atoms/JBadge.vue.cjs.map +1 -1
  12. package/components/atoms/JBadge.vue.js +7 -6
  13. package/components/atoms/JBadge.vue.js.map +1 -1
  14. package/components/atoms/JButton.vue.cjs +6 -1
  15. package/components/atoms/JButton.vue.cjs.map +1 -1
  16. package/components/atoms/JButton.vue.js +10 -85
  17. package/components/atoms/JButton.vue.js.map +1 -1
  18. package/components/atoms/JButton.vue2.cjs +1 -1
  19. package/components/atoms/JButton.vue2.cjs.map +1 -1
  20. package/components/atoms/JButton.vue2.js +85 -2
  21. package/components/atoms/JButton.vue2.js.map +1 -1
  22. package/components/atoms/JDatepicker.vue.cjs +1 -1
  23. package/components/atoms/JDatepicker.vue.cjs.map +1 -1
  24. package/components/atoms/JDatepicker.vue.js +10 -10
  25. package/components/atoms/JDatepicker.vue.js.map +1 -1
  26. package/components/atoms/JEditor.vue.cjs +1 -1
  27. package/components/atoms/JEditor.vue.js +1 -1
  28. package/components/atoms/JEditor.vue2.cjs +1 -1
  29. package/components/atoms/JEditor.vue2.cjs.map +1 -1
  30. package/components/atoms/JEditor.vue2.js +31 -17
  31. package/components/atoms/JEditor.vue2.js.map +1 -1
  32. package/components/atoms/JGrid.vue.cjs +1 -1
  33. package/components/atoms/JGrid.vue.js +2 -2
  34. package/components/atoms/JGrid.vue2.cjs +1 -1
  35. package/components/atoms/JGrid.vue2.cjs.map +1 -1
  36. package/components/atoms/JGrid.vue2.js +59 -43
  37. package/components/atoms/JGrid.vue2.js.map +1 -1
  38. package/components/atoms/JIcon.vue.cjs +1 -1
  39. package/components/atoms/JIcon.vue.cjs.map +1 -1
  40. package/components/atoms/JIcon.vue.js +14 -13
  41. package/components/atoms/JIcon.vue.js.map +1 -1
  42. package/components/atoms/JKbd.vue.cjs +1 -1
  43. package/components/atoms/JKbd.vue.cjs.map +1 -1
  44. package/components/atoms/JKbd.vue.js +13 -10
  45. package/components/atoms/JKbd.vue.js.map +1 -1
  46. package/components/atoms/JLabel.vue.cjs +1 -1
  47. package/components/atoms/JLabel.vue.cjs.map +1 -1
  48. package/components/atoms/JLabel.vue.js +26 -22
  49. package/components/atoms/JLabel.vue.js.map +1 -1
  50. package/components/atoms/JLink.vue.cjs +1 -1
  51. package/components/atoms/JLink.vue.cjs.map +1 -1
  52. package/components/atoms/JLink.vue.js +5 -5
  53. package/components/atoms/JLink.vue.js.map +1 -1
  54. package/components/atoms/JPreview.vue.cjs +1 -1
  55. package/components/atoms/JPreview.vue.js +2 -2
  56. package/components/atoms/JPreview.vue2.cjs +1 -1
  57. package/components/atoms/JPreview.vue2.cjs.map +1 -1
  58. package/components/atoms/JPreview.vue2.js +33 -20
  59. package/components/atoms/JPreview.vue2.js.map +1 -1
  60. package/components/atoms/JProgress.vue.cjs +1 -1
  61. package/components/atoms/JProgress.vue.cjs.map +1 -1
  62. package/components/atoms/JProgress.vue.js +15 -9
  63. package/components/atoms/JProgress.vue.js.map +1 -1
  64. package/components/atoms/JRadio.vue.cjs +1 -1
  65. package/components/atoms/JRadio.vue.cjs.map +1 -1
  66. package/components/atoms/JRadio.vue.js +1 -1
  67. package/components/atoms/JRadio.vue.js.map +1 -1
  68. package/components/atoms/JSearchCombo.vue.cjs +1 -1
  69. package/components/atoms/JSearchCombo.vue.cjs.map +1 -1
  70. package/components/atoms/JSearchCombo.vue.js +38 -37
  71. package/components/atoms/JSearchCombo.vue.js.map +1 -1
  72. package/components/atoms/JSectionTitle.vue.cjs +7 -0
  73. package/components/atoms/JSectionTitle.vue.cjs.map +1 -0
  74. package/components/atoms/JSectionTitle.vue.js +13 -0
  75. package/components/atoms/JSectionTitle.vue.js.map +1 -0
  76. package/components/atoms/JSectionTitle.vue2.cjs +2 -0
  77. package/components/atoms/JSectionTitle.vue2.cjs.map +1 -0
  78. package/components/atoms/JSectionTitle.vue2.js +67 -0
  79. package/components/atoms/JSectionTitle.vue2.js.map +1 -0
  80. package/components/atoms/JSpinner.vue.cjs +1 -1
  81. package/components/atoms/JSpinner.vue.cjs.map +1 -1
  82. package/components/atoms/JSpinner.vue.js +8 -7
  83. package/components/atoms/JSpinner.vue.js.map +1 -1
  84. package/components/atoms/JSplitter.vue.cjs +6 -1
  85. package/components/atoms/JSplitter.vue.cjs.map +1 -1
  86. package/components/atoms/JSplitter.vue.js +10 -54
  87. package/components/atoms/JSplitter.vue.js.map +1 -1
  88. package/components/atoms/JSplitter.vue2.cjs +1 -1
  89. package/components/atoms/JSplitter.vue2.cjs.map +1 -1
  90. package/components/atoms/JSplitter.vue2.js +59 -2
  91. package/components/atoms/JSplitter.vue2.js.map +1 -1
  92. package/components/atoms/JTooltip.vue.cjs +1 -1
  93. package/components/atoms/JTooltip.vue.cjs.map +1 -1
  94. package/components/atoms/JTooltip.vue.js +18 -15
  95. package/components/atoms/JTooltip.vue.js.map +1 -1
  96. package/components/examples/ExampleCrudPage.vue.cjs +1 -1
  97. package/components/examples/ExampleCrudPage.vue.cjs.map +1 -1
  98. package/components/examples/ExampleCrudPage.vue.js +265 -191
  99. package/components/examples/ExampleCrudPage.vue.js.map +1 -1
  100. package/components/examples/ExampleTabMappingPage.vue.cjs +1 -1
  101. package/components/examples/ExampleTabMappingPage.vue.cjs.map +1 -1
  102. package/components/examples/ExampleTabMappingPage.vue.js +349 -333
  103. package/components/examples/ExampleTabMappingPage.vue.js.map +1 -1
  104. package/components/molecules/JAlert.vue.cjs +1 -1
  105. package/components/molecules/JAlert.vue.cjs.map +1 -1
  106. package/components/molecules/JAlert.vue.js +18 -16
  107. package/components/molecules/JAlert.vue.js.map +1 -1
  108. package/components/molecules/JBreadcrumb.vue.cjs +1 -1
  109. package/components/molecules/JBreadcrumb.vue.cjs.map +1 -1
  110. package/components/molecules/JBreadcrumb.vue.js +3 -3
  111. package/components/molecules/JBreadcrumb.vue.js.map +1 -1
  112. package/components/molecules/JCard.vue.cjs +1 -1
  113. package/components/molecules/JCard.vue.cjs.map +1 -1
  114. package/components/molecules/JCard.vue.js +55 -39
  115. package/components/molecules/JCard.vue.js.map +1 -1
  116. package/components/molecules/JEmptyState.vue.cjs +7 -0
  117. package/components/molecules/JEmptyState.vue.cjs.map +1 -0
  118. package/components/molecules/JEmptyState.vue.js +13 -0
  119. package/components/molecules/JEmptyState.vue.js.map +1 -0
  120. package/components/molecules/JEmptyState.vue2.cjs +2 -0
  121. package/components/molecules/JEmptyState.vue2.cjs.map +1 -0
  122. package/components/molecules/JEmptyState.vue2.js +127 -0
  123. package/components/molecules/JEmptyState.vue2.js.map +1 -0
  124. package/components/molecules/JFormField.vue.cjs +6 -1
  125. package/components/molecules/JFormField.vue.cjs.map +1 -1
  126. package/components/molecules/JFormField.vue.js +10 -262
  127. package/components/molecules/JFormField.vue.js.map +1 -1
  128. package/components/molecules/JFormField.vue2.cjs +2 -0
  129. package/components/molecules/JFormField.vue2.cjs.map +1 -0
  130. package/components/molecules/JFormField.vue2.js +271 -0
  131. package/components/molecules/JFormField.vue2.js.map +1 -0
  132. package/components/molecules/JTabs.vue.cjs +1 -1
  133. package/components/molecules/JTabs.vue.js +1 -1
  134. package/components/molecules/JTabs.vue2.cjs +1 -1
  135. package/components/molecules/JTabs.vue2.cjs.map +1 -1
  136. package/components/molecules/JTabs.vue2.js +50 -56
  137. package/components/molecules/JTabs.vue2.js.map +1 -1
  138. package/components/molecules/JTitlebar.vue.cjs +1 -1
  139. package/components/molecules/JTitlebar.vue.cjs.map +1 -1
  140. package/components/molecules/JTitlebar.vue.js +49 -47
  141. package/components/molecules/JTitlebar.vue.js.map +1 -1
  142. package/components/organisms/JDynamicForm.vue2.cjs +1 -1
  143. package/components/organisms/JDynamicForm.vue2.cjs.map +1 -1
  144. package/components/organisms/JDynamicForm.vue2.js +35 -32
  145. package/components/organisms/JDynamicForm.vue2.js.map +1 -1
  146. package/components/organisms/JDynamicTabs.vue.cjs +1 -1
  147. package/components/organisms/JDynamicTabs.vue.cjs.map +1 -1
  148. package/components/organisms/JDynamicTabs.vue.js +47 -52
  149. package/components/organisms/JDynamicTabs.vue.js.map +1 -1
  150. package/components/organisms/JFilterBar.vue.cjs +6 -1
  151. package/components/organisms/JFilterBar.vue.cjs.map +1 -1
  152. package/components/organisms/JFilterBar.vue.js +10 -137
  153. package/components/organisms/JFilterBar.vue.js.map +1 -1
  154. package/components/organisms/JFilterBar.vue2.cjs +1 -1
  155. package/components/organisms/JFilterBar.vue2.cjs.map +1 -1
  156. package/components/organisms/JFilterBar.vue2.js +141 -2
  157. package/components/organisms/JFilterBar.vue2.js.map +1 -1
  158. package/components/organisms/JFormModal.vue.cjs +1 -1
  159. package/components/organisms/JFormModal.vue.cjs.map +1 -1
  160. package/components/organisms/JFormModal.vue.js +54 -49
  161. package/components/organisms/JFormModal.vue.js.map +1 -1
  162. package/components/organisms/JHeader.vue.cjs +1 -1
  163. package/components/organisms/JHeader.vue.cjs.map +1 -1
  164. package/components/organisms/JHeader.vue.js +211 -208
  165. package/components/organisms/JHeader.vue.js.map +1 -1
  166. package/components/organisms/JModal.vue.cjs +1 -1
  167. package/components/organisms/JModal.vue.cjs.map +1 -1
  168. package/components/organisms/JModal.vue.js +31 -26
  169. package/components/organisms/JModal.vue.js.map +1 -1
  170. package/components/organisms/JPageContainer.vue.cjs +1 -1
  171. package/components/organisms/JPageContainer.vue.cjs.map +1 -1
  172. package/components/organisms/JPageContainer.vue.js +22 -22
  173. package/components/organisms/JPageContainer.vue.js.map +1 -1
  174. package/components/organisms/JSearchPanel.vue2.cjs +1 -1
  175. package/components/organisms/JSearchPanel.vue2.cjs.map +1 -1
  176. package/components/organisms/JSearchPanel.vue2.js +34 -32
  177. package/components/organisms/JSearchPanel.vue2.js.map +1 -1
  178. package/components/organisms/JShuttle.vue.cjs +7 -0
  179. package/components/organisms/JShuttle.vue.cjs.map +1 -0
  180. package/components/organisms/JShuttle.vue.js +13 -0
  181. package/components/organisms/JShuttle.vue.js.map +1 -0
  182. package/components/organisms/JShuttle.vue2.cjs +2 -0
  183. package/components/organisms/JShuttle.vue2.cjs.map +1 -0
  184. package/components/organisms/JShuttle.vue2.js +216 -0
  185. package/components/organisms/JShuttle.vue2.js.map +1 -0
  186. package/components/organisms/JSidebarAdvanced.vue.cjs +1 -1
  187. package/components/organisms/JSidebarAdvanced.vue.js +7 -7
  188. package/components/organisms/JSidebarAdvanced.vue2.cjs +1 -1
  189. package/components/organisms/JSidebarAdvanced.vue2.cjs.map +1 -1
  190. package/components/organisms/JSidebarAdvanced.vue2.js +40 -40
  191. package/components/organisms/JSidebarAdvanced.vue2.js.map +1 -1
  192. package/components/organisms/JSidebarSimple/JDynamicMenuItem.vue.cjs +1 -1
  193. package/components/organisms/JSidebarSimple/JDynamicMenuItem.vue.cjs.map +1 -1
  194. package/components/organisms/JSidebarSimple/JDynamicMenuItem.vue.js +83 -63
  195. package/components/organisms/JSidebarSimple/JDynamicMenuItem.vue.js.map +1 -1
  196. package/components/organisms/JSidebarSimple.vue.cjs +1 -1
  197. package/components/organisms/JSidebarSimple.vue.js +2 -2
  198. package/components/organisms/JSidebarSimple.vue2.cjs +1 -1
  199. package/components/organisms/JSidebarSimple.vue2.cjs.map +1 -1
  200. package/components/organisms/JSidebarSimple.vue2.js +2 -2
  201. package/components/organisms/JSidebarSimple.vue2.js.map +1 -1
  202. package/components/shadcn/AccordionTrigger.vue.cjs +1 -1
  203. package/components/shadcn/AccordionTrigger.vue.cjs.map +1 -1
  204. package/components/shadcn/AccordionTrigger.vue.js +3 -3
  205. package/components/shadcn/AccordionTrigger.vue.js.map +1 -1
  206. package/components/shadcn/Card.vue.cjs +1 -1
  207. package/components/shadcn/Card.vue.cjs.map +1 -1
  208. package/components/shadcn/Card.vue.js +1 -1
  209. package/components/shadcn/Card.vue.js.map +1 -1
  210. package/components/shadcn/CardContent.vue.cjs +1 -1
  211. package/components/shadcn/CardContent.vue.cjs.map +1 -1
  212. package/components/shadcn/CardContent.vue.js +4 -4
  213. package/components/shadcn/CardContent.vue.js.map +1 -1
  214. package/components/shadcn/CardDescription.vue.cjs +1 -1
  215. package/components/shadcn/CardDescription.vue.cjs.map +1 -1
  216. package/components/shadcn/CardDescription.vue.js +1 -1
  217. package/components/shadcn/CardDescription.vue.js.map +1 -1
  218. package/components/shadcn/CardFooter.vue.cjs +1 -1
  219. package/components/shadcn/CardFooter.vue.cjs.map +1 -1
  220. package/components/shadcn/CardFooter.vue.js +7 -7
  221. package/components/shadcn/CardFooter.vue.js.map +1 -1
  222. package/components/shadcn/CardHeader.vue.cjs +1 -1
  223. package/components/shadcn/CardHeader.vue.cjs.map +1 -1
  224. package/components/shadcn/CardHeader.vue.js +8 -8
  225. package/components/shadcn/CardHeader.vue.js.map +1 -1
  226. package/components/shadcn/CardTitle.vue.cjs +1 -1
  227. package/components/shadcn/CardTitle.vue.cjs.map +1 -1
  228. package/components/shadcn/CardTitle.vue.js +5 -5
  229. package/components/shadcn/CardTitle.vue.js.map +1 -1
  230. package/components/shadcn/Input.vue.cjs +1 -1
  231. package/components/shadcn/Input.vue.cjs.map +1 -1
  232. package/components/shadcn/Input.vue.js +3 -3
  233. package/components/shadcn/Input.vue.js.map +1 -1
  234. package/components/shadcn/SelectTrigger.vue.cjs +1 -1
  235. package/components/shadcn/SelectTrigger.vue.cjs.map +1 -1
  236. package/components/shadcn/SelectTrigger.vue.js +2 -2
  237. package/components/shadcn/SelectTrigger.vue.js.map +1 -1
  238. package/components/shadcn/Switch.vue.cjs +1 -1
  239. package/components/shadcn/Switch.vue.cjs.map +1 -1
  240. package/components/shadcn/Switch.vue.js +2 -2
  241. package/components/shadcn/Switch.vue.js.map +1 -1
  242. package/components/shadcn/TabsContent.vue.cjs +1 -1
  243. package/components/shadcn/TabsContent.vue.cjs.map +1 -1
  244. package/components/shadcn/TabsContent.vue.js +1 -1
  245. package/components/shadcn/TabsContent.vue.js.map +1 -1
  246. package/components/shadcn/TabsList.vue.cjs +1 -1
  247. package/components/shadcn/TabsList.vue.cjs.map +1 -1
  248. package/components/shadcn/TabsList.vue.js +10 -10
  249. package/components/shadcn/TabsList.vue.js.map +1 -1
  250. package/components/shadcn/TabsTrigger.vue.cjs +1 -1
  251. package/components/shadcn/TabsTrigger.vue.cjs.map +1 -1
  252. package/components/shadcn/TabsTrigger.vue.js +4 -4
  253. package/components/shadcn/TabsTrigger.vue.js.map +1 -1
  254. package/components/shadcn/Textarea.vue.cjs +1 -1
  255. package/components/shadcn/Textarea.vue.cjs.map +1 -1
  256. package/components/shadcn/Textarea.vue.js +2 -2
  257. package/components/shadcn/Textarea.vue.js.map +1 -1
  258. package/components/shadcn/index.cjs +1 -1
  259. package/components/shadcn/index.cjs.map +1 -1
  260. package/components/shadcn/index.js +9 -8
  261. package/components/shadcn/index.js.map +1 -1
  262. package/components/templates/JLayout.vue.cjs.map +1 -1
  263. package/components/templates/JLayout.vue.js.map +1 -1
  264. package/index.cjs +1 -1
  265. package/index.js +73 -67
  266. package/package.json +1 -1
  267. package/types/index.d.ts +1025 -766
  268. package/assets/jwms-portal-frontend-DntSIcYt.css +0 -1
  269. package/components/molecules/JFormField.vue3.cjs +0 -2
  270. package/components/molecules/JFormField.vue3.cjs.map +0 -1
  271. package/components/molecules/JFormField.vue3.js +0 -6
  272. package/components/molecules/JFormField.vue3.js.map +0 -1
@@ -0,0 +1,13 @@
1
+ import o from "./JSectionTitle.vue2.js";
2
+ /* empty css */
3
+ const t = (t_comp, t_opts) => {
4
+ const t_merged = t_comp.__vccOpts || t_comp;
5
+ for (const [t_key, t_val] of t_opts)
6
+ t_merged[t_key] = t_val;
7
+ return t_merged;
8
+ };
9
+ const c = /* @__PURE__ */ t(o, [["__scopeId", "data-v-7f6e5ace"]]);
10
+ export {
11
+ c as default
12
+ };
13
+ //# sourceMappingURL=JSectionTitle.vue.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"JSectionTitle.vue.js","sources":[],"sourcesContent":[],"names":[],"mappings":";;;;"}
@@ -0,0 +1,2 @@
1
+ "use strict";Object.defineProperties(exports,{__esModule:{value:!0},[Symbol.toStringTag]:{value:"Module"}});const e=require("vue"),c=require("../../lib/utils.cjs");require("lucide-vue-next");require("../shadcn/index.cjs");;/* empty css */require("@internationalized/date");require("md-editor-v3");;/* empty css */;/* empty css */require("../shadcn/badge-variants.cjs");require("@vueuse/core");require("reka-ui");;/* empty css */require("../shadcn/avatar-variants.cjs");const o=require("./JIcon.vue.cjs");require("dompurify");;/* empty css */require("ag-grid-vue3");require("ag-grid-community");require("ag-grid-enterprise");;/* empty css */;/* empty css */;/* empty css */;/* empty css */;/* empty css */;/* empty css */require("vue-sonner");const u={class:"j-section-title-content"},l={class:"j-section-title-text-wrapper"},s={class:"j-section-title-text"},a={key:0,class:"j-section-subtitle-text"},d=e.defineComponent({__name:"JSectionTitle",props:{title:{},subtitle:{},variant:{default:"default"},icon:{},class:{}},setup(t){const r=t,i={default:"border-l-border text-foreground dark:border-l-border",primary:"border-l-primary text-primary",secondary:"border-l-secondary text-secondary",accent:"border-l-accent text-accent"},n=e.computed(()=>i[r.variant]||i.default);return(q,m)=>(e.openBlock(),e.createElementBlock("div",{class:e.normalizeClass(e.unref(c.cn)("j-section-title",n.value,r.class))},[e.createElementVNode("div",u,[t.icon?(e.openBlock(),e.createBlock(e.unref(o.default),{key:0,name:t.icon,class:"j-section-title-icon"},null,8,["name"])):e.createCommentVNode("",!0),e.createElementVNode("div",l,[e.createElementVNode("h3",s,e.toDisplayString(t.title),1),t.subtitle?(e.openBlock(),e.createElementBlock("p",a,e.toDisplayString(t.subtitle),1)):e.createCommentVNode("",!0)])])],2))}});exports.default=d;
2
+ //# sourceMappingURL=JSectionTitle.vue2.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"JSectionTitle.vue2.cjs","sources":["../../../../src/components/atoms/JSectionTitle.vue"],"sourcesContent":["<template>\n <div :class=\"cn('j-section-title', variantClasses, props.class)\">\n <div class=\"j-section-title-content\">\n <JIcon v-if=\"icon\" :name=\"icon\" class=\"j-section-title-icon\" />\n <div class=\"j-section-title-text-wrapper\">\n <h3 class=\"j-section-title-text\">{{ title }}</h3>\n <p v-if=\"subtitle\" class=\"j-section-subtitle-text\">{{ subtitle }}</p>\n </div>\n </div>\n </div>\n</template>\n\n<script setup lang=\"ts\">\nimport { computed } from 'vue'\nimport { cn } from '@/lib/utils'\nimport { JIcon } from '@/components/atoms'\nimport type { JSectionTitleProps, SectionTitleVariant } from '@/types/section-title.types'\n\nconst props = withDefaults(defineProps<JSectionTitleProps>(), {\n variant: 'default',\n})\n\nconst VARIANT_STYLES: Record<SectionTitleVariant, string> = {\n default: 'border-l-border text-foreground dark:border-l-border',\n primary: 'border-l-primary text-primary',\n secondary: 'border-l-secondary text-secondary',\n accent: 'border-l-accent text-accent',\n}\n\nconst variantClasses = computed(() => {\n return VARIANT_STYLES[props.variant] || VARIANT_STYLES.default\n})\n</script>\n\n<style scoped>\n.j-section-title {\n position: relative;\n display: flex;\n flex-direction: column;\n gap: 0.375rem;\n padding: 0.75rem 1rem;\n border-left: 3px solid;\n border-radius: 0.375rem;\n background: hsl(var(--card));\n box-shadow: 0 1px 2px 0 rgb(0 0 0 / 0.05);\n transition: all 0.2s ease;\n overflow: hidden;\n}\n\n.j-section-title::before {\n content: '';\n position: absolute;\n top: 0;\n left: 0;\n right: 0;\n height: 2px;\n background: currentColor;\n opacity: 0.15;\n}\n\n.j-section-title:hover {\n box-shadow: 0 2px 4px 0 rgb(0 0 0 / 0.08);\n transform: translateY(-1px);\n}\n\n.j-section-title-content {\n display: flex;\n align-items: flex-start;\n gap: 0.625rem;\n}\n\n.j-section-title-icon {\n width: 1.125rem;\n height: 1.125rem;\n flex-shrink: 0;\n margin-top: 0.125rem;\n color: currentColor;\n}\n\n.j-section-title-text-wrapper {\n flex: 1;\n display: flex;\n flex-direction: column;\n gap: 0.25rem;\n}\n\n.j-section-title-text {\n font-size: 0.9375rem;\n font-weight: 600;\n color: hsl(var(--foreground));\n line-height: 1.3;\n letter-spacing: -0.01em;\n}\n\n.j-section-title-subtitle-text {\n font-size: 0.8125rem;\n color: hsl(var(--muted-foreground));\n line-height: 1.4;\n}\n</style>\n"],"names":["props","__props","VARIANT_STYLES","variantClasses","computed","_createElementBlock","_unref","cn","_createElementVNode","_hoisted_1","_createBlock","JIcon","_hoisted_2","_hoisted_3","_toDisplayString","_hoisted_4"],"mappings":"+hDAkBA,MAAMA,EAAQC,EAIRC,EAAsD,CAC1D,QAAS,uDACT,QAAS,gCACT,UAAW,oCACX,OAAQ,6BAAA,EAGJC,EAAiBC,EAAAA,SAAS,IACvBF,EAAeF,EAAM,OAAO,GAAKE,EAAe,OACxD,8BA9BCG,EAAAA,mBAQM,MAAA,CARA,uBAAOC,EAAAA,MAAAC,IAAA,EAAE,kBAAoBJ,QAAgBH,EAAM,KAAK,CAAA,CAAA,GAC5DQ,EAAAA,mBAMM,MANNC,EAMM,CALSR,EAAA,oBAAbS,EAAAA,YAA+DJ,EAAAA,MAAAK,EAAAA,OAAA,EAAA,OAA3C,KAAMV,EAAA,KAAM,MAAM,sBAAA,gDACtCO,EAAAA,mBAGM,MAHNI,EAGM,CAFJJ,EAAAA,mBAAiD,KAAjDK,EAAiDC,EAAAA,gBAAbb,EAAA,KAAK,EAAA,CAAA,EAChCA,EAAA,wBAATI,EAAAA,mBAAqE,IAArEU,EAAqED,EAAAA,gBAAfb,EAAA,QAAQ,EAAA,CAAA"}
@@ -0,0 +1,67 @@
1
+ import { defineComponent as l, computed as p, createElementBlock as c, openBlock as e, normalizeClass as d, unref as n, createElementVNode as o, createBlock as u, createCommentVNode as s, toDisplayString as a } from "vue";
2
+ import { cn as f } from "../../lib/utils.js";
3
+ import "lucide-vue-next";
4
+ import "../shadcn/index.js";
5
+ /* empty css */
6
+ import "@internationalized/date";
7
+ import "md-editor-v3";
8
+ /* empty css */
9
+ /* empty css */
10
+ import "../shadcn/badge-variants.js";
11
+ import "@vueuse/core";
12
+ import "reka-ui";
13
+ /* empty css */
14
+ import "../shadcn/avatar-variants.js";
15
+ import b from "./JIcon.vue.js";
16
+ import "dompurify";
17
+ /* empty css */
18
+ import "ag-grid-vue3";
19
+ import "ag-grid-community";
20
+ import "ag-grid-enterprise";
21
+ /* empty css */
22
+ /* empty css */
23
+ /* empty css */
24
+ /* empty css */
25
+ /* empty css */
26
+ /* empty css */
27
+ import "vue-sonner";
28
+ const x = { class: "j-section-title-content" }, y = { class: "j-section-title-text-wrapper" }, v = { class: "j-section-title-text" }, _ = {
29
+ key: 0,
30
+ class: "j-section-subtitle-text"
31
+ }, Q = /* @__PURE__ */ l({
32
+ __name: "JSectionTitle",
33
+ props: {
34
+ title: {},
35
+ subtitle: {},
36
+ variant: { default: "default" },
37
+ icon: {},
38
+ class: {}
39
+ },
40
+ setup(t) {
41
+ const r = t, i = {
42
+ default: "border-l-border text-foreground dark:border-l-border",
43
+ primary: "border-l-primary text-primary",
44
+ secondary: "border-l-secondary text-secondary",
45
+ accent: "border-l-accent text-accent"
46
+ }, m = p(() => i[r.variant] || i.default);
47
+ return (h, j) => (e(), c("div", {
48
+ class: d(n(f)("j-section-title", m.value, r.class))
49
+ }, [
50
+ o("div", x, [
51
+ t.icon ? (e(), u(n(b), {
52
+ key: 0,
53
+ name: t.icon,
54
+ class: "j-section-title-icon"
55
+ }, null, 8, ["name"])) : s("", !0),
56
+ o("div", y, [
57
+ o("h3", v, a(t.title), 1),
58
+ t.subtitle ? (e(), c("p", _, a(t.subtitle), 1)) : s("", !0)
59
+ ])
60
+ ])
61
+ ], 2));
62
+ }
63
+ });
64
+ export {
65
+ Q as default
66
+ };
67
+ //# sourceMappingURL=JSectionTitle.vue2.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"JSectionTitle.vue2.js","sources":["../../../../src/components/atoms/JSectionTitle.vue"],"sourcesContent":["<template>\n <div :class=\"cn('j-section-title', variantClasses, props.class)\">\n <div class=\"j-section-title-content\">\n <JIcon v-if=\"icon\" :name=\"icon\" class=\"j-section-title-icon\" />\n <div class=\"j-section-title-text-wrapper\">\n <h3 class=\"j-section-title-text\">{{ title }}</h3>\n <p v-if=\"subtitle\" class=\"j-section-subtitle-text\">{{ subtitle }}</p>\n </div>\n </div>\n </div>\n</template>\n\n<script setup lang=\"ts\">\nimport { computed } from 'vue'\nimport { cn } from '@/lib/utils'\nimport { JIcon } from '@/components/atoms'\nimport type { JSectionTitleProps, SectionTitleVariant } from '@/types/section-title.types'\n\nconst props = withDefaults(defineProps<JSectionTitleProps>(), {\n variant: 'default',\n})\n\nconst VARIANT_STYLES: Record<SectionTitleVariant, string> = {\n default: 'border-l-border text-foreground dark:border-l-border',\n primary: 'border-l-primary text-primary',\n secondary: 'border-l-secondary text-secondary',\n accent: 'border-l-accent text-accent',\n}\n\nconst variantClasses = computed(() => {\n return VARIANT_STYLES[props.variant] || VARIANT_STYLES.default\n})\n</script>\n\n<style scoped>\n.j-section-title {\n position: relative;\n display: flex;\n flex-direction: column;\n gap: 0.375rem;\n padding: 0.75rem 1rem;\n border-left: 3px solid;\n border-radius: 0.375rem;\n background: hsl(var(--card));\n box-shadow: 0 1px 2px 0 rgb(0 0 0 / 0.05);\n transition: all 0.2s ease;\n overflow: hidden;\n}\n\n.j-section-title::before {\n content: '';\n position: absolute;\n top: 0;\n left: 0;\n right: 0;\n height: 2px;\n background: currentColor;\n opacity: 0.15;\n}\n\n.j-section-title:hover {\n box-shadow: 0 2px 4px 0 rgb(0 0 0 / 0.08);\n transform: translateY(-1px);\n}\n\n.j-section-title-content {\n display: flex;\n align-items: flex-start;\n gap: 0.625rem;\n}\n\n.j-section-title-icon {\n width: 1.125rem;\n height: 1.125rem;\n flex-shrink: 0;\n margin-top: 0.125rem;\n color: currentColor;\n}\n\n.j-section-title-text-wrapper {\n flex: 1;\n display: flex;\n flex-direction: column;\n gap: 0.25rem;\n}\n\n.j-section-title-text {\n font-size: 0.9375rem;\n font-weight: 600;\n color: hsl(var(--foreground));\n line-height: 1.3;\n letter-spacing: -0.01em;\n}\n\n.j-section-title-subtitle-text {\n font-size: 0.8125rem;\n color: hsl(var(--muted-foreground));\n line-height: 1.4;\n}\n</style>\n"],"names":["props","__props","VARIANT_STYLES","variantClasses","computed","_createElementBlock","_unref","cn","_createElementVNode","_hoisted_1","_createBlock","JIcon","_hoisted_2","_hoisted_3","_toDisplayString","_hoisted_4"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAkBA,UAAMA,IAAQC,GAIRC,IAAsD;AAAA,MAC1D,SAAS;AAAA,MACT,SAAS;AAAA,MACT,WAAW;AAAA,MACX,QAAQ;AAAA,IAAA,GAGJC,IAAiBC,EAAS,MACvBF,EAAeF,EAAM,OAAO,KAAKE,EAAe,OACxD;2BA9BCG,EAQM,OAAA;AAAA,MARA,SAAOC,EAAAC,CAAA,EAAE,mBAAoBJ,SAAgBH,EAAM,KAAK,CAAA;AAAA,IAAA;MAC5DQ,EAMM,OANNC,GAMM;AAAA,QALSR,EAAA,aAAbS,EAA+DJ,EAAAK,CAAA,GAAA;AAAA;UAA3C,MAAMV,EAAA;AAAA,UAAM,OAAM;AAAA,QAAA;QACtCO,EAGM,OAHNI,GAGM;AAAA,UAFJJ,EAAiD,MAAjDK,GAAiDC,EAAbb,EAAA,KAAK,GAAA,CAAA;AAAA,UAChCA,EAAA,iBAATI,EAAqE,KAArEU,GAAqED,EAAfb,EAAA,QAAQ,GAAA,CAAA;;;;;;"}
@@ -1,2 +1,2 @@
1
- "use strict";Object.defineProperties(exports,{__esModule:{value:!0},[Symbol.toStringTag]:{value:"Module"}});const e=require("vue"),d=require("lucide-vue-next"),n=require("../../lib/utils.cjs"),m={key:0,class:"text-sm"},f=e.defineComponent({__name:"JSpinner",props:{size:{default:"md"},class:{},styletype:{default:"default"},thickness:{default:2},label:{default:""},labelPosition:{default:"right"}},setup(a){const s=a,r={sm:"size-3",md:"size-4",lg:"size-6"},o={right:"flex-row items-center gap-2",left:"flex-row-reverse items-center gap-2",top:"flex-col items-center gap-2",bottom:"flex-col-reverse items-center gap-2"},c={default:{class:""},primary:{class:"text-blue-500"},success:{class:"text-green-500"},warning:{class:"text-amber-500"},danger:{class:"text-red-500"}},i=e.computed(()=>{const t=c[s.styletype],l=s.size||"md",p=r[l];return{class:n.cn("animate-spin",p,t.class,s.class),style:{strokeWidth:s.thickness},"aria-label":"처리 중"}}),u=e.computed(()=>{const t=s.labelPosition||"right";return n.cn("inline-flex",o[t])});return(t,l)=>(e.openBlock(),e.createElementBlock("div",{class:e.normalizeClass(u.value)},[e.createVNode(e.unref(d.Loader2Icon),e.mergeProps({role:"status"},i.value),null,16),s.label?(e.openBlock(),e.createElementBlock("span",m,e.toDisplayString(s.label),1)):e.createCommentVNode("",!0)],2))}});exports.default=f;
1
+ "use strict";Object.defineProperties(exports,{__esModule:{value:!0},[Symbol.toStringTag]:{value:"Module"}});const e=require("vue"),d=require("lucide-vue-next"),n=require("../../lib/utils.cjs"),m={key:0,class:"text-sm"},f=e.defineComponent({__name:"JSpinner",props:{size:{default:"sm"},class:{},styletype:{default:"default"},thickness:{default:2},label:{default:""},labelPosition:{default:"right"}},setup(a){const s=a,r={xs:"size-2.5",sm:"size-3",md:"size-4",lg:"size-5"},o={right:"flex-row items-center gap-2",left:"flex-row-reverse items-center gap-2",top:"flex-col items-center gap-2",bottom:"flex-col-reverse items-center gap-2"},c={default:{class:""},primary:{class:"text-blue-500"},success:{class:"text-green-500"},warning:{class:"text-amber-500"},danger:{class:"text-red-500"}},i=e.computed(()=>{const t=c[s.styletype],l=s.size||"md",p=r[l];return{class:n.cn("animate-spin",p,t.class,s.class),style:{strokeWidth:s.thickness},"aria-label":"처리 중"}}),u=e.computed(()=>{const t=s.labelPosition||"right";return n.cn("inline-flex",o[t])});return(t,l)=>(e.openBlock(),e.createElementBlock("div",{class:e.normalizeClass(u.value)},[e.createVNode(e.unref(d.Loader2Icon),e.mergeProps({role:"status"},i.value),null,16),s.label?(e.openBlock(),e.createElementBlock("span",m,e.toDisplayString(s.label),1)):e.createCommentVNode("",!0)],2))}});exports.default=f;
2
2
  //# sourceMappingURL=JSpinner.vue.cjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"JSpinner.vue.cjs","sources":["../../../../src/components/atoms/JSpinner.vue"],"sourcesContent":["<script setup lang=\"ts\">\r\nimport { computed } from 'vue'\r\nimport { Loader2Icon } from 'lucide-vue-next'\r\nimport { cn } from '@/lib/utils'\r\n\r\ntype StyleType =\r\n | 'default' // 기본 스타일\r\n | 'primary' // 강조 스타일 (파랑)\r\n | 'success' // 성공 스타일 (초록)\r\n | 'warning' // 경고 스타일 (주황)\r\n | 'danger' // 위험 스타일 (빨강)\r\n\r\ntype LabelPosition =\r\n | 'right' // 오른쪽 (기본)\r\n | 'left' // 왼쪽\r\n | 'top' // 위쪽\r\n | 'bottom' // 아래쪽\r\n\r\nconst props = withDefaults(\r\n defineProps<{\r\n size?: 'sm' | 'md' | 'lg'\r\n class?: string\r\n /** 스타일 프리셋 */\r\n styletype?: StyleType\r\n /** 스피너 원의 테두리 두께 */\r\n thickness?: number\r\n /** 스피너 옆에 표시될 텍스트 */\r\n label?: string\r\n /** 라벨 위치 */\r\n labelPosition?: LabelPosition\r\n }>(),\r\n {\r\n size: 'md',\r\n styletype: 'default',\r\n thickness: 2,\r\n label: '',\r\n labelPosition: 'right',\r\n },\r\n)\r\n\r\n/**\r\n * 크기별 클래스 매핑\r\n */\r\nconst SIZE_CLASSES = {\r\n sm: 'size-3',\r\n md: 'size-4', \r\n lg: 'size-6',\r\n}\r\n\r\n/**\r\n * 라벨 위치별 레이아웃 클래스 매핑\r\n */\r\nconst LABEL_POSITION_CLASSES = {\r\n right: 'flex-row items-center gap-2',\r\n left: 'flex-row-reverse items-center gap-2',\r\n top: 'flex-col items-center gap-2',\r\n bottom: 'flex-col-reverse items-center gap-2',\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 primary: { \r\n class: 'text-blue-500',\r\n },\r\n success: { \r\n class: 'text-green-500',\r\n },\r\n warning: { \r\n class: 'text-amber-500',\r\n },\r\n danger: { \r\n class: 'text-red-500',\r\n },\r\n}\r\n\r\n/** 최종 바인딩: 직접 넘긴 props가 있으면 styletype 기본값과 병합 */\r\nconst spinnerProps = computed(() => {\r\n const preset = STYLE_PRESETS[props.styletype!]\r\n const finalSize = props.size || 'md'\r\n const sizeClass = SIZE_CLASSES[finalSize as keyof typeof SIZE_CLASSES]\r\n const finalClass = cn('animate-spin', sizeClass, preset.class, props.class)\r\n \r\n return {\r\n class: finalClass,\r\n style: {\r\n strokeWidth: props.thickness,\r\n },\r\n 'aria-label': '처리 중',\r\n }\r\n})\r\n\r\n/** 컨테이너 레이아웃 클래스 */\r\nconst containerClass = computed(() => {\r\n const position = props.labelPosition || 'right'\r\n return cn('inline-flex', LABEL_POSITION_CLASSES[position as keyof typeof LABEL_POSITION_CLASSES])\r\n})\r\n</script>\r\n\r\n<template>\r\n <div :class=\"containerClass\">\r\n <Loader2Icon\r\n role=\"status\"\r\n v-bind=\"spinnerProps\"\r\n />\r\n <span v-if=\"props.label\" class=\"text-sm\">{{ props.label }}</span>\r\n </div>\r\n</template>\r\n"],"names":["props","__props","SIZE_CLASSES","LABEL_POSITION_CLASSES","STYLE_PRESETS","spinnerProps","computed","preset","finalSize","sizeClass","cn","containerClass","position","_createElementBlock","_createVNode","_unref","_mergeProps","_openBlock","_hoisted_1","_toDisplayString"],"mappings":"uZAkBA,MAAMA,EAAQC,EAyBRC,EAAe,CACnB,GAAI,SACJ,GAAI,SACJ,GAAI,QAAA,EAMAC,EAAyB,CAC7B,MAAO,8BACP,KAAM,sCACN,IAAK,8BACL,OAAQ,qCAAA,EAMJC,EAAsD,CAC1D,QAAS,CAAE,MAAO,EAAA,EAClB,QAAS,CACP,MAAO,eAAA,EAET,QAAS,CACP,MAAO,gBAAA,EAET,QAAS,CACP,MAAO,gBAAA,EAET,OAAQ,CACN,MAAO,cAAA,CACT,EAIIC,EAAeC,EAAAA,SAAS,IAAM,CAClC,MAAMC,EAASH,EAAcJ,EAAM,SAAU,EACvCQ,EAAYR,EAAM,MAAQ,KAC1BS,EAAYP,EAAaM,CAAsC,EAGrE,MAAO,CACL,MAHiBE,EAAAA,GAAG,eAAgBD,EAAWF,EAAO,MAAOP,EAAM,KAAK,EAIxE,MAAO,CACL,YAAaA,EAAM,SAAA,EAErB,aAAc,MAAA,CAElB,CAAC,EAGKW,EAAiBL,EAAAA,SAAS,IAAM,CACpC,MAAMM,EAAWZ,EAAM,eAAiB,QACxC,OAAOU,KAAG,cAAeP,EAAuBS,CAA+C,CAAC,CAClG,CAAC,8BAICC,EAAAA,mBAMM,MAAA,CANA,uBAAOF,EAAA,KAAc,CAAA,GACzBG,EAAAA,YAGEC,EAAAA,qBAHFC,EAAAA,WAGE,CAFA,KAAK,QAAA,EACGX,EAAA,KAAY,EAAA,KAAA,EAAA,EAEVL,EAAM,OAAlBiB,EAAAA,UAAA,EAAAJ,EAAAA,mBAAiE,OAAjEK,EAAiEC,EAAAA,gBAArBnB,EAAM,KAAK,EAAA,CAAA"}
1
+ {"version":3,"file":"JSpinner.vue.cjs","sources":["../../../../src/components/atoms/JSpinner.vue"],"sourcesContent":["<script setup lang=\"ts\">\r\nimport { computed } from 'vue'\r\nimport { Loader2Icon } from 'lucide-vue-next'\r\nimport { cn } from '@/lib/utils'\r\n\r\ntype StyleType =\r\n | 'default' // 기본 스타일\r\n | 'primary' // 강조 스타일 (파랑)\r\n | 'success' // 성공 스타일 (초록)\r\n | 'warning' // 경고 스타일 (주황)\r\n | 'danger' // 위험 스타일 (빨강)\r\n\r\ntype LabelPosition =\r\n | 'right' // 오른쪽 (기본)\r\n | 'left' // 왼쪽\r\n | 'top' // 위쪽\r\n | 'bottom' // 아래쪽\r\n\r\nconst props = withDefaults(\r\n defineProps<{\r\n size?: 'xs' | 'sm' | 'md' | 'lg'\n class?: string\r\n /** 스타일 프리셋 */\r\n styletype?: StyleType\r\n /** 스피너 원의 테두리 두께 */\r\n thickness?: number\r\n /** 스피너 옆에 표시될 텍스트 */\r\n label?: string\r\n /** 라벨 위치 */\r\n labelPosition?: LabelPosition\r\n }>(),\r\n {\n size: 'sm',\n styletype: 'default',\n thickness: 2,\n label: '',\r\n labelPosition: 'right',\r\n },\r\n)\r\n\r\n/**\r\n * 크기별 클래스 매핑\r\n */\r\nconst SIZE_CLASSES = {\n xs: 'size-2.5',\n sm: 'size-3',\n md: 'size-4', \n lg: 'size-5',\n}\n\r\n/**\r\n * 라벨 위치별 레이아웃 클래스 매핑\r\n */\r\nconst LABEL_POSITION_CLASSES = {\r\n right: 'flex-row items-center gap-2',\r\n left: 'flex-row-reverse items-center gap-2',\r\n top: 'flex-col items-center gap-2',\r\n bottom: 'flex-col-reverse items-center gap-2',\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 primary: { \r\n class: 'text-blue-500',\r\n },\r\n success: { \r\n class: 'text-green-500',\r\n },\r\n warning: { \r\n class: 'text-amber-500',\r\n },\r\n danger: { \r\n class: 'text-red-500',\r\n },\r\n}\r\n\r\n/** 최종 바인딩: 직접 넘긴 props가 있으면 styletype 기본값과 병합 */\r\nconst spinnerProps = computed(() => {\r\n const preset = STYLE_PRESETS[props.styletype!]\r\n const finalSize = props.size || 'md'\r\n const sizeClass = SIZE_CLASSES[finalSize as keyof typeof SIZE_CLASSES]\r\n const finalClass = cn('animate-spin', sizeClass, preset.class, props.class)\r\n \r\n return {\r\n class: finalClass,\r\n style: {\r\n strokeWidth: props.thickness,\r\n },\r\n 'aria-label': '처리 중',\r\n }\r\n})\r\n\r\n/** 컨테이너 레이아웃 클래스 */\r\nconst containerClass = computed(() => {\r\n const position = props.labelPosition || 'right'\r\n return cn('inline-flex', LABEL_POSITION_CLASSES[position as keyof typeof LABEL_POSITION_CLASSES])\r\n})\r\n</script>\r\n\r\n<template>\r\n <div :class=\"containerClass\">\r\n <Loader2Icon\r\n role=\"status\"\r\n v-bind=\"spinnerProps\"\r\n />\r\n <span v-if=\"props.label\" class=\"text-sm\">{{ props.label }}</span>\r\n </div>\r\n</template>\r\n"],"names":["props","__props","SIZE_CLASSES","LABEL_POSITION_CLASSES","STYLE_PRESETS","spinnerProps","computed","preset","finalSize","sizeClass","cn","containerClass","position","_createElementBlock","_createVNode","_unref","_mergeProps","_openBlock","_hoisted_1","_toDisplayString"],"mappings":"uZAkBA,MAAMA,EAAQC,EAyBRC,EAAe,CACnB,GAAI,WACJ,GAAI,SACJ,GAAI,SACJ,GAAI,QAAA,EAMAC,EAAyB,CAC7B,MAAO,8BACP,KAAM,sCACN,IAAK,8BACL,OAAQ,qCAAA,EAMJC,EAAsD,CAC1D,QAAS,CAAE,MAAO,EAAA,EAClB,QAAS,CACP,MAAO,eAAA,EAET,QAAS,CACP,MAAO,gBAAA,EAET,QAAS,CACP,MAAO,gBAAA,EAET,OAAQ,CACN,MAAO,cAAA,CACT,EAIIC,EAAeC,EAAAA,SAAS,IAAM,CAClC,MAAMC,EAASH,EAAcJ,EAAM,SAAU,EACvCQ,EAAYR,EAAM,MAAQ,KAC1BS,EAAYP,EAAaM,CAAsC,EAGrE,MAAO,CACL,MAHiBE,EAAAA,GAAG,eAAgBD,EAAWF,EAAO,MAAOP,EAAM,KAAK,EAIxE,MAAO,CACL,YAAaA,EAAM,SAAA,EAErB,aAAc,MAAA,CAElB,CAAC,EAGKW,EAAiBL,EAAAA,SAAS,IAAM,CACpC,MAAMM,EAAWZ,EAAM,eAAiB,QACxC,OAAOU,KAAG,cAAeP,EAAuBS,CAA+C,CAAC,CAClG,CAAC,8BAICC,EAAAA,mBAMM,MAAA,CANA,uBAAOF,EAAA,KAAc,CAAA,GACzBG,EAAAA,YAGEC,EAAAA,qBAHFC,EAAAA,WAGE,CAFA,KAAK,QAAA,EACGX,EAAA,KAAY,EAAA,KAAA,EAAA,EAEVL,EAAM,OAAlBiB,EAAAA,UAAA,EAAAJ,EAAAA,mBAAiE,OAAjEK,EAAiEC,EAAAA,gBAArBnB,EAAM,KAAK,EAAA,CAAA"}
@@ -1,13 +1,13 @@
1
- import { defineComponent as d, computed as l, createElementBlock as a, openBlock as n, normalizeClass as S, createVNode as g, createCommentVNode as x, unref as _, mergeProps as b, toDisplayString as C } from "vue";
2
- import { Loader2Icon as h } from "lucide-vue-next";
1
+ import { defineComponent as d, computed as l, createElementBlock as a, openBlock as n, normalizeClass as S, createVNode as g, createCommentVNode as x, unref as _, mergeProps as b, toDisplayString as z } from "vue";
2
+ import { Loader2Icon as C } from "lucide-vue-next";
3
3
  import { cn as r } from "../../lib/utils.js";
4
- const y = {
4
+ const h = {
5
5
  key: 0,
6
6
  class: "text-sm"
7
7
  }, P = /* @__PURE__ */ d({
8
8
  __name: "JSpinner",
9
9
  props: {
10
- size: { default: "md" },
10
+ size: { default: "sm" },
11
11
  class: {},
12
12
  styletype: { default: "default" },
13
13
  thickness: { default: 2 },
@@ -16,9 +16,10 @@ const y = {
16
16
  },
17
17
  setup(o) {
18
18
  const e = o, c = {
19
+ xs: "size-2.5",
19
20
  sm: "size-3",
20
21
  md: "size-4",
21
- lg: "size-6"
22
+ lg: "size-5"
22
23
  }, i = {
23
24
  right: "flex-row items-center gap-2",
24
25
  left: "flex-row-reverse items-center gap-2",
@@ -54,8 +55,8 @@ const y = {
54
55
  return (s, t) => (n(), a("div", {
55
56
  class: S(f.value)
56
57
  }, [
57
- g(_(h), b({ role: "status" }, m.value), null, 16),
58
- e.label ? (n(), a("span", y, C(e.label), 1)) : x("", !0)
58
+ g(_(C), b({ role: "status" }, m.value), null, 16),
59
+ e.label ? (n(), a("span", h, z(e.label), 1)) : x("", !0)
59
60
  ], 2));
60
61
  }
61
62
  });
@@ -1 +1 @@
1
- {"version":3,"file":"JSpinner.vue.js","sources":["../../../../src/components/atoms/JSpinner.vue"],"sourcesContent":["<script setup lang=\"ts\">\r\nimport { computed } from 'vue'\r\nimport { Loader2Icon } from 'lucide-vue-next'\r\nimport { cn } from '@/lib/utils'\r\n\r\ntype StyleType =\r\n | 'default' // 기본 스타일\r\n | 'primary' // 강조 스타일 (파랑)\r\n | 'success' // 성공 스타일 (초록)\r\n | 'warning' // 경고 스타일 (주황)\r\n | 'danger' // 위험 스타일 (빨강)\r\n\r\ntype LabelPosition =\r\n | 'right' // 오른쪽 (기본)\r\n | 'left' // 왼쪽\r\n | 'top' // 위쪽\r\n | 'bottom' // 아래쪽\r\n\r\nconst props = withDefaults(\r\n defineProps<{\r\n size?: 'sm' | 'md' | 'lg'\r\n class?: string\r\n /** 스타일 프리셋 */\r\n styletype?: StyleType\r\n /** 스피너 원의 테두리 두께 */\r\n thickness?: number\r\n /** 스피너 옆에 표시될 텍스트 */\r\n label?: string\r\n /** 라벨 위치 */\r\n labelPosition?: LabelPosition\r\n }>(),\r\n {\r\n size: 'md',\r\n styletype: 'default',\r\n thickness: 2,\r\n label: '',\r\n labelPosition: 'right',\r\n },\r\n)\r\n\r\n/**\r\n * 크기별 클래스 매핑\r\n */\r\nconst SIZE_CLASSES = {\r\n sm: 'size-3',\r\n md: 'size-4', \r\n lg: 'size-6',\r\n}\r\n\r\n/**\r\n * 라벨 위치별 레이아웃 클래스 매핑\r\n */\r\nconst LABEL_POSITION_CLASSES = {\r\n right: 'flex-row items-center gap-2',\r\n left: 'flex-row-reverse items-center gap-2',\r\n top: 'flex-col items-center gap-2',\r\n bottom: 'flex-col-reverse items-center gap-2',\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 primary: { \r\n class: 'text-blue-500',\r\n },\r\n success: { \r\n class: 'text-green-500',\r\n },\r\n warning: { \r\n class: 'text-amber-500',\r\n },\r\n danger: { \r\n class: 'text-red-500',\r\n },\r\n}\r\n\r\n/** 최종 바인딩: 직접 넘긴 props가 있으면 styletype 기본값과 병합 */\r\nconst spinnerProps = computed(() => {\r\n const preset = STYLE_PRESETS[props.styletype!]\r\n const finalSize = props.size || 'md'\r\n const sizeClass = SIZE_CLASSES[finalSize as keyof typeof SIZE_CLASSES]\r\n const finalClass = cn('animate-spin', sizeClass, preset.class, props.class)\r\n \r\n return {\r\n class: finalClass,\r\n style: {\r\n strokeWidth: props.thickness,\r\n },\r\n 'aria-label': '처리 중',\r\n }\r\n})\r\n\r\n/** 컨테이너 레이아웃 클래스 */\r\nconst containerClass = computed(() => {\r\n const position = props.labelPosition || 'right'\r\n return cn('inline-flex', LABEL_POSITION_CLASSES[position as keyof typeof LABEL_POSITION_CLASSES])\r\n})\r\n</script>\r\n\r\n<template>\r\n <div :class=\"containerClass\">\r\n <Loader2Icon\r\n role=\"status\"\r\n v-bind=\"spinnerProps\"\r\n />\r\n <span v-if=\"props.label\" class=\"text-sm\">{{ props.label }}</span>\r\n </div>\r\n</template>\r\n"],"names":["props","__props","SIZE_CLASSES","LABEL_POSITION_CLASSES","STYLE_PRESETS","spinnerProps","computed","preset","finalSize","sizeClass","cn","containerClass","position","_createElementBlock","_createVNode","_unref","_mergeProps","_openBlock","_hoisted_1","_toDisplayString"],"mappings":";;;;;;;;;;;;;;;;;AAkBA,UAAMA,IAAQC,GAyBRC,IAAe;AAAA,MACnB,IAAI;AAAA,MACJ,IAAI;AAAA,MACJ,IAAI;AAAA,IAAA,GAMAC,IAAyB;AAAA,MAC7B,OAAO;AAAA,MACP,MAAM;AAAA,MACN,KAAK;AAAA,MACL,QAAQ;AAAA,IAAA,GAMJC,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,GAIIC,IAAeC,EAAS,MAAM;AAClC,YAAMC,IAASH,EAAcJ,EAAM,SAAU,GACvCQ,IAAYR,EAAM,QAAQ,MAC1BS,IAAYP,EAAaM,CAAsC;AAGrE,aAAO;AAAA,QACL,OAHiBE,EAAG,gBAAgBD,GAAWF,EAAO,OAAOP,EAAM,KAAK;AAAA,QAIxE,OAAO;AAAA,UACL,aAAaA,EAAM;AAAA,QAAA;AAAA,QAErB,cAAc;AAAA,MAAA;AAAA,IAElB,CAAC,GAGKW,IAAiBL,EAAS,MAAM;AACpC,YAAMM,IAAWZ,EAAM,iBAAiB;AACxC,aAAOU,EAAG,eAAeP,EAAuBS,CAA+C,CAAC;AAAA,IAClG,CAAC;2BAICC,EAMM,OAAA;AAAA,MANA,SAAOF,EAAA,KAAc;AAAA,IAAA;MACzBG,EAGEC,MAHFC,EAGE,EAFA,MAAK,SAAA,GACGX,EAAA,KAAY,GAAA,MAAA,EAAA;AAAA,MAEVL,EAAM,SAAlBiB,EAAA,GAAAJ,EAAiE,QAAjEK,GAAiEC,EAArBnB,EAAM,KAAK,GAAA,CAAA;;;;"}
1
+ {"version":3,"file":"JSpinner.vue.js","sources":["../../../../src/components/atoms/JSpinner.vue"],"sourcesContent":["<script setup lang=\"ts\">\r\nimport { computed } from 'vue'\r\nimport { Loader2Icon } from 'lucide-vue-next'\r\nimport { cn } from '@/lib/utils'\r\n\r\ntype StyleType =\r\n | 'default' // 기본 스타일\r\n | 'primary' // 강조 스타일 (파랑)\r\n | 'success' // 성공 스타일 (초록)\r\n | 'warning' // 경고 스타일 (주황)\r\n | 'danger' // 위험 스타일 (빨강)\r\n\r\ntype LabelPosition =\r\n | 'right' // 오른쪽 (기본)\r\n | 'left' // 왼쪽\r\n | 'top' // 위쪽\r\n | 'bottom' // 아래쪽\r\n\r\nconst props = withDefaults(\r\n defineProps<{\r\n size?: 'xs' | 'sm' | 'md' | 'lg'\n class?: string\r\n /** 스타일 프리셋 */\r\n styletype?: StyleType\r\n /** 스피너 원의 테두리 두께 */\r\n thickness?: number\r\n /** 스피너 옆에 표시될 텍스트 */\r\n label?: string\r\n /** 라벨 위치 */\r\n labelPosition?: LabelPosition\r\n }>(),\r\n {\n size: 'sm',\n styletype: 'default',\n thickness: 2,\n label: '',\r\n labelPosition: 'right',\r\n },\r\n)\r\n\r\n/**\r\n * 크기별 클래스 매핑\r\n */\r\nconst SIZE_CLASSES = {\n xs: 'size-2.5',\n sm: 'size-3',\n md: 'size-4', \n lg: 'size-5',\n}\n\r\n/**\r\n * 라벨 위치별 레이아웃 클래스 매핑\r\n */\r\nconst LABEL_POSITION_CLASSES = {\r\n right: 'flex-row items-center gap-2',\r\n left: 'flex-row-reverse items-center gap-2',\r\n top: 'flex-col items-center gap-2',\r\n bottom: 'flex-col-reverse items-center gap-2',\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 primary: { \r\n class: 'text-blue-500',\r\n },\r\n success: { \r\n class: 'text-green-500',\r\n },\r\n warning: { \r\n class: 'text-amber-500',\r\n },\r\n danger: { \r\n class: 'text-red-500',\r\n },\r\n}\r\n\r\n/** 최종 바인딩: 직접 넘긴 props가 있으면 styletype 기본값과 병합 */\r\nconst spinnerProps = computed(() => {\r\n const preset = STYLE_PRESETS[props.styletype!]\r\n const finalSize = props.size || 'md'\r\n const sizeClass = SIZE_CLASSES[finalSize as keyof typeof SIZE_CLASSES]\r\n const finalClass = cn('animate-spin', sizeClass, preset.class, props.class)\r\n \r\n return {\r\n class: finalClass,\r\n style: {\r\n strokeWidth: props.thickness,\r\n },\r\n 'aria-label': '처리 중',\r\n }\r\n})\r\n\r\n/** 컨테이너 레이아웃 클래스 */\r\nconst containerClass = computed(() => {\r\n const position = props.labelPosition || 'right'\r\n return cn('inline-flex', LABEL_POSITION_CLASSES[position as keyof typeof LABEL_POSITION_CLASSES])\r\n})\r\n</script>\r\n\r\n<template>\r\n <div :class=\"containerClass\">\r\n <Loader2Icon\r\n role=\"status\"\r\n v-bind=\"spinnerProps\"\r\n />\r\n <span v-if=\"props.label\" class=\"text-sm\">{{ props.label }}</span>\r\n </div>\r\n</template>\r\n"],"names":["props","__props","SIZE_CLASSES","LABEL_POSITION_CLASSES","STYLE_PRESETS","spinnerProps","computed","preset","finalSize","sizeClass","cn","containerClass","position","_createElementBlock","_createVNode","_unref","_mergeProps","_openBlock","_hoisted_1","_toDisplayString"],"mappings":";;;;;;;;;;;;;;;;;AAkBA,UAAMA,IAAQC,GAyBRC,IAAe;AAAA,MACnB,IAAI;AAAA,MACJ,IAAI;AAAA,MACJ,IAAI;AAAA,MACJ,IAAI;AAAA,IAAA,GAMAC,IAAyB;AAAA,MAC7B,OAAO;AAAA,MACP,MAAM;AAAA,MACN,KAAK;AAAA,MACL,QAAQ;AAAA,IAAA,GAMJC,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,GAIIC,IAAeC,EAAS,MAAM;AAClC,YAAMC,IAASH,EAAcJ,EAAM,SAAU,GACvCQ,IAAYR,EAAM,QAAQ,MAC1BS,IAAYP,EAAaM,CAAsC;AAGrE,aAAO;AAAA,QACL,OAHiBE,EAAG,gBAAgBD,GAAWF,EAAO,OAAOP,EAAM,KAAK;AAAA,QAIxE,OAAO;AAAA,UACL,aAAaA,EAAM;AAAA,QAAA;AAAA,QAErB,cAAc;AAAA,MAAA;AAAA,IAElB,CAAC,GAGKW,IAAiBL,EAAS,MAAM;AACpC,YAAMM,IAAWZ,EAAM,iBAAiB;AACxC,aAAOU,EAAG,eAAeP,EAAuBS,CAA+C,CAAC;AAAA,IAClG,CAAC;2BAICC,EAMM,OAAA;AAAA,MANA,SAAOF,EAAA,KAAc;AAAA,IAAA;MACzBG,EAGEC,MAHFC,EAGE,EAFA,MAAK,SAAA,GACGX,EAAA,KAAY,GAAA,MAAA,EAAA;AAAA,MAEVL,EAAM,SAAlBiB,EAAA,GAAAJ,EAAiE,QAAjEK,GAAiEC,EAArBnB,EAAM,KAAK,GAAA,CAAA;;;;"}
@@ -1,2 +1,7 @@
1
- "use strict";Object.defineProperties(exports,{__esModule:{value:!0},[Symbol.toStringTag]:{value:"Module"}});const e=require("vue"),s=require("../shadcn/resizable/ResizableHandle.vue.cjs"),r=require("../shadcn/resizable/ResizablePanelGroup.vue.cjs"),l=require("reka-ui"),u=e.defineComponent({__name:"JSplitter",props:{direction:{default:"horizontal"},defaultSize:{default:50},minSize:{default:20},maxSize:{},secondMinSize:{},secondMaxSize:{},withHandle:{type:Boolean,default:!0},class:{}},setup(t){const n=t,a=e.computed(()=>100-n.defaultSize);return(i,d)=>(e.openBlock(),e.createBlock(e.unref(r.default),{direction:t.direction,class:e.normalizeClass(t.class)},{default:e.withCtx(()=>[e.createVNode(e.unref(l.SplitterPanel),{"default-size":t.defaultSize,"min-size":t.minSize,"max-size":t.maxSize},{default:e.withCtx(()=>[e.renderSlot(i.$slots,"first"),e.renderSlot(i.$slots,"left"),e.renderSlot(i.$slots,"top")]),_:3},8,["default-size","min-size","max-size"]),e.createVNode(e.unref(s.default),{"with-handle":t.withHandle},null,8,["with-handle"]),e.createVNode(e.unref(l.SplitterPanel),{"default-size":a.value,"min-size":t.secondMinSize,"max-size":t.secondMaxSize},{default:e.withCtx(()=>[e.renderSlot(i.$slots,"second"),e.renderSlot(i.$slots,"right"),e.renderSlot(i.$slots,"bottom")]),_:3},8,["default-size","min-size","max-size"])]),_:3},8,["direction","class"]))}});exports.default=u;
1
+ "use strict";Object.defineProperties(exports,{__esModule:{value:!0},[Symbol.toStringTag]:{value:"Module"}});const e=require("./JSplitter.vue2.cjs");;/* empty css */const t = (t_comp, t_opts) => {
2
+ const t_merged = t_comp.__vccOpts || t_comp;
3
+ for (const [t_key, t_val] of t_opts)
4
+ t_merged[t_key] = t_val;
5
+ return t_merged;
6
+ };,u=t(e.default,[["__scopeId","data-v-4ac249d6"]]);exports.default=u;
2
7
  //# sourceMappingURL=JSplitter.vue.cjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"JSplitter.vue.cjs","sources":["../../../../src/components/atoms/JSplitter.vue"],"sourcesContent":["<script setup lang=\"ts\">\nimport { computed } from 'vue'\nimport {\n ResizablePanelGroup,\n ResizablePanel,\n ResizableHandle,\n} from '@/components/shadcn/resizable'\n\ntype Orientation = 'horizontal' | 'vertical'\n\nconst props = withDefaults(\n defineProps<{\n /** 분할 방향 (horizontal: 좌우, vertical: 상하) */\n direction?: Orientation\n /** 첫 번째 패널의 기본 크기 (%) */\n defaultSize?: number\n /** 첫 번째 패널의 최소 크기 (%) */\n minSize?: number\n /** 첫 번째 패널의 최대 크기 (%) */\n maxSize?: number\n /** 두 번째 패널의 최소 크기 (%) */\n secondMinSize?: number\n /** 두 번째 패널의 최대 크기 (%) */\n secondMaxSize?: number\n /** ResizableHandle에 grip 아이콘 표시 여부 */\n withHandle?: boolean\n /** 추가 CSS 클래스 */\n class?: string\n }>(),\n {\n direction: 'horizontal',\n defaultSize: 50,\n minSize: 20,\n withHandle: true,\n },\n)\n\n// 두 번째 패널의 기본 크기 계산\nconst secondDefaultSize = computed(() => 100 - props.defaultSize)\n</script>\n\n<template>\n <ResizablePanelGroup :direction=\"direction\" :class=\"class\">\n <!-- 첫 번째 패널 (좌측/상단) -->\n <ResizablePanel :default-size=\"defaultSize\" :min-size=\"minSize\" :max-size=\"maxSize\">\n <slot name=\"first\" />\n <!-- direction=\"horizontal\"일 때 left, vertical일 때 top으로도 사용 가능 -->\n <slot name=\"left\" />\n <slot name=\"top\" />\n </ResizablePanel>\n\n <!-- 크기 조정 핸들 -->\n <ResizableHandle :with-handle=\"withHandle\" />\n\n <!-- 두 번째 패널 (우측/하단) -->\n <ResizablePanel\n :default-size=\"secondDefaultSize\"\n :min-size=\"secondMinSize\"\n :max-size=\"secondMaxSize\"\n >\n <slot name=\"second\" />\n <!-- direction=\"horizontal\"일 때 right, vertical일 때 bottom으로도 사용 가능 -->\n <slot name=\"right\" />\n <slot name=\"bottom\" />\n </ResizablePanel>\n </ResizablePanelGroup>\n</template>\n"],"names":["props","__props","secondDefaultSize","computed","_createBlock","_unref","ResizablePanelGroup","_createVNode","ResizablePanel","_renderSlot","_ctx","ResizableHandle"],"mappings":"ifAUA,MAAMA,EAAQC,EA4BRC,EAAoBC,EAAAA,SAAS,IAAM,IAAMH,EAAM,WAAW,8BAI9DI,EAAAA,YAuBsBC,EAAAA,MAAAC,EAAAA,OAAA,EAAA,CAvBA,UAAWL,EAAA,UAAY,uBAAOA,EAAA,KAAK,CAAA,qBAEvD,IAKiB,CALjBM,cAKiBF,EAAAA,MAAAG,EAAAA,aAAA,EAAA,CALA,eAAcP,EAAA,YAAc,WAAUA,EAAA,QAAU,WAAUA,EAAA,OAAA,qBACzE,IAAqB,CAArBQ,aAAqBC,EAAA,OAAA,OAAA,EAErBD,aAAoBC,EAAA,OAAA,MAAA,EACpBD,aAAmBC,EAAA,OAAA,KAAA,CAAA,kDAIrBH,EAAAA,YAA6CF,EAAAA,MAAAM,SAAA,EAAA,CAA3B,cAAaV,EAAA,UAAA,EAAU,KAAA,EAAA,CAAA,aAAA,CAAA,EAGzCM,cASiBF,EAAAA,MAAAG,EAAAA,aAAA,EAAA,CARd,eAAcN,EAAA,MACd,WAAUD,EAAA,cACV,WAAUA,EAAA,aAAA,qBAEX,IAAsB,CAAtBQ,aAAsBC,EAAA,OAAA,QAAA,EAEtBD,aAAqBC,EAAA,OAAA,OAAA,EACrBD,aAAsBC,EAAA,OAAA,QAAA,CAAA"}
1
+ {"version":3,"file":"JSplitter.vue.cjs","sources":[],"sourcesContent":[],"names":[],"mappings":""}
@@ -1,57 +1,13 @@
1
- import { defineComponent as m, computed as f, createBlock as z, openBlock as u, unref as a, normalizeClass as r, withCtx as l, createVNode as s, renderSlot as t } from "vue";
2
- import c from "../shadcn/resizable/ResizableHandle.vue.js";
3
- import S from "../shadcn/resizable/ResizablePanelGroup.vue.js";
4
- import { SplitterPanel as n } from "reka-ui";
5
- const B = /* @__PURE__ */ m({
6
- __name: "JSplitter",
7
- props: {
8
- direction: { default: "horizontal" },
9
- defaultSize: { default: 50 },
10
- minSize: { default: 20 },
11
- maxSize: {},
12
- secondMinSize: {},
13
- secondMaxSize: {},
14
- withHandle: { type: Boolean, default: !0 },
15
- class: {}
16
- },
17
- setup(e) {
18
- const o = e, d = f(() => 100 - o.defaultSize);
19
- return (i, h) => (u(), z(a(S), {
20
- direction: e.direction,
21
- class: r(e.class)
22
- }, {
23
- default: l(() => [
24
- s(a(n), {
25
- "default-size": e.defaultSize,
26
- "min-size": e.minSize,
27
- "max-size": e.maxSize
28
- }, {
29
- default: l(() => [
30
- t(i.$slots, "first"),
31
- t(i.$slots, "left"),
32
- t(i.$slots, "top")
33
- ]),
34
- _: 3
35
- }, 8, ["default-size", "min-size", "max-size"]),
36
- s(a(c), { "with-handle": e.withHandle }, null, 8, ["with-handle"]),
37
- s(a(n), {
38
- "default-size": d.value,
39
- "min-size": e.secondMinSize,
40
- "max-size": e.secondMaxSize
41
- }, {
42
- default: l(() => [
43
- t(i.$slots, "second"),
44
- t(i.$slots, "right"),
45
- t(i.$slots, "bottom")
46
- ]),
47
- _: 3
48
- }, 8, ["default-size", "min-size", "max-size"])
49
- ]),
50
- _: 3
51
- }, 8, ["direction", "class"]));
52
- }
53
- });
1
+ import t from "./JSplitter.vue2.js";
2
+ /* empty css */
3
+ const o = (o_comp, o_opts) => {
4
+ const o_merged = o_comp.__vccOpts || o_comp;
5
+ for (const [o_key, o_val] of o_opts)
6
+ o_merged[o_key] = o_val;
7
+ return o_merged;
8
+ };
9
+ const m = /* @__PURE__ */ o(t, [["__scopeId", "data-v-4ac249d6"]]);
54
10
  export {
55
- B as default
11
+ m as default
56
12
  };
57
13
  //# sourceMappingURL=JSplitter.vue.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"JSplitter.vue.js","sources":["../../../../src/components/atoms/JSplitter.vue"],"sourcesContent":["<script setup lang=\"ts\">\nimport { computed } from 'vue'\nimport {\n ResizablePanelGroup,\n ResizablePanel,\n ResizableHandle,\n} from '@/components/shadcn/resizable'\n\ntype Orientation = 'horizontal' | 'vertical'\n\nconst props = withDefaults(\n defineProps<{\n /** 분할 방향 (horizontal: 좌우, vertical: 상하) */\n direction?: Orientation\n /** 첫 번째 패널의 기본 크기 (%) */\n defaultSize?: number\n /** 첫 번째 패널의 최소 크기 (%) */\n minSize?: number\n /** 첫 번째 패널의 최대 크기 (%) */\n maxSize?: number\n /** 두 번째 패널의 최소 크기 (%) */\n secondMinSize?: number\n /** 두 번째 패널의 최대 크기 (%) */\n secondMaxSize?: number\n /** ResizableHandle에 grip 아이콘 표시 여부 */\n withHandle?: boolean\n /** 추가 CSS 클래스 */\n class?: string\n }>(),\n {\n direction: 'horizontal',\n defaultSize: 50,\n minSize: 20,\n withHandle: true,\n },\n)\n\n// 두 번째 패널의 기본 크기 계산\nconst secondDefaultSize = computed(() => 100 - props.defaultSize)\n</script>\n\n<template>\n <ResizablePanelGroup :direction=\"direction\" :class=\"class\">\n <!-- 첫 번째 패널 (좌측/상단) -->\n <ResizablePanel :default-size=\"defaultSize\" :min-size=\"minSize\" :max-size=\"maxSize\">\n <slot name=\"first\" />\n <!-- direction=\"horizontal\"일 때 left, vertical일 때 top으로도 사용 가능 -->\n <slot name=\"left\" />\n <slot name=\"top\" />\n </ResizablePanel>\n\n <!-- 크기 조정 핸들 -->\n <ResizableHandle :with-handle=\"withHandle\" />\n\n <!-- 두 번째 패널 (우측/하단) -->\n <ResizablePanel\n :default-size=\"secondDefaultSize\"\n :min-size=\"secondMinSize\"\n :max-size=\"secondMaxSize\"\n >\n <slot name=\"second\" />\n <!-- direction=\"horizontal\"일 때 right, vertical일 때 bottom으로도 사용 가능 -->\n <slot name=\"right\" />\n <slot name=\"bottom\" />\n </ResizablePanel>\n </ResizablePanelGroup>\n</template>\n"],"names":["props","__props","secondDefaultSize","computed","_createBlock","_unref","ResizablePanelGroup","_createVNode","ResizablePanel","_renderSlot","_ctx","ResizableHandle"],"mappings":";;;;;;;;;;;;;;;;;AAUA,UAAMA,IAAQC,GA4BRC,IAAoBC,EAAS,MAAM,MAAMH,EAAM,WAAW;2BAI9DI,EAuBsBC,EAAAC,CAAA,GAAA;AAAA,MAvBA,WAAWL,EAAA;AAAA,MAAY,SAAOA,EAAA,KAAK;AAAA,IAAA;iBAEvD,MAKiB;AAAA,QALjBM,EAKiBF,EAAAG,CAAA,GAAA;AAAA,UALA,gBAAcP,EAAA;AAAA,UAAc,YAAUA,EAAA;AAAA,UAAU,YAAUA,EAAA;AAAA,QAAA;qBACzE,MAAqB;AAAA,YAArBQ,EAAqBC,EAAA,QAAA,OAAA;AAAA,YAErBD,EAAoBC,EAAA,QAAA,MAAA;AAAA,YACpBD,EAAmBC,EAAA,QAAA,KAAA;AAAA,UAAA;;;QAIrBH,EAA6CF,EAAAM,CAAA,GAAA,EAA3B,eAAaV,EAAA,WAAA,GAAU,MAAA,GAAA,CAAA,aAAA,CAAA;AAAA,QAGzCM,EASiBF,EAAAG,CAAA,GAAA;AAAA,UARd,gBAAcN,EAAA;AAAA,UACd,YAAUD,EAAA;AAAA,UACV,YAAUA,EAAA;AAAA,QAAA;qBAEX,MAAsB;AAAA,YAAtBQ,EAAsBC,EAAA,QAAA,QAAA;AAAA,YAEtBD,EAAqBC,EAAA,QAAA,OAAA;AAAA,YACrBD,EAAsBC,EAAA,QAAA,QAAA;AAAA,UAAA;;;;;;;;"}
1
+ {"version":3,"file":"JSplitter.vue.js","sources":[],"sourcesContent":[],"names":[],"mappings":";;;;"}
@@ -1,2 +1,2 @@
1
- "use strict";Object.defineProperties(exports,{__esModule:{value:!0},[Symbol.toStringTag]:{value:"Module"}});const e=require("./JSplitter.vue.cjs");exports.default=e.default;
1
+ "use strict";Object.defineProperties(exports,{__esModule:{value:!0},[Symbol.toStringTag]:{value:"Module"}});const e=require("vue"),s=require("../shadcn/resizable/ResizableHandle.vue.cjs"),r=require("../shadcn/resizable/ResizablePanelGroup.vue.cjs"),l=require("reka-ui"),u=e.defineComponent({__name:"JSplitter",props:{direction:{default:"horizontal"},defaultSize:{default:40},minSize:{default:20},maxSize:{},secondMinSize:{},secondMaxSize:{},withHandle:{type:Boolean,default:!0},gap:{default:10},class:{}},setup(t){const i=t,n=e.computed(()=>100-i.defaultSize);return(a,d)=>(e.openBlock(),e.createBlock(e.unref(r.default),{direction:t.direction,class:e.normalizeClass(t.class)},{default:e.withCtx(()=>[e.createVNode(e.unref(l.SplitterPanel),{"default-size":t.defaultSize,"min-size":t.minSize,"max-size":t.maxSize,class:e.normalizeClass(t.gap>0?t.direction==="horizontal"?"pr-[calc(var(--gap)/2)]":"pb-[calc(var(--gap)/2)]":""),style:e.normalizeStyle(t.gap>0?{"--gap":`${t.gap}px`}:{})},{default:e.withCtx(()=>[e.renderSlot(a.$slots,"first",{},void 0,!0),e.renderSlot(a.$slots,"left",{},void 0,!0),e.renderSlot(a.$slots,"top",{},void 0,!0)]),_:3},8,["default-size","min-size","max-size","class","style"]),e.createVNode(e.unref(s.default),{"with-handle":t.withHandle},null,8,["with-handle"]),e.createVNode(e.unref(l.SplitterPanel),{"default-size":n.value,"min-size":t.secondMinSize,"max-size":t.secondMaxSize,class:e.normalizeClass(t.gap>0?t.direction==="horizontal"?"pl-[calc(var(--gap)/2)]":"pt-[calc(var(--gap)/2)]":""),style:e.normalizeStyle(t.gap>0?{"--gap":`${t.gap}px`}:{})},{default:e.withCtx(()=>[e.renderSlot(a.$slots,"second",{},void 0,!0),e.renderSlot(a.$slots,"right",{},void 0,!0),e.renderSlot(a.$slots,"bottom",{},void 0,!0)]),_:3},8,["default-size","min-size","max-size","class","style"])]),_:3},8,["direction","class"]))}});exports.default=u;
2
2
  //# sourceMappingURL=JSplitter.vue2.cjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"JSplitter.vue2.cjs","sources":[],"sourcesContent":[],"names":[],"mappings":""}
1
+ {"version":3,"file":"JSplitter.vue2.cjs","sources":["../../../../src/components/atoms/JSplitter.vue"],"sourcesContent":["<script setup lang=\"ts\">\nimport { computed } from 'vue'\nimport {\n ResizablePanelGroup,\n ResizablePanel,\n ResizableHandle,\n} from '@/components/shadcn/resizable'\n\ntype Orientation = 'horizontal' | 'vertical'\n\nconst props = withDefaults(\n defineProps<{\n /** 분할 방향 (horizontal: 좌우, vertical: 상하) */\n direction?: Orientation\n /** 첫 번째 패널의 기본 크기 (%) */\n defaultSize?: number\n /** 첫 번째 패널의 최소 크기 (%) */\n minSize?: number\n /** 첫 번째 패널의 최대 크기 (%) */\n maxSize?: number\n /** 두 번째 패널의 최소 크기 (%) */\n secondMinSize?: number\n /** 두 번째 패널의 최대 크기 (%) */\n secondMaxSize?: number\n /** ResizableHandle에 grip 아이콘 표시 여부 */\n withHandle?: boolean\n /** 패널 간 여백 (px) */\n gap?: number\n /** 추가 CSS 클래스 */\n class?: string\n }>(),\n {\n direction: 'horizontal',\n defaultSize: 40,\n minSize: 20,\n withHandle: true,\n gap: 10,\n },\n)\n\n// 두 번째 패널의 기본 크기 계산\nconst secondDefaultSize = computed(() => 100 - props.defaultSize)\n</script>\n\n<template>\n <ResizablePanelGroup :direction=\"direction\" :class=\"class\">\n <!-- 첫 번째 패널 (좌측/상단) -->\n <ResizablePanel \n :default-size=\"defaultSize\" \n :min-size=\"minSize\" \n :max-size=\"maxSize\"\n :class=\"gap > 0 ? (direction === 'horizontal' ? 'pr-[calc(var(--gap)/2)]' : 'pb-[calc(var(--gap)/2)]') : ''\"\n :style=\"gap > 0 ? { '--gap': `${gap}px` } : {}\"\n >\n <slot name=\"first\" />\n <!-- direction=\"horizontal\"일 때 left, vertical일 때 top으로도 사용 가능 -->\n <slot name=\"left\" />\n <slot name=\"top\" />\n </ResizablePanel>\n\n <!-- 크기 조정 핸들 -->\n <ResizableHandle :with-handle=\"withHandle\" />\n\n <!-- 두 번째 패널 (우측/하단) -->\n <ResizablePanel\n :default-size=\"secondDefaultSize\"\n :min-size=\"secondMinSize\"\n :max-size=\"secondMaxSize\"\n :class=\"gap > 0 ? (direction === 'horizontal' ? 'pl-[calc(var(--gap)/2)]' : 'pt-[calc(var(--gap)/2)]') : ''\"\n :style=\"gap > 0 ? { '--gap': `${gap}px` } : {}\"\n >\n <slot name=\"second\" />\n <!-- direction=\"horizontal\"일 때 right, vertical일 때 bottom으로도 사용 가능 -->\n <slot name=\"right\" />\n <slot name=\"bottom\" />\n </ResizablePanel>\n </ResizablePanelGroup>\n</template>\n\n<style scoped>\n/* ========================================\n 패턴 5: Splitter Handle 스타일\n ======================================== */\n\n:deep([data-panel-resize-handle-id]) {\n background: hsl(var(--border) / 0.8);\n transition: all 0.2s ease;\n position: relative;\n}\n\n:deep([data-panel-resize-handle-id]::before) {\n content: '';\n position: absolute;\n top: 0;\n left: 0;\n right: 0;\n bottom: 0;\n background: hsl(var(--muted-foreground) / 0.2);\n}\n\n:deep([data-panel-resize-handle-id]:hover) {\n background: hsl(var(--primary) / 0.6);\n}\n\n:deep([data-panel-resize-handle-id]:hover::before) {\n background: hsl(var(--primary) / 0.3);\n}\n\n:deep([data-panel-resize-handle-id]:active) {\n background: hsl(var(--primary));\n}\n\n:deep([data-panel-resize-handle-id]:active::before) {\n background: hsl(var(--primary) / 0.5);\n}\n\n:deep([data-panel-resize-handle-id][data-resize-handle-orientation=\"horizontal\"]) {\n cursor: col-resize;\n width: 6px;\n}\n\n:deep([data-panel-resize-handle-id][data-resize-handle-orientation=\"vertical\"]) {\n cursor: row-resize;\n height: 6px;\n}\n</style>\n"],"names":["props","__props","secondDefaultSize","computed","_createBlock","_unref","ResizablePanelGroup","_createVNode","ResizablePanel","_normalizeClass","_normalizeStyle","_renderSlot","_ctx","ResizableHandle"],"mappings":"kgBAUA,MAAMA,EAAQC,EA+BRC,EAAoBC,EAAAA,SAAS,IAAM,IAAMH,EAAM,WAAW,8BAI9DI,EAAAA,YA+BsBC,EAAAA,MAAAC,EAAAA,OAAA,EAAA,CA/BA,UAAWL,EAAA,UAAY,uBAAOA,EAAA,KAAK,CAAA,qBAEvD,IAWiB,CAXjBM,cAWiBF,EAAAA,MAAAG,EAAAA,aAAA,EAAA,CAVd,eAAcP,EAAA,YACd,WAAUA,EAAA,QACV,WAAUA,EAAA,QACV,MAAKQ,EAAAA,eAAER,EAAA,IAAG,EAAQA,EAAA,YAAS,aAAA,0BAAA,0BAAA,EAAA,EAC3B,MAAKS,EAAAA,eAAET,EAAA,IAAG,EAAA,CAAA,QAAA,GAAqBA,EAAA,GAAG,IAAA,EAAA,CAAA,CAAA,CAAA,qBAEnC,IAAqB,CAArBU,EAAAA,WAAqBC,EAAA,OAAA,QAAA,CAAA,EAAA,OAAA,EAAA,EAErBD,EAAAA,WAAoBC,EAAA,OAAA,OAAA,CAAA,EAAA,OAAA,EAAA,EACpBD,EAAAA,WAAmBC,EAAA,OAAA,MAAA,CAAA,EAAA,OAAA,EAAA,CAAA,kEAIrBL,EAAAA,YAA6CF,EAAAA,MAAAQ,SAAA,EAAA,CAA3B,cAAaZ,EAAA,UAAA,EAAU,KAAA,EAAA,CAAA,aAAA,CAAA,EAGzCM,cAWiBF,EAAAA,MAAAG,EAAAA,aAAA,EAAA,CAVd,eAAcN,EAAA,MACd,WAAUD,EAAA,cACV,WAAUA,EAAA,cACV,MAAKQ,EAAAA,eAAER,EAAA,IAAG,EAAQA,EAAA,YAAS,aAAA,0BAAA,0BAAA,EAAA,EAC3B,MAAKS,EAAAA,eAAET,EAAA,IAAG,EAAA,CAAA,QAAA,GAAqBA,EAAA,GAAG,IAAA,EAAA,CAAA,CAAA,CAAA,qBAEnC,IAAsB,CAAtBU,EAAAA,WAAsBC,EAAA,OAAA,SAAA,CAAA,EAAA,OAAA,EAAA,EAEtBD,EAAAA,WAAqBC,EAAA,OAAA,QAAA,CAAA,EAAA,OAAA,EAAA,EACrBD,EAAAA,WAAsBC,EAAA,OAAA,SAAA,CAAA,EAAA,OAAA,EAAA,CAAA"}
@@ -1,5 +1,62 @@
1
- import f from "./JSplitter.vue.js";
1
+ import { defineComponent as u, computed as m, createBlock as z, openBlock as f, unref as i, normalizeClass as l, withCtx as n, createVNode as s, normalizeStyle as o, renderSlot as t } from "vue";
2
+ import S from "../shadcn/resizable/ResizableHandle.vue.js";
3
+ import g from "../shadcn/resizable/ResizablePanelGroup.vue.js";
4
+ import { SplitterPanel as d } from "reka-ui";
5
+ const w = /* @__PURE__ */ u({
6
+ __name: "JSplitter",
7
+ props: {
8
+ direction: { default: "horizontal" },
9
+ defaultSize: { default: 40 },
10
+ minSize: { default: 20 },
11
+ maxSize: {},
12
+ secondMinSize: {},
13
+ secondMaxSize: {},
14
+ withHandle: { type: Boolean, default: !0 },
15
+ gap: { default: 10 },
16
+ class: {}
17
+ },
18
+ setup(e) {
19
+ const c = e, r = m(() => 100 - c.defaultSize);
20
+ return (a, h) => (f(), z(i(g), {
21
+ direction: e.direction,
22
+ class: l(e.class)
23
+ }, {
24
+ default: n(() => [
25
+ s(i(d), {
26
+ "default-size": e.defaultSize,
27
+ "min-size": e.minSize,
28
+ "max-size": e.maxSize,
29
+ class: l(e.gap > 0 ? e.direction === "horizontal" ? "pr-[calc(var(--gap)/2)]" : "pb-[calc(var(--gap)/2)]" : ""),
30
+ style: o(e.gap > 0 ? { "--gap": `${e.gap}px` } : {})
31
+ }, {
32
+ default: n(() => [
33
+ t(a.$slots, "first", {}, void 0, !0),
34
+ t(a.$slots, "left", {}, void 0, !0),
35
+ t(a.$slots, "top", {}, void 0, !0)
36
+ ]),
37
+ _: 3
38
+ }, 8, ["default-size", "min-size", "max-size", "class", "style"]),
39
+ s(i(S), { "with-handle": e.withHandle }, null, 8, ["with-handle"]),
40
+ s(i(d), {
41
+ "default-size": r.value,
42
+ "min-size": e.secondMinSize,
43
+ "max-size": e.secondMaxSize,
44
+ class: l(e.gap > 0 ? e.direction === "horizontal" ? "pl-[calc(var(--gap)/2)]" : "pt-[calc(var(--gap)/2)]" : ""),
45
+ style: o(e.gap > 0 ? { "--gap": `${e.gap}px` } : {})
46
+ }, {
47
+ default: n(() => [
48
+ t(a.$slots, "second", {}, void 0, !0),
49
+ t(a.$slots, "right", {}, void 0, !0),
50
+ t(a.$slots, "bottom", {}, void 0, !0)
51
+ ]),
52
+ _: 3
53
+ }, 8, ["default-size", "min-size", "max-size", "class", "style"])
54
+ ]),
55
+ _: 3
56
+ }, 8, ["direction", "class"]));
57
+ }
58
+ });
2
59
  export {
3
- f as default
60
+ w as default
4
61
  };
5
62
  //# sourceMappingURL=JSplitter.vue2.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"JSplitter.vue2.js","sources":[],"sourcesContent":[],"names":[],"mappings":";"}
1
+ {"version":3,"file":"JSplitter.vue2.js","sources":["../../../../src/components/atoms/JSplitter.vue"],"sourcesContent":["<script setup lang=\"ts\">\nimport { computed } from 'vue'\nimport {\n ResizablePanelGroup,\n ResizablePanel,\n ResizableHandle,\n} from '@/components/shadcn/resizable'\n\ntype Orientation = 'horizontal' | 'vertical'\n\nconst props = withDefaults(\n defineProps<{\n /** 분할 방향 (horizontal: 좌우, vertical: 상하) */\n direction?: Orientation\n /** 첫 번째 패널의 기본 크기 (%) */\n defaultSize?: number\n /** 첫 번째 패널의 최소 크기 (%) */\n minSize?: number\n /** 첫 번째 패널의 최대 크기 (%) */\n maxSize?: number\n /** 두 번째 패널의 최소 크기 (%) */\n secondMinSize?: number\n /** 두 번째 패널의 최대 크기 (%) */\n secondMaxSize?: number\n /** ResizableHandle에 grip 아이콘 표시 여부 */\n withHandle?: boolean\n /** 패널 간 여백 (px) */\n gap?: number\n /** 추가 CSS 클래스 */\n class?: string\n }>(),\n {\n direction: 'horizontal',\n defaultSize: 40,\n minSize: 20,\n withHandle: true,\n gap: 10,\n },\n)\n\n// 두 번째 패널의 기본 크기 계산\nconst secondDefaultSize = computed(() => 100 - props.defaultSize)\n</script>\n\n<template>\n <ResizablePanelGroup :direction=\"direction\" :class=\"class\">\n <!-- 첫 번째 패널 (좌측/상단) -->\n <ResizablePanel \n :default-size=\"defaultSize\" \n :min-size=\"minSize\" \n :max-size=\"maxSize\"\n :class=\"gap > 0 ? (direction === 'horizontal' ? 'pr-[calc(var(--gap)/2)]' : 'pb-[calc(var(--gap)/2)]') : ''\"\n :style=\"gap > 0 ? { '--gap': `${gap}px` } : {}\"\n >\n <slot name=\"first\" />\n <!-- direction=\"horizontal\"일 때 left, vertical일 때 top으로도 사용 가능 -->\n <slot name=\"left\" />\n <slot name=\"top\" />\n </ResizablePanel>\n\n <!-- 크기 조정 핸들 -->\n <ResizableHandle :with-handle=\"withHandle\" />\n\n <!-- 두 번째 패널 (우측/하단) -->\n <ResizablePanel\n :default-size=\"secondDefaultSize\"\n :min-size=\"secondMinSize\"\n :max-size=\"secondMaxSize\"\n :class=\"gap > 0 ? (direction === 'horizontal' ? 'pl-[calc(var(--gap)/2)]' : 'pt-[calc(var(--gap)/2)]') : ''\"\n :style=\"gap > 0 ? { '--gap': `${gap}px` } : {}\"\n >\n <slot name=\"second\" />\n <!-- direction=\"horizontal\"일 때 right, vertical일 때 bottom으로도 사용 가능 -->\n <slot name=\"right\" />\n <slot name=\"bottom\" />\n </ResizablePanel>\n </ResizablePanelGroup>\n</template>\n\n<style scoped>\n/* ========================================\n 패턴 5: Splitter Handle 스타일\n ======================================== */\n\n:deep([data-panel-resize-handle-id]) {\n background: hsl(var(--border) / 0.8);\n transition: all 0.2s ease;\n position: relative;\n}\n\n:deep([data-panel-resize-handle-id]::before) {\n content: '';\n position: absolute;\n top: 0;\n left: 0;\n right: 0;\n bottom: 0;\n background: hsl(var(--muted-foreground) / 0.2);\n}\n\n:deep([data-panel-resize-handle-id]:hover) {\n background: hsl(var(--primary) / 0.6);\n}\n\n:deep([data-panel-resize-handle-id]:hover::before) {\n background: hsl(var(--primary) / 0.3);\n}\n\n:deep([data-panel-resize-handle-id]:active) {\n background: hsl(var(--primary));\n}\n\n:deep([data-panel-resize-handle-id]:active::before) {\n background: hsl(var(--primary) / 0.5);\n}\n\n:deep([data-panel-resize-handle-id][data-resize-handle-orientation=\"horizontal\"]) {\n cursor: col-resize;\n width: 6px;\n}\n\n:deep([data-panel-resize-handle-id][data-resize-handle-orientation=\"vertical\"]) {\n cursor: row-resize;\n height: 6px;\n}\n</style>\n"],"names":["props","__props","secondDefaultSize","computed","_createBlock","_unref","ResizablePanelGroup","_createVNode","ResizablePanel","_normalizeClass","_normalizeStyle","_renderSlot","_ctx","ResizableHandle"],"mappings":";;;;;;;;;;;;;;;;;;AAUA,UAAMA,IAAQC,GA+BRC,IAAoBC,EAAS,MAAM,MAAMH,EAAM,WAAW;2BAI9DI,EA+BsBC,EAAAC,CAAA,GAAA;AAAA,MA/BA,WAAWL,EAAA;AAAA,MAAY,SAAOA,EAAA,KAAK;AAAA,IAAA;iBAEvD,MAWiB;AAAA,QAXjBM,EAWiBF,EAAAG,CAAA,GAAA;AAAA,UAVd,gBAAcP,EAAA;AAAA,UACd,YAAUA,EAAA;AAAA,UACV,YAAUA,EAAA;AAAA,UACV,OAAKQ,EAAER,EAAA,MAAG,IAAQA,EAAA,cAAS,eAAA,4BAAA,4BAAA,EAAA;AAAA,UAC3B,OAAKS,EAAET,EAAA,MAAG,IAAA,EAAA,SAAA,GAAqBA,EAAA,GAAG,KAAA,IAAA,CAAA,CAAA;AAAA,QAAA;qBAEnC,MAAqB;AAAA,YAArBU,EAAqBC,EAAA,QAAA,SAAA,CAAA,GAAA,QAAA,EAAA;AAAA,YAErBD,EAAoBC,EAAA,QAAA,QAAA,CAAA,GAAA,QAAA,EAAA;AAAA,YACpBD,EAAmBC,EAAA,QAAA,OAAA,CAAA,GAAA,QAAA,EAAA;AAAA,UAAA;;;QAIrBL,EAA6CF,EAAAQ,CAAA,GAAA,EAA3B,eAAaZ,EAAA,WAAA,GAAU,MAAA,GAAA,CAAA,aAAA,CAAA;AAAA,QAGzCM,EAWiBF,EAAAG,CAAA,GAAA;AAAA,UAVd,gBAAcN,EAAA;AAAA,UACd,YAAUD,EAAA;AAAA,UACV,YAAUA,EAAA;AAAA,UACV,OAAKQ,EAAER,EAAA,MAAG,IAAQA,EAAA,cAAS,eAAA,4BAAA,4BAAA,EAAA;AAAA,UAC3B,OAAKS,EAAET,EAAA,MAAG,IAAA,EAAA,SAAA,GAAqBA,EAAA,GAAG,KAAA,IAAA,CAAA,CAAA;AAAA,QAAA;qBAEnC,MAAsB;AAAA,YAAtBU,EAAsBC,EAAA,QAAA,UAAA,CAAA,GAAA,QAAA,EAAA;AAAA,YAEtBD,EAAqBC,EAAA,QAAA,SAAA,CAAA,GAAA,QAAA,EAAA;AAAA,YACrBD,EAAsBC,EAAA,QAAA,UAAA,CAAA,GAAA,QAAA,EAAA;AAAA,UAAA;;;;;;;;"}
@@ -1,2 +1,2 @@
1
- "use strict";Object.defineProperties(exports,{__esModule:{value:!0},[Symbol.toStringTag]:{value:"Module"}});const t=require("vue"),y=require("../shadcn/Tooltip.vue.cjs"),T=require("../shadcn/TooltipContent.vue.cjs"),b=require("../shadcn/TooltipProvider.vue.cjs"),w=require("../shadcn/TooltipTrigger.vue.cjs"),C=t.defineComponent({__name:"JTooltip",props:{content:{},side:{default:"top"},align:{default:"center"},class:{},styletype:{default:"default"},size:{default:"md"},disabled:{type:Boolean,default:!1},delay:{default:200},maxWidth:{default:"200px"},trigger:{default:"hover"}},setup(n,{expose:u}){const e=n,c={default:{class:""},primary:{class:"bg-blue-500 text-white border-blue-600"},success:{class:"bg-green-500 text-white border-green-600"},warning:{class:"bg-amber-500 text-white border-amber-600"},danger:{class:"bg-red-500 text-white border-red-600"}},d={sm:{class:"text-xs px-2 py-1"},md:{class:"text-sm px-3 py-1.5"},lg:{class:"text-base px-4 py-2"}},o=t.ref(!1),g=l=>{console.log("Click handler called, trigger:",e.trigger),e.trigger==="click"?(console.log("Toggling tooltip, current state:",o.value),o.value=!o.value,console.log("New state:",o.value)):e.trigger==="focus"&&(l.preventDefault(),l.stopPropagation())};let r=null;const p=()=>{e.trigger==="hover"&&(r&&clearTimeout(r),r=setTimeout(()=>{o.value=!0},e.delay))},f=()=>{e.trigger==="hover"&&(r&&(clearTimeout(r),r=null),o.value=!1)},v=()=>{e.trigger==="focus"&&(o.value=!0)},_=()=>{e.trigger==="focus"&&(o.value=!1)},m=t.computed(()=>{const l={disabled:e.disabled};return l.open=o.value,l}),i=l=>{if(e.trigger==="hover"&&o.value){const a=l.target,s=document.querySelector("[data-tooltip-trigger]");s&&!s.contains(a)&&(o.value=!1)}};u({showTooltip:()=>{e.trigger==="manual"&&(o.value=!0)},hideTooltip:()=>{e.trigger==="manual"&&(o.value=!1)}}),t.onMounted(()=>{e.trigger==="hover"&&document.addEventListener("click",i)}),t.onUnmounted(()=>{e.trigger==="hover"&&document.removeEventListener("click",i),r&&clearTimeout(r)});const h=t.computed(()=>{const l=c[e.styletype],a=d[e.size],s=[l.class,a.class,e.class].filter(Boolean).join(" "),x=typeof e.maxWidth=="number"?`${e.maxWidth}px`:e.maxWidth;return{side:e.side,align:e.align,class:s,style:{maxWidth:x}}});return(l,a)=>(t.openBlock(),t.createBlock(b.default,{delayDuration:e.delay},{default:t.withCtx(()=>[t.createVNode(y.default,t.normalizeProps(t.guardReactiveProps(m.value)),{default:t.withCtx(()=>[t.createVNode(w.default,{"as-child":"","data-tooltip-trigger":!0,onClick:g,onMouseenter:p,onMouseleave:f,onFocus:v,onBlur:_},{default:t.withCtx(()=>[t.renderSlot(l.$slots,"trigger")]),_:3}),t.createVNode(T.default,t.normalizeProps(t.guardReactiveProps(h.value)),{default:t.withCtx(()=>[t.createTextVNode(t.toDisplayString(e.content),1)]),_:1},16)]),_:3},16)]),_:3},8,["delayDuration"]))}});exports.default=C;
1
+ "use strict";Object.defineProperties(exports,{__esModule:{value:!0},[Symbol.toStringTag]:{value:"Module"}});const t=require("vue"),y=require("../shadcn/Tooltip.vue.cjs"),T=require("../shadcn/TooltipContent.vue.cjs"),b=require("../shadcn/TooltipProvider.vue.cjs"),w=require("../shadcn/TooltipTrigger.vue.cjs"),C=t.defineComponent({__name:"JTooltip",props:{content:{},side:{default:"top"},align:{default:"center"},class:{},styletype:{default:"default"},size:{default:"sm"},disabled:{type:Boolean,default:!1},delay:{default:200},maxWidth:{default:"200px"},trigger:{default:"hover"}},setup(n,{expose:u}){const e=n,c={default:{class:""},primary:{class:"bg-blue-500 text-white border-blue-600"},success:{class:"bg-green-500 text-white border-green-600"},warning:{class:"bg-amber-500 text-white border-amber-600"},danger:{class:"bg-red-500 text-white border-red-600"}},d={xs:{class:"text-[10px] px-1.5 py-0.5 max-w-40"},sm:{class:"text-xs px-2 py-1 max-w-48"},md:{class:"text-xs px-2.5 py-1 max-w-56"},lg:{class:"text-sm px-3 py-1.5 max-w-64"}},o=t.ref(!1),g=l=>{console.log("Click handler called, trigger:",e.trigger),e.trigger==="click"?(console.log("Toggling tooltip, current state:",o.value),o.value=!o.value,console.log("New state:",o.value)):e.trigger==="focus"&&(l.preventDefault(),l.stopPropagation())};let r=null;const p=()=>{e.trigger==="hover"&&(r&&clearTimeout(r),r=setTimeout(()=>{o.value=!0},e.delay))},f=()=>{e.trigger==="hover"&&(r&&(clearTimeout(r),r=null),o.value=!1)},v=()=>{e.trigger==="focus"&&(o.value=!0)},_=()=>{e.trigger==="focus"&&(o.value=!1)},m=t.computed(()=>{const l={disabled:e.disabled};return l.open=o.value,l}),i=l=>{if(e.trigger==="hover"&&o.value){const a=l.target,s=document.querySelector("[data-tooltip-trigger]");s&&!s.contains(a)&&(o.value=!1)}};u({showTooltip:()=>{e.trigger==="manual"&&(o.value=!0)},hideTooltip:()=>{e.trigger==="manual"&&(o.value=!1)}}),t.onMounted(()=>{e.trigger==="hover"&&document.addEventListener("click",i)}),t.onUnmounted(()=>{e.trigger==="hover"&&document.removeEventListener("click",i),r&&clearTimeout(r)});const h=t.computed(()=>{const l=c[e.styletype],a=d[e.size],s=[l.class,a.class,e.class].filter(Boolean).join(" "),x=typeof e.maxWidth=="number"?`${e.maxWidth}px`:e.maxWidth;return{side:e.side,align:e.align,class:s,style:{maxWidth:x}}});return(l,a)=>(t.openBlock(),t.createBlock(b.default,{delayDuration:e.delay},{default:t.withCtx(()=>[t.createVNode(y.default,t.normalizeProps(t.guardReactiveProps(m.value)),{default:t.withCtx(()=>[t.createVNode(w.default,{"as-child":"","data-tooltip-trigger":!0,onClick:g,onMouseenter:p,onMouseleave:f,onFocus:v,onBlur:_},{default:t.withCtx(()=>[t.renderSlot(l.$slots,"trigger")]),_:3}),t.createVNode(T.default,t.normalizeProps(t.guardReactiveProps(h.value)),{default:t.withCtx(()=>[t.createTextVNode(t.toDisplayString(e.content),1)]),_:1},16)]),_:3},16)]),_:3},8,["delayDuration"]))}});exports.default=C;
2
2
  //# sourceMappingURL=JTooltip.vue.cjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"JTooltip.vue.cjs","sources":["../../../../src/components/atoms/JTooltip.vue"],"sourcesContent":["<script setup lang=\"ts\">\r\nimport { computed, ref, onMounted, onUnmounted } from 'vue'\r\nimport Tooltip from '@/components/shadcn/Tooltip.vue'\r\nimport TooltipContent from '@/components/shadcn/TooltipContent.vue'\r\nimport TooltipProvider from '@/components/shadcn/TooltipProvider.vue'\r\nimport TooltipTrigger from '@/components/shadcn/TooltipTrigger.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 = 'sm' | 'md' | 'lg'\r\n\r\ntype Trigger = 'hover' | 'focus' | 'click' | 'manual'\r\n\r\nconst props = withDefaults(\r\n defineProps<{\r\n content?: string\r\n side?: 'top' | 'right' | 'bottom' | 'left'\r\n align?: 'start' | 'center' | 'end'\r\n class?: string\r\n /** 스타일 프리셋 */\r\n styletype?: StyleType\r\n /** 툴팁 크기 */\r\n size?: Size\r\n /** 툴팁 비활성화 */\r\n disabled?: boolean\r\n /** 표시 지연 시간 (ms) */\r\n delay?: number\r\n /** 툴팁 최대 너비 */\r\n maxWidth?: string | number\r\n /** 툴팁 트리거 타입 */\r\n trigger?: Trigger\r\n }>(),\r\n {\r\n side: 'top',\r\n align: 'center',\r\n styletype: 'default',\r\n size: 'md',\r\n disabled: false,\r\n delay: 200,\r\n maxWidth: '200px',\r\n trigger: 'hover',\r\n },\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 primary: { \r\n class: 'bg-blue-500 text-white border-blue-600',\r\n },\r\n success: { \r\n class: 'bg-green-500 text-white border-green-600',\r\n },\r\n warning: { \r\n class: 'bg-amber-500 text-white border-amber-600',\r\n },\r\n danger: { \r\n class: 'bg-red-500 text-white border-red-600',\r\n },\r\n}\r\n\r\n/**\r\n * size -> class 매핑\r\n */\r\nconst SIZE_PRESETS: Record<Size, { class: string }> = {\r\n sm: { \r\n class: 'text-xs px-2 py-1',\r\n },\r\n md: { \r\n class: 'text-sm px-3 py-1.5',\r\n },\r\n lg: { \r\n class: 'text-base px-4 py-2',\r\n },\r\n}\r\n\r\n// click과 manual 트리거를 위한 상태 관리\r\nconst isOpen = ref(false)\r\n\r\n// 각 트리거 타입별 핸들러\r\nconst handleClick = (event: MouseEvent) => {\r\n console.log('Click handler called, trigger:', props.trigger)\r\n if (props.trigger === 'click') {\r\n console.log('Toggling tooltip, current state:', isOpen.value)\r\n isOpen.value = !isOpen.value\r\n console.log('New state:', isOpen.value)\r\n } else if (props.trigger === 'focus') {\r\n // focus 트리거에서는 클릭 이벤트 무시\r\n event.preventDefault()\r\n event.stopPropagation()\r\n }\r\n}\r\n\r\n// delay를 위한 타이머 관리\r\nlet hoverTimer: number | null = null\r\n\r\nconst handleMouseEnter = () => {\r\n if (props.trigger === 'hover') {\r\n // 기존 타이머가 있으면 취소\r\n if (hoverTimer) {\r\n clearTimeout(hoverTimer)\r\n }\r\n // delay 적용\r\n hoverTimer = setTimeout(() => {\r\n isOpen.value = true\r\n }, props.delay)\r\n }\r\n}\r\n\r\nconst handleMouseLeave = () => {\r\n if (props.trigger === 'hover') {\r\n // 타이머 취소\r\n if (hoverTimer) {\r\n clearTimeout(hoverTimer)\r\n hoverTimer = null\r\n }\r\n isOpen.value = false\r\n }\r\n}\r\n\r\nconst handleFocus = () => {\r\n if (props.trigger === 'focus') {\r\n isOpen.value = true\r\n }\r\n}\r\n\r\nconst handleBlur = () => {\r\n if (props.trigger === 'focus') {\r\n isOpen.value = false\r\n }\r\n}\r\n\r\n// 트리거 타입에 따른 Tooltip 설정 계산\r\nconst tooltipConfig = computed(() => {\r\n const config: any = {\r\n disabled: props.disabled,\r\n }\r\n \r\n // 모든 트리거 타입에 대해 수동 제어\r\n config.open = isOpen.value\r\n \r\n return config\r\n})\r\n\r\n// 외부 클릭 감지를 위한 핸들러\r\nconst handleOutsideClick = (event: Event) => {\r\n if (props.trigger === 'hover' && isOpen.value) {\r\n const target = event.target as HTMLElement\r\n const tooltipElement = document.querySelector('[data-tooltip-trigger]')\r\n if (tooltipElement && !tooltipElement.contains(target)) {\r\n isOpen.value = false\r\n }\r\n }\r\n}\r\n\r\n// manual 트리거를 위한 메서드들\r\nconst showTooltip = () => {\r\n if (props.trigger === 'manual') {\r\n isOpen.value = true\r\n }\r\n}\r\n\r\nconst hideTooltip = () => {\r\n if (props.trigger === 'manual') {\r\n isOpen.value = false\r\n }\r\n}\r\n\r\n// 외부에서 사용할 수 있도록 expose\r\ndefineExpose({\r\n showTooltip,\r\n hideTooltip,\r\n})\r\n\r\n// 외부 클릭 감지를 위한 이벤트 리스너 등록/해제\r\nonMounted(() => {\r\n if (props.trigger === 'hover') {\r\n document.addEventListener('click', handleOutsideClick)\r\n }\r\n})\r\n\r\nonUnmounted(() => {\r\n if (props.trigger === 'hover') {\r\n document.removeEventListener('click', handleOutsideClick)\r\n }\r\n \r\n // 타이머 정리\r\n if (hoverTimer) {\r\n clearTimeout(hoverTimer)\r\n }\r\n})\r\n\r\n/** 최종 바인딩: 직접 넘긴 class가 있으면 styletype과 size 기본값과 병합 */\r\nconst mapped = computed(() => {\r\n const stylePreset = STYLE_PRESETS[props.styletype!]\r\n const sizePreset = SIZE_PRESETS[props.size!]\r\n const finalClass = [stylePreset.class, sizePreset.class, props.class].filter(Boolean).join(' ')\r\n \r\n // maxWidth 스타일 처리\r\n const maxWidthStyle = typeof props.maxWidth === 'number' \r\n ? `${props.maxWidth}px` \r\n : props.maxWidth\r\n \r\n return {\r\n side: props.side,\r\n align: props.align,\r\n class: finalClass,\r\n style: {\r\n maxWidth: maxWidthStyle,\r\n },\r\n }\r\n})\r\n</script>\r\n\r\n<template>\r\n <TooltipProvider :delayDuration=\"props.delay\">\r\n <Tooltip v-bind=\"tooltipConfig\">\r\n <TooltipTrigger \r\n as-child\r\n :data-tooltip-trigger=\"true\"\r\n @click=\"handleClick\"\r\n @mouseenter=\"handleMouseEnter\"\r\n @mouseleave=\"handleMouseLeave\"\r\n @focus=\"handleFocus\"\r\n @blur=\"handleBlur\"\r\n >\r\n <slot name=\"trigger\" />\r\n </TooltipTrigger>\r\n <TooltipContent v-bind=\"mapped\">\r\n {{ props.content }}\r\n </TooltipContent>\r\n </Tooltip>\r\n </TooltipProvider>\r\n</template>\r\n"],"names":["props","__props","STYLE_PRESETS","SIZE_PRESETS","isOpen","ref","handleClick","event","hoverTimer","handleMouseEnter","handleMouseLeave","handleFocus","handleBlur","tooltipConfig","computed","config","handleOutsideClick","target","tooltipElement","__expose","onMounted","onUnmounted","mapped","stylePreset","sizePreset","finalClass","maxWidthStyle","_createBlock","TooltipProvider","_createVNode","Tooltip","TooltipTrigger","_renderSlot","_ctx","TooltipContent","_createTextVNode","_toDisplayString"],"mappings":"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"}
1
+ {"version":3,"file":"JTooltip.vue.cjs","sources":["../../../../src/components/atoms/JTooltip.vue"],"sourcesContent":["<script setup lang=\"ts\">\r\nimport { computed, ref, onMounted, onUnmounted } from 'vue'\r\nimport Tooltip from '@/components/shadcn/Tooltip.vue'\r\nimport TooltipContent from '@/components/shadcn/TooltipContent.vue'\r\nimport TooltipProvider from '@/components/shadcn/TooltipProvider.vue'\r\nimport TooltipTrigger from '@/components/shadcn/TooltipTrigger.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'\n\r\ntype Trigger = 'hover' | 'focus' | 'click' | 'manual'\r\n\r\nconst props = withDefaults(\r\n defineProps<{\r\n content?: string\r\n side?: 'top' | 'right' | 'bottom' | 'left'\r\n align?: 'start' | 'center' | 'end'\r\n class?: string\r\n /** 스타일 프리셋 */\r\n styletype?: StyleType\r\n /** 툴팁 크기 */\r\n size?: Size\r\n /** 툴팁 비활성화 */\r\n disabled?: boolean\r\n /** 표시 지연 시간 (ms) */\r\n delay?: number\r\n /** 툴팁 최대 너비 */\r\n maxWidth?: string | number\r\n /** 툴팁 트리거 타입 */\r\n trigger?: Trigger\r\n }>(),\r\n {\n side: 'top',\n align: 'center',\n styletype: 'default',\n size: 'sm',\n disabled: false,\n delay: 200,\n maxWidth: '200px',\n trigger: 'hover',\r\n },\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 primary: { \r\n class: 'bg-blue-500 text-white border-blue-600',\r\n },\r\n success: { \r\n class: 'bg-green-500 text-white border-green-600',\r\n },\r\n warning: { \r\n class: 'bg-amber-500 text-white border-amber-600',\r\n },\r\n danger: { \r\n class: 'bg-red-500 text-white border-red-600',\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: 'text-[10px] px-1.5 py-0.5 max-w-40',\n },\n sm: { \n class: 'text-xs px-2 py-1 max-w-48',\n },\n md: { \n class: 'text-xs px-2.5 py-1 max-w-56',\n },\n lg: { \n class: 'text-sm px-3 py-1.5 max-w-64',\n },\n}\n\r\n// click과 manual 트리거를 위한 상태 관리\r\nconst isOpen = ref(false)\r\n\r\n// 각 트리거 타입별 핸들러\r\nconst handleClick = (event: MouseEvent) => {\r\n console.log('Click handler called, trigger:', props.trigger)\r\n if (props.trigger === 'click') {\r\n console.log('Toggling tooltip, current state:', isOpen.value)\r\n isOpen.value = !isOpen.value\r\n console.log('New state:', isOpen.value)\r\n } else if (props.trigger === 'focus') {\r\n // focus 트리거에서는 클릭 이벤트 무시\r\n event.preventDefault()\r\n event.stopPropagation()\r\n }\r\n}\r\n\r\n// delay를 위한 타이머 관리\r\nlet hoverTimer: number | null = null\r\n\r\nconst handleMouseEnter = () => {\r\n if (props.trigger === 'hover') {\r\n // 기존 타이머가 있으면 취소\r\n if (hoverTimer) {\r\n clearTimeout(hoverTimer)\r\n }\r\n // delay 적용\r\n hoverTimer = setTimeout(() => {\r\n isOpen.value = true\r\n }, props.delay)\r\n }\r\n}\r\n\r\nconst handleMouseLeave = () => {\r\n if (props.trigger === 'hover') {\r\n // 타이머 취소\r\n if (hoverTimer) {\r\n clearTimeout(hoverTimer)\r\n hoverTimer = null\r\n }\r\n isOpen.value = false\r\n }\r\n}\r\n\r\nconst handleFocus = () => {\r\n if (props.trigger === 'focus') {\r\n isOpen.value = true\r\n }\r\n}\r\n\r\nconst handleBlur = () => {\r\n if (props.trigger === 'focus') {\r\n isOpen.value = false\r\n }\r\n}\r\n\r\n// 트리거 타입에 따른 Tooltip 설정 계산\r\nconst tooltipConfig = computed(() => {\r\n const config: any = {\r\n disabled: props.disabled,\r\n }\r\n \r\n // 모든 트리거 타입에 대해 수동 제어\r\n config.open = isOpen.value\r\n \r\n return config\r\n})\r\n\r\n// 외부 클릭 감지를 위한 핸들러\r\nconst handleOutsideClick = (event: Event) => {\r\n if (props.trigger === 'hover' && isOpen.value) {\r\n const target = event.target as HTMLElement\r\n const tooltipElement = document.querySelector('[data-tooltip-trigger]')\r\n if (tooltipElement && !tooltipElement.contains(target)) {\r\n isOpen.value = false\r\n }\r\n }\r\n}\r\n\r\n// manual 트리거를 위한 메서드들\r\nconst showTooltip = () => {\r\n if (props.trigger === 'manual') {\r\n isOpen.value = true\r\n }\r\n}\r\n\r\nconst hideTooltip = () => {\r\n if (props.trigger === 'manual') {\r\n isOpen.value = false\r\n }\r\n}\r\n\r\n// 외부에서 사용할 수 있도록 expose\r\ndefineExpose({\r\n showTooltip,\r\n hideTooltip,\r\n})\r\n\r\n// 외부 클릭 감지를 위한 이벤트 리스너 등록/해제\r\nonMounted(() => {\r\n if (props.trigger === 'hover') {\r\n document.addEventListener('click', handleOutsideClick)\r\n }\r\n})\r\n\r\nonUnmounted(() => {\r\n if (props.trigger === 'hover') {\r\n document.removeEventListener('click', handleOutsideClick)\r\n }\r\n \r\n // 타이머 정리\r\n if (hoverTimer) {\r\n clearTimeout(hoverTimer)\r\n }\r\n})\r\n\r\n/** 최종 바인딩: 직접 넘긴 class가 있으면 styletype과 size 기본값과 병합 */\r\nconst mapped = computed(() => {\r\n const stylePreset = STYLE_PRESETS[props.styletype!]\r\n const sizePreset = SIZE_PRESETS[props.size!]\r\n const finalClass = [stylePreset.class, sizePreset.class, props.class].filter(Boolean).join(' ')\r\n \r\n // maxWidth 스타일 처리\r\n const maxWidthStyle = typeof props.maxWidth === 'number' \r\n ? `${props.maxWidth}px` \r\n : props.maxWidth\r\n \r\n return {\r\n side: props.side,\r\n align: props.align,\r\n class: finalClass,\r\n style: {\r\n maxWidth: maxWidthStyle,\r\n },\r\n }\r\n})\r\n</script>\r\n\r\n<template>\r\n <TooltipProvider :delayDuration=\"props.delay\">\r\n <Tooltip v-bind=\"tooltipConfig\">\r\n <TooltipTrigger \r\n as-child\r\n :data-tooltip-trigger=\"true\"\r\n @click=\"handleClick\"\r\n @mouseenter=\"handleMouseEnter\"\r\n @mouseleave=\"handleMouseLeave\"\r\n @focus=\"handleFocus\"\r\n @blur=\"handleBlur\"\r\n >\r\n <slot name=\"trigger\" />\r\n </TooltipTrigger>\r\n <TooltipContent v-bind=\"mapped\">\r\n {{ props.content }}\r\n </TooltipContent>\r\n </Tooltip>\r\n </TooltipProvider>\r\n</template>\r\n"],"names":["props","__props","STYLE_PRESETS","SIZE_PRESETS","isOpen","ref","handleClick","event","hoverTimer","handleMouseEnter","handleMouseLeave","handleFocus","handleBlur","tooltipConfig","computed","config","handleOutsideClick","target","tooltipElement","__expose","onMounted","onUnmounted","mapped","stylePreset","sizePreset","finalClass","maxWidthStyle","_createBlock","TooltipProvider","_createVNode","Tooltip","TooltipTrigger","_renderSlot","_ctx","TooltipContent","_createTextVNode","_toDisplayString"],"mappings":"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"}
@@ -1,9 +1,9 @@
1
- import { defineComponent as S, ref as k, computed as c, onMounted as w, onUnmounted as C, createBlock as P, openBlock as B, withCtx as s, createVNode as i, normalizeProps as u, guardReactiveProps as d, renderSlot as W, createTextVNode as $, toDisplayString as M } from "vue";
1
+ import { defineComponent as E, ref as S, computed as c, onMounted as k, onUnmounted as C, createBlock as P, openBlock as B, withCtx as s, createVNode as i, normalizeProps as u, guardReactiveProps as d, renderSlot as W, createTextVNode as $, toDisplayString as M } from "vue";
2
2
  import z from "../shadcn/Tooltip.vue.js";
3
3
  import D from "../shadcn/TooltipContent.vue.js";
4
4
  import L from "../shadcn/TooltipProvider.vue.js";
5
5
  import N from "../shadcn/TooltipTrigger.vue.js";
6
- const J = /* @__PURE__ */ S({
6
+ const J = /* @__PURE__ */ E({
7
7
  __name: "JTooltip",
8
8
  props: {
9
9
  content: {},
@@ -11,7 +11,7 @@ const J = /* @__PURE__ */ S({
11
11
  align: { default: "center" },
12
12
  class: {},
13
13
  styletype: { default: "default" },
14
- size: { default: "md" },
14
+ size: { default: "sm" },
15
15
  disabled: { type: Boolean, default: !1 },
16
16
  delay: { default: 200 },
17
17
  maxWidth: { default: "200px" },
@@ -33,24 +33,27 @@ const J = /* @__PURE__ */ S({
33
33
  class: "bg-red-500 text-white border-red-600"
34
34
  }
35
35
  }, m = {
36
+ xs: {
37
+ class: "text-[10px] px-1.5 py-0.5 max-w-40"
38
+ },
36
39
  sm: {
37
- class: "text-xs px-2 py-1"
40
+ class: "text-xs px-2 py-1 max-w-48"
38
41
  },
39
42
  md: {
40
- class: "text-sm px-3 py-1.5"
43
+ class: "text-xs px-2.5 py-1 max-w-56"
41
44
  },
42
45
  lg: {
43
- class: "text-base px-4 py-2"
46
+ class: "text-sm px-3 py-1.5 max-w-64"
44
47
  }
45
- }, t = k(!1), h = (o) => {
48
+ }, t = S(!1), x = (o) => {
46
49
  console.log("Click handler called, trigger:", e.trigger), e.trigger === "click" ? (console.log("Toggling tooltip, current state:", t.value), t.value = !t.value, console.log("New state:", t.value)) : e.trigger === "focus" && (o.preventDefault(), o.stopPropagation());
47
50
  };
48
51
  let l = null;
49
- const v = () => {
52
+ const h = () => {
50
53
  e.trigger === "hover" && (l && clearTimeout(l), l = setTimeout(() => {
51
54
  t.value = !0;
52
55
  }, e.delay));
53
- }, x = () => {
56
+ }, v = () => {
54
57
  e.trigger === "hover" && (l && (clearTimeout(l), l = null), t.value = !1);
55
58
  }, y = () => {
56
59
  e.trigger === "focus" && (t.value = !0);
@@ -74,19 +77,19 @@ const J = /* @__PURE__ */ S({
74
77
  hideTooltip: () => {
75
78
  e.trigger === "manual" && (t.value = !1);
76
79
  }
77
- }), w(() => {
80
+ }), k(() => {
78
81
  e.trigger === "hover" && document.addEventListener("click", n);
79
82
  }), C(() => {
80
83
  e.trigger === "hover" && document.removeEventListener("click", n), l && clearTimeout(l);
81
84
  });
82
85
  const T = c(() => {
83
- const o = p[e.styletype], a = m[e.size], r = [o.class, a.class, e.class].filter(Boolean).join(" "), E = typeof e.maxWidth == "number" ? `${e.maxWidth}px` : e.maxWidth;
86
+ const o = p[e.styletype], a = m[e.size], r = [o.class, a.class, e.class].filter(Boolean).join(" "), w = typeof e.maxWidth == "number" ? `${e.maxWidth}px` : e.maxWidth;
84
87
  return {
85
88
  side: e.side,
86
89
  align: e.align,
87
90
  class: r,
88
91
  style: {
89
- maxWidth: E
92
+ maxWidth: w
90
93
  }
91
94
  };
92
95
  });
@@ -99,9 +102,9 @@ const J = /* @__PURE__ */ S({
99
102
  i(N, {
100
103
  "as-child": "",
101
104
  "data-tooltip-trigger": !0,
102
- onClick: h,
103
- onMouseenter: v,
104
- onMouseleave: x,
105
+ onClick: x,
106
+ onMouseenter: h,
107
+ onMouseleave: v,
105
108
  onFocus: y,
106
109
  onBlur: _
107
110
  }, {