@tipp/ui 2.3.14 → 2.3.16

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 (271) hide show
  1. package/dist/app/index.cjs +182 -159
  2. package/dist/app/index.cjs.map +1 -1
  3. package/dist/app/index.js +100 -98
  4. package/dist/app/platform/coach-question-list.js +31 -31
  5. package/dist/app/platform/contents-card.js +31 -31
  6. package/dist/app/platform/curriculum-card.js +5 -5
  7. package/dist/app/platform/edit-coaching-time.cjs +39 -16
  8. package/dist/app/platform/edit-coaching-time.cjs.map +1 -1
  9. package/dist/app/platform/edit-coaching-time.js +76 -74
  10. package/dist/app/platform/edit-service-type.cjs +41 -16
  11. package/dist/app/platform/edit-service-type.cjs.map +1 -1
  12. package/dist/app/platform/edit-service-type.js +77 -75
  13. package/dist/app/platform/goal-manage-card-edit.cjs +47 -22
  14. package/dist/app/platform/goal-manage-card-edit.cjs.map +1 -1
  15. package/dist/app/platform/goal-manage-card-edit.js +76 -74
  16. package/dist/app/platform/goal-manage-card-read.js +31 -31
  17. package/dist/app/platform/on-offline-radio-card.cjs +45 -22
  18. package/dist/app/platform/on-offline-radio-card.cjs.map +1 -1
  19. package/dist/app/platform/on-offline-radio-card.js +76 -74
  20. package/dist/app/platform/report-card.js +31 -31
  21. package/dist/app/platform/reservation-card.cjs +58 -33
  22. package/dist/app/platform/reservation-card.cjs.map +1 -1
  23. package/dist/app/platform/reservation-card.js +77 -75
  24. package/dist/app/platform/session-card.cjs +78 -55
  25. package/dist/app/platform/session-card.cjs.map +1 -1
  26. package/dist/app/platform/session-card.js +79 -77
  27. package/dist/app/platform/session-review-simple-read.js +31 -31
  28. package/dist/app/platform/userInfos/coaching-customer-info/index.js +36 -36
  29. package/dist/app/platform/userInfos/coaching-customer-info/large.js +31 -31
  30. package/dist/app/platform/userInfos/coaching-customer-info/medium.js +31 -31
  31. package/dist/app/platform/userInfos/coaching-customer-info/small.js +31 -31
  32. package/dist/app/platform/userInfos/session-user-info-detail.js +31 -31
  33. package/dist/app/platform/userInfos/utils.js +30 -30
  34. package/dist/atoms/bullet-text.js +2 -2
  35. package/dist/atoms/dialog.js +2 -2
  36. package/dist/atoms/field-error-wrapper.js +2 -2
  37. package/dist/atoms/index.js +62 -62
  38. package/dist/atoms/list.js +2 -2
  39. package/dist/atoms/pagination.js +3 -3
  40. package/dist/chunk-2GTKMGHS.js +70 -0
  41. package/dist/chunk-2GTKMGHS.js.map +1 -0
  42. package/dist/chunk-2GWB6C4M.js +63 -0
  43. package/dist/chunk-2GWB6C4M.js.map +1 -0
  44. package/dist/chunk-2OVAPUSZ.js +218 -0
  45. package/dist/chunk-2OVAPUSZ.js.map +1 -0
  46. package/dist/chunk-33FHBMD2.js +89 -0
  47. package/dist/chunk-33FHBMD2.js.map +1 -0
  48. package/dist/chunk-3IDHQODC.js +99 -0
  49. package/dist/chunk-3IDHQODC.js.map +1 -0
  50. package/dist/chunk-3INEXJIV.js +37 -0
  51. package/dist/chunk-3INEXJIV.js.map +1 -0
  52. package/dist/chunk-3UOA73MU.js +196 -0
  53. package/dist/chunk-3UOA73MU.js.map +1 -0
  54. package/dist/chunk-4F2XOUIR.js +51 -0
  55. package/dist/chunk-4F2XOUIR.js.map +1 -0
  56. package/dist/chunk-4GDCXSDS.js +87 -0
  57. package/dist/chunk-4GDCXSDS.js.map +1 -0
  58. package/dist/chunk-52IAQ2FT.js +233 -0
  59. package/dist/chunk-52IAQ2FT.js.map +1 -0
  60. package/dist/chunk-54POQFUI.js +98 -0
  61. package/dist/chunk-54POQFUI.js.map +1 -0
  62. package/dist/chunk-5FBWB2W4.js +57 -0
  63. package/dist/chunk-5FBWB2W4.js.map +1 -0
  64. package/dist/chunk-5VPNBYFV.js +89 -0
  65. package/dist/chunk-5VPNBYFV.js.map +1 -0
  66. package/dist/chunk-6DAL2GRI.js +196 -0
  67. package/dist/chunk-6DAL2GRI.js.map +1 -0
  68. package/dist/chunk-6INLPCD5.js +30 -0
  69. package/dist/chunk-6INLPCD5.js.map +1 -0
  70. package/dist/chunk-6LJJRIWT.js +49 -0
  71. package/dist/chunk-6LJJRIWT.js.map +1 -0
  72. package/dist/chunk-6WT3VRAP.js +144 -0
  73. package/dist/chunk-6WT3VRAP.js.map +1 -0
  74. package/dist/chunk-7MB2G5XF.js +145 -0
  75. package/dist/chunk-7MB2G5XF.js.map +1 -0
  76. package/dist/chunk-7XUN3OQT.js +1 -0
  77. package/dist/chunk-7XUN3OQT.js.map +1 -0
  78. package/dist/chunk-A2DBM6WR.js +51 -0
  79. package/dist/chunk-A2DBM6WR.js.map +1 -0
  80. package/dist/chunk-AB5USZGJ.js +101 -0
  81. package/dist/chunk-AB5USZGJ.js.map +1 -0
  82. package/dist/chunk-AJWRR5KG.js +74 -0
  83. package/dist/chunk-AJWRR5KG.js.map +1 -0
  84. package/dist/chunk-ALFE4BOS.js +139 -0
  85. package/dist/chunk-ALFE4BOS.js.map +1 -0
  86. package/dist/chunk-AULDM6SL.js +89 -0
  87. package/dist/chunk-AULDM6SL.js.map +1 -0
  88. package/dist/chunk-BJLJNTF2.js +218 -0
  89. package/dist/chunk-BJLJNTF2.js.map +1 -0
  90. package/dist/chunk-CMFHPI3J.js +51 -0
  91. package/dist/chunk-CMFHPI3J.js.map +1 -0
  92. package/dist/chunk-DAZY7DRP.js +145 -0
  93. package/dist/chunk-DAZY7DRP.js.map +1 -0
  94. package/dist/chunk-DXD774YC.js +145 -0
  95. package/dist/chunk-DXD774YC.js.map +1 -0
  96. package/dist/chunk-EAMKUF7R.js +75 -0
  97. package/dist/chunk-EAMKUF7R.js.map +1 -0
  98. package/dist/chunk-EMNEV6EN.js +139 -0
  99. package/dist/chunk-EMNEV6EN.js.map +1 -0
  100. package/dist/chunk-ETKTERDA.js +51 -0
  101. package/dist/chunk-ETKTERDA.js.map +1 -0
  102. package/dist/chunk-FFAGYBAB.js +64 -0
  103. package/dist/chunk-FFAGYBAB.js.map +1 -0
  104. package/dist/chunk-FVNVGFTT.js +218 -0
  105. package/dist/chunk-FVNVGFTT.js.map +1 -0
  106. package/dist/chunk-FXQYWO4P.js +57 -0
  107. package/dist/chunk-FXQYWO4P.js.map +1 -0
  108. package/dist/chunk-G4DOK5DQ.js +64 -0
  109. package/dist/chunk-G4DOK5DQ.js.map +1 -0
  110. package/dist/chunk-G6ZTIOUH.js +54 -0
  111. package/dist/chunk-G6ZTIOUH.js.map +1 -0
  112. package/dist/chunk-GN7UAKYU.js +145 -0
  113. package/dist/chunk-GN7UAKYU.js.map +1 -0
  114. package/dist/chunk-GTB6HEJR.js +218 -0
  115. package/dist/chunk-GTB6HEJR.js.map +1 -0
  116. package/dist/chunk-JO5OXSQV.js +363 -0
  117. package/dist/chunk-JO5OXSQV.js.map +1 -0
  118. package/dist/chunk-JOUSZBPX.js +196 -0
  119. package/dist/chunk-JOUSZBPX.js.map +1 -0
  120. package/dist/chunk-JOXWMJKW.js +64 -0
  121. package/dist/chunk-JOXWMJKW.js.map +1 -0
  122. package/dist/chunk-JQU3CE4K.js +174 -0
  123. package/dist/chunk-JQU3CE4K.js.map +1 -0
  124. package/dist/chunk-K7NSOSIE.js +1 -0
  125. package/dist/chunk-K7NSOSIE.js.map +1 -0
  126. package/dist/chunk-KD3SPRXH.js +37 -0
  127. package/dist/chunk-KD3SPRXH.js.map +1 -0
  128. package/dist/chunk-KEKNMQJK.js +69 -0
  129. package/dist/chunk-KEKNMQJK.js.map +1 -0
  130. package/dist/chunk-KGPXD5VO.js +228 -0
  131. package/dist/chunk-KGPXD5VO.js.map +1 -0
  132. package/dist/chunk-KMNAZCXO.js +117 -0
  133. package/dist/chunk-KMNAZCXO.js.map +1 -0
  134. package/dist/chunk-KPE4JB42.js +218 -0
  135. package/dist/chunk-KPE4JB42.js.map +1 -0
  136. package/dist/chunk-MFAW7E6L.js +69 -0
  137. package/dist/chunk-MFAW7E6L.js.map +1 -0
  138. package/dist/chunk-MLOC57ZN.js +64 -0
  139. package/dist/chunk-MLOC57ZN.js.map +1 -0
  140. package/dist/chunk-MRW2RO32.js +163 -0
  141. package/dist/chunk-MRW2RO32.js.map +1 -0
  142. package/dist/chunk-MYELL2V2.js +63 -0
  143. package/dist/chunk-MYELL2V2.js.map +1 -0
  144. package/dist/chunk-N7WM36NN.js +64 -0
  145. package/dist/chunk-N7WM36NN.js.map +1 -0
  146. package/dist/chunk-NMOPWSEY.js +145 -0
  147. package/dist/chunk-NMOPWSEY.js.map +1 -0
  148. package/dist/chunk-NWCLGWD7.js +218 -0
  149. package/dist/chunk-NWCLGWD7.js.map +1 -0
  150. package/dist/chunk-ONUWABWT.js +169 -0
  151. package/dist/chunk-ONUWABWT.js.map +1 -0
  152. package/dist/chunk-PTCXWBAB.js +218 -0
  153. package/dist/chunk-PTCXWBAB.js.map +1 -0
  154. package/dist/chunk-PXSZVAKR.js +68 -0
  155. package/dist/chunk-PXSZVAKR.js.map +1 -0
  156. package/dist/chunk-PZXLZLQH.js +64 -0
  157. package/dist/chunk-PZXLZLQH.js.map +1 -0
  158. package/dist/chunk-QOA6EEKP.js +89 -0
  159. package/dist/chunk-QOA6EEKP.js.map +1 -0
  160. package/dist/chunk-R3VOZZ5O.js +63 -0
  161. package/dist/chunk-R3VOZZ5O.js.map +1 -0
  162. package/dist/chunk-S3ITGMDG.js +218 -0
  163. package/dist/chunk-S3ITGMDG.js.map +1 -0
  164. package/dist/chunk-SFYV52JB.js +151 -0
  165. package/dist/chunk-SFYV52JB.js.map +1 -0
  166. package/dist/chunk-SLV7LKTR.js +51 -0
  167. package/dist/chunk-SLV7LKTR.js.map +1 -0
  168. package/dist/chunk-TJQUUR4N.js +54 -0
  169. package/dist/chunk-TJQUUR4N.js.map +1 -0
  170. package/dist/chunk-TTVJOFG5.js +30 -0
  171. package/dist/chunk-TTVJOFG5.js.map +1 -0
  172. package/dist/chunk-TYQOHHL5.js +63 -0
  173. package/dist/chunk-TYQOHHL5.js.map +1 -0
  174. package/dist/chunk-VRY3HFX6.js +45 -0
  175. package/dist/chunk-VRY3HFX6.js.map +1 -0
  176. package/dist/chunk-WU6EJCDT.js +196 -0
  177. package/dist/chunk-WU6EJCDT.js.map +1 -0
  178. package/dist/chunk-X6YSDRES.js +165 -0
  179. package/dist/chunk-X6YSDRES.js.map +1 -0
  180. package/dist/chunk-XU2LW3CT.js +43 -0
  181. package/dist/chunk-XU2LW3CT.js.map +1 -0
  182. package/dist/chunk-XUTNPV7E.js +218 -0
  183. package/dist/chunk-XUTNPV7E.js.map +1 -0
  184. package/dist/chunk-YWEWWXKM.js +51 -0
  185. package/dist/chunk-YWEWWXKM.js.map +1 -0
  186. package/dist/chunk-YYWEFK4H.js +39 -0
  187. package/dist/chunk-YYWEFK4H.js.map +1 -0
  188. package/dist/chunk-Z5JV7JGZ.js +58 -0
  189. package/dist/chunk-Z5JV7JGZ.js.map +1 -0
  190. package/dist/chunk-ZMXFJ3AZ.js +196 -0
  191. package/dist/chunk-ZMXFJ3AZ.js.map +1 -0
  192. package/dist/chunk-ZP5VSS77.js +89 -0
  193. package/dist/chunk-ZP5VSS77.js.map +1 -0
  194. package/dist/context/index.js +5 -5
  195. package/dist/index.cjs +310 -248
  196. package/dist/index.cjs.map +1 -1
  197. package/dist/index.d.cts +2 -0
  198. package/dist/index.d.ts +2 -0
  199. package/dist/index.js +155 -145
  200. package/dist/molecules/curriculumV2/CurriculumContents/CurriculumReviewSteps/ReviewQuestion/index.js +18 -18
  201. package/dist/molecules/curriculumV2/CurriculumContents/CurriculumReviewSteps/ReviewQuestion/review-comp.js +4 -4
  202. package/dist/molecules/curriculumV2/CurriculumContents/CurriculumReviewSteps/ReviewQuestion/review-question-body.js +11 -11
  203. package/dist/molecules/curriculumV2/CurriculumContents/CurriculumReviewSteps/ReviewQuestion/review-question-footer.js +2 -2
  204. package/dist/molecules/curriculumV2/CurriculumContents/CurriculumReviewSteps/ReviewQuestion/review-question-header.js +3 -3
  205. package/dist/molecules/curriculumV2/CurriculumContents/CurriculumReviewSteps/ReviewQuestion/review-question-layout.js +2 -2
  206. package/dist/molecules/curriculumV2/CurriculumContents/CurriculumReviewSteps/ReviewQuestion/review-question-radio.js +6 -6
  207. package/dist/molecules/curriculumV2/CurriculumContents/CurriculumReviewSteps/ReviewQuestion/review-question-satisfaction-option.js +5 -5
  208. package/dist/molecules/curriculumV2/CurriculumContents/CurriculumReviewSteps/ReviewQuestion/review-question-satisfaction-text.js +5 -5
  209. package/dist/molecules/curriculumV2/CurriculumContents/CurriculumReviewSteps/ReviewQuestion/review-question-text.js +5 -5
  210. package/dist/molecules/curriculumV2/CurriculumContents/CurriculumReviewSteps/complete-review.js +4 -4
  211. package/dist/molecules/curriculumV2/CurriculumContents/CurriculumReviewSteps/index.js +21 -21
  212. package/dist/molecules/curriculumV2/CurriculumContents/CurriculumReviewSteps/start-review.js +6 -6
  213. package/dist/molecules/curriculumV2/CurriculumContents/curriculum-ai-traning.js +3 -3
  214. package/dist/molecules/curriculumV2/CurriculumContents/curriculum-review.js +23 -23
  215. package/dist/molecules/curriculumV2/CurriculumContents/index.js +26 -26
  216. package/dist/molecules/curriculumV2/CurriculumSidebar/Items/curriculum-item-title.js +2 -2
  217. package/dist/molecules/curriculumV2/CurriculumSidebar/Items/section-item.js +4 -4
  218. package/dist/molecules/curriculumV2/CurriculumSidebar/index.js +8 -8
  219. package/dist/molecules/curriculumV2/CurriculumSidebar/sidebar-item.js +6 -6
  220. package/dist/molecules/curriculumV2/curriculum-sub-nav.js +4 -4
  221. package/dist/molecules/curriculumV2/curriculum-v2-layout.js +2 -2
  222. package/dist/molecules/curriculumV2/index.js +34 -34
  223. package/dist/molecules/date-picker/date-picker-button.js +6 -6
  224. package/dist/molecules/date-picker/index.js +5 -5
  225. package/dist/molecules/description-json-render.cjs +722 -0
  226. package/dist/molecules/description-json-render.cjs.map +1 -0
  227. package/dist/molecules/description-json-render.d.cts +27 -0
  228. package/dist/molecules/description-json-render.d.ts +27 -0
  229. package/dist/molecules/description-json-render.js +30 -0
  230. package/dist/molecules/description-json-render.js.map +1 -0
  231. package/dist/molecules/download-card.js +2 -2
  232. package/dist/molecules/dynamic-field.cjs +71 -68
  233. package/dist/molecules/dynamic-field.cjs.map +1 -1
  234. package/dist/molecules/dynamic-field.js +6 -5
  235. package/dist/molecules/dynamic-form.cjs +32 -29
  236. package/dist/molecules/dynamic-form.cjs.map +1 -1
  237. package/dist/molecules/dynamic-form.js +7 -6
  238. package/dist/molecules/expand-table/index.js +5 -5
  239. package/dist/molecules/force-refresh.js +2 -2
  240. package/dist/molecules/ghost-post.js +4 -4
  241. package/dist/molecules/index.cjs +67 -9
  242. package/dist/molecules/index.cjs.map +1 -1
  243. package/dist/molecules/index.d.cts +1 -0
  244. package/dist/molecules/index.d.ts +1 -0
  245. package/dist/molecules/index.js +76 -71
  246. package/dist/molecules/learning-post.js +6 -6
  247. package/dist/molecules/navigation.js +3 -3
  248. package/dist/molecules/one-on-one-guide-list.js +3 -3
  249. package/dist/molecules/stepper.js +4 -4
  250. package/dist/molecules/tag-selector.js +5 -5
  251. package/dist/molecules/time-select.cjs +519 -5
  252. package/dist/molecules/time-select.cjs.map +1 -1
  253. package/dist/molecules/time-select.js +18 -2
  254. package/dist/utils/getCalloutIconComponent.cjs +580 -0
  255. package/dist/utils/getCalloutIconComponent.cjs.map +1 -0
  256. package/dist/utils/getCalloutIconComponent.d.cts +11 -0
  257. package/dist/utils/getCalloutIconComponent.d.ts +11 -0
  258. package/dist/utils/getCalloutIconComponent.js +25 -0
  259. package/dist/utils/getCalloutIconComponent.js.map +1 -0
  260. package/dist/utils/index.cjs +535 -0
  261. package/dist/utils/index.cjs.map +1 -1
  262. package/dist/utils/index.d.cts +2 -0
  263. package/dist/utils/index.d.ts +2 -0
  264. package/dist/utils/index.js +24 -3
  265. package/package.json +3 -3
  266. package/src/molecules/description-json-render.tsx +85 -0
  267. package/src/molecules/dynamic-field.tsx +11 -9
  268. package/src/molecules/dynamic-form.tsx +1 -1
  269. package/src/molecules/index.ts +2 -1
  270. package/src/utils/getCalloutIconComponent.ts +39 -0
  271. package/src/utils/index.ts +1 -0
@@ -1,17 +1,8 @@
1
1
  import "../chunk-HBF6IIVZ.js";
2
2
  import {
3
- ToastContainer,
4
- toast
5
- } from "../chunk-EEKOTWBE.js";
6
- import {
7
- Skeleton
8
- } from "../chunk-5H3YPCZK.js";
9
- import {
10
- Spinner
11
- } from "../chunk-FR2GDOU2.js";
12
- import {
13
- Strong
14
- } from "../chunk-74DX4CU7.js";
3
+ Form,
4
+ FormItem
5
+ } from "../chunk-2OMSNCRH.js";
15
6
  import {
16
7
  Switch
17
8
  } from "../chunk-OYM4XCHQ.js";
@@ -28,14 +19,9 @@ import {
28
19
  TextField
29
20
  } from "../chunk-6NPTJBFE.js";
30
21
  import {
31
- RadioCards
32
- } from "../chunk-6IVCARWS.js";
33
- import {
34
- RadioGroup
35
- } from "../chunk-6DJOIRMF.js";
36
- import {
37
- Radio
38
- } from "../chunk-FPD73OHW.js";
22
+ ToastContainer,
23
+ toast
24
+ } from "../chunk-EEKOTWBE.js";
39
25
  import {
40
26
  ScrollArea
41
27
  } from "../chunk-MUPK4L3U.js";
@@ -52,21 +38,21 @@ import {
52
38
  Separator
53
39
  } from "../chunk-HYITAA4J.js";
54
40
  import {
55
- Inset
56
- } from "../chunk-XQOL7UBI.js";
41
+ Skeleton
42
+ } from "../chunk-5H3YPCZK.js";
57
43
  import {
58
- Kbd
59
- } from "../chunk-TULWX7D6.js";
44
+ Spinner
45
+ } from "../chunk-FR2GDOU2.js";
60
46
  import {
61
- Link
62
- } from "../chunk-DHZVOXFM.js";
47
+ Strong
48
+ } from "../chunk-74DX4CU7.js";
63
49
  import {
64
50
  List,
65
51
  useList
66
- } from "../chunk-WV2HN6H4.js";
52
+ } from "../chunk-JIJLOKVN.js";
67
53
  import {
68
54
  Pagination
69
- } from "../chunk-SBJOKO35.js";
55
+ } from "../chunk-FG3WT6OL.js";
70
56
  import {
71
57
  Popover
72
58
  } from "../chunk-5AVBYDPB.js";
@@ -77,11 +63,14 @@ import {
77
63
  Quote
78
64
  } from "../chunk-YO3BQW6S.js";
79
65
  import {
80
- Em
81
- } from "../chunk-2DZ2Y3JI.js";
66
+ RadioCards
67
+ } from "../chunk-6IVCARWS.js";
82
68
  import {
83
- FieldErrorWrapper
84
- } from "../chunk-VRJR534I.js";
69
+ RadioGroup
70
+ } from "../chunk-6DJOIRMF.js";
71
+ import {
72
+ Radio
73
+ } from "../chunk-FPD73OHW.js";
85
74
  import {
86
75
  Grid
87
76
  } from "../chunk-EGEQY3KT.js";
@@ -89,20 +78,23 @@ import {
89
78
  HoverCard
90
79
  } from "../chunk-O3T3TM3V.js";
91
80
  import {
92
- Code
93
- } from "../chunk-OHMOP5PV.js";
81
+ Inset
82
+ } from "../chunk-XQOL7UBI.js";
94
83
  import {
95
- Collapse
96
- } from "../chunk-NFDQJVFA.js";
84
+ Kbd
85
+ } from "../chunk-TULWX7D6.js";
97
86
  import {
98
- Container
99
- } from "../chunk-Q37G2GS6.js";
87
+ Link
88
+ } from "../chunk-DHZVOXFM.js";
100
89
  import {
101
90
  DataList
102
91
  } from "../chunk-VTJZMOSP.js";
103
92
  import {
104
93
  Dialog
105
- } from "../chunk-JQ7VQ5SB.js";
94
+ } from "../chunk-AH4A53SZ.js";
95
+ import {
96
+ Heading
97
+ } from "../chunk-BESTU2AY.js";
106
98
  import {
107
99
  Content,
108
100
  Drawer,
@@ -124,17 +116,13 @@ import {
124
116
  import {
125
117
  Tooltip
126
118
  } from "../chunk-3NUQAVE6.js";
119
+ import "../chunk-PT57HCAI.js";
127
120
  import {
128
- BulletText
129
- } from "../chunk-QRI6ARS6.js";
130
- import {
131
- Flex
132
- } from "../chunk-25HMMI7R.js";
121
+ Em
122
+ } from "../chunk-2DZ2Y3JI.js";
133
123
  import {
134
- Button
135
- } from "../chunk-ZVDAEY5Q.js";
136
- import "../chunk-LQY4RKWI.js";
137
- import "../chunk-ZD7MNMED.js";
124
+ FieldErrorWrapper
125
+ } from "../chunk-ZOPYFDLO.js";
138
126
  import {
139
127
  Callout
140
128
  } from "../chunk-B6XJN6EC.js";
@@ -151,11 +139,14 @@ import {
151
139
  Checkbox
152
140
  } from "../chunk-VYCYVN3L.js";
153
141
  import {
154
- AlertDialog
155
- } from "../chunk-J242TTFH.js";
142
+ Code
143
+ } from "../chunk-OHMOP5PV.js";
156
144
  import {
157
- AspectRatio
158
- } from "../chunk-EAXUQEO5.js";
145
+ Collapse
146
+ } from "../chunk-NFDQJVFA.js";
147
+ import {
148
+ Container
149
+ } from "../chunk-Q37G2GS6.js";
159
150
  import {
160
151
  AutoSizingInput
161
152
  } from "../chunk-6SYFG6YY.js";
@@ -171,6 +162,21 @@ import {
171
162
  import {
172
163
  Box
173
164
  } from "../chunk-4Y5BEXVN.js";
165
+ import {
166
+ BulletText
167
+ } from "../chunk-Z34HR7RE.js";
168
+ import {
169
+ Typo
170
+ } from "../chunk-PMJIFLDT.js";
171
+ import "../chunk-LDBWASUA.js";
172
+ import {
173
+ Flex
174
+ } from "../chunk-25HMMI7R.js";
175
+ import {
176
+ Button
177
+ } from "../chunk-ZVDAEY5Q.js";
178
+ import "../chunk-LQY4RKWI.js";
179
+ import "../chunk-ZD7MNMED.js";
174
180
  import "../chunk-W5TPOFOO.js";
175
181
  import "../chunk-WJ34ZHTU.js";
176
182
  import "../chunk-ZQE7SP6P.js";
@@ -186,18 +192,12 @@ import "../chunk-YSYJCYHY.js";
186
192
  import "../chunk-5OM2H6RI.js";
187
193
  import "../chunk-ZUYCXCPW.js";
188
194
  import "../chunk-YVFNJE4E.js";
189
- import "../chunk-PT57HCAI.js";
190
195
  import {
191
- Form,
192
- FormItem
193
- } from "../chunk-2OMSNCRH.js";
194
- import {
195
- Heading
196
- } from "../chunk-BESTU2AY.js";
196
+ AlertDialog
197
+ } from "../chunk-J242TTFH.js";
197
198
  import {
198
- Typo
199
- } from "../chunk-PMJIFLDT.js";
200
- import "../chunk-LDBWASUA.js";
199
+ AspectRatio
200
+ } from "../chunk-EAXUQEO5.js";
201
201
  import "../chunk-CRTRMMJ7.js";
202
202
  export {
203
203
  AlertDialog,
@@ -1,10 +1,10 @@
1
1
  import {
2
2
  List,
3
3
  useList
4
- } from "../chunk-WV2HN6H4.js";
5
- import "../chunk-25HMMI7R.js";
4
+ } from "../chunk-JIJLOKVN.js";
6
5
  import "../chunk-PMJIFLDT.js";
7
6
  import "../chunk-LDBWASUA.js";
7
+ import "../chunk-25HMMI7R.js";
8
8
  import "../chunk-CRTRMMJ7.js";
9
9
  export {
10
10
  List,
@@ -1,8 +1,10 @@
1
1
  import {
2
2
  Pagination
3
- } from "../chunk-SBJOKO35.js";
3
+ } from "../chunk-FG3WT6OL.js";
4
4
  import "../chunk-XK6VEVOK.js";
5
5
  import "../chunk-HF6GNDPV.js";
6
+ import "../chunk-PMJIFLDT.js";
7
+ import "../chunk-LDBWASUA.js";
6
8
  import "../chunk-25HMMI7R.js";
7
9
  import "../chunk-W5TPOFOO.js";
8
10
  import "../chunk-WJ34ZHTU.js";
@@ -19,8 +21,6 @@ import "../chunk-YSYJCYHY.js";
19
21
  import "../chunk-5OM2H6RI.js";
20
22
  import "../chunk-ZUYCXCPW.js";
21
23
  import "../chunk-YVFNJE4E.js";
22
- import "../chunk-PMJIFLDT.js";
23
- import "../chunk-LDBWASUA.js";
24
24
  import "../chunk-CRTRMMJ7.js";
25
25
  export {
26
26
  Pagination
@@ -0,0 +1,70 @@
1
+ import {
2
+ ThemeProvider
3
+ } from "./chunk-7FKRQQYK.js";
4
+ import {
5
+ Box
6
+ } from "./chunk-4Y5BEXVN.js";
7
+ import {
8
+ Flex
9
+ } from "./chunk-25HMMI7R.js";
10
+ import {
11
+ Button
12
+ } from "./chunk-ZVDAEY5Q.js";
13
+ import {
14
+ Heading
15
+ } from "./chunk-BESTU2AY.js";
16
+ import {
17
+ __spreadProps,
18
+ __spreadValues
19
+ } from "./chunk-CRTRMMJ7.js";
20
+
21
+ // src/molecules/ghost-post.tsx
22
+ import { jsx, jsxs } from "react/jsx-runtime";
23
+ function GhostPost(props) {
24
+ const { defaultThemeProps, html, onPageBack } = props;
25
+ return /* @__PURE__ */ jsx(
26
+ ThemeProvider,
27
+ __spreadProps(__spreadValues({}, defaultThemeProps), {
28
+ accentColor: "iris",
29
+ scaling: "110%",
30
+ style: {},
31
+ children: html ? /* @__PURE__ */ jsx(Box, { mt: "5", width: "100%", children: /* @__PURE__ */ jsx(
32
+ "div",
33
+ {
34
+ className: "gh-content",
35
+ dangerouslySetInnerHTML: { __html: html }
36
+ }
37
+ ) }) : /* @__PURE__ */ jsxs(
38
+ Flex,
39
+ {
40
+ align: "center",
41
+ direction: "column",
42
+ gap: "6",
43
+ height: "100%",
44
+ justify: "center",
45
+ width: "100%",
46
+ children: [
47
+ /* @__PURE__ */ jsx(Heading, { variant: "heading1", children: "\uCF58\uD150\uCE20\uB97C \uCC3E\uC744 \uC218 \uC5C6\uC2B5\uB2C8\uB2E4." }),
48
+ /* @__PURE__ */ jsx(
49
+ Heading,
50
+ {
51
+ align: "center",
52
+ color: "gray",
53
+ variant: "heading4",
54
+ weight: "regular",
55
+ children: `\uC694\uCCAD\uD558\uC2E0 \uCF58\uD150\uCE20\uB97C \uCC3E\uC744 \uC218 \uC5C6\uC2B5\uB2C8\uB2E4.
56
+ \uC7A0\uC2DC \uD6C4 \uB2E4\uC2DC \uC2DC\uB3C4\uD574\uC8FC\uC138\uC694.`
57
+ }
58
+ ),
59
+ /* @__PURE__ */ jsx(Button, { onClick: onPageBack, size: "large", children: "\uB4A4\uB85C\uAC00\uAE30" })
60
+ ]
61
+ }
62
+ )
63
+ })
64
+ );
65
+ }
66
+
67
+ export {
68
+ GhostPost
69
+ };
70
+ //# sourceMappingURL=chunk-2GTKMGHS.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/molecules/ghost-post.tsx"],"sourcesContent":["import React from 'react';\nimport type { ThemeProviderProps } from '../theme/theme-provider';\nimport { ThemeProvider } from '../theme/theme-provider';\nimport { Flex } from '../atoms/flex';\nimport { Heading } from '../atoms/heading';\nimport { Box } from '../atoms/box';\nimport { Button } from '../atoms/button';\n\nexport interface GhostPostProps {\n defaultThemeProps?: Partial<ThemeProviderProps>;\n html?: string;\n title?: string;\n children?: React.ReactNode;\n onPageBack?: () => void;\n}\n\nexport function GhostPost(props: GhostPostProps): React.ReactNode {\n const { defaultThemeProps, html, onPageBack } = props;\n return (\n <ThemeProvider\n {...defaultThemeProps}\n accentColor=\"iris\"\n scaling=\"110%\"\n style={{}}\n >\n {html ? (\n <Box mt=\"5\" width=\"100%\">\n <div\n className=\"gh-content\"\n dangerouslySetInnerHTML={{ __html: html }}\n />\n </Box>\n ) : (\n <Flex\n align=\"center\"\n direction=\"column\"\n gap=\"6\"\n height=\"100%\"\n justify=\"center\"\n width=\"100%\"\n >\n <Heading variant=\"heading1\">콘텐츠를 찾을 수 없습니다.</Heading>\n <Heading\n align=\"center\"\n color=\"gray\"\n variant=\"heading4\"\n weight=\"regular\"\n >\n {`요청하신 콘텐츠를 찾을 수 없습니다.\n 잠시 후 다시 시도해주세요.`}\n </Heading>\n <Button onClick={onPageBack} size=\"large\">\n 뒤로가기\n </Button>\n </Flex>\n )}\n </ThemeProvider>\n );\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;AA2BU,cAMF,YANE;AAXH,SAAS,UAAU,OAAwC;AAChE,QAAM,EAAE,mBAAmB,MAAM,WAAW,IAAI;AAChD,SACE;AAAA,IAAC;AAAA,qCACK,oBADL;AAAA,MAEC,aAAY;AAAA,MACZ,SAAQ;AAAA,MACR,OAAO,CAAC;AAAA,MAEP,iBACC,oBAAC,OAAI,IAAG,KAAI,OAAM,QAChB;AAAA,QAAC;AAAA;AAAA,UACC,WAAU;AAAA,UACV,yBAAyB,EAAE,QAAQ,KAAK;AAAA;AAAA,MAC1C,GACF,IAEA;AAAA,QAAC;AAAA;AAAA,UACC,OAAM;AAAA,UACN,WAAU;AAAA,UACV,KAAI;AAAA,UACJ,QAAO;AAAA,UACP,SAAQ;AAAA,UACR,OAAM;AAAA,UAEN;AAAA,gCAAC,WAAQ,SAAQ,YAAW,oFAAe;AAAA,YAC3C;AAAA,cAAC;AAAA;AAAA,gBACC,OAAM;AAAA,gBACN,OAAM;AAAA,gBACN,SAAQ;AAAA,gBACR,QAAO;AAAA,gBAEN;AAAA;AAAA;AAAA,YAEH;AAAA,YACA,oBAAC,UAAO,SAAS,YAAY,MAAK,SAAQ,sCAE1C;AAAA;AAAA;AAAA,MACF;AAAA;AAAA,EAEJ;AAEJ;","names":[]}
@@ -0,0 +1,63 @@
1
+ import {
2
+ review_question_layout_default
3
+ } from "./chunk-VK6INFSB.js";
4
+ import {
5
+ review_question_body_default
6
+ } from "./chunk-MFAW7E6L.js";
7
+ import {
8
+ review_question_footer_default
9
+ } from "./chunk-PLXD7ZKF.js";
10
+ import {
11
+ review_question_header_default
12
+ } from "./chunk-SAEPW5JF.js";
13
+
14
+ // src/molecules/curriculumV2/CurriculumContents/CurriculumReviewSteps/ReviewQuestion/index.tsx
15
+ import { jsx } from "react/jsx-runtime";
16
+ function ReviewQuestion({
17
+ question,
18
+ index,
19
+ total,
20
+ answer,
21
+ error,
22
+ onChange,
23
+ onNext,
24
+ onPrev,
25
+ isLast,
26
+ isNextDisabled,
27
+ onSubmit,
28
+ isLoading
29
+ }) {
30
+ return /* @__PURE__ */ jsx(
31
+ review_question_layout_default,
32
+ {
33
+ Body: /* @__PURE__ */ jsx(
34
+ review_question_body_default,
35
+ {
36
+ answer,
37
+ error,
38
+ onChange,
39
+ question
40
+ }
41
+ ),
42
+ Footer: /* @__PURE__ */ jsx(
43
+ review_question_footer_default,
44
+ {
45
+ index,
46
+ isLast,
47
+ isLoading,
48
+ isNextButtonDisabled: isNextDisabled,
49
+ onNext,
50
+ onPrev,
51
+ onSubmit
52
+ }
53
+ ),
54
+ Header: /* @__PURE__ */ jsx(review_question_header_default, { index, total })
55
+ }
56
+ );
57
+ }
58
+ var ReviewQuestion_default = ReviewQuestion;
59
+
60
+ export {
61
+ ReviewQuestion_default
62
+ };
63
+ //# sourceMappingURL=chunk-2GWB6C4M.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/molecules/curriculumV2/CurriculumContents/CurriculumReviewSteps/ReviewQuestion/index.tsx"],"sourcesContent":["import React from 'react';\nimport type { ReviewQuestionElement } from '@/types/curriculum.type';\nimport ReviewQuestionLayout from './review-question-layout';\nimport ReviewQuestionHeader from './review-question-header';\nimport ReviewQuestionFooter from './review-question-footer';\nimport ReviewQuestionBody from './review-question-body';\n\ninterface ReviewQuestionProps {\n question: ReviewQuestionElement;\n index: number;\n total: number;\n answer: string;\n error?: string;\n onChange: (value: string) => void;\n onNext: () => void;\n onPrev: () => void;\n isLast: boolean;\n isNextDisabled?: boolean;\n onSubmit: () => void;\n isLoading?: boolean;\n}\n\nfunction ReviewQuestion({\n question,\n index,\n total,\n answer,\n error,\n onChange,\n onNext,\n onPrev,\n isLast,\n isNextDisabled,\n onSubmit,\n isLoading,\n}: ReviewQuestionProps): React.ReactElement {\n \n return (\n <ReviewQuestionLayout\n Body={\n <ReviewQuestionBody\n answer={answer}\n error={error}\n onChange={onChange}\n question={question}\n />\n }\n Footer={\n <ReviewQuestionFooter\n index={index}\n isLast={isLast}\n isLoading={isLoading}\n isNextButtonDisabled={isNextDisabled}\n onNext={onNext}\n onPrev={onPrev}\n onSubmit={onSubmit}\n />\n }\n Header={<ReviewQuestionHeader index={index} total={total} />}\n />\n );\n}\n\nexport default ReviewQuestion;\n"],"mappings":";;;;;;;;;;;;;;AAwCQ;AAlBR,SAAS,eAAe;AAAA,EACtB;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,GAA4C;AAE1C,SACE;AAAA,IAAC;AAAA;AAAA,MACC,MACE;AAAA,QAAC;AAAA;AAAA,UACC;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA;AAAA,MACF;AAAA,MAEF,QACE;AAAA,QAAC;AAAA;AAAA,UACC;AAAA,UACA;AAAA,UACA;AAAA,UACA,sBAAsB;AAAA,UACtB;AAAA,UACA;AAAA,UACA;AAAA;AAAA,MACF;AAAA,MAEF,QAAQ,oBAAC,kCAAqB,OAAc,OAAc;AAAA;AAAA,EAC5D;AAEJ;AAEA,IAAO,yBAAQ;","names":[]}
@@ -0,0 +1,218 @@
1
+ import {
2
+ DynamicFormField
3
+ } from "./chunk-ALFE4BOS.js";
4
+ import {
5
+ DynamicFormProvider,
6
+ useDynamicForm
7
+ } from "./chunk-NCSMSA3X.js";
8
+ import {
9
+ Form
10
+ } from "./chunk-2OMSNCRH.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(`[data-field-name="${firstErrorFieldName}"]`);
30
+ }
31
+ if (!fieldElement) {
32
+ fieldElement = document.querySelector(`[data-error-field="${firstErrorFieldName}"]`);
33
+ }
34
+ if (fieldElement) {
35
+ fieldElement.scrollIntoView({
36
+ behavior: "smooth",
37
+ block: "nearest"
38
+ });
39
+ }
40
+ }
41
+ function DynamicFormRoot({
42
+ fields,
43
+ initialValues = {},
44
+ onSubmit,
45
+ children,
46
+ readonly = false,
47
+ formStyle
48
+ }) {
49
+ const validationSchema = useMemo(() => {
50
+ const schema = {};
51
+ fields.forEach((field) => {
52
+ if (field.validation) {
53
+ const validation = createYupValidation(field, field.validation);
54
+ if (validation) {
55
+ schema[field.name] = validation;
56
+ }
57
+ } else if (field.required) {
58
+ if (field.type === "choices") {
59
+ 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`);
60
+ } else if (field.type === "yes_no") {
61
+ schema[field.name] = Yup.boolean().oneOf([true], `${field.label}\uC5D0 \uB3D9\uC758\uD574\uC8FC\uC138\uC694`);
62
+ } else {
63
+ schema[field.name] = Yup.string().required(
64
+ `${field.label}\uC740(\uB294) \uD544\uC218\uC785\uB2C8\uB2E4`
65
+ );
66
+ }
67
+ }
68
+ });
69
+ return Object.keys(schema).length > 0 ? Yup.object(schema) : void 0;
70
+ }, [fields]);
71
+ const handleSubmit = useCallback((values) => __async(null, null, function* () {
72
+ yield onSubmit(values);
73
+ }), [onSubmit]);
74
+ const formik = useFormik({
75
+ initialValues: fields.reduce((acc, field) => {
76
+ if (field.type === "choices") {
77
+ acc[field.name] = initialValues[field.name] || [];
78
+ } else if (field.type === "yes_no") {
79
+ acc[field.name] = initialValues[field.name] || false;
80
+ } else {
81
+ acc[field.name] = initialValues[field.name] || "";
82
+ }
83
+ return acc;
84
+ }, {}),
85
+ validationSchema,
86
+ validateOnBlur: true,
87
+ validateOnChange: true,
88
+ onSubmit: handleSubmit
89
+ });
90
+ useEffect(() => {
91
+ if (formik.submitCount > 0 && Object.keys(formik.errors).length > 0) {
92
+ const timeoutId = setTimeout(() => {
93
+ scrollToFirstError(formik.errors, fields);
94
+ }, 100);
95
+ return () => {
96
+ clearTimeout(timeoutId);
97
+ };
98
+ }
99
+ }, [formik.submitCount, formik.errors, fields]);
100
+ return /* @__PURE__ */ jsx(DynamicFormProvider, { fields, formStyle, formik, readonly, children });
101
+ }
102
+ function DynamicFormFieldList({
103
+ fields: fieldsProp,
104
+ labelVariant
105
+ }) {
106
+ const { formik, fields: fieldsFromContext, readonly } = useDynamicForm();
107
+ const fields = fieldsProp || fieldsFromContext;
108
+ return /* @__PURE__ */ jsx(Fragment, { children: fields.map((field) => {
109
+ const errorMessage = !readonly && formik.touched[field.name] && formik.errors[field.name] ? String(formik.errors[field.name]) : void 0;
110
+ return /* @__PURE__ */ jsx(
111
+ Box,
112
+ {
113
+ "data-error-field": errorMessage ? field.name : void 0,
114
+ "data-field-name": field.name,
115
+ mb: "2",
116
+ children: /* @__PURE__ */ jsxs(
117
+ Form.FormItem,
118
+ {
119
+ errorMessage,
120
+ label: field.label,
121
+ labelVariant,
122
+ name: field.name,
123
+ required: field.required,
124
+ children: [
125
+ /* @__PURE__ */ jsx(DynamicFormField, { field }),
126
+ field.description ? /* @__PURE__ */ jsx(Typo, { children: field.description }) : null
127
+ ]
128
+ }
129
+ )
130
+ },
131
+ field.name
132
+ );
133
+ }) });
134
+ }
135
+ var DynamicForm = {
136
+ Root: DynamicFormRoot,
137
+ FieldList: DynamicFormFieldList
138
+ };
139
+ function createYupValidation(field, validation) {
140
+ if (!validation) return void 0;
141
+ let schema;
142
+ if (field.type === "number") {
143
+ schema = Yup.number();
144
+ } else if (field.type === "email") {
145
+ schema = Yup.string().email(
146
+ validation.message || "\uC62C\uBC14\uB978 \uC774\uBA54\uC77C \uD615\uC2DD\uC774 \uC544\uB2D9\uB2C8\uB2E4"
147
+ );
148
+ } else if (field.type === "choices") {
149
+ schema = Yup.array();
150
+ } else if (field.type === "yes_no") {
151
+ schema = Yup.boolean();
152
+ } else {
153
+ schema = Yup.string();
154
+ }
155
+ if (validation.min !== void 0) {
156
+ if (field.type === "number") {
157
+ schema = schema.min(
158
+ validation.min,
159
+ validation.message || `\uCD5C\uC18C ${validation.min}\uC774\uC5B4\uC57C \uD569\uB2C8\uB2E4`
160
+ );
161
+ } else if (field.type === "choices") {
162
+ schema = schema.min(
163
+ validation.min,
164
+ validation.message || `\uCD5C\uC18C ${validation.min}\uAC1C \uC774\uC0C1 \uC120\uD0DD\uD574\uC8FC\uC138\uC694`
165
+ );
166
+ } else if (field.type === "yes_no") {
167
+ } else {
168
+ schema = schema.min(
169
+ validation.min,
170
+ validation.message || `\uCD5C\uC18C ${validation.min}\uC790 \uC774\uC0C1\uC774\uC5B4\uC57C \uD569\uB2C8\uB2E4`
171
+ );
172
+ }
173
+ }
174
+ if (validation.max !== void 0) {
175
+ if (field.type === "number") {
176
+ schema = schema.max(
177
+ validation.max,
178
+ validation.message || `\uCD5C\uB300 ${validation.max}\uC774\uC5B4\uC57C \uD569\uB2C8\uB2E4`
179
+ );
180
+ } else if (field.type === "choices") {
181
+ schema = schema.max(
182
+ validation.max,
183
+ validation.message || `\uCD5C\uB300 ${validation.max}\uAC1C\uAE4C\uC9C0 \uC120\uD0DD \uAC00\uB2A5\uD569\uB2C8\uB2E4`
184
+ );
185
+ } else if (field.type === "yes_no") {
186
+ } else {
187
+ schema = schema.max(
188
+ validation.max,
189
+ validation.message || `\uCD5C\uB300 ${validation.max}\uC790 \uC774\uD558\uC5EC\uC57C \uD569\uB2C8\uB2E4`
190
+ );
191
+ }
192
+ }
193
+ if (validation.pattern) {
194
+ if (field.type === "yes_no") {
195
+ } else {
196
+ schema = schema.matches(
197
+ new RegExp(validation.pattern),
198
+ validation.message || "\uC62C\uBC14\uB978 \uD615\uC2DD\uC774 \uC544\uB2D9\uB2C8\uB2E4"
199
+ );
200
+ }
201
+ }
202
+ if (field.required) {
203
+ if (field.type === "yes_no") {
204
+ schema = schema.oneOf([true], validation.message || `${field.label}\uC5D0 \uB3D9\uC758\uD574\uC8FC\uC138\uC694`);
205
+ } else if (field.type === "choices") {
206
+ schema = schema.min(1, validation.message || `${field.label}\uC744(\uB97C) \uD558\uB098 \uC774\uC0C1 \uC120\uD0DD\uD574\uC8FC\uC138\uC694`);
207
+ } else {
208
+ schema = schema.required(validation.message || `${field.label}\uC740(\uB294) \uD544\uC218\uC785\uB2C8\uB2E4`);
209
+ }
210
+ }
211
+ return schema;
212
+ }
213
+
214
+ export {
215
+ DynamicForm,
216
+ createYupValidation
217
+ };
218
+ //# sourceMappingURL=chunk-2OVAPUSZ.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(errors: Record<string, unknown>, _fields: DynamicFormFieldSchema[]): 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(`[data-field-name=\"${firstErrorFieldName}\"]`);\n }\n \n // 여전히 찾지 못한 경우, FormItem의 에러 메시지 영역을 찾기\n if (!fieldElement) {\n fieldElement = document.querySelector(`[data-error-field=\"${firstErrorFieldName}\"]`);\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([true], `${field.label}에 동의해주세요`);\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(async (values: Record<string, unknown>) => {\n await onSubmit(values);\n }, [onSubmit]);\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 fields={fields} formStyle={formStyle} formik={formik} readonly={readonly}>\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 <DynamicFormField field={field} />\n {field.description ? <Typo>{field.description}</Typo> : null}\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([true], validation.message || `${field.label}에 동의해주세요`);\n } else if (field.type === 'choices') {\n schema = (schema as ReturnType<typeof Yup.array>).min(1, validation.message || `${field.label}을(를) 하나 이상 선택해주세요`);\n } else {\n schema = (schema as Yup.StringSchema).required(validation.message || `${field.label}은(는) 필수입니다`);\n }\n }\n\n return schema;\n}\n"],"mappings":"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","names":[]}