@tipp/ui 2.3.20 → 2.3.22

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 (340) hide show
  1. package/dist/app/index.cjs +5 -2
  2. package/dist/app/index.cjs.map +1 -1
  3. package/dist/app/index.js +45 -45
  4. package/dist/app/platform/coach-question-list.cjs +5 -2
  5. package/dist/app/platform/coach-question-list.cjs.map +1 -1
  6. package/dist/app/platform/coach-question-list.js +3 -3
  7. package/dist/app/platform/contents-card.cjs +5 -2
  8. package/dist/app/platform/contents-card.cjs.map +1 -1
  9. package/dist/app/platform/contents-card.js +4 -4
  10. package/dist/app/platform/curriculum-card.cjs.map +1 -1
  11. package/dist/app/platform/curriculum-card.js +2 -2
  12. package/dist/app/platform/edit-coaching-time.cjs +5 -2
  13. package/dist/app/platform/edit-coaching-time.cjs.map +1 -1
  14. package/dist/app/platform/edit-coaching-time.js +32 -32
  15. package/dist/app/platform/edit-service-type.cjs +5 -2
  16. package/dist/app/platform/edit-service-type.cjs.map +1 -1
  17. package/dist/app/platform/edit-service-type.js +31 -31
  18. package/dist/app/platform/goal-manage-card-edit.cjs +5 -2
  19. package/dist/app/platform/goal-manage-card-edit.cjs.map +1 -1
  20. package/dist/app/platform/goal-manage-card-edit.js +32 -32
  21. package/dist/app/platform/goal-manage-card-read.cjs +5 -2
  22. package/dist/app/platform/goal-manage-card-read.cjs.map +1 -1
  23. package/dist/app/platform/goal-manage-card-read.js +4 -4
  24. package/dist/app/platform/on-offline-radio-card.cjs +5 -2
  25. package/dist/app/platform/on-offline-radio-card.cjs.map +1 -1
  26. package/dist/app/platform/on-offline-radio-card.js +31 -31
  27. package/dist/app/platform/report-card.cjs +5 -2
  28. package/dist/app/platform/report-card.cjs.map +1 -1
  29. package/dist/app/platform/report-card.js +4 -4
  30. package/dist/app/platform/reservation-card.cjs +5 -2
  31. package/dist/app/platform/reservation-card.cjs.map +1 -1
  32. package/dist/app/platform/reservation-card.js +32 -32
  33. package/dist/app/platform/session-card.cjs +5 -2
  34. package/dist/app/platform/session-card.cjs.map +1 -1
  35. package/dist/app/platform/session-card.js +33 -33
  36. package/dist/app/platform/session-review-simple-read.cjs +5 -2
  37. package/dist/app/platform/session-review-simple-read.cjs.map +1 -1
  38. package/dist/app/platform/session-review-simple-read.js +3 -3
  39. package/dist/app/platform/userInfos/coaching-customer-info/index.cjs +5 -2
  40. package/dist/app/platform/userInfos/coaching-customer-info/index.cjs.map +1 -1
  41. package/dist/app/platform/userInfos/coaching-customer-info/index.js +7 -7
  42. package/dist/app/platform/userInfos/coaching-customer-info/large.cjs +5 -2
  43. package/dist/app/platform/userInfos/coaching-customer-info/large.cjs.map +1 -1
  44. package/dist/app/platform/userInfos/coaching-customer-info/large.js +3 -3
  45. package/dist/app/platform/userInfos/coaching-customer-info/medium.cjs +5 -2
  46. package/dist/app/platform/userInfos/coaching-customer-info/medium.cjs.map +1 -1
  47. package/dist/app/platform/userInfos/coaching-customer-info/medium.js +3 -3
  48. package/dist/app/platform/userInfos/coaching-customer-info/small.cjs +5 -2
  49. package/dist/app/platform/userInfos/coaching-customer-info/small.cjs.map +1 -1
  50. package/dist/app/platform/userInfos/coaching-customer-info/small.js +3 -3
  51. package/dist/app/platform/userInfos/session-user-info-detail.cjs +5 -2
  52. package/dist/app/platform/userInfos/session-user-info-detail.cjs.map +1 -1
  53. package/dist/app/platform/userInfos/session-user-info-detail.js +3 -3
  54. package/dist/app/platform/userInfos/utils.cjs +5 -2
  55. package/dist/app/platform/userInfos/utils.cjs.map +1 -1
  56. package/dist/app/platform/userInfos/utils.js +3 -3
  57. package/dist/atoms/index.cjs +5 -2
  58. package/dist/atoms/index.cjs.map +1 -1
  59. package/dist/atoms/index.js +3 -3
  60. package/dist/atoms/pagination.cjs.map +1 -1
  61. package/dist/atoms/pagination.js +2 -2
  62. package/dist/chunk-3C6HB5HA.js +144 -0
  63. package/dist/chunk-3C6HB5HA.js.map +1 -0
  64. package/dist/chunk-3CJZYFG3.js +174 -0
  65. package/dist/chunk-3CJZYFG3.js.map +1 -0
  66. package/dist/chunk-45VET5EX.js +63 -0
  67. package/dist/chunk-45VET5EX.js.map +1 -0
  68. package/dist/chunk-4MA4T2XQ.js +222 -0
  69. package/dist/chunk-4MA4T2XQ.js.map +1 -0
  70. package/dist/chunk-4U6DFH7Z.js +50 -0
  71. package/dist/chunk-4U6DFH7Z.js.map +1 -0
  72. package/dist/chunk-5IIGHOLB.js +196 -0
  73. package/dist/chunk-5IIGHOLB.js.map +1 -0
  74. package/dist/chunk-62AHHT47.js +89 -0
  75. package/dist/chunk-62AHHT47.js.map +1 -0
  76. package/dist/chunk-6Q73GRZT.js +145 -0
  77. package/dist/chunk-6Q73GRZT.js.map +1 -0
  78. package/dist/chunk-6WGBQSQT.js +228 -0
  79. package/dist/chunk-6WGBQSQT.js.map +1 -0
  80. package/dist/chunk-7TOQOZH7.js +245 -0
  81. package/dist/chunk-7TOQOZH7.js.map +1 -0
  82. package/dist/chunk-7ZH2GXUS.js +174 -0
  83. package/dist/chunk-7ZH2GXUS.js.map +1 -0
  84. package/dist/chunk-AC6MUU6D.js +146 -0
  85. package/dist/chunk-AC6MUU6D.js.map +1 -0
  86. package/dist/chunk-AGTBJUYD.js +50 -0
  87. package/dist/chunk-AGTBJUYD.js.map +1 -0
  88. package/dist/chunk-B4NH4LIJ.js +99 -0
  89. package/dist/chunk-B4NH4LIJ.js.map +1 -0
  90. package/dist/chunk-BSRPUECS.js +144 -0
  91. package/dist/chunk-BSRPUECS.js.map +1 -0
  92. package/dist/chunk-C24L6Z2K.js +69 -0
  93. package/dist/chunk-C24L6Z2K.js.map +1 -0
  94. package/dist/chunk-CAYZTABQ.js +144 -0
  95. package/dist/chunk-CAYZTABQ.js.map +1 -0
  96. package/dist/chunk-CCLZRSGW.js +87 -0
  97. package/dist/chunk-CCLZRSGW.js.map +1 -0
  98. package/dist/chunk-CKQYG7TZ.js +245 -0
  99. package/dist/chunk-CKQYG7TZ.js.map +1 -0
  100. package/dist/chunk-CLLBSWGX.js +145 -0
  101. package/dist/chunk-CLLBSWGX.js.map +1 -0
  102. package/dist/chunk-CNJT7KEY.js +218 -0
  103. package/dist/chunk-CNJT7KEY.js.map +1 -0
  104. package/dist/chunk-DNIPGDRU.js +145 -0
  105. package/dist/chunk-DNIPGDRU.js.map +1 -0
  106. package/dist/chunk-DPPRU4D3.js +174 -0
  107. package/dist/chunk-DPPRU4D3.js.map +1 -0
  108. package/dist/chunk-DZ6LWD2X.js +174 -0
  109. package/dist/chunk-DZ6LWD2X.js.map +1 -0
  110. package/dist/chunk-DZCLAKSB.js +218 -0
  111. package/dist/chunk-DZCLAKSB.js.map +1 -0
  112. package/dist/chunk-EDJIZYNL.js +89 -0
  113. package/dist/chunk-EDJIZYNL.js.map +1 -0
  114. package/dist/chunk-EE4HLQGV.js +145 -0
  115. package/dist/chunk-EE4HLQGV.js.map +1 -0
  116. package/dist/chunk-ENFFYCHI.js +63 -0
  117. package/dist/chunk-ENFFYCHI.js.map +1 -0
  118. package/dist/chunk-EUUNWKHL.js +69 -0
  119. package/dist/chunk-EUUNWKHL.js.map +1 -0
  120. package/dist/chunk-FC4J5OA4.js +144 -0
  121. package/dist/chunk-FC4J5OA4.js.map +1 -0
  122. package/dist/chunk-GJ4GPOIC.js +144 -0
  123. package/dist/chunk-GJ4GPOIC.js.map +1 -0
  124. package/dist/chunk-GLZ66EYJ.js +146 -0
  125. package/dist/chunk-GLZ66EYJ.js.map +1 -0
  126. package/dist/chunk-GQFO7RV5.js +145 -0
  127. package/dist/chunk-GQFO7RV5.js.map +1 -0
  128. package/dist/chunk-H7IE4ZJG.js +174 -0
  129. package/dist/chunk-H7IE4ZJG.js.map +1 -0
  130. package/dist/chunk-HQAX6GAD.js +89 -0
  131. package/dist/chunk-HQAX6GAD.js.map +1 -0
  132. package/dist/chunk-I7E2IWC4.js +149 -0
  133. package/dist/chunk-I7E2IWC4.js.map +1 -0
  134. package/dist/chunk-IDY6K633.js +145 -0
  135. package/dist/chunk-IDY6K633.js.map +1 -0
  136. package/dist/chunk-IKJLNJ64.js +145 -0
  137. package/dist/chunk-IKJLNJ64.js.map +1 -0
  138. package/dist/chunk-IW7G7LMH.js +245 -0
  139. package/dist/chunk-IW7G7LMH.js.map +1 -0
  140. package/dist/chunk-JFM62CXW.js +50 -0
  141. package/dist/chunk-JFM62CXW.js.map +1 -0
  142. package/dist/chunk-JHKIEQKC.js +69 -0
  143. package/dist/chunk-JHKIEQKC.js.map +1 -0
  144. package/dist/chunk-JJSZK6KF.js +169 -0
  145. package/dist/chunk-JJSZK6KF.js.map +1 -0
  146. package/dist/chunk-JKWO3SGU.js +79 -0
  147. package/dist/chunk-JKWO3SGU.js.map +1 -0
  148. package/dist/chunk-JWDXPHJ3.js +117 -0
  149. package/dist/chunk-JWDXPHJ3.js.map +1 -0
  150. package/dist/chunk-KC6AEXYR.js +174 -0
  151. package/dist/chunk-KC6AEXYR.js.map +1 -0
  152. package/dist/chunk-KHQ3C5HB.js +125 -0
  153. package/dist/chunk-KHQ3C5HB.js.map +1 -0
  154. package/dist/chunk-KOMV6H3L.js +144 -0
  155. package/dist/chunk-KOMV6H3L.js.map +1 -0
  156. package/dist/chunk-KUKHQCFS.js +233 -0
  157. package/dist/chunk-KUKHQCFS.js.map +1 -0
  158. package/dist/chunk-KVO5ZNRN.js +50 -0
  159. package/dist/chunk-KVO5ZNRN.js.map +1 -0
  160. package/dist/chunk-KZVNK5NO.js +145 -0
  161. package/dist/chunk-KZVNK5NO.js.map +1 -0
  162. package/dist/chunk-L7ATTNZ2.js +174 -0
  163. package/dist/chunk-L7ATTNZ2.js.map +1 -0
  164. package/dist/chunk-LGDFJ7W6.js +174 -0
  165. package/dist/chunk-LGDFJ7W6.js.map +1 -0
  166. package/dist/chunk-LIHMBEQT.js +144 -0
  167. package/dist/chunk-LIHMBEQT.js.map +1 -0
  168. package/dist/chunk-LTEJYJUM.js +143 -0
  169. package/dist/chunk-LTEJYJUM.js.map +1 -0
  170. package/dist/chunk-LTJELIXX.js +149 -0
  171. package/dist/chunk-LTJELIXX.js.map +1 -0
  172. package/dist/chunk-LWVP3RG6.js +212 -0
  173. package/dist/chunk-LWVP3RG6.js.map +1 -0
  174. package/dist/chunk-M5RM57U5.js +69 -0
  175. package/dist/chunk-M5RM57U5.js.map +1 -0
  176. package/dist/chunk-MG3MDWHJ.js +245 -0
  177. package/dist/chunk-MG3MDWHJ.js.map +1 -0
  178. package/dist/chunk-MQXF7JLT.js +145 -0
  179. package/dist/chunk-MQXF7JLT.js.map +1 -0
  180. package/dist/chunk-N5B7ANSJ.js +145 -0
  181. package/dist/chunk-N5B7ANSJ.js.map +1 -0
  182. package/dist/chunk-OL4XCMRU.js +363 -0
  183. package/dist/chunk-OL4XCMRU.js.map +1 -0
  184. package/dist/chunk-OSEENHZJ.js +50 -0
  185. package/dist/chunk-OSEENHZJ.js.map +1 -0
  186. package/dist/chunk-P4HTQBD6.js +245 -0
  187. package/dist/chunk-P4HTQBD6.js.map +1 -0
  188. package/dist/chunk-P74G3XSY.js +50 -0
  189. package/dist/chunk-P74G3XSY.js.map +1 -0
  190. package/dist/chunk-PTYFKWCC.js +145 -0
  191. package/dist/chunk-PTYFKWCC.js.map +1 -0
  192. package/dist/chunk-PYQQZYJL.js +145 -0
  193. package/dist/chunk-PYQQZYJL.js.map +1 -0
  194. package/dist/chunk-Q267B6E6.js +146 -0
  195. package/dist/chunk-Q267B6E6.js.map +1 -0
  196. package/dist/chunk-QDC3LFHS.js +149 -0
  197. package/dist/chunk-QDC3LFHS.js.map +1 -0
  198. package/dist/chunk-QEGDJ4ZD.js +165 -0
  199. package/dist/chunk-QEGDJ4ZD.js.map +1 -0
  200. package/dist/chunk-QVHA4ANB.js +196 -0
  201. package/dist/chunk-QVHA4ANB.js.map +1 -0
  202. package/dist/chunk-RCTE4E7R.js +144 -0
  203. package/dist/chunk-RCTE4E7R.js.map +1 -0
  204. package/dist/chunk-RFJ5NMY4.js +54 -0
  205. package/dist/chunk-RFJ5NMY4.js.map +1 -0
  206. package/dist/chunk-RY7DDHZO.js +51 -0
  207. package/dist/chunk-RY7DDHZO.js.map +1 -0
  208. package/dist/chunk-S5M6VXKE.js +144 -0
  209. package/dist/chunk-S5M6VXKE.js.map +1 -0
  210. package/dist/chunk-SB2VNB4J.js +145 -0
  211. package/dist/chunk-SB2VNB4J.js.map +1 -0
  212. package/dist/chunk-SFBPPATA.js +37 -0
  213. package/dist/chunk-SFBPPATA.js.map +1 -0
  214. package/dist/chunk-SJ7MGKPR.js +245 -0
  215. package/dist/chunk-SJ7MGKPR.js.map +1 -0
  216. package/dist/chunk-SM22LXE7.js +145 -0
  217. package/dist/chunk-SM22LXE7.js.map +1 -0
  218. package/dist/chunk-SP4QJ7QT.js +69 -0
  219. package/dist/chunk-SP4QJ7QT.js.map +1 -0
  220. package/dist/chunk-UZ7AGDRK.js +98 -0
  221. package/dist/chunk-UZ7AGDRK.js.map +1 -0
  222. package/dist/chunk-V7IC4EAC.js +51 -0
  223. package/dist/chunk-V7IC4EAC.js.map +1 -0
  224. package/dist/chunk-VGHBEX6O.js +145 -0
  225. package/dist/chunk-VGHBEX6O.js.map +1 -0
  226. package/dist/chunk-VJ7AGB7Y.js +245 -0
  227. package/dist/chunk-VJ7AGB7Y.js.map +1 -0
  228. package/dist/chunk-VNJ3VOSY.js +50 -0
  229. package/dist/chunk-VNJ3VOSY.js.map +1 -0
  230. package/dist/chunk-W7NQ5NW6.js +100 -0
  231. package/dist/chunk-W7NQ5NW6.js.map +1 -0
  232. package/dist/chunk-WZLD5ZHV.js +245 -0
  233. package/dist/chunk-WZLD5ZHV.js.map +1 -0
  234. package/dist/chunk-X47BEKKF.js +68 -0
  235. package/dist/chunk-X47BEKKF.js.map +1 -0
  236. package/dist/chunk-XYDK5OWF.js +75 -0
  237. package/dist/chunk-XYDK5OWF.js.map +1 -0
  238. package/dist/chunk-Z4NCEYC6.js +70 -0
  239. package/dist/chunk-Z4NCEYC6.js.map +1 -0
  240. package/dist/chunk-Z4NLUDDL.js +145 -0
  241. package/dist/chunk-Z4NLUDDL.js.map +1 -0
  242. package/dist/chunk-ZI3TYUTO.js +196 -0
  243. package/dist/chunk-ZI3TYUTO.js.map +1 -0
  244. package/dist/chunk-ZOMXQCLY.js +245 -0
  245. package/dist/chunk-ZOMXQCLY.js.map +1 -0
  246. package/dist/chunk-ZVWUCJMB.js +146 -0
  247. package/dist/chunk-ZVWUCJMB.js.map +1 -0
  248. package/dist/context/dynamic-form-context.cjs +5 -2
  249. package/dist/context/dynamic-form-context.cjs.map +1 -1
  250. package/dist/context/dynamic-form-context.js +2 -2
  251. package/dist/context/index.cjs +5 -2
  252. package/dist/context/index.cjs.map +1 -1
  253. package/dist/context/index.js +2 -2
  254. package/dist/icon.cjs +2 -0
  255. package/dist/icon.cjs.map +1 -1
  256. package/dist/icon.d.cts +1 -1
  257. package/dist/icon.d.ts +1 -1
  258. package/dist/icon.js +3 -1
  259. package/dist/index.cjs +46 -14
  260. package/dist/index.cjs.map +1 -1
  261. package/dist/index.d.cts +1 -1
  262. package/dist/index.d.ts +1 -1
  263. package/dist/index.js +53 -51
  264. package/dist/molecules/curriculumV2/CurriculumContents/CurriculumReviewSteps/ReviewQuestion/index.cjs.map +1 -1
  265. package/dist/molecules/curriculumV2/CurriculumContents/CurriculumReviewSteps/ReviewQuestion/index.js +5 -5
  266. package/dist/molecules/curriculumV2/CurriculumContents/CurriculumReviewSteps/ReviewQuestion/review-comp.cjs.map +1 -1
  267. package/dist/molecules/curriculumV2/CurriculumContents/CurriculumReviewSteps/ReviewQuestion/review-comp.js +1 -1
  268. package/dist/molecules/curriculumV2/CurriculumContents/CurriculumReviewSteps/ReviewQuestion/review-question-body.cjs.map +1 -1
  269. package/dist/molecules/curriculumV2/CurriculumContents/CurriculumReviewSteps/ReviewQuestion/review-question-body.js +3 -3
  270. package/dist/molecules/curriculumV2/CurriculumContents/CurriculumReviewSteps/ReviewQuestion/review-question-footer.cjs.map +1 -1
  271. package/dist/molecules/curriculumV2/CurriculumContents/CurriculumReviewSteps/ReviewQuestion/review-question-footer.js +2 -2
  272. package/dist/molecules/curriculumV2/CurriculumContents/CurriculumReviewSteps/ReviewQuestion/review-question-radio.cjs.map +1 -1
  273. package/dist/molecules/curriculumV2/CurriculumContents/CurriculumReviewSteps/ReviewQuestion/review-question-radio.js +1 -1
  274. package/dist/molecules/curriculumV2/CurriculumContents/CurriculumReviewSteps/ReviewQuestion/review-question-satisfaction-option.cjs.map +1 -1
  275. package/dist/molecules/curriculumV2/CurriculumContents/CurriculumReviewSteps/ReviewQuestion/review-question-satisfaction-option.js +1 -1
  276. package/dist/molecules/curriculumV2/CurriculumContents/CurriculumReviewSteps/ReviewQuestion/review-question-satisfaction-text.cjs.map +1 -1
  277. package/dist/molecules/curriculumV2/CurriculumContents/CurriculumReviewSteps/ReviewQuestion/review-question-satisfaction-text.js +1 -1
  278. package/dist/molecules/curriculumV2/CurriculumContents/CurriculumReviewSteps/ReviewQuestion/review-question-text.cjs.map +1 -1
  279. package/dist/molecules/curriculumV2/CurriculumContents/CurriculumReviewSteps/ReviewQuestion/review-question-text.js +2 -2
  280. package/dist/molecules/curriculumV2/CurriculumContents/CurriculumReviewSteps/complete-review.cjs.map +1 -1
  281. package/dist/molecules/curriculumV2/CurriculumContents/CurriculumReviewSteps/complete-review.js +2 -2
  282. package/dist/molecules/curriculumV2/CurriculumContents/CurriculumReviewSteps/index.cjs.map +1 -1
  283. package/dist/molecules/curriculumV2/CurriculumContents/CurriculumReviewSteps/index.js +7 -7
  284. package/dist/molecules/curriculumV2/CurriculumContents/CurriculumReviewSteps/start-review.cjs.map +1 -1
  285. package/dist/molecules/curriculumV2/CurriculumContents/CurriculumReviewSteps/start-review.js +1 -1
  286. package/dist/molecules/curriculumV2/CurriculumContents/curriculum-ai-traning.cjs.map +1 -1
  287. package/dist/molecules/curriculumV2/CurriculumContents/curriculum-ai-traning.js +2 -2
  288. package/dist/molecules/curriculumV2/CurriculumContents/curriculum-review.cjs.map +1 -1
  289. package/dist/molecules/curriculumV2/CurriculumContents/curriculum-review.js +8 -8
  290. package/dist/molecules/curriculumV2/CurriculumContents/index.cjs.map +1 -1
  291. package/dist/molecules/curriculumV2/CurriculumContents/index.js +10 -10
  292. package/dist/molecules/curriculumV2/CurriculumSidebar/Items/section-item.cjs.map +1 -1
  293. package/dist/molecules/curriculumV2/CurriculumSidebar/Items/section-item.js +1 -1
  294. package/dist/molecules/curriculumV2/CurriculumSidebar/index.cjs.map +1 -1
  295. package/dist/molecules/curriculumV2/CurriculumSidebar/index.js +2 -2
  296. package/dist/molecules/curriculumV2/CurriculumSidebar/sidebar-item.cjs.map +1 -1
  297. package/dist/molecules/curriculumV2/CurriculumSidebar/sidebar-item.js +2 -2
  298. package/dist/molecules/curriculumV2/curriculum-sub-nav.cjs.map +1 -1
  299. package/dist/molecules/curriculumV2/curriculum-sub-nav.js +2 -2
  300. package/dist/molecules/curriculumV2/index.cjs.map +1 -1
  301. package/dist/molecules/curriculumV2/index.js +19 -19
  302. package/dist/molecules/date-picker/date-picker-button.cjs.map +1 -1
  303. package/dist/molecules/date-picker/date-picker-button.js +3 -3
  304. package/dist/molecules/date-picker/index.cjs.map +1 -1
  305. package/dist/molecules/date-picker/index.js +2 -2
  306. package/dist/molecules/description-json-render.cjs.map +1 -1
  307. package/dist/molecules/description-json-render.js +3 -3
  308. package/dist/molecules/dynamic-field.cjs +5 -2
  309. package/dist/molecules/dynamic-field.cjs.map +1 -1
  310. package/dist/molecules/dynamic-field.js +3 -3
  311. package/dist/molecules/dynamic-form.cjs +44 -14
  312. package/dist/molecules/dynamic-form.cjs.map +1 -1
  313. package/dist/molecules/dynamic-form.js +4 -4
  314. package/dist/molecules/expand-table/index.cjs.map +1 -1
  315. package/dist/molecules/expand-table/index.js +3 -3
  316. package/dist/molecules/form/form.cjs +5 -2
  317. package/dist/molecules/form/form.cjs.map +1 -1
  318. package/dist/molecules/form/form.js +1 -1
  319. package/dist/molecules/form/index.cjs +5 -2
  320. package/dist/molecules/form/index.cjs.map +1 -1
  321. package/dist/molecules/form/index.js +1 -1
  322. package/dist/molecules/index.cjs +44 -14
  323. package/dist/molecules/index.cjs.map +1 -1
  324. package/dist/molecules/index.js +37 -37
  325. package/dist/molecules/stepper.cjs.map +1 -1
  326. package/dist/molecules/stepper.js +2 -2
  327. package/dist/molecules/tag-selector.cjs.map +1 -1
  328. package/dist/molecules/tag-selector.js +2 -2
  329. package/dist/molecules/time-select.cjs.map +1 -1
  330. package/dist/molecules/time-select.js +2 -2
  331. package/dist/utils/curriculum.utils.cjs.map +1 -1
  332. package/dist/utils/curriculum.utils.js +1 -1
  333. package/dist/utils/getCalloutIconComponent.cjs.map +1 -1
  334. package/dist/utils/getCalloutIconComponent.js +2 -2
  335. package/dist/utils/index.cjs.map +1 -1
  336. package/dist/utils/index.js +2 -2
  337. package/package.json +1 -1
  338. package/src/icon.ts +2 -1
  339. package/src/molecules/dynamic-form.tsx +44 -15
  340. package/src/molecules/form/form.tsx +10 -2
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/molecules/dynamic-form.tsx"],"sourcesContent":["import React, { useMemo, useCallback, useEffect } from 'react';\nimport { useFormik, type FormikProps } from 'formik';\nimport * as Yup from 'yup';\nimport { Box } from '@radix-ui/themes';\nimport { Typo } from '@/atoms/typo';\nimport {\n DynamicFormProvider,\n useDynamicForm,\n} from '@/context/dynamic-form-context';\nimport type {\n DynamicFormFieldSchema,\n ValidationRule,\n} from '@/types/dynamic-form-schema-generated';\nimport { Form } from './form/form';\nimport { DynamicFormField } from './dynamic-field';\n\nexport interface DynamicFormProps {\n fields: DynamicFormFieldSchema[];\n initialValues?: Record<string, unknown>;\n onSubmit: (values: Record<string, unknown>) => void | Promise<void>;\n children: React.ReactNode;\n readonly?: boolean;\n formStyle?: React.CSSProperties;\n}\n\n/**\n * 첫 번째 에러 필드로 스크롤하는 함수\n */\nfunction scrollToFirstError(\n errors: Record<string, unknown>,\n _fields: DynamicFormFieldSchema[]\n): void {\n const firstErrorFieldName = Object.keys(errors)[0];\n if (!firstErrorFieldName) return;\n\n // 해당 필드의 DOM 요소를 찾기 (여러 선택자 시도)\n let fieldElement = document.querySelector(`[name=\"${firstErrorFieldName}\"]`);\n\n // input 요소를 찾지 못한 경우, 해당 필드의 컨테이너를 찾기\n if (!fieldElement) {\n fieldElement = document.querySelector(\n `[data-field-name=\"${firstErrorFieldName}\"]`\n );\n }\n\n // 여전히 찾지 못한 경우, FormItem의 에러 메시지 영역을 찾기\n if (!fieldElement) {\n fieldElement = document.querySelector(\n `[data-error-field=\"${firstErrorFieldName}\"]`\n );\n }\n\n if (fieldElement) {\n fieldElement.scrollIntoView({\n behavior: 'smooth',\n block: 'nearest',\n });\n }\n}\n\nfunction DynamicFormRoot({\n fields,\n initialValues = {},\n onSubmit,\n children,\n readonly = false,\n formStyle,\n}: DynamicFormProps): React.ReactElement {\n const validationSchema = useMemo(() => {\n const schema: Record<string, Yup.Schema<unknown>> = {};\n fields.forEach((field) => {\n if (field.validation) {\n const validation = createYupValidation(field, field.validation);\n if (validation) {\n schema[field.name] = validation;\n }\n } else if (field.required) {\n // choices 타입은 배열 스키마로 처리\n if (field.type === 'choices') {\n schema[field.name] = Yup.array()\n .min(1, `${field.label}을(를) 하나 이상 선택해주세요`)\n .required(`${field.label}은(는) 필수입니다`);\n } else if (field.type === 'yes_no') {\n // yes_no 타입은 boolean 스키마로 처리\n schema[field.name] = Yup.boolean().oneOf(\n [true],\n `${field.label}에 동의해주세요`\n );\n } else {\n // choice, dropdown, short_text, long_text, number, email 타입은 문자열 스키마로 처리\n schema[field.name] = Yup.string().required(\n `${field.label}은(는) 필수입니다`\n );\n }\n }\n });\n return Object.keys(schema).length > 0 ? Yup.object(schema) : undefined;\n }, [fields]);\n\n const handleSubmit = useCallback(\n async (values: Record<string, unknown>) => {\n await onSubmit(values);\n },\n [onSubmit]\n );\n\n const formik: FormikProps<Record<string, unknown>> = useFormik({\n initialValues: fields.reduce<Record<string, unknown>>((acc, field) => {\n if (field.type === 'choices') {\n acc[field.name] = initialValues[field.name] || [];\n } else if (field.type === 'yes_no') {\n acc[field.name] = initialValues[field.name] || false;\n } else {\n acc[field.name] = initialValues[field.name] || '';\n }\n return acc;\n }, {}),\n validationSchema,\n validateOnBlur: true,\n validateOnChange: true,\n onSubmit: handleSubmit,\n });\n\n // submit 시 validation 에러가 있으면 첫 번째 에러 필드로 스크롤\n useEffect(() => {\n if (formik.submitCount > 0 && Object.keys(formik.errors).length > 0) {\n // 약간의 지연을 두어 DOM 업데이트 후 스크롤 실행\n const timeoutId = setTimeout(() => {\n scrollToFirstError(formik.errors, fields);\n }, 100);\n\n return () => {\n clearTimeout(timeoutId);\n };\n }\n }, [formik.submitCount, formik.errors, fields]);\n\n return (\n <DynamicFormProvider\n fields={fields}\n formStyle={formStyle}\n formik={formik}\n readonly={readonly}\n >\n {children}\n </DynamicFormProvider>\n );\n}\n\ninterface DynamicFormFieldListProps {\n fields?: DynamicFormFieldSchema[];\n labelVariant?: 'title' | 'body' | 'caption';\n}\nfunction DynamicFormFieldList({\n fields: fieldsProp,\n labelVariant,\n}: DynamicFormFieldListProps): React.ReactElement {\n const { formik, fields: fieldsFromContext, readonly } = useDynamicForm();\n const fields = fieldsProp || fieldsFromContext;\n\n return (\n <>\n {fields.map((field) => {\n const errorMessage =\n !readonly && formik.touched[field.name] && formik.errors[field.name]\n ? String(formik.errors[field.name])\n : undefined;\n\n return (\n <Box\n data-error-field={errorMessage ? field.name : undefined}\n data-field-name={field.name}\n key={field.name}\n mb=\"2\"\n >\n <Form.FormItem\n errorMessage={errorMessage}\n label={field.label}\n labelVariant={labelVariant}\n name={field.name}\n required={field.required}\n \n >\n {field.description && field.type !== 'yes_no' ? (\n <Typo variant=\"caption\">{field.description}</Typo>\n ) : null}\n <DynamicFormField field={field} />\n </Form.FormItem>\n </Box>\n );\n })}\n </>\n );\n}\n\nexport const DynamicForm = {\n Root: DynamicFormRoot,\n FieldList: DynamicFormFieldList,\n};\n\nexport function createYupValidation(\n field: DynamicFormFieldSchema,\n validation?: ValidationRule\n): Yup.Schema<unknown> | undefined {\n if (!validation) return undefined;\n\n let schema: Yup.Schema<unknown>;\n\n // field.type을 기준으로 기본 스키마 생성\n if (field.type === 'number') {\n schema = Yup.number();\n } else if (field.type === 'email') {\n schema = Yup.string().email(\n validation.message || '올바른 이메일 형식이 아닙니다'\n );\n } else if (field.type === 'choices') {\n schema = Yup.array();\n } else if (field.type === 'yes_no') {\n schema = Yup.boolean();\n } else {\n // choice, dropdown, short_text, long_text 타입은 문자열 스키마로 처리\n schema = Yup.string();\n }\n\n if (validation.min !== undefined) {\n if (field.type === 'number') {\n schema = (schema as Yup.NumberSchema).min(\n validation.min,\n validation.message || `최소 ${validation.min}이어야 합니다`\n );\n } else if (field.type === 'choices') {\n schema = (schema as ReturnType<typeof Yup.array>).min(\n validation.min,\n validation.message || `최소 ${validation.min}개 이상 선택해주세요`\n );\n } else if (field.type === 'yes_no') {\n // yes_no 타입은 boolean이므로 min/max 검증 불가\n // 대신 required 검증만 적용\n } else {\n schema = (schema as Yup.StringSchema).min(\n validation.min,\n validation.message || `최소 ${validation.min}자 이상이어야 합니다`\n );\n }\n }\n\n if (validation.max !== undefined) {\n if (field.type === 'number') {\n schema = (schema as Yup.NumberSchema).max(\n validation.max,\n validation.message || `최대 ${validation.max}이어야 합니다`\n );\n } else if (field.type === 'choices') {\n schema = (schema as ReturnType<typeof Yup.array>).max(\n validation.max,\n validation.message || `최대 ${validation.max}개까지 선택 가능합니다`\n );\n } else if (field.type === 'yes_no') {\n // yes_no 타입은 boolean이므로 min/max 검증 불가\n // 대신 required 검증만 적용\n } else {\n schema = (schema as Yup.StringSchema).max(\n validation.max,\n validation.message || `최대 ${validation.max}자 이하여야 합니다`\n );\n }\n }\n\n if (validation.pattern) {\n if (field.type === 'yes_no') {\n // yes_no 타입은 boolean이므로 pattern 검증 불가\n // 대신 required 검증만 적용\n } else {\n schema = (schema as Yup.StringSchema).matches(\n new RegExp(validation.pattern),\n validation.message || '올바른 형식이 아닙니다'\n );\n }\n }\n\n // field.required가 true인 경우 required 검증 추가\n if (field.required) {\n if (field.type === 'yes_no') {\n schema = (schema as Yup.BooleanSchema).oneOf(\n [true],\n validation.message || `${field.label}에 동의해주세요`\n );\n } else if (field.type === 'choices') {\n schema = (schema as ReturnType<typeof Yup.array>).min(\n 1,\n validation.message || `${field.label}을(를) 하나 이상 선택해주세요`\n );\n } else {\n schema = (schema as Yup.StringSchema).required(\n validation.message || `${field.label}은(는) 필수입니다`\n );\n }\n }\n\n return schema;\n}\n"],"mappings":"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","names":[]}
@@ -0,0 +1,50 @@
1
+ import {
2
+ Form
3
+ } from "./chunk-ZVWUCJMB.js";
4
+ import {
5
+ __async
6
+ } from "./chunk-CRTRMMJ7.js";
7
+
8
+ // src/context/dynamic-form-context.tsx
9
+ import { createContext, useContext } from "react";
10
+ import { jsx } from "react/jsx-runtime";
11
+ var DynamicFormContext = createContext(null);
12
+ function DynamicFormProvider({
13
+ children,
14
+ fields,
15
+ formik,
16
+ readonly = false,
17
+ formStyle
18
+ }) {
19
+ const contextValue = {
20
+ formik,
21
+ fields,
22
+ readonly,
23
+ getFieldValue: (name) => formik.values[name],
24
+ getFieldError: (name) => {
25
+ const error = formik.errors[name];
26
+ const touched = formik.touched[name];
27
+ return touched && error ? String(error) : void 0;
28
+ },
29
+ getFieldTouched: (name) => Boolean(formik.touched[name]),
30
+ setFieldValue: (field, value) => __async(null, null, function* () {
31
+ yield formik.setFieldValue(field, value);
32
+ }),
33
+ handleChange: formik.handleChange,
34
+ handleBlur: formik.handleBlur
35
+ };
36
+ return /* @__PURE__ */ jsx(DynamicFormContext.Provider, { value: contextValue, children: /* @__PURE__ */ jsx(Form.Root, { onSubmit: formik.handleSubmit, style: formStyle, children }) });
37
+ }
38
+ function useDynamicForm() {
39
+ const context = useContext(DynamicFormContext);
40
+ if (!context) {
41
+ throw new Error("useDynamicForm must be used within a DynamicFormProvider");
42
+ }
43
+ return context;
44
+ }
45
+
46
+ export {
47
+ DynamicFormProvider,
48
+ useDynamicForm
49
+ };
50
+ //# sourceMappingURL=chunk-VNJ3VOSY.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/context/dynamic-form-context.tsx"],"sourcesContent":["import React, { createContext, useContext } from 'react';\nimport type { FormikProps } from 'formik';\nimport { Form } from '@/molecules/form/form';\nimport type { DynamicFormFieldSchema } from '@/types/dynamic-form-schema-generated';\n\nexport interface DynamicFormContextValue {\n formik: FormikProps<Record<string, unknown>>;\n fields: DynamicFormFieldSchema[];\n readonly: boolean;\n getFieldValue: (name: string) => unknown;\n getFieldError: (name: string) => string | undefined;\n getFieldTouched: (name: string) => boolean;\n setFieldValue: (field: string, value: unknown) => Promise<void>;\n handleChange: (e: React.ChangeEvent<unknown>) => void;\n handleBlur: (e: React.FocusEvent<unknown>) => void;\n}\n\nconst DynamicFormContext = createContext<DynamicFormContextValue | null>(null);\n\ninterface DynamicFormProviderProps {\n children: React.ReactNode;\n fields: DynamicFormFieldSchema[];\n formik: FormikProps<Record<string, unknown>>;\n readonly?: boolean;\n formStyle?: React.CSSProperties;\n}\n\nexport function DynamicFormProvider({\n children,\n fields,\n formik,\n readonly = false,\n formStyle,\n}: DynamicFormProviderProps): React.ReactElement {\n const contextValue: DynamicFormContextValue = {\n formik,\n fields,\n readonly,\n getFieldValue: (name: string): unknown => formik.values[name],\n getFieldError: (name: string): string | undefined => {\n const error = formik.errors[name];\n const touched = formik.touched[name];\n return touched && error ? String(error) : undefined;\n },\n getFieldTouched: (name: string): boolean => Boolean(formik.touched[name]),\n setFieldValue: async (field: string, value: unknown): Promise<void> => {\n await formik.setFieldValue(field, value);\n },\n handleChange: formik.handleChange,\n handleBlur: formik.handleBlur, \n };\n\n return (\n <DynamicFormContext.Provider value={contextValue}>\n <Form.Root onSubmit={formik.handleSubmit} style={formStyle}>{children}</Form.Root>\n </DynamicFormContext.Provider>\n );\n}\n\nexport function useDynamicForm(): DynamicFormContextValue {\n const context = useContext(DynamicFormContext);\n\n if (!context) {\n throw new Error('useDynamicForm must be used within a DynamicFormProvider');\n }\n\n return context;\n}\n"],"mappings":";;;;;;;;AAAA,SAAgB,eAAe,kBAAkB;AAsD3C;AArCN,IAAM,qBAAqB,cAA8C,IAAI;AAUtE,SAAS,oBAAoB;AAAA,EAClC;AAAA,EACA;AAAA,EACA;AAAA,EACA,WAAW;AAAA,EACX;AACF,GAAiD;AAC/C,QAAM,eAAwC;AAAA,IAC5C;AAAA,IACA;AAAA,IACA;AAAA,IACA,eAAe,CAAC,SAA0B,OAAO,OAAO,IAAI;AAAA,IAC5D,eAAe,CAAC,SAAqC;AACnD,YAAM,QAAQ,OAAO,OAAO,IAAI;AAChC,YAAM,UAAU,OAAO,QAAQ,IAAI;AACnC,aAAO,WAAW,QAAQ,OAAO,KAAK,IAAI;AAAA,IAC5C;AAAA,IACA,iBAAiB,CAAC,SAA0B,QAAQ,OAAO,QAAQ,IAAI,CAAC;AAAA,IACxE,eAAe,CAAO,OAAe,UAAkC;AACrE,YAAM,OAAO,cAAc,OAAO,KAAK;AAAA,IACzC;AAAA,IACA,cAAc,OAAO;AAAA,IACrB,YAAY,OAAO;AAAA,EACrB;AAEA,SACE,oBAAC,mBAAmB,UAAnB,EAA4B,OAAO,cAClC,8BAAC,KAAK,MAAL,EAAU,UAAU,OAAO,cAAc,OAAO,WAAY,UAAS,GACxE;AAEJ;AAEO,SAAS,iBAA0C;AACxD,QAAM,UAAU,WAAW,kBAAkB;AAE7C,MAAI,CAAC,SAAS;AACZ,UAAM,IAAI,MAAM,0DAA0D;AAAA,EAC5E;AAEA,SAAO;AACT;","names":[]}
@@ -0,0 +1,100 @@
1
+ import {
2
+ useCurriculumContext
3
+ } from "./chunk-Y7SJF3Y3.js";
4
+ import {
5
+ Grid
6
+ } from "./chunk-EGEQY3KT.js";
7
+ import {
8
+ Heading
9
+ } from "./chunk-BESTU2AY.js";
10
+ import {
11
+ IconButton
12
+ } from "./chunk-XK6VEVOK.js";
13
+ import {
14
+ Box
15
+ } from "./chunk-4Y5BEXVN.js";
16
+ import {
17
+ Typo
18
+ } from "./chunk-PMJIFLDT.js";
19
+ import {
20
+ ChevronLeftIcon,
21
+ ChevronRightIcon
22
+ } from "./chunk-LTEJYJUM.js";
23
+
24
+ // src/molecules/curriculumV2/curriculum-sub-nav.tsx
25
+ import { useCallback } from "react";
26
+ import { jsx, jsxs } from "react/jsx-runtime";
27
+ function CurriculumSubNav() {
28
+ const {
29
+ selectedItem,
30
+ selectedSectionTitle,
31
+ hasPrev,
32
+ hasNext,
33
+ selectPrev,
34
+ selectNext,
35
+ scrollNavItem
36
+ } = useCurriculumContext();
37
+ const onClickPrev = useCallback(() => {
38
+ selectPrev((moveIndex) => {
39
+ scrollNavItem(moveIndex.toString());
40
+ });
41
+ }, [selectPrev, scrollNavItem]);
42
+ const onClickNext = useCallback(() => {
43
+ selectNext((moveIndex) => {
44
+ scrollNavItem(moveIndex.toString());
45
+ });
46
+ }, [selectNext, scrollNavItem]);
47
+ return /* @__PURE__ */ jsxs(
48
+ Grid,
49
+ {
50
+ align: "center",
51
+ columns: { initial: "32px 1fr 32px", md: "48px 1fr 48px" },
52
+ pb: { initial: "2", md: "3" },
53
+ px: { initial: "1", md: "2" },
54
+ py: "2",
55
+ rows: "auto",
56
+ children: [
57
+ hasPrev ? /* @__PURE__ */ jsx(
58
+ IconButton,
59
+ {
60
+ color: "gray",
61
+ onClick: onClickPrev,
62
+ size: { initial: "medium", md: "large" },
63
+ variant: "ghost",
64
+ children: /* @__PURE__ */ jsx(ChevronLeftIcon, { height: "16px", width: "16px" })
65
+ }
66
+ ) : /* @__PURE__ */ jsx(Box, {}),
67
+ /* @__PURE__ */ jsxs(Box, { width: "100%", children: [
68
+ /* @__PURE__ */ jsx(Box, { display: { initial: "none", md: "block" }, children: /* @__PURE__ */ jsx(Heading, { style: { textOverflow: "ellipsis" }, variant: "heading5", children: selectedItem.title }) }),
69
+ /* @__PURE__ */ jsx(Box, { display: { initial: "block", md: "none" }, children: /* @__PURE__ */ jsx(Typo, { weight: "bold", children: selectedItem.title }) }),
70
+ /* @__PURE__ */ jsx(
71
+ Typo,
72
+ {
73
+ as: "p",
74
+ color: "gray",
75
+ mt: "1",
76
+ style: { textOverflow: "ellipsis" },
77
+ variant: "caption",
78
+ children: selectedSectionTitle == null ? void 0 : selectedSectionTitle.title
79
+ }
80
+ )
81
+ ] }),
82
+ hasNext ? /* @__PURE__ */ jsx(
83
+ IconButton,
84
+ {
85
+ color: "gray",
86
+ onClick: onClickNext,
87
+ size: { initial: "medium", md: "large" },
88
+ variant: "ghost",
89
+ children: /* @__PURE__ */ jsx(ChevronRightIcon, { height: "16px", width: "16px" })
90
+ }
91
+ ) : /* @__PURE__ */ jsx(Box, {})
92
+ ]
93
+ }
94
+ );
95
+ }
96
+
97
+ export {
98
+ CurriculumSubNav
99
+ };
100
+ //# sourceMappingURL=chunk-W7NQ5NW6.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/molecules/curriculumV2/curriculum-sub-nav.tsx"],"sourcesContent":["import React, { useCallback } from 'react';\nimport { Box, } from '@/atoms/box';\nimport { Grid } from '@/atoms/grid';\nimport { Heading } from '@/atoms/heading';\nimport { IconButton } from '@/atoms/icon-button';\nimport { Typo } from '@/atoms/typo';\nimport { ChevronLeftIcon, ChevronRightIcon } from '@/icon';\nimport { useCurriculumContext } from './curriculum-context';\n\nexport function CurriculumSubNav(): React.ReactNode {\n const {\n selectedItem,\n selectedSectionTitle,\n hasPrev,\n hasNext,\n selectPrev,\n selectNext,\n scrollNavItem,\n } = useCurriculumContext();\n\n const onClickPrev = useCallback(() => {\n selectPrev((moveIndex) => {\n scrollNavItem(moveIndex.toString());\n });\n }, [selectPrev, scrollNavItem]);\n\n const onClickNext = useCallback(() => {\n selectNext((moveIndex) => {\n scrollNavItem(moveIndex.toString());\n });\n }, [selectNext, scrollNavItem]);\n\n return (\n <Grid\n align=\"center\"\n columns={{ initial: '32px 1fr 32px', md: '48px 1fr 48px' }}\n pb={{ initial: '2', md: '3' }}\n px={{ initial: '1', md: '2' }}\n py=\"2\"\n rows=\"auto\"\n >\n {hasPrev ? (\n <IconButton\n color=\"gray\"\n onClick={onClickPrev}\n size={{ initial: 'medium', md: 'large' }}\n variant=\"ghost\"\n >\n <ChevronLeftIcon height=\"16px\" width=\"16px\" />\n </IconButton>\n ) : (\n <Box />\n )}\n <Box width=\"100%\">\n {/* 데스크탑 타이틀 */}\n <Box display={{ initial: 'none', md: 'block' }}>\n <Heading style={{ textOverflow: 'ellipsis' }} variant=\"heading5\">\n {selectedItem.title}\n </Heading>\n </Box>\n\n {/* 모바일 타이틀 */}\n <Box display={{ initial: 'block', md: 'none' }}>\n <Typo weight=\"bold\">{selectedItem.title}</Typo>\n </Box>\n\n <Typo\n as=\"p\"\n color=\"gray\"\n mt=\"1\"\n style={{ textOverflow: 'ellipsis' }}\n variant=\"caption\"\n >\n {selectedSectionTitle?.title}\n </Typo>\n </Box>\n {hasNext ? (\n <IconButton\n color=\"gray\"\n onClick={onClickNext}\n size={{ initial: 'medium', md: 'large' }}\n variant=\"ghost\"\n >\n <ChevronRightIcon height=\"16px\" width=\"16px\" />\n </IconButton>\n ) : (\n <Box />\n )}\n </Grid>\n );\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;AAAA,SAAgB,mBAAmB;AAgDzB,cAKJ,YALI;AAvCH,SAAS,mBAAoC;AAClD,QAAM;AAAA,IACJ;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF,IAAI,qBAAqB;AAEzB,QAAM,cAAc,YAAY,MAAM;AACpC,eAAW,CAAC,cAAc;AACxB,oBAAc,UAAU,SAAS,CAAC;AAAA,IACpC,CAAC;AAAA,EACH,GAAG,CAAC,YAAY,aAAa,CAAC;AAE9B,QAAM,cAAc,YAAY,MAAM;AACpC,eAAW,CAAC,cAAc;AACxB,oBAAc,UAAU,SAAS,CAAC;AAAA,IACpC,CAAC;AAAA,EACH,GAAG,CAAC,YAAY,aAAa,CAAC;AAE9B,SACE;AAAA,IAAC;AAAA;AAAA,MACC,OAAM;AAAA,MACN,SAAS,EAAE,SAAS,iBAAiB,IAAI,gBAAgB;AAAA,MACzD,IAAI,EAAE,SAAS,KAAK,IAAI,IAAI;AAAA,MAC5B,IAAI,EAAE,SAAS,KAAK,IAAI,IAAI;AAAA,MAC5B,IAAG;AAAA,MACH,MAAK;AAAA,MAEJ;AAAA,kBACC;AAAA,UAAC;AAAA;AAAA,YACC,OAAM;AAAA,YACN,SAAS;AAAA,YACT,MAAM,EAAE,SAAS,UAAU,IAAI,QAAQ;AAAA,YACvC,SAAQ;AAAA,YAER,8BAAC,mBAAgB,QAAO,QAAO,OAAM,QAAO;AAAA;AAAA,QAC9C,IAEA,oBAAC,OAAI;AAAA,QAEP,qBAAC,OAAI,OAAM,QAET;AAAA,8BAAC,OAAI,SAAS,EAAE,SAAS,QAAQ,IAAI,QAAQ,GAC3C,8BAAC,WAAQ,OAAO,EAAE,cAAc,WAAW,GAAG,SAAQ,YACnD,uBAAa,OAChB,GACF;AAAA,UAGA,oBAAC,OAAI,SAAS,EAAE,SAAS,SAAS,IAAI,OAAO,GAC3C,8BAAC,QAAK,QAAO,QAAQ,uBAAa,OAAM,GAC1C;AAAA,UAEA;AAAA,YAAC;AAAA;AAAA,cACC,IAAG;AAAA,cACH,OAAM;AAAA,cACN,IAAG;AAAA,cACH,OAAO,EAAE,cAAc,WAAW;AAAA,cAClC,SAAQ;AAAA,cAEP,uEAAsB;AAAA;AAAA,UACzB;AAAA,WACF;AAAA,QACC,UACC;AAAA,UAAC;AAAA;AAAA,YACC,OAAM;AAAA,YACN,SAAS;AAAA,YACT,MAAM,EAAE,SAAS,UAAU,IAAI,QAAQ;AAAA,YACvC,SAAQ;AAAA,YAER,8BAAC,oBAAiB,QAAO,QAAO,OAAM,QAAO;AAAA;AAAA,QAC/C,IAEA,oBAAC,OAAI;AAAA;AAAA;AAAA,EAET;AAEJ;","names":[]}
@@ -0,0 +1,245 @@
1
+ import {
2
+ DynamicFormField
3
+ } from "./chunk-PYQQZYJL.js";
4
+ import {
5
+ DynamicFormProvider,
6
+ useDynamicForm
7
+ } from "./chunk-JFM62CXW.js";
8
+ import {
9
+ Form
10
+ } from "./chunk-LTJELIXX.js";
11
+ import {
12
+ Typo
13
+ } from "./chunk-PMJIFLDT.js";
14
+ import {
15
+ __async
16
+ } from "./chunk-CRTRMMJ7.js";
17
+
18
+ // src/molecules/dynamic-form.tsx
19
+ import { useMemo, useCallback, useEffect } from "react";
20
+ import { useFormik } from "formik";
21
+ import * as Yup from "yup";
22
+ import { Box } from "@radix-ui/themes";
23
+ import { Fragment, jsx, jsxs } from "react/jsx-runtime";
24
+ function scrollToFirstError(errors, _fields) {
25
+ const firstErrorFieldName = Object.keys(errors)[0];
26
+ if (!firstErrorFieldName) return;
27
+ let fieldElement = document.querySelector(`[name="${firstErrorFieldName}"]`);
28
+ if (!fieldElement) {
29
+ fieldElement = document.querySelector(
30
+ `[data-field-name="${firstErrorFieldName}"]`
31
+ );
32
+ }
33
+ if (!fieldElement) {
34
+ fieldElement = document.querySelector(
35
+ `[data-error-field="${firstErrorFieldName}"]`
36
+ );
37
+ }
38
+ if (fieldElement) {
39
+ fieldElement.scrollIntoView({
40
+ behavior: "smooth",
41
+ block: "nearest"
42
+ });
43
+ }
44
+ }
45
+ function DynamicFormRoot({
46
+ fields,
47
+ initialValues = {},
48
+ onSubmit,
49
+ children,
50
+ readonly = false,
51
+ formStyle
52
+ }) {
53
+ const validationSchema = useMemo(() => {
54
+ const schema = {};
55
+ fields.forEach((field) => {
56
+ if (field.validation) {
57
+ const validation = createYupValidation(field, field.validation);
58
+ if (validation) {
59
+ schema[field.name] = validation;
60
+ }
61
+ } else if (field.required) {
62
+ if (field.type === "choices") {
63
+ schema[field.name] = Yup.array().min(1, `${field.label}\uC744(\uB97C) \uD558\uB098 \uC774\uC0C1 \uC120\uD0DD\uD574\uC8FC\uC138\uC694`).required(`${field.label}\uC740(\uB294) \uD544\uC218\uC785\uB2C8\uB2E4`);
64
+ } else if (field.type === "yes_no") {
65
+ schema[field.name] = Yup.boolean().oneOf(
66
+ [true],
67
+ `${field.label}\uC5D0 \uB3D9\uC758\uD574\uC8FC\uC138\uC694`
68
+ );
69
+ } else {
70
+ schema[field.name] = Yup.string().required(
71
+ `${field.label}\uC740(\uB294) \uD544\uC218\uC785\uB2C8\uB2E4`
72
+ );
73
+ }
74
+ }
75
+ });
76
+ return Object.keys(schema).length > 0 ? Yup.object(schema) : void 0;
77
+ }, [fields]);
78
+ const handleSubmit = useCallback(
79
+ (values) => __async(null, null, function* () {
80
+ yield onSubmit(values);
81
+ }),
82
+ [onSubmit]
83
+ );
84
+ const formik = useFormik({
85
+ initialValues: fields.reduce((acc, field) => {
86
+ if (field.type === "choices") {
87
+ acc[field.name] = initialValues[field.name] || [];
88
+ } else if (field.type === "yes_no") {
89
+ acc[field.name] = initialValues[field.name] || false;
90
+ } else {
91
+ acc[field.name] = initialValues[field.name] || "";
92
+ }
93
+ return acc;
94
+ }, {}),
95
+ validationSchema,
96
+ validateOnBlur: true,
97
+ validateOnChange: true,
98
+ onSubmit: handleSubmit
99
+ });
100
+ useEffect(() => {
101
+ if (formik.submitCount > 0 && Object.keys(formik.errors).length > 0) {
102
+ const timeoutId = setTimeout(() => {
103
+ scrollToFirstError(formik.errors, fields);
104
+ }, 100);
105
+ return () => {
106
+ clearTimeout(timeoutId);
107
+ };
108
+ }
109
+ }, [formik.submitCount, formik.errors, fields]);
110
+ return /* @__PURE__ */ jsx(
111
+ DynamicFormProvider,
112
+ {
113
+ fields,
114
+ formStyle,
115
+ formik,
116
+ readonly,
117
+ children
118
+ }
119
+ );
120
+ }
121
+ function DynamicFormFieldList({
122
+ fields: fieldsProp,
123
+ labelVariant
124
+ }) {
125
+ const { formik, fields: fieldsFromContext, readonly } = useDynamicForm();
126
+ const fields = fieldsProp || fieldsFromContext;
127
+ return /* @__PURE__ */ jsx(Fragment, { children: fields.map((field) => {
128
+ const errorMessage = !readonly && formik.touched[field.name] && formik.errors[field.name] ? String(formik.errors[field.name]) : void 0;
129
+ return /* @__PURE__ */ jsx(
130
+ Box,
131
+ {
132
+ "data-error-field": errorMessage ? field.name : void 0,
133
+ "data-field-name": field.name,
134
+ mb: "2",
135
+ children: /* @__PURE__ */ jsxs(
136
+ Form.FormItem,
137
+ {
138
+ errorMessage,
139
+ label: field.label,
140
+ labelVariant,
141
+ name: field.name,
142
+ required: field.required,
143
+ children: [
144
+ field.description && field.type !== "yes_no" ? /* @__PURE__ */ jsx(Typo, { variant: "caption", children: field.description }) : null,
145
+ /* @__PURE__ */ jsx(DynamicFormField, { field })
146
+ ]
147
+ }
148
+ )
149
+ },
150
+ field.name
151
+ );
152
+ }) });
153
+ }
154
+ var DynamicForm = {
155
+ Root: DynamicFormRoot,
156
+ FieldList: DynamicFormFieldList
157
+ };
158
+ function createYupValidation(field, validation) {
159
+ if (!validation) return void 0;
160
+ let schema;
161
+ if (field.type === "number") {
162
+ schema = Yup.number();
163
+ } else if (field.type === "email") {
164
+ schema = Yup.string().email(
165
+ validation.message || "\uC62C\uBC14\uB978 \uC774\uBA54\uC77C \uD615\uC2DD\uC774 \uC544\uB2D9\uB2C8\uB2E4"
166
+ );
167
+ } else if (field.type === "choices") {
168
+ schema = Yup.array();
169
+ } else if (field.type === "yes_no") {
170
+ schema = Yup.boolean();
171
+ } else {
172
+ schema = Yup.string();
173
+ }
174
+ if (validation.min !== void 0) {
175
+ if (field.type === "number") {
176
+ schema = schema.min(
177
+ validation.min,
178
+ validation.message || `\uCD5C\uC18C ${validation.min}\uC774\uC5B4\uC57C \uD569\uB2C8\uB2E4`
179
+ );
180
+ } else if (field.type === "choices") {
181
+ schema = schema.min(
182
+ validation.min,
183
+ validation.message || `\uCD5C\uC18C ${validation.min}\uAC1C \uC774\uC0C1 \uC120\uD0DD\uD574\uC8FC\uC138\uC694`
184
+ );
185
+ } else if (field.type === "yes_no") {
186
+ } else {
187
+ schema = schema.min(
188
+ validation.min,
189
+ validation.message || `\uCD5C\uC18C ${validation.min}\uC790 \uC774\uC0C1\uC774\uC5B4\uC57C \uD569\uB2C8\uB2E4`
190
+ );
191
+ }
192
+ }
193
+ if (validation.max !== void 0) {
194
+ if (field.type === "number") {
195
+ schema = schema.max(
196
+ validation.max,
197
+ validation.message || `\uCD5C\uB300 ${validation.max}\uC774\uC5B4\uC57C \uD569\uB2C8\uB2E4`
198
+ );
199
+ } else if (field.type === "choices") {
200
+ schema = schema.max(
201
+ validation.max,
202
+ validation.message || `\uCD5C\uB300 ${validation.max}\uAC1C\uAE4C\uC9C0 \uC120\uD0DD \uAC00\uB2A5\uD569\uB2C8\uB2E4`
203
+ );
204
+ } else if (field.type === "yes_no") {
205
+ } else {
206
+ schema = schema.max(
207
+ validation.max,
208
+ validation.message || `\uCD5C\uB300 ${validation.max}\uC790 \uC774\uD558\uC5EC\uC57C \uD569\uB2C8\uB2E4`
209
+ );
210
+ }
211
+ }
212
+ if (validation.pattern) {
213
+ if (field.type === "yes_no") {
214
+ } else {
215
+ schema = schema.matches(
216
+ new RegExp(validation.pattern),
217
+ validation.message || "\uC62C\uBC14\uB978 \uD615\uC2DD\uC774 \uC544\uB2D9\uB2C8\uB2E4"
218
+ );
219
+ }
220
+ }
221
+ if (field.required) {
222
+ if (field.type === "yes_no") {
223
+ schema = schema.oneOf(
224
+ [true],
225
+ validation.message || `${field.label}\uC5D0 \uB3D9\uC758\uD574\uC8FC\uC138\uC694`
226
+ );
227
+ } else if (field.type === "choices") {
228
+ schema = schema.min(
229
+ 1,
230
+ validation.message || `${field.label}\uC744(\uB97C) \uD558\uB098 \uC774\uC0C1 \uC120\uD0DD\uD574\uC8FC\uC138\uC694`
231
+ );
232
+ } else {
233
+ schema = schema.required(
234
+ validation.message || `${field.label}\uC740(\uB294) \uD544\uC218\uC785\uB2C8\uB2E4`
235
+ );
236
+ }
237
+ }
238
+ return schema;
239
+ }
240
+
241
+ export {
242
+ DynamicForm,
243
+ createYupValidation
244
+ };
245
+ //# sourceMappingURL=chunk-WZLD5ZHV.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/molecules/dynamic-form.tsx"],"sourcesContent":["import React, { useMemo, useCallback, useEffect } from 'react';\nimport { useFormik, type FormikProps } from 'formik';\nimport * as Yup from 'yup';\nimport { Box } from '@radix-ui/themes';\nimport { Typo } from '@/atoms/typo';\nimport {\n DynamicFormProvider,\n useDynamicForm,\n} from '@/context/dynamic-form-context';\nimport type {\n DynamicFormFieldSchema,\n ValidationRule,\n} from '@/types/dynamic-form-schema-generated';\nimport { Form } from './form/form';\nimport { DynamicFormField } from './dynamic-field';\n\nexport interface DynamicFormProps {\n fields: DynamicFormFieldSchema[];\n initialValues?: Record<string, unknown>;\n onSubmit: (values: Record<string, unknown>) => void | Promise<void>;\n children: React.ReactNode;\n readonly?: boolean;\n formStyle?: React.CSSProperties;\n}\n\n/**\n * 첫 번째 에러 필드로 스크롤하는 함수\n */\nfunction scrollToFirstError(\n errors: Record<string, unknown>,\n _fields: DynamicFormFieldSchema[]\n): void {\n const firstErrorFieldName = Object.keys(errors)[0];\n if (!firstErrorFieldName) return;\n\n // 해당 필드의 DOM 요소를 찾기 (여러 선택자 시도)\n let fieldElement = document.querySelector(`[name=\"${firstErrorFieldName}\"]`);\n\n // input 요소를 찾지 못한 경우, 해당 필드의 컨테이너를 찾기\n if (!fieldElement) {\n fieldElement = document.querySelector(\n `[data-field-name=\"${firstErrorFieldName}\"]`\n );\n }\n\n // 여전히 찾지 못한 경우, FormItem의 에러 메시지 영역을 찾기\n if (!fieldElement) {\n fieldElement = document.querySelector(\n `[data-error-field=\"${firstErrorFieldName}\"]`\n );\n }\n\n if (fieldElement) {\n fieldElement.scrollIntoView({\n behavior: 'smooth',\n block: 'nearest',\n });\n }\n}\n\nfunction DynamicFormRoot({\n fields,\n initialValues = {},\n onSubmit,\n children,\n readonly = false,\n formStyle,\n}: DynamicFormProps): React.ReactElement {\n const validationSchema = useMemo(() => {\n const schema: Record<string, Yup.Schema<unknown>> = {};\n fields.forEach((field) => {\n if (field.validation) {\n const validation = createYupValidation(field, field.validation);\n if (validation) {\n schema[field.name] = validation;\n }\n } else if (field.required) {\n // choices 타입은 배열 스키마로 처리\n if (field.type === 'choices') {\n schema[field.name] = Yup.array()\n .min(1, `${field.label}을(를) 하나 이상 선택해주세요`)\n .required(`${field.label}은(는) 필수입니다`);\n } else if (field.type === 'yes_no') {\n // yes_no 타입은 boolean 스키마로 처리\n schema[field.name] = Yup.boolean().oneOf(\n [true],\n `${field.label}에 동의해주세요`\n );\n } else {\n // choice, dropdown, short_text, long_text, number, email 타입은 문자열 스키마로 처리\n schema[field.name] = Yup.string().required(\n `${field.label}은(는) 필수입니다`\n );\n }\n }\n });\n return Object.keys(schema).length > 0 ? Yup.object(schema) : undefined;\n }, [fields]);\n\n const handleSubmit = useCallback(\n async (values: Record<string, unknown>) => {\n await onSubmit(values);\n },\n [onSubmit]\n );\n\n const formik: FormikProps<Record<string, unknown>> = useFormik({\n initialValues: fields.reduce<Record<string, unknown>>((acc, field) => {\n if (field.type === 'choices') {\n acc[field.name] = initialValues[field.name] || [];\n } else if (field.type === 'yes_no') {\n acc[field.name] = initialValues[field.name] || false;\n } else {\n acc[field.name] = initialValues[field.name] || '';\n }\n return acc;\n }, {}),\n validationSchema,\n validateOnBlur: true,\n validateOnChange: true,\n onSubmit: handleSubmit,\n });\n\n // submit 시 validation 에러가 있으면 첫 번째 에러 필드로 스크롤\n useEffect(() => {\n if (formik.submitCount > 0 && Object.keys(formik.errors).length > 0) {\n // 약간의 지연을 두어 DOM 업데이트 후 스크롤 실행\n const timeoutId = setTimeout(() => {\n scrollToFirstError(formik.errors, fields);\n }, 100);\n\n return () => {\n clearTimeout(timeoutId);\n };\n }\n }, [formik.submitCount, formik.errors, fields]);\n\n return (\n <DynamicFormProvider\n fields={fields}\n formStyle={formStyle}\n formik={formik}\n readonly={readonly}\n >\n {children}\n </DynamicFormProvider>\n );\n}\n\ninterface DynamicFormFieldListProps {\n fields?: DynamicFormFieldSchema[];\n labelVariant?: 'title' | 'body' | 'caption';\n}\nfunction DynamicFormFieldList({\n fields: fieldsProp,\n labelVariant,\n}: DynamicFormFieldListProps): React.ReactElement {\n const { formik, fields: fieldsFromContext, readonly } = useDynamicForm();\n const fields = fieldsProp || fieldsFromContext;\n\n return (\n <>\n {fields.map((field) => {\n const errorMessage =\n !readonly && formik.touched[field.name] && formik.errors[field.name]\n ? String(formik.errors[field.name])\n : undefined;\n\n return (\n <Box\n data-error-field={errorMessage ? field.name : undefined}\n data-field-name={field.name}\n key={field.name}\n mb=\"2\"\n >\n <Form.FormItem\n errorMessage={errorMessage}\n label={field.label}\n labelVariant={labelVariant}\n name={field.name}\n required={field.required}\n \n >\n {field.description && field.type !== 'yes_no' ? (\n <Typo variant=\"caption\">{field.description}</Typo>\n ) : null}\n <DynamicFormField field={field} />\n </Form.FormItem>\n </Box>\n );\n })}\n </>\n );\n}\n\nexport const DynamicForm = {\n Root: DynamicFormRoot,\n FieldList: DynamicFormFieldList,\n};\n\nexport function createYupValidation(\n field: DynamicFormFieldSchema,\n validation?: ValidationRule\n): Yup.Schema<unknown> | undefined {\n if (!validation) return undefined;\n\n let schema: Yup.Schema<unknown>;\n\n // field.type을 기준으로 기본 스키마 생성\n if (field.type === 'number') {\n schema = Yup.number();\n } else if (field.type === 'email') {\n schema = Yup.string().email(\n validation.message || '올바른 이메일 형식이 아닙니다'\n );\n } else if (field.type === 'choices') {\n schema = Yup.array();\n } else if (field.type === 'yes_no') {\n schema = Yup.boolean();\n } else {\n // choice, dropdown, short_text, long_text 타입은 문자열 스키마로 처리\n schema = Yup.string();\n }\n\n if (validation.min !== undefined) {\n if (field.type === 'number') {\n schema = (schema as Yup.NumberSchema).min(\n validation.min,\n validation.message || `최소 ${validation.min}이어야 합니다`\n );\n } else if (field.type === 'choices') {\n schema = (schema as ReturnType<typeof Yup.array>).min(\n validation.min,\n validation.message || `최소 ${validation.min}개 이상 선택해주세요`\n );\n } else if (field.type === 'yes_no') {\n // yes_no 타입은 boolean이므로 min/max 검증 불가\n // 대신 required 검증만 적용\n } else {\n schema = (schema as Yup.StringSchema).min(\n validation.min,\n validation.message || `최소 ${validation.min}자 이상이어야 합니다`\n );\n }\n }\n\n if (validation.max !== undefined) {\n if (field.type === 'number') {\n schema = (schema as Yup.NumberSchema).max(\n validation.max,\n validation.message || `최대 ${validation.max}이어야 합니다`\n );\n } else if (field.type === 'choices') {\n schema = (schema as ReturnType<typeof Yup.array>).max(\n validation.max,\n validation.message || `최대 ${validation.max}개까지 선택 가능합니다`\n );\n } else if (field.type === 'yes_no') {\n // yes_no 타입은 boolean이므로 min/max 검증 불가\n // 대신 required 검증만 적용\n } else {\n schema = (schema as Yup.StringSchema).max(\n validation.max,\n validation.message || `최대 ${validation.max}자 이하여야 합니다`\n );\n }\n }\n\n if (validation.pattern) {\n if (field.type === 'yes_no') {\n // yes_no 타입은 boolean이므로 pattern 검증 불가\n // 대신 required 검증만 적용\n } else {\n schema = (schema as Yup.StringSchema).matches(\n new RegExp(validation.pattern),\n validation.message || '올바른 형식이 아닙니다'\n );\n }\n }\n\n // field.required가 true인 경우 required 검증 추가\n if (field.required) {\n if (field.type === 'yes_no') {\n schema = (schema as Yup.BooleanSchema).oneOf(\n [true],\n validation.message || `${field.label}에 동의해주세요`\n );\n } else if (field.type === 'choices') {\n schema = (schema as ReturnType<typeof Yup.array>).min(\n 1,\n validation.message || `${field.label}을(를) 하나 이상 선택해주세요`\n );\n } else {\n schema = (schema as Yup.StringSchema).required(\n validation.message || `${field.label}은(는) 필수입니다`\n );\n }\n }\n\n return schema;\n}\n"],"mappings":"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","names":[]}
@@ -0,0 +1,68 @@
1
+ import {
2
+ Heading
3
+ } from "./chunk-BESTU2AY.js";
4
+ import {
5
+ Card
6
+ } from "./chunk-RP2RGCAW.js";
7
+ import {
8
+ Box
9
+ } from "./chunk-4Y5BEXVN.js";
10
+ import {
11
+ Typo
12
+ } from "./chunk-PMJIFLDT.js";
13
+ import {
14
+ Flex
15
+ } from "./chunk-25HMMI7R.js";
16
+ import {
17
+ Button
18
+ } from "./chunk-ZVDAEY5Q.js";
19
+ import {
20
+ DownloadIcon
21
+ } from "./chunk-LTEJYJUM.js";
22
+
23
+ // src/app/platform/report-card.tsx
24
+ import { useCallback } from "react";
25
+ import { jsx, jsxs } from "react/jsx-runtime";
26
+ function ReportCard(props) {
27
+ const { title, file, status, subtitle } = props;
28
+ const onClickDownload = useCallback(() => {
29
+ if (!file) return;
30
+ const { url, fileName } = file;
31
+ const link = document.createElement("a");
32
+ link.href = url;
33
+ link.download = fileName;
34
+ link.target = "_blank";
35
+ document.body.appendChild(link);
36
+ link.click();
37
+ document.body.removeChild(link);
38
+ }, [file]);
39
+ if (status) {
40
+ return /* @__PURE__ */ jsx(Card, { children: /* @__PURE__ */ jsxs(Flex, { align: "center", justify: "between", children: [
41
+ /* @__PURE__ */ jsx(Heading, { variant: "heading4", children: title }),
42
+ status
43
+ ] }) });
44
+ }
45
+ return /* @__PURE__ */ jsx(Card, { children: /* @__PURE__ */ jsxs(
46
+ Flex,
47
+ {
48
+ direction: { initial: "column", xs: "row" },
49
+ gapY: "2",
50
+ justify: "between",
51
+ children: [
52
+ /* @__PURE__ */ jsxs(Box, { children: [
53
+ /* @__PURE__ */ jsx(Heading, { variant: "heading4", children: title }),
54
+ subtitle ? /* @__PURE__ */ jsx(Typo, { color: "gray", children: subtitle }) : null
55
+ ] }),
56
+ /* @__PURE__ */ jsx(Button, { onClick: onClickDownload, variant: "surface", children: /* @__PURE__ */ jsxs(Flex, { gap: "2", width: "100%", children: [
57
+ /* @__PURE__ */ jsx(DownloadIcon, {}),
58
+ file == null ? void 0 : file.buttonName
59
+ ] }) }, file == null ? void 0 : file.url)
60
+ ]
61
+ }
62
+ ) });
63
+ }
64
+
65
+ export {
66
+ ReportCard
67
+ };
68
+ //# sourceMappingURL=chunk-X47BEKKF.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/app/platform/report-card.tsx"],"sourcesContent":["import React, { useCallback } from 'react';\nimport { Box, Button, Card, Flex, Heading, Typo } from '@/atoms';\nimport type { Attachment } from '@/molecules';\nimport { DownloadIcon } from '@/icon';\n\ntype File = Attachment & { buttonName: string };\nexport interface ReportCardProps {\n title?: string;\n file?: File;\n status?: React.ReactNode;\n subtitle?: string;\n}\n\nexport function ReportCard(props: ReportCardProps): React.ReactNode {\n const { title, file, status, subtitle } = props;\n\n const onClickDownload = useCallback(() => {\n if (!file) return;\n const { url, fileName } = file;\n const link = document.createElement('a');\n link.href = url;\n link.download = fileName;\n link.target = '_blank';\n\n document.body.appendChild(link);\n link.click();\n document.body.removeChild(link);\n }, [file]);\n\n if (status) {\n return (\n <Card>\n <Flex align=\"center\" justify=\"between\">\n <Heading variant=\"heading4\">{title}</Heading>\n {status}\n </Flex>\n </Card>\n );\n }\n\n return (\n <Card>\n <Flex\n direction={{ initial: 'column', xs: 'row' }}\n gapY=\"2\"\n justify=\"between\"\n >\n <Box>\n <Heading variant=\"heading4\">{title}</Heading>\n {subtitle ? <Typo color=\"gray\">{subtitle}</Typo> : null}\n </Box>\n <Button key={file?.url} onClick={onClickDownload} variant=\"surface\">\n <Flex gap=\"2\" width=\"100%\">\n <DownloadIcon />\n {file?.buttonName}\n </Flex>\n </Button>\n </Flex>\n </Card>\n );\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;AAAA,SAAgB,mBAAmB;AAgC3B,SACE,KADF;AAnBD,SAAS,WAAW,OAAyC;AAClE,QAAM,EAAE,OAAO,MAAM,QAAQ,SAAS,IAAI;AAE1C,QAAM,kBAAkB,YAAY,MAAM;AACxC,QAAI,CAAC,KAAM;AACX,UAAM,EAAE,KAAK,SAAS,IAAI;AAC1B,UAAM,OAAO,SAAS,cAAc,GAAG;AACvC,SAAK,OAAO;AACZ,SAAK,WAAW;AAChB,SAAK,SAAS;AAEd,aAAS,KAAK,YAAY,IAAI;AAC9B,SAAK,MAAM;AACX,aAAS,KAAK,YAAY,IAAI;AAAA,EAChC,GAAG,CAAC,IAAI,CAAC;AAET,MAAI,QAAQ;AACV,WACE,oBAAC,QACC,+BAAC,QAAK,OAAM,UAAS,SAAQ,WAC3B;AAAA,0BAAC,WAAQ,SAAQ,YAAY,iBAAM;AAAA,MAClC;AAAA,OACH,GACF;AAAA,EAEJ;AAEA,SACE,oBAAC,QACC;AAAA,IAAC;AAAA;AAAA,MACC,WAAW,EAAE,SAAS,UAAU,IAAI,MAAM;AAAA,MAC1C,MAAK;AAAA,MACL,SAAQ;AAAA,MAER;AAAA,6BAAC,OACC;AAAA,8BAAC,WAAQ,SAAQ,YAAY,iBAAM;AAAA,UAClC,WAAW,oBAAC,QAAK,OAAM,QAAQ,oBAAS,IAAU;AAAA,WACrD;AAAA,QACA,oBAAC,UAAuB,SAAS,iBAAiB,SAAQ,WACxD,+BAAC,QAAK,KAAI,KAAI,OAAM,QAClB;AAAA,8BAAC,gBAAa;AAAA,UACb,6BAAM;AAAA,WACT,KAJW,6BAAM,GAKnB;AAAA;AAAA;AAAA,EACF,GACF;AAEJ;","names":[]}
@@ -0,0 +1,75 @@
1
+ import {
2
+ DatePicker
3
+ } from "./chunk-KUKHQCFS.js";
4
+ import {
5
+ TextField
6
+ } from "./chunk-6NPTJBFE.js";
7
+ import {
8
+ Box
9
+ } from "./chunk-4Y5BEXVN.js";
10
+ import {
11
+ Button
12
+ } from "./chunk-ZVDAEY5Q.js";
13
+ import {
14
+ CalendarIcon
15
+ } from "./chunk-LTEJYJUM.js";
16
+ import {
17
+ __objRest,
18
+ __spreadProps,
19
+ __spreadValues
20
+ } from "./chunk-CRTRMMJ7.js";
21
+
22
+ // src/molecules/date-picker/date-picker-button.tsx
23
+ import { useMemo } from "react";
24
+ import { format } from "date-fns";
25
+ import { clsx } from "clsx";
26
+ import { jsx, jsxs } from "react/jsx-runtime";
27
+ function DatePickerButton(props) {
28
+ const _a = props, { size, format: formatProps, disabled } = _a, rest = __objRest(_a, ["size", "format", "disabled"]);
29
+ const placeholder = rest.placeholder || "\uB0A0\uC9DC\uB97C \uC120\uD0DD\uD574\uC8FC\uC138\uC694";
30
+ const buttonProps = useMemo(() => {
31
+ const variant = "outline";
32
+ const color = "gray";
33
+ return { size, color, variant, disabled };
34
+ }, [disabled, size]);
35
+ const selectFormat = useMemo(() => {
36
+ if (formatProps) return formatProps;
37
+ return (date) => {
38
+ return date ? format(date, "yyyy\uB144 MM\uC6D4 dd\uC77C") : "";
39
+ };
40
+ }, [formatProps]);
41
+ const className = useMemo(() => {
42
+ return clsx(
43
+ "date-picker-button",
44
+ (disabled || props.readOnly) && "disabled"
45
+ );
46
+ }, [disabled, props.readOnly]);
47
+ const placeholderVisible = useMemo(() => {
48
+ return rest.selected ? "" : "placeholder-visible";
49
+ }, [rest.selected]);
50
+ return /* @__PURE__ */ jsx(Box, { p: "0", width: "100%", children: /* @__PURE__ */ jsx(
51
+ DatePicker,
52
+ __spreadProps(__spreadValues({
53
+ customInput: /* @__PURE__ */ jsx(Button, __spreadProps(__spreadValues({ asChild: true, className, type: "button" }, buttonProps), { children: /* @__PURE__ */ jsxs(
54
+ TextField.Root,
55
+ {
56
+ className: placeholderVisible,
57
+ placeholder: placeholder || "",
58
+ value: rest.selected ? selectFormat(rest.selected) : placeholder,
59
+ children: [
60
+ /* @__PURE__ */ jsx(TextField.Slot, { className: "hide-slot" }),
61
+ /* @__PURE__ */ jsx(TextField.Slot, { children: /* @__PURE__ */ jsx(CalendarIcon, {}) })
62
+ ]
63
+ }
64
+ ) })),
65
+ wrapperClassName: "full-width"
66
+ }, rest), {
67
+ disabled
68
+ })
69
+ ) });
70
+ }
71
+
72
+ export {
73
+ DatePickerButton
74
+ };
75
+ //# sourceMappingURL=chunk-XYDK5OWF.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/molecules/date-picker/date-picker-button.tsx"],"sourcesContent":["import React, { useMemo } from 'react';\nimport { format } from 'date-fns';\nimport { clsx } from 'clsx';\nimport type { ButtonProps } from '@/atoms/button.type';\nimport { Button } from '@/atoms/button';\nimport { TextField } from '@/atoms/text-field';\nimport { Box } from '@/atoms/box';\nimport { CalendarIcon } from '../../icon';\nimport type { DatePickerProps } from '.';\nimport { DatePicker } from '.';\n\nexport type DatePickerButtonProps = DatePickerProps & {\n placeholder?: string;\n format?: (date: Date) => string;\n size?: ButtonProps['size'];\n};\n\nexport function DatePickerButton(\n props: DatePickerButtonProps\n): React.ReactNode {\n const { size, format: formatProps, disabled, ...rest } = props;\n const placeholder = rest.placeholder || '날짜를 선택해주세요';\n\n const buttonProps = useMemo(() => {\n const variant: ButtonProps['variant'] = 'outline';\n const color: ButtonProps['color'] = 'gray';\n return { size, color, variant, disabled };\n }, [disabled, size]);\n\n const selectFormat = useMemo(() => {\n if (formatProps) return formatProps;\n return (date?: Date) => {\n return date ? format(date, 'yyyy년 MM월 dd일') : '';\n };\n }, [formatProps]);\n\n const className = useMemo(() => {\n return clsx(\n 'date-picker-button',\n (disabled || props.readOnly) && 'disabled'\n );\n }, [disabled, props.readOnly]);\n\n const placeholderVisible = useMemo(() => {\n return rest.selected ? '' : 'placeholder-visible';\n }, [rest.selected]);\n\n return (\n <Box p=\"0\" width=\"100%\">\n <DatePicker\n customInput={\n <Button asChild className={className} type=\"button\" {...buttonProps}>\n <TextField.Root\n className={placeholderVisible}\n placeholder={placeholder || ''}\n value={rest.selected ? selectFormat(rest.selected) : placeholder}\n >\n <TextField.Slot className=\"hide-slot\" />\n <TextField.Slot>\n <CalendarIcon />\n </TextField.Slot>\n </TextField.Root>\n </Button>\n }\n wrapperClassName=\"full-width\"\n {...rest}\n disabled={disabled}\n />\n </Box>\n );\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;AAAA,SAAgB,eAAe;AAC/B,SAAS,cAAc;AACvB,SAAS,YAAY;AAkDT,SAKE,KALF;AAnCL,SAAS,iBACd,OACiB;AACjB,QAAyD,YAAjD,QAAM,QAAQ,aAAa,SApBrC,IAoB2D,IAAT,iBAAS,IAAT,CAAxC,QAAM,UAAqB;AACnC,QAAM,cAAc,KAAK,eAAe;AAExC,QAAM,cAAc,QAAQ,MAAM;AAChC,UAAM,UAAkC;AACxC,UAAM,QAA8B;AACpC,WAAO,EAAE,MAAM,OAAO,SAAS,SAAS;AAAA,EAC1C,GAAG,CAAC,UAAU,IAAI,CAAC;AAEnB,QAAM,eAAe,QAAQ,MAAM;AACjC,QAAI,YAAa,QAAO;AACxB,WAAO,CAAC,SAAgB;AACtB,aAAO,OAAO,OAAO,MAAM,8BAAe,IAAI;AAAA,IAChD;AAAA,EACF,GAAG,CAAC,WAAW,CAAC;AAEhB,QAAM,YAAY,QAAQ,MAAM;AAC9B,WAAO;AAAA,MACL;AAAA,OACC,YAAY,MAAM,aAAa;AAAA,IAClC;AAAA,EACF,GAAG,CAAC,UAAU,MAAM,QAAQ,CAAC;AAE7B,QAAM,qBAAqB,QAAQ,MAAM;AACvC,WAAO,KAAK,WAAW,KAAK;AAAA,EAC9B,GAAG,CAAC,KAAK,QAAQ,CAAC;AAElB,SACE,oBAAC,OAAI,GAAE,KAAI,OAAM,QACf;AAAA,IAAC;AAAA;AAAA,MACC,aACE,oBAAC,uCAAO,SAAO,MAAC,WAAsB,MAAK,YAAa,cAAvD,EACC;AAAA,QAAC,UAAU;AAAA,QAAV;AAAA,UACC,WAAW;AAAA,UACX,aAAa,eAAe;AAAA,UAC5B,OAAO,KAAK,WAAW,aAAa,KAAK,QAAQ,IAAI;AAAA,UAErD;AAAA,gCAAC,UAAU,MAAV,EAAe,WAAU,aAAY;AAAA,YACtC,oBAAC,UAAU,MAAV,EACC,8BAAC,gBAAa,GAChB;AAAA;AAAA;AAAA,MACF,IACF;AAAA,MAEF,kBAAiB;AAAA,OACb,OAhBL;AAAA,MAiBC;AAAA;AAAA,EACF,GACF;AAEJ;","names":[]}