@sonordev/site-kit 5.4.0 → 5.5.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 (318) hide show
  1. package/AGENTS.md +16 -6
  2. package/README.md +9 -7
  3. package/agent-manifest.json +7 -7
  4. package/dist/AnalyticsProvider-KFXAH4GR.mjs +11 -0
  5. package/dist/{AnalyticsProvider-2XIOMRCN.mjs.map → AnalyticsProvider-KFXAH4GR.mjs.map} +1 -1
  6. package/dist/AnalyticsProvider-WDDW3IJW.js +32 -0
  7. package/dist/{AnalyticsProvider-Y2P2BPOI.js.map → AnalyticsProvider-WDDW3IJW.js.map} +1 -1
  8. package/dist/{BlogViewTracker-6EGEDPP3.js → BlogViewTracker-D4DIEP4Q.js} +6 -6
  9. package/dist/{BlogViewTracker-6EGEDPP3.js.map → BlogViewTracker-D4DIEP4Q.js.map} +1 -1
  10. package/dist/{BlogViewTracker-R4YQ76WP.mjs → BlogViewTracker-ZVEGGH3Y.mjs} +5 -5
  11. package/dist/{BlogViewTracker-R4YQ76WP.mjs.map → BlogViewTracker-ZVEGGH3Y.mjs.map} +1 -1
  12. package/dist/ChatWidget-2ZYPYIMQ.js +22 -0
  13. package/dist/{ChatWidget-2OFWPCWF.js.map → ChatWidget-2ZYPYIMQ.js.map} +1 -1
  14. package/dist/ChatWidget-FYCCLMQE.mjs +13 -0
  15. package/dist/{ChatWidget-4AOGHYXQ.mjs.map → ChatWidget-FYCCLMQE.mjs.map} +1 -1
  16. package/dist/EngageWidget-6HUZYOY7.mjs +11 -0
  17. package/dist/{EngageWidget-SFO2XRNG.mjs.map → EngageWidget-6HUZYOY7.mjs.map} +1 -1
  18. package/dist/EngageWidget-MYQTBBW6.js +20 -0
  19. package/dist/{EngageWidget-T4KAAD3G.js.map → EngageWidget-MYQTBBW6.js.map} +1 -1
  20. package/dist/{FileField-CE2XNBBG.js → FileField-JK2S24XU.js} +6 -6
  21. package/dist/{FileField-CE2XNBBG.js.map → FileField-JK2S24XU.js.map} +1 -1
  22. package/dist/{FileField-7DF2SLPF.mjs → FileField-OZZHWGPA.mjs} +5 -5
  23. package/dist/{FileField-7DF2SLPF.mjs.map → FileField-OZZHWGPA.mjs.map} +1 -1
  24. package/dist/{FormSpotlight-ZD3WR5BC.js → FormSpotlight-5AXFQU5M.js} +15 -15
  25. package/dist/{FormSpotlight-ZD3WR5BC.js.map → FormSpotlight-5AXFQU5M.js.map} +1 -1
  26. package/dist/{FormSpotlight-IRLKSZGV.mjs → FormSpotlight-XV42L72H.mjs} +3 -3
  27. package/dist/{FormSpotlight-IRLKSZGV.mjs.map → FormSpotlight-XV42L72H.mjs.map} +1 -1
  28. package/dist/{FormStage-OSPXOUQE.js → FormStage-HATUHNRV.js} +13 -13
  29. package/dist/{FormStage-OSPXOUQE.js.map → FormStage-HATUHNRV.js.map} +1 -1
  30. package/dist/{FormStage-2OSRNQJL.mjs → FormStage-RUK675HV.mjs} +3 -3
  31. package/dist/{FormStage-2OSRNQJL.mjs.map → FormStage-RUK675HV.mjs.map} +1 -1
  32. package/dist/ManagedForm-JWEXJEXK.js +23 -0
  33. package/dist/{ManagedForm-JCHGBBQW.js.map → ManagedForm-JWEXJEXK.js.map} +1 -1
  34. package/dist/ManagedForm-OA3MNGXT.mjs +14 -0
  35. package/dist/{ManagedForm-5G37EDJT.mjs.map → ManagedForm-OA3MNGXT.mjs.map} +1 -1
  36. package/dist/{ManagedNewsletterForm-4LVJZROZ.js → ManagedNewsletterForm-AAHH63KT.js} +8 -8
  37. package/dist/{ManagedNewsletterForm-4LVJZROZ.js.map → ManagedNewsletterForm-AAHH63KT.js.map} +1 -1
  38. package/dist/{ManagedNewsletterForm-QJSVH23S.mjs → ManagedNewsletterForm-HZKTNWLW.mjs} +7 -7
  39. package/dist/{ManagedNewsletterForm-QJSVH23S.mjs.map → ManagedNewsletterForm-HZKTNWLW.mjs.map} +1 -1
  40. package/dist/{SignalCore-L6Z3YTCF.mjs → SignalCore-X3GDGBZD.mjs} +5 -5
  41. package/dist/{SignalCore-L6Z3YTCF.mjs.map → SignalCore-X3GDGBZD.mjs.map} +1 -1
  42. package/dist/{SignalCore-NQ4YEOI7.js → SignalCore-YSNZYBKJ.js} +11 -11
  43. package/dist/{SignalCore-NQ4YEOI7.js.map → SignalCore-YSNZYBKJ.js.map} +1 -1
  44. package/dist/SitemapSync-2PTDBH5E.mjs +9 -0
  45. package/dist/{SitemapSync-MYSTLJOM.mjs.map → SitemapSync-2PTDBH5E.mjs.map} +1 -1
  46. package/dist/SitemapSync-3SFAI546.js +18 -0
  47. package/dist/{SitemapSync-3LUZWBTB.js.map → SitemapSync-3SFAI546.js.map} +1 -1
  48. package/dist/analytics/dispatch.d.ts +4 -4
  49. package/dist/analytics/index.js +15 -15
  50. package/dist/analytics/index.mjs +6 -6
  51. package/dist/{api-NTHZ6PAW.mjs → api-D745LGGU.mjs} +3 -3
  52. package/dist/api-D745LGGU.mjs.map +1 -0
  53. package/dist/{api-N5OLQXYN.js → api-XR5APCH3.js} +3 -3
  54. package/dist/api-XR5APCH3.js.map +1 -0
  55. package/dist/blog/index.js +20 -20
  56. package/dist/blog/index.mjs +3 -3
  57. package/dist/blog/server-ui.js +14 -14
  58. package/dist/blog/server-ui.mjs +2 -2
  59. package/dist/{chunk-WSUQ76LN.js → chunk-2CMSWJWC.js} +18 -18
  60. package/dist/{chunk-WSUQ76LN.js.map → chunk-2CMSWJWC.js.map} +1 -1
  61. package/dist/{chunk-QWLL3B6U.js → chunk-2OU4KBUN.js} +26 -23
  62. package/dist/chunk-2OU4KBUN.js.map +1 -0
  63. package/dist/{chunk-A2VLEORI.mjs → chunk-3B6CXGAK.mjs} +3 -3
  64. package/dist/{chunk-A2VLEORI.mjs.map → chunk-3B6CXGAK.mjs.map} +1 -1
  65. package/dist/{chunk-HMFFAUCD.js → chunk-3DWIYCQX.js} +2 -2
  66. package/dist/chunk-3DWIYCQX.js.map +1 -0
  67. package/dist/{chunk-3EPMDPWI.js → chunk-3SDMJMN2.js} +5 -5
  68. package/dist/{chunk-3EPMDPWI.js.map → chunk-3SDMJMN2.js.map} +1 -1
  69. package/dist/chunk-4U5NCKQY.mjs +39 -0
  70. package/dist/chunk-4U5NCKQY.mjs.map +1 -0
  71. package/dist/{chunk-I4PDSDVE.mjs → chunk-4XGACM7D.mjs} +3 -3
  72. package/dist/{chunk-I4PDSDVE.mjs.map → chunk-4XGACM7D.mjs.map} +1 -1
  73. package/dist/{chunk-HDDV63XJ.mjs → chunk-5TGAUWNO.mjs} +3 -3
  74. package/dist/{chunk-HDDV63XJ.mjs.map → chunk-5TGAUWNO.mjs.map} +1 -1
  75. package/dist/{chunk-RO55G3OA.mjs → chunk-64BOVMXG.mjs} +3 -3
  76. package/dist/{chunk-RO55G3OA.mjs.map → chunk-64BOVMXG.mjs.map} +1 -1
  77. package/dist/{chunk-JJ26JKBJ.mjs → chunk-7PPNXORV.mjs} +3 -3
  78. package/dist/{chunk-JJ26JKBJ.mjs.map → chunk-7PPNXORV.mjs.map} +1 -1
  79. package/dist/{chunk-LHYVFWHL.js → chunk-A3F5GRNJ.js} +8 -8
  80. package/dist/{chunk-LHYVFWHL.js.map → chunk-A3F5GRNJ.js.map} +1 -1
  81. package/dist/{chunk-SZHKNGNR.mjs → chunk-AEARU24Q.mjs} +40 -26
  82. package/dist/chunk-AEARU24Q.mjs.map +1 -0
  83. package/dist/{chunk-HBMF3M5F.js → chunk-BNOQXDPJ.js} +4 -4
  84. package/dist/{chunk-HBMF3M5F.js.map → chunk-BNOQXDPJ.js.map} +1 -1
  85. package/dist/{chunk-5737U6DI.js → chunk-CT5REGAK.js} +15 -15
  86. package/dist/{chunk-5737U6DI.js.map → chunk-CT5REGAK.js.map} +1 -1
  87. package/dist/{chunk-HH5KGXTK.mjs → chunk-DRLHQQBH.mjs} +4 -4
  88. package/dist/{chunk-HH5KGXTK.mjs.map → chunk-DRLHQQBH.mjs.map} +1 -1
  89. package/dist/{chunk-UOLY4NXK.mjs → chunk-DYULWKDC.mjs} +4 -4
  90. package/dist/{chunk-UOLY4NXK.mjs.map → chunk-DYULWKDC.mjs.map} +1 -1
  91. package/dist/chunk-ESP5RMB7.js +42 -0
  92. package/dist/chunk-ESP5RMB7.js.map +1 -0
  93. package/dist/{chunk-LF4L3ZP5.js → chunk-FF5N5D3D.js} +8 -8
  94. package/dist/{chunk-LF4L3ZP5.js.map → chunk-FF5N5D3D.js.map} +1 -1
  95. package/dist/{chunk-ITFZZ6YT.js → chunk-FYVLQ3OU.js} +3 -3
  96. package/dist/{chunk-ITFZZ6YT.js.map → chunk-FYVLQ3OU.js.map} +1 -1
  97. package/dist/{chunk-N6X76QUF.mjs → chunk-G5HUI4BO.mjs} +3 -3
  98. package/dist/{chunk-N6X76QUF.mjs.map → chunk-G5HUI4BO.mjs.map} +1 -1
  99. package/dist/chunk-G6WF4G3E.js +43 -0
  100. package/dist/chunk-G6WF4G3E.js.map +1 -0
  101. package/dist/{chunk-DQM5GR2P.mjs → chunk-HBI67P7Y.mjs} +4 -4
  102. package/dist/{chunk-DQM5GR2P.mjs.map → chunk-HBI67P7Y.mjs.map} +1 -1
  103. package/dist/{chunk-VA36CJRV.js → chunk-HFJQMIFM.js} +4 -4
  104. package/dist/{chunk-VA36CJRV.js.map → chunk-HFJQMIFM.js.map} +1 -1
  105. package/dist/{chunk-VWDT7H6L.js → chunk-HX3BRMOX.js} +3 -3
  106. package/dist/{chunk-VWDT7H6L.js.map → chunk-HX3BRMOX.js.map} +1 -1
  107. package/dist/{chunk-3TXX5KIN.js → chunk-JNRHTZL4.js} +2 -2
  108. package/dist/{chunk-3TXX5KIN.js.map → chunk-JNRHTZL4.js.map} +1 -1
  109. package/dist/{chunk-U53KN4SA.js → chunk-KAUUGRYB.js} +5 -5
  110. package/dist/{chunk-U53KN4SA.js.map → chunk-KAUUGRYB.js.map} +1 -1
  111. package/dist/{chunk-L2LJQIM3.js → chunk-KPKQKFT4.js} +11 -11
  112. package/dist/chunk-KPKQKFT4.js.map +1 -0
  113. package/dist/{chunk-ZLPXFV5Y.js → chunk-MCJF2KJ6.js} +5 -5
  114. package/dist/{chunk-ZLPXFV5Y.js.map → chunk-MCJF2KJ6.js.map} +1 -1
  115. package/dist/{chunk-URVGBWCP.js → chunk-MNYM2XU4.js} +4 -4
  116. package/dist/{chunk-URVGBWCP.js.map → chunk-MNYM2XU4.js.map} +1 -1
  117. package/dist/{chunk-ACTLQ2RH.mjs → chunk-MU7IEPDG.mjs} +4 -4
  118. package/dist/chunk-MU7IEPDG.mjs.map +1 -0
  119. package/dist/chunk-NSWO43XW.mjs +39 -0
  120. package/dist/chunk-NSWO43XW.mjs.map +1 -0
  121. package/dist/{chunk-KMGGAL2X.js → chunk-NZSFOZJV.js} +40 -26
  122. package/dist/chunk-NZSFOZJV.js.map +1 -0
  123. package/dist/{chunk-MIFP6QEQ.mjs → chunk-OFSA7LUH.mjs} +4 -4
  124. package/dist/{chunk-MIFP6QEQ.mjs.map → chunk-OFSA7LUH.mjs.map} +1 -1
  125. package/dist/{chunk-2KIGFOPM.js → chunk-PIPLBBDH.js} +8 -8
  126. package/dist/{chunk-2KIGFOPM.js.map → chunk-PIPLBBDH.js.map} +1 -1
  127. package/dist/{chunk-7PLH3H3W.js → chunk-Q26VZNM2.js} +3 -3
  128. package/dist/{chunk-7PLH3H3W.js.map → chunk-Q26VZNM2.js.map} +1 -1
  129. package/dist/{chunk-GQ6CUOLA.js → chunk-QEGUI2Q2.js} +15 -15
  130. package/dist/{chunk-GQ6CUOLA.js.map → chunk-QEGUI2Q2.js.map} +1 -1
  131. package/dist/{chunk-LBS4PRC7.js → chunk-QFNSM77X.js} +3 -3
  132. package/dist/{chunk-LBS4PRC7.js.map → chunk-QFNSM77X.js.map} +1 -1
  133. package/dist/{chunk-MTANHZKJ.mjs → chunk-R4MX6EOM.mjs} +7 -7
  134. package/dist/{chunk-MTANHZKJ.mjs.map → chunk-R4MX6EOM.mjs.map} +1 -1
  135. package/dist/{chunk-LIYSLNEK.mjs → chunk-RMMHWSPP.mjs} +3 -3
  136. package/dist/{chunk-LIYSLNEK.mjs.map → chunk-RMMHWSPP.mjs.map} +1 -1
  137. package/dist/{chunk-B4BFQSSS.mjs → chunk-RU54J2PY.mjs} +4 -4
  138. package/dist/chunk-RU54J2PY.mjs.map +1 -0
  139. package/dist/{chunk-SJXGIUHP.mjs → chunk-RZUZMUTN.mjs} +9 -8
  140. package/dist/chunk-RZUZMUTN.mjs.map +1 -0
  141. package/dist/{chunk-N6AVWMIB.mjs → chunk-S6FEC6UT.mjs} +9 -5
  142. package/dist/chunk-S6FEC6UT.mjs.map +1 -0
  143. package/dist/{chunk-3DPXOZAU.mjs → chunk-SHLWA6JY.mjs} +2 -2
  144. package/dist/chunk-SHLWA6JY.mjs.map +1 -0
  145. package/dist/{chunk-7IPSQ5JR.js → chunk-SQVYLIIN.js} +11 -7
  146. package/dist/chunk-SQVYLIIN.js.map +1 -0
  147. package/dist/chunk-SUZ3ZLB2.js +8 -0
  148. package/dist/{chunk-UTOHMK52.js.map → chunk-SUZ3ZLB2.js.map} +1 -1
  149. package/dist/{chunk-7Y2UPFSY.mjs → chunk-TALEV3IH.mjs} +3 -3
  150. package/dist/{chunk-7Y2UPFSY.mjs.map → chunk-TALEV3IH.mjs.map} +1 -1
  151. package/dist/{chunk-UOTXSWKZ.mjs → chunk-TP7H6BSK.mjs} +2 -2
  152. package/dist/{chunk-UOTXSWKZ.mjs.map → chunk-TP7H6BSK.mjs.map} +1 -1
  153. package/dist/{chunk-XWF7QPIP.mjs → chunk-TX2QQ7IX.mjs} +3 -3
  154. package/dist/{chunk-XWF7QPIP.mjs.map → chunk-TX2QQ7IX.mjs.map} +1 -1
  155. package/dist/{chunk-AWFZIXCT.js → chunk-UNPEMSLK.js} +12 -11
  156. package/dist/chunk-UNPEMSLK.js.map +1 -0
  157. package/dist/{chunk-NUH245XK.mjs → chunk-UZL2QU2V.mjs} +16 -13
  158. package/dist/chunk-UZL2QU2V.mjs.map +1 -0
  159. package/dist/{chunk-G5I3XEQS.mjs → chunk-V6NOM7PJ.mjs} +3 -3
  160. package/dist/{chunk-G5I3XEQS.mjs.map → chunk-V6NOM7PJ.mjs.map} +1 -1
  161. package/dist/{chunk-ZY5AVC4P.js → chunk-VAS3LH5W.js} +10 -10
  162. package/dist/{chunk-ZY5AVC4P.js.map → chunk-VAS3LH5W.js.map} +1 -1
  163. package/dist/{chunk-KQ3VAOAF.mjs → chunk-VYHRAICF.mjs} +4 -4
  164. package/dist/{chunk-KQ3VAOAF.mjs.map → chunk-VYHRAICF.mjs.map} +1 -1
  165. package/dist/{chunk-LUYUFILE.js → chunk-W5NVW23S.js} +4 -4
  166. package/dist/{chunk-LUYUFILE.js.map → chunk-W5NVW23S.js.map} +1 -1
  167. package/dist/chunk-WDBCXRTT.mjs +6 -0
  168. package/dist/{chunk-7U7C6XRI.mjs.map → chunk-WDBCXRTT.mjs.map} +1 -1
  169. package/dist/{chunk-6CUBSQMD.mjs → chunk-WIZRCI6J.mjs} +3 -3
  170. package/dist/{chunk-6CUBSQMD.mjs.map → chunk-WIZRCI6J.mjs.map} +1 -1
  171. package/dist/{chunk-EBMPXFOP.mjs → chunk-X2XFLYZ3.mjs} +3 -3
  172. package/dist/{chunk-EBMPXFOP.mjs.map → chunk-X2XFLYZ3.mjs.map} +1 -1
  173. package/dist/{chunk-B36PTS7B.mjs → chunk-XQYC4KMH.mjs} +3 -3
  174. package/dist/{chunk-B36PTS7B.mjs.map → chunk-XQYC4KMH.mjs.map} +1 -1
  175. package/dist/{chunk-DPDV5Z4G.js → chunk-YNC5D3FT.js} +12 -12
  176. package/dist/{chunk-DPDV5Z4G.js.map → chunk-YNC5D3FT.js.map} +1 -1
  177. package/dist/{chunk-4WQB2ORG.js → chunk-YYAFHIY7.js} +15 -15
  178. package/dist/chunk-YYAFHIY7.js.map +1 -0
  179. package/dist/{chunk-OXZYP32B.js → chunk-Z6S4MWSR.js} +7 -7
  180. package/dist/{chunk-OXZYP32B.js.map → chunk-Z6S4MWSR.js.map} +1 -1
  181. package/dist/{chunk-ZDFVYSKK.mjs → chunk-ZRQFG3L6.mjs} +5 -5
  182. package/dist/{chunk-ZDFVYSKK.mjs.map → chunk-ZRQFG3L6.mjs.map} +1 -1
  183. package/dist/cli/agent/checks.d.ts.map +1 -1
  184. package/dist/cli/agent/ssr-bailout.d.ts +27 -0
  185. package/dist/cli/agent/ssr-bailout.d.ts.map +1 -0
  186. package/dist/cli/agent/ssr-bailout.test.d.ts +2 -0
  187. package/dist/cli/agent/ssr-bailout.test.d.ts.map +1 -0
  188. package/dist/cli/codemod/transforms.d.ts.map +1 -1
  189. package/dist/cli/index.js +38 -51
  190. package/dist/cli/index.js.map +1 -1
  191. package/dist/cli/index.mjs +36 -49
  192. package/dist/cli/index.mjs.map +1 -1
  193. package/dist/cli/migrator/index.d.ts.map +1 -1
  194. package/dist/client/index.d.ts +1 -0
  195. package/dist/client/index.d.ts.map +1 -1
  196. package/dist/client/index.js +20 -7
  197. package/dist/client/index.js.map +1 -1
  198. package/dist/client/index.mjs +5 -4
  199. package/dist/client/index.mjs.map +1 -1
  200. package/dist/cms/index.js.map +1 -1
  201. package/dist/cms/index.mjs.map +1 -1
  202. package/dist/cms/sanity-image.d.ts +1 -1
  203. package/dist/commerce/index.js +58 -58
  204. package/dist/commerce/index.mjs +7 -7
  205. package/dist/engage/ChatWidget.d.ts.map +1 -1
  206. package/dist/engage/EngageWidget.d.ts +3 -4
  207. package/dist/engage/EngageWidget.d.ts.map +1 -1
  208. package/dist/engage/chat-launcher.test.d.ts +2 -0
  209. package/dist/engage/chat-launcher.test.d.ts.map +1 -0
  210. package/dist/engage/index.js +12 -10
  211. package/dist/engage/index.js.map +1 -1
  212. package/dist/engage/index.mjs +9 -7
  213. package/dist/engage/index.mjs.map +1 -1
  214. package/dist/engage/launcher-placement.d.ts +56 -0
  215. package/dist/engage/launcher-placement.d.ts.map +1 -0
  216. package/dist/engage/launcher-placement.test.d.ts +2 -0
  217. package/dist/engage/launcher-placement.test.d.ts.map +1 -0
  218. package/dist/engage/types.d.ts +41 -7
  219. package/dist/engage/types.d.ts.map +1 -1
  220. package/dist/fleet/index.js +8 -8
  221. package/dist/fleet/index.mjs +4 -4
  222. package/dist/forms/index.js +16 -16
  223. package/dist/forms/index.mjs +9 -9
  224. package/dist/forms/server.js +10 -10
  225. package/dist/forms/server.mjs +8 -8
  226. package/dist/forms/static.js +7 -7
  227. package/dist/forms/static.mjs +6 -6
  228. package/dist/images/ManagedImage.d.ts.map +1 -1
  229. package/dist/images/index.js +11 -11
  230. package/dist/images/index.mjs +4 -4
  231. package/dist/index.js +65 -65
  232. package/dist/index.mjs +11 -11
  233. package/dist/layout/SiteKitClientProviders.d.ts.map +1 -1
  234. package/dist/layout/client.d.ts.map +1 -1
  235. package/dist/layout/client.js +8 -8
  236. package/dist/layout/client.mjs +7 -7
  237. package/dist/layout/index.js +10 -10
  238. package/dist/layout/index.mjs +8 -8
  239. package/dist/layout/types.d.ts +7 -3
  240. package/dist/layout/types.d.ts.map +1 -1
  241. package/dist/llms/generateLLMsTxt.d.ts.map +1 -1
  242. package/dist/llms/index.js +12 -12
  243. package/dist/llms/index.mjs +2 -2
  244. package/dist/llms/types.d.ts +7 -1
  245. package/dist/llms/types.d.ts.map +1 -1
  246. package/dist/maps/index.js +5 -5
  247. package/dist/maps/index.mjs +3 -3
  248. package/dist/mcp/WebMcpTools.d.ts +5 -2
  249. package/dist/mcp/WebMcpTools.d.ts.map +1 -1
  250. package/dist/mcp/client.js.map +1 -1
  251. package/dist/mcp/client.mjs.map +1 -1
  252. package/dist/search/index.js +4 -4
  253. package/dist/search/index.mjs +3 -3
  254. package/dist/seo/LocationPageContent.d.ts +6 -5
  255. package/dist/seo/LocationPageContent.d.ts.map +1 -1
  256. package/dist/seo/api.d.ts +4 -5
  257. package/dist/seo/api.d.ts.map +1 -1
  258. package/dist/seo/client.js +5 -5
  259. package/dist/seo/client.mjs +4 -4
  260. package/dist/seo/index.js +42 -42
  261. package/dist/seo/index.js.map +1 -1
  262. package/dist/seo/index.mjs +8 -8
  263. package/dist/seo/index.mjs.map +1 -1
  264. package/dist/seo/routing.d.ts +9 -23
  265. package/dist/seo/routing.d.ts.map +1 -1
  266. package/dist/seo/server-api.d.ts +11 -5
  267. package/dist/seo/server-api.d.ts.map +1 -1
  268. package/dist/seo/server.js +18 -18
  269. package/dist/seo/server.mjs +2 -2
  270. package/dist/server/index.js +3 -3
  271. package/dist/server/index.mjs +2 -2
  272. package/dist/{server-api-HW4PL2L2.mjs → server-api-RG3ZL3DV.mjs} +3 -3
  273. package/dist/{server-api-HW4PL2L2.mjs.map → server-api-RG3ZL3DV.mjs.map} +1 -1
  274. package/dist/{server-api-DB2SIUP4.js → server-api-RYJQAUGO.js} +21 -21
  275. package/dist/{server-api-DB2SIUP4.js.map → server-api-RYJQAUGO.js.map} +1 -1
  276. package/dist/shared/version.d.ts +1 -1
  277. package/dist/shared/visual-viewport-gap.d.ts +52 -0
  278. package/dist/shared/visual-viewport-gap.d.ts.map +1 -0
  279. package/dist/shared/visual-viewport-gap.test.d.ts +2 -0
  280. package/dist/shared/visual-viewport-gap.test.d.ts.map +1 -0
  281. package/dist/signal/index.js +11 -11
  282. package/dist/signal/index.mjs +2 -2
  283. package/dist/sitemap/index.js +2 -2
  284. package/dist/sitemap/index.mjs +1 -1
  285. package/dist/sync/index.js +17 -17
  286. package/dist/sync/index.mjs +4 -4
  287. package/dist/types.d.ts +9 -0
  288. package/dist/types.d.ts.map +1 -1
  289. package/package.json +1 -1
  290. package/skills/site-kit/SKILL.md +8 -3
  291. package/dist/AnalyticsProvider-2XIOMRCN.mjs +0 -11
  292. package/dist/AnalyticsProvider-Y2P2BPOI.js +0 -32
  293. package/dist/ChatWidget-2OFWPCWF.js +0 -20
  294. package/dist/ChatWidget-4AOGHYXQ.mjs +0 -11
  295. package/dist/EngageWidget-SFO2XRNG.mjs +0 -9
  296. package/dist/EngageWidget-T4KAAD3G.js +0 -18
  297. package/dist/ManagedForm-5G37EDJT.mjs +0 -14
  298. package/dist/ManagedForm-JCHGBBQW.js +0 -23
  299. package/dist/SitemapSync-3LUZWBTB.js +0 -18
  300. package/dist/SitemapSync-MYSTLJOM.mjs +0 -9
  301. package/dist/api-N5OLQXYN.js.map +0 -1
  302. package/dist/api-NTHZ6PAW.mjs.map +0 -1
  303. package/dist/chunk-3DPXOZAU.mjs.map +0 -1
  304. package/dist/chunk-4WQB2ORG.js.map +0 -1
  305. package/dist/chunk-7IPSQ5JR.js.map +0 -1
  306. package/dist/chunk-7U7C6XRI.mjs +0 -6
  307. package/dist/chunk-ACTLQ2RH.mjs.map +0 -1
  308. package/dist/chunk-AWFZIXCT.js.map +0 -1
  309. package/dist/chunk-B4BFQSSS.mjs.map +0 -1
  310. package/dist/chunk-HMFFAUCD.js.map +0 -1
  311. package/dist/chunk-KMGGAL2X.js.map +0 -1
  312. package/dist/chunk-L2LJQIM3.js.map +0 -1
  313. package/dist/chunk-N6AVWMIB.mjs.map +0 -1
  314. package/dist/chunk-NUH245XK.mjs.map +0 -1
  315. package/dist/chunk-QWLL3B6U.js.map +0 -1
  316. package/dist/chunk-SJXGIUHP.mjs.map +0 -1
  317. package/dist/chunk-SZHKNGNR.mjs.map +0 -1
  318. package/dist/chunk-UTOHMK52.js +0 -8
@@ -1,6 +1,6 @@
1
1
  'use strict';
2
2
 
3
- var chunkVWDT7H6L_js = require('../chunk-VWDT7H6L.js');
3
+ var chunkHX3BRMOX_js = require('../chunk-HX3BRMOX.js');
4
4
  require('../chunk-HX6ZG3PP.js');
5
5
  var chunk746RKQHA_js = require('../chunk-746RKQHA.js');
6
6
  var chunkYQTE32QK_js = require('../chunk-YQTE32QK.js');
@@ -152,8 +152,8 @@ async function ClusterLandingPage({
152
152
  /* @__PURE__ */ jsxRuntime.jsx("h2", { className: unstyled ? "" : "sk-cluster-pillar-title", children: pillar.title }),
153
153
  pillar.excerpt && /* @__PURE__ */ jsxRuntime.jsx("p", { className: unstyled ? "" : "sk-cluster-pillar-excerpt", children: pillar.excerpt }),
154
154
  /* @__PURE__ */ jsxRuntime.jsxs("div", { className: unstyled ? "" : "sk-cluster-pillar-meta", children: [
155
- chunkVWDT7H6L_js.readingTimeMinutes(pillar) && /* @__PURE__ */ jsxRuntime.jsxs("span", { children: [
156
- chunkVWDT7H6L_js.readingTimeMinutes(pillar),
155
+ chunkHX3BRMOX_js.readingTimeMinutes(pillar) && /* @__PURE__ */ jsxRuntime.jsxs("span", { children: [
156
+ chunkHX3BRMOX_js.readingTimeMinutes(pillar),
157
157
  " min read"
158
158
  ] }),
159
159
  pillar.word_count && /* @__PURE__ */ jsxRuntime.jsxs("span", { children: [
@@ -177,8 +177,8 @@ async function ClusterLandingPage({
177
177
  /* @__PURE__ */ jsxRuntime.jsx("h3", { className: unstyled ? "" : "sk-cluster-support-title", children: post.title }),
178
178
  post.excerpt && /* @__PURE__ */ jsxRuntime.jsx("p", { className: unstyled ? "" : "sk-cluster-support-excerpt", children: post.excerpt }),
179
179
  /* @__PURE__ */ jsxRuntime.jsxs("div", { className: unstyled ? "" : "sk-cluster-support-meta", children: [
180
- chunkVWDT7H6L_js.readingTimeMinutes(post) && /* @__PURE__ */ jsxRuntime.jsxs("span", { children: [
181
- chunkVWDT7H6L_js.readingTimeMinutes(post),
180
+ chunkHX3BRMOX_js.readingTimeMinutes(post) && /* @__PURE__ */ jsxRuntime.jsxs("span", { children: [
181
+ chunkHX3BRMOX_js.readingTimeMinutes(post),
182
182
  " min read"
183
183
  ] }),
184
184
  post.relationship_to_pillar && /* @__PURE__ */ jsxRuntime.jsx("span", { children: post.relationship_to_pillar })
@@ -194,39 +194,39 @@ async function ClusterLandingPage({
194
194
 
195
195
  Object.defineProperty(exports, "BlogLayout", {
196
196
  enumerable: true,
197
- get: function () { return chunkVWDT7H6L_js.BlogLayout; }
197
+ get: function () { return chunkHX3BRMOX_js.BlogLayout; }
198
198
  });
199
199
  Object.defineProperty(exports, "BlogList", {
200
200
  enumerable: true,
201
- get: function () { return chunkVWDT7H6L_js.BlogList; }
201
+ get: function () { return chunkHX3BRMOX_js.BlogList; }
202
202
  });
203
203
  Object.defineProperty(exports, "BlogPage", {
204
204
  enumerable: true,
205
- get: function () { return chunkVWDT7H6L_js.BlogPage; }
205
+ get: function () { return chunkHX3BRMOX_js.BlogPage; }
206
206
  });
207
207
  Object.defineProperty(exports, "BlogPost", {
208
208
  enumerable: true,
209
- get: function () { return chunkVWDT7H6L_js.BlogPost; }
209
+ get: function () { return chunkHX3BRMOX_js.BlogPost; }
210
210
  });
211
211
  Object.defineProperty(exports, "BlogPostPage", {
212
212
  enumerable: true,
213
- get: function () { return chunkVWDT7H6L_js.BlogPostPage; }
213
+ get: function () { return chunkHX3BRMOX_js.BlogPostPage; }
214
214
  });
215
215
  Object.defineProperty(exports, "BlogSidebar", {
216
216
  enumerable: true,
217
- get: function () { return chunkVWDT7H6L_js.BlogSidebar; }
217
+ get: function () { return chunkHX3BRMOX_js.BlogSidebar; }
218
218
  });
219
219
  Object.defineProperty(exports, "CategoryPage", {
220
220
  enumerable: true,
221
- get: function () { return chunkVWDT7H6L_js.CategoryPage; }
221
+ get: function () { return chunkHX3BRMOX_js.CategoryPage; }
222
222
  });
223
223
  Object.defineProperty(exports, "ClusterNavigation", {
224
224
  enumerable: true,
225
- get: function () { return chunkVWDT7H6L_js.ClusterNavigation; }
225
+ get: function () { return chunkHX3BRMOX_js.ClusterNavigation; }
226
226
  });
227
227
  Object.defineProperty(exports, "RelatedPosts", {
228
228
  enumerable: true,
229
- get: function () { return chunkVWDT7H6L_js.RelatedPosts; }
229
+ get: function () { return chunkHX3BRMOX_js.RelatedPosts; }
230
230
  });
231
231
  Object.defineProperty(exports, "blogTableCss", {
232
232
  enumerable: true,
@@ -1,5 +1,5 @@
1
- import { readingTimeMinutes } from '../chunk-LIYSLNEK.mjs';
2
- export { BlogLayout, BlogList, BlogPage, BlogPost, BlogPostPage, BlogSidebar, CategoryPage, ClusterNavigation, RelatedPosts } from '../chunk-LIYSLNEK.mjs';
1
+ import { readingTimeMinutes } from '../chunk-RMMHWSPP.mjs';
2
+ export { BlogLayout, BlogList, BlogPage, BlogPost, BlogPostPage, BlogSidebar, CategoryPage, ClusterNavigation, RelatedPosts } from '../chunk-RMMHWSPP.mjs';
3
3
  import '../chunk-YFX3Q56O.mjs';
4
4
  import { getTopicCluster } from '../chunk-EEQYKMGH.mjs';
5
5
  export { blogTableCss, wrapBlogTables } from '../chunk-GHECYDSZ.mjs';
@@ -1,11 +1,11 @@
1
1
  'use client';
2
2
  'use strict';
3
3
 
4
- var chunk7PLH3H3W_js = require('./chunk-7PLH3H3W.js');
5
- var chunkLUYUFILE_js = require('./chunk-LUYUFILE.js');
4
+ var chunkQ26VZNM2_js = require('./chunk-Q26VZNM2.js');
5
+ var chunkW5NVW23S_js = require('./chunk-W5NVW23S.js');
6
6
  var chunkIPV2TUAT_js = require('./chunk-IPV2TUAT.js');
7
- var chunkDPDV5Z4G_js = require('./chunk-DPDV5Z4G.js');
8
- var chunkHBMF3M5F_js = require('./chunk-HBMF3M5F.js');
7
+ var chunkYNC5D3FT_js = require('./chunk-YNC5D3FT.js');
8
+ var chunkBNOQXDPJ_js = require('./chunk-BNOQXDPJ.js');
9
9
  var chunkKHPJ3CEL_js = require('./chunk-KHPJ3CEL.js');
10
10
  var react = require('react');
11
11
  var jsxRuntime = require('react/jsx-runtime');
@@ -40,12 +40,12 @@ function FormClient({
40
40
  const honeypotFieldName = config.honeypot_field || chunkKHPJ3CEL_js.DEFAULT_HONEYPOT_FIELD;
41
41
  const formLoadedAt = react.useRef(Date.now());
42
42
  const isSubmittingRef = react.useRef(false);
43
- const stageBeatCount = react.useMemo(() => chunk7PLH3H3W_js.countStageViews(config), [config]);
44
- const questionCount = react.useMemo(() => chunk7PLH3H3W_js.countStageQuestions(config), [config]);
43
+ const stageBeatCount = react.useMemo(() => chunkQ26VZNM2_js.countStageViews(config), [config]);
44
+ const questionCount = react.useMemo(() => chunkQ26VZNM2_js.countStageQuestions(config), [config]);
45
45
  const requested = experience ?? (config.layout === "stage" ? "stage" : config.layout === "classic" ? "classic" : "spotlight");
46
46
  const resolvedExperience = !customRender && questionCount > 0 && requested !== "classic" ? requested : "classic";
47
- const fieldControls = chunk7PLH3H3W_js.useFieldControls(config.fields);
48
- const { trackStepChange, trackComplete } = chunkDPDV5Z4G_js.useFormTracking({
47
+ const fieldControls = chunkQ26VZNM2_js.useFieldControls(config.fields);
48
+ const { trackStepChange, trackComplete } = chunkYNC5D3FT_js.useFormTracking({
49
49
  formId: config.id,
50
50
  // Alternate experiences report their unit (beat / field index) as the
51
51
  // step — form_analytics becomes a drop-off funnel with zero API changes.
@@ -70,7 +70,7 @@ function FormClient({
70
70
  return;
71
71
  }
72
72
  let cancelled = false;
73
- const load = resolvedExperience === "stage" ? import('./FormStage-OSPXOUQE.js').then((m) => m.FormStage) : import('./FormSpotlight-ZD3WR5BC.js').then((m) => m.FormSpotlight);
73
+ const load = resolvedExperience === "stage" ? import('./FormStage-HATUHNRV.js').then((m) => m.FormStage) : import('./FormSpotlight-5AXFQU5M.js').then((m) => m.FormSpotlight);
74
74
  load.then((Component) => {
75
75
  if (!cancelled) setExperience(() => Component);
76
76
  }).catch((err) => {
@@ -255,7 +255,7 @@ function FormClient({
255
255
  setIsSubmitting(true);
256
256
  setSubmitError(null);
257
257
  try {
258
- const data = await chunkHBMF3M5F_js.submitForm({
258
+ const data = await chunkBNOQXDPJ_js.submitForm({
259
259
  config,
260
260
  values: buildVisibleValues(),
261
261
  honeypotValue: config.honeypot_enabled ? honeypotValue : "",
@@ -311,7 +311,7 @@ function FormClient({
311
311
  };
312
312
  if (isComplete) {
313
313
  const raw = config.success_message;
314
- const message = typeof raw === "string" && raw.trim().length > 0 ? raw.trim() : chunkHBMF3M5F_js.DEFAULT_FORM_SUCCESS_MESSAGE;
314
+ const message = typeof raw === "string" && raw.trim().length > 0 ? raw.trim() : chunkBNOQXDPJ_js.DEFAULT_FORM_SUCCESS_MESSAGE;
315
315
  if (Celebration) return /* @__PURE__ */ jsxRuntime.jsx(Celebration, { message, className });
316
316
  return /* @__PURE__ */ jsxRuntime.jsx("div", { className, "data-sk-part": "celebration-fallback", role: "status", children: /* @__PURE__ */ jsxRuntime.jsx("p", { children: message }) });
317
317
  }
@@ -336,7 +336,7 @@ function FormClient({
336
336
  submit,
337
337
  trackStepChange,
338
338
  honeypot: config.honeypot_enabled ? /* @__PURE__ */ jsxRuntime.jsx(
339
- chunkLUYUFILE_js.HoneypotField,
339
+ chunkW5NVW23S_js.HoneypotField,
340
340
  {
341
341
  name: honeypotFieldName,
342
342
  value: honeypotValue,
@@ -355,7 +355,7 @@ function FormClient({
355
355
  "data-sk-state": isSubmitting ? "submitting" : "idle",
356
356
  "data-sk-ready": momentum.total > 0 && momentum.done >= momentum.total && step >= config.total_steps ? "true" : void 0,
357
357
  className: `sk-form ${className || ""}`,
358
- ...chunkLUYUFILE_js.nativeFormProps(config),
358
+ ...chunkW5NVW23S_js.nativeFormProps(config),
359
359
  onSubmit: (e) => {
360
360
  e.preventDefault();
361
361
  if (step < config.total_steps) {
@@ -450,14 +450,14 @@ function FormClient({
450
450
  }
451
451
  ),
452
452
  config.honeypot_enabled && /* @__PURE__ */ jsxRuntime.jsx(
453
- chunkLUYUFILE_js.HoneypotField,
453
+ chunkW5NVW23S_js.HoneypotField,
454
454
  {
455
455
  name: honeypotFieldName,
456
456
  value: honeypotValue,
457
457
  onChange: setHoneypotValue
458
458
  }
459
459
  ),
460
- /* @__PURE__ */ jsxRuntime.jsx(chunkLUYUFILE_js.NativeFallbackFields, { config, returnTo: nativeReturnTo })
460
+ /* @__PURE__ */ jsxRuntime.jsx(chunkW5NVW23S_js.NativeFallbackFields, { config, returnTo: nativeReturnTo })
461
461
  ]
462
462
  }
463
463
  );
@@ -478,7 +478,7 @@ function ManagedForm({
478
478
  form,
479
479
  isLoading,
480
480
  fetchError
481
- } = chunkDPDV5Z4G_js.useForm(formId, {
481
+ } = chunkYNC5D3FT_js.useForm(formId, {
482
482
  projectId,
483
483
  onSuccess,
484
484
  onError,
@@ -517,5 +517,5 @@ function ManagedForm({
517
517
 
518
518
  exports.FormClient = FormClient;
519
519
  exports.ManagedForm = ManagedForm;
520
- //# sourceMappingURL=chunk-WSUQ76LN.js.map
521
- //# sourceMappingURL=chunk-WSUQ76LN.js.map
520
+ //# sourceMappingURL=chunk-2CMSWJWC.js.map
521
+ //# sourceMappingURL=chunk-2CMSWJWC.js.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/forms/FormClient.tsx","../src/forms/ManagedForm.tsx"],"names":["useState","DEFAULT_HONEYPOT_FIELD","useRef","useMemo","countStageViews","countStageQuestions","useFieldControls","useFormTracking","useEffect","currentStepConfig","useCallback","submitForm","DEFAULT_FORM_SUCCESS_MESSAGE","jsx","Fragment","HoneypotField","jsxs","DelightStyles","nativeFormProps","FormMomentum","FormField","NativeFallbackFields","useForm"],"mappings":"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","file":"chunk-WSUQ76LN.js","sourcesContent":["/**\n * @sonordev/site-kit/forms - Form Client Component\n * \n * Handles form state, validation, and submission\n */\n\n'use client'\n\nimport React, { useState, useCallback, useMemo, useRef, useEffect } from 'react'\nimport { useFormTracking } from './useFormTracking'\nimport { FormField } from './FormField'\nimport { submitForm, DEFAULT_HONEYPOT_FIELD } from './submitForm'\nimport type { \n ManagedFormConfig, \n FormField as FormFieldType, \n FormRenderProps,\n FormSubmission,\n} from './types'\nimport { DEFAULT_FORM_SUCCESS_MESSAGE } from './defaultSuccessMessage'\nimport { DelightStyles, FormMomentum } from './delight'\nimport { HoneypotField } from './HoneypotField'\nimport { useFieldControls } from './field-controls'\nimport { nativeFormProps, NativeFallbackFields } from './native-fallback'\nimport { countStageViews, countStageQuestions } from './experience-plan'\nimport type { ExperienceRenderProps, FormExperience } from './types'\n\ninterface FormClientProps {\n config: ManagedFormConfig\n className?: string\n onSuccess?: (submission: FormSubmission) => void\n onError?: (error: Error) => void\n customRender?: (props: FormRenderProps) => React.ReactNode\n /**\n * Pre-fill field values by slug. For context the page already has and the\n * visitor should not retype: an email captured earlier in a conversation,\n * the service they were reading about, an estimate the assistant just\n * produced. Applied ON TOP of each field's configured default_value.\n *\n * Unknown slugs are ignored, so a stale key cannot break the form.\n */\n defaultValues?: Record<string, unknown>\n /**\n * Which rendering the form gets. Defaults to the form's `layout` config\n * (`layout: 'stage'` in Sonor flips a form to stage with no site deploy),\n * else 'classic'. customRender always wins over this.\n */\n experience?: FormExperience\n /** Absolute page URL for the no-JS 303 to land on (see native-fallback). */\n nativeReturnTo?: string\n}\n\nexport function FormClient({\n config,\n className,\n onSuccess,\n onError,\n customRender,\n experience,\n nativeReturnTo,\n defaultValues,\n}: FormClientProps) {\n // Seed default_value fields once (lazy initializer — config is stable for\n // the life of this mount; ManagedForm only renders us once it has a form).\n const [values, setValues] = useState<Record<string, unknown>>(() => {\n const defaults: Record<string, unknown> = {}\n for (const field of config.fields || []) {\n if (field.default_value !== undefined && field.default_value !== null) {\n defaults[field.slug] = field.default_value\n }\n }\n // Caller-supplied values win over the form's configured defaults — they\n // are per-visitor context (what Echo already knows about this person,\n // the service they were reading about) rather than form configuration.\n return { ...defaults, ...(defaultValues || {}) }\n })\n const [errors, setErrors] = useState<Record<string, string>>({})\n const [step, setStep] = useState(1)\n // Direction of the last step change, so the transition slides the way the\n // user is travelling ('forward' on Next, 'back' on Back).\n const [stepDirection, setStepDirection] = useState<'forward' | 'back'>('forward')\n const [isSubmitting, setIsSubmitting] = useState(false)\n const [isComplete, setIsComplete] = useState(false)\n const [submitError, setSubmitError] = useState<string | null>(null)\n const [honeypotValue, setHoneypotValue] = useState('')\n // Fields the user has interacted with — the valid tick only appears after\n // real input (never on pristine fields), so it reads as earned feedback.\n const [touched, setTouched] = useState<Record<string, boolean>>({})\n const honeypotFieldName = config.honeypot_field || DEFAULT_HONEYPOT_FIELD\n\n // Anti-bot: record when form first rendered (bots submit in < 3 seconds)\n const formLoadedAt = useRef(Date.now())\n // Synchronous guard against a concurrent double-submit (Enter + click, etc.).\n const isSubmittingRef = useRef(false)\n\n // Resolve the experience: explicit prop > form config > SPOTLIGHT.\n //\n // Spotlight is the 4.0 default: every managed form converses back unless it\n // opts out. Opting out is `experience=\"classic\"` on the component or\n // `layout: 'classic'` in Sonor (forms are data, so either side can decide\n // with no deploy from the other). customRender always wins, and a form with\n // no answerable fields has nothing to perform, so it falls back to classic.\n const stageBeatCount = useMemo(() => countStageViews(config), [config])\n const questionCount = useMemo(() => countStageQuestions(config), [config])\n const requested: FormExperience =\n experience ??\n (config.layout === 'stage'\n ? 'stage'\n : config.layout === 'classic'\n ? 'classic'\n : 'spotlight')\n const resolvedExperience: FormExperience =\n !customRender && questionCount > 0 && requested !== 'classic'\n ? requested\n : 'classic'\n\n // Date/file controls are fetched only when the form actually has such a\n // field — most forms have neither, and the date picker alone was ~5 KB\n // gzipped in every forms bundle. Until a chunk lands (and for SSR/no-JS),\n // FormField renders the native control, which submits the same value.\n const fieldControls = useFieldControls(config.fields)\n\n const { trackStepChange, trackComplete } = useFormTracking({\n formId: config.id,\n // Alternate experiences report their unit (beat / field index) as the\n // step — form_analytics becomes a drop-off funnel with zero API changes.\n totalSteps:\n resolvedExperience === 'stage'\n ? stageBeatCount\n : resolvedExperience === 'spotlight'\n ? questionCount\n : config.total_steps,\n })\n\n // The celebration is fetched as soon as the user starts submitting, so the\n // chunk arrives during the network round-trip and the payoff still feels\n // instant — without putting its markup and CSS in every form's bundle.\n const [Celebration, setCelebration] =\n useState<React.ComponentType<{ message: string; className?: string }> | null>(null)\n useEffect(() => {\n if (!isSubmitting && !isComplete) return\n let cancelled = false\n import('./FormCelebration')\n .then((m) => {\n if (!cancelled) setCelebration(() => m.FormCelebration)\n })\n .catch(() => {\n // Stays null — the plain confirmation message renders instead.\n })\n return () => {\n cancelled = true\n }\n }, [isSubmitting, isComplete])\n\n // Experience components load on demand, so a classic form (the fleet\n // default) never downloads stage/spotlight code or their stylesheets.\n // Until the chunk lands — and for SSR and no-JS — the CLASSIC form renders:\n // a complete, working, submittable form. The experience is progressive\n // enhancement layered on top, never a prerequisite for capturing the lead.\n const [Experience, setExperience] =\n useState<React.ComponentType<ExperienceRenderProps> | null>(null)\n useEffect(() => {\n if (resolvedExperience === 'classic') {\n setExperience(null)\n return\n }\n let cancelled = false\n const load =\n resolvedExperience === 'stage'\n ? import('./FormStage').then((m) => m.FormStage)\n : import('./FormSpotlight').then((m) => m.FormSpotlight)\n load\n .then((Component) => {\n // setState with a component value needs the updater form, or React\n // would call it as a lazy initializer.\n if (!cancelled) setExperience(() => Component)\n })\n .catch((err) => {\n // Chunk failed (offline, cache miss, CDN hiccup): stay on classic.\n console.error('[Forms] Experience failed to load; using classic form:', err)\n })\n return () => {\n cancelled = true\n }\n }, [resolvedExperience])\n \n // Get fields for current step\n const currentFields = useMemo(() => {\n if (!config.is_multi_step) {\n return config.fields || []\n }\n \n const currentStepConfig = config.steps?.find(s => s.step_number === step)\n if (!currentStepConfig) return config.fields || []\n \n return (config.fields || []).filter(f => f.step_id === currentStepConfig.id)\n }, [config, step])\n \n // Check if field is visible (conditional logic)\n const isFieldVisible = useCallback((field: FormFieldType): 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 // Validate field\n const validateField = useCallback((field: FormFieldType): 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 whole form render.\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 // Delight: per-field validity for the tick + fields-completed momentum.\n const fieldIsComplete = useCallback((field: FormFieldType): boolean => {\n if (!isFieldVisible(field)) return false\n if (['heading', 'section_header', 'paragraph', 'hidden'].includes(field.field_type)) return false\n const value = values[field.slug]\n if (value === undefined || value === null || value === '') return false\n return validateField(field) === null\n }, [values, isFieldVisible, validateField])\n\n const momentum = useMemo(() => {\n const measurable = (config.fields || []).filter(\n f => f.is_required && isFieldVisible(f) && !['heading', 'section_header', 'paragraph', 'hidden'].includes(f.field_type),\n )\n return { done: measurable.filter(fieldIsComplete).length, total: measurable.length }\n }, [config, isFieldVisible, fieldIsComplete])\n\n // Validate current step\n const validateStep = useCallback((): boolean => {\n const newErrors: Record<string, string> = {}\n \n for (const field of currentFields) {\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 }, [currentFields, 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. Returns the first\n // step containing an error so the user can be taken straight to it.\n const validateAll = useCallback((): { ok: boolean; firstErrorStep: number | null } => {\n const allFields = config.fields || []\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 if (Object.keys(newErrors).length === 0) return { ok: true, firstErrorStep: null }\n\n let firstErrorStep: number | null = null\n if (config.is_multi_step && config.steps) {\n const ordered = [...config.steps].sort((a, b) => a.step_number - b.step_number)\n for (const s of ordered) {\n if (allFields.some((f) => f.step_id === s.id && newErrors[f.slug])) {\n firstErrorStep = s.step_number\n break\n }\n }\n }\n return { ok: false, firstErrorStep }\n }, [config, validateField])\n\n // Collect values for currently-visible fields only, so a value typed into a\n // field that later became conditionally hidden is never submitted.\n const buildVisibleValues = useCallback((): Record<string, unknown> => {\n const out: Record<string, unknown> = {}\n for (const field of config.fields || []) {\n if (!isFieldVisible(field)) continue\n if (field.slug in values) out[field.slug] = values[field.slug]\n }\n return out\n }, [config, values, isFieldVisible])\n\n // Set field value\n const setFieldValue = useCallback((key: string, value: unknown) => {\n setTouched(prev => (prev[key] ? prev : { ...prev, [key]: true }))\n setValues(prev => ({ ...prev, [key]: value }))\n // Clear error when field changes\n if (errors[key]) {\n setErrors(prev => {\n const next = { ...prev }\n delete next[key]\n return next\n })\n }\n }, [errors])\n \n // Step navigation\n const nextStep = useCallback((): boolean => {\n if (!validateStep()) return false\n \n if (step < config.total_steps) {\n const newStep = step + 1\n setStepDirection('forward')\n setStep(newStep)\n trackStepChange(newStep)\n return true\n }\n return false\n }, [step, config.total_steps, validateStep, trackStepChange])\n\n const prevStep = useCallback(() => {\n if (step > 1) {\n const newStep = step - 1\n setStepDirection('back')\n setStep(newStep)\n trackStepChange(newStep)\n }\n }, [step, trackStepChange])\n\n const goToStep = useCallback((targetStep: number) => {\n if (targetStep >= 1 && targetStep <= config.total_steps) {\n setStepDirection(targetStep < step ? 'back' : 'forward')\n setStep(targetStep)\n trackStepChange(targetStep)\n }\n }, [step, config.total_steps, trackStepChange])\n \n // Submit form\n const submit = useCallback(async () => {\n // Re-entrancy guard — refs update synchronously, so this blocks a second\n // submit fired in the same tick (Enter key + button click, or a double-tap).\n if (isSubmittingRef.current) return\n\n const { ok, firstErrorStep } = validateAll()\n if (!ok) {\n if (firstErrorStep != null) {\n setStepDirection('back')\n setStep(firstErrorStep)\n }\n return\n }\n\n isSubmittingRef.current = true\n setIsSubmitting(true)\n setSubmitError(null)\n\n try {\n const data = await submitForm({\n config,\n values: buildVisibleValues(),\n honeypotValue: config.honeypot_enabled ? honeypotValue : '',\n formLoadedAt: formLoadedAt.current,\n })\n\n trackComplete()\n setIsComplete(true)\n onSuccess?.(data as FormSubmission)\n\n if (config.redirect_url) {\n window.location.href = config.redirect_url\n }\n } catch (error) {\n console.error('[Forms] 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 }, [config, honeypotValue, validateAll, buildVisibleValues, trackComplete, onSuccess, onError])\n \n // Progress percentage\n const progress = useMemo(() => {\n return Math.round((step / config.total_steps) * 100)\n }, [step, config.total_steps])\n\n // Title/description the admin gave the current step, used as the step's\n // conversational heading. Absent for single-step forms.\n const currentStepConfig = useMemo(\n () => config.steps?.find((s) => s.step_number === step),\n [config.steps, step],\n )\n\n // Move focus to the new step's panel so keyboard and screen-reader users land\n // on the fields they just navigated to instead of staying on a button that\n // has moved. Skipped on first render so the form never steals focus on load.\n const stepPanelRef = useRef<HTMLDivElement | null>(null)\n const hasNavigatedRef = useRef(false)\n useEffect(() => {\n if (!config.is_multi_step) return\n if (!hasNavigatedRef.current) {\n hasNavigatedRef.current = true\n return\n }\n stepPanelRef.current?.focus()\n }, [step, config.is_multi_step])\n\n\n // Render props for custom rendering\n const renderProps: FormRenderProps = {\n config,\n fields: currentFields,\n step,\n totalSteps: config.total_steps,\n values,\n errors,\n isSubmitting,\n progress,\n nextStep,\n prevStep,\n goToStep,\n submit,\n setFieldValue,\n isFieldVisible,\n }\n \n // Show success message (fallback when API returns empty / null success_message)\n if (isComplete) {\n const raw = config.success_message\n const message =\n typeof raw === 'string' && raw.trim().length > 0\n ? raw.trim()\n : DEFAULT_FORM_SUCCESS_MESSAGE\n // The payoff moment — celebration, not a receipt. Sites theme it via\n // --sk-primary + data-sk-part; reduced-motion users get the static check.\n // Loaded lazily (it only ever renders AFTER a submit round-trip, so the\n // chunk fetch is free), but the confirmation itself never depends on\n // that chunk: until it lands, and if it never lands, the plain message\n // below is shown. A user must always be told their submission worked.\n if (Celebration) return <Celebration message={message} className={className} />\n return (\n <div className={className} data-sk-part=\"celebration-fallback\" role=\"status\">\n <p>{message}</p>\n </div>\n )\n }\n \n // Custom render\n if (customRender) {\n return <>{customRender(renderProps)}</>\n }\n\n // Alternate experiences — render BRANCHES, not customRenders: this\n // FormClient still owns values/errors/honeypot/submit, so spam defense and\n // validation are identical to classic.\n if (resolvedExperience !== 'classic' && Experience) {\n const bundle: ExperienceRenderProps = {\n config,\n values,\n errors,\n touched,\n isSubmitting,\n submitError,\n momentum,\n className,\n setFieldValue,\n validateField,\n isFieldVisible,\n fieldIsComplete,\n applyFieldError: (slug, message) =>\n setErrors((prev) => ({ ...prev, [slug]: message })),\n submit,\n trackStepChange,\n honeypot: config.honeypot_enabled ? (\n <HoneypotField\n name={honeypotFieldName}\n value={honeypotValue}\n onChange={setHoneypotValue}\n />\n ) : null,\n }\n return (\n <>\n <DelightStyles />\n <Experience {...bundle} />\n </>\n )\n }\n\n // Default render\n return (\n <form data-sk-state={isSubmitting ? 'submitting' : 'idle'}\n // Ready = every required field validates AND the submit button (not\n // \"Next\") is what's showing — the wake-up glow means \"press start\".\n data-sk-ready={\n momentum.total > 0 && momentum.done >= momentum.total && step >= config.total_steps\n ? 'true'\n : undefined\n }\n className={`sk-form ${className || ''}`}\n // No-JS floor: real action/method so the browser can POST without the\n // bundle. With JS the preventDefault below always wins.\n {...nativeFormProps(config)}\n onSubmit={(e) => {\n e.preventDefault()\n if (step < config.total_steps) {\n nextStep()\n } else {\n submit()\n }\n }}\n >\n <DelightStyles />\n <FormMomentum done={momentum.done} total={momentum.total} />\n {/* Step indicator for multi-step */}\n {config.is_multi_step && (\n <div className=\"sk-form__progress\">\n <div className=\"sk-form__progress-header\">\n <span className=\"sk-form__progress-step\">\n Step {step} of {config.total_steps}\n </span>\n {/* The percentage readout is opt-in — \"Step 2 of 4\" already gives\n the user their position, and a bare number reads as pressure. */}\n {config.show_progress && (\n <span className=\"sk-form__progress-percent\">{progress}%</span>\n )}\n </div>\n <div\n className=\"sk-form__progress-track\"\n role=\"progressbar\"\n aria-valuemin={1}\n aria-valuemax={config.total_steps}\n aria-valuenow={step}\n aria-valuetext={`Step ${step} of ${config.total_steps}`}\n >\n <div className=\"sk-form__progress-bar\" style={{ width: `${progress}%` }} />\n </div>\n <ol className=\"sk-form__progress-dots\" aria-hidden=\"true\">\n {Array.from({ length: config.total_steps }, (_, i) => i + 1).map((n) => (\n <li\n key={n}\n className={\n 'sk-form__progress-dot' +\n (n === step ? ' sk-form__progress-dot--current' : '') +\n (n < step ? ' sk-form__progress-dot--done' : '')\n }\n />\n ))}\n </ol>\n </div>\n )}\n\n {/* Fields — keyed by step so each step animates in on navigation */}\n <div\n key={step}\n ref={stepPanelRef}\n tabIndex={-1}\n className={\n 'sk-form__step' +\n (config.is_multi_step ? ` sk-form__step--${stepDirection}` : '')\n }\n >\n {config.is_multi_step && (currentStepConfig?.title || currentStepConfig?.description) && (\n <div className=\"sk-form__step-intro\">\n {currentStepConfig.title && (\n <h3 className=\"sk-form__step-title\">{currentStepConfig.title}</h3>\n )}\n {currentStepConfig.description && (\n <p className=\"sk-form__step-description\">{currentStepConfig.description}</p>\n )}\n </div>\n )}\n\n <div className=\"sk-form__fields\">\n {currentFields.map((field) => {\n if (!isFieldVisible(field)) return null\n\n return (\n <div key={field.id} className={`sk-form__field-wrapper sk-form__field-wrapper--${field.width || 'full'}`}>\n <FormField\n field={field}\n value={values[field.slug]}\n error={errors[field.slug]}\n showValid={!!touched[field.slug] && !errors[field.slug] && fieldIsComplete(field)}\n onChange={(value) => setFieldValue(field.slug, value)}\n controls={fieldControls}\n />\n </div>\n )\n })}\n </div>\n </div>\n\n {/* Navigation buttons */}\n <div\n className=\"sk-form__actions\"\n style={{ justifyContent: step > 1 ? 'space-between' : 'flex-end' }}\n >\n {step > 1 && (\n <button type=\"button\" className=\"sk-form__btn sk-form__btn--back\" onClick={prevStep}>\n Back\n </button>\n )}\n <button type=\"submit\" className=\"sk-form__btn sk-form__btn--submit\" disabled={isSubmitting}>\n {isSubmitting\n ? 'Submitting...'\n : step < config.total_steps\n ? 'Next'\n : config.submit_button_text\n }\n </button>\n </div>\n\n {submitError && (\n <p\n className=\"sk-form__submit-error\"\n role=\"alert\"\n style={{ color: 'var(--sk-error, #dc2626)', fontSize: 14, marginTop: 12 }}\n >\n {submitError}\n </p>\n )}\n\n {/* Honeypot field — shared single source of truth with the stage\n experience (HoneypotField.tsx holds the invariants). */}\n {config.honeypot_enabled && (\n <HoneypotField\n name={honeypotFieldName}\n value={honeypotValue}\n onChange={setHoneypotValue}\n />\n )}\n\n {/* No-JS control fields (_sk_token auth + _sk_return destination). */}\n <NativeFallbackFields config={config} returnTo={nativeReturnTo} />\n </form>\n )\n}\n","/**\n * @sonordev/site-kit/forms - Managed Form Component\n * \n * Fetches form config from Portal API and renders fields with validation\n */\n\n'use client'\n\nimport type { ManagedFormProps } from './types'\nimport { useForm } from './useForm'\nimport { FormClient } from './FormClient'\n\n// ============================================\n// Main Component (Client Component)\n// ============================================\n\nexport function ManagedForm({\n formId,\n projectId,\n className,\n onSuccess,\n onError,\n initialConfig,\n experience,\n nativeReturnTo,\n defaultValues,\n children,\n}: ManagedFormProps) {\n const {\n form,\n isLoading,\n fetchError,\n } = useForm(formId, {\n projectId,\n onSuccess,\n onError,\n initialForm: initialConfig,\n // FormClient below owns this form's tracking — it renders the fields,\n // drives step navigation and runs the submit, so it is the only thing that\n // can report a real funnel. useForm is used here purely to FETCH the\n // config; we never call its submit, so its analytics row could only ever\n // open and abandon, never complete.\n //\n // Leaving this on is the double-count bug fixed in 4.2.2: two\n // trackers per form, two form_analytics rows per page load, every\n // start -> submission rate reported at half its true value.\n trackAnalytics: false,\n })\n \n if (isLoading) {\n return (\n <div className={className}>\n <p style={{ color: '#6b7280' }}>Loading form...</p>\n </div>\n )\n }\n \n if (fetchError || !form) {\n return (\n <div className={className}>\n <p style={{ color: 'var(--sk-error, #dc2626)' }}>\n {fetchError?.message || 'Form not found or inactive.'}\n </p>\n </div>\n )\n }\n \n // Pass to client component for interactivity\n return (\n <FormClient\n config={form}\n className={className}\n onSuccess={onSuccess}\n onError={onError}\n customRender={children}\n experience={experience}\n nativeReturnTo={nativeReturnTo}\n defaultValues={defaultValues}\n />\n )\n}\n\n"]}
1
+ {"version":3,"sources":["../src/forms/FormClient.tsx","../src/forms/ManagedForm.tsx"],"names":["useState","DEFAULT_HONEYPOT_FIELD","useRef","useMemo","countStageViews","countStageQuestions","useFieldControls","useFormTracking","useEffect","currentStepConfig","useCallback","submitForm","DEFAULT_FORM_SUCCESS_MESSAGE","jsx","Fragment","HoneypotField","jsxs","DelightStyles","nativeFormProps","FormMomentum","FormField","NativeFallbackFields","useForm"],"mappings":"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","file":"chunk-2CMSWJWC.js","sourcesContent":["/**\n * @sonordev/site-kit/forms - Form Client Component\n * \n * Handles form state, validation, and submission\n */\n\n'use client'\n\nimport React, { useState, useCallback, useMemo, useRef, useEffect } from 'react'\nimport { useFormTracking } from './useFormTracking'\nimport { FormField } from './FormField'\nimport { submitForm, DEFAULT_HONEYPOT_FIELD } from './submitForm'\nimport type { \n ManagedFormConfig, \n FormField as FormFieldType, \n FormRenderProps,\n FormSubmission,\n} from './types'\nimport { DEFAULT_FORM_SUCCESS_MESSAGE } from './defaultSuccessMessage'\nimport { DelightStyles, FormMomentum } from './delight'\nimport { HoneypotField } from './HoneypotField'\nimport { useFieldControls } from './field-controls'\nimport { nativeFormProps, NativeFallbackFields } from './native-fallback'\nimport { countStageViews, countStageQuestions } from './experience-plan'\nimport type { ExperienceRenderProps, FormExperience } from './types'\n\ninterface FormClientProps {\n config: ManagedFormConfig\n className?: string\n onSuccess?: (submission: FormSubmission) => void\n onError?: (error: Error) => void\n customRender?: (props: FormRenderProps) => React.ReactNode\n /**\n * Pre-fill field values by slug. For context the page already has and the\n * visitor should not retype: an email captured earlier in a conversation,\n * the service they were reading about, an estimate the assistant just\n * produced. Applied ON TOP of each field's configured default_value.\n *\n * Unknown slugs are ignored, so a stale key cannot break the form.\n */\n defaultValues?: Record<string, unknown>\n /**\n * Which rendering the form gets. Defaults to the form's `layout` config\n * (`layout: 'stage'` in Sonor flips a form to stage with no site deploy),\n * else 'classic'. customRender always wins over this.\n */\n experience?: FormExperience\n /** Absolute page URL for the no-JS 303 to land on (see native-fallback). */\n nativeReturnTo?: string\n}\n\nexport function FormClient({\n config,\n className,\n onSuccess,\n onError,\n customRender,\n experience,\n nativeReturnTo,\n defaultValues,\n}: FormClientProps) {\n // Seed default_value fields once (lazy initializer — config is stable for\n // the life of this mount; ManagedForm only renders us once it has a form).\n const [values, setValues] = useState<Record<string, unknown>>(() => {\n const defaults: Record<string, unknown> = {}\n for (const field of config.fields || []) {\n if (field.default_value !== undefined && field.default_value !== null) {\n defaults[field.slug] = field.default_value\n }\n }\n // Caller-supplied values win over the form's configured defaults — they\n // are per-visitor context (what Echo already knows about this person,\n // the service they were reading about) rather than form configuration.\n return { ...defaults, ...(defaultValues || {}) }\n })\n const [errors, setErrors] = useState<Record<string, string>>({})\n const [step, setStep] = useState(1)\n // Direction of the last step change, so the transition slides the way the\n // user is travelling ('forward' on Next, 'back' on Back).\n const [stepDirection, setStepDirection] = useState<'forward' | 'back'>('forward')\n const [isSubmitting, setIsSubmitting] = useState(false)\n const [isComplete, setIsComplete] = useState(false)\n const [submitError, setSubmitError] = useState<string | null>(null)\n const [honeypotValue, setHoneypotValue] = useState('')\n // Fields the user has interacted with — the valid tick only appears after\n // real input (never on pristine fields), so it reads as earned feedback.\n const [touched, setTouched] = useState<Record<string, boolean>>({})\n const honeypotFieldName = config.honeypot_field || DEFAULT_HONEYPOT_FIELD\n\n // Anti-bot: record when form first rendered (bots submit in < 3 seconds)\n const formLoadedAt = useRef(Date.now())\n // Synchronous guard against a concurrent double-submit (Enter + click, etc.).\n const isSubmittingRef = useRef(false)\n\n // Resolve the experience: explicit prop > form config > SPOTLIGHT.\n //\n // Spotlight is the 4.0 default: every managed form converses back unless it\n // opts out. Opting out is `experience=\"classic\"` on the component or\n // `layout: 'classic'` in Sonor (forms are data, so either side can decide\n // with no deploy from the other). customRender always wins, and a form with\n // no answerable fields has nothing to perform, so it falls back to classic.\n const stageBeatCount = useMemo(() => countStageViews(config), [config])\n const questionCount = useMemo(() => countStageQuestions(config), [config])\n const requested: FormExperience =\n experience ??\n (config.layout === 'stage'\n ? 'stage'\n : config.layout === 'classic'\n ? 'classic'\n : 'spotlight')\n const resolvedExperience: FormExperience =\n !customRender && questionCount > 0 && requested !== 'classic'\n ? requested\n : 'classic'\n\n // Date/file controls are fetched only when the form actually has such a\n // field — most forms have neither, and the date picker alone was ~5 KB\n // gzipped in every forms bundle. Until a chunk lands (and for SSR/no-JS),\n // FormField renders the native control, which submits the same value.\n const fieldControls = useFieldControls(config.fields)\n\n const { trackStepChange, trackComplete } = useFormTracking({\n formId: config.id,\n // Alternate experiences report their unit (beat / field index) as the\n // step — form_analytics becomes a drop-off funnel with zero API changes.\n totalSteps:\n resolvedExperience === 'stage'\n ? stageBeatCount\n : resolvedExperience === 'spotlight'\n ? questionCount\n : config.total_steps,\n })\n\n // The celebration is fetched as soon as the user starts submitting, so the\n // chunk arrives during the network round-trip and the payoff still feels\n // instant — without putting its markup and CSS in every form's bundle.\n const [Celebration, setCelebration] =\n useState<React.ComponentType<{ message: string; className?: string }> | null>(null)\n useEffect(() => {\n if (!isSubmitting && !isComplete) return\n let cancelled = false\n import('./FormCelebration')\n .then((m) => {\n if (!cancelled) setCelebration(() => m.FormCelebration)\n })\n .catch(() => {\n // Stays null — the plain confirmation message renders instead.\n })\n return () => {\n cancelled = true\n }\n }, [isSubmitting, isComplete])\n\n // Experience components load on demand, so a classic form (the fleet\n // default) never downloads stage/spotlight code or their stylesheets.\n // Until the chunk lands — and for SSR and no-JS — the CLASSIC form renders:\n // a complete, working, submittable form. The experience is progressive\n // enhancement layered on top, never a prerequisite for capturing the lead.\n const [Experience, setExperience] =\n useState<React.ComponentType<ExperienceRenderProps> | null>(null)\n useEffect(() => {\n if (resolvedExperience === 'classic') {\n setExperience(null)\n return\n }\n let cancelled = false\n const load =\n resolvedExperience === 'stage'\n ? import('./FormStage').then((m) => m.FormStage)\n : import('./FormSpotlight').then((m) => m.FormSpotlight)\n load\n .then((Component) => {\n // setState with a component value needs the updater form, or React\n // would call it as a lazy initializer.\n if (!cancelled) setExperience(() => Component)\n })\n .catch((err) => {\n // Chunk failed (offline, cache miss, CDN hiccup): stay on classic.\n console.error('[Forms] Experience failed to load; using classic form:', err)\n })\n return () => {\n cancelled = true\n }\n }, [resolvedExperience])\n \n // Get fields for current step\n const currentFields = useMemo(() => {\n if (!config.is_multi_step) {\n return config.fields || []\n }\n \n const currentStepConfig = config.steps?.find(s => s.step_number === step)\n if (!currentStepConfig) return config.fields || []\n \n return (config.fields || []).filter(f => f.step_id === currentStepConfig.id)\n }, [config, step])\n \n // Check if field is visible (conditional logic)\n const isFieldVisible = useCallback((field: FormFieldType): 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 // Validate field\n const validateField = useCallback((field: FormFieldType): 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 whole form render.\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 // Delight: per-field validity for the tick + fields-completed momentum.\n const fieldIsComplete = useCallback((field: FormFieldType): boolean => {\n if (!isFieldVisible(field)) return false\n if (['heading', 'section_header', 'paragraph', 'hidden'].includes(field.field_type)) return false\n const value = values[field.slug]\n if (value === undefined || value === null || value === '') return false\n return validateField(field) === null\n }, [values, isFieldVisible, validateField])\n\n const momentum = useMemo(() => {\n const measurable = (config.fields || []).filter(\n f => f.is_required && isFieldVisible(f) && !['heading', 'section_header', 'paragraph', 'hidden'].includes(f.field_type),\n )\n return { done: measurable.filter(fieldIsComplete).length, total: measurable.length }\n }, [config, isFieldVisible, fieldIsComplete])\n\n // Validate current step\n const validateStep = useCallback((): boolean => {\n const newErrors: Record<string, string> = {}\n \n for (const field of currentFields) {\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 }, [currentFields, 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. Returns the first\n // step containing an error so the user can be taken straight to it.\n const validateAll = useCallback((): { ok: boolean; firstErrorStep: number | null } => {\n const allFields = config.fields || []\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 if (Object.keys(newErrors).length === 0) return { ok: true, firstErrorStep: null }\n\n let firstErrorStep: number | null = null\n if (config.is_multi_step && config.steps) {\n const ordered = [...config.steps].sort((a, b) => a.step_number - b.step_number)\n for (const s of ordered) {\n if (allFields.some((f) => f.step_id === s.id && newErrors[f.slug])) {\n firstErrorStep = s.step_number\n break\n }\n }\n }\n return { ok: false, firstErrorStep }\n }, [config, validateField])\n\n // Collect values for currently-visible fields only, so a value typed into a\n // field that later became conditionally hidden is never submitted.\n const buildVisibleValues = useCallback((): Record<string, unknown> => {\n const out: Record<string, unknown> = {}\n for (const field of config.fields || []) {\n if (!isFieldVisible(field)) continue\n if (field.slug in values) out[field.slug] = values[field.slug]\n }\n return out\n }, [config, values, isFieldVisible])\n\n // Set field value\n const setFieldValue = useCallback((key: string, value: unknown) => {\n setTouched(prev => (prev[key] ? prev : { ...prev, [key]: true }))\n setValues(prev => ({ ...prev, [key]: value }))\n // Clear error when field changes\n if (errors[key]) {\n setErrors(prev => {\n const next = { ...prev }\n delete next[key]\n return next\n })\n }\n }, [errors])\n \n // Step navigation\n const nextStep = useCallback((): boolean => {\n if (!validateStep()) return false\n \n if (step < config.total_steps) {\n const newStep = step + 1\n setStepDirection('forward')\n setStep(newStep)\n trackStepChange(newStep)\n return true\n }\n return false\n }, [step, config.total_steps, validateStep, trackStepChange])\n\n const prevStep = useCallback(() => {\n if (step > 1) {\n const newStep = step - 1\n setStepDirection('back')\n setStep(newStep)\n trackStepChange(newStep)\n }\n }, [step, trackStepChange])\n\n const goToStep = useCallback((targetStep: number) => {\n if (targetStep >= 1 && targetStep <= config.total_steps) {\n setStepDirection(targetStep < step ? 'back' : 'forward')\n setStep(targetStep)\n trackStepChange(targetStep)\n }\n }, [step, config.total_steps, trackStepChange])\n \n // Submit form\n const submit = useCallback(async () => {\n // Re-entrancy guard — refs update synchronously, so this blocks a second\n // submit fired in the same tick (Enter key + button click, or a double-tap).\n if (isSubmittingRef.current) return\n\n const { ok, firstErrorStep } = validateAll()\n if (!ok) {\n if (firstErrorStep != null) {\n setStepDirection('back')\n setStep(firstErrorStep)\n }\n return\n }\n\n isSubmittingRef.current = true\n setIsSubmitting(true)\n setSubmitError(null)\n\n try {\n const data = await submitForm({\n config,\n values: buildVisibleValues(),\n honeypotValue: config.honeypot_enabled ? honeypotValue : '',\n formLoadedAt: formLoadedAt.current,\n })\n\n trackComplete()\n setIsComplete(true)\n onSuccess?.(data as FormSubmission)\n\n if (config.redirect_url) {\n window.location.href = config.redirect_url\n }\n } catch (error) {\n console.error('[Forms] 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 }, [config, honeypotValue, validateAll, buildVisibleValues, trackComplete, onSuccess, onError])\n \n // Progress percentage\n const progress = useMemo(() => {\n return Math.round((step / config.total_steps) * 100)\n }, [step, config.total_steps])\n\n // Title/description the admin gave the current step, used as the step's\n // conversational heading. Absent for single-step forms.\n const currentStepConfig = useMemo(\n () => config.steps?.find((s) => s.step_number === step),\n [config.steps, step],\n )\n\n // Move focus to the new step's panel so keyboard and screen-reader users land\n // on the fields they just navigated to instead of staying on a button that\n // has moved. Skipped on first render so the form never steals focus on load.\n const stepPanelRef = useRef<HTMLDivElement | null>(null)\n const hasNavigatedRef = useRef(false)\n useEffect(() => {\n if (!config.is_multi_step) return\n if (!hasNavigatedRef.current) {\n hasNavigatedRef.current = true\n return\n }\n stepPanelRef.current?.focus()\n }, [step, config.is_multi_step])\n\n\n // Render props for custom rendering\n const renderProps: FormRenderProps = {\n config,\n fields: currentFields,\n step,\n totalSteps: config.total_steps,\n values,\n errors,\n isSubmitting,\n progress,\n nextStep,\n prevStep,\n goToStep,\n submit,\n setFieldValue,\n isFieldVisible,\n }\n \n // Show success message (fallback when API returns empty / null success_message)\n if (isComplete) {\n const raw = config.success_message\n const message =\n typeof raw === 'string' && raw.trim().length > 0\n ? raw.trim()\n : DEFAULT_FORM_SUCCESS_MESSAGE\n // The payoff moment — celebration, not a receipt. Sites theme it via\n // --sk-primary + data-sk-part; reduced-motion users get the static check.\n // Loaded lazily (it only ever renders AFTER a submit round-trip, so the\n // chunk fetch is free), but the confirmation itself never depends on\n // that chunk: until it lands, and if it never lands, the plain message\n // below is shown. A user must always be told their submission worked.\n if (Celebration) return <Celebration message={message} className={className} />\n return (\n <div className={className} data-sk-part=\"celebration-fallback\" role=\"status\">\n <p>{message}</p>\n </div>\n )\n }\n \n // Custom render\n if (customRender) {\n return <>{customRender(renderProps)}</>\n }\n\n // Alternate experiences — render BRANCHES, not customRenders: this\n // FormClient still owns values/errors/honeypot/submit, so spam defense and\n // validation are identical to classic.\n if (resolvedExperience !== 'classic' && Experience) {\n const bundle: ExperienceRenderProps = {\n config,\n values,\n errors,\n touched,\n isSubmitting,\n submitError,\n momentum,\n className,\n setFieldValue,\n validateField,\n isFieldVisible,\n fieldIsComplete,\n applyFieldError: (slug, message) =>\n setErrors((prev) => ({ ...prev, [slug]: message })),\n submit,\n trackStepChange,\n honeypot: config.honeypot_enabled ? (\n <HoneypotField\n name={honeypotFieldName}\n value={honeypotValue}\n onChange={setHoneypotValue}\n />\n ) : null,\n }\n return (\n <>\n <DelightStyles />\n <Experience {...bundle} />\n </>\n )\n }\n\n // Default render\n return (\n <form data-sk-state={isSubmitting ? 'submitting' : 'idle'}\n // Ready = every required field validates AND the submit button (not\n // \"Next\") is what's showing — the wake-up glow means \"press start\".\n data-sk-ready={\n momentum.total > 0 && momentum.done >= momentum.total && step >= config.total_steps\n ? 'true'\n : undefined\n }\n className={`sk-form ${className || ''}`}\n // No-JS floor: real action/method so the browser can POST without the\n // bundle. With JS the preventDefault below always wins.\n {...nativeFormProps(config)}\n onSubmit={(e) => {\n e.preventDefault()\n if (step < config.total_steps) {\n nextStep()\n } else {\n submit()\n }\n }}\n >\n <DelightStyles />\n <FormMomentum done={momentum.done} total={momentum.total} />\n {/* Step indicator for multi-step */}\n {config.is_multi_step && (\n <div className=\"sk-form__progress\">\n <div className=\"sk-form__progress-header\">\n <span className=\"sk-form__progress-step\">\n Step {step} of {config.total_steps}\n </span>\n {/* The percentage readout is opt-in — \"Step 2 of 4\" already gives\n the user their position, and a bare number reads as pressure. */}\n {config.show_progress && (\n <span className=\"sk-form__progress-percent\">{progress}%</span>\n )}\n </div>\n <div\n className=\"sk-form__progress-track\"\n role=\"progressbar\"\n aria-valuemin={1}\n aria-valuemax={config.total_steps}\n aria-valuenow={step}\n aria-valuetext={`Step ${step} of ${config.total_steps}`}\n >\n <div className=\"sk-form__progress-bar\" style={{ width: `${progress}%` }} />\n </div>\n <ol className=\"sk-form__progress-dots\" aria-hidden=\"true\">\n {Array.from({ length: config.total_steps }, (_, i) => i + 1).map((n) => (\n <li\n key={n}\n className={\n 'sk-form__progress-dot' +\n (n === step ? ' sk-form__progress-dot--current' : '') +\n (n < step ? ' sk-form__progress-dot--done' : '')\n }\n />\n ))}\n </ol>\n </div>\n )}\n\n {/* Fields — keyed by step so each step animates in on navigation */}\n <div\n key={step}\n ref={stepPanelRef}\n tabIndex={-1}\n className={\n 'sk-form__step' +\n (config.is_multi_step ? ` sk-form__step--${stepDirection}` : '')\n }\n >\n {config.is_multi_step && (currentStepConfig?.title || currentStepConfig?.description) && (\n <div className=\"sk-form__step-intro\">\n {currentStepConfig.title && (\n <h3 className=\"sk-form__step-title\">{currentStepConfig.title}</h3>\n )}\n {currentStepConfig.description && (\n <p className=\"sk-form__step-description\">{currentStepConfig.description}</p>\n )}\n </div>\n )}\n\n <div className=\"sk-form__fields\">\n {currentFields.map((field) => {\n if (!isFieldVisible(field)) return null\n\n return (\n <div key={field.id} className={`sk-form__field-wrapper sk-form__field-wrapper--${field.width || 'full'}`}>\n <FormField\n field={field}\n value={values[field.slug]}\n error={errors[field.slug]}\n showValid={!!touched[field.slug] && !errors[field.slug] && fieldIsComplete(field)}\n onChange={(value) => setFieldValue(field.slug, value)}\n controls={fieldControls}\n />\n </div>\n )\n })}\n </div>\n </div>\n\n {/* Navigation buttons */}\n <div\n className=\"sk-form__actions\"\n style={{ justifyContent: step > 1 ? 'space-between' : 'flex-end' }}\n >\n {step > 1 && (\n <button type=\"button\" className=\"sk-form__btn sk-form__btn--back\" onClick={prevStep}>\n Back\n </button>\n )}\n <button type=\"submit\" className=\"sk-form__btn sk-form__btn--submit\" disabled={isSubmitting}>\n {isSubmitting\n ? 'Submitting...'\n : step < config.total_steps\n ? 'Next'\n : config.submit_button_text\n }\n </button>\n </div>\n\n {submitError && (\n <p\n className=\"sk-form__submit-error\"\n role=\"alert\"\n style={{ color: 'var(--sk-error, #dc2626)', fontSize: 14, marginTop: 12 }}\n >\n {submitError}\n </p>\n )}\n\n {/* Honeypot field — shared single source of truth with the stage\n experience (HoneypotField.tsx holds the invariants). */}\n {config.honeypot_enabled && (\n <HoneypotField\n name={honeypotFieldName}\n value={honeypotValue}\n onChange={setHoneypotValue}\n />\n )}\n\n {/* No-JS control fields (_sk_token auth + _sk_return destination). */}\n <NativeFallbackFields config={config} returnTo={nativeReturnTo} />\n </form>\n )\n}\n","/**\n * @sonordev/site-kit/forms - Managed Form Component\n * \n * Fetches form config from Portal API and renders fields with validation\n */\n\n'use client'\n\nimport type { ManagedFormProps } from './types'\nimport { useForm } from './useForm'\nimport { FormClient } from './FormClient'\n\n// ============================================\n// Main Component (Client Component)\n// ============================================\n\nexport function ManagedForm({\n formId,\n projectId,\n className,\n onSuccess,\n onError,\n initialConfig,\n experience,\n nativeReturnTo,\n defaultValues,\n children,\n}: ManagedFormProps) {\n const {\n form,\n isLoading,\n fetchError,\n } = useForm(formId, {\n projectId,\n onSuccess,\n onError,\n initialForm: initialConfig,\n // FormClient below owns this form's tracking — it renders the fields,\n // drives step navigation and runs the submit, so it is the only thing that\n // can report a real funnel. useForm is used here purely to FETCH the\n // config; we never call its submit, so its analytics row could only ever\n // open and abandon, never complete.\n //\n // Leaving this on is the double-count bug fixed in 4.2.2: two\n // trackers per form, two form_analytics rows per page load, every\n // start -> submission rate reported at half its true value.\n trackAnalytics: false,\n })\n \n if (isLoading) {\n return (\n <div className={className}>\n <p style={{ color: '#6b7280' }}>Loading form...</p>\n </div>\n )\n }\n \n if (fetchError || !form) {\n return (\n <div className={className}>\n <p style={{ color: 'var(--sk-error, #dc2626)' }}>\n {fetchError?.message || 'Form not found or inactive.'}\n </p>\n </div>\n )\n }\n \n // Pass to client component for interactivity\n return (\n <FormClient\n config={form}\n className={className}\n onSuccess={onSuccess}\n onError={onError}\n customRender={children}\n experience={experience}\n nativeReturnTo={nativeReturnTo}\n defaultValues={defaultValues}\n />\n )\n}\n\n"]}
@@ -1,8 +1,9 @@
1
1
  'use client';
2
2
  'use strict';
3
3
 
4
- var chunkDPDV5Z4G_js = require('./chunk-DPDV5Z4G.js');
5
- var chunkGQ6CUOLA_js = require('./chunk-GQ6CUOLA.js');
4
+ var chunkESP5RMB7_js = require('./chunk-ESP5RMB7.js');
5
+ var chunkYNC5D3FT_js = require('./chunk-YNC5D3FT.js');
6
+ var chunkQEGUI2Q2_js = require('./chunk-QEGUI2Q2.js');
6
7
  var react = require('react');
7
8
  var ReactMarkdown = require('react-markdown');
8
9
  var jsxRuntime = require('react/jsx-runtime');
@@ -37,7 +38,7 @@ function InlineManagedForm({ slug, prefill, primaryColor, primaryRgb }) {
37
38
  submit,
38
39
  isSubmitting,
39
40
  isComplete
40
- } = chunkDPDV5Z4G_js.useForm(slug, { initialValues: prefill || {} });
41
+ } = chunkYNC5D3FT_js.useForm(slug, { initialValues: prefill || {} });
41
42
  const cardStyle = {
42
43
  marginTop: 8,
43
44
  padding: 12,
@@ -357,7 +358,7 @@ function ChatWidget({ projectId: propProjectId, config, apiUrl: propApiUrl, sign
357
358
  if (apiKey) return apiKey;
358
359
  if (!apiKeyMissingWarnedRef.current) {
359
360
  apiKeyMissingWarnedRef.current = true;
360
- console.warn("[ChatWidget] API key is required for Engage widget. Set __SITE_KIT_API_KEY__ or pass apiKey via SiteKitProvider.");
361
+ console.warn("[ChatWidget] No site credential found. Render SiteKitLayout in app/layout.tsx and set SONOR_API_KEY on the server.");
361
362
  }
362
363
  return null;
363
364
  }
@@ -366,6 +367,11 @@ function ChatWidget({ projectId: propProjectId, config, apiUrl: propApiUrl, sign
366
367
  const socketRef = react.useRef(null);
367
368
  const pollingIntervalRef = react.useRef(null);
368
369
  const position = config?.position || widgetConfig?.position || "bottom-right";
370
+ const placement = chunkESP5RMB7_js.chatLauncherStyles({
371
+ position: position === "bottom-left" ? "bottom-left" : "bottom-right",
372
+ offsetBottom: config?.offsetBottom,
373
+ zIndex: config?.zIndex
374
+ });
369
375
  const primaryFallback = staticPrimaryColor(widgetConfig?.brand_primary || config?.buttonColor, "#2563eb");
370
376
  const [primaryFromCssVar, setPrimaryFromCssVar] = react.useState(null);
371
377
  const primaryColor = primaryFromCssVar ?? primaryFallback;
@@ -389,7 +395,7 @@ function ChatWidget({ projectId: propProjectId, config, apiUrl: propApiUrl, sign
389
395
  const { apiKey } = getApiConfig();
390
396
  if (!apiKey) return;
391
397
  let cancelled = false;
392
- chunkGQ6CUOLA_js.sonorFetch(`${baseUrl}/api/public/seo/project-info`, {}, { apiKey, retries: 0 }).then((res) => res.ok ? res.json() : null).then((data) => {
398
+ chunkQEGUI2Q2_js.sonorFetch(`${baseUrl}/api/public/seo/project-info`, {}, { apiKey, retries: 0 }).then((res) => res.ok ? res.json() : null).then((data) => {
393
399
  if (cancelled || !data?.valid || !data?.project_id) return;
394
400
  setResolvedProjectId(data.project_id);
395
401
  }).catch(() => {
@@ -403,7 +409,7 @@ function ChatWidget({ projectId: propProjectId, config, apiUrl: propApiUrl, sign
403
409
  const apiKey = ensureApiKey();
404
410
  if (!apiKey) return;
405
411
  try {
406
- const response = await chunkGQ6CUOLA_js.sonorFetch(`${baseUrl}/engage/widget/config?projectId=${projectId}`, {}, { apiKey, retries: 0 });
412
+ const response = await chunkQEGUI2Q2_js.sonorFetch(`${baseUrl}/engage/widget/config?projectId=${projectId}`, {}, { apiKey, retries: 0 });
407
413
  if (response.ok) {
408
414
  const { data } = await response.json();
409
415
  setWidgetConfig(data ?? null);
@@ -419,7 +425,7 @@ function ChatWidget({ projectId: propProjectId, config, apiUrl: propApiUrl, sign
419
425
  const apiKey = ensureApiKey();
420
426
  if (!apiKey) return null;
421
427
  try {
422
- const response = await chunkGQ6CUOLA_js.sonorFetch(`${baseUrl}/engage/widget/availability?projectId=${projectId}`, {}, { apiKey, retries: 0 });
428
+ const response = await chunkQEGUI2Q2_js.sonorFetch(`${baseUrl}/engage/widget/availability?projectId=${projectId}`, {}, { apiKey, retries: 0 });
423
429
  if (response.ok) {
424
430
  const { data } = await response.json();
425
431
  setAvailability(data);
@@ -436,7 +442,7 @@ function ChatWidget({ projectId: propProjectId, config, apiUrl: propApiUrl, sign
436
442
  const apiKey = ensureApiKey();
437
443
  if (!apiKey) return null;
438
444
  try {
439
- const response = await chunkGQ6CUOLA_js.sonorFetch(`${baseUrl}/engage/widget/session`, {
445
+ const response = await chunkQEGUI2Q2_js.sonorFetch(`${baseUrl}/engage/widget/session`, {
440
446
  method: "POST",
441
447
  headers: { "Content-Type": "application/json" },
442
448
  body: JSON.stringify({
@@ -497,7 +503,7 @@ function ChatWidget({ projectId: propProjectId, config, apiUrl: propApiUrl, sign
497
503
  pageUrl: typeof window !== "undefined" ? window.location.href : void 0,
498
504
  ...siteContext ? { siteContext } : {}
499
505
  };
500
- const res = await chunkGQ6CUOLA_js.sonorFetch(url, {
506
+ const res = await chunkQEGUI2Q2_js.sonorFetch(url, {
501
507
  method: "POST",
502
508
  headers: {
503
509
  "Content-Type": "application/json"
@@ -608,7 +614,7 @@ function ChatWidget({ projectId: propProjectId, config, apiUrl: propApiUrl, sign
608
614
  if (currentSessionId) {
609
615
  const apiKey = ensureApiKey();
610
616
  if (apiKey) {
611
- chunkGQ6CUOLA_js.sonorFetch(`${baseUrl}/engage/widget/messages?sessionId=${currentSessionId}`, {}, { apiKey, retries: 0 }).then((res) => res.ok ? res.json() : null).then((json) => {
617
+ chunkQEGUI2Q2_js.sonorFetch(`${baseUrl}/engage/widget/messages?sessionId=${currentSessionId}`, {}, { apiKey, retries: 0 }).then((res) => res.ok ? res.json() : null).then((json) => {
612
618
  const data = json?.data ?? json;
613
619
  if (Array.isArray(data) && data.length) {
614
620
  setMessages((prev) => {
@@ -671,7 +677,7 @@ function ChatWidget({ projectId: propProjectId, config, apiUrl: propApiUrl, sign
671
677
  try {
672
678
  const apiKey = ensureApiKey();
673
679
  if (!apiKey) return;
674
- const response = await chunkGQ6CUOLA_js.sonorFetch(`${baseUrl}/engage/widget/messages?sessionId=${currentSessionId}`, {}, { apiKey, retries: 0 });
680
+ const response = await chunkQEGUI2Q2_js.sonorFetch(`${baseUrl}/engage/widget/messages?sessionId=${currentSessionId}`, {}, { apiKey, retries: 0 });
675
681
  if (response.ok) {
676
682
  const { data } = await response.json();
677
683
  setMessages((prev) => {
@@ -824,7 +830,7 @@ function ChatWidget({ projectId: propProjectId, config, apiUrl: propApiUrl, sign
824
830
  form.append("file", file);
825
831
  form.append("sessionId", sessionId);
826
832
  form.append("visitorId", visitorId);
827
- const res = await chunkGQ6CUOLA_js.sonorFetch(`${baseUrl}/engage/widget/upload`, {
833
+ const res = await chunkQEGUI2Q2_js.sonorFetch(`${baseUrl}/engage/widget/upload`, {
828
834
  method: "POST",
829
835
  body: form
830
836
  }, { apiKey, retries: 0 });
@@ -971,7 +977,7 @@ function ChatWidget({ projectId: propProjectId, config, apiUrl: propApiUrl, sign
971
977
  if (!apiKey) return;
972
978
  setCheckingHandoff(true);
973
979
  try {
974
- const res = await chunkGQ6CUOLA_js.sonorFetch(`${baseUrl}/engage/widget/handoff`, {
980
+ const res = await chunkQEGUI2Q2_js.sonorFetch(`${baseUrl}/engage/widget/handoff`, {
975
981
  method: "POST",
976
982
  headers: { "Content-Type": "application/json" },
977
983
  body: JSON.stringify({ sessionId })
@@ -1010,7 +1016,7 @@ function ChatWidget({ projectId: propProjectId, config, apiUrl: propApiUrl, sign
1010
1016
  setIsLoading(true);
1011
1017
  setOfflineError(null);
1012
1018
  try {
1013
- const response = await chunkGQ6CUOLA_js.sonorFetch(`${baseUrl}/engage/widget/offline-form`, {
1019
+ const response = await chunkQEGUI2Q2_js.sonorFetch(`${baseUrl}/engage/widget/offline-form`, {
1014
1020
  method: "POST",
1015
1021
  headers: { "Content-Type": "application/json" },
1016
1022
  body: JSON.stringify({
@@ -1068,8 +1074,7 @@ function ChatWidget({ projectId: propProjectId, config, apiUrl: propApiUrl, sign
1068
1074
  "aria-label": isOpen ? "Close chat" : "Open chat",
1069
1075
  style: {
1070
1076
  position: "fixed",
1071
- [position === "bottom-left" ? "left" : "right"]: "20px",
1072
- bottom: "calc(20px + env(safe-area-inset-bottom, 0px))",
1077
+ ...placement.launcher,
1073
1078
  width: "60px",
1074
1079
  height: "60px",
1075
1080
  borderRadius: "50%",
@@ -1081,7 +1086,7 @@ function ChatWidget({ projectId: propProjectId, config, apiUrl: propApiUrl, sign
1081
1086
  cursor: "pointer",
1082
1087
  boxShadow: "0 4px 12px rgba(0, 0, 0, 0.25)",
1083
1088
  transition: "transform 0.2s, box-shadow 0.2s",
1084
- zIndex: 9999
1089
+ zIndex: placement.zIndex.launcher
1085
1090
  },
1086
1091
  onMouseEnter: (e) => {
1087
1092
  e.currentTarget.style.transform = "scale(1.05)";
@@ -1552,19 +1557,17 @@ function ChatWidget({ projectId: propProjectId, config, apiUrl: propApiUrl, sign
1552
1557
  {
1553
1558
  style: {
1554
1559
  position: "fixed",
1555
- [position === "bottom-left" ? "left" : "right"]: "20px",
1556
- bottom: "calc(90px + env(safe-area-inset-bottom, 0px))",
1560
+ ...placement.popup,
1557
1561
  width: "380px",
1558
1562
  maxWidth: "calc(100vw - 40px)",
1559
1563
  height: "520px",
1560
- maxHeight: "calc(100dvh - 120px)",
1561
1564
  backgroundColor: "var(--sk-bg, #ffffff)",
1562
1565
  borderRadius: "16px",
1563
1566
  boxShadow: "0 8px 32px rgba(0, 0, 0, 0.2)",
1564
1567
  display: "flex",
1565
1568
  flexDirection: "column",
1566
1569
  overflow: "hidden",
1567
- zIndex: 9998,
1570
+ zIndex: placement.zIndex.popup,
1568
1571
  animation: "chatSlideUp 0.3s ease-out"
1569
1572
  },
1570
1573
  children: [
@@ -1611,5 +1614,5 @@ function ChatWidget({ projectId: propProjectId, config, apiUrl: propApiUrl, sign
1611
1614
  }
1612
1615
 
1613
1616
  exports.ChatWidget = ChatWidget;
1614
- //# sourceMappingURL=chunk-QWLL3B6U.js.map
1615
- //# sourceMappingURL=chunk-QWLL3B6U.js.map
1617
+ //# sourceMappingURL=chunk-2OU4KBUN.js.map
1618
+ //# sourceMappingURL=chunk-2OU4KBUN.js.map