@sonordev/site-kit 4.0.1 → 4.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (276) hide show
  1. package/agent-manifest.json +6 -1
  2. package/dist/AnalyticsProvider-G5P5RQOA.js +31 -0
  3. package/dist/{AnalyticsProvider-UE34SYF2.js.map → AnalyticsProvider-G5P5RQOA.js.map} +1 -1
  4. package/dist/AnalyticsProvider-NGQLQL5N.mjs +10 -0
  5. package/dist/{AnalyticsProvider-NSXC6IOO.mjs.map → AnalyticsProvider-NGQLQL5N.mjs.map} +1 -1
  6. package/dist/ChatWidget-AYKZBKJH.js +20 -0
  7. package/dist/{ChatWidget-OW37OU3Z.js.map → ChatWidget-AYKZBKJH.js.map} +1 -1
  8. package/dist/ChatWidget-LPFHRK7U.mjs +11 -0
  9. package/dist/{ChatWidget-ASWCGCJJ.mjs.map → ChatWidget-LPFHRK7U.mjs.map} +1 -1
  10. package/dist/DatePicker-4WNKNNCV.mjs +4 -0
  11. package/dist/DatePicker-4WNKNNCV.mjs.map +1 -0
  12. package/dist/DatePicker-VPZR7RU3.js +13 -0
  13. package/dist/DatePicker-VPZR7RU3.js.map +1 -0
  14. package/dist/EngageWidget-HKPAJAMR.js +18 -0
  15. package/dist/{EngageWidget-MXOCMVBQ.js.map → EngageWidget-HKPAJAMR.js.map} +1 -1
  16. package/dist/EngageWidget-KDE7BYAK.mjs +9 -0
  17. package/dist/{EngageWidget-67UZ3P5P.mjs.map → EngageWidget-KDE7BYAK.mjs.map} +1 -1
  18. package/dist/FileField-DDDNSRMR.js +91 -0
  19. package/dist/FileField-DDDNSRMR.js.map +1 -0
  20. package/dist/FileField-SU4HTY4F.mjs +85 -0
  21. package/dist/FileField-SU4HTY4F.mjs.map +1 -0
  22. package/dist/{FormSpotlight-6MXGX6TU.mjs → FormSpotlight-B6TJPNYN.mjs} +7 -6
  23. package/dist/FormSpotlight-B6TJPNYN.mjs.map +1 -0
  24. package/dist/{FormSpotlight-LOR57ENP.js → FormSpotlight-M4S57VC6.js} +20 -19
  25. package/dist/FormSpotlight-M4S57VC6.js.map +1 -0
  26. package/dist/{FormStage-H35FBWTX.js → FormStage-2ASJGNOX.js} +16 -16
  27. package/dist/FormStage-2ASJGNOX.js.map +1 -0
  28. package/dist/{FormStage-ZLZD5EW4.mjs → FormStage-GH7SA6FQ.mjs} +6 -6
  29. package/dist/FormStage-GH7SA6FQ.mjs.map +1 -0
  30. package/dist/ManagedForm-D2JT3QV3.js +23 -0
  31. package/dist/ManagedForm-D2JT3QV3.js.map +1 -0
  32. package/dist/ManagedForm-RCC7NEV2.mjs +14 -0
  33. package/dist/ManagedForm-RCC7NEV2.mjs.map +1 -0
  34. package/dist/{SignalCore-HEXXYFSX.mjs → SignalCore-36PY3SRB.mjs} +5 -5
  35. package/dist/{SignalCore-HEXXYFSX.mjs.map → SignalCore-36PY3SRB.mjs.map} +1 -1
  36. package/dist/{SignalCore-EUMJIPDK.js → SignalCore-7H4ZGFZO.js} +11 -11
  37. package/dist/{SignalCore-EUMJIPDK.js.map → SignalCore-7H4ZGFZO.js.map} +1 -1
  38. package/dist/SitemapSync-AYVBNCH4.js +17 -0
  39. package/dist/{SitemapSync-HKUEDDG6.js.map → SitemapSync-AYVBNCH4.js.map} +1 -1
  40. package/dist/SitemapSync-HKAG3JU3.mjs +8 -0
  41. package/dist/{SitemapSync-T4QDPMFG.mjs.map → SitemapSync-HKAG3JU3.mjs.map} +1 -1
  42. package/dist/analytics/index.js +9 -9
  43. package/dist/analytics/index.mjs +4 -4
  44. package/dist/{chunk-ZGQUIL7L.js → chunk-2ACKOMAL.js} +105 -514
  45. package/dist/chunk-2ACKOMAL.js.map +1 -0
  46. package/dist/{chunk-52K556WM.js → chunk-2IH5FM2A.js} +14 -14
  47. package/dist/{chunk-52K556WM.js.map → chunk-2IH5FM2A.js.map} +1 -1
  48. package/dist/{chunk-PVE6G5XQ.mjs → chunk-2RJ5UHAC.mjs} +3 -3
  49. package/dist/{chunk-PVE6G5XQ.mjs.map → chunk-2RJ5UHAC.mjs.map} +1 -1
  50. package/dist/{chunk-VL2WAC22.js → chunk-3GJBSUVS.js} +14 -14
  51. package/dist/{chunk-VL2WAC22.js.map → chunk-3GJBSUVS.js.map} +1 -1
  52. package/dist/chunk-4ROQDPUE.mjs +60 -0
  53. package/dist/chunk-4ROQDPUE.mjs.map +1 -0
  54. package/dist/{chunk-4JEJTQYC.mjs → chunk-5GAOZTMW.mjs} +3 -3
  55. package/dist/{chunk-4JEJTQYC.mjs.map → chunk-5GAOZTMW.mjs.map} +1 -1
  56. package/dist/{chunk-NU5DJUVI.js → chunk-5JFJJNWS.js} +12 -192
  57. package/dist/chunk-5JFJJNWS.js.map +1 -0
  58. package/dist/{chunk-JGTIVQIN.mjs → chunk-7CYSA5EN.mjs} +3 -3
  59. package/dist/{chunk-JGTIVQIN.mjs.map → chunk-7CYSA5EN.mjs.map} +1 -1
  60. package/dist/{chunk-CTZHLX2B.mjs → chunk-7JES77WC.mjs} +5 -182
  61. package/dist/chunk-7JES77WC.mjs.map +1 -0
  62. package/dist/{chunk-DG34TZ6T.mjs → chunk-A4E6EOU4.mjs} +5 -5
  63. package/dist/{chunk-DG34TZ6T.mjs.map → chunk-A4E6EOU4.mjs.map} +1 -1
  64. package/dist/{chunk-YNIZKOEW.js → chunk-A624YYDG.js} +2 -2
  65. package/dist/{chunk-YNIZKOEW.js.map → chunk-A624YYDG.js.map} +1 -1
  66. package/dist/chunk-ANTVZSQI.mjs +183 -0
  67. package/dist/chunk-ANTVZSQI.mjs.map +1 -0
  68. package/dist/{chunk-2LKWN26R.mjs → chunk-D7IY27X5.mjs} +3 -3
  69. package/dist/{chunk-2LKWN26R.mjs.map → chunk-D7IY27X5.mjs.map} +1 -1
  70. package/dist/{chunk-QXIVUWQZ.js → chunk-DAGLPS6P.js} +8 -8
  71. package/dist/{chunk-QXIVUWQZ.js.map → chunk-DAGLPS6P.js.map} +1 -1
  72. package/dist/{chunk-XAMUTD4I.mjs → chunk-DBZU2TRZ.mjs} +3 -3
  73. package/dist/{chunk-XAMUTD4I.mjs.map → chunk-DBZU2TRZ.mjs.map} +1 -1
  74. package/dist/{chunk-I424AZPT.js → chunk-DCITIONV.js} +4 -4
  75. package/dist/{chunk-I424AZPT.js.map → chunk-DCITIONV.js.map} +1 -1
  76. package/dist/chunk-DVYYGHSG.js +285 -0
  77. package/dist/chunk-DVYYGHSG.js.map +1 -0
  78. package/dist/{chunk-62QRWS2I.mjs → chunk-FJ5EMPCK.mjs} +8 -8
  79. package/dist/{chunk-62QRWS2I.mjs.map → chunk-FJ5EMPCK.mjs.map} +1 -1
  80. package/dist/{chunk-6SHBMFYM.mjs → chunk-FNOCLT4A.mjs} +3 -3
  81. package/dist/{chunk-6SHBMFYM.mjs.map → chunk-FNOCLT4A.mjs.map} +1 -1
  82. package/dist/chunk-FQ4BDJXG.js +46 -0
  83. package/dist/chunk-FQ4BDJXG.js.map +1 -0
  84. package/dist/{chunk-EDFZ6EMM.js → chunk-FYPA5GLS.js} +15 -15
  85. package/dist/{chunk-EDFZ6EMM.js.map → chunk-FYPA5GLS.js.map} +1 -1
  86. package/dist/chunk-G7IMEY5T.mjs +44 -0
  87. package/dist/chunk-G7IMEY5T.mjs.map +1 -0
  88. package/dist/chunk-GJVC7KKL.mjs +508 -0
  89. package/dist/chunk-GJVC7KKL.mjs.map +1 -0
  90. package/dist/{chunk-Q7HLRTZA.js → chunk-HK33JRWA.js} +16 -16
  91. package/dist/{chunk-Q7HLRTZA.js.map → chunk-HK33JRWA.js.map} +1 -1
  92. package/dist/{chunk-ARBOKZAU.mjs → chunk-IUZ2RH4V.mjs} +3 -4
  93. package/dist/chunk-IUZ2RH4V.mjs.map +1 -0
  94. package/dist/{chunk-62RQTXHX.js → chunk-L6WWNP2N.js} +5 -5
  95. package/dist/{chunk-62RQTXHX.js.map → chunk-L6WWNP2N.js.map} +1 -1
  96. package/dist/chunk-LAWESLXJ.js +511 -0
  97. package/dist/chunk-LAWESLXJ.js.map +1 -0
  98. package/dist/{chunk-LYDTOFXJ.mjs → chunk-LB7LHVWI.mjs} +107 -503
  99. package/dist/chunk-LB7LHVWI.mjs.map +1 -0
  100. package/dist/{chunk-OIBQYBEL.mjs → chunk-LMKDQCU7.mjs} +3 -3
  101. package/dist/{chunk-OIBQYBEL.mjs.map → chunk-LMKDQCU7.mjs.map} +1 -1
  102. package/dist/{chunk-RZW4XVG5.js → chunk-LRHECSZK.js} +14 -14
  103. package/dist/{chunk-RZW4XVG5.js.map → chunk-LRHECSZK.js.map} +1 -1
  104. package/dist/{chunk-L5Q2ZJJM.js → chunk-MKQZVTD3.js} +6 -6
  105. package/dist/{chunk-L5Q2ZJJM.js.map → chunk-MKQZVTD3.js.map} +1 -1
  106. package/dist/chunk-MU3D5IO7.mjs +283 -0
  107. package/dist/chunk-MU3D5IO7.mjs.map +1 -0
  108. package/dist/{chunk-Z74IVGJB.mjs → chunk-MXPGAJLM.mjs} +4 -4
  109. package/dist/{chunk-Z74IVGJB.mjs.map → chunk-MXPGAJLM.mjs.map} +1 -1
  110. package/dist/{chunk-7QDTXT4N.js → chunk-NF3QVKWU.js} +6 -7
  111. package/dist/chunk-NF3QVKWU.js.map +1 -0
  112. package/dist/chunk-NSIRG3C3.js +148 -0
  113. package/dist/chunk-NSIRG3C3.js.map +1 -0
  114. package/dist/{chunk-WHGVQJG4.js → chunk-NTFLRRTQ.js} +8 -8
  115. package/dist/{chunk-WHGVQJG4.js.map → chunk-NTFLRRTQ.js.map} +1 -1
  116. package/dist/{chunk-NDB7EIOI.js → chunk-O554YMPI.js} +3 -3
  117. package/dist/{chunk-NDB7EIOI.js.map → chunk-O554YMPI.js.map} +1 -1
  118. package/dist/chunk-PKCEJWLD.mjs +6 -0
  119. package/dist/{chunk-6GFEJH4F.mjs.map → chunk-PKCEJWLD.mjs.map} +1 -1
  120. package/dist/{chunk-MJY7LYOV.mjs → chunk-QYLGVXRX.mjs} +4 -4
  121. package/dist/{chunk-MJY7LYOV.mjs.map → chunk-QYLGVXRX.mjs.map} +1 -1
  122. package/dist/chunk-R35CW6MM.js +8 -0
  123. package/dist/{chunk-34WY5XN2.js.map → chunk-R35CW6MM.js.map} +1 -1
  124. package/dist/chunk-S4U44UUD.mjs +138 -0
  125. package/dist/chunk-S4U44UUD.mjs.map +1 -0
  126. package/dist/{chunk-LDRE2ELU.js → chunk-SEH2K6NG.js} +12 -12
  127. package/dist/{chunk-LDRE2ELU.js.map → chunk-SEH2K6NG.js.map} +1 -1
  128. package/dist/chunk-TH2ANDPK.mjs +104 -0
  129. package/dist/chunk-TH2ANDPK.mjs.map +1 -0
  130. package/dist/{chunk-KHJYA64F.mjs → chunk-U2CJZ6O5.mjs} +2 -2
  131. package/dist/{chunk-KHJYA64F.mjs.map → chunk-U2CJZ6O5.mjs.map} +1 -1
  132. package/dist/{chunk-5GPFPMDQ.mjs → chunk-UDHQNYBD.mjs} +4 -4
  133. package/dist/{chunk-5GPFPMDQ.mjs.map → chunk-UDHQNYBD.mjs.map} +1 -1
  134. package/dist/chunk-UTANIZUO.js +110 -0
  135. package/dist/chunk-UTANIZUO.js.map +1 -0
  136. package/dist/{chunk-QABZPSHD.js → chunk-VJAUA77N.js} +5 -5
  137. package/dist/{chunk-QABZPSHD.js.map → chunk-VJAUA77N.js.map} +1 -1
  138. package/dist/{chunk-CBUK2XB3.js → chunk-VOYLJCHB.js} +9 -9
  139. package/dist/{chunk-CBUK2XB3.js.map → chunk-VOYLJCHB.js.map} +1 -1
  140. package/dist/{chunk-XCCW4Y3B.mjs → chunk-VPBLW4ZN.mjs} +5 -5
  141. package/dist/{chunk-XCCW4Y3B.mjs.map → chunk-VPBLW4ZN.mjs.map} +1 -1
  142. package/dist/{chunk-6535RSF5.mjs → chunk-WJJQWAG2.mjs} +3 -3
  143. package/dist/{chunk-6535RSF5.mjs.map → chunk-WJJQWAG2.mjs.map} +1 -1
  144. package/dist/chunk-WNUUVBD7.js +64 -0
  145. package/dist/chunk-WNUUVBD7.js.map +1 -0
  146. package/dist/{chunk-DPTNQVMK.mjs → chunk-XCCMVJUA.mjs} +3 -3
  147. package/dist/{chunk-DPTNQVMK.mjs.map → chunk-XCCMVJUA.mjs.map} +1 -1
  148. package/dist/chunk-XRQ47XDA.js +188 -0
  149. package/dist/chunk-XRQ47XDA.js.map +1 -0
  150. package/dist/{chunk-YGWWLTH5.js → chunk-ZDXGB3UC.js} +4 -4
  151. package/dist/{chunk-YGWWLTH5.js.map → chunk-ZDXGB3UC.js.map} +1 -1
  152. package/dist/cli/index.js +3 -3
  153. package/dist/cli/index.mjs +1 -1
  154. package/dist/client/index.js +5 -5
  155. package/dist/client/index.mjs +4 -4
  156. package/dist/cms/index.d.ts +23 -0
  157. package/dist/cms/index.d.ts.map +1 -1
  158. package/dist/cms/index.js +2 -2
  159. package/dist/cms/index.mjs +1 -1
  160. package/dist/cms/server-api.d.ts.map +1 -1
  161. package/dist/cms/server.js +4 -4
  162. package/dist/cms/server.mjs +1 -1
  163. package/dist/commerce/index.js +56 -56
  164. package/dist/commerce/index.mjs +5 -5
  165. package/dist/engage/EngageWidget.d.ts.map +1 -1
  166. package/dist/engage/dependency-contract.test.d.ts +2 -0
  167. package/dist/engage/dependency-contract.test.d.ts.map +1 -0
  168. package/dist/engage/index.js +10 -9
  169. package/dist/engage/index.js.map +1 -1
  170. package/dist/engage/index.mjs +7 -6
  171. package/dist/engage/index.mjs.map +1 -1
  172. package/dist/engage/socket-loader.d.ts +13 -0
  173. package/dist/engage/socket-loader.d.ts.map +1 -1
  174. package/dist/fleet/index.js +9 -9
  175. package/dist/fleet/index.mjs +5 -5
  176. package/dist/forms/FileField.d.ts +31 -0
  177. package/dist/forms/FileField.d.ts.map +1 -0
  178. package/dist/forms/FormClient.d.ts +10 -1
  179. package/dist/forms/FormClient.d.ts.map +1 -1
  180. package/dist/forms/FormEnhancer.d.ts +72 -0
  181. package/dist/forms/FormEnhancer.d.ts.map +1 -0
  182. package/dist/forms/FormField.d.ts +26 -3
  183. package/dist/forms/FormField.d.ts.map +1 -1
  184. package/dist/forms/FormSpotlight.d.ts.map +1 -1
  185. package/dist/forms/FormStage.d.ts.map +1 -1
  186. package/dist/forms/HoneypotField.d.ts +8 -2
  187. package/dist/forms/HoneypotField.d.ts.map +1 -1
  188. package/dist/forms/ManagedForm.d.ts +1 -1
  189. package/dist/forms/ManagedForm.d.ts.map +1 -1
  190. package/dist/forms/ServerForm.d.ts +73 -0
  191. package/dist/forms/ServerForm.d.ts.map +1 -0
  192. package/dist/forms/StaticForm.d.ts +50 -0
  193. package/dist/forms/StaticForm.d.ts.map +1 -0
  194. package/dist/forms/field-controls.d.ts +7 -0
  195. package/dist/forms/field-controls.d.ts.map +1 -0
  196. package/dist/forms/index.d.ts +7 -0
  197. package/dist/forms/index.d.ts.map +1 -1
  198. package/dist/forms/index.js +33 -557
  199. package/dist/forms/index.js.map +1 -1
  200. package/dist/forms/index.mjs +14 -550
  201. package/dist/forms/index.mjs.map +1 -1
  202. package/dist/forms/normalize-config.d.ts +18 -0
  203. package/dist/forms/normalize-config.d.ts.map +1 -0
  204. package/dist/forms/server.d.ts +5 -0
  205. package/dist/forms/server.d.ts.map +1 -1
  206. package/dist/forms/server.js +47 -0
  207. package/dist/forms/server.js.map +1 -1
  208. package/dist/forms/server.mjs +44 -1
  209. package/dist/forms/server.mjs.map +1 -1
  210. package/dist/forms/static-form.test.d.ts +2 -0
  211. package/dist/forms/static-form.test.d.ts.map +1 -0
  212. package/dist/forms/static.d.ts +17 -0
  213. package/dist/forms/static.d.ts.map +1 -0
  214. package/dist/forms/static.js +20 -0
  215. package/dist/forms/static.js.map +1 -0
  216. package/dist/forms/static.mjs +11 -0
  217. package/dist/forms/static.mjs.map +1 -0
  218. package/dist/forms/types.d.ts +7 -0
  219. package/dist/forms/types.d.ts.map +1 -1
  220. package/dist/forms/useForm.d.ts.map +1 -1
  221. package/dist/images/index.js +11 -11
  222. package/dist/images/index.mjs +4 -4
  223. package/dist/index.js +109 -109
  224. package/dist/index.mjs +9 -9
  225. package/dist/layout/client.js +9 -9
  226. package/dist/layout/client.mjs +8 -8
  227. package/dist/layout/index.js +11 -11
  228. package/dist/layout/index.mjs +9 -9
  229. package/dist/maps/index.js +5 -5
  230. package/dist/maps/index.mjs +3 -3
  231. package/dist/search/index.js +4 -4
  232. package/dist/search/index.mjs +3 -3
  233. package/dist/seo/client.js +5 -5
  234. package/dist/seo/client.mjs +4 -4
  235. package/dist/seo/index.js +14 -14
  236. package/dist/seo/index.mjs +6 -6
  237. package/dist/seo/server.js +5 -5
  238. package/dist/seo/server.mjs +1 -1
  239. package/dist/server/index.js +3 -3
  240. package/dist/server/index.mjs +2 -2
  241. package/dist/shared/build-entries.d.ts +6 -0
  242. package/dist/shared/build-entries.d.ts.map +1 -1
  243. package/dist/shared/no-cjs-require.test.d.ts +2 -0
  244. package/dist/shared/no-cjs-require.test.d.ts.map +1 -0
  245. package/dist/shared/version.d.ts +1 -1
  246. package/dist/signal/index.js +11 -11
  247. package/dist/signal/index.mjs +2 -2
  248. package/dist/{socket-loader-YEAQZ3XC.js → socket-loader-2NYBMBFQ.js} +2 -2
  249. package/dist/socket-loader-2NYBMBFQ.js.map +1 -0
  250. package/dist/{socket-loader-JHNN2QK4.mjs → socket-loader-JA2DI2RT.mjs} +2 -2
  251. package/dist/socket-loader-JA2DI2RT.mjs.map +1 -0
  252. package/dist/sync/index.js +16 -16
  253. package/dist/sync/index.mjs +4 -4
  254. package/package.json +28 -11
  255. package/dist/AnalyticsProvider-NSXC6IOO.mjs +0 -10
  256. package/dist/AnalyticsProvider-UE34SYF2.js +0 -31
  257. package/dist/ChatWidget-ASWCGCJJ.mjs +0 -10
  258. package/dist/ChatWidget-OW37OU3Z.js +0 -19
  259. package/dist/EngageWidget-67UZ3P5P.mjs +0 -9
  260. package/dist/EngageWidget-MXOCMVBQ.js +0 -18
  261. package/dist/FormSpotlight-6MXGX6TU.mjs.map +0 -1
  262. package/dist/FormSpotlight-LOR57ENP.js.map +0 -1
  263. package/dist/FormStage-H35FBWTX.js.map +0 -1
  264. package/dist/FormStage-ZLZD5EW4.mjs.map +0 -1
  265. package/dist/SitemapSync-HKUEDDG6.js +0 -17
  266. package/dist/SitemapSync-T4QDPMFG.mjs +0 -8
  267. package/dist/chunk-34WY5XN2.js +0 -8
  268. package/dist/chunk-6GFEJH4F.mjs +0 -6
  269. package/dist/chunk-7QDTXT4N.js.map +0 -1
  270. package/dist/chunk-ARBOKZAU.mjs.map +0 -1
  271. package/dist/chunk-CTZHLX2B.mjs.map +0 -1
  272. package/dist/chunk-LYDTOFXJ.mjs.map +0 -1
  273. package/dist/chunk-NU5DJUVI.js.map +0 -1
  274. package/dist/chunk-ZGQUIL7L.js.map +0 -1
  275. package/dist/socket-loader-JHNN2QK4.mjs.map +0 -1
  276. package/dist/socket-loader-YEAQZ3XC.js.map +0 -1
@@ -1,7 +1,7 @@
1
1
  'use client';
2
- import { DEFAULT_HONEYPOT_FIELD } from './chunk-TMVKRQGJ.mjs';
2
+ import { normalizeFormConfig, submitForm } from './chunk-ANTVZSQI.mjs';
3
3
  import { uuid } from './chunk-6EDVCUAG.mjs';
4
- import { sonorFetch, sonorBeacon } from './chunk-5GPFPMDQ.mjs';
4
+ import { sonorFetch, sonorBeacon } from './chunk-UDHQNYBD.mjs';
5
5
  import { useRef, useEffect, useCallback, useState, useMemo } from 'react';
6
6
 
7
7
  function useFormTracking({
@@ -168,183 +168,6 @@ function getDeviceType() {
168
168
  if (/mobile|iphone|ipod|android|blackberry|opera mini|iemobile/i.test(ua)) return "mobile";
169
169
  return "desktop";
170
170
  }
171
-
172
- // src/forms/defaultSuccessMessage.ts
173
- var DEFAULT_FORM_SUCCESS_MESSAGE = "Thank you for your submission! We will be in touch soon.";
174
-
175
- // src/forms/recaptcha.ts
176
- function getSiteKey(explicitSiteKey) {
177
- if (typeof window === "undefined") return void 0;
178
- if (explicitSiteKey) return explicitSiteKey;
179
- const win = window;
180
- return win.__SITE_KIT_RECAPTCHA_SITE_KEY__ ?? process.env.NEXT_PUBLIC_RECAPTCHA_SITE_KEY;
181
- }
182
- var RECAPTCHA_LOAD_TIMEOUT_MS = 1e4;
183
- function loadScript(siteKey) {
184
- return new Promise((resolve) => {
185
- if (typeof window === "undefined") {
186
- resolve(null);
187
- return;
188
- }
189
- const win = window;
190
- if (win.grecaptcha?.enterprise) {
191
- resolve(win.grecaptcha);
192
- return;
193
- }
194
- let settled = false;
195
- const finish = (value) => {
196
- if (settled) return;
197
- settled = true;
198
- resolve(value);
199
- };
200
- const giveUp = setTimeout(() => finish(null), RECAPTCHA_LOAD_TIMEOUT_MS);
201
- const waitForReady = () => {
202
- if (settled) return;
203
- if (win.grecaptcha?.enterprise) {
204
- clearTimeout(giveUp);
205
- finish(win.grecaptcha);
206
- return;
207
- }
208
- setTimeout(waitForReady, 50);
209
- };
210
- const existing = document.querySelector('script[src*="recaptcha/enterprise"]');
211
- if (existing) {
212
- waitForReady();
213
- return;
214
- }
215
- const script = document.createElement("script");
216
- script.src = `https://www.google.com/recaptcha/enterprise.js?render=${siteKey}`;
217
- script.async = true;
218
- script.onload = () => waitForReady();
219
- script.onerror = () => {
220
- clearTimeout(giveUp);
221
- finish(null);
222
- };
223
- document.head.appendChild(script);
224
- });
225
- }
226
- async function getRecaptchaToken(explicitSiteKey) {
227
- const siteKey = getSiteKey(explicitSiteKey);
228
- if (!siteKey || typeof window === "undefined") return null;
229
- try {
230
- const grecaptcha = await loadScript(siteKey);
231
- if (!grecaptcha?.enterprise?.execute) return null;
232
- await new Promise((resolve) => grecaptcha.enterprise.ready(resolve));
233
- const token = await grecaptcha.enterprise.execute(siteKey, { action: "submit" });
234
- return token || null;
235
- } catch (err) {
236
- try {
237
- await new Promise((resolve) => setTimeout(resolve, 800));
238
- const win = window;
239
- const token = await win.grecaptcha.enterprise.execute(siteKey, { action: "submit" });
240
- return token || null;
241
- } catch (retryErr) {
242
- console.warn("[site-kit reCAPTCHA]", retryErr);
243
- return null;
244
- }
245
- }
246
- }
247
-
248
- // src/forms/submitForm.ts
249
- function getApiConfig() {
250
- const apiUrl = typeof window !== "undefined" ? window.__SITE_KIT_API_URL__ || "https://api.sonor.io" : process.env.SONOR_API_URL || process.env.NEXT_PUBLIC_SONOR_API_URL || "https://api.sonor.io";
251
- const apiKey = typeof window !== "undefined" ? window.__SITE_KIT_API_KEY__ : void 0;
252
- return { apiUrl, apiKey };
253
- }
254
- function getUTMParams() {
255
- if (typeof window === "undefined") return {};
256
- const params = new URLSearchParams(window.location.search);
257
- const out = {};
258
- for (const key of ["utm_source", "utm_medium", "utm_campaign", "utm_term", "utm_content"]) {
259
- out[key] = params.get(key);
260
- }
261
- return out;
262
- }
263
- async function submitForm({
264
- config,
265
- values,
266
- honeypotValue,
267
- formLoadedAt
268
- }) {
269
- const { apiUrl, apiKey } = getApiConfig();
270
- if (!apiKey) {
271
- throw new Error("API key is required. Set SONOR_API_KEY in your environment.");
272
- }
273
- const recaptchaToken = config.recaptcha_enabled ? await getRecaptchaToken(config.recaptcha_site_key) : null;
274
- if (config.recaptcha_enabled && !recaptchaToken) {
275
- throw new Error("Verification could not be completed. Please try again.");
276
- }
277
- const honeypotFieldName = config.honeypot_field || DEFAULT_HONEYPOT_FIELD;
278
- const utm = getUTMParams();
279
- const payload = {
280
- formId: config.id,
281
- form_id: config.id,
282
- data: {
283
- ...values,
284
- ...config.honeypot_enabled ? { [honeypotFieldName]: honeypotValue } : {}
285
- },
286
- metadata: {
287
- pageUrl: typeof window !== "undefined" ? window.location.href : null,
288
- referrer: typeof document !== "undefined" ? document.referrer || null : null,
289
- userAgent: typeof navigator !== "undefined" ? navigator.userAgent : null,
290
- sessionId: typeof sessionStorage !== "undefined" ? sessionStorage.getItem("_sk_sid") : null,
291
- // Anonymous visitor id (_sk_vid) — the same id Analytics/Signal stamp on
292
- // page views, so the Sonor side can bind this lead to its browsing session
293
- // (page -> lead attribution). Sent on every submission; null pre-hydration.
294
- visitorId: typeof localStorage !== "undefined" ? localStorage.getItem("_sk_vid") : null,
295
- recaptchaToken: recaptchaToken || void 0,
296
- utmSource: utm.utm_source,
297
- utmMedium: utm.utm_medium,
298
- utmCampaign: utm.utm_campaign,
299
- utmTerm: utm.utm_term,
300
- utmContent: utm.utm_content,
301
- // Sub-site host — preserved on form_submissions for lead attribution
302
- // across multi-site projects. Resolved by SiteKitClientProviders.
303
- site: typeof window !== "undefined" ? window.__SITE_KIT_SITE__ || window.location.host : void 0,
304
- _formLoadedAt: formLoadedAt
305
- }
306
- };
307
- const response = await sonorFetch(
308
- `${apiUrl}/api/public/forms/submit`,
309
- {
310
- method: "POST",
311
- headers: {
312
- "Content-Type": "application/json",
313
- Authorization: `Bearer ${apiKey}`
314
- },
315
- body: JSON.stringify(payload)
316
- },
317
- { retries: 2, timeoutMs: 2e4 }
318
- );
319
- const data = await response.json().catch(() => null);
320
- if (!response.ok) {
321
- const msg = (data?.message ?? data?.error ?? (response.statusText || `HTTP ${response.status}`)).toString().trim();
322
- throw new Error(
323
- msg ? `Failed to submit form: ${msg}` : `Failed to submit form (${response.status})`
324
- );
325
- }
326
- return data;
327
- }
328
-
329
- // src/forms/useForm.ts
330
- function normalizeFormConfig(data) {
331
- if (data.steps) {
332
- data.steps.sort((a, b) => (a.step_number || 0) - (b.step_number || 0));
333
- }
334
- if (data.fields) {
335
- data.fields.sort((a, b) => (a.sort_order || 0) - (b.sort_order || 0));
336
- }
337
- const total_steps = data.steps?.length || 1;
338
- const is_multi_step = total_steps > 1;
339
- const apiSuccess = typeof data.success_message === "string" ? data.success_message.trim() : "";
340
- const success_message = apiSuccess || (typeof data.successMessage === "string" ? String(data.successMessage).trim() : "") || DEFAULT_FORM_SUCCESS_MESSAGE;
341
- return {
342
- ...data,
343
- success_message,
344
- total_steps,
345
- is_multi_step
346
- };
347
- }
348
171
  function useForm(formIdOrSlug, options = {}) {
349
172
  const {
350
173
  projectId: optionsProjectId,
@@ -657,6 +480,6 @@ function useForm(formIdOrSlug, options = {}) {
657
480
  };
658
481
  }
659
482
 
660
- export { DEFAULT_FORM_SUCCESS_MESSAGE, getApiConfig, submitForm, useForm, useFormTracking };
661
- //# sourceMappingURL=chunk-CTZHLX2B.mjs.map
662
- //# sourceMappingURL=chunk-CTZHLX2B.mjs.map
483
+ export { useForm, useFormTracking };
484
+ //# sourceMappingURL=chunk-7JES77WC.mjs.map
485
+ //# sourceMappingURL=chunk-7JES77WC.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/forms/useFormTracking.ts","../src/forms/useForm.ts"],"names":["useRef","useEffect","useCallback"],"mappings":"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","file":"chunk-7JES77WC.mjs","sourcesContent":["/**\n * @sonordev/site-kit/forms - Form Tracking Hook\n * \n * Tracks form analytics including step progress and abandonment\n */\n\n'use client'\n\nimport { useEffect, useRef, useCallback } from 'react'\nimport { sonorFetch, sonorBeacon } from '../shared/sonorFetch'\n// Single source of truth for v4 UUIDs — crypto.randomUUID throws on plain HTTP\n// and older Safari. Do NOT re-fork ID generation here.\nimport { uuid } from '../shared/uuid'\n\ninterface UseFormTrackingOptions {\n formId: string\n totalSteps: number\n enabled?: boolean\n debug?: boolean\n}\n\ninterface FormTrackingReturn {\n trackStepChange: (step: number) => void\n trackComplete: () => void\n sessionId: string\n}\n\nexport function useFormTracking({\n formId,\n totalSteps,\n enabled = true,\n debug = false,\n}: UseFormTrackingOptions): FormTrackingReturn {\n const sessionIdRef = useRef<string>('')\n const startTimeRef = useRef<number>(0)\n const stepStartTimeRef = useRef<number>(0)\n const stepTimesRef = useRef<Record<number, number>>({})\n const currentStepRef = useRef<number>(1)\n const maxStepRef = useRef<number>(1)\n const analyticsIdRef = useRef<string | null>(null)\n \n // Initialize tracking\n useEffect(() => {\n if (!enabled) return\n if (!formId) {\n if (debug) console.warn('[Forms] Tracking skipped: formId is empty')\n return\n }\n \n // Generate session ID\n sessionIdRef.current = uuid()\n startTimeRef.current = Date.now()\n stepStartTimeRef.current = Date.now()\n \n // Record form start\n const startTracking = async () => {\n const apiUrl = (window as any).__SITE_KIT_API_URL__\n const apiKey = (window as any).__SITE_KIT_API_KEY__\n \n if (!apiUrl || !apiKey) {\n if (debug) console.error('[Forms] Missing API URL or API key')\n return\n }\n \n try {\n const response = await sonorFetch(\n `${apiUrl}/api/public/forms/analytics/start`,\n {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify({\n formId,\n sessionId: sessionIdRef.current,\n deviceType: getDeviceType(),\n }),\n },\n { apiKey, retries: 0 },\n )\n \n if (!response.ok) {\n throw new Error(`HTTP ${response.status}: ${response.statusText}`)\n }\n \n const data = await response.json()\n analyticsIdRef.current = data.id\n if (debug) console.log('[Forms] Started tracking:', data.id)\n } catch (error) {\n if (debug) console.error('[Forms] Error starting tracking:', error)\n }\n }\n \n startTracking()\n \n // Handle abandonment on page leave\n const handleBeforeUnload = () => {\n if (!analyticsIdRef.current) return\n \n const apiUrl = (window as any).__SITE_KIT_API_URL__\n const apiKey = (window as any).__SITE_KIT_API_KEY__\n \n if (!apiUrl || !apiKey) return\n \n const now = Date.now()\n const currentStepTime = Math.floor((now - stepStartTimeRef.current) / 1000)\n stepTimesRef.current[currentStepRef.current] = currentStepTime\n\n // Fire-and-forget via sonorBeacon: keepalive fetch keeps the credential in\n // the x-api-key header (raw sendBeacon can't set headers), so abandonment\n // authenticates on 3.2+ token sites and uses the freshest minted token.\n sonorBeacon(\n `${apiUrl}/api/public/forms/analytics/abandon`,\n {\n analyticsId: analyticsIdRef.current,\n step: currentStepRef.current,\n maxStep: maxStepRef.current,\n stepTimes: stepTimesRef.current,\n totalTimeSeconds: Math.floor((now - startTimeRef.current) / 1000),\n },\n apiKey,\n )\n\n if (debug) console.log('[Forms] Abandonment tracked')\n }\n \n window.addEventListener('beforeunload', handleBeforeUnload)\n \n return () => {\n window.removeEventListener('beforeunload', handleBeforeUnload)\n }\n }, [formId, enabled, debug])\n \n // Track step changes\n const trackStepChange = useCallback(async (step: number) => {\n if (!enabled || !analyticsIdRef.current) return\n \n const apiUrl = (window as any).__SITE_KIT_API_URL__\n const apiKey = (window as any).__SITE_KIT_API_KEY__\n \n if (!apiUrl || !apiKey) {\n if (debug) console.error('[Forms] Missing API URL or API key')\n return\n }\n \n const now = Date.now()\n \n // Record time spent on previous step\n const prevStepTime = Math.floor((now - stepStartTimeRef.current) / 1000)\n stepTimesRef.current[currentStepRef.current] = prevStepTime\n \n // Update refs\n currentStepRef.current = step\n maxStepRef.current = Math.max(maxStepRef.current, step)\n stepStartTimeRef.current = now\n \n // Update database\n try {\n const response = await sonorFetch(\n `${apiUrl}/api/public/forms/analytics/step`,\n {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify({\n analyticsId: analyticsIdRef.current,\n step,\n maxStep: maxStepRef.current,\n stepTimes: stepTimesRef.current,\n }),\n },\n { apiKey, retries: 0 },\n )\n \n if (!response.ok) {\n throw new Error(`HTTP ${response.status}: ${response.statusText}`)\n }\n \n if (debug) console.log('[Forms] Step changed to:', step)\n } catch (error) {\n if (debug) console.error('[Forms] Error updating step:', error)\n }\n }, [enabled, debug])\n \n // Track completion\n const trackComplete = useCallback(async () => {\n if (!enabled || !analyticsIdRef.current) return\n \n const apiUrl = (window as any).__SITE_KIT_API_URL__\n const apiKey = (window as any).__SITE_KIT_API_KEY__\n \n if (!apiUrl || !apiKey) {\n if (debug) console.error('[Forms] Missing API URL or API key')\n return\n }\n \n const now = Date.now()\n \n // Record time for final step\n const finalStepTime = Math.floor((now - stepStartTimeRef.current) / 1000)\n stepTimesRef.current[currentStepRef.current] = finalStepTime\n \n try {\n // Complete form analytics tracking\n // Note: A database trigger will automatically log this as a conversion\n // in analytics_conversions when completed_at is set\n const response = await sonorFetch(\n `${apiUrl}/api/public/forms/analytics/complete`,\n {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify({\n analyticsId: analyticsIdRef.current,\n totalSteps,\n stepTimes: stepTimesRef.current,\n totalTimeSeconds: Math.floor((now - startTimeRef.current) / 1000),\n }),\n },\n { apiKey, retries: 0 },\n )\n \n if (!response.ok) {\n throw new Error(`HTTP ${response.status}: ${response.statusText}`)\n }\n \n if (debug) console.log('[Forms] Form completed')\n\n // No client-side conversion POST: the Sonor API records the canonical\n // form_submission conversion (analytics_conversions + session flag)\n // when the submission lands at /api/public/forms/submit. The old POST\n // here sent this hook's form-tracking uuid as `sessionId`, which\n // matched no analytics session and double-counted the conversion.\n } catch (error) {\n if (debug) console.error('[Forms] Error completing tracking:', error)\n }\n }, [enabled, totalSteps, formId, debug])\n \n return {\n trackStepChange,\n trackComplete,\n sessionId: sessionIdRef.current,\n }\n}\n\n// Helper\nfunction getDeviceType(): 'desktop' | 'mobile' | 'tablet' {\n if (typeof window === 'undefined') return 'desktop'\n const ua = navigator.userAgent\n if (/tablet|ipad|playbook|silk/i.test(ua)) return 'tablet'\n if (/mobile|iphone|ipod|android|blackberry|opera mini|iemobile/i.test(ua)) return 'mobile'\n return 'desktop'\n}\n\n","/**\n * @sonordev/site-kit/forms - useForm Hook\n * \n * Headless hook for complete control over form rendering.\n * Fetches form config from API, handles validation, state, and submission.\n * \n * @example\n * ```tsx\n * const { form, fields, values, errors, setFieldValue, submit, isSubmitting } = useForm('contact-form')\n * \n * return (\n * <form onSubmit={(e) => { e.preventDefault(); submit() }}>\n * {fields.map(field => (\n * <MyCustomInput\n * key={field.slug}\n * label={field.label}\n * value={values[field.slug]}\n * error={errors[field.slug]}\n * onChange={(val) => setFieldValue(field.slug, val)}\n * />\n * ))}\n * <button type=\"submit\" disabled={isSubmitting}>Submit</button>\n * </form>\n * )\n * ```\n */\n\n'use client'\n\nimport { useState, useEffect, useCallback, useMemo, useRef } from 'react'\nimport { useFormTracking } from './useFormTracking'\n// Shared with StaticForm — the server shell and this client path MUST agree\n// on field order, step count and success copy or the enhancement swap jumps.\nimport { normalizeFormConfig } from './normalize-config'\nimport { sonorFetch } from '../shared/sonorFetch'\nimport { submitForm } from './submitForm'\nimport type { \n ManagedFormConfig, \n FormField, \n FormSubmission \n} from './types'\nimport { DEFAULT_FORM_SUCCESS_MESSAGE } from './defaultSuccessMessage'\n\n// ============================================\n// Types\n// ============================================\n\nexport interface UseFormOptions {\n /** Project ID (defaults to SiteKitLayout config) */\n projectId?: string\n /** Callback when form submits successfully */\n onSuccess?: (submission: FormSubmission) => void\n /** Callback when submission fails */\n onError?: (error: Error) => void\n /** Initial values to prefill */\n initialValues?: Record<string, unknown>\n /** Auto-redirect after success (override form config) */\n redirectUrl?: string | false\n /**\n * Server-fetched form payload (from `getFormConfig` in\n * `@sonordev/site-kit/forms/server`). When provided, the fields render on\n * the first client render — no config fetch, no \"Loading form...\" flash.\n * Accepts the RAW API payload; normalized here exactly like a client fetch.\n */\n initialForm?: Record<string, unknown> | null\n}\n\n\nexport interface UseFormReturn {\n /** Form configuration (null while loading) */\n form: ManagedFormConfig | null\n /** Loading state */\n isLoading: boolean\n /** Error fetching form */\n fetchError: Error | null\n /** Human-readable error from the last submit attempt (null when none) */\n submitError: string | null\n\n /** All form fields */\n allFields: FormField[]\n /** Fields for current step (multi-step) or all fields (single step) */\n fields: FormField[]\n /** Visible fields only (respecting conditional logic) */\n visibleFields: FormField[]\n \n /** Current form values */\n values: Record<string, unknown>\n /** Current validation errors */\n errors: Record<string, string>\n \n /** Set a single field value */\n setFieldValue: (key: string, value: unknown) => void\n /** Set multiple field values at once */\n setValues: (values: Record<string, unknown>) => void\n /** Clear all errors */\n clearErrors: () => void\n \n /** Multi-step state */\n step: number\n totalSteps: number\n isMultiStep: boolean\n progress: number\n \n /** Multi-step navigation */\n nextStep: () => boolean\n prevStep: () => void\n goToStep: (step: number) => void\n canGoNext: boolean\n canGoPrev: boolean\n isLastStep: boolean\n \n /** Validate current step */\n validate: () => boolean\n /** Validate a single field */\n validateField: (field: FormField) => string | null\n /** Check if a field is visible (conditional logic) */\n isFieldVisible: (field: FormField) => boolean\n \n /** Submit the form */\n submit: () => Promise<void>\n /** Submission state */\n isSubmitting: boolean\n isComplete: boolean\n /** Reset form to initial state */\n reset: () => void\n}\n\n// ============================================\n// Hook\n// ============================================\n\nexport function useForm(\n formIdOrSlug: string,\n options: UseFormOptions = {}\n): UseFormReturn {\n const {\n projectId: optionsProjectId,\n onSuccess,\n onError,\n initialValues = {},\n redirectUrl,\n initialForm,\n } = options\n\n // Get projectId from window globals if not provided\n const projectId = optionsProjectId ||\n (typeof window !== 'undefined' ? (window as any).__SITE_KIT_PROJECT_ID__ : undefined)\n\n // State — a server-provided config renders fields on the very first pass\n // (lazy initializer, so normalization runs once, and SSR + hydration agree).\n const [form, setForm] = useState<ManagedFormConfig | null>(() =>\n initialForm ? normalizeFormConfig(initialForm) : null,\n )\n const [isLoading, setIsLoading] = useState(!initialForm)\n const [fetchError, setFetchError] = useState<Error | null>(null)\n const [values, setValuesState] = useState<Record<string, unknown>>(() => {\n if (!initialForm) return initialValues\n const defaults: Record<string, unknown> = {}\n for (const field of (initialForm as any).fields || []) {\n if (field.default_value !== undefined && field.default_value !== null) {\n defaults[field.slug] = field.default_value\n }\n }\n return { ...defaults, ...initialValues }\n })\n const [errors, setErrors] = useState<Record<string, string>>({})\n const [step, setStep] = useState(1)\n const [isSubmitting, setIsSubmitting] = useState(false)\n const [isComplete, setIsComplete] = useState(false)\n const [submitError, setSubmitError] = useState<string | null>(null)\n\n // Synchronous re-entrancy guard + anti-bot timing.\n const isSubmittingRef = useRef(false)\n const formLoadedAt = useRef(Date.now())\n\n const totalSteps = form?.total_steps || 1\n const isMultiStep = (form?.is_multi_step) || false\n \n const { trackStepChange, trackComplete } = useFormTracking({\n formId: form?.id || '',\n totalSteps,\n })\n \n // Fetch form config (project is derived from API key on the backend; projectId is optional)\n useEffect(() => {\n // Server already provided the config — the recaptcha site key still needs\n // publishing to the window global, then there is nothing to fetch. Only\n // honored when it matches the requested form, so a slug change after\n // mount still refetches instead of pinning the stale config.\n const initialMatches =\n initialForm &&\n ((initialForm as any).slug === formIdOrSlug || (initialForm as any).id === formIdOrSlug)\n if (initialMatches) {\n const siteKey = (initialForm as any).recaptcha_site_key\n if (typeof window !== 'undefined' && siteKey) {\n ;(window as any).__SITE_KIT_RECAPTCHA_SITE_KEY__ = siteKey\n }\n return\n }\n\n const apiUrl = typeof window !== 'undefined'\n ? (window as any).__SITE_KIT_API_URL__ || 'https://api.sonor.io'\n : 'https://api.sonor.io'\n\n async function fetchForm() {\n try {\n setIsLoading(true)\n setFetchError(null)\n\n // The provider sets __SITE_KIT_API_KEY__ during its render; if this\n // hook's effect happens to run first, poll briefly for it rather than\n // failing permanently and wedging the form on \"API key is required\".\n const readApiKey = (): string | undefined =>\n typeof window !== 'undefined' ? (window as any).__SITE_KIT_API_KEY__ : undefined\n let apiKey = readApiKey()\n for (let i = 0; i < 15 && !apiKey; i++) {\n await new Promise((r) => setTimeout(r, 100))\n apiKey = readApiKey()\n }\n if (!apiKey) {\n throw new Error('API key is required. Provide it via SiteKitLayout or set SONOR_API_KEY.')\n }\n\n const url = `${apiUrl}/api/public/forms/config`\n const init: RequestInit = {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n },\n body: JSON.stringify({\n formIdOrSlug: formIdOrSlug,\n }),\n }\n\n // Pass the credential via options.apiKey, NOT an Authorization header.\n // extractApiKey() server-side prefers Authorization: Bearer over x-api-key,\n // so a hand-set Bearer pins the stale build-time seed and defeats\n // sonorFetch's refresh — the seed 401s and the refresh-retry keeps\n // re-sending the same dead Bearer. Letting sonorFetch own x-api-key means\n // the server sees the FRESH token.\n const response = await sonorFetch(url, init, { apiKey, retries: 3, timeoutMs: 15000 })\n\n if (!response.ok) {\n throw new Error(`Failed to fetch form: ${response.statusText}`)\n }\n \n const data = await response.json()\n if (!data) throw new Error('Form not found')\n\n if (typeof window !== 'undefined' && data.recaptcha_site_key) {\n ;(window as any).__SITE_KIT_RECAPTCHA_SITE_KEY__ = data.recaptcha_site_key\n }\n\n setForm(normalizeFormConfig(data))\n \n // Set default values from field configs\n const defaults: Record<string, unknown> = {}\n for (const field of data.fields || []) {\n if (field.default_value !== undefined && field.default_value !== null) {\n defaults[field.slug] = field.default_value\n }\n }\n setValuesState({ ...defaults, ...initialValues })\n \n } catch (err) {\n setFetchError(err as Error)\n } finally {\n setIsLoading(false)\n }\n }\n \n fetchForm()\n // initialForm intentionally captured once — server config for THIS render\n // of THIS form; a changed slug refetches, a re-created object must not.\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [formIdOrSlug, projectId])\n \n // All fields\n const allFields = useMemo(() => form?.fields || [], [form])\n \n // Fields for current step\n const fields = useMemo(() => {\n if (!isMultiStep) return allFields\n \n const currentStepConfig = form?.steps?.find(s => s.step_number === step)\n if (!currentStepConfig) return allFields\n \n return allFields.filter(f => f.step_id === currentStepConfig.id)\n }, [form, step, allFields, isMultiStep])\n \n // Check if field is visible (conditional logic)\n const isFieldVisible = useCallback((field: FormField): boolean => {\n if (!field.conditional?.show_when) return true\n \n const { field: condField, operator, value } = field.conditional.show_when\n const fieldValue = values[condField]\n \n switch (operator) {\n case 'equals':\n return fieldValue === value\n case 'not_equals':\n return fieldValue !== value\n case 'contains':\n return String(fieldValue || '').includes(String(value))\n case 'not_contains':\n return !String(fieldValue || '').includes(String(value))\n case 'is_empty':\n return !fieldValue || fieldValue === ''\n case 'not_empty':\n return !!fieldValue && fieldValue !== ''\n case 'greater_than':\n return Number(fieldValue) > Number(value)\n case 'less_than':\n return Number(fieldValue) < Number(value)\n default:\n return true\n }\n }, [values])\n \n // Visible fields only\n const visibleFields = useMemo(() => {\n return fields.filter(isFieldVisible)\n }, [fields, isFieldVisible])\n \n // Validate a single field\n const validateField = useCallback((field: FormField): string | null => {\n if (!isFieldVisible(field)) return null\n // Skip display-only field types\n if (['heading', 'section_header', 'paragraph', 'hidden'].includes(field.field_type)) return null\n\n const value = values[field.slug]\n const rules = field.validation || {}\n \n // Required check\n if (field.is_required && (!value || value === '')) {\n return rules.custom_error || `${field.label} is required`\n }\n \n if (!value) return null\n \n const strValue = String(value)\n \n // Length checks\n if (rules.min_length && strValue.length < rules.min_length) {\n return `${field.label} must be at least ${rules.min_length} characters`\n }\n if (rules.max_length && strValue.length > rules.max_length) {\n return `${field.label} must be no more than ${rules.max_length} characters`\n }\n \n // Numeric checks\n if (rules.min !== undefined && Number(value) < rules.min) {\n return `${field.label} must be at least ${rules.min}`\n }\n if (rules.max !== undefined && Number(value) > rules.max) {\n return `${field.label} must be no more than ${rules.max}`\n }\n \n // Pattern check — guard against an invalid admin-entered pattern.\n if (rules.pattern) {\n try {\n if (!new RegExp(rules.pattern).test(strValue)) {\n return rules.custom_error || `${field.label} is invalid`\n }\n } catch {\n // Malformed pattern — skip rather than crashing the form.\n }\n }\n \n // Email check\n if (field.field_type === 'email' && !/^[^\\s@]+@[^\\s@]+\\.[^\\s@]+$/.test(strValue)) {\n return 'Please enter a valid email address'\n }\n \n // Phone check\n if (field.field_type === 'phone' && !/^[\\d\\s\\-\\+\\(\\)]+$/.test(strValue)) {\n return 'Please enter a valid phone number'\n }\n \n return null\n }, [values, isFieldVisible])\n \n // Validate current step\n const validate = useCallback((): boolean => {\n const newErrors: Record<string, string> = {}\n \n for (const field of fields) {\n const error = validateField(field)\n if (error) {\n newErrors[field.slug] = error\n }\n }\n \n setErrors(newErrors)\n return Object.keys(newErrors).length === 0\n }, [fields, validateField])\n\n // Validate EVERY field across all steps — used on final submit so a required\n // field left empty on an earlier step cannot slip through.\n const validateAll = useCallback((): boolean => {\n const newErrors: Record<string, string> = {}\n for (const field of allFields) {\n const error = validateField(field)\n if (error) newErrors[field.slug] = error\n }\n setErrors(newErrors)\n return Object.keys(newErrors).length === 0\n }, [allFields, validateField])\n\n // Visible field values only — never submit a value from a conditionally-hidden field.\n const buildVisibleValues = useCallback((): Record<string, unknown> => {\n const out: Record<string, unknown> = {}\n for (const field of allFields) {\n if (!isFieldVisible(field)) continue\n if (field.slug in values) out[field.slug] = values[field.slug]\n }\n return out\n }, [allFields, values, isFieldVisible])\n\n // Set single field value\n const setFieldValue = useCallback((key: string, value: unknown) => {\n setValuesState(prev => ({ ...prev, [key]: value }))\n // Clear error when field changes\n setErrors(prev => {\n if (prev[key]) {\n const next = { ...prev }\n delete next[key]\n return next\n }\n return prev\n })\n }, [])\n \n // Set multiple values\n const setValues = useCallback((newValues: Record<string, unknown>) => {\n setValuesState(prev => ({ ...prev, ...newValues }))\n }, [])\n \n // Clear all errors\n const clearErrors = useCallback(() => {\n setErrors({})\n }, [])\n \n // Step navigation\n const canGoNext = step < totalSteps\n const canGoPrev = step > 1\n const isLastStep = step === totalSteps\n const progress = Math.round((step / totalSteps) * 100)\n \n const nextStep = useCallback((): boolean => {\n if (!validate()) return false\n \n if (step < totalSteps) {\n const newStep = step + 1\n setStep(newStep)\n trackStepChange(newStep)\n return true\n }\n return false\n }, [step, totalSteps, validate, trackStepChange])\n \n const prevStep = useCallback(() => {\n if (step > 1) {\n const newStep = step - 1\n setStep(newStep)\n trackStepChange(newStep)\n }\n }, [step, trackStepChange])\n \n const goToStep = useCallback((targetStep: number) => {\n if (targetStep >= 1 && targetStep <= totalSteps) {\n setStep(targetStep)\n trackStepChange(targetStep)\n }\n }, [totalSteps, trackStepChange])\n \n // Submit form\n const submit = useCallback(async () => {\n if (!form) return\n // Re-entrancy guard — blocks a concurrent double-submit in the same tick.\n if (isSubmittingRef.current) return\n if (!validateAll()) return\n\n isSubmittingRef.current = true\n setIsSubmitting(true)\n setSubmitError(null)\n\n try {\n const data = await submitForm({\n config: form,\n values: buildVisibleValues(),\n honeypotValue: '',\n formLoadedAt: formLoadedAt.current,\n })\n\n trackComplete()\n setIsComplete(true)\n onSuccess?.(data as FormSubmission)\n\n const finalRedirect = redirectUrl !== false\n ? (redirectUrl || form.redirect_url)\n : undefined\n if (finalRedirect) {\n window.location.href = finalRedirect\n }\n } catch (error) {\n console.error('[useForm] Submission error:', error)\n setSubmitError('Something went wrong sending your submission. Please try again.')\n onError?.(error as Error)\n } finally {\n isSubmittingRef.current = false\n setIsSubmitting(false)\n }\n }, [form, validateAll, buildVisibleValues, trackComplete, onSuccess, onError, redirectUrl])\n \n // Reset form\n const reset = useCallback(() => {\n setValuesState(initialValues)\n setErrors({})\n setStep(1)\n setIsComplete(false)\n setSubmitError(null)\n }, [initialValues])\n \n return {\n form,\n isLoading,\n fetchError,\n submitError,\n\n allFields,\n fields,\n visibleFields,\n \n values,\n errors,\n setFieldValue,\n setValues,\n clearErrors,\n \n step,\n totalSteps,\n isMultiStep,\n progress,\n \n nextStep,\n prevStep,\n goToStep,\n canGoNext,\n canGoPrev,\n isLastStep,\n \n validate,\n validateField,\n isFieldVisible,\n \n submit,\n isSubmitting,\n isComplete,\n reset,\n }\n}\n"]}
@@ -1,6 +1,6 @@
1
1
  'use client';
2
- import { useForm } from './chunk-CTZHLX2B.mjs';
3
- import { sonorFetch } from './chunk-5GPFPMDQ.mjs';
2
+ import { useForm } from './chunk-7JES77WC.mjs';
3
+ import { sonorFetch } from './chunk-UDHQNYBD.mjs';
4
4
  import { useState, useRef, useEffect, useCallback } from 'react';
5
5
  import ReactMarkdown from 'react-markdown';
6
6
  import { jsxs, jsx, Fragment } from 'react/jsx-runtime';
@@ -584,7 +584,7 @@ function ChatWidget({ projectId: propProjectId, config, apiUrl: propApiUrl, sign
584
584
  socketRef.current.disconnect();
585
585
  socketRef.current = null;
586
586
  }
587
- const { createSocket } = await import('./socket-loader-JHNN2QK4.mjs');
587
+ const { createSocket } = await import('./socket-loader-JA2DI2RT.mjs');
588
588
  const namespaceUrl = `${baseUrl.replace(/\/$/, "")}/engage/chat`;
589
589
  const socket = await createSocket(namespaceUrl, {
590
590
  query: { projectId, visitorId, sessionId: currentSessionId },
@@ -1605,5 +1605,5 @@ function ChatWidget({ projectId: propProjectId, config, apiUrl: propApiUrl, sign
1605
1605
  }
1606
1606
 
1607
1607
  export { ChatWidget };
1608
- //# sourceMappingURL=chunk-DG34TZ6T.mjs.map
1609
- //# sourceMappingURL=chunk-DG34TZ6T.mjs.map
1608
+ //# sourceMappingURL=chunk-A4E6EOU4.mjs.map
1609
+ //# sourceMappingURL=chunk-A4E6EOU4.mjs.map