@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
@@ -0,0 +1,218 @@
1
+ import {
2
+ DynamicFormField
3
+ } from "./chunk-DXD774YC.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, { color: "gray", variant: "caption", 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-NWCLGWD7.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 color=\"gray\" variant=\"caption\">{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":[]}
@@ -0,0 +1,169 @@
1
+ import {
2
+ Avatar
3
+ } from "./chunk-K36TPMKL.js";
4
+ import {
5
+ Flex
6
+ } from "./chunk-25HMMI7R.js";
7
+ import {
8
+ CheckIcon
9
+ } from "./chunk-W5TPOFOO.js";
10
+ import {
11
+ Typo
12
+ } from "./chunk-PMJIFLDT.js";
13
+
14
+ // src/molecules/stepper.tsx
15
+ import { createContext, Children, useContext, useMemo } from "react";
16
+ import { Separator } from "@radix-ui/themes";
17
+ import { Fragment, jsx, jsxs } from "react/jsx-runtime";
18
+ var StepContext = createContext({
19
+ active: false,
20
+ completed: false,
21
+ index: 0
22
+ });
23
+ function Root(props) {
24
+ const {
25
+ activeStep = 0,
26
+ children,
27
+ width,
28
+ minWidth,
29
+ maxWidth,
30
+ direction = "vertical"
31
+ } = props;
32
+ return /* @__PURE__ */ jsx(
33
+ Flex,
34
+ {
35
+ gap: "3",
36
+ style: {
37
+ width,
38
+ minWidth,
39
+ maxWidth
40
+ },
41
+ children: Children.map(children, (child, index) => {
42
+ return /* @__PURE__ */ jsx(
43
+ StepContext.Provider,
44
+ {
45
+ value: {
46
+ active: index === activeStep,
47
+ completed: index < activeStep,
48
+ index,
49
+ direction
50
+ },
51
+ children: child
52
+ }
53
+ );
54
+ })
55
+ }
56
+ );
57
+ }
58
+ function Step(props) {
59
+ const { Icon, children } = props;
60
+ const {
61
+ active,
62
+ completed,
63
+ index,
64
+ direction = "vertical"
65
+ } = useContext(StepContext);
66
+ const connector = index > 0 ? /* @__PURE__ */ jsx(
67
+ Separator,
68
+ {
69
+ style: {
70
+ width: `calc(100% - 40px)`,
71
+ position: "absolute",
72
+ top: 16,
73
+ right: `calc(50% + 26px)`
74
+ }
75
+ }
76
+ ) : null;
77
+ const InnerStep = useMemo(() => {
78
+ if (active) {
79
+ return ActiveStep;
80
+ }
81
+ if (completed) {
82
+ return CompleteStep;
83
+ }
84
+ return IncompleteStep;
85
+ }, [completed, active]);
86
+ return /* @__PURE__ */ jsxs(
87
+ Flex,
88
+ {
89
+ align: "center",
90
+ direction: direction === "horizontal" ? "row" : "column",
91
+ gap: "4",
92
+ position: "relative",
93
+ style: { flex: 1 },
94
+ children: [
95
+ connector,
96
+ /* @__PURE__ */ jsx(InnerStep, { Icon, children })
97
+ ]
98
+ }
99
+ );
100
+ }
101
+ function CompleteStep(props) {
102
+ const { Icon, children } = props;
103
+ const { completed, active } = useContext(StepContext);
104
+ const background = "var(--accent-a4)";
105
+ const border = "1px solid var(--accent-7)";
106
+ const color = "var(--accent-contrast)";
107
+ return /* @__PURE__ */ jsxs(Fragment, { children: [
108
+ Icon ? /* @__PURE__ */ jsx(Icon, { active, completed }) : /* @__PURE__ */ jsx(
109
+ Avatar,
110
+ {
111
+ fallback: /* @__PURE__ */ jsx(CheckIcon, { fill: color, height: 16, width: 16 }),
112
+ radius: "full",
113
+ size: "medium",
114
+ style: {
115
+ border,
116
+ background
117
+ }
118
+ }
119
+ ),
120
+ /* @__PURE__ */ jsx(Typo, { align: "center", variant: "caption", children })
121
+ ] });
122
+ }
123
+ function IncompleteStep(props) {
124
+ const { Icon, children } = props;
125
+ const { completed, active, index } = useContext(StepContext);
126
+ const background = "var(--gray-5)";
127
+ const color = "var(--gray-a11)";
128
+ return /* @__PURE__ */ jsxs(Fragment, { children: [
129
+ Icon ? /* @__PURE__ */ jsx(Icon, { active, completed }) : /* @__PURE__ */ jsx(
130
+ Avatar,
131
+ {
132
+ fallback: /* @__PURE__ */ jsx(Typo, { style: { color }, children: index + 1 }),
133
+ radius: "full",
134
+ size: "medium",
135
+ style: {
136
+ background
137
+ }
138
+ }
139
+ ),
140
+ /* @__PURE__ */ jsx(Typo, { align: "center", style: { color }, variant: "caption", children })
141
+ ] });
142
+ }
143
+ function ActiveStep(props) {
144
+ const { Icon, children } = props;
145
+ const { completed, active, index } = useContext(StepContext);
146
+ const background = "var(--accent-10)";
147
+ const color = "var(--accent-contrast)";
148
+ return /* @__PURE__ */ jsxs(Fragment, { children: [
149
+ Icon ? /* @__PURE__ */ jsx(Icon, { active, completed }) : /* @__PURE__ */ jsx(
150
+ Avatar,
151
+ {
152
+ fallback: /* @__PURE__ */ jsx(Typo, { style: { color }, weight: "bold", children: index + 1 }),
153
+ radius: "full",
154
+ size: "medium",
155
+ style: { background }
156
+ }
157
+ ),
158
+ /* @__PURE__ */ jsx(Typo, { align: "center", variant: "caption", weight: "bold", children })
159
+ ] });
160
+ }
161
+ var Stepper = {
162
+ Root,
163
+ Step
164
+ };
165
+
166
+ export {
167
+ Stepper
168
+ };
169
+ //# sourceMappingURL=chunk-ONUWABWT.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/molecules/stepper.tsx"],"sourcesContent":["import React, { createContext, Children, useContext, useMemo } from 'react';\nimport { Separator } from '@radix-ui/themes';\nimport { Flex } from '../atoms/flex';\nimport { Avatar } from '../atoms/avatar';\nimport { CheckIcon } from '../icon';\nimport { Typo } from '../atoms/typo';\n\ninterface StepState extends Pick<StepperProps, 'direction'> {\n active: boolean;\n completed: boolean;\n index: number;\n}\n\nconst StepContext = createContext<StepState>({\n active: false,\n completed: false,\n index: 0,\n});\n\ninterface StepperProps {\n // 활성화된 스텝 인덱스. 0부터 시작\n activeStep?: number;\n children?: React.ReactNode | React.ReactNode[];\n width?: string;\n maxWidth?: string;\n minWidth?: string;\n /** icon과 children의 배치 방향. 기본 값 vertical */\n direction?: 'horizontal' | 'vertical';\n}\n\nfunction Root(props: StepperProps): React.ReactNode {\n const {\n activeStep = 0,\n children,\n width,\n minWidth,\n maxWidth,\n direction = 'vertical',\n } = props;\n\n return (\n <Flex\n gap=\"3\"\n style={{\n width,\n minWidth,\n maxWidth,\n }}\n >\n {Children.map(children, (child, index) => {\n return (\n <StepContext.Provider\n value={{\n active: index === activeStep,\n completed: index < activeStep,\n index,\n direction,\n }}\n >\n {child}\n </StepContext.Provider>\n );\n })}\n </Flex>\n );\n}\n\ninterface StepProps {\n children?: React.ReactNode;\n /** 아이콘 커스텀 필요시 사용 */\n Icon?: (args: { completed: boolean; active: boolean }) => React.ReactNode;\n}\n\nfunction Step(props: StepProps): React.ReactNode {\n const { Icon, children } = props;\n const {\n active,\n completed,\n index,\n direction = 'vertical',\n } = useContext(StepContext);\n\n const connector =\n index > 0 ? (\n <Separator\n style={{\n width: `calc(100% - 40px)`,\n position: 'absolute',\n top: 16,\n right: `calc(50% + 26px)`,\n }}\n />\n ) : null;\n\n const InnerStep = useMemo<(props: StepProps) => React.ReactNode>(() => {\n if (active) {\n return ActiveStep;\n }\n if (completed) {\n return CompleteStep;\n }\n return IncompleteStep;\n }, [completed, active]);\n\n return (\n <Flex\n align=\"center\"\n direction={direction === 'horizontal' ? 'row' : 'column'}\n gap=\"4\"\n position=\"relative\"\n style={{ flex: 1 }}\n >\n {connector}\n <InnerStep Icon={Icon}>{children}</InnerStep>\n </Flex>\n );\n}\n\nfunction CompleteStep(props: StepProps): React.ReactNode {\n const { Icon, children } = props;\n const { completed, active } = useContext(StepContext);\n const background = 'var(--accent-a4)';\n const border = '1px solid var(--accent-7)';\n const color = 'var(--accent-contrast)';\n\n return (\n <>\n {Icon ? (\n <Icon active={active} completed={completed} />\n ) : (\n <Avatar\n fallback={<CheckIcon fill={color} height={16} width={16} />}\n radius=\"full\"\n size=\"medium\"\n style={{\n border,\n background,\n }}\n />\n )}\n <Typo align=\"center\" variant=\"caption\">\n {children}\n </Typo>\n </>\n );\n}\n\nfunction IncompleteStep(props: StepProps): React.ReactNode {\n const { Icon, children } = props;\n const { completed, active, index } = useContext(StepContext);\n const background = 'var(--gray-5)';\n const color = 'var(--gray-a11)';\n return (\n <>\n {Icon ? (\n <Icon active={active} completed={completed} />\n ) : (\n <Avatar\n fallback={<Typo style={{ color }}>{index + 1}</Typo>}\n radius=\"full\"\n size=\"medium\"\n style={{\n background,\n }}\n />\n )}\n <Typo align=\"center\" style={{ color }} variant=\"caption\">\n {children}\n </Typo>\n </>\n );\n}\n\nfunction ActiveStep(props: StepProps): React.ReactNode {\n const { Icon, children } = props;\n const { completed, active, index } = useContext(StepContext);\n const background = 'var(--accent-10)';\n const color = 'var(--accent-contrast)';\n\n return (\n <>\n {Icon ? (\n <Icon active={active} completed={completed} />\n ) : (\n <Avatar\n fallback={\n <Typo style={{ color }} weight=\"bold\">\n {index + 1}\n </Typo>\n }\n radius=\"full\"\n size=\"medium\"\n style={{ background }}\n />\n )}\n <Typo align=\"center\" variant=\"caption\" weight=\"bold\">\n {children}\n </Typo>\n </>\n );\n}\n\nexport const Stepper = {\n Root,\n Step,\n};\n"],"mappings":";;;;;;;;;;;;;;AAAA,SAAgB,eAAe,UAAU,YAAY,eAAe;AACpE,SAAS,iBAAiB;AAkDhB,SA2EN,UA3EM,KAsDN,YAtDM;AAtCV,IAAM,cAAc,cAAyB;AAAA,EAC3C,QAAQ;AAAA,EACR,WAAW;AAAA,EACX,OAAO;AACT,CAAC;AAaD,SAAS,KAAK,OAAsC;AAClD,QAAM;AAAA,IACJ,aAAa;AAAA,IACb;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA,YAAY;AAAA,EACd,IAAI;AAEJ,SACE;AAAA,IAAC;AAAA;AAAA,MACC,KAAI;AAAA,MACJ,OAAO;AAAA,QACL;AAAA,QACA;AAAA,QACA;AAAA,MACF;AAAA,MAEC,mBAAS,IAAI,UAAU,CAAC,OAAO,UAAU;AACxC,eACE;AAAA,UAAC,YAAY;AAAA,UAAZ;AAAA,YACC,OAAO;AAAA,cACL,QAAQ,UAAU;AAAA,cAClB,WAAW,QAAQ;AAAA,cACnB;AAAA,cACA;AAAA,YACF;AAAA,YAEC;AAAA;AAAA,QACH;AAAA,MAEJ,CAAC;AAAA;AAAA,EACH;AAEJ;AAQA,SAAS,KAAK,OAAmC;AAC/C,QAAM,EAAE,MAAM,SAAS,IAAI;AAC3B,QAAM;AAAA,IACJ;AAAA,IACA;AAAA,IACA;AAAA,IACA,YAAY;AAAA,EACd,IAAI,WAAW,WAAW;AAE1B,QAAM,YACJ,QAAQ,IACN;AAAA,IAAC;AAAA;AAAA,MACC,OAAO;AAAA,QACL,OAAO;AAAA,QACP,UAAU;AAAA,QACV,KAAK;AAAA,QACL,OAAO;AAAA,MACT;AAAA;AAAA,EACF,IACE;AAEN,QAAM,YAAY,QAA+C,MAAM;AACrE,QAAI,QAAQ;AACV,aAAO;AAAA,IACT;AACA,QAAI,WAAW;AACb,aAAO;AAAA,IACT;AACA,WAAO;AAAA,EACT,GAAG,CAAC,WAAW,MAAM,CAAC;AAEtB,SACE;AAAA,IAAC;AAAA;AAAA,MACC,OAAM;AAAA,MACN,WAAW,cAAc,eAAe,QAAQ;AAAA,MAChD,KAAI;AAAA,MACJ,UAAS;AAAA,MACT,OAAO,EAAE,MAAM,EAAE;AAAA,MAEhB;AAAA;AAAA,QACD,oBAAC,aAAU,MAAa,UAAS;AAAA;AAAA;AAAA,EACnC;AAEJ;AAEA,SAAS,aAAa,OAAmC;AACvD,QAAM,EAAE,MAAM,SAAS,IAAI;AAC3B,QAAM,EAAE,WAAW,OAAO,IAAI,WAAW,WAAW;AACpD,QAAM,aAAa;AACnB,QAAM,SAAS;AACf,QAAM,QAAQ;AAEd,SACE,iCACG;AAAA,WACC,oBAAC,QAAK,QAAgB,WAAsB,IAE5C;AAAA,MAAC;AAAA;AAAA,QACC,UAAU,oBAAC,aAAU,MAAM,OAAO,QAAQ,IAAI,OAAO,IAAI;AAAA,QACzD,QAAO;AAAA,QACP,MAAK;AAAA,QACL,OAAO;AAAA,UACL;AAAA,UACA;AAAA,QACF;AAAA;AAAA,IACF;AAAA,IAEF,oBAAC,QAAK,OAAM,UAAS,SAAQ,WAC1B,UACH;AAAA,KACF;AAEJ;AAEA,SAAS,eAAe,OAAmC;AACzD,QAAM,EAAE,MAAM,SAAS,IAAI;AAC3B,QAAM,EAAE,WAAW,QAAQ,MAAM,IAAI,WAAW,WAAW;AAC3D,QAAM,aAAa;AACnB,QAAM,QAAQ;AACd,SACE,iCACG;AAAA,WACC,oBAAC,QAAK,QAAgB,WAAsB,IAE5C;AAAA,MAAC;AAAA;AAAA,QACC,UAAU,oBAAC,QAAK,OAAO,EAAE,MAAM,GAAI,kBAAQ,GAAE;AAAA,QAC7C,QAAO;AAAA,QACP,MAAK;AAAA,QACL,OAAO;AAAA,UACL;AAAA,QACF;AAAA;AAAA,IACF;AAAA,IAEF,oBAAC,QAAK,OAAM,UAAS,OAAO,EAAE,MAAM,GAAG,SAAQ,WAC5C,UACH;AAAA,KACF;AAEJ;AAEA,SAAS,WAAW,OAAmC;AACrD,QAAM,EAAE,MAAM,SAAS,IAAI;AAC3B,QAAM,EAAE,WAAW,QAAQ,MAAM,IAAI,WAAW,WAAW;AAC3D,QAAM,aAAa;AACnB,QAAM,QAAQ;AAEd,SACE,iCACG;AAAA,WACC,oBAAC,QAAK,QAAgB,WAAsB,IAE5C;AAAA,MAAC;AAAA;AAAA,QACC,UACE,oBAAC,QAAK,OAAO,EAAE,MAAM,GAAG,QAAO,QAC5B,kBAAQ,GACX;AAAA,QAEF,QAAO;AAAA,QACP,MAAK;AAAA,QACL,OAAO,EAAE,WAAW;AAAA;AAAA,IACtB;AAAA,IAEF,oBAAC,QAAK,OAAM,UAAS,SAAQ,WAAU,QAAO,QAC3C,UACH;AAAA,KACF;AAEJ;AAEO,IAAM,UAAU;AAAA,EACrB;AAAA,EACA;AACF;","names":[]}
@@ -0,0 +1,218 @@
1
+ import {
2
+ DynamicFormField
3
+ } from "./chunk-DXD774YC.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 && type !== "yes_no" ? /* @__PURE__ */ jsx(Typo, { color: "gray", variant: "caption", 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-PTCXWBAB.js.map