@sonordev/site-kit 6.3.6 → 6.4.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 (274) hide show
  1. package/agent-manifest.json +8 -2
  2. package/dist/{AnalyticsProvider-XDVJTAPN.mjs → AnalyticsProvider-4K5T7OQ7.mjs} +6 -6
  3. package/dist/{AnalyticsProvider-XDVJTAPN.mjs.map → AnalyticsProvider-4K5T7OQ7.mjs.map} +1 -1
  4. package/dist/{AnalyticsProvider-L3GWK5PO.js → AnalyticsProvider-QXZN5O6D.js} +10 -10
  5. package/dist/{AnalyticsProvider-L3GWK5PO.js.map → AnalyticsProvider-QXZN5O6D.js.map} +1 -1
  6. package/dist/{ArticleViewTracker-7AJJTGFY.mjs → ArticleViewTracker-BUG2TOHS.mjs} +5 -5
  7. package/dist/{ArticleViewTracker-7AJJTGFY.mjs.map → ArticleViewTracker-BUG2TOHS.mjs.map} +1 -1
  8. package/dist/{ArticleViewTracker-YMGW6ZXB.js → ArticleViewTracker-FFMHR7AY.js} +6 -6
  9. package/dist/{ArticleViewTracker-YMGW6ZXB.js.map → ArticleViewTracker-FFMHR7AY.js.map} +1 -1
  10. package/dist/{ChatWidget-MR64ZLOG.mjs → ChatWidget-CRQPBDEF.mjs} +7 -7
  11. package/dist/{ChatWidget-MR64ZLOG.mjs.map → ChatWidget-CRQPBDEF.mjs.map} +1 -1
  12. package/dist/{ChatWidget-IAYEXLNX.js → ChatWidget-XFYLVXAX.js} +10 -10
  13. package/dist/{ChatWidget-IAYEXLNX.js.map → ChatWidget-XFYLVXAX.js.map} +1 -1
  14. package/dist/EngageWidget-S234YAT2.js +21 -0
  15. package/dist/{EngageWidget-BF7DH4GO.js.map → EngageWidget-S234YAT2.js.map} +1 -1
  16. package/dist/EngageWidget-SQU4T7CI.mjs +12 -0
  17. package/dist/{EngageWidget-RANSIKC3.mjs.map → EngageWidget-SQU4T7CI.mjs.map} +1 -1
  18. package/dist/{FileField-7ZNQ5BID.mjs → FileField-HNEBEBLB.mjs} +5 -5
  19. package/dist/{FileField-7ZNQ5BID.mjs.map → FileField-HNEBEBLB.mjs.map} +1 -1
  20. package/dist/{FileField-VRKATE4G.js → FileField-XG4EYAZW.js} +6 -6
  21. package/dist/{FileField-VRKATE4G.js.map → FileField-XG4EYAZW.js.map} +1 -1
  22. package/dist/{FormSpotlight-VQJ2QWIU.js → FormSpotlight-IODREOPN.js} +9 -9
  23. package/dist/{FormSpotlight-VQJ2QWIU.js.map → FormSpotlight-IODREOPN.js.map} +1 -1
  24. package/dist/{FormSpotlight-QNH7XGYS.mjs → FormSpotlight-VKD774PZ.mjs} +3 -3
  25. package/dist/{FormSpotlight-QNH7XGYS.mjs.map → FormSpotlight-VKD774PZ.mjs.map} +1 -1
  26. package/dist/{FormStage-3JIN6X6O.js → FormStage-37KKZQH4.js} +9 -9
  27. package/dist/{FormStage-3JIN6X6O.js.map → FormStage-37KKZQH4.js.map} +1 -1
  28. package/dist/{FormStage-XB4JNFCH.mjs → FormStage-PRZNRYNC.mjs} +3 -3
  29. package/dist/{FormStage-XB4JNFCH.mjs.map → FormStage-PRZNRYNC.mjs.map} +1 -1
  30. package/dist/ManagedForm-4PZOCKCV.mjs +16 -0
  31. package/dist/{ManagedForm-E6F4FLVY.mjs.map → ManagedForm-4PZOCKCV.mjs.map} +1 -1
  32. package/dist/ManagedForm-JCMEE626.js +25 -0
  33. package/dist/{ManagedForm-Q5UFMUBE.js.map → ManagedForm-JCMEE626.js.map} +1 -1
  34. package/dist/{ManagedNewsletterForm-UTNOJ5T4.js → ManagedNewsletterForm-CTC33B2U.js} +7 -7
  35. package/dist/{ManagedNewsletterForm-UTNOJ5T4.js.map → ManagedNewsletterForm-CTC33B2U.js.map} +1 -1
  36. package/dist/{ManagedNewsletterForm-OEEC3GVY.mjs → ManagedNewsletterForm-KMZG24OE.mjs} +6 -6
  37. package/dist/{ManagedNewsletterForm-OEEC3GVY.mjs.map → ManagedNewsletterForm-KMZG24OE.mjs.map} +1 -1
  38. package/dist/{SignalCore-4AUWHMYK.js → SignalCore-YHT7WPXV.js} +11 -11
  39. package/dist/{SignalCore-4AUWHMYK.js.map → SignalCore-YHT7WPXV.js.map} +1 -1
  40. package/dist/{SignalCore-PWN5X6FF.mjs → SignalCore-YIPKKIUG.mjs} +5 -5
  41. package/dist/{SignalCore-PWN5X6FF.mjs.map → SignalCore-YIPKKIUG.mjs.map} +1 -1
  42. package/dist/SitemapSync-GN4OXIM2.js +18 -0
  43. package/dist/{SitemapSync-DHJ25PSH.js.map → SitemapSync-GN4OXIM2.js.map} +1 -1
  44. package/dist/SitemapSync-NG763CGN.mjs +9 -0
  45. package/dist/{SitemapSync-ZA2MNM63.mjs.map → SitemapSync-NG763CGN.mjs.map} +1 -1
  46. package/dist/analytics/index.js +9 -9
  47. package/dist/analytics/index.mjs +4 -4
  48. package/dist/articles/AuthorPage.d.ts +1 -1
  49. package/dist/articles/AuthorPage.d.ts.map +1 -1
  50. package/dist/articles/author-schema.d.ts +59 -13
  51. package/dist/articles/author-schema.d.ts.map +1 -1
  52. package/dist/articles/index.js +24 -23
  53. package/dist/articles/index.js.map +1 -1
  54. package/dist/articles/index.mjs +12 -11
  55. package/dist/articles/index.mjs.map +1 -1
  56. package/dist/articles/routes.d.ts +9 -0
  57. package/dist/articles/routes.d.ts.map +1 -1
  58. package/dist/articles/server-core.d.ts +5 -2
  59. package/dist/articles/server-core.d.ts.map +1 -1
  60. package/dist/articles/server-ui.js +45 -45
  61. package/dist/articles/server-ui.mjs +8 -8
  62. package/dist/articles/server.d.ts +5 -2
  63. package/dist/articles/server.d.ts.map +1 -1
  64. package/dist/articles/server.js +72 -56
  65. package/dist/articles/server.mjs +3 -3
  66. package/dist/articles/types.d.ts +17 -0
  67. package/dist/articles/types.d.ts.map +1 -1
  68. package/dist/{chunk-PQICWWQW.mjs → chunk-24LFAQEG.mjs} +5 -5
  69. package/dist/{chunk-PQICWWQW.mjs.map → chunk-24LFAQEG.mjs.map} +1 -1
  70. package/dist/chunk-3AOKYAZ2.js +135 -0
  71. package/dist/chunk-3AOKYAZ2.js.map +1 -0
  72. package/dist/{chunk-UJIKP35G.mjs → chunk-4C3INRHE.mjs} +4 -4
  73. package/dist/{chunk-UJIKP35G.mjs.map → chunk-4C3INRHE.mjs.map} +1 -1
  74. package/dist/{chunk-ZR43XFUM.js → chunk-55J2KE7D.js} +3 -3
  75. package/dist/chunk-55J2KE7D.js.map +1 -0
  76. package/dist/{chunk-B2NO5QVY.mjs → chunk-5BARLEAI.mjs} +3 -3
  77. package/dist/{chunk-B2NO5QVY.mjs.map → chunk-5BARLEAI.mjs.map} +1 -1
  78. package/dist/{chunk-BJKA3XRS.mjs → chunk-5T3J24K4.mjs} +4 -4
  79. package/dist/{chunk-BJKA3XRS.mjs.map → chunk-5T3J24K4.mjs.map} +1 -1
  80. package/dist/{chunk-3J5L5DIK.js → chunk-5W4S7XQD.js} +3 -3
  81. package/dist/{chunk-3J5L5DIK.js.map → chunk-5W4S7XQD.js.map} +1 -1
  82. package/dist/{chunk-6DCAMW62.mjs → chunk-6C47333H.mjs} +3 -3
  83. package/dist/chunk-6C47333H.mjs.map +1 -0
  84. package/dist/{chunk-YKZ3EVAQ.mjs → chunk-6QPKC6XP.mjs} +3 -3
  85. package/dist/{chunk-YKZ3EVAQ.mjs.map → chunk-6QPKC6XP.mjs.map} +1 -1
  86. package/dist/{chunk-JOYMIGR2.mjs → chunk-7K6L33BX.mjs} +22 -22
  87. package/dist/{chunk-JS75ORH7.js → chunk-ATPQ6264.js} +24 -24
  88. package/dist/{chunk-5J4FKRGH.mjs → chunk-BI7DH42Z.mjs} +4 -4
  89. package/dist/{chunk-5J4FKRGH.mjs.map → chunk-BI7DH42Z.mjs.map} +1 -1
  90. package/dist/{chunk-J4C3JAJF.js → chunk-C7J4XLBN.js} +15 -15
  91. package/dist/{chunk-J4C3JAJF.js.map → chunk-C7J4XLBN.js.map} +1 -1
  92. package/dist/{chunk-LWCAZDY2.js → chunk-CDRQYJUT.js} +4 -4
  93. package/dist/{chunk-LWCAZDY2.js.map → chunk-CDRQYJUT.js.map} +1 -1
  94. package/dist/chunk-CIB3RHNZ.js +8 -0
  95. package/dist/{chunk-6SBRD5KT.js.map → chunk-CIB3RHNZ.js.map} +1 -1
  96. package/dist/{chunk-FRUBUQOH.js → chunk-CUZ3I6CO.js} +5 -5
  97. package/dist/{chunk-FRUBUQOH.js.map → chunk-CUZ3I6CO.js.map} +1 -1
  98. package/dist/{chunk-PMWF5CRL.js → chunk-EWDWLY74.js} +11 -11
  99. package/dist/{chunk-PMWF5CRL.js.map → chunk-EWDWLY74.js.map} +1 -1
  100. package/dist/{chunk-OLVCGOXZ.js → chunk-F2GECCK7.js} +12 -12
  101. package/dist/{chunk-OLVCGOXZ.js.map → chunk-F2GECCK7.js.map} +1 -1
  102. package/dist/chunk-GFSQMK35.mjs +127 -0
  103. package/dist/chunk-GFSQMK35.mjs.map +1 -0
  104. package/dist/{chunk-2MEMK5XC.js → chunk-GGGX54ZE.js} +14 -14
  105. package/dist/{chunk-2MEMK5XC.js.map → chunk-GGGX54ZE.js.map} +1 -1
  106. package/dist/{chunk-6MOGGEY3.mjs → chunk-GSU6VTCZ.mjs} +3 -3
  107. package/dist/{chunk-6MOGGEY3.mjs.map → chunk-GSU6VTCZ.mjs.map} +1 -1
  108. package/dist/{chunk-3POB4JKR.js → chunk-GXSSFQ5D.js} +15 -15
  109. package/dist/{chunk-3POB4JKR.js.map → chunk-GXSSFQ5D.js.map} +1 -1
  110. package/dist/{chunk-BJ4T65OK.mjs → chunk-H4TSADY3.mjs} +3 -3
  111. package/dist/{chunk-BJ4T65OK.mjs.map → chunk-H4TSADY3.mjs.map} +1 -1
  112. package/dist/{chunk-2UZULHI4.js → chunk-HSLPN3QK.js} +7 -7
  113. package/dist/{chunk-2UZULHI4.js.map → chunk-HSLPN3QK.js.map} +1 -1
  114. package/dist/{chunk-EB33U2WT.js → chunk-HTCNRTN6.js} +129 -69
  115. package/dist/chunk-HTCNRTN6.js.map +1 -0
  116. package/dist/{chunk-3Q3Y6OQE.mjs → chunk-JXRGIE3V.mjs} +4 -4
  117. package/dist/{chunk-3Q3Y6OQE.mjs.map → chunk-JXRGIE3V.mjs.map} +1 -1
  118. package/dist/chunk-K3PVUXKB.mjs +6 -0
  119. package/dist/{chunk-3V6DIQI7.mjs.map → chunk-K3PVUXKB.mjs.map} +1 -1
  120. package/dist/{chunk-KMONA7CT.mjs → chunk-KOPFFKG2.mjs} +3 -3
  121. package/dist/{chunk-KMONA7CT.mjs.map → chunk-KOPFFKG2.mjs.map} +1 -1
  122. package/dist/{chunk-UAOQVHZW.js → chunk-KZBDH5A3.js} +4 -4
  123. package/dist/{chunk-UAOQVHZW.js.map → chunk-KZBDH5A3.js.map} +1 -1
  124. package/dist/{chunk-SB4CJX2X.mjs → chunk-LPDXS2B2.mjs} +3 -3
  125. package/dist/{chunk-SB4CJX2X.mjs.map → chunk-LPDXS2B2.mjs.map} +1 -1
  126. package/dist/{chunk-6I5O5CTL.mjs → chunk-M3JCHPK3.mjs} +127 -67
  127. package/dist/chunk-M3JCHPK3.mjs.map +1 -0
  128. package/dist/{chunk-LFF32POH.mjs → chunk-M62L2N5A.mjs} +3 -3
  129. package/dist/{chunk-LFF32POH.mjs.map → chunk-M62L2N5A.mjs.map} +1 -1
  130. package/dist/{chunk-G3L26XQ7.js → chunk-OIPG3EGM.js} +5 -5
  131. package/dist/{chunk-G3L26XQ7.js.map → chunk-OIPG3EGM.js.map} +1 -1
  132. package/dist/{chunk-X3MY4PL7.mjs → chunk-QAQTDHHT.mjs} +10 -14
  133. package/dist/chunk-QAQTDHHT.mjs.map +1 -0
  134. package/dist/{chunk-KB7SIIVY.mjs → chunk-QOKMH2TD.mjs} +3 -3
  135. package/dist/{chunk-KB7SIIVY.mjs.map → chunk-QOKMH2TD.mjs.map} +1 -1
  136. package/dist/{chunk-HXHRS3PX.mjs → chunk-RCB6HEHM.mjs} +3 -3
  137. package/dist/{chunk-HXHRS3PX.mjs.map → chunk-RCB6HEHM.mjs.map} +1 -1
  138. package/dist/{chunk-NNZDWY3L.mjs → chunk-RH4XEXTK.mjs} +3 -3
  139. package/dist/{chunk-NAA5J2JM.js → chunk-RQROZLH3.js} +47 -51
  140. package/dist/chunk-RQROZLH3.js.map +1 -0
  141. package/dist/{chunk-VGBUC2JP.js → chunk-S5QKNXLQ.js} +10 -10
  142. package/dist/{chunk-VGBUC2JP.js.map → chunk-S5QKNXLQ.js.map} +1 -1
  143. package/dist/{chunk-5DZVQW35.mjs → chunk-SBTA6B6Y.mjs} +4 -4
  144. package/dist/{chunk-5DZVQW35.mjs.map → chunk-SBTA6B6Y.mjs.map} +1 -1
  145. package/dist/{chunk-5YA6SI4Z.mjs → chunk-TIFVAASU.mjs} +2 -2
  146. package/dist/{chunk-R26FAQWF.mjs → chunk-TPDDSEL3.mjs} +3 -3
  147. package/dist/{chunk-R26FAQWF.mjs.map → chunk-TPDDSEL3.mjs.map} +1 -1
  148. package/dist/{chunk-X5J3PYZJ.js → chunk-U4CYO4NG.js} +5 -5
  149. package/dist/{chunk-X5J3PYZJ.js.map → chunk-U4CYO4NG.js.map} +1 -1
  150. package/dist/{chunk-TE3YNZVH.js → chunk-U5NFIHLY.js} +4 -4
  151. package/dist/{chunk-TE3YNZVH.js.map → chunk-U5NFIHLY.js.map} +1 -1
  152. package/dist/{chunk-L6BQIDSZ.mjs → chunk-USQPRLSG.mjs} +8 -8
  153. package/dist/{chunk-L6BQIDSZ.mjs.map → chunk-USQPRLSG.mjs.map} +1 -1
  154. package/dist/{chunk-5XDOBM5S.js → chunk-VDEQVXNV.js} +3 -3
  155. package/dist/{chunk-5XDOBM5S.js.map → chunk-VDEQVXNV.js.map} +1 -1
  156. package/dist/{chunk-SAOUAIRS.js → chunk-VMNPLCZB.js} +14 -14
  157. package/dist/{chunk-SAOUAIRS.js.map → chunk-VMNPLCZB.js.map} +1 -1
  158. package/dist/{chunk-ANYCUTS5.js → chunk-W7IAG5YD.js} +3 -3
  159. package/dist/{chunk-ANYCUTS5.js.map → chunk-W7IAG5YD.js.map} +1 -1
  160. package/dist/{chunk-K6ZQVDP4.mjs → chunk-WIWHM47B.mjs} +3 -3
  161. package/dist/{chunk-K6ZQVDP4.mjs.map → chunk-WIWHM47B.mjs.map} +1 -1
  162. package/dist/{chunk-I7AZC5ZQ.js → chunk-XXSSUCJB.js} +2 -2
  163. package/dist/{chunk-7NFSSPGM.js → chunk-XZHR4E2D.js} +8 -8
  164. package/dist/{chunk-7NFSSPGM.js.map → chunk-XZHR4E2D.js.map} +1 -1
  165. package/dist/{chunk-E7EV2AHT.js → chunk-YACU35MY.js} +9 -9
  166. package/dist/{chunk-E7EV2AHT.js.map → chunk-YACU35MY.js.map} +1 -1
  167. package/dist/chunk-YMZNEDFP.js +39 -0
  168. package/dist/chunk-YMZNEDFP.js.map +1 -0
  169. package/dist/{chunk-CXYGKK4U.mjs → chunk-YRKWJCML.mjs} +3 -3
  170. package/dist/{chunk-CXYGKK4U.mjs.map → chunk-YRKWJCML.mjs.map} +1 -1
  171. package/dist/chunk-Z2URIOKG.mjs +36 -0
  172. package/dist/chunk-Z2URIOKG.mjs.map +1 -0
  173. package/dist/{chunk-W46QIVBM.mjs → chunk-ZEBOOUBP.mjs} +3 -3
  174. package/dist/{chunk-W46QIVBM.mjs.map → chunk-ZEBOOUBP.mjs.map} +1 -1
  175. package/dist/{chunk-SNXJXPB6.js → chunk-ZOBUA65N.js} +6 -6
  176. package/dist/{chunk-SNXJXPB6.js.map → chunk-ZOBUA65N.js.map} +1 -1
  177. package/dist/{chunk-NN2YE5WT.js → chunk-ZUQSVCMD.js} +3 -3
  178. package/dist/cli/index.js +211 -211
  179. package/dist/cli/index.mjs +151 -151
  180. package/dist/client/index.js +4 -4
  181. package/dist/client/index.mjs +3 -3
  182. package/dist/commerce/index.js +57 -57
  183. package/dist/commerce/index.mjs +5 -5
  184. package/dist/engage/DesignRenderer.d.ts.map +1 -1
  185. package/dist/engage/EngageWidget.d.ts.map +1 -1
  186. package/dist/engage/element-rules.d.ts +39 -0
  187. package/dist/engage/element-rules.d.ts.map +1 -0
  188. package/dist/engage/index.js +9 -9
  189. package/dist/engage/index.mjs +6 -6
  190. package/dist/fleet/index.js +8 -8
  191. package/dist/fleet/index.mjs +4 -4
  192. package/dist/forms/index.js +13 -13
  193. package/dist/forms/index.mjs +7 -7
  194. package/dist/forms/server.js +2 -2
  195. package/dist/forms/server.mjs +1 -1
  196. package/dist/images/index.js +11 -11
  197. package/dist/images/index.mjs +4 -4
  198. package/dist/index.js +63 -63
  199. package/dist/index.mjs +9 -9
  200. package/dist/layout/client.js +8 -8
  201. package/dist/layout/client.mjs +7 -7
  202. package/dist/layout/index.js +10 -10
  203. package/dist/layout/index.mjs +8 -8
  204. package/dist/{lib-6HOOMENJ.js → lib-6GWWPDJR.js} +7 -7
  205. package/dist/lib-BD4KKQBI.mjs +4 -0
  206. package/dist/{lib-R7IQ4ZHE.mjs → lib-N5PD6JNJ.mjs} +2 -2
  207. package/dist/{lib-BGAWCSUH.js → lib-WFB5RLEQ.js} +8 -8
  208. package/dist/llms/index.d.ts +2 -0
  209. package/dist/llms/index.d.ts.map +1 -1
  210. package/dist/llms/index.js +129 -14
  211. package/dist/llms/index.js.map +1 -1
  212. package/dist/llms/index.mjs +115 -5
  213. package/dist/llms/index.mjs.map +1 -1
  214. package/dist/llms/revalidate.d.ts +3 -0
  215. package/dist/llms/revalidate.d.ts.map +1 -1
  216. package/dist/llms/seo-revalidate.d.ts +105 -0
  217. package/dist/llms/seo-revalidate.d.ts.map +1 -0
  218. package/dist/maps/index.js +5 -5
  219. package/dist/maps/index.mjs +3 -3
  220. package/dist/mcp/transport.d.ts +166 -0
  221. package/dist/mcp/transport.d.ts.map +1 -0
  222. package/dist/mcp/transport.js +137 -0
  223. package/dist/mcp/transport.js.map +1 -0
  224. package/dist/mcp/transport.mjs +123 -0
  225. package/dist/mcp/transport.mjs.map +1 -0
  226. package/dist/search/index.js +4 -4
  227. package/dist/search/index.mjs +3 -3
  228. package/dist/seo/client.js +5 -5
  229. package/dist/seo/client.mjs +4 -4
  230. package/dist/seo/index.js +5 -5
  231. package/dist/seo/index.mjs +4 -4
  232. package/dist/seo/register-sitemap-cli.js +3 -3
  233. package/dist/seo/register-sitemap-cli.mjs +2 -2
  234. package/dist/server/index.js +3 -3
  235. package/dist/server/index.mjs +2 -2
  236. package/dist/shared/build-entries.d.ts +7 -0
  237. package/dist/shared/build-entries.d.ts.map +1 -1
  238. package/dist/shared/request-guards.d.ts +27 -0
  239. package/dist/shared/request-guards.d.ts.map +1 -0
  240. package/dist/shared/version.d.ts +1 -1
  241. package/dist/signal/index.js +11 -11
  242. package/dist/signal/index.mjs +2 -2
  243. package/dist/sitemap/index.js +3 -3
  244. package/dist/sitemap/index.mjs +2 -2
  245. package/dist/sync/index.js +17 -17
  246. package/dist/sync/index.mjs +4 -4
  247. package/dist/{web-vitals.attribution-7LKLZ5GR.mjs → web-vitals.attribution-CHXXWO72.mjs} +3 -3
  248. package/dist/web-vitals.attribution-CHXXWO72.mjs.map +1 -0
  249. package/dist/{web-vitals.attribution-ONVYQNRB.js → web-vitals.attribution-SQVZNHN3.js} +3 -3
  250. package/dist/web-vitals.attribution-SQVZNHN3.js.map +1 -0
  251. package/dist/{writeLLMsTxt-LYYC3ZSN.mjs → writeLLMsTxt-IYJILIU3.mjs} +3 -3
  252. package/dist/{writeLLMsTxt-XHLHJ5XY.js → writeLLMsTxt-SQG4B63X.js} +4 -4
  253. package/package.json +6 -1
  254. package/dist/EngageWidget-BF7DH4GO.js +0 -21
  255. package/dist/EngageWidget-RANSIKC3.mjs +0 -12
  256. package/dist/ManagedForm-E6F4FLVY.mjs +0 -16
  257. package/dist/ManagedForm-Q5UFMUBE.js +0 -25
  258. package/dist/SitemapSync-DHJ25PSH.js +0 -18
  259. package/dist/SitemapSync-ZA2MNM63.mjs +0 -9
  260. package/dist/chunk-3V6DIQI7.mjs +0 -6
  261. package/dist/chunk-6DCAMW62.mjs.map +0 -1
  262. package/dist/chunk-6I5O5CTL.mjs.map +0 -1
  263. package/dist/chunk-6SBRD5KT.js +0 -8
  264. package/dist/chunk-EB33U2WT.js.map +0 -1
  265. package/dist/chunk-NAA5J2JM.js.map +0 -1
  266. package/dist/chunk-X3MY4PL7.mjs.map +0 -1
  267. package/dist/chunk-YRCR7WY3.js +0 -65
  268. package/dist/chunk-YRCR7WY3.js.map +0 -1
  269. package/dist/chunk-ZL35JCDA.mjs +0 -61
  270. package/dist/chunk-ZL35JCDA.mjs.map +0 -1
  271. package/dist/chunk-ZR43XFUM.js.map +0 -1
  272. package/dist/lib-RSDMEKDQ.mjs +0 -4
  273. package/dist/web-vitals.attribution-7LKLZ5GR.mjs.map +0 -1
  274. package/dist/web-vitals.attribution-ONVYQNRB.js.map +0 -1
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/forms/FormClient.tsx","../src/forms/ManagedForm.tsx"],"names":["useState","DEFAULT_HONEYPOT_FIELD","useRef","useMemo","countStageViews","countStageQuestions","useFieldControls","useEffect","currentStepConfig","isFieldVisible","useCallback","validateField","isFieldComplete","isDisplayOnly","useFormTracking","submitForm","useRecaptchaWarmup","DEFAULT_FORM_SUCCESS_MESSAGE","jsx","Fragment","HoneypotField","jsxs","DelightStyles","FormMomentum","FormField","useForm"],"mappings":"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","file":"chunk-OLVCGOXZ.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 * as fieldRules from './field-rules'\nimport { FormField } from './FormField'\nimport { submitForm, DEFAULT_HONEYPOT_FIELD } from './submitForm'\nimport { useRecaptchaWarmup } from './recaptcha-warmup'\nimport type { \n ManagedFormConfig, \n FormField as FormFieldType, \n FormRenderProps,\n FormSubmitResult,\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 { countStageViews, countStageQuestions } from './experience-plan'\nimport type { ExperienceRenderProps, FormExperience } from './types'\n\ninterface FormClientProps {\n config: ManagedFormConfig\n className?: string\n onSuccess?: (submission: FormSubmitResult) => 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 /**\n * @deprecated Ignored since 6.3.2. It set where the no-JavaScript form POST\n * returned to, and that path was removed (bots used it; no person ever did).\n * Kept so existing call sites still type-check.\n */\n nativeReturnTo?: string\n}\n\nexport function FormClient({\n config,\n className,\n onSuccess,\n onError,\n customRender,\n experience,\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 // 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 // Visibility, validation and completeness all come from field-rules.ts,\n // shared with useForm. These wrappers only bind the current values.\n const isFieldVisible = useCallback(\n (field: FormFieldType): boolean => fieldRules.isFieldVisible(field, values),\n [values],\n )\n\n const validateField = useCallback(\n (field: FormFieldType): string | null => fieldRules.validateField(field, values, isFieldVisible),\n [values, isFieldVisible],\n )\n\n // Delight: per-field validity for the tick + fields-completed momentum.\n const fieldIsComplete = useCallback(\n (field: FormFieldType): boolean => fieldRules.isFieldComplete(field, values, isFieldVisible),\n [values, isFieldVisible],\n )\n\n const momentum = useMemo(() => {\n const measurable = (config.fields || []).filter(\n f => f.is_required && isFieldVisible(f) && !fieldRules.isDisplayOnly(f),\n )\n return { done: measurable.filter(fieldIsComplete).length, total: measurable.length }\n }, [config, isFieldVisible, fieldIsComplete])\n\n const fieldBySlug = useMemo(\n () => new Map((config.fields || []).map((f) => [f.slug, f] as const)),\n [config.fields],\n )\n\n const {\n trackStepChange,\n trackComplete,\n trackFieldFocus: trackFocus,\n trackFieldBlur,\n trackFieldChange,\n } = 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 // Same verdict as the valid tick and the momentum count.\n isFieldComplete: (slug) => {\n const field = fieldBySlug.get(slug)\n return field ? fieldIsComplete(field) : false\n },\n })\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 trackFieldChange(key)\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, trackFieldChange])\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)\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 // Every renderer below reports focus through this, so the first focus in\n // any experience starts loading reCAPTCHA before the visitor hits submit.\n const trackFieldFocus = useRecaptchaWarmup(config, trackFocus)\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 trackFieldFocus,\n trackFieldBlur,\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 trackFieldFocus,\n trackFieldBlur,\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 // POST, never GET: nothing a visitor typed may end up in a URL. The\n // preventDefault below always handles the submit.\n method=\"post\"\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 onFocus={() => trackFieldFocus(field.slug)}\n onBlur={() => trackFieldBlur(field.slug)}\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 </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 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 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","useEffect","currentStepConfig","isFieldVisible","useCallback","validateField","isFieldComplete","isDisplayOnly","useFormTracking","submitForm","useRecaptchaWarmup","DEFAULT_FORM_SUCCESS_MESSAGE","jsx","Fragment","HoneypotField","jsxs","DelightStyles","FormMomentum","FormField","useForm"],"mappings":";;;;;;;;;;;;AAwDO,SAAS,UAAA,CAAW;AAAA,EACzB,MAAA;AAAA,EACA,SAAA;AAAA,EACA,SAAA;AAAA,EACA,OAAA;AAAA,EACA,YAAA;AAAA,EACA,UAAA;AAAA,EACA;AACF,CAAA,EAAoB;AAGlB,EAAA,MAAM,CAAC,MAAA,EAAQ,SAAS,CAAA,GAAIA,eAAkC,MAAM;AAClE,IAAA,MAAM,WAAoC,EAAC;AAC3C,IAAA,KAAA,MAAW,KAAA,IAAS,MAAA,CAAO,MAAA,IAAU,EAAC,EAAG;AACvC,MAAA,IAAI,KAAA,CAAM,aAAA,KAAkB,MAAA,IAAa,KAAA,CAAM,kBAAkB,IAAA,EAAM;AACrE,QAAA,QAAA,CAAS,KAAA,CAAM,IAAI,CAAA,GAAI,KAAA,CAAM,aAAA;AAAA,MAC/B;AAAA,IACF;AAIA,IAAA,OAAO,EAAE,GAAG,QAAA,EAAU,GAAI,aAAA,IAAiB,EAAC,EAAG;AAAA,EACjD,CAAC,CAAA;AACD,EAAA,MAAM,CAAC,MAAA,EAAQ,SAAS,CAAA,GAAIA,cAAA,CAAiC,EAAE,CAAA;AAC/D,EAAA,MAAM,CAAC,IAAA,EAAM,OAAO,CAAA,GAAIA,eAAS,CAAC,CAAA;AAGlC,EAAA,MAAM,CAAC,aAAA,EAAe,gBAAgB,CAAA,GAAIA,eAA6B,SAAS,CAAA;AAChF,EAAA,MAAM,CAAC,YAAA,EAAc,eAAe,CAAA,GAAIA,eAAS,KAAK,CAAA;AACtD,EAAA,MAAM,CAAC,UAAA,EAAY,aAAa,CAAA,GAAIA,eAAS,KAAK,CAAA;AAClD,EAAA,MAAM,CAAC,WAAA,EAAa,cAAc,CAAA,GAAIA,eAAwB,IAAI,CAAA;AAClE,EAAA,MAAM,CAAC,aAAA,EAAe,gBAAgB,CAAA,GAAIA,eAAS,EAAE,CAAA;AAGrD,EAAA,MAAM,CAAC,OAAA,EAAS,UAAU,CAAA,GAAIA,cAAA,CAAkC,EAAE,CAAA;AAClE,EAAA,MAAM,iBAAA,GAAoB,OAAO,cAAA,IAAkBC,uCAAA;AAGnD,EAAA,MAAM,YAAA,GAAeC,YAAA,CAAO,IAAA,CAAK,GAAA,EAAK,CAAA;AAEtC,EAAA,MAAM,eAAA,GAAkBA,aAAO,KAAK,CAAA;AASpC,EAAA,MAAM,cAAA,GAAiBC,cAAQ,MAAMC,gCAAA,CAAgB,MAAM,CAAA,EAAG,CAAC,MAAM,CAAC,CAAA;AACtE,EAAA,MAAM,aAAA,GAAgBD,cAAQ,MAAME,oCAAA,CAAoB,MAAM,CAAA,EAAG,CAAC,MAAM,CAAC,CAAA;AACzE,EAAA,MAAM,SAAA,GACJ,eACC,MAAA,CAAO,MAAA,KAAW,UACf,OAAA,GACA,MAAA,CAAO,MAAA,KAAW,SAAA,GAChB,SAAA,GACA,WAAA,CAAA;AACR,EAAA,MAAM,qBACJ,CAAC,YAAA,IAAgB,gBAAgB,CAAA,IAAK,SAAA,KAAc,YAChD,SAAA,GACA,SAAA;AAMN,EAAA,MAAM,aAAA,GAAgBC,iCAAA,CAAiB,MAAA,CAAO,MAAM,CAAA;AAKpD,EAAA,MAAM,CAAC,WAAA,EAAa,cAAc,CAAA,GAChCN,eAA8E,IAAI,CAAA;AACpF,EAAAO,eAAA,CAAU,MAAM;AACd,IAAA,IAAI,CAAC,YAAA,IAAgB,CAAC,UAAA,EAAY;AAClC,IAAA,IAAI,SAAA,GAAY,KAAA;AAChB,IAAA,OAAO,+BAAmB,CAAA,CACvB,IAAA,CAAK,CAAC,CAAA,KAAM;AACX,MAAA,IAAI,CAAC,SAAA,EAAW,cAAA,CAAe,MAAM,EAAE,eAAe,CAAA;AAAA,IACxD,CAAC,CAAA,CACA,KAAA,CAAM,MAAM;AAAA,IAEb,CAAC,CAAA;AACH,IAAA,OAAO,MAAM;AACX,MAAA,SAAA,GAAY,IAAA;AAAA,IACd,CAAA;AAAA,EACF,CAAA,EAAG,CAAC,YAAA,EAAc,UAAU,CAAC,CAAA;AAO7B,EAAA,MAAM,CAAC,UAAA,EAAY,aAAa,CAAA,GAC9BP,eAA4D,IAAI,CAAA;AAClE,EAAAO,eAAA,CAAU,MAAM;AACd,IAAA,IAAI,uBAAuB,SAAA,EAAW;AACpC,MAAA,aAAA,CAAc,IAAI,CAAA;AAClB,MAAA;AAAA,IACF;AACA,IAAA,IAAI,SAAA,GAAY,KAAA;AAChB,IAAA,MAAM,OACJ,kBAAA,KAAuB,OAAA,GACnB,OAAO,yBAAa,CAAA,CAAE,KAAK,CAAC,CAAA,KAAM,EAAE,SAAS,CAAA,GAC7C,OAAO,6BAAiB,CAAA,CAAE,KAAK,CAAC,CAAA,KAAM,EAAE,aAAa,CAAA;AAC3D,IAAA,IAAA,CACG,IAAA,CAAK,CAAC,SAAA,KAAc;AAGnB,MAAA,IAAI,CAAC,SAAA,EAAW,aAAA,CAAc,MAAM,SAAS,CAAA;AAAA,IAC/C,CAAC,CAAA,CACA,KAAA,CAAM,CAAC,GAAA,KAAQ;AAEd,MAAA,OAAA,CAAQ,KAAA,CAAM,0DAA0D,GAAG,CAAA;AAAA,IAC7E,CAAC,CAAA;AACH,IAAA,OAAO,MAAM;AACX,MAAA,SAAA,GAAY,IAAA;AAAA,IACd,CAAA;AAAA,EACF,CAAA,EAAG,CAAC,kBAAkB,CAAC,CAAA;AAGvB,EAAA,MAAM,aAAA,GAAgBJ,cAAQ,MAAM;AAClC,IAAA,IAAI,CAAC,OAAO,aAAA,EAAe;AACzB,MAAA,OAAO,MAAA,CAAO,UAAU,EAAC;AAAA,IAC3B;AAEA,IAAA,MAAMK,qBAAoB,MAAA,CAAO,KAAA,EAAO,KAAK,CAAA,CAAA,KAAK,CAAA,CAAE,gBAAgB,IAAI,CAAA;AACxE,IAAA,IAAI,CAACA,kBAAAA,EAAmB,OAAO,MAAA,CAAO,UAAU,EAAC;AAEjD,IAAA,OAAA,CAAQ,MAAA,CAAO,UAAU,EAAC,EAAG,OAAO,CAAA,CAAA,KAAK,CAAA,CAAE,OAAA,KAAYA,kBAAAA,CAAkB,EAAE,CAAA;AAAA,EAC7E,CAAA,EAAG,CAAC,MAAA,EAAQ,IAAI,CAAC,CAAA;AAIjB,EAAA,MAAMC,eAAAA,GAAiBC,iBAAA;AAAA,IACrB,CAAC,KAAA,KAA6CD,+BAAA,CAAe,KAAA,EAAO,MAAM,CAAA;AAAA,IAC1E,CAAC,MAAM;AAAA,GACT;AAEA,EAAA,MAAME,cAAAA,GAAgBD,iBAAA;AAAA,IACpB,CAAC,KAAA,KAAmDC,8BAAA,CAAc,KAAA,EAAO,QAAQF,eAAc,CAAA;AAAA,IAC/F,CAAC,QAAQA,eAAc;AAAA,GACzB;AAGA,EAAA,MAAM,eAAA,GAAkBC,iBAAA;AAAA,IACtB,CAAC,KAAA,KAA6CE,gCAAA,CAAgB,KAAA,EAAO,QAAQH,eAAc,CAAA;AAAA,IAC3F,CAAC,QAAQA,eAAc;AAAA,GACzB;AAEA,EAAA,MAAM,QAAA,GAAWN,cAAQ,MAAM;AAC7B,IAAA,MAAM,UAAA,GAAA,CAAc,MAAA,CAAO,MAAA,IAAU,EAAC,EAAG,MAAA;AAAA,MACvC,CAAA,CAAA,KAAK,EAAE,WAAA,IAAeM,eAAAA,CAAe,CAAC,CAAA,IAAK,CAAYI,+BAAc,CAAC;AAAA,KACxE;AACA,IAAA,OAAO,EAAE,MAAM,UAAA,CAAW,MAAA,CAAO,eAAe,CAAA,CAAE,MAAA,EAAQ,KAAA,EAAO,UAAA,CAAW,MAAA,EAAO;AAAA,EACrF,CAAA,EAAG,CAAC,MAAA,EAAQJ,eAAAA,EAAgB,eAAe,CAAC,CAAA;AAE5C,EAAA,MAAM,WAAA,GAAcN,aAAA;AAAA,IAClB,MAAM,IAAI,GAAA,CAAA,CAAK,MAAA,CAAO,UAAU,EAAC,EAAG,GAAA,CAAI,CAAC,MAAM,CAAC,CAAA,CAAE,IAAA,EAAM,CAAC,CAAU,CAAC,CAAA;AAAA,IACpE,CAAC,OAAO,MAAM;AAAA,GAChB;AAEA,EAAA,MAAM;AAAA,IACJ,eAAA;AAAA,IACA,aAAA;AAAA,IACA,eAAA,EAAiB,UAAA;AAAA,IACjB,cAAA;AAAA,IACA;AAAA,MACEW,gCAAA,CAAgB;AAAA,IAClB,QAAQ,MAAA,CAAO,EAAA;AAAA;AAAA;AAAA,IAGf,YACE,kBAAA,KAAuB,OAAA,GACnB,iBACA,kBAAA,KAAuB,WAAA,GACrB,gBACA,MAAA,CAAO,WAAA;AAAA;AAAA,IAEf,eAAA,EAAiB,CAAC,IAAA,KAAS;AACzB,MAAA,MAAM,KAAA,GAAQ,WAAA,CAAY,GAAA,CAAI,IAAI,CAAA;AAClC,MAAA,OAAO,KAAA,GAAQ,eAAA,CAAgB,KAAK,CAAA,GAAI,KAAA;AAAA,IAC1C;AAAA,GACD,CAAA;AAGD,EAAA,MAAM,YAAA,GAAeJ,kBAAY,MAAe;AAC9C,IAAA,MAAM,YAAoC,EAAC;AAE3C,IAAA,KAAA,MAAW,SAAS,aAAA,EAAe;AACjC,MAAA,MAAM,KAAA,GAAQC,eAAc,KAAK,CAAA;AACjC,MAAA,IAAI,KAAA,EAAO;AACT,QAAA,SAAA,CAAU,KAAA,CAAM,IAAI,CAAA,GAAI,KAAA;AAAA,MAC1B;AAAA,IACF;AAEA,IAAA,SAAA,CAAU,SAAS,CAAA;AACnB,IAAA,OAAO,MAAA,CAAO,IAAA,CAAK,SAAS,CAAA,CAAE,MAAA,KAAW,CAAA;AAAA,EAC3C,CAAA,EAAG,CAAC,aAAA,EAAeA,cAAa,CAAC,CAAA;AAKjC,EAAA,MAAM,WAAA,GAAcD,kBAAY,MAAsD;AACpF,IAAA,MAAM,SAAA,GAAY,MAAA,CAAO,MAAA,IAAU,EAAC;AACpC,IAAA,MAAM,YAAoC,EAAC;AAC3C,IAAA,KAAA,MAAW,SAAS,SAAA,EAAW;AAC7B,MAAA,MAAM,KAAA,GAAQC,eAAc,KAAK,CAAA;AACjC,MAAA,IAAI,KAAA,EAAO,SAAA,CAAU,KAAA,CAAM,IAAI,CAAA,GAAI,KAAA;AAAA,IACrC;AACA,IAAA,SAAA,CAAU,SAAS,CAAA;AACnB,IAAA,IAAI,MAAA,CAAO,IAAA,CAAK,SAAS,CAAA,CAAE,MAAA,KAAW,CAAA,EAAG,OAAO,EAAE,EAAA,EAAI,IAAA,EAAM,cAAA,EAAgB,IAAA,EAAK;AAEjF,IAAA,IAAI,cAAA,GAAgC,IAAA;AACpC,IAAA,IAAI,MAAA,CAAO,aAAA,IAAiB,MAAA,CAAO,KAAA,EAAO;AACxC,MAAA,MAAM,OAAA,GAAU,CAAC,GAAG,MAAA,CAAO,KAAK,CAAA,CAAE,IAAA,CAAK,CAAC,CAAA,EAAG,CAAA,KAAM,CAAA,CAAE,WAAA,GAAc,EAAE,WAAW,CAAA;AAC9E,MAAA,KAAA,MAAW,KAAK,OAAA,EAAS;AACvB,QAAA,IAAI,SAAA,CAAU,IAAA,CAAK,CAAC,CAAA,KAAM,CAAA,CAAE,OAAA,KAAY,CAAA,CAAE,EAAA,IAAM,SAAA,CAAU,CAAA,CAAE,IAAI,CAAC,CAAA,EAAG;AAClE,UAAA,cAAA,GAAiB,CAAA,CAAE,WAAA;AACnB,UAAA;AAAA,QACF;AAAA,MACF;AAAA,IACF;AACA,IAAA,OAAO,EAAE,EAAA,EAAI,KAAA,EAAO,cAAA,EAAe;AAAA,EACrC,CAAA,EAAG,CAAC,MAAA,EAAQA,cAAa,CAAC,CAAA;AAI1B,EAAA,MAAM,kBAAA,GAAqBD,kBAAY,MAA+B;AACpE,IAAA,MAAM,MAA+B,EAAC;AACtC,IAAA,KAAA,MAAW,KAAA,IAAS,MAAA,CAAO,MAAA,IAAU,EAAC,EAAG;AACvC,MAAA,IAAI,CAACD,eAAAA,CAAe,KAAK,CAAA,EAAG;AAC5B,MAAA,IAAI,KAAA,CAAM,QAAQ,MAAA,EAAQ,GAAA,CAAI,MAAM,IAAI,CAAA,GAAI,MAAA,CAAO,KAAA,CAAM,IAAI,CAAA;AAAA,IAC/D;AACA,IAAA,OAAO,GAAA;AAAA,EACT,CAAA,EAAG,CAAC,MAAA,EAAQ,MAAA,EAAQA,eAAc,CAAC,CAAA;AAGnC,EAAA,MAAM,aAAA,GAAgBC,iBAAA,CAAY,CAAC,GAAA,EAAa,KAAA,KAAmB;AACjE,IAAA,UAAA,CAAW,CAAA,IAAA,KAAS,IAAA,CAAK,GAAG,CAAA,GAAI,IAAA,GAAO,EAAE,GAAG,IAAA,EAAM,CAAC,GAAG,GAAG,IAAA,EAAO,CAAA;AAChE,IAAA,SAAA,CAAU,CAAA,IAAA,MAAS,EAAE,GAAG,IAAA,EAAM,CAAC,GAAG,GAAG,OAAM,CAAE,CAAA;AAC7C,IAAA,gBAAA,CAAiB,GAAG,CAAA;AAEpB,IAAA,IAAI,MAAA,CAAO,GAAG,CAAA,EAAG;AACf,MAAA,SAAA,CAAU,CAAA,IAAA,KAAQ;AAChB,QAAA,MAAM,IAAA,GAAO,EAAE,GAAG,IAAA,EAAK;AACvB,QAAA,OAAO,KAAK,GAAG,CAAA;AACf,QAAA,OAAO,IAAA;AAAA,MACT,CAAC,CAAA;AAAA,IACH;AAAA,EACF,CAAA,EAAG,CAAC,MAAA,EAAQ,gBAAgB,CAAC,CAAA;AAG7B,EAAA,MAAM,QAAA,GAAWA,kBAAY,MAAe;AAC1C,IAAA,IAAI,CAAC,YAAA,EAAa,EAAG,OAAO,KAAA;AAE5B,IAAA,IAAI,IAAA,GAAO,OAAO,WAAA,EAAa;AAC7B,MAAA,MAAM,UAAU,IAAA,GAAO,CAAA;AACvB,MAAA,gBAAA,CAAiB,SAAS,CAAA;AAC1B,MAAA,OAAA,CAAQ,OAAO,CAAA;AACf,MAAA,eAAA,CAAgB,OAAO,CAAA;AACvB,MAAA,OAAO,IAAA;AAAA,IACT;AACA,IAAA,OAAO,KAAA;AAAA,EACT,GAAG,CAAC,IAAA,EAAM,OAAO,WAAA,EAAa,YAAA,EAAc,eAAe,CAAC,CAAA;AAE5D,EAAA,MAAM,QAAA,GAAWA,kBAAY,MAAM;AACjC,IAAA,IAAI,OAAO,CAAA,EAAG;AACZ,MAAA,MAAM,UAAU,IAAA,GAAO,CAAA;AACvB,MAAA,gBAAA,CAAiB,MAAM,CAAA;AACvB,MAAA,OAAA,CAAQ,OAAO,CAAA;AACf,MAAA,eAAA,CAAgB,OAAO,CAAA;AAAA,IACzB;AAAA,EACF,CAAA,EAAG,CAAC,IAAA,EAAM,eAAe,CAAC,CAAA;AAE1B,EAAA,MAAM,QAAA,GAAWA,iBAAA,CAAY,CAAC,UAAA,KAAuB;AACnD,IAAA,IAAI,UAAA,IAAc,CAAA,IAAK,UAAA,IAAc,MAAA,CAAO,WAAA,EAAa;AACvD,MAAA,gBAAA,CAAiB,UAAA,GAAa,IAAA,GAAO,MAAA,GAAS,SAAS,CAAA;AACvD,MAAA,OAAA,CAAQ,UAAU,CAAA;AAClB,MAAA,eAAA,CAAgB,UAAU,CAAA;AAAA,IAC5B;AAAA,EACF,GAAG,CAAC,IAAA,EAAM,MAAA,CAAO,WAAA,EAAa,eAAe,CAAC,CAAA;AAG9C,EAAA,MAAM,MAAA,GAASA,kBAAY,YAAY;AAGrC,IAAA,IAAI,gBAAgB,OAAA,EAAS;AAE7B,IAAA,MAAM,EAAE,EAAA,EAAI,cAAA,EAAe,GAAI,WAAA,EAAY;AAC3C,IAAA,IAAI,CAAC,EAAA,EAAI;AACP,MAAA,IAAI,kBAAkB,IAAA,EAAM;AAC1B,QAAA,gBAAA,CAAiB,MAAM,CAAA;AACvB,QAAA,OAAA,CAAQ,cAAc,CAAA;AAAA,MACxB;AACA,MAAA;AAAA,IACF;AAEA,IAAA,eAAA,CAAgB,OAAA,GAAU,IAAA;AAC1B,IAAA,eAAA,CAAgB,IAAI,CAAA;AACpB,IAAA,cAAA,CAAe,IAAI,CAAA;AAEnB,IAAA,IAAI;AACF,MAAA,MAAM,IAAA,GAAO,MAAMK,2BAAA,CAAW;AAAA,QAC5B,MAAA;AAAA,QACA,QAAQ,kBAAA,EAAmB;AAAA,QAC3B,aAAA,EAAe,MAAA,CAAO,gBAAA,GAAmB,aAAA,GAAgB,EAAA;AAAA,QACzD,cAAc,YAAA,CAAa;AAAA,OAC5B,CAAA;AAED,MAAA,aAAA,EAAc;AACd,MAAA,aAAA,CAAc,IAAI,CAAA;AAClB,MAAA,SAAA,GAAY,IAAI,CAAA;AAEhB,MAAA,IAAI,OAAO,YAAA,EAAc;AACvB,QAAA,MAAA,CAAO,QAAA,CAAS,OAAO,MAAA,CAAO,YAAA;AAAA,MAChC;AAAA,IACF,SAAS,KAAA,EAAO;AACd,MAAA,OAAA,CAAQ,KAAA,CAAM,6BAA6B,KAAK,CAAA;AAChD,MAAA,cAAA,CAAe,iEAAiE,CAAA;AAChF,MAAA,OAAA,GAAU,KAAc,CAAA;AAAA,IAC1B,CAAA,SAAE;AACA,MAAA,eAAA,CAAgB,OAAA,GAAU,KAAA;AAC1B,MAAA,eAAA,CAAgB,KAAK,CAAA;AAAA,IACvB;AAAA,EACF,CAAA,EAAG,CAAC,MAAA,EAAQ,aAAA,EAAe,aAAa,kBAAA,EAAoB,aAAA,EAAe,SAAA,EAAW,OAAO,CAAC,CAAA;AAG9F,EAAA,MAAM,QAAA,GAAWZ,cAAQ,MAAM;AAC7B,IAAA,OAAO,IAAA,CAAK,KAAA,CAAO,IAAA,GAAO,MAAA,CAAO,cAAe,GAAG,CAAA;AAAA,EACrD,CAAA,EAAG,CAAC,IAAA,EAAM,MAAA,CAAO,WAAW,CAAC,CAAA;AAI7B,EAAA,MAAM,iBAAA,GAAoBA,aAAA;AAAA,IACxB,MAAM,OAAO,KAAA,EAAO,IAAA,CAAK,CAAC,CAAA,KAAM,CAAA,CAAE,gBAAgB,IAAI,CAAA;AAAA,IACtD,CAAC,MAAA,CAAO,KAAA,EAAO,IAAI;AAAA,GACrB;AAKA,EAAA,MAAM,YAAA,GAAeD,aAA8B,IAAI,CAAA;AACvD,EAAA,MAAM,eAAA,GAAkBA,aAAO,KAAK,CAAA;AACpC,EAAAK,eAAA,CAAU,MAAM;AACd,IAAA,IAAI,CAAC,OAAO,aAAA,EAAe;AAC3B,IAAA,IAAI,CAAC,gBAAgB,OAAA,EAAS;AAC5B,MAAA,eAAA,CAAgB,OAAA,GAAU,IAAA;AAC1B,MAAA;AAAA,IACF;AACA,IAAA,YAAA,CAAa,SAAS,KAAA,EAAM;AAAA,EAC9B,CAAA,EAAG,CAAC,IAAA,EAAM,MAAA,CAAO,aAAa,CAAC,CAAA;AAK/B,EAAA,MAAM,eAAA,GAAkBS,mCAAA,CAAmB,MAAA,EAAQ,UAAU,CAAA;AAG7D,EAAA,MAAM,WAAA,GAA+B;AAAA,IACnC,MAAA;AAAA,IACA,MAAA,EAAQ,aAAA;AAAA,IACR,IAAA;AAAA,IACA,YAAY,MAAA,CAAO,WAAA;AAAA,IACnB,MAAA;AAAA,IACA,MAAA;AAAA,IACA,YAAA;AAAA,IACA,QAAA;AAAA,IACA,QAAA;AAAA,IACA,QAAA;AAAA,IACA,QAAA;AAAA,IACA,MAAA;AAAA,IACA,aAAA;AAAA,IACA,cAAA,EAAAP,eAAAA;AAAA,IACA,eAAA;AAAA,IACA;AAAA,GACF;AAGA,EAAA,IAAI,UAAA,EAAY;AACd,IAAA,MAAM,MAAM,MAAA,CAAO,eAAA;AACnB,IAAA,MAAM,OAAA,GACJ,OAAO,GAAA,KAAQ,QAAA,IAAY,GAAA,CAAI,IAAA,EAAK,CAAE,MAAA,GAAS,CAAA,GAC3C,GAAA,CAAI,IAAA,EAAK,GACTQ,6CAAA;AAON,IAAA,IAAI,WAAA,EAAa,uBAAOC,cAAA,CAAC,WAAA,EAAA,EAAY,SAAkB,SAAA,EAAsB,CAAA;AAC7E,IAAA,uBACEA,cAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAsB,cAAA,EAAa,sBAAA,EAAuB,MAAK,QAAA,EAClE,QAAA,kBAAAA,cAAA,CAAC,GAAA,EAAA,EAAG,QAAA,EAAA,OAAA,EAAQ,CAAA,EACd,CAAA;AAAA,EAEJ;AAGA,EAAA,IAAI,YAAA,EAAc;AAChB,IAAA,uBAAOA,cAAA,CAAAC,mBAAA,EAAA,EAAG,QAAA,EAAA,YAAA,CAAa,WAAW,CAAA,EAAE,CAAA;AAAA,EACtC;AAKA,EAAA,IAAI,kBAAA,KAAuB,aAAa,UAAA,EAAY;AAClD,IAAA,MAAM,MAAA,GAAgC;AAAA,MACpC,MAAA;AAAA,MACA,MAAA;AAAA,MACA,MAAA;AAAA,MACA,OAAA;AAAA,MACA,YAAA;AAAA,MACA,WAAA;AAAA,MACA,QAAA;AAAA,MACA,SAAA;AAAA,MACA,aAAA;AAAA,MACA,aAAA,EAAAR,cAAAA;AAAA,MACA,cAAA,EAAAF,eAAAA;AAAA,MACA,eAAA;AAAA,MACA,eAAA,EAAiB,CAAC,IAAA,EAAM,OAAA,KACtB,UAAU,CAAC,IAAA,MAAU,EAAE,GAAG,IAAA,EAAM,CAAC,IAAI,GAAG,SAAQ,CAAE,CAAA;AAAA,MACpD,MAAA;AAAA,MACA,eAAA;AAAA,MACA,eAAA;AAAA,MACA,cAAA;AAAA,MACA,QAAA,EAAU,OAAO,gBAAA,mBACfS,cAAA;AAAA,QAACE,8BAAA;AAAA,QAAA;AAAA,UACC,IAAA,EAAM,iBAAA;AAAA,UACN,KAAA,EAAO,aAAA;AAAA,UACP,QAAA,EAAU;AAAA;AAAA,OACZ,GACE;AAAA,KACN;AACA,IAAA,uBACEC,eAAA,CAAAF,mBAAA,EAAA,EACE,QAAA,EAAA;AAAA,sBAAAD,cAAA,CAACI,8BAAA,EAAA,EAAc,CAAA;AAAA,sBACfJ,cAAA,CAAC,UAAA,EAAA,EAAY,GAAG,MAAA,EAAQ;AAAA,KAAA,EAC1B,CAAA;AAAA,EAEJ;AAGA,EAAA,uBACEG,eAAA;AAAA,IAAC,MAAA;AAAA,IAAA;AAAA,MAAK,eAAA,EAAe,eAAe,YAAA,GAAe,MAAA;AAAA,MAGjD,eAAA,EACE,QAAA,CAAS,KAAA,GAAQ,CAAA,IAAK,QAAA,CAAS,IAAA,IAAQ,QAAA,CAAS,KAAA,IAAS,IAAA,IAAQ,MAAA,CAAO,WAAA,GACpE,MAAA,GACA,MAAA;AAAA,MAEN,SAAA,EAAW,CAAA,QAAA,EAAW,SAAA,IAAa,EAAE,CAAA,CAAA;AAAA,MAGrC,MAAA,EAAO,MAAA;AAAA,MACP,QAAA,EAAU,CAAC,CAAA,KAAM;AACf,QAAA,CAAA,CAAE,cAAA,EAAe;AACjB,QAAA,IAAI,IAAA,GAAO,OAAO,WAAA,EAAa;AAC7B,UAAA,QAAA,EAAS;AAAA,QACX,CAAA,MAAO;AACL,UAAA,MAAA,EAAO;AAAA,QACT;AAAA,MACF,CAAA;AAAA,MAEA,QAAA,EAAA;AAAA,wBAAAH,cAAA,CAACI,8BAAA,EAAA,EAAc,CAAA;AAAA,uCACdC,6BAAA,EAAA,EAAa,IAAA,EAAM,SAAS,IAAA,EAAM,KAAA,EAAO,SAAS,KAAA,EAAO,CAAA;AAAA,QAEzD,MAAA,CAAO,aAAA,oBACNF,eAAA,CAAC,KAAA,EAAA,EAAI,WAAU,mBAAA,EACb,QAAA,EAAA;AAAA,0BAAAA,eAAA,CAAC,KAAA,EAAA,EAAI,WAAU,0BAAA,EACb,QAAA,EAAA;AAAA,4BAAAA,eAAA,CAAC,MAAA,EAAA,EAAK,WAAU,wBAAA,EAAyB,QAAA,EAAA;AAAA,cAAA,OAAA;AAAA,cACjC,IAAA;AAAA,cAAK,MAAA;AAAA,cAAK,MAAA,CAAO;AAAA,aAAA,EACzB,CAAA;AAAA,YAGC,MAAA,CAAO,aAAA,oBACNA,eAAA,CAAC,MAAA,EAAA,EAAK,WAAU,2BAAA,EAA6B,QAAA,EAAA;AAAA,cAAA,QAAA;AAAA,cAAS;AAAA,aAAA,EAAC;AAAA,WAAA,EAE3D,CAAA;AAAA,0BACAH,cAAA;AAAA,YAAC,KAAA;AAAA,YAAA;AAAA,cACC,SAAA,EAAU,yBAAA;AAAA,cACV,IAAA,EAAK,aAAA;AAAA,cACL,eAAA,EAAe,CAAA;AAAA,cACf,iBAAe,MAAA,CAAO,WAAA;AAAA,cACtB,eAAA,EAAe,IAAA;AAAA,cACf,gBAAA,EAAgB,CAAA,KAAA,EAAQ,IAAI,CAAA,IAAA,EAAO,OAAO,WAAW,CAAA,CAAA;AAAA,cAErD,QAAA,kBAAAA,cAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,uBAAA,EAAwB,KAAA,EAAO,EAAE,KAAA,EAAO,CAAA,EAAG,QAAQ,CAAA,CAAA,CAAA,EAAI,EAAG;AAAA;AAAA,WAC3E;AAAA,0BACAA,cAAA,CAAC,QAAG,SAAA,EAAU,wBAAA,EAAyB,eAAY,MAAA,EAChD,QAAA,EAAA,KAAA,CAAM,KAAK,EAAE,MAAA,EAAQ,OAAO,WAAA,EAAY,EAAG,CAAC,CAAA,EAAG,CAAA,KAAM,IAAI,CAAC,CAAA,CAAE,GAAA,CAAI,CAAC,CAAA,qBAChEA,cAAA;AAAA,YAAC,IAAA;AAAA,YAAA;AAAA,cAEC,SAAA,EACE,2BACC,CAAA,KAAM,IAAA,GAAO,oCAAoC,EAAA,CAAA,IACjD,CAAA,GAAI,OAAO,8BAAA,GAAiC,EAAA;AAAA,aAAA;AAAA,YAJ1C;AAAA,WAOR,CAAA,EACH;AAAA,SAAA,EACF,CAAA;AAAA,wBAIFG,eAAA;AAAA,UAAC,KAAA;AAAA,UAAA;AAAA,YAEC,GAAA,EAAK,YAAA;AAAA,YACL,QAAA,EAAU,EAAA;AAAA,YACV,WACE,eAAA,IACC,MAAA,CAAO,aAAA,GAAgB,CAAA,gBAAA,EAAmB,aAAa,CAAA,CAAA,GAAK,EAAA,CAAA;AAAA,YAG9D,QAAA,EAAA;AAAA,cAAA,MAAA,CAAO,aAAA,KAAkB,mBAAmB,KAAA,IAAS,iBAAA,EAAmB,gCACvEA,eAAA,CAAC,KAAA,EAAA,EAAI,WAAU,qBAAA,EACZ,QAAA,EAAA;AAAA,gBAAA,iBAAA,CAAkB,yBACjBH,cAAA,CAAC,IAAA,EAAA,EAAG,SAAA,EAAU,qBAAA,EAAuB,4BAAkB,KAAA,EAAM,CAAA;AAAA,gBAE9D,kBAAkB,WAAA,oBACjBA,cAAA,CAAC,OAAE,SAAA,EAAU,2BAAA,EAA6B,4BAAkB,WAAA,EAAY;AAAA,eAAA,EAE5E,CAAA;AAAA,6CAGD,KAAA,EAAA,EAAI,SAAA,EAAU,mBACZ,QAAA,EAAA,aAAA,CAAc,GAAA,CAAI,CAAC,KAAA,KAAU;AAC5B,gBAAA,IAAI,CAACT,eAAAA,CAAe,KAAK,CAAA,EAAG,OAAO,IAAA;AAEnC,gBAAA,sCACG,KAAA,EAAA,EAAmB,SAAA,EAAW,kDAAkD,KAAA,CAAM,KAAA,IAAS,MAAM,CAAA,CAAA,EACpG,QAAA,kBAAAS,cAAA;AAAA,kBAACM,0BAAA;AAAA,kBAAA;AAAA,oBACC,KAAA;AAAA,oBACA,KAAA,EAAO,MAAA,CAAO,KAAA,CAAM,IAAI,CAAA;AAAA,oBACxB,KAAA,EAAO,MAAA,CAAO,KAAA,CAAM,IAAI,CAAA;AAAA,oBACxB,SAAA,EAAW,CAAC,CAAC,OAAA,CAAQ,KAAA,CAAM,IAAI,CAAA,IAAK,CAAC,MAAA,CAAO,KAAA,CAAM,IAAI,CAAA,IAAK,gBAAgB,KAAK,CAAA;AAAA,oBAChF,UAAU,CAAC,KAAA,KAAU,aAAA,CAAc,KAAA,CAAM,MAAM,KAAK,CAAA;AAAA,oBACpD,OAAA,EAAS,MAAM,eAAA,CAAgB,KAAA,CAAM,IAAI,CAAA;AAAA,oBACzC,MAAA,EAAQ,MAAM,cAAA,CAAe,KAAA,CAAM,IAAI,CAAA;AAAA,oBACvC,QAAA,EAAU;AAAA;AAAA,iBACZ,EAAA,EAVQ,MAAM,EAWhB,CAAA;AAAA,cAEJ,CAAC,CAAA,EACH;AAAA;AAAA,WAAA;AAAA,UAtCK;AAAA,SAuCP;AAAA,wBAGAH,eAAA;AAAA,UAAC,KAAA;AAAA,UAAA;AAAA,YACC,SAAA,EAAU,kBAAA;AAAA,YACV,OAAO,EAAE,cAAA,EAAgB,IAAA,GAAO,CAAA,GAAI,kBAAkB,UAAA,EAAW;AAAA,YAEhE,QAAA,EAAA;AAAA,cAAA,IAAA,GAAO,CAAA,mCACL,QAAA,EAAA,EAAO,IAAA,EAAK,UAAS,SAAA,EAAU,iCAAA,EAAkC,OAAA,EAAS,QAAA,EAAU,QAAA,EAAA,MAAA,EAErF,CAAA;AAAA,8BAEFH,cAAA,CAAC,QAAA,EAAA,EAAO,IAAA,EAAK,QAAA,EAAS,WAAU,mCAAA,EAAoC,QAAA,EAAU,YAAA,EAC3E,QAAA,EAAA,YAAA,GACG,kBACA,IAAA,GAAO,MAAA,CAAO,WAAA,GACZ,MAAA,GACA,OAAO,kBAAA,EAEf;AAAA;AAAA;AAAA,SACF;AAAA,QAEC,WAAA,oBACCA,cAAA;AAAA,UAAC,GAAA;AAAA,UAAA;AAAA,YACC,SAAA,EAAU,uBAAA;AAAA,YACV,IAAA,EAAK,OAAA;AAAA,YACL,OAAO,EAAE,KAAA,EAAO,4BAA4B,QAAA,EAAU,EAAA,EAAI,WAAW,EAAA,EAAG;AAAA,YAEvE,QAAA,EAAA;AAAA;AAAA,SACH;AAAA,QAKD,OAAO,gBAAA,oBACNA,cAAA;AAAA,UAACE,8BAAA;AAAA,UAAA;AAAA,YACC,IAAA,EAAM,iBAAA;AAAA,YACN,KAAA,EAAO,aAAA;AAAA,YACP,QAAA,EAAU;AAAA;AAAA;AACZ;AAAA;AAAA,GAGJ;AAEJ;ACxnBO,SAAS,WAAA,CAAY;AAAA,EAC1B,MAAA;AAAA,EACA,SAAA;AAAA,EACA,SAAA;AAAA,EACA,SAAA;AAAA,EACA,OAAA;AAAA,EACA,aAAA;AAAA,EACA,UAAA;AAAA,EACA,aAAA;AAAA,EACA;AACF,CAAA,EAAqB;AACnB,EAAA,MAAM;AAAA,IACJ,IAAA;AAAA,IACA,SAAA;AAAA,IACA;AAAA,GACF,GAAIK,yBAAQ,MAAA,EAAQ;AAAA,IAClB,SAAA;AAAA,IACA,SAAA;AAAA,IACA,OAAA;AAAA,IACA,WAAA,EAAa,aAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,IAUb,cAAA,EAAgB;AAAA,GACjB,CAAA;AAED,EAAA,IAAI,SAAA,EAAW;AACb,IAAA,uBACEP,cAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EACH,QAAA,kBAAAA,cAAAA,CAAC,GAAA,EAAA,EAAE,KAAA,EAAO,EAAE,KAAA,EAAO,SAAA,EAAU,EAAG,6BAAe,CAAA,EACjD,CAAA;AAAA,EAEJ;AAEA,EAAA,IAAI,UAAA,IAAc,CAAC,IAAA,EAAM;AACvB,IAAA,uBACEA,cAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EACH,0BAAAA,cAAAA,CAAC,GAAA,EAAA,EAAE,KAAA,EAAO,EAAE,OAAO,0BAAA,EAA2B,EAC3C,QAAA,EAAA,UAAA,EAAY,OAAA,IAAW,+BAC1B,CAAA,EACF,CAAA;AAAA,EAEJ;AAGA,EAAA,uBACEA,cAAAA;AAAA,IAAC,UAAA;AAAA,IAAA;AAAA,MACC,MAAA,EAAQ,IAAA;AAAA,MACR,SAAA;AAAA,MACA,SAAA;AAAA,MACA,OAAA;AAAA,MACA,YAAA,EAAc,QAAA;AAAA,MACd,UAAA;AAAA,MACA;AAAA;AAAA,GACF;AAEJ","file":"chunk-F2GECCK7.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 * as fieldRules from './field-rules'\nimport { FormField } from './FormField'\nimport { submitForm, DEFAULT_HONEYPOT_FIELD } from './submitForm'\nimport { useRecaptchaWarmup } from './recaptcha-warmup'\nimport type { \n ManagedFormConfig, \n FormField as FormFieldType, \n FormRenderProps,\n FormSubmitResult,\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 { countStageViews, countStageQuestions } from './experience-plan'\nimport type { ExperienceRenderProps, FormExperience } from './types'\n\ninterface FormClientProps {\n config: ManagedFormConfig\n className?: string\n onSuccess?: (submission: FormSubmitResult) => 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 /**\n * @deprecated Ignored since 6.3.2. It set where the no-JavaScript form POST\n * returned to, and that path was removed (bots used it; no person ever did).\n * Kept so existing call sites still type-check.\n */\n nativeReturnTo?: string\n}\n\nexport function FormClient({\n config,\n className,\n onSuccess,\n onError,\n customRender,\n experience,\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 // 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 // Visibility, validation and completeness all come from field-rules.ts,\n // shared with useForm. These wrappers only bind the current values.\n const isFieldVisible = useCallback(\n (field: FormFieldType): boolean => fieldRules.isFieldVisible(field, values),\n [values],\n )\n\n const validateField = useCallback(\n (field: FormFieldType): string | null => fieldRules.validateField(field, values, isFieldVisible),\n [values, isFieldVisible],\n )\n\n // Delight: per-field validity for the tick + fields-completed momentum.\n const fieldIsComplete = useCallback(\n (field: FormFieldType): boolean => fieldRules.isFieldComplete(field, values, isFieldVisible),\n [values, isFieldVisible],\n )\n\n const momentum = useMemo(() => {\n const measurable = (config.fields || []).filter(\n f => f.is_required && isFieldVisible(f) && !fieldRules.isDisplayOnly(f),\n )\n return { done: measurable.filter(fieldIsComplete).length, total: measurable.length }\n }, [config, isFieldVisible, fieldIsComplete])\n\n const fieldBySlug = useMemo(\n () => new Map((config.fields || []).map((f) => [f.slug, f] as const)),\n [config.fields],\n )\n\n const {\n trackStepChange,\n trackComplete,\n trackFieldFocus: trackFocus,\n trackFieldBlur,\n trackFieldChange,\n } = 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 // Same verdict as the valid tick and the momentum count.\n isFieldComplete: (slug) => {\n const field = fieldBySlug.get(slug)\n return field ? fieldIsComplete(field) : false\n },\n })\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 trackFieldChange(key)\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, trackFieldChange])\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)\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 // Every renderer below reports focus through this, so the first focus in\n // any experience starts loading reCAPTCHA before the visitor hits submit.\n const trackFieldFocus = useRecaptchaWarmup(config, trackFocus)\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 trackFieldFocus,\n trackFieldBlur,\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 trackFieldFocus,\n trackFieldBlur,\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 // POST, never GET: nothing a visitor typed may end up in a URL. The\n // preventDefault below always handles the submit.\n method=\"post\"\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 onFocus={() => trackFieldFocus(field.slug)}\n onBlur={() => trackFieldBlur(field.slug)}\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 </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 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 defaultValues={defaultValues}\n />\n )\n}\n\n"]}
@@ -0,0 +1,127 @@
1
+ import { resolvePublicationUrl, createPublicationRoutes } from './chunk-6C47333H.mjs';
2
+
3
+ // src/articles/artwork.ts
4
+ function resolveArticleArtwork(post, placement = "card") {
5
+ const editorial = placement === "article" && !!post.editorial_image;
6
+ const src = (editorial ? post.editorial_image : post.featured_image) || void 0;
7
+ const alt = editorial ? post.editorial_image_alt ?? "" : post.featured_image_alt ?? post.title ?? "";
8
+ let composed = false;
9
+ if (src) {
10
+ try {
11
+ composed = /\/Blog\/Cards\//i.test(new URL(src, "https://site-kit.invalid").pathname);
12
+ } catch {
13
+ }
14
+ }
15
+ return { src, alt, composed };
16
+ }
17
+ function articleArtworkImageStyle(artwork) {
18
+ return artwork.composed ? { display: "block", height: "auto", maxHeight: "none", objectFit: "contain", transform: "none" } : void 0;
19
+ }
20
+
21
+ // src/articles/author-schema.ts
22
+ var ARTICLE_TYPES = /* @__PURE__ */ new Set(["Article", "BlogPosting", "NewsArticle", "TechArticle", "Report", "ScholarlyArticle"]);
23
+ function isAbsoluteUrl(value) {
24
+ return /^https?:\/\//i.test(value);
25
+ }
26
+ function routedAuthorPageUrl(author, options) {
27
+ return resolvePublicationUrl(createPublicationRoutes(options).author(author.slug), options.siteUrl ?? "");
28
+ }
29
+ function authorProfileUrl(author, options) {
30
+ return author.author_page_url?.trim() || routedAuthorPageUrl(author, options);
31
+ }
32
+ function authorEntityId(author, profileUrl) {
33
+ const explicit = author.entity_id?.trim();
34
+ if (explicit) return explicit;
35
+ if (!profileUrl || !isAbsoluteUrl(profileUrl)) return void 0;
36
+ return `${profileUrl.replace(/#.*$/, "")}#person`;
37
+ }
38
+ function generateAuthorPersonSchema(author, options = {}) {
39
+ const { siteUrl, siteName } = options;
40
+ const sameAs = [...author.same_as || []];
41
+ if (author.linkedin_url) sameAs.push(author.linkedin_url);
42
+ if (author.twitter_url) sameAs.push(author.twitter_url);
43
+ if (author.website_url) sameAs.push(author.website_url);
44
+ if (author.social_links?.twitter) sameAs.push(`https://twitter.com/${author.social_links.twitter}`);
45
+ if (author.social_links?.linkedin) sameAs.push(author.social_links.linkedin);
46
+ if (author.social_links?.github) sameAs.push(`https://github.com/${author.social_links.github}`);
47
+ const uniqueSameAs = [...new Set(sameAs.filter(Boolean))];
48
+ const url = authorProfileUrl(author, options);
49
+ const id = authorEntityId(author, url);
50
+ const person = {
51
+ "@type": "Person",
52
+ ...id ? { "@id": id } : {},
53
+ name: author.name,
54
+ url
55
+ };
56
+ if (author.title) person.jobTitle = author.title;
57
+ if (author.company || siteName) {
58
+ person.worksFor = {
59
+ "@type": "Organization",
60
+ name: author.company || siteName,
61
+ ...siteUrl ? { url: siteUrl } : {}
62
+ };
63
+ }
64
+ if (author.bio || author.short_bio) person.description = author.short_bio || author.bio;
65
+ if (author.avatar_url) person.image = author.avatar_url;
66
+ if (uniqueSameAs.length > 0) person.sameAs = uniqueSameAs;
67
+ if (author.knows_about && author.knows_about.length > 0) person.knowsAbout = author.knows_about;
68
+ if (author.credentials && author.credentials.length > 0) {
69
+ person.hasCredential = author.credentials.map((c) => ({
70
+ "@type": "EducationalOccupationalCredential",
71
+ credentialCategory: c
72
+ }));
73
+ }
74
+ return person;
75
+ }
76
+ function generateAuthorSchema(author, options = {}) {
77
+ const pageUrl = routedAuthorPageUrl(author, options);
78
+ const schema = {
79
+ "@context": "https://schema.org",
80
+ "@type": "ProfilePage",
81
+ ...isAbsoluteUrl(pageUrl) ? { "@id": `${pageUrl}#profilepage` } : {},
82
+ url: pageUrl,
83
+ name: author.name,
84
+ mainEntity: generateAuthorPersonSchema(author, options)
85
+ };
86
+ if (author.created_at) schema.dateCreated = author.created_at;
87
+ if (author.updated_at) schema.dateModified = author.updated_at;
88
+ return schema;
89
+ }
90
+ function generateArticleAuthorNode(author, options = {}) {
91
+ if (!author) return void 0;
92
+ if (typeof author === "string") {
93
+ const name = author.trim();
94
+ return name ? { "@type": "Person", name } : void 0;
95
+ }
96
+ if (!author.name) return void 0;
97
+ const url = author.author_page_url?.trim() || (options.authorPages && author.slug ? routedAuthorPageUrl(author, options) : void 0);
98
+ const id = authorEntityId(author, url);
99
+ return {
100
+ "@type": "Person",
101
+ ...id ? { "@id": id } : {},
102
+ name: author.name,
103
+ ...url ? { url } : {}
104
+ };
105
+ }
106
+ function withArticleAuthorIdentity(node, author, options = {}) {
107
+ if (!node || typeof node !== "object" || Array.isArray(node)) return node;
108
+ const record = node;
109
+ const types = [].concat(record["@type"]);
110
+ if (!types.some((t) => typeof t === "string" && ARTICLE_TYPES.has(t))) return node;
111
+ const stored = record.author;
112
+ if (!stored || typeof stored !== "object" || Array.isArray(stored)) return node;
113
+ const byline = stored;
114
+ if (byline["@type"] !== "Person" || typeof byline.name !== "string") return node;
115
+ const identity = generateArticleAuthorNode(author, options);
116
+ if (!identity || typeof identity.name !== "string") return node;
117
+ if (identity.name.trim().toLowerCase() !== byline.name.trim().toLowerCase()) return node;
118
+ const additions = {};
119
+ if (!byline["@id"] && identity["@id"]) additions["@id"] = identity["@id"];
120
+ if (!byline.url && identity.url) additions.url = identity.url;
121
+ if (Object.keys(additions).length === 0) return node;
122
+ return { ...record, author: { ...byline, ...additions } };
123
+ }
124
+
125
+ export { articleArtworkImageStyle, authorEntityId, generateArticleAuthorNode, generateAuthorPersonSchema, generateAuthorSchema, resolveArticleArtwork, withArticleAuthorIdentity };
126
+ //# sourceMappingURL=chunk-GFSQMK35.mjs.map
127
+ //# sourceMappingURL=chunk-GFSQMK35.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/articles/artwork.ts","../src/articles/author-schema.ts"],"names":[],"mappings":"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","file":"chunk-GFSQMK35.mjs","sourcesContent":["import type { CSSProperties } from 'react'\nimport type { Article } from './types'\n\nexport interface ArticleArtwork {\n src: string | undefined\n alt: string\n composed: boolean\n}\n\ntype ArtworkSource = Pick<Article, 'title' | 'featured_image' | 'featured_image_alt' | 'editorial_image' | 'editorial_image_alt'>\n\n/** Single source of truth for article artwork versus complete promotional cards. */\nexport function resolveArticleArtwork(post: ArtworkSource, placement: 'article' | 'card' = 'card'): ArticleArtwork {\n const editorial = placement === 'article' && !!post.editorial_image\n const src = (editorial ? post.editorial_image : post.featured_image) || undefined\n const alt = editorial\n ? post.editorial_image_alt ?? ''\n : post.featured_image_alt ?? post.title ?? ''\n let composed = false\n if (src) {\n try {\n // Inspect the path, not a query string that happens to mention a card.\n // `Blog/Cards/` is the storage folder Sonor writes cards to (a path, not a name).\n composed = /\\/Blog\\/Cards\\//i.test(new URL(src, 'https://site-kit.invalid').pathname)\n } catch { /* An unrecognized source retains the normal photograph layout. */ }\n }\n return { src, alt, composed }\n}\n\n/** Preserve generated text and graphics across every stock card surface. */\nexport function articleArtworkImageStyle(artwork: ArticleArtwork): CSSProperties | undefined {\n return artwork.composed\n ? { display: 'block', height: 'auto', maxHeight: 'none', objectFit: 'contain', transform: 'none' }\n : undefined\n}\n","/**\n * @sonordev/site-kit/articles — Author JSON-LD (pure)\n *\n * Split out of `./server-core` on purpose. Everything here is a pure function:\n * it maps an `ArticleAuthor` to schema objects and touches no env, no config,\n * and no network. It only ever lived in `server-core` because the other author\n * helpers there (`getAuthorBySlug`, `getAuthorPosts`) do fetch.\n *\n * `AuthorPage` is exported from the client-stamped `@sonordev/site-kit/articles`\n * barrel (see `./index.ts`), so importing these from `server-core` dragged that\n * whole server module — its `x-api-key` fetches included — into the browser\n * bundle. Keeping the pure half here means `AuthorPage` can stay in the barrel\n * without pulling a single line of server code with it.\n *\n * Anything added here must stay pure. If it needs an API key or a fetch, it\n * belongs in `./server-core`, not in this file.\n *\n * Identity model (single source of truth for every author node the kit emits):\n * - The author page is a `ProfilePage` whose `mainEntity` is the `Person`\n * (Google's profile-page markup for author pages).\n * - The `Person` carries one `@id` everywhere it appears (`authorEntityId`):\n * the row's `entity_id` when the person has a cross-site identity (e.g.\n * https://ramseydeal.com/#person), else `<author profile URL>#person`.\n * - Article bylines (`generateArticleAuthorNode`) reference that same `@id`,\n * so an article, its author page and the person's own site describe one\n * person, which is what a Knowledge Panel is built from.\n */\n\nimport type { ArticleAuthor } from './types'\nimport { createPublicationRoutes, resolvePublicationUrl, type PublicationRoutingOptions } from './routes'\n\nexport type AuthorSchemaOptions = PublicationRoutingOptions & { siteUrl?: string; siteName?: string }\n\nconst ARTICLE_TYPES = new Set(['Article', 'BlogPosting', 'NewsArticle', 'TechArticle', 'Report', 'ScholarlyArticle'])\n\nfunction isAbsoluteUrl(value: string): boolean {\n return /^https?:\\/\\//i.test(value)\n}\n\n/** This site's page for the author, the page `AuthorPage` renders. */\nfunction routedAuthorPageUrl(author: Pick<ArticleAuthor, 'slug'>, options: AuthorSchemaOptions): string {\n return resolvePublicationUrl(createPublicationRoutes(options).author(author.slug), options.siteUrl ?? '')\n}\n\n/** Where the Person points `url`: the row's canonical author page, else this site's. */\nfunction authorProfileUrl(author: Pick<ArticleAuthor, 'slug' | 'author_page_url'>, options: AuthorSchemaOptions): string {\n return author.author_page_url?.trim() || routedAuthorPageUrl(author, options)\n}\n\n/**\n * Single source of truth for an author's Person `@id`.\n *\n * The row's `entity_id` (one id shared by every site that describes the\n * person) wins. Otherwise the Person lives at `<profile URL>#person`. A\n * relative profile URL gives no `@id`: an id must be absolute to mean the\n * same thing on every page.\n */\nexport function authorEntityId(\n author: Pick<ArticleAuthor, 'entity_id'>,\n profileUrl?: string,\n): string | undefined {\n const explicit = author.entity_id?.trim()\n if (explicit) return explicit\n if (!profileUrl || !isAbsoluteUrl(profileUrl)) return undefined\n return `${profileUrl.replace(/#.*$/, '')}#person`\n}\n\n/**\n * The bare `Person` for an author, with no `@context`, for embedding in a\n * larger graph (an Organization's `founder`, an `@graph` array). Author pages\n * want `generateAuthorSchema`, which wraps this in a `ProfilePage`.\n */\nexport function generateAuthorPersonSchema(\n author: ArticleAuthor,\n options: AuthorSchemaOptions = {},\n): Record<string, unknown> {\n const { siteUrl, siteName } = options\n\n const sameAs: string[] = [...(author.same_as || [])]\n if (author.linkedin_url) sameAs.push(author.linkedin_url)\n if (author.twitter_url) sameAs.push(author.twitter_url)\n if (author.website_url) sameAs.push(author.website_url)\n if (author.social_links?.twitter) sameAs.push(`https://twitter.com/${author.social_links.twitter}`)\n if (author.social_links?.linkedin) sameAs.push(author.social_links.linkedin)\n if (author.social_links?.github) sameAs.push(`https://github.com/${author.social_links.github}`)\n\n // Deduplicate\n const uniqueSameAs = [...new Set(sameAs.filter(Boolean))]\n\n const url = authorProfileUrl(author, options)\n const id = authorEntityId(author, url)\n\n const person: Record<string, any> = {\n '@type': 'Person',\n ...(id ? { '@id': id } : {}),\n name: author.name,\n url,\n }\n\n if (author.title) person.jobTitle = author.title\n if (author.company || siteName) {\n person.worksFor = {\n '@type': 'Organization',\n name: author.company || siteName,\n ...(siteUrl ? { url: siteUrl } : {}),\n }\n }\n if (author.bio || author.short_bio) person.description = author.short_bio || author.bio\n if (author.avatar_url) person.image = author.avatar_url\n if (uniqueSameAs.length > 0) person.sameAs = uniqueSameAs\n if (author.knows_about && author.knows_about.length > 0) person.knowsAbout = author.knows_about\n if (author.credentials && author.credentials.length > 0) {\n person.hasCredential = author.credentials.map((c) => ({\n '@type': 'EducationalOccupationalCredential',\n credentialCategory: c,\n }))\n }\n\n return person\n}\n\n/**\n * JSON-LD for an author page: a `ProfilePage` whose `mainEntity` is the\n * author's `Person`. Render it once per author page (`AuthorPage` does, unless\n * its `jsonLd` prop is false).\n */\nexport function generateAuthorSchema(\n author: ArticleAuthor,\n options: AuthorSchemaOptions = {},\n): object {\n const pageUrl = routedAuthorPageUrl(author, options)\n\n const schema: Record<string, any> = {\n '@context': 'https://schema.org',\n '@type': 'ProfilePage',\n ...(isAbsoluteUrl(pageUrl) ? { '@id': `${pageUrl}#profilepage` } : {}),\n url: pageUrl,\n name: author.name,\n mainEntity: generateAuthorPersonSchema(author, options),\n }\n if (author.created_at) schema.dateCreated = author.created_at\n if (author.updated_at) schema.dateModified = author.updated_at\n\n return schema\n}\n\n/**\n * The `author` node for article JSON-LD. Single source of truth for bylines:\n * generateArticleSchema, generateClusterArticleSchema and stored schema_json\n * (via withArticleAuthorIdentity) all route through here.\n *\n * Links to an author page only when one is known to exist: the row's\n * `author_page_url`, or the site declaring `authorPages` in its routing. A\n * bare string byline stays a named Person.\n */\nexport function generateArticleAuthorNode(\n author: ArticleAuthor | string | null | undefined,\n options: AuthorSchemaOptions = {},\n): Record<string, unknown> | undefined {\n if (!author) return undefined\n if (typeof author === 'string') {\n const name = author.trim()\n return name ? { '@type': 'Person', name } : undefined\n }\n if (!author.name) return undefined\n\n const url =\n author.author_page_url?.trim() ||\n (options.authorPages && author.slug ? routedAuthorPageUrl(author, options) : undefined)\n const id = authorEntityId(author, url)\n\n return {\n '@type': 'Person',\n ...(id ? { '@id': id } : {}),\n name: author.name,\n ...(url ? { url } : {}),\n }\n}\n\n/**\n * Attach the author's identity to an article node from stored schema_json\n * (built by Signal at publish time, frozen in the row). Adds `@id` and `url`\n * from generateArticleAuthorNode when the stored byline is a Person with the\n * same name and lacks them; stored values always win and nothing else in the\n * node changes. Non-article nodes pass through untouched.\n */\nexport function withArticleAuthorIdentity(\n node: unknown,\n author: ArticleAuthor | string | null | undefined,\n options: AuthorSchemaOptions = {},\n): unknown {\n if (!node || typeof node !== 'object' || Array.isArray(node)) return node\n const record = node as Record<string, unknown>\n const types = ([] as unknown[]).concat(record['@type'])\n if (!types.some((t) => typeof t === 'string' && ARTICLE_TYPES.has(t))) return node\n\n const stored = record.author\n if (!stored || typeof stored !== 'object' || Array.isArray(stored)) return node\n const byline = stored as Record<string, unknown>\n if (byline['@type'] !== 'Person' || typeof byline.name !== 'string') return node\n\n const identity = generateArticleAuthorNode(author, options)\n if (!identity || typeof identity.name !== 'string') return node\n if (identity.name.trim().toLowerCase() !== byline.name.trim().toLowerCase()) return node\n\n const additions: Record<string, unknown> = {}\n if (!byline['@id'] && identity['@id']) additions['@id'] = identity['@id']\n if (!byline.url && identity.url) additions.url = identity.url\n if (Object.keys(additions).length === 0) return node\n\n return { ...record, author: { ...byline, ...additions } }\n}\n"]}
@@ -1,8 +1,8 @@
1
1
  'use client';
2
2
  'use strict';
3
3
 
4
- var chunkSNXJXPB6_js = require('./chunk-SNXJXPB6.js');
5
- var chunkJ4C3JAJF_js = require('./chunk-J4C3JAJF.js');
4
+ var chunkZOBUA65N_js = require('./chunk-ZOBUA65N.js');
5
+ var chunkC7J4XLBN_js = require('./chunk-C7J4XLBN.js');
6
6
  var jsxRuntime = require('react/jsx-runtime');
7
7
  var React5 = require('react');
8
8
 
@@ -112,7 +112,7 @@ async function apiPost(endpoint, body = {}) {
112
112
  return null;
113
113
  }
114
114
  try {
115
- const response = await chunkJ4C3JAJF_js.sonorFetch(`${apiUrl}${endpoint}`, {
115
+ const response = await chunkC7J4XLBN_js.sonorFetch(`${apiUrl}${endpoint}`, {
116
116
  method: "POST",
117
117
  headers: { "Content-Type": "application/json" },
118
118
  body: JSON.stringify(body)
@@ -279,7 +279,7 @@ async function fetchActiveProcessor() {
279
279
  const { apiUrl, apiKey } = getApiConfig();
280
280
  if (!apiKey) return null;
281
281
  try {
282
- const response = await chunkJ4C3JAJF_js.sonorFetch(`${apiUrl}/api/public/commerce/processor`, {
282
+ const response = await chunkC7J4XLBN_js.sonorFetch(`${apiUrl}/api/public/commerce/processor`, {
283
283
  method: "POST",
284
284
  headers: { "Content-Type": "application/json" },
285
285
  body: JSON.stringify({})
@@ -295,7 +295,7 @@ async function registerForEvent(eventId, scheduleId, customer) {
295
295
  const { apiUrl, apiKey } = getApiConfig();
296
296
  const analyticsSessionId = typeof sessionStorage !== "undefined" ? sessionStorage.getItem("_sk_sid") : null;
297
297
  try {
298
- const response = await chunkJ4C3JAJF_js.sonorFetch(`${apiUrl}/api/public/commerce/register`, {
298
+ const response = await chunkC7J4XLBN_js.sonorFetch(`${apiUrl}/api/public/commerce/register`, {
299
299
  method: "POST",
300
300
  headers: { "Content-Type": "application/json" },
301
301
  body: JSON.stringify({
@@ -345,7 +345,7 @@ function toCheckoutBody(options) {
345
345
  async function validateDiscountCode(code, subtotal, offeringIds = []) {
346
346
  const { apiUrl, apiKey } = getApiConfig();
347
347
  try {
348
- const response = await chunkJ4C3JAJF_js.sonorFetch(`${apiUrl}/api/public/commerce/discount/validate`, {
348
+ const response = await chunkC7J4XLBN_js.sonorFetch(`${apiUrl}/api/public/commerce/discount/validate`, {
349
349
  method: "POST",
350
350
  headers: { "Content-Type": "application/json" },
351
351
  // offering_ids is the API's name. Older APIs read only that, so
@@ -365,7 +365,7 @@ async function fetchProcessorConfig() {
365
365
  const { apiUrl, apiKey } = getApiConfig();
366
366
  if (!apiKey) return null;
367
367
  try {
368
- const response = await chunkJ4C3JAJF_js.sonorFetch(`${apiUrl}/api/public/commerce/processor-config`, {
368
+ const response = await chunkC7J4XLBN_js.sonorFetch(`${apiUrl}/api/public/commerce/processor-config`, {
369
369
  method: "POST",
370
370
  headers: { "Content-Type": "application/json" },
371
371
  body: JSON.stringify({})
@@ -381,7 +381,7 @@ async function createPaymentIntent(options) {
381
381
  const apiKey = getApiKey();
382
382
  const sessionId = typeof sessionStorage !== "undefined" ? sessionStorage.getItem("_sk_sid") : null;
383
383
  try {
384
- const response = await chunkJ4C3JAJF_js.sonorFetch(`${apiUrl}/api/public/commerce/create-payment-intent`, {
384
+ const response = await chunkC7J4XLBN_js.sonorFetch(`${apiUrl}/api/public/commerce/create-payment-intent`, {
385
385
  method: "POST",
386
386
  headers: { "Content-Type": "application/json" },
387
387
  body: JSON.stringify({
@@ -401,7 +401,7 @@ async function createCheckoutSession(optionsOrOfferingId, legacyOptions) {
401
401
  const options = typeof optionsOrOfferingId === "string" ? { offeringId: optionsOrOfferingId, ...legacyOptions } : optionsOrOfferingId;
402
402
  const analyticsSessionId = typeof sessionStorage !== "undefined" ? sessionStorage.getItem("_sk_sid") : null;
403
403
  try {
404
- const response = await chunkJ4C3JAJF_js.sonorFetch(`${apiUrl}/api/public/commerce/checkout`, {
404
+ const response = await chunkC7J4XLBN_js.sonorFetch(`${apiUrl}/api/public/commerce/checkout`, {
405
405
  method: "POST",
406
406
  headers: { "Content-Type": "application/json" },
407
407
  body: JSON.stringify({
@@ -3123,7 +3123,7 @@ function ProductDetail({
3123
3123
  const [checkoutError, setCheckoutError] = React5.useState(null);
3124
3124
  const [showStickyBar, setShowStickyBar] = React5.useState(false);
3125
3125
  const buyButtonRef = React5.useRef(null);
3126
- const analytics = chunkSNXJXPB6_js.useAnalyticsOptional();
3126
+ const analytics = chunkZOBUA65N_js.useAnalyticsOptional();
3127
3127
  React5.useEffect(() => {
3128
3128
  if (propProduct) {
3129
3129
  setProduct(propProduct);
@@ -4494,7 +4494,7 @@ function CheckoutForm({
4494
4494
  const [discountResult, setDiscountResult] = React5.useState(null);
4495
4495
  const [applyingDiscount, setApplyingDiscount] = React5.useState(false);
4496
4496
  const isProduct = offering.type === "product";
4497
- const analytics = chunkSNXJXPB6_js.useAnalyticsOptional();
4497
+ const analytics = chunkZOBUA65N_js.useAnalyticsOptional();
4498
4498
  React5.useEffect(() => {
4499
4499
  fetchProcessorConfig().then((config) => {
4500
4500
  if (config?.processor) setProcessor(config.processor);
@@ -7270,7 +7270,7 @@ function EventsWidget({
7270
7270
  setLoading(true);
7271
7271
  setError(null);
7272
7272
  try {
7273
- const response = await chunkJ4C3JAJF_js.sonorFetch(`${apiUrl}/api/public/commerce/events`, {
7273
+ const response = await chunkC7J4XLBN_js.sonorFetch(`${apiUrl}/api/public/commerce/events`, {
7274
7274
  method: "POST",
7275
7275
  headers: { "Content-Type": "application/json" },
7276
7276
  body: JSON.stringify({
@@ -8067,5 +8067,5 @@ exports.shippingSelection = shippingSelection;
8067
8067
  exports.useEventModal = useEventModal;
8068
8068
  exports.validateAddress = validateAddress;
8069
8069
  exports.validateDiscountCode = validateDiscountCode;
8070
- //# sourceMappingURL=chunk-2MEMK5XC.js.map
8071
- //# sourceMappingURL=chunk-2MEMK5XC.js.map
8070
+ //# sourceMappingURL=chunk-GGGX54ZE.js.map
8071
+ //# sourceMappingURL=chunk-GGGX54ZE.js.map