@sonordev/site-kit 5.3.2 → 5.5.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (411) hide show
  1. package/AGENTS.md +16 -6
  2. package/README.md +26 -7
  3. package/agent-manifest.json +11 -10
  4. package/dist/AnalyticsProvider-KFXAH4GR.mjs +11 -0
  5. package/dist/{AnalyticsProvider-2XK54UZW.mjs.map → AnalyticsProvider-KFXAH4GR.mjs.map} +1 -1
  6. package/dist/AnalyticsProvider-WDDW3IJW.js +32 -0
  7. package/dist/{AnalyticsProvider-PM7SOGOS.js.map → AnalyticsProvider-WDDW3IJW.js.map} +1 -1
  8. package/dist/{BlogViewTracker-3BIUF5TI.js → BlogViewTracker-D4DIEP4Q.js} +6 -6
  9. package/dist/{BlogViewTracker-3BIUF5TI.js.map → BlogViewTracker-D4DIEP4Q.js.map} +1 -1
  10. package/dist/{BlogViewTracker-KFUDRDQK.mjs → BlogViewTracker-ZVEGGH3Y.mjs} +5 -5
  11. package/dist/{BlogViewTracker-KFUDRDQK.mjs.map → BlogViewTracker-ZVEGGH3Y.mjs.map} +1 -1
  12. package/dist/ChatWidget-2ZYPYIMQ.js +22 -0
  13. package/dist/{ChatWidget-7BYSGNO2.js.map → ChatWidget-2ZYPYIMQ.js.map} +1 -1
  14. package/dist/ChatWidget-FYCCLMQE.mjs +13 -0
  15. package/dist/{ChatWidget-4PHZHGG5.mjs.map → ChatWidget-FYCCLMQE.mjs.map} +1 -1
  16. package/dist/EngageWidget-6HUZYOY7.mjs +11 -0
  17. package/dist/{EngageWidget-D6M6QWEC.mjs.map → EngageWidget-6HUZYOY7.mjs.map} +1 -1
  18. package/dist/EngageWidget-MYQTBBW6.js +20 -0
  19. package/dist/{EngageWidget-Q4ITKTMJ.js.map → EngageWidget-MYQTBBW6.js.map} +1 -1
  20. package/dist/{FileField-YBBIJOCK.js → FileField-JK2S24XU.js} +6 -6
  21. package/dist/{FileField-YBBIJOCK.js.map → FileField-JK2S24XU.js.map} +1 -1
  22. package/dist/{FileField-PQQDX4IR.mjs → FileField-OZZHWGPA.mjs} +5 -5
  23. package/dist/{FileField-PQQDX4IR.mjs.map → FileField-OZZHWGPA.mjs.map} +1 -1
  24. package/dist/{FormSpotlight-WUN24F3P.js → FormSpotlight-5AXFQU5M.js} +15 -15
  25. package/dist/{FormSpotlight-WUN24F3P.js.map → FormSpotlight-5AXFQU5M.js.map} +1 -1
  26. package/dist/{FormSpotlight-7TIIWFTP.mjs → FormSpotlight-XV42L72H.mjs} +3 -3
  27. package/dist/{FormSpotlight-7TIIWFTP.mjs.map → FormSpotlight-XV42L72H.mjs.map} +1 -1
  28. package/dist/{FormStage-CM7OVLUT.js → FormStage-HATUHNRV.js} +13 -13
  29. package/dist/{FormStage-CM7OVLUT.js.map → FormStage-HATUHNRV.js.map} +1 -1
  30. package/dist/{FormStage-TFN2GIBO.mjs → FormStage-RUK675HV.mjs} +3 -3
  31. package/dist/{FormStage-TFN2GIBO.mjs.map → FormStage-RUK675HV.mjs.map} +1 -1
  32. package/dist/ManagedForm-JWEXJEXK.js +23 -0
  33. package/dist/{ManagedForm-N63YGVNY.js.map → ManagedForm-JWEXJEXK.js.map} +1 -1
  34. package/dist/ManagedForm-OA3MNGXT.mjs +14 -0
  35. package/dist/{ManagedForm-ZUXLHEQU.mjs.map → ManagedForm-OA3MNGXT.mjs.map} +1 -1
  36. package/dist/{ManagedNewsletterForm-PIVJTU5L.js → ManagedNewsletterForm-AAHH63KT.js} +8 -8
  37. package/dist/{ManagedNewsletterForm-PIVJTU5L.js.map → ManagedNewsletterForm-AAHH63KT.js.map} +1 -1
  38. package/dist/{ManagedNewsletterForm-4AVKTZ2A.mjs → ManagedNewsletterForm-HZKTNWLW.mjs} +7 -7
  39. package/dist/{ManagedNewsletterForm-4AVKTZ2A.mjs.map → ManagedNewsletterForm-HZKTNWLW.mjs.map} +1 -1
  40. package/dist/{SignalCore-LT4NCPOR.mjs → SignalCore-X3GDGBZD.mjs} +5 -5
  41. package/dist/{SignalCore-LT4NCPOR.mjs.map → SignalCore-X3GDGBZD.mjs.map} +1 -1
  42. package/dist/{SignalCore-2M5TISM7.js → SignalCore-YSNZYBKJ.js} +11 -11
  43. package/dist/{SignalCore-2M5TISM7.js.map → SignalCore-YSNZYBKJ.js.map} +1 -1
  44. package/dist/SitemapSync-2PTDBH5E.mjs +9 -0
  45. package/dist/{SitemapSync-G3OLECFI.mjs.map → SitemapSync-2PTDBH5E.mjs.map} +1 -1
  46. package/dist/SitemapSync-3SFAI546.js +18 -0
  47. package/dist/{SitemapSync-7OBOJG2L.js.map → SitemapSync-3SFAI546.js.map} +1 -1
  48. package/dist/analytics/dispatch.d.ts +4 -4
  49. package/dist/analytics/index.js +15 -15
  50. package/dist/analytics/index.mjs +6 -6
  51. package/dist/{api-NTHZ6PAW.mjs → api-D745LGGU.mjs} +3 -3
  52. package/dist/api-D745LGGU.mjs.map +1 -0
  53. package/dist/{api-N5OLQXYN.js → api-XR5APCH3.js} +3 -3
  54. package/dist/api-XR5APCH3.js.map +1 -0
  55. package/dist/blog/AuthorPage.d.ts +1 -1
  56. package/dist/blog/AuthorPage.d.ts.map +1 -1
  57. package/dist/blog/BlogLayout.d.ts +3 -1
  58. package/dist/blog/BlogLayout.d.ts.map +1 -1
  59. package/dist/blog/BlogList.d.ts +3 -1
  60. package/dist/blog/BlogList.d.ts.map +1 -1
  61. package/dist/blog/BlogPost.d.ts +3 -1
  62. package/dist/blog/BlogPost.d.ts.map +1 -1
  63. package/dist/blog/BlogSidebar.d.ts +3 -1
  64. package/dist/blog/BlogSidebar.d.ts.map +1 -1
  65. package/dist/blog/ClusterLandingPage.d.ts +3 -1
  66. package/dist/blog/ClusterLandingPage.d.ts.map +1 -1
  67. package/dist/blog/ClusterNavigation.d.ts +3 -1
  68. package/dist/blog/ClusterNavigation.d.ts.map +1 -1
  69. package/dist/blog/RelatedPosts.d.ts +4 -1
  70. package/dist/blog/RelatedPosts.d.ts.map +1 -1
  71. package/dist/blog/artwork-components.test.d.ts +2 -0
  72. package/dist/blog/artwork-components.test.d.ts.map +1 -0
  73. package/dist/blog/artwork.d.ts +14 -0
  74. package/dist/blog/artwork.d.ts.map +1 -0
  75. package/dist/blog/artwork.test.d.ts +2 -0
  76. package/dist/blog/artwork.test.d.ts.map +1 -0
  77. package/dist/blog/blog-styles.d.ts.map +1 -1
  78. package/dist/blog/blog-tables.d.ts +13 -0
  79. package/dist/blog/blog-tables.d.ts.map +1 -0
  80. package/dist/blog/blog-tables.test.d.ts +2 -0
  81. package/dist/blog/blog-tables.test.d.ts.map +1 -0
  82. package/dist/blog/index.d.ts +3 -0
  83. package/dist/blog/index.d.ts.map +1 -1
  84. package/dist/blog/index.js +52 -30
  85. package/dist/blog/index.js.map +1 -1
  86. package/dist/blog/index.mjs +15 -12
  87. package/dist/blog/index.mjs.map +1 -1
  88. package/dist/blog/publication-render.test.d.ts +2 -0
  89. package/dist/blog/publication-render.test.d.ts.map +1 -0
  90. package/dist/blog/publication-routes.test.d.ts +2 -0
  91. package/dist/blog/publication-routes.test.d.ts.map +1 -0
  92. package/dist/blog/routes.d.ts +40 -0
  93. package/dist/blog/routes.d.ts.map +1 -0
  94. package/dist/blog/server-core.d.ts +28 -21
  95. package/dist/blog/server-core.d.ts.map +1 -1
  96. package/dist/blog/server-ui.d.ts +4 -0
  97. package/dist/blog/server-ui.d.ts.map +1 -1
  98. package/dist/blog/server-ui.js +49 -28
  99. package/dist/blog/server-ui.js.map +1 -1
  100. package/dist/blog/server-ui.mjs +9 -15
  101. package/dist/blog/server-ui.mjs.map +1 -1
  102. package/dist/blog/server.d.ts +28 -21
  103. package/dist/blog/server.d.ts.map +1 -1
  104. package/dist/blog/server.js +71 -42
  105. package/dist/blog/server.mjs +3 -2
  106. package/dist/blog/types.d.ts +8 -1
  107. package/dist/blog/types.d.ts.map +1 -1
  108. package/dist/blog-styles-6EY3BS5Y.js +595 -0
  109. package/dist/blog-styles-6EY3BS5Y.js.map +1 -0
  110. package/dist/blog-styles-7AKRUMV7.mjs +592 -0
  111. package/dist/blog-styles-7AKRUMV7.mjs.map +1 -0
  112. package/dist/blog-tables-DWDEWA3S.js +17 -0
  113. package/dist/blog-tables-DWDEWA3S.js.map +1 -0
  114. package/dist/blog-tables-QGIHOESZ.mjs +4 -0
  115. package/dist/blog-tables-QGIHOESZ.mjs.map +1 -0
  116. package/dist/{chunk-OIJ435IZ.js → chunk-2CMSWJWC.js} +18 -18
  117. package/dist/{chunk-OIJ435IZ.js.map → chunk-2CMSWJWC.js.map} +1 -1
  118. package/dist/{chunk-K37JPEQW.js → chunk-2OU4KBUN.js} +26 -23
  119. package/dist/chunk-2OU4KBUN.js.map +1 -0
  120. package/dist/{chunk-JSLYNYTB.mjs → chunk-3B6CXGAK.mjs} +3 -3
  121. package/dist/{chunk-JSLYNYTB.mjs.map → chunk-3B6CXGAK.mjs.map} +1 -1
  122. package/dist/{chunk-HMFFAUCD.js → chunk-3DWIYCQX.js} +2 -2
  123. package/dist/chunk-3DWIYCQX.js.map +1 -0
  124. package/dist/{chunk-3EPMDPWI.js → chunk-3SDMJMN2.js} +5 -5
  125. package/dist/{chunk-3EPMDPWI.js.map → chunk-3SDMJMN2.js.map} +1 -1
  126. package/dist/chunk-4B4S56WJ.mjs +110 -0
  127. package/dist/chunk-4B4S56WJ.mjs.map +1 -0
  128. package/dist/chunk-4U5NCKQY.mjs +39 -0
  129. package/dist/chunk-4U5NCKQY.mjs.map +1 -0
  130. package/dist/{chunk-CQUA2AUA.mjs → chunk-4XGACM7D.mjs} +3 -3
  131. package/dist/{chunk-CQUA2AUA.mjs.map → chunk-4XGACM7D.mjs.map} +1 -1
  132. package/dist/{chunk-AVM4OZHR.mjs → chunk-5TGAUWNO.mjs} +3 -3
  133. package/dist/{chunk-AVM4OZHR.mjs.map → chunk-5TGAUWNO.mjs.map} +1 -1
  134. package/dist/{chunk-RO55G3OA.mjs → chunk-64BOVMXG.mjs} +3 -3
  135. package/dist/{chunk-RO55G3OA.mjs.map → chunk-64BOVMXG.mjs.map} +1 -1
  136. package/dist/{chunk-JBGRXICL.js → chunk-746RKQHA.js} +75 -70
  137. package/dist/chunk-746RKQHA.js.map +1 -0
  138. package/dist/{chunk-N3C323NY.mjs → chunk-7PPNXORV.mjs} +3 -3
  139. package/dist/{chunk-N3C323NY.mjs.map → chunk-7PPNXORV.mjs.map} +1 -1
  140. package/dist/{chunk-DYKFC7WY.js → chunk-A3F5GRNJ.js} +8 -8
  141. package/dist/{chunk-DYKFC7WY.js.map → chunk-A3F5GRNJ.js.map} +1 -1
  142. package/dist/{chunk-4TU246Q4.mjs → chunk-AEARU24Q.mjs} +40 -26
  143. package/dist/chunk-AEARU24Q.mjs.map +1 -0
  144. package/dist/{chunk-5BZDHZCN.js → chunk-BNOQXDPJ.js} +4 -4
  145. package/dist/{chunk-5BZDHZCN.js.map → chunk-BNOQXDPJ.js.map} +1 -1
  146. package/dist/{chunk-XQZTOWS3.js → chunk-CT5REGAK.js} +15 -15
  147. package/dist/{chunk-XQZTOWS3.js.map → chunk-CT5REGAK.js.map} +1 -1
  148. package/dist/{chunk-KOP3DPIR.mjs → chunk-DRLHQQBH.mjs} +4 -4
  149. package/dist/{chunk-KOP3DPIR.mjs.map → chunk-DRLHQQBH.mjs.map} +1 -1
  150. package/dist/{chunk-Y7SRO7MJ.mjs → chunk-DYULWKDC.mjs} +4 -4
  151. package/dist/{chunk-Y7SRO7MJ.mjs.map → chunk-DYULWKDC.mjs.map} +1 -1
  152. package/dist/{chunk-DHXQBTXE.mjs → chunk-EEQYKMGH.mjs} +75 -70
  153. package/dist/chunk-EEQYKMGH.mjs.map +1 -0
  154. package/dist/chunk-ESP5RMB7.js +42 -0
  155. package/dist/chunk-ESP5RMB7.js.map +1 -0
  156. package/dist/{chunk-4DE2KJ7R.js → chunk-FF5N5D3D.js} +8 -8
  157. package/dist/{chunk-4DE2KJ7R.js.map → chunk-FF5N5D3D.js.map} +1 -1
  158. package/dist/{chunk-757HXAYX.js → chunk-FYVLQ3OU.js} +3 -3
  159. package/dist/{chunk-757HXAYX.js.map → chunk-FYVLQ3OU.js.map} +1 -1
  160. package/dist/{chunk-OC6PU7U2.mjs → chunk-G5HUI4BO.mjs} +3 -3
  161. package/dist/{chunk-OC6PU7U2.mjs.map → chunk-G5HUI4BO.mjs.map} +1 -1
  162. package/dist/chunk-G6WF4G3E.js +43 -0
  163. package/dist/chunk-G6WF4G3E.js.map +1 -0
  164. package/dist/chunk-GHECYDSZ.mjs +134 -0
  165. package/dist/chunk-GHECYDSZ.mjs.map +1 -0
  166. package/dist/{chunk-JTO3K5B7.mjs → chunk-HBI67P7Y.mjs} +4 -4
  167. package/dist/{chunk-JTO3K5B7.mjs.map → chunk-HBI67P7Y.mjs.map} +1 -1
  168. package/dist/{chunk-FFJVQWKO.js → chunk-HFJQMIFM.js} +4 -4
  169. package/dist/{chunk-FFJVQWKO.js.map → chunk-HFJQMIFM.js.map} +1 -1
  170. package/dist/{chunk-A3NNUKFA.js → chunk-HX3BRMOX.js} +96 -644
  171. package/dist/chunk-HX3BRMOX.js.map +1 -0
  172. package/dist/{chunk-3TXX5KIN.js → chunk-JNRHTZL4.js} +2 -2
  173. package/dist/{chunk-3TXX5KIN.js.map → chunk-JNRHTZL4.js.map} +1 -1
  174. package/dist/{chunk-R3LYTIVN.js → chunk-KAUUGRYB.js} +5 -5
  175. package/dist/{chunk-R3LYTIVN.js.map → chunk-KAUUGRYB.js.map} +1 -1
  176. package/dist/{chunk-L2LJQIM3.js → chunk-KPKQKFT4.js} +11 -11
  177. package/dist/chunk-KPKQKFT4.js.map +1 -0
  178. package/dist/chunk-LC7AM4J5.js +118 -0
  179. package/dist/chunk-LC7AM4J5.js.map +1 -0
  180. package/dist/{chunk-GFNXWS3I.js → chunk-MCJF2KJ6.js} +5 -5
  181. package/dist/{chunk-GFNXWS3I.js.map → chunk-MCJF2KJ6.js.map} +1 -1
  182. package/dist/{chunk-Z7K5AMCE.js → chunk-MNYM2XU4.js} +4 -4
  183. package/dist/{chunk-Z7K5AMCE.js.map → chunk-MNYM2XU4.js.map} +1 -1
  184. package/dist/{chunk-6QABCGM6.mjs → chunk-MU7IEPDG.mjs} +4 -4
  185. package/dist/chunk-MU7IEPDG.mjs.map +1 -0
  186. package/dist/chunk-NSWO43XW.mjs +39 -0
  187. package/dist/chunk-NSWO43XW.mjs.map +1 -0
  188. package/dist/{chunk-Z33JXJTJ.js → chunk-NZSFOZJV.js} +40 -26
  189. package/dist/chunk-NZSFOZJV.js.map +1 -0
  190. package/dist/{chunk-ZKR5AJV5.mjs → chunk-OFSA7LUH.mjs} +4 -4
  191. package/dist/{chunk-ZKR5AJV5.mjs.map → chunk-OFSA7LUH.mjs.map} +1 -1
  192. package/dist/{chunk-M7FWXEXC.js → chunk-PIPLBBDH.js} +8 -8
  193. package/dist/{chunk-M7FWXEXC.js.map → chunk-PIPLBBDH.js.map} +1 -1
  194. package/dist/{chunk-FDVE56JS.js → chunk-Q26VZNM2.js} +3 -3
  195. package/dist/{chunk-FDVE56JS.js.map → chunk-Q26VZNM2.js.map} +1 -1
  196. package/dist/{chunk-6AZTRTCG.js → chunk-QEGUI2Q2.js} +15 -15
  197. package/dist/{chunk-6AZTRTCG.js.map → chunk-QEGUI2Q2.js.map} +1 -1
  198. package/dist/{chunk-GPNBBUEN.js → chunk-QFNSM77X.js} +3 -3
  199. package/dist/{chunk-GPNBBUEN.js.map → chunk-QFNSM77X.js.map} +1 -1
  200. package/dist/{chunk-QZ54OCWD.mjs → chunk-R4MX6EOM.mjs} +7 -7
  201. package/dist/{chunk-QZ54OCWD.mjs.map → chunk-R4MX6EOM.mjs.map} +1 -1
  202. package/dist/{chunk-67CHHDBL.mjs → chunk-RMMHWSPP.mjs} +96 -644
  203. package/dist/chunk-RMMHWSPP.mjs.map +1 -0
  204. package/dist/{chunk-B4BFQSSS.mjs → chunk-RU54J2PY.mjs} +4 -4
  205. package/dist/chunk-RU54J2PY.mjs.map +1 -0
  206. package/dist/{chunk-AXAIUCSF.mjs → chunk-RZUZMUTN.mjs} +9 -8
  207. package/dist/chunk-RZUZMUTN.mjs.map +1 -0
  208. package/dist/{chunk-NSLYY62T.mjs → chunk-S6FEC6UT.mjs} +9 -5
  209. package/dist/chunk-S6FEC6UT.mjs.map +1 -0
  210. package/dist/{chunk-3DPXOZAU.mjs → chunk-SHLWA6JY.mjs} +2 -2
  211. package/dist/chunk-SHLWA6JY.mjs.map +1 -0
  212. package/dist/{chunk-E33HJMRP.js → chunk-SQVYLIIN.js} +11 -7
  213. package/dist/chunk-SQVYLIIN.js.map +1 -0
  214. package/dist/chunk-SUZ3ZLB2.js +8 -0
  215. package/dist/{chunk-D37M7MIH.js.map → chunk-SUZ3ZLB2.js.map} +1 -1
  216. package/dist/{chunk-DZDWBQKA.mjs → chunk-TALEV3IH.mjs} +3 -3
  217. package/dist/{chunk-DZDWBQKA.mjs.map → chunk-TALEV3IH.mjs.map} +1 -1
  218. package/dist/{chunk-UOTXSWKZ.mjs → chunk-TP7H6BSK.mjs} +2 -2
  219. package/dist/{chunk-UOTXSWKZ.mjs.map → chunk-TP7H6BSK.mjs.map} +1 -1
  220. package/dist/{chunk-XW5KNCWJ.mjs → chunk-TX2QQ7IX.mjs} +3 -3
  221. package/dist/{chunk-XW5KNCWJ.mjs.map → chunk-TX2QQ7IX.mjs.map} +1 -1
  222. package/dist/{chunk-PEEQMI7U.js → chunk-UNPEMSLK.js} +12 -11
  223. package/dist/chunk-UNPEMSLK.js.map +1 -0
  224. package/dist/{chunk-42F5EK24.mjs → chunk-UZL2QU2V.mjs} +16 -13
  225. package/dist/chunk-UZL2QU2V.mjs.map +1 -0
  226. package/dist/{chunk-6VG65AIA.mjs → chunk-V6NOM7PJ.mjs} +3 -3
  227. package/dist/{chunk-6VG65AIA.mjs.map → chunk-V6NOM7PJ.mjs.map} +1 -1
  228. package/dist/{chunk-W23TMUKB.js → chunk-VAS3LH5W.js} +418 -98
  229. package/dist/chunk-VAS3LH5W.js.map +1 -0
  230. package/dist/{chunk-TS3N3LGZ.mjs → chunk-VYHRAICF.mjs} +4 -4
  231. package/dist/{chunk-TS3N3LGZ.mjs.map → chunk-VYHRAICF.mjs.map} +1 -1
  232. package/dist/{chunk-G3YUSRCL.js → chunk-W5NVW23S.js} +4 -4
  233. package/dist/{chunk-G3YUSRCL.js.map → chunk-W5NVW23S.js.map} +1 -1
  234. package/dist/chunk-WDBCXRTT.mjs +6 -0
  235. package/dist/{chunk-OUERH2T4.mjs.map → chunk-WDBCXRTT.mjs.map} +1 -1
  236. package/dist/{chunk-ZOJ3TLO5.mjs → chunk-WIZRCI6J.mjs} +3 -3
  237. package/dist/{chunk-ZOJ3TLO5.mjs.map → chunk-WIZRCI6J.mjs.map} +1 -1
  238. package/dist/{chunk-HDQTZAGE.mjs → chunk-X2XFLYZ3.mjs} +3 -3
  239. package/dist/{chunk-HDQTZAGE.mjs.map → chunk-X2XFLYZ3.mjs.map} +1 -1
  240. package/dist/{chunk-HVFXFPUJ.mjs → chunk-XQYC4KMH.mjs} +413 -94
  241. package/dist/chunk-XQYC4KMH.mjs.map +1 -0
  242. package/dist/{chunk-KPFPSOYS.js → chunk-YNC5D3FT.js} +12 -12
  243. package/dist/{chunk-KPFPSOYS.js.map → chunk-YNC5D3FT.js.map} +1 -1
  244. package/dist/chunk-YQTE32QK.js +137 -0
  245. package/dist/chunk-YQTE32QK.js.map +1 -0
  246. package/dist/{chunk-PZXKFHPO.js → chunk-YYAFHIY7.js} +15 -15
  247. package/dist/chunk-YYAFHIY7.js.map +1 -0
  248. package/dist/{chunk-MANX6422.js → chunk-Z6S4MWSR.js} +7 -7
  249. package/dist/{chunk-MANX6422.js.map → chunk-Z6S4MWSR.js.map} +1 -1
  250. package/dist/{chunk-DVH3JHZ3.mjs → chunk-ZRQFG3L6.mjs} +5 -5
  251. package/dist/{chunk-DVH3JHZ3.mjs.map → chunk-ZRQFG3L6.mjs.map} +1 -1
  252. package/dist/cli/agent/checks.d.ts.map +1 -1
  253. package/dist/cli/agent/ssr-bailout.d.ts +27 -0
  254. package/dist/cli/agent/ssr-bailout.d.ts.map +1 -0
  255. package/dist/cli/agent/ssr-bailout.test.d.ts +2 -0
  256. package/dist/cli/agent/ssr-bailout.test.d.ts.map +1 -0
  257. package/dist/cli/codemod/transforms.d.ts.map +1 -1
  258. package/dist/cli/index.js +38 -51
  259. package/dist/cli/index.js.map +1 -1
  260. package/dist/cli/index.mjs +36 -49
  261. package/dist/cli/index.mjs.map +1 -1
  262. package/dist/cli/migrator/index.d.ts.map +1 -1
  263. package/dist/client/index.d.ts +1 -0
  264. package/dist/client/index.d.ts.map +1 -1
  265. package/dist/client/index.js +20 -7
  266. package/dist/client/index.js.map +1 -1
  267. package/dist/client/index.mjs +5 -4
  268. package/dist/client/index.mjs.map +1 -1
  269. package/dist/cms/index.js.map +1 -1
  270. package/dist/cms/index.mjs.map +1 -1
  271. package/dist/cms/sanity-image.d.ts +1 -1
  272. package/dist/commerce/index.js +58 -58
  273. package/dist/commerce/index.mjs +7 -7
  274. package/dist/engage/ChatWidget.d.ts.map +1 -1
  275. package/dist/engage/EngageWidget.d.ts +3 -4
  276. package/dist/engage/EngageWidget.d.ts.map +1 -1
  277. package/dist/engage/chat-launcher.test.d.ts +2 -0
  278. package/dist/engage/chat-launcher.test.d.ts.map +1 -0
  279. package/dist/engage/index.js +12 -10
  280. package/dist/engage/index.js.map +1 -1
  281. package/dist/engage/index.mjs +9 -7
  282. package/dist/engage/index.mjs.map +1 -1
  283. package/dist/engage/launcher-placement.d.ts +56 -0
  284. package/dist/engage/launcher-placement.d.ts.map +1 -0
  285. package/dist/engage/launcher-placement.test.d.ts +2 -0
  286. package/dist/engage/launcher-placement.test.d.ts.map +1 -0
  287. package/dist/engage/types.d.ts +41 -7
  288. package/dist/engage/types.d.ts.map +1 -1
  289. package/dist/fleet/index.js +8 -8
  290. package/dist/fleet/index.mjs +4 -4
  291. package/dist/forms/index.js +16 -16
  292. package/dist/forms/index.mjs +9 -9
  293. package/dist/forms/server.js +10 -10
  294. package/dist/forms/server.mjs +8 -8
  295. package/dist/forms/static.js +7 -7
  296. package/dist/forms/static.mjs +6 -6
  297. package/dist/images/ManagedImage.d.ts.map +1 -1
  298. package/dist/images/index.js +11 -11
  299. package/dist/images/index.mjs +4 -4
  300. package/dist/index.js +65 -65
  301. package/dist/index.mjs +11 -11
  302. package/dist/layout/SiteKitClientProviders.d.ts.map +1 -1
  303. package/dist/layout/client.d.ts.map +1 -1
  304. package/dist/layout/client.js +8 -8
  305. package/dist/layout/client.mjs +7 -7
  306. package/dist/layout/index.js +10 -10
  307. package/dist/layout/index.mjs +8 -8
  308. package/dist/layout/types.d.ts +7 -3
  309. package/dist/layout/types.d.ts.map +1 -1
  310. package/dist/llms/generateLLMsTxt.d.ts.map +1 -1
  311. package/dist/llms/index.js +12 -12
  312. package/dist/llms/index.mjs +2 -2
  313. package/dist/llms/types.d.ts +7 -1
  314. package/dist/llms/types.d.ts.map +1 -1
  315. package/dist/maps/index.js +5 -5
  316. package/dist/maps/index.mjs +3 -3
  317. package/dist/mcp/WebMcpTools.d.ts +5 -2
  318. package/dist/mcp/WebMcpTools.d.ts.map +1 -1
  319. package/dist/mcp/client.js.map +1 -1
  320. package/dist/mcp/client.mjs.map +1 -1
  321. package/dist/search/index.js +4 -4
  322. package/dist/search/index.mjs +3 -3
  323. package/dist/seo/LocationPageContent.d.ts +6 -5
  324. package/dist/seo/LocationPageContent.d.ts.map +1 -1
  325. package/dist/seo/api.d.ts +4 -5
  326. package/dist/seo/api.d.ts.map +1 -1
  327. package/dist/seo/client.js +5 -5
  328. package/dist/seo/client.mjs +4 -4
  329. package/dist/seo/index.js +42 -42
  330. package/dist/seo/index.js.map +1 -1
  331. package/dist/seo/index.mjs +8 -8
  332. package/dist/seo/index.mjs.map +1 -1
  333. package/dist/seo/routing.d.ts +9 -23
  334. package/dist/seo/routing.d.ts.map +1 -1
  335. package/dist/seo/server-api.d.ts +11 -5
  336. package/dist/seo/server-api.d.ts.map +1 -1
  337. package/dist/seo/server.js +18 -18
  338. package/dist/seo/server.mjs +2 -2
  339. package/dist/server/index.js +3 -3
  340. package/dist/server/index.mjs +2 -2
  341. package/dist/{server-api-HW4PL2L2.mjs → server-api-RG3ZL3DV.mjs} +3 -3
  342. package/dist/{server-api-HW4PL2L2.mjs.map → server-api-RG3ZL3DV.mjs.map} +1 -1
  343. package/dist/{server-api-DB2SIUP4.js → server-api-RYJQAUGO.js} +21 -21
  344. package/dist/{server-api-DB2SIUP4.js.map → server-api-RYJQAUGO.js.map} +1 -1
  345. package/dist/shared/version.d.ts +1 -1
  346. package/dist/shared/visual-viewport-gap.d.ts +52 -0
  347. package/dist/shared/visual-viewport-gap.d.ts.map +1 -0
  348. package/dist/shared/visual-viewport-gap.test.d.ts +2 -0
  349. package/dist/shared/visual-viewport-gap.test.d.ts.map +1 -0
  350. package/dist/signal/index.js +11 -11
  351. package/dist/signal/index.mjs +2 -2
  352. package/dist/sitemap/index.js +2 -2
  353. package/dist/sitemap/index.mjs +1 -1
  354. package/dist/sync/BookingWidget.d.ts +0 -23
  355. package/dist/sync/BookingWidget.d.ts.map +1 -1
  356. package/dist/sync/MeetingFormatStep.d.ts +13 -0
  357. package/dist/sync/MeetingFormatStep.d.ts.map +1 -0
  358. package/dist/sync/api.d.ts +9 -10
  359. package/dist/sync/api.d.ts.map +1 -1
  360. package/dist/sync/booking-flow.d.ts +7 -0
  361. package/dist/sync/booking-flow.d.ts.map +1 -0
  362. package/dist/sync/booking-flow.test.d.ts +2 -0
  363. package/dist/sync/booking-flow.test.d.ts.map +1 -0
  364. package/dist/sync/index.d.ts +2 -2
  365. package/dist/sync/index.d.ts.map +1 -1
  366. package/dist/sync/index.js +20 -16
  367. package/dist/sync/index.mjs +4 -4
  368. package/dist/sync/types.d.ts +34 -0
  369. package/dist/sync/types.d.ts.map +1 -1
  370. package/dist/types.d.ts +9 -0
  371. package/dist/types.d.ts.map +1 -1
  372. package/package.json +1 -1
  373. package/skills/site-kit/SKILL.md +8 -3
  374. package/dist/AnalyticsProvider-2XK54UZW.mjs +0 -11
  375. package/dist/AnalyticsProvider-PM7SOGOS.js +0 -32
  376. package/dist/ChatWidget-4PHZHGG5.mjs +0 -11
  377. package/dist/ChatWidget-7BYSGNO2.js +0 -20
  378. package/dist/EngageWidget-D6M6QWEC.mjs +0 -9
  379. package/dist/EngageWidget-Q4ITKTMJ.js +0 -18
  380. package/dist/ManagedForm-N63YGVNY.js +0 -23
  381. package/dist/ManagedForm-ZUXLHEQU.mjs +0 -14
  382. package/dist/SitemapSync-7OBOJG2L.js +0 -18
  383. package/dist/SitemapSync-G3OLECFI.mjs +0 -9
  384. package/dist/api-N5OLQXYN.js.map +0 -1
  385. package/dist/api-NTHZ6PAW.mjs.map +0 -1
  386. package/dist/chunk-3DPXOZAU.mjs.map +0 -1
  387. package/dist/chunk-42F5EK24.mjs.map +0 -1
  388. package/dist/chunk-4TU246Q4.mjs.map +0 -1
  389. package/dist/chunk-67CHHDBL.mjs.map +0 -1
  390. package/dist/chunk-6QABCGM6.mjs.map +0 -1
  391. package/dist/chunk-A3NNUKFA.js.map +0 -1
  392. package/dist/chunk-AXAIUCSF.mjs.map +0 -1
  393. package/dist/chunk-B4BFQSSS.mjs.map +0 -1
  394. package/dist/chunk-CGCYZJYX.mjs +0 -41
  395. package/dist/chunk-CGCYZJYX.mjs.map +0 -1
  396. package/dist/chunk-D37M7MIH.js +0 -8
  397. package/dist/chunk-DHXQBTXE.mjs.map +0 -1
  398. package/dist/chunk-E33HJMRP.js.map +0 -1
  399. package/dist/chunk-HMFFAUCD.js.map +0 -1
  400. package/dist/chunk-HVFXFPUJ.mjs.map +0 -1
  401. package/dist/chunk-JBGRXICL.js.map +0 -1
  402. package/dist/chunk-K37JPEQW.js.map +0 -1
  403. package/dist/chunk-L2LJQIM3.js.map +0 -1
  404. package/dist/chunk-NSLYY62T.mjs.map +0 -1
  405. package/dist/chunk-OUERH2T4.mjs +0 -6
  406. package/dist/chunk-PEEQMI7U.js.map +0 -1
  407. package/dist/chunk-PZXKFHPO.js.map +0 -1
  408. package/dist/chunk-TPL2IHFI.js +0 -43
  409. package/dist/chunk-TPL2IHFI.js.map +0 -1
  410. package/dist/chunk-W23TMUKB.js.map +0 -1
  411. package/dist/chunk-Z33JXJTJ.js.map +0 -1
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/sync/MeetingFormatStep.tsx","../src/sync/api.ts","../src/sync/booking-flow.ts","../src/sync/BookingWidget.tsx"],"names":["useId","jsxs","jsx","sonorFetch","DEFAULT_API_URL","useState","useRef","useMemo","useCallback","useEffect","Fragment"],"mappings":"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","file":"chunk-VAS3LH5W.js","sourcesContent":["'use client'\n\nimport React, { useId } from 'react'\nimport type { MeetingFormat, MeetingOptions, MeetingAddress } from './types'\n\nexport function MeetingFormatStep({ options, busy, format, address, onFormatChange, onAddressChange, onContinue, onBack }: {\n options: MeetingOptions\n busy: boolean\n format: MeetingFormat | null\n address: MeetingAddress\n onFormatChange: (format: MeetingFormat) => void\n onAddressChange: (address: MeetingAddress) => void\n onContinue: (format: MeetingFormat, address?: MeetingAddress) => void\n onBack?: () => void\n}) {\n const id = useId()\n const choices: { value: MeetingFormat; label: string; description: string }[] = [\n { value: 'virtual', label: 'Virtual', description: 'Meet online with a Google Meet link.' },\n { value: 'office', label: 'Come to us', description: 'Meet in person at our office.' },\n { value: 'client_location', label: 'We come to you', description: `We can meet at your location within about ${options.travel_radius_miles} miles of our office.` },\n ]\n return <form onSubmit={e => { e.preventDefault(); if (format) onContinue(format, format === 'client_location' ? address : undefined) }} className=\"bw-step sk-meeting-step\">\n {onBack && <button type=\"button\" className=\"bw-back sk-meeting-change\" onClick={onBack} disabled={busy}>← Change service</button>}\n <h2 className=\"bw-heading\">How would you like to meet?</h2>\n <fieldset disabled={busy} className=\"sk-meeting-choices\">\n <legend className=\"sk-meeting-legend\">Meeting format</legend>\n {choices.map(choice => <label key={choice.value} className={`sk-meeting-choice ${format === choice.value ? 'sk-meeting-selected' : ''}`}>\n <input type=\"radio\" name={`${id}-format`} value={choice.value} checked={format === choice.value} onChange={() => onFormatChange(choice.value)} required />\n <span><strong>{choice.label}</strong><span>{choice.description}</span></span>\n </label>)}\n </fieldset>\n {format === 'office' && <div className=\"sk-meeting-address\">\n <p>{options.office_address}</p>\n <p>{options.office_instructions}</p>\n <a href={`https://www.google.com/maps/search/?api=1&query=${encodeURIComponent(options.office_address)}`} target=\"_blank\" rel=\"noopener noreferrer\">Get directions</a>\n </div>}\n {format === 'client_location' && <fieldset disabled={busy} className=\"bw-form sk-meeting-fields\">\n <legend>Your meeting address</legend>\n {([\n ['street', 'Street address', 'street-address'], ['unit', 'Suite or unit (optional)', 'address-line2'],\n ['city', 'City', 'address-level2'], ['region', 'State or region', 'address-level1'],\n ['postalCode', 'Postal code', 'postal-code'], ['country', 'Country', 'country-name'],\n ] as const).map(([key, label, autocomplete]) => <div className=\"bw-field\" key={key}>\n <label htmlFor={`${id}-${key}`}>{label}</label>\n <input id={`${id}-${key}`} value={address[key]} required={key !== 'unit'} maxLength={200} autoComplete={autocomplete}\n onChange={e => onAddressChange({ ...address, [key]: e.target.value })} />\n </div>)}\n <div className=\"bw-field\"><label htmlFor={`${id}-notes`}>Parking or access notes (optional)</label>\n <textarea id={`${id}-notes`} value={address.notes} maxLength={2000} onChange={e => onAddressChange({ ...address, notes: e.target.value })} />\n </div>\n {options.travel_review_required && <p>We’ll reserve your requested time and confirm after checking travel arrangements.</p>}\n </fieldset>}\n <button className=\"bw-submit\" type=\"submit\" disabled={!format || busy}>{busy ? 'Checking meeting details…' : 'Choose a time'}</button>\n <style>{`\n .sk-meeting-choices { border: 0; padding: 0; margin: 20px 0; display: grid; gap: 10px; }\n .sk-meeting-legend { position: absolute; width: 1px; height: 1px; overflow: hidden; clip-path: inset(50%); }\n .sk-meeting-choice { display: flex; align-items: flex-start; gap: 12px; padding: 16px; border: 1px solid var(--sk-border); border-radius: var(--sk-radius); cursor: pointer; background: var(--sk-surface); }\n .sk-meeting-choice input { margin-top: 4px; accent-color: var(--sk-primary); }\n .sk-meeting-choice strong { display: block; color: var(--sk-text-primary); }\n .sk-meeting-choice span span { display: block; margin-top: 4px; font-size: 14px; color: var(--sk-text-secondary); }\n .sk-meeting-selected { border-color: var(--sk-primary); background: var(--sk-primary-light); }\n .sk-meeting-address { padding: 16px; background: var(--sk-surface); border-radius: var(--sk-radius); margin-bottom: 16px; white-space: pre-wrap; }\n .sk-meeting-address a { display: inline-block; margin-top: 8px; color: var(--sk-primary); }\n .sk-meeting-fields { border: 0; padding: 0; margin-bottom: 20px; }\n .sk-meeting-fields legend { margin-bottom: 12px; font-weight: 600; }\n .sk-meeting-step .bw-submit { width: 100%; }\n `}</style>\n </form>\n}\n","import type { MeetingFormat, MeetingAddress, PreparedMeeting } from './types'\n/**\n * Sync API Functions - Client-side API calls for booking widget\n *\n * Two modes:\n * 1. API-key flow (preferred): Uses x-api-key header → /sync/widget/* endpoints.\n * Project is resolved server-side from the key. No orgSlug needed.\n * 2. Public/orgSlug flow (legacy): Uses /sync/public/:org/* endpoints. No auth.\n */\n\nimport { sonorFetch } from '../shared/sonorFetch'\nimport type {\n BookingType,\n TimeSlot,\n SlotHold,\n BookingResult,\n GuestInfo,\n} from './types'\n\nconst DEFAULT_API_URL = 'https://api.sonor.io'\n\n// ─────────────────────────────────────────────────────────────────────────────\n// Config helper (same pattern as analytics, commerce, engage)\n// ─────────────────────────────────────────────────────────────────────────────\n\nfunction getApiConfig() {\n const apiUrl = typeof window !== 'undefined'\n ? (window as any).__SITE_KIT_API_URL__ || DEFAULT_API_URL\n : DEFAULT_API_URL\n const apiKey = typeof window !== 'undefined'\n ? (window as any).__SITE_KIT_API_KEY__\n : undefined\n return { apiUrl, apiKey }\n}\n\n/**\n * Build headers – only Content-Type for POSTs. The credential is NOT set here:\n * it's passed to sonorFetch via options.apiKey so a stale minted-token seed is\n * refreshed transparently (a hand-set x-api-key header would pin the stale seed\n * and 401). The public/orgSlug flow simply passes no key and stays unauthed.\n */\nfunction buildHeaders(isPost = false): Record<string, string> {\n const headers: Record<string, string> = {}\n if (isPost) headers['Content-Type'] = 'application/json'\n return headers\n}\n\n// ─────────────────────────────────────────────────────────────────────────────\n// Read endpoints\n// ─────────────────────────────────────────────────────────────────────────────\n\n/**\n * Fetch booking types.\n * - With apiKey → GET /sync/widget/types\n * - With orgSlug → GET /sync/public/:org/types\n */\nexport async function fetchBookingTypes(\n orgSlug?: string,\n apiUrl?: string,\n apiKey?: string,\n): Promise<BookingType[]> {\n const cfg = getApiConfig()\n const url = apiUrl || cfg.apiUrl\n const key = apiKey || cfg.apiKey\n\n const endpoint = key\n ? `${url}/sync/widget/types`\n : `${url}/sync/public/${orgSlug}/types`\n\n const response = await sonorFetch(endpoint, { headers: buildHeaders() }, { apiKey: key, retries: 0 })\n \n if (!response.ok) {\n const msg = await response.json().catch(() => ({ message: response.statusText }))\n const detail = (msg && typeof msg.message === 'string') ? msg.message : response.statusText\n throw new Error(`Failed to fetch booking types: ${response.status} ${detail}`)\n }\n \n const data = await response.json()\n return data.types || []\n}\n\n/**\n * Fetch booking type details\n */\nexport async function fetchBookingTypeDetails(\n typeSlug: string,\n orgSlug?: string,\n apiUrl?: string,\n apiKey?: string,\n): Promise<BookingType> {\n const cfg = getApiConfig()\n const url = apiUrl || cfg.apiUrl\n const key = apiKey || cfg.apiKey\n\n const endpoint = key\n ? `${url}/sync/widget/types/${typeSlug}`\n : `${url}/sync/public/${orgSlug}/types/${typeSlug}`\n\n const response = await sonorFetch(endpoint, { headers: buildHeaders() }, { apiKey: key, retries: 0 })\n \n if (!response.ok) {\n const msg = await response.json().catch(() => ({ message: response.statusText }))\n const detail = (msg && typeof msg.message === 'string') ? msg.message : response.statusText\n throw new Error(`Failed to fetch booking type: ${response.status} ${detail}`)\n }\n \n return response.json()\n}\n\n/**\n * Fetch available time slots for a specific date\n */\nexport async function fetchAvailability(\n typeSlug: string,\n date: string, // YYYY-MM-DD format\n orgSlug?: string,\n apiUrl?: string,\n apiKey?: string,\n timezone?: string,\n hostId?: string,\n meetingToken?: string,\n): Promise<TimeSlot[]> {\n const cfg = getApiConfig()\n const url = apiUrl || cfg.apiUrl\n const key = apiKey || cfg.apiKey\n\n const params = new URLSearchParams({ date })\n if (timezone) params.append('timezone', timezone)\n if (hostId) params.append('hostId', hostId)\n if (meetingToken) params.append('meetingToken', meetingToken)\n\n const endpoint = key\n ? `${url}/sync/widget/availability/${typeSlug}?${params}`\n : `${url}/sync/public/${orgSlug}/availability/${typeSlug}?${params}`\n\n const response = await sonorFetch(endpoint, { headers: buildHeaders() }, { apiKey: key, retries: 0 })\n \n if (!response.ok) {\n const msg = await response.json().catch(() => ({ message: response.statusText }))\n let detail = (msg && typeof msg.message === 'string') ? String(msg.message).trim() : (response.statusText || '').trim()\n // Avoid \"404 404\": blank when detail is just the status code or only digits\n if (detail === String(response.status) || /^\\d+$/.test(detail)) detail = ''\n const rest = detail ? `${response.status} ${detail}` : String(response.status)\n const fallback =\n response.status === 404 && !detail\n ? 'No times available. In the Portal, check Sync → Booking Types (Schedule a Tour) has a host assigned and the project API key is set for this site.'\n : null\n throw new Error(fallback || `Failed to fetch availability: ${rest}`.trim())\n }\n \n const data = await response.json()\n const raw = data.slots || []\n // Normalize API shape (startTime/endTime, no available) to widget shape (start/end, available)\n return raw.map((slot: Record<string, unknown>) => ({\n start: slot.startTime ?? slot.start,\n end: slot.endTime ?? slot.end,\n hostId: slot.hostId,\n available: slot.available !== false,\n })) as TimeSlot[]\n}\n\n// ─────────────────────────────────────────────────────────────────────────────\n// Write endpoints\n// ─────────────────────────────────────────────────────────────────────────────\n\n/** Preserve actionable API messages consistently across meeting and reservation writes. */\nasync function bookingRequestError(response: Response, fallback: string): Promise<Error> {\n const body = await response.json().catch(() => ({}))\n const message = Array.isArray(body.message) ? body.message.join('. ') : body.message\n return new Error(typeof message === 'string' && message.trim() ? message : fallback)\n}\n\n/**\n * Hold a time slot temporarily (5-10 minutes)\n */\nexport async function createSlotHold(\n holdData: {\n meetingToken?: string\n org?: string\n bookingType: string\n slotStart: string\n slotEnd: string\n hostId: string\n sessionId: string\n guestEmail?: string\n },\n apiUrl?: string,\n apiKey?: string,\n): Promise<SlotHold> {\n const cfg = getApiConfig()\n const url = apiUrl || cfg.apiUrl\n const key = apiKey || cfg.apiKey\n\n const endpoint = key\n ? `${url}/sync/widget/hold`\n : `${url}/sync/public/hold`\n\n const response = await sonorFetch(endpoint, {\n method: 'POST',\n headers: buildHeaders(true),\n body: JSON.stringify(holdData),\n }, { apiKey: key, retries: 0 })\n\n if (!response.ok) {\n throw await bookingRequestError(response, 'We couldn’t reserve that time. Please choose another time.')\n }\n \n return response.json()\n}\n\n/**\n * Release a slot hold\n */\nexport async function releaseSlotHold(\n holdId: string,\n apiUrl?: string,\n apiKey?: string,\n): Promise<void> {\n const cfg = getApiConfig()\n const url = apiUrl || cfg.apiUrl\n const key = apiKey || cfg.apiKey\n\n const endpoint = key\n ? `${url}/sync/widget/hold/${holdId}`\n : `${url}/sync/public/hold/${holdId}`\n\n await sonorFetch(endpoint, {\n method: 'DELETE',\n headers: buildHeaders(),\n }, { apiKey: key, retries: 0 })\n}\n\n/**\n * Create a booking\n */\nexport async function createBooking(\n bookingData: {\n meetingToken?: string\n org?: string\n bookingType: string\n scheduledAt: string\n hostId: string\n name: string\n email: string\n phone?: string\n company?: string\n message?: string\n source: string\n timezone?: string\n holdId?: string\n sessionId?: string\n sourceUrl?: string\n },\n apiUrl?: string,\n apiKey?: string,\n): Promise<BookingResult> {\n const cfg = getApiConfig()\n const url = apiUrl || cfg.apiUrl\n const key = apiKey || cfg.apiKey\n\n const endpoint = key\n ? `${url}/sync/widget/booking`\n : `${url}/sync/public/booking`\n\n const response = await sonorFetch(endpoint, {\n method: 'POST',\n headers: buildHeaders(true),\n body: JSON.stringify(bookingData),\n }, { apiKey: key, retries: 0 })\n\n if (!response.ok) {\n throw await bookingRequestError(response, 'We couldn’t complete your booking. Please try again.')\n }\n \n return response.json()\n}\n\n// ─────────────────────────────────────────────────────────────────────────────\n// Utility helpers\n// ─────────────────────────────────────────────────────────────────────────────\n\n/**\n * Get available dates for a month (helper for calendar view)\n * Returns dates that have at least one available slot\n */\nexport async function fetchAvailableDates(\n typeSlug: string,\n startDate: string, // YYYY-MM-DD\n endDate: string, // YYYY-MM-DD\n orgSlug?: string,\n apiUrl?: string,\n apiKey?: string,\n timezone?: string,\n meetingToken?: string,\n): Promise<string[]> {\n const availableDates: string[] = []\n // startDate/endDate are YYYY-MM-DD → parsed as UTC midnight. Keep the whole loop\n // in UTC (getUTCDate/setUTCDate + toISOString) so day-stepping matches the date\n // string we read back — mixing in local getDate/setDate can skip or duplicate a\n // day across a DST boundary.\n const start = new Date(startDate)\n const end = new Date(endDate)\n\n const current = new Date(start)\n while (current <= end) {\n const dateStr = current.toISOString().split('T')[0]\n\n try {\n const slots = await fetchAvailability(typeSlug, dateStr, orgSlug, apiUrl, apiKey, timezone, undefined, meetingToken)\n if (slots.some(s => s.available)) {\n availableDates.push(dateStr)\n }\n } catch {\n // Skip dates that fail to load\n }\n\n current.setUTCDate(current.getUTCDate() + 1)\n }\n\n return availableDates\n}\n\n/**\n * Detect user's timezone\n */\nexport function detectTimezone(): string {\n try {\n return Intl.DateTimeFormat().resolvedOptions().timeZone\n } catch {\n return 'America/New_York'\n }\n}\n\n/**\n * Format time for display\n */\nexport function formatTime(isoString: string, timezone: string): string {\n const date = new Date(isoString)\n return date.toLocaleTimeString('en-US', {\n hour: 'numeric',\n minute: '2-digit',\n hour12: true,\n timeZone: timezone,\n })\n}\n\n/**\n * Format date for display\n */\nexport function formatDate(isoString: string, timezone: string): string {\n const date = new Date(isoString)\n return date.toLocaleDateString('en-US', {\n weekday: 'long',\n month: 'long',\n day: 'numeric',\n year: 'numeric',\n timeZone: timezone,\n })\n}\n\n/**\n * Format duration for display\n */\nexport function formatDuration(minutes: number): string {\n if (minutes < 60) {\n return `${minutes} min`\n }\n const hours = Math.floor(minutes / 60)\n const mins = minutes % 60\n if (mins === 0) {\n return `${hours} hour${hours > 1 ? 's' : ''}`\n }\n return `${hours}h ${mins}m`\n}\n\n/** Resolve and validate the location before exposing appointment times. */\nexport async function prepareMeeting(bookingType: string, format: MeetingFormat, address: MeetingAddress | undefined,\n orgSlug?: string, apiUrl?: string, apiKey?: string): Promise<PreparedMeeting> {\n const cfg = getApiConfig()\n const url = apiUrl || cfg.apiUrl\n const key = apiKey || cfg.apiKey\n const endpoint = key ? `${url}/sync/widget/meeting` : `${url}/sync/public/${orgSlug}/meeting`\n const response = await sonorFetch(endpoint, { method: 'POST', headers: buildHeaders(true),\n body: JSON.stringify({ bookingType, format, address }),\n }, { apiKey: key, retries: 0 })\n if (!response.ok) {\n throw await bookingRequestError(response, 'We couldn’t check your meeting details. Please try again.')\n }\n return response.json()\n}\n","import type { PreparedMeeting, SlotHold } from './types'\n\nexport type BookingRecovery = 'meeting' | 'hold'\n\n/** A valid hold carries its prepared meeting context, even after the intent expires. */\nexport function expiredBookingContext(meeting: PreparedMeeting | null, hold: SlotHold | null, now = Date.now()): BookingRecovery | null {\n if (hold) return Date.parse(hold.expiresAt) <= now ? 'hold' : null\n return meeting && Date.parse(meeting.expiresAt) <= now ? 'meeting' : null\n}\n\n/** Single source of truth for the API's recoverable reservation errors. */\nexport function bookingRecoveryFromError(error: unknown): BookingRecovery | null {\n const message = error instanceof Error ? error.message : ''\n if (/meeting details expired|choose how you.d like to meet first/i.test(message)) return 'meeting'\n if (/time reservation expired|invalid slot hold|meeting details changed/i.test(message)) return 'hold'\n return null\n}\n","'use client'\n\n/**\n * BookingWidget - Premium embeddable booking widget for client sites\n *\n * Calendly-inspired scheduling experience:\n * 1. Full month calendar for date selection\n * 2. Scrollable time-slot column\n * 3. Polished guest information form\n * 4. Animated booking confirmation\n *\n * Ships with self-contained CSS (no external deps) so it works on any site.\n *\n * @example\n * ```tsx\n * import { BookingWidget } from '@sonordev/site-kit'\n *\n * <BookingWidget\n * orgSlug=\"manhattan-development-group\"\n * bookingTypeSlug=\"schedule-a-tour\"\n * hideTypeSelector\n * onBookingComplete={(r) => console.log(r)}\n * />\n * ```\n */\n\nimport { MeetingFormatStep } from './MeetingFormatStep'\nimport { prepareMeeting } from './api'\nimport { bookingRecoveryFromError, expiredBookingContext } from './booking-flow'\nimport type { BookingRecovery } from './booking-flow'\nimport type { MeetingFormat, MeetingAddress, PreparedMeeting } from './types'\nimport * as React from 'react'\nimport { useState, useEffect, useCallback, useMemo, useRef } from 'react'\nimport type {\n BookingWidgetProps,\n BookingType,\n TimeSlot,\n GuestInfo,\n BookingResult,\n SlotHold,\n} from './types'\nimport {\n fetchBookingTypes,\n fetchBookingTypeDetails,\n fetchAvailability,\n createSlotHold,\n releaseSlotHold,\n createBooking,\n detectTimezone,\n formatTime,\n formatDate,\n formatDuration,\n} from './api'\n\n// ─── Constants ─────────────────────────────────────────────────────────────────\n\nconst DEFAULT_API_URL = 'https://api.sonor.io'\nconst DAYS = ['Sun', 'Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat'] as const\nconst MONTHS = [\n 'January','February','March','April','May','June',\n 'July','August','September','October','November','December',\n] as const\n\ntype BookingStep = 'format' | 'type' | 'datetime' | 'form' | 'success'\n\n// ─── Helpers ───────────────────────────────────────────────────────────────────\n\nfunction isSameDay(a: Date, b: Date) {\n return (\n a.getFullYear() === b.getFullYear() &&\n a.getMonth() === b.getMonth() &&\n a.getDate() === b.getDate()\n )\n}\n\nfunction isBeforeDay(a: Date, b: Date) {\n const ac = new Date(a.getFullYear(), a.getMonth(), a.getDate())\n const bc = new Date(b.getFullYear(), b.getMonth(), b.getDate())\n return ac < bc\n}\n\nfunction calendarDays(year: number, month: number): (Date | null)[] {\n const first = new Date(year, month, 1)\n const last = new Date(year, month + 1, 0)\n const cells: (Date | null)[] = []\n for (let i = 0; i < first.getDay(); i++) cells.push(null) // leading blanks\n for (let d = 1; d <= last.getDate(); d++) cells.push(new Date(year, month, d))\n return cells\n}\n\n/**\n * Format a Date as YYYY-MM-DD from its LOCAL calendar components. The calendar\n * cells are local-midnight Dates (new Date(year, month, day)); toISOString()\n * would convert to UTC and roll back a day for any guest east of UTC, sending\n * the wrong date to the availability API. Always format the clicked day locally.\n */\nfunction toLocalDateStr(d: Date): string {\n const y = d.getFullYear()\n const m = String(d.getMonth() + 1).padStart(2, '0')\n const day = String(d.getDate()).padStart(2, '0')\n return `${y}-${m}-${day}`\n}\n\n// ─── SVG Icons (inline, no deps) ──────────────────────────────────────────────\n\nfunction ChevronLeft() {\n return (\n <svg width=\"20\" height=\"20\" viewBox=\"0 0 20 20\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n <path d=\"M12.5 15L7.5 10L12.5 5\" stroke=\"currentColor\" strokeWidth=\"1.5\" strokeLinecap=\"round\" strokeLinejoin=\"round\"/>\n </svg>\n )\n}\n\nfunction ChevronRight() {\n return (\n <svg width=\"20\" height=\"20\" viewBox=\"0 0 20 20\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n <path d=\"M7.5 5L12.5 10L7.5 15\" stroke=\"currentColor\" strokeWidth=\"1.5\" strokeLinecap=\"round\" strokeLinejoin=\"round\"/>\n </svg>\n )\n}\n\nfunction ClockIcon() {\n return (\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 16 16\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n <circle cx=\"8\" cy=\"8\" r=\"6.5\" stroke=\"currentColor\" strokeWidth=\"1.2\"/>\n <path d=\"M8 4.5V8L10 10\" stroke=\"currentColor\" strokeWidth=\"1.2\" strokeLinecap=\"round\" strokeLinejoin=\"round\"/>\n </svg>\n )\n}\n\nfunction GlobeIcon() {\n return (\n <svg width=\"14\" height=\"14\" viewBox=\"0 0 16 16\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n <circle cx=\"8\" cy=\"8\" r=\"6.5\" stroke=\"currentColor\" strokeWidth=\"1.2\"/>\n <path d=\"M1.5 8H14.5\" stroke=\"currentColor\" strokeWidth=\"1.2\"/>\n <path d=\"M8 1.5C9.66 3.34 10.61 5.62 10.61 8C10.61 10.38 9.66 12.66 8 14.5C6.34 12.66 5.39 10.38 5.39 8C5.39 5.62 6.34 3.34 8 1.5Z\" stroke=\"currentColor\" strokeWidth=\"1.2\"/>\n </svg>\n )\n}\n\nfunction CheckCircleIcon() {\n return (\n <svg width=\"56\" height=\"56\" viewBox=\"0 0 56 56\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n <circle cx=\"28\" cy=\"28\" r=\"28\" fill=\"var(--sk-primary)\"/>\n <path d=\"M18 28.5L24.5 35L38 21.5\" stroke=\"white\" strokeWidth=\"3\" strokeLinecap=\"round\" strokeLinejoin=\"round\"/>\n </svg>\n )\n}\n\nfunction CalendarPlusIcon() {\n return (\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 16 16\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n <rect x=\"1.5\" y=\"2.5\" width=\"13\" height=\"12\" rx=\"1.5\" stroke=\"currentColor\" strokeWidth=\"1.2\"/>\n <path d=\"M1.5 6.5H14.5\" stroke=\"currentColor\" strokeWidth=\"1.2\"/>\n <path d=\"M5 1V4M11 1V4\" stroke=\"currentColor\" strokeWidth=\"1.2\" strokeLinecap=\"round\"/>\n <path d=\"M8 9V12M6.5 10.5H9.5\" stroke=\"currentColor\" strokeWidth=\"1.2\" strokeLinecap=\"round\"/>\n </svg>\n )\n}\n\nfunction ArrowLeftIcon() {\n return (\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 16 16\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n <path d=\"M10 3L5 8L10 13\" stroke=\"currentColor\" strokeWidth=\"1.5\" strokeLinecap=\"round\" strokeLinejoin=\"round\"/>\n </svg>\n )\n}\n\nfunction SpinnerIcon() {\n return (\n <svg width=\"20\" height=\"20\" viewBox=\"0 0 20 20\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\" className=\"bw-spinner\">\n <circle cx=\"10\" cy=\"10\" r=\"8\" stroke=\"currentColor\" strokeWidth=\"2\" strokeLinecap=\"round\" strokeDasharray=\"50.265\" strokeDashoffset=\"25\" opacity=\"0.3\"/>\n <circle cx=\"10\" cy=\"10\" r=\"8\" stroke=\"currentColor\" strokeWidth=\"2\" strokeLinecap=\"round\" strokeDasharray=\"50.265\" strokeDashoffset=\"37.7\"/>\n </svg>\n )\n}\n\n// ─── Component ─────────────────────────────────────────────────────────────────\n\nexport function BookingWidget({\n orgSlug,\n apiKey: propApiKey,\n apiUrl: propApiUrl,\n bookingTypeSlug,\n timezone: propTimezone,\n className = '',\n daysToShow = 60,\n onBookingComplete,\n onError,\n hideTypeSelector = false,\n autoSelectFirstDay = true,\n styles = {},\n}: BookingWidgetProps) {\n // Resolve API key: prop > window global\n const apiKey = propApiKey || (typeof window !== 'undefined' ? (window as any).__SITE_KIT_API_KEY__ : undefined)\n const apiUrl = propApiUrl || (typeof window !== 'undefined' ? (window as any).__SITE_KIT_API_URL__ : undefined) || DEFAULT_API_URL\n // ── State ──\n const [step, setStep] = useState<BookingStep>(bookingTypeSlug ? 'datetime' : 'type')\n const [loading, setLoading] = useState(false)\n const [slotsLoading, setSlotsLoading] = useState(false)\n const [error, setError] = useState<string | null>(null)\n\n const [bookingTypes, setBookingTypes] = useState<BookingType[]>([])\n const [selectedType, setSelectedType] = useState<BookingType | null>(null)\n const [viewMonth, setViewMonth] = useState(() => new Date())\n const [selectedDate, setSelectedDate] = useState<Date | null>(null)\n const [slots, setSlots] = useState<TimeSlot[]>([])\n const [selectedSlot, setSelectedSlot] = useState<TimeSlot | null>(null)\n const [confirmedSlot, setConfirmedSlot] = useState(false)\n const [hold, setHold] = useState<SlotHold | null>(null)\n const [guestInfo, setGuestInfo] = useState<GuestInfo>({ name: '', email: '' })\n const [bookingResult, setBookingResult] = useState<BookingResult | null>(null)\n const [submitting, setSubmitting] = useState(false)\n const [meeting, setMeeting] = useState<PreparedMeeting | null>(null)\n const [meetingFormat, setMeetingFormat] = useState<MeetingFormat | null>(null)\n const [meetingAddress, setMeetingAddress] = useState<MeetingAddress>({ street: '', city: '', region: '', postalCode: '', country: 'United States', unit: '', notes: '' })\n const [recovery, setRecovery] = useState<BookingRecovery | null>(null)\n const [sessionId] = useState(() => `bw-${Date.now()}-${Math.random().toString(36).slice(2)}`)\n const requestRef = useRef(0)\n const busyRef = useRef(false)\n const bookingInFlightRef = useRef(false)\n const holdRef = useRef<SlotHold | null>(null)\n const onErrorRef = useRef(onError)\n onErrorRef.current = onError\n // Auto-select probe: finding the first day with open slots\n const [autoProbing, setAutoProbing] = useState(false)\n const probeRef = useRef(0)\n const prefetchedRef = useRef<{ dateStr: string; slots: TimeSlot[] } | null>(null)\n\n const slotsRef = useRef<HTMLDivElement>(null)\n const today = useMemo(() => { const d = new Date(); d.setHours(0,0,0,0); return d }, [])\n const timezone = useMemo(() => propTimezone || detectTimezone(), [propTimezone])\n\n const shortTz = useMemo(() => {\n try {\n const parts = Intl.DateTimeFormat('en-US', { timeZone: timezone, timeZoneName: 'short' })\n .formatToParts(new Date())\n return parts.find(p => p.type === 'timeZoneName')?.value || timezone\n } catch { return timezone }\n }, [timezone])\n\n // Calendar grid for the current view month\n const days = useMemo(() => calendarDays(viewMonth.getFullYear(), viewMonth.getMonth()), [viewMonth])\n const maxDate = useMemo(() => { const d = new Date(today); d.setDate(d.getDate() + daysToShow); return d }, [today, daysToShow])\n\n const setActiveHold = useCallback((value: SlotHold | null) => {\n holdRef.current = value\n setHold(value)\n }, [])\n\n // Single reset path for changing services, formats, times, and expired reservations.\n const resetScheduling = useCallback((nextStep: BookingStep, clearMeeting = false) => {\n ++requestRef.current\n const previous = holdRef.current\n setActiveHold(null)\n if (previous) releaseSlotHold(previous.holdId, apiUrl, apiKey).catch(() => {})\n setSelectedDate(null)\n setSelectedSlot(null)\n setConfirmedSlot(false)\n setSlots([])\n setSlotsLoading(false)\n prefetchedRef.current = null\n if (clearMeeting) setMeeting(null)\n setRecovery(null)\n setError(null)\n setStep(nextStep)\n }, [apiUrl, apiKey, setActiveHold])\n\n const reportRequestError = useCallback((err: Error) => {\n setRecovery(bookingRecoveryFromError(err))\n setError(err.message)\n onErrorRef.current?.(err)\n }, [])\n\n useEffect(() => () => {\n ++requestRef.current\n // A submitted booking must finish on the server. Other abandoned holds can be released.\n if (holdRef.current && !bookingInFlightRef.current) {\n releaseSlotHold(holdRef.current.holdId, apiUrl, apiKey).catch(() => {})\n }\n holdRef.current = null\n }, [apiUrl, apiKey])\n\n // ── Data Loading ──\n\n useEffect(() => {\n let cancelled = false\n ++requestRef.current\n busyRef.current = false\n bookingInFlightRef.current = false\n resetScheduling(bookingTypeSlug ? 'datetime' : 'type', true)\n setSelectedType(null)\n setMeetingFormat(null)\n setBookingResult(null)\n setSubmitting(false)\n if (bookingTypeSlug) {\n setLoading(true)\n fetchBookingTypeDetails(bookingTypeSlug, orgSlug, apiUrl, apiKey)\n .then(type => { if (!cancelled) { setSelectedType(type); setStep(type.meeting_options ? 'format' : 'datetime') } })\n .catch(err => { if (!cancelled) reportRequestError(err) })\n .finally(() => { if (!cancelled) setLoading(false) })\n } else {\n setLoading(true)\n fetchBookingTypes(orgSlug, apiUrl, apiKey)\n .then(types => { if (!cancelled) setBookingTypes(types.filter(t => t.is_active)) })\n .catch(err => { if (!cancelled) reportRequestError(err) })\n .finally(() => { if (!cancelled) setLoading(false) })\n }\n return () => { cancelled = true; ++requestRef.current }\n }, [orgSlug, apiKey, bookingTypeSlug, apiUrl, resetScheduling, reportRequestError])\n\n useEffect(() => {\n if (!selectedDate || !selectedType || (selectedType.meeting_options && !meeting)) return\n const dateStr = toLocalDateStr(selectedDate)\n setSelectedSlot(null)\n setConfirmedSlot(false)\n\n // The auto-select probe already fetched this day — reuse its slots\n const prefetched = prefetchedRef.current\n if (prefetched && prefetched.dateStr === dateStr) {\n prefetchedRef.current = null\n setSlots(prefetched.slots)\n setSlotsLoading(false)\n return\n }\n\n let cancelled = false\n setSlotsLoading(true)\n setSlots([])\n fetchAvailability(selectedType.slug, dateStr, orgSlug, apiUrl, apiKey, timezone, undefined, meeting?.meetingToken)\n .then(s => { if (!cancelled) setSlots(s.filter(slot => slot.available)) })\n .catch(err => { if (!cancelled) reportRequestError(err) })\n .finally(() => { if (!cancelled) setSlotsLoading(false) })\n return () => { cancelled = true }\n }, [selectedDate, selectedType, orgSlug, apiKey, apiUrl, timezone, reportRequestError, meeting])\n\n // Auto-select the first day with open slots so guests land on pickable\n // times instead of an empty calendar. Sequential bounded probe: starts at\n // the earliest bookable day (min-notice aware), stops at the first hit.\n useEffect(() => {\n if (!autoSelectFirstDay || !selectedType || selectedDate || step !== 'datetime' || recovery || (selectedType.meeting_options && !meeting)) return\n const probeId = ++probeRef.current\n let cancelled = false\n const PROBE_DAYS = 14\n const startOffset = Math.floor((selectedType.min_notice_hours || 0) / 24)\n\n ;(async () => {\n setAutoProbing(true)\n try {\n for (let i = startOffset; i < startOffset + PROBE_DAYS; i++) {\n const d = new Date(today)\n d.setDate(d.getDate() + i)\n if (d > maxDate) break\n const dateStr = toLocalDateStr(d)\n const s = await fetchAvailability(selectedType.slug, dateStr, orgSlug, apiUrl, apiKey, timezone, undefined, meeting?.meetingToken)\n if (cancelled || probeRef.current !== probeId) return\n const open = s.filter(slot => slot.available)\n if (open.length > 0) {\n prefetchedRef.current = { dateStr, slots: open }\n setViewMonth(new Date(d.getFullYear(), d.getMonth(), 1))\n setSelectedDate(d)\n return\n }\n }\n } catch (err) {\n if (!cancelled && bookingRecoveryFromError(err)) reportRequestError(err as Error)\n // Probe is best-effort — the guest can still pick a day manually.\n } finally {\n if (!cancelled && probeRef.current === probeId) setAutoProbing(false)\n }\n })()\n\n return () => {\n cancelled = true\n setAutoProbing(false)\n }\n }, [autoSelectFirstDay, selectedType, selectedDate, orgSlug, apiKey, apiUrl, timezone, today, maxDate, step, meeting, recovery, reportRequestError])\n\n useEffect(() => {\n if ((step !== 'datetime' && step !== 'form') || loading || submitting) return\n const expiry = hold?.expiresAt || meeting?.expiresAt\n if (!expiry || !Number.isFinite(Date.parse(expiry))) return\n const checkExpiry = () => {\n const expired = expiredBookingContext(meeting, hold)\n if (!busyRef.current && expired) setRecovery(expired)\n }\n const timer = setTimeout(checkExpiry, Math.max(0, Date.parse(expiry) - Date.now()))\n // Background tabs may throttle timers, so refresh the reservation state on return.\n window.addEventListener('focus', checkExpiry)\n return () => { clearTimeout(timer); window.removeEventListener('focus', checkExpiry) }\n }, [meeting, hold, step, loading, submitting])\n\n // ── Handlers ──\n\n const handleSlotSelect = useCallback((slot: TimeSlot) => {\n if (busyRef.current) return\n setSelectedSlot(slot)\n setConfirmedSlot(false)\n }, [])\n\n const handleSlotConfirm = useCallback(async () => {\n if (!selectedType || !selectedSlot || busyRef.current || recovery) return\n const expired = expiredBookingContext(meeting, null)\n if (expired) { setRecovery(expired); return }\n const requestId = ++requestRef.current\n busyRef.current = true\n setLoading(true)\n setError(null)\n try {\n const previous = holdRef.current\n setActiveHold(null)\n if (previous) await releaseSlotHold(previous.holdId, apiUrl, apiKey).catch(() => {})\n if (requestId !== requestRef.current) return\n const newHold = await createSlotHold(\n {\n meetingToken: meeting?.meetingToken,\n org: apiKey ? undefined : orgSlug,\n bookingType: selectedType.slug,\n slotStart: selectedSlot.start,\n slotEnd: selectedSlot.end,\n hostId: selectedSlot.hostId || '',\n sessionId,\n },\n apiUrl,\n apiKey,\n )\n if (requestId !== requestRef.current) {\n await releaseSlotHold(newHold.holdId, apiUrl, apiKey).catch(() => {})\n return\n }\n setActiveHold(newHold)\n setConfirmedSlot(true)\n setStep('form')\n } catch (err: any) {\n if (requestId === requestRef.current) reportRequestError(err)\n } finally {\n if (requestId === requestRef.current) { busyRef.current = false; setLoading(false) }\n }\n }, [selectedType, selectedSlot, apiUrl, apiKey, meeting, sessionId, orgSlug, recovery, setActiveHold, reportRequestError])\n\n const handleBookingSubmit = useCallback(async (e: React.FormEvent) => {\n e.preventDefault()\n if (!selectedType || !selectedSlot || busyRef.current || recovery) return\n const expired = expiredBookingContext(meeting, hold)\n if (expired) { setRecovery(expired); return }\n const requestId = ++requestRef.current\n busyRef.current = true\n bookingInFlightRef.current = true\n setSubmitting(true)\n setError(null)\n\n try {\n const result = await createBooking(\n {\n meetingToken: meeting?.meetingToken,\n org: apiKey ? undefined : orgSlug,\n bookingType: selectedType.slug,\n scheduledAt: selectedSlot.start,\n hostId: selectedSlot.hostId || '',\n name: guestInfo.name,\n email: guestInfo.email,\n phone: guestInfo.phone,\n message: guestInfo.notes,\n source: 'main-site',\n timezone,\n holdId: hold?.holdId,\n sessionId,\n sourceUrl: typeof window !== 'undefined' ? window.location.href : undefined,\n },\n apiUrl,\n apiKey,\n )\n if (requestId !== requestRef.current) return\n setActiveHold(null)\n setBookingResult(result)\n setStep('success')\n onBookingComplete?.(result)\n } catch (err: any) {\n if (requestId === requestRef.current) reportRequestError(err)\n else if (hold) releaseSlotHold(hold.holdId, apiUrl, apiKey).catch(() => {})\n } finally {\n if (requestId === requestRef.current) {\n busyRef.current = false\n bookingInFlightRef.current = false\n setSubmitting(false)\n }\n }\n }, [selectedType, selectedSlot, guestInfo, timezone, hold, apiUrl, apiKey, onBookingComplete, meeting, sessionId, orgSlug, recovery, setActiveHold, reportRequestError])\n\n const chooseFormat = async (format: MeetingFormat, address?: MeetingAddress) => {\n if (!selectedType || busyRef.current) return\n const requestId = ++requestRef.current\n busyRef.current = true\n setLoading(true)\n setError(null)\n try {\n const prepared = await prepareMeeting(selectedType.slug, format, address, orgSlug, apiUrl, apiKey)\n if (requestId !== requestRef.current) return\n setMeeting(prepared)\n setRecovery(null)\n setSelectedDate(null)\n setSelectedSlot(null)\n prefetchedRef.current = null\n setStep('datetime')\n } catch (err: any) { if (requestId === requestRef.current) reportRequestError(err) }\n finally { if (requestId === requestRef.current) { busyRef.current = false; setLoading(false) } }\n }\n const changeFormat = () => {\n if (!busyRef.current) resetScheduling('format', true)\n }\n const changeService = () => {\n if (busyRef.current) return\n resetScheduling('type', true)\n setSelectedType(null)\n setMeetingFormat(null)\n }\n const recoverReservation = () => {\n if (busyRef.current) return\n const needsMeeting = recovery === 'meeting' || expiredBookingContext(meeting, null) === 'meeting'\n resetScheduling(needsMeeting ? 'format' : 'datetime', needsMeeting)\n }\n const displayType = selectedType ? { ...selectedType,\n ...(meeting ? { location_type: meeting.location_type, location_details: meeting.location_details, location_instructions: meeting.location_instructions } : {}),\n ...(bookingResult ? { location_type: bookingResult.booking.location_type || selectedType.location_type,\n location_details: bookingResult.booking.location_details, location_instructions: bookingResult.booking.location_instructions,\n video_link: bookingResult.booking.video_link } : {}),\n } : null\n const isPending = bookingResult?.booking.status === 'pending'\n\n // ── Month Navigation ──\n\n const canGoPrev = viewMonth.getFullYear() > today.getFullYear() || viewMonth.getMonth() > today.getMonth()\n const canGoNext = viewMonth < maxDate\n\n const goMonth = (dir: -1 | 1) => {\n if (busyRef.current) return\n setViewMonth(prev => new Date(prev.getFullYear(), prev.getMonth() + dir, 1))\n }\n\n // ── Group slots by morning/afternoon ──\n\n const groupedSlots = useMemo(() => {\n const morning: TimeSlot[] = []\n const afternoon: TimeSlot[] = []\n const evening: TimeSlot[] = []\n for (const s of slots) {\n const h = new Date(s.start).getHours()\n if (h < 12) morning.push(s)\n else if (h < 17) afternoon.push(s)\n else evening.push(s)\n }\n return { morning, afternoon, evening }\n }, [slots])\n\n // ── CSS vars ──\n\n const cssVars = {\n '--sk-primary': styles.primaryColor || '#0069ff',\n '--sk-primary-hover': styles.primaryColor\n ? `color-mix(in srgb, ${styles.primaryColor} 90%, black)`\n : '#0055d4',\n '--sk-primary-light': styles.primaryColor\n ? `color-mix(in srgb, ${styles.primaryColor} 12%, ${styles.backgroundColor || 'white'})`\n : '#e8f1ff',\n '--sk-bg': styles.backgroundColor || '#ffffff',\n '--sk-bg-elevated': styles.elevatedColor || '#f9fafb',\n '--sk-surface': styles.surfaceColor || '#f3f4f6',\n '--sk-text-primary': styles.textPrimary || '#1a1a1a',\n '--sk-text-secondary': styles.textSecondary || '#6b7280',\n '--sk-text-tertiary': styles.textTertiary || '#9ca3af',\n '--sk-border': styles.borderColor || '#e5e7eb',\n '--sk-error': '#dc2626',\n '--sk-success': '#047857',\n '--sk-warning': '#b45309',\n '--sk-radius': styles.borderRadius || '8px',\n '--sk-font': styles.fontFamily || \"-apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, sans-serif\",\n '--sk-input-border': styles.inputBorderColor || styles.borderColor || '#e5e7eb',\n '--sk-input-focus-ring': styles.primaryColor\n ? `color-mix(in srgb, ${styles.primaryColor} 12%, ${styles.backgroundColor || 'white'})`\n : '#e8f1ff',\n } as React.CSSProperties\n\n // ── Render ──\n\n return (\n <div className={`bw-root ${className}`} style={cssVars}>\n {/* Error Toast */}\n {error && !recovery && (\n <div className=\"bw-error\" role=\"alert\">\n <span>{error}</span>\n <button onClick={() => setError(null)} aria-label=\"Dismiss error\">&times;</button>\n </div>\n )}\n {recovery && (\n <div className=\"sk-booking-recovery\" role=\"alert\">\n <p>{recovery === 'meeting' ? 'Your meeting details need to be checked again.' : 'Your time reservation expired. Choose a time to continue.'} Your entered details are saved.</p>\n <button type=\"button\" className=\"bw-submit\" onClick={recoverReservation} disabled={loading || submitting}>\n {recovery === 'meeting' ? 'Review meeting details' : 'Choose another time'}\n </button>\n </div>\n )}\n\n {/* ───── Type Selection ───── */}\n {step === 'type' && !hideTypeSelector && (\n <div className=\"bw-step bw-fade-in\">\n <h2 className=\"bw-heading\">Select a Service</h2>\n {loading ? (\n <div className=\"bw-loading\"><SpinnerIcon /> Loading services...</div>\n ) : (\n <div className=\"bw-type-list\">\n {bookingTypes.map(type => (\n <button\n key={type.id}\n className=\"bw-type-card\"\n onClick={() => { if (!busyRef.current) { resetScheduling(type.meeting_options ? 'format' : 'datetime', true); setSelectedType(type) } }}\n >\n <span className=\"bw-type-name\">{type.name}</span>\n {type.description && <span className=\"bw-type-desc\">{type.description}</span>}\n <span className=\"bw-type-meta\">\n <ClockIcon /> {formatDuration(type.duration_minutes)}\n {type.price_cents ? ` · $${(type.price_cents / 100).toFixed(2)}` : ' · Free'}\n {getLocationDisplay(type) ? ` · ${getLocationDisplay(type)!.label}` : ''}\n </span>\n </button>\n ))}\n </div>\n )}\n </div>\n )}\n\n {step === 'format' && selectedType?.meeting_options && (\n <MeetingFormatStep options={selectedType.meeting_options} busy={loading}\n format={meetingFormat} address={meetingAddress} onFormatChange={setMeetingFormat} onAddressChange={setMeetingAddress}\n onContinue={chooseFormat} onBack={!bookingTypeSlug && !hideTypeSelector ? changeService : undefined} />\n )}\n {selectedType?.meeting_options && (step === 'datetime' || step === 'form') && (\n <button type=\"button\" className=\"bw-back sk-meeting-change\" onClick={changeFormat} disabled={loading || submitting}>← Change meeting format</button>\n )}\n\n {/* ───── Date & Time ───── */}\n {step === 'datetime' && selectedType && (\n <div className=\"bw-step bw-fade-in\">\n {/* Booking info header */}\n <div className=\"bw-info-header\">\n {!bookingTypeSlug && !hideTypeSelector && (\n <button className=\"bw-back\" onClick={changeService} disabled={loading} aria-label=\"Change service\">\n <ArrowLeftIcon />\n </button>\n )}\n <div>\n <h2 className=\"bw-heading\">{selectedType.name}</h2>\n <div className=\"bw-meta-row\">\n <span className=\"bw-badge\"><ClockIcon /> {formatDuration(selectedType.duration_minutes)}</span>\n <span className=\"bw-badge\"><GlobeIcon /> {shortTz}</span>\n <LocationBadge type={displayType} />\n </div>\n </div>\n </div>\n\n <div className=\"bw-datetime-layout\">\n {/* Calendar */}\n <div className=\"bw-calendar\">\n <div className=\"bw-cal-header\">\n <button className=\"bw-cal-nav\" onClick={() => goMonth(-1)} disabled={!canGoPrev || loading || !!recovery} aria-label=\"Previous month\">\n <ChevronLeft />\n </button>\n <span className=\"bw-cal-title\">{MONTHS[viewMonth.getMonth()]} {viewMonth.getFullYear()}</span>\n <button className=\"bw-cal-nav\" onClick={() => goMonth(1)} disabled={!canGoNext || loading || !!recovery} aria-label=\"Next month\">\n <ChevronRight />\n </button>\n </div>\n <div className=\"bw-cal-weekdays\">\n {DAYS.map(d => <span key={d} className=\"bw-cal-wd\">{d}</span>)}\n </div>\n <div className=\"bw-cal-grid\">\n {days.map((date, i) => {\n if (!date) return <span key={`e-${i}`} className=\"bw-cal-empty\" />\n const past = isBeforeDay(date, today)\n const future = date > maxDate\n const disabled = past || future || loading || !!recovery\n const sel = selectedDate && isSameDay(date, selectedDate)\n const isToday = isSameDay(date, today)\n return (\n <button\n key={date.toISOString()}\n className={`bw-cal-day${sel ? ' selected' : ''}${isToday ? ' today' : ''}${disabled ? ' disabled' : ''}`}\n onClick={() => { if (!disabled && !busyRef.current) setSelectedDate(date) }}\n disabled={disabled}\n aria-label={date.toLocaleDateString('en-US', { weekday: 'long', month: 'long', day: 'numeric' })}\n aria-pressed={sel || undefined}\n >\n {date.getDate()}\n </button>\n )\n })}\n </div>\n </div>\n\n {/* Time Slots (appear when date selected) */}\n <div className={`bw-times${selectedDate ? ' visible' : ''}`} ref={slotsRef}>\n {!selectedDate ? (\n autoProbing ? (\n <div className=\"bw-times-skeleton\" aria-hidden=\"true\">\n <div className=\"bw-skel-line\" />\n {[0, 1, 2, 3, 4].map(i => <div key={i} className=\"bw-skel-slot\" />)}\n </div>\n ) : (\n <div className=\"bw-times-placeholder\">\n <CalendarPlusIcon />\n <span>Select a date to view available times</span>\n </div>\n )\n ) : slotsLoading ? (\n <div className=\"bw-times-skeleton\" aria-hidden=\"true\">\n <div className=\"bw-skel-line\" />\n {[0, 1, 2, 3, 4].map(i => <div key={i} className=\"bw-skel-slot\" />)}\n </div>\n ) : slots.length === 0 ? (\n <div className=\"bw-times-empty\">No available times on this date. Try another day.</div>\n ) : (\n <div className=\"bw-times-scroll\">\n <p className=\"bw-times-date\">\n {selectedDate.toLocaleDateString('en-US', { weekday: 'long', month: 'short', day: 'numeric' })}\n </p>\n {groupedSlots.morning.length > 0 && (\n <div className=\"bw-time-group\">\n <span className=\"bw-time-label\">Morning</span>\n {groupedSlots.morning.map(slot => (\n <TimeButton key={slot.start} slot={slot} selected={selectedSlot?.start === slot.start} confirmed={confirmedSlot && selectedSlot?.start === slot.start} onClick={() => handleSlotSelect(slot)} onConfirm={handleSlotConfirm} timezone={timezone} loading={loading || !!recovery} />\n ))}\n </div>\n )}\n {groupedSlots.afternoon.length > 0 && (\n <div className=\"bw-time-group\">\n <span className=\"bw-time-label\">Afternoon</span>\n {groupedSlots.afternoon.map(slot => (\n <TimeButton key={slot.start} slot={slot} selected={selectedSlot?.start === slot.start} confirmed={confirmedSlot && selectedSlot?.start === slot.start} onClick={() => handleSlotSelect(slot)} onConfirm={handleSlotConfirm} timezone={timezone} loading={loading || !!recovery} />\n ))}\n </div>\n )}\n {groupedSlots.evening.length > 0 && (\n <div className=\"bw-time-group\">\n <span className=\"bw-time-label\">Evening</span>\n {groupedSlots.evening.map(slot => (\n <TimeButton key={slot.start} slot={slot} selected={selectedSlot?.start === slot.start} confirmed={confirmedSlot && selectedSlot?.start === slot.start} onClick={() => handleSlotSelect(slot)} onConfirm={handleSlotConfirm} timezone={timezone} loading={loading || !!recovery} />\n ))}\n </div>\n )}\n {(groupedSlots.afternoon.length > 0 || groupedSlots.evening.length > 0) && (\n <p className=\"bw-times-scroll-hint\">Scroll for more times</p>\n )}\n </div>\n )}\n </div>\n </div>\n </div>\n )}\n\n {/* ───── Guest Form ───── */}\n {step === 'form' && selectedType && selectedSlot && (\n <div className=\"bw-step bw-fade-in\">\n <div className=\"bw-info-header\">\n <button className=\"bw-back\" onClick={recoverReservation} disabled={submitting} aria-label=\"Choose another time\">\n <ArrowLeftIcon />\n </button>\n <div>\n <h2 className=\"bw-heading\">Your Details</h2>\n <div className=\"bw-meta-row\">\n <span className=\"bw-badge\"><ClockIcon /> {formatDuration(selectedType.duration_minutes)}</span>\n <span className=\"bw-badge-accent\">\n {formatDate(selectedSlot.start, timezone)} · {formatTime(selectedSlot.start, timezone)}\n </span>\n <LocationBadge type={displayType} />\n </div>\n </div>\n </div>\n\n {hold && !recovery && (\n <div className=\"bw-hold-notice\">\n <SpinnerIcon /> Slot held for you. Complete your details to confirm.\n </div>\n )}\n\n <LocationRow type={displayType} meetingFormat={meeting?.format} />\n {meeting?.requires_review && <p>We’ll confirm your visit after reviewing travel arrangements.</p>}\n <form onSubmit={handleBookingSubmit} className=\"bw-form\">\n <div className=\"bw-field\">\n <label htmlFor=\"bw-name\">Name <span className=\"bw-req\">*</span></label>\n <input\n id=\"bw-name\"\n type=\"text\"\n required\n readOnly={submitting}\n value={guestInfo.name}\n onChange={e => setGuestInfo(p => ({ ...p, name: e.target.value }))}\n placeholder=\"Jane Smith\"\n autoComplete=\"name\"\n />\n </div>\n <div className=\"bw-field\">\n <label htmlFor=\"bw-email\">Email <span className=\"bw-req\">*</span></label>\n <input\n id=\"bw-email\"\n type=\"email\"\n required\n readOnly={submitting}\n value={guestInfo.email}\n onChange={e => setGuestInfo(p => ({ ...p, email: e.target.value }))}\n placeholder=\"jane@example.com\"\n autoComplete=\"email\"\n />\n </div>\n <div className=\"bw-field\">\n <label htmlFor=\"bw-phone\">Phone {meeting?.format === 'client_location' && <span className=\"bw-req\">*</span>}</label>\n <input\n required={meeting?.format === 'client_location'}\n readOnly={submitting}\n id=\"bw-phone\"\n type=\"tel\"\n value={guestInfo.phone || ''}\n onChange={e => setGuestInfo(p => ({ ...p, phone: e.target.value }))}\n placeholder=\"(555) 123-4567\"\n autoComplete=\"tel\"\n />\n </div>\n <div className=\"bw-field\">\n <label htmlFor=\"bw-notes\">Notes</label>\n <textarea\n id=\"bw-notes\"\n readOnly={submitting}\n value={guestInfo.notes || ''}\n onChange={e => setGuestInfo(p => ({ ...p, notes: e.target.value }))}\n placeholder=\"Anything you'd like us to know...\"\n rows={3}\n />\n </div>\n <button type=\"submit\" className=\"bw-submit\" disabled={submitting || !!recovery || !guestInfo.name || !guestInfo.email}>\n {submitting ? <><SpinnerIcon /> Confirming...</> : meeting?.requires_review ? 'Request meeting' : 'Confirm booking'}\n </button>\n </form>\n </div>\n )}\n\n {/* ───── Success ───── */}\n {step === 'success' && bookingResult && (\n <div className=\"bw-step bw-fade-in bw-success\">\n <div className=\"bw-success-icon\"><CheckCircleIcon /></div>\n <h2 className=\"bw-heading\">{isPending ? 'Meeting request received' : 'You’re booked!'}</h2>\n\n <div className=\"bw-details-card\">\n <div className=\"bw-detail-row\">\n <span className=\"bw-detail-label\">When</span>\n <span className=\"bw-detail-value\">\n {formatDate(selectedSlot?.start || bookingResult.booking.scheduledAt || '', timezone)}<br/>\n {formatTime(selectedSlot?.start || bookingResult.booking.scheduledAt || '', timezone)} ({shortTz})\n </span>\n </div>\n <div className=\"bw-detail-row\">\n <span className=\"bw-detail-label\">Duration</span>\n <span className=\"bw-detail-value\">{formatDuration(selectedType?.duration_minutes ?? bookingResult.booking.durationMinutes ?? 0)}</span>\n </div>\n {bookingResult.booking.hostName && (\n <div className=\"bw-detail-row\">\n <span className=\"bw-detail-label\">With</span>\n <span className=\"bw-detail-value\">{bookingResult.booking.hostName}</span>\n </div>\n )}\n <LocationRow type={displayType} meetingFormat={meeting?.format} />\n </div>\n\n <p className=\"bw-email-notice\">{isPending ? 'We’ll send your confirmation to ' : 'Your meeting details will arrive at '}<strong>{guestInfo.email}</strong>.</p>\n\n {!isPending && <>\n <p className=\"bw-cal-links-label\">Add to your calendar</p>\n <div className=\"bw-cal-links\">\n <a href={bookingResult.calendarLinks.google} target=\"_blank\" rel=\"noopener noreferrer\" className=\"bw-cal-link\">\n <CalendarPlusIcon /> Google\n </a>\n <a href={bookingResult.calendarLinks.outlook} target=\"_blank\" rel=\"noopener noreferrer\" className=\"bw-cal-link\">\n <CalendarPlusIcon /> Outlook\n </a>\n <a href={bookingResult.calendarLinks.ics} download className=\"bw-cal-link\">\n <CalendarPlusIcon /> iCal\n </a>\n </div>\n\n </>}\n\n {(bookingResult.rescheduleUrl || bookingResult.cancelUrl) && (\n <p className=\"bw-manage-links\">\n Need to change it?{' '}\n {bookingResult.rescheduleUrl && (\n <a href={bookingResult.rescheduleUrl} target=\"_blank\" rel=\"noopener noreferrer\">Reschedule</a>\n )}\n {bookingResult.rescheduleUrl && bookingResult.cancelUrl && ' · '}\n {bookingResult.cancelUrl && (\n <a href={bookingResult.cancelUrl} target=\"_blank\" rel=\"noopener noreferrer\">Cancel</a>\n )}\n </p>\n )}\n\n {(bookingResult.confirmationCode || bookingResult.booking.confirmationCode) && (\n <p className=\"bw-conf-code\">Confirmation code: <strong>{bookingResult.confirmationCode || bookingResult.booking.confirmationCode}</strong></p>\n )}\n </div>\n )}\n\n {/* Loading overlay for initial type load */}\n {loading && step === 'datetime' && !selectedType && (\n <div className=\"bw-loading\"><SpinnerIcon /> Loading...</div>\n )}\n\n <style>{WIDGET_CSS}</style>\n </div>\n )\n}\n\n// ─── Location display helper + sub-components ──────────────────────────────────\n\ntype LocationDisplay = { kind: string; label: string; detail?: string; mapUrl?: string }\n\nfunction getLocationDisplay(type: BookingType | null): LocationDisplay | null {\n if (!type) return null\n const details = type.location_details?.trim() || undefined\n switch (type.location_type) {\n case 'in_person':\n return {\n kind: 'in_person',\n label: 'In person',\n detail: details,\n mapUrl: details\n ? `https://www.google.com/maps/search/?api=1&query=${encodeURIComponent(details)}`\n : undefined,\n }\n case 'phone':\n return { kind: 'phone', label: 'Phone call', detail: details ? `We'll call you at ${details}` : \"We'll call you\" }\n case 'custom':\n return { kind: 'custom', label: details || 'See details' }\n case 'virtual':\n default:\n return { kind: 'virtual', label: 'Video call', detail: type.video_link }\n }\n}\n\nfunction LocationBadge({ type }: { type: BookingType | null }) {\n const loc = getLocationDisplay(type)\n if (!loc) return null\n return <span className=\"bw-badge\"><MapPinIcon /> {loc.label}</span>\n}\n\nfunction LocationRow({ type, meetingFormat }: { type: BookingType | null; meetingFormat?: MeetingFormat }) {\n const loc = getLocationDisplay(type)\n if (!loc) return null\n return (\n <div className=\"bw-detail-row\">\n <span className=\"bw-detail-label\">Where</span>\n <span className=\"bw-detail-value\">\n {loc.label}\n {loc.detail ? <><br />{loc.kind === 'virtual' ? <a href={loc.detail} target=\"_blank\" rel=\"noopener noreferrer\">Join Google Meet</a> : loc.detail}</> : null}\n {type?.location_instructions && <><br /><span style={{ whiteSpace: 'pre-wrap' }}>{type.location_instructions}</span></>}\n {loc.mapUrl && meetingFormat !== 'client_location' ? (\n <><br /><a href={loc.mapUrl} target=\"_blank\" rel=\"noopener noreferrer\" className=\"bw-where-link\">Get directions →</a></>\n ) : null}\n {loc.kind === 'virtual' ? (\n <><br /><span className=\"bw-where-muted\">Video link is in your confirmation email.</span></>\n ) : null}\n </span>\n </div>\n )\n}\n\nfunction MapPinIcon() {\n return (\n <svg width=\"14\" height=\"14\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\" strokeLinecap=\"round\" strokeLinejoin=\"round\" aria-hidden=\"true\">\n <path d=\"M21 10c0 7-9 13-9 13s-9-6-9-13a9 9 0 0 1 18 0z\" />\n <circle cx=\"12\" cy=\"10\" r=\"3\" />\n </svg>\n )\n}\n\n// ─── TimeButton Sub-component ──────────────────────────────────────────────────\n\nfunction TimeButton({\n slot, selected, confirmed, onClick, onConfirm, timezone, loading,\n}: {\n slot: TimeSlot; selected: boolean; confirmed: boolean; onClick: () => void; onConfirm: () => void; timezone: string; loading: boolean\n}) {\n if (selected && !confirmed) {\n return (\n <div className=\"bw-time-btn-wrap selected\">\n <span className=\"bw-time-text\">{formatTime(slot.start, timezone)}</span>\n <button className=\"bw-time-confirm\" onClick={onConfirm} disabled={loading}>\n {loading ? <SpinnerIcon /> : 'Confirm'}\n </button>\n </div>\n )\n }\n return (\n <button className={`bw-time-btn${selected ? ' selected' : ''}`} onClick={onClick} disabled={loading}>\n {formatTime(slot.start, timezone)}\n </button>\n )\n}\n\n// ─── Styles ────────────────────────────────────────────────────────────────────\n\nconst WIDGET_CSS = `\n/* ── Base ── */\n.bw-root {\n font-family: var(--sk-font);\n color: var(--sk-text-primary);\n line-height: 1.5;\n -webkit-font-smoothing: antialiased;\n box-sizing: border-box;\n isolation: isolate;\n}\n.bw-root *, .bw-root *::before, .bw-root *::after { box-sizing: border-box; }\n\n/* ── Animation ── */\n@keyframes bw-fade-in { from { opacity: 0; transform: translateY(6px); } to { opacity: 1; transform: none; } }\n@keyframes bw-spin { to { transform: rotate(360deg); } }\n@keyframes bw-shimmer { to { background-position: -200% 0; } }\n.bw-fade-in { animation: bw-fade-in 0.25s ease-out; }\n.bw-spinner { animation: bw-spin 0.8s linear infinite; }\n\n/* ── Accessibility ── */\n.bw-root :is(button, a):focus-visible { outline: 2px solid var(--sk-primary); outline-offset: 2px; }\n@media (prefers-reduced-motion: reduce) {\n .bw-fade-in, .bw-skel-slot, .bw-skel-line { animation: none; }\n}\n\n/* ── Loading skeleton (time slots) ── */\n.bw-skel-line {\n height: 14px; width: 70%; margin-bottom: 14px; border-radius: 4px;\n background: linear-gradient(90deg, var(--sk-surface) 25%, var(--sk-bg-elevated) 50%, var(--sk-surface) 75%);\n background-size: 200% 100%; animation: bw-shimmer 1.1s linear infinite;\n}\n.bw-skel-slot {\n height: 44px; margin-bottom: 6px; border-radius: var(--sk-radius);\n background: linear-gradient(90deg, var(--sk-surface) 25%, var(--sk-bg-elevated) 50%, var(--sk-surface) 75%);\n background-size: 200% 100%; animation: bw-shimmer 1.1s linear infinite;\n}\n\n/* ── Error ── */\n.bw-error {\n display: flex; align-items: center; justify-content: space-between; gap: 12px;\n background: color-mix(in srgb, var(--sk-error) 10%, var(--sk-bg));\n border: 1px solid color-mix(in srgb, var(--sk-error) 35%, var(--sk-bg));\n color: var(--sk-error);\n padding: 10px 14px; border-radius: var(--sk-radius); margin-bottom: 16px; font-size: 0.875rem;\n}\n.bw-error button { background: none; border: none; color: inherit; cursor: pointer; font-size: 1.25rem; line-height: 1; padding: 0; }\n.sk-booking-recovery { padding: 16px; margin-bottom: 16px; border: 1px solid var(--sk-border); border-radius: var(--sk-radius); background: var(--sk-surface); color: var(--sk-text-primary); }\n.sk-booking-recovery p { margin: 0 0 12px; font-size: 0.875rem; }\n.sk-booking-recovery .bw-submit { width: auto; }\n.bw-back:disabled { cursor: wait; opacity: 0.55; }\n\n/* ── Headings ── */\n.bw-heading { font-size: 1.125rem; font-weight: 600; margin: 0; letter-spacing: -0.01em; }\n.bw-meta-row { display: flex; flex-wrap: wrap; gap: 8px; margin-top: 6px; }\n.bw-badge {\n display: inline-flex; align-items: center; gap: 4px;\n font-size: 0.8125rem; color: var(--sk-text-secondary); font-weight: 400;\n}\n.bw-badge-accent {\n display: inline-flex; align-items: center; gap: 4px;\n font-size: 0.8125rem; color: var(--sk-primary); font-weight: 500;\n}\n\n/* ── Info Header ── */\n.bw-info-header { display: flex; align-items: flex-start; gap: 8px; margin-bottom: 20px; }\n.bw-back {\n display: inline-flex; align-items: center; justify-content: center;\n width: 32px; height: 32px; border-radius: 50%; border: 1px solid var(--sk-border);\n background: var(--sk-bg); cursor: pointer; color: var(--sk-text-secondary); flex-shrink: 0; margin-top: 1px;\n transition: all 0.15s;\n}\n.bw-back.sk-meeting-change { width: auto; height: auto; min-height: 36px; padding: 8px 12px; border-radius: var(--sk-radius); margin-bottom: 12px; font-size: 0.8125rem; }\n.bw-back:hover { background: var(--sk-surface); border-color: var(--sk-border); }\n\n/* ── Loading ── */\n.bw-loading {\n display: flex; align-items: center; justify-content: center; gap: 8px;\n padding: 32px; color: var(--sk-text-secondary); font-size: 0.875rem;\n}\n\n/* ── Type Selection ── */\n.bw-type-list { display: flex; flex-direction: column; gap: 10px; }\n.bw-type-card {\n display: flex; flex-direction: column; text-align: left; gap: 4px;\n padding: 16px; border: 1.5px solid var(--sk-border); border-radius: var(--sk-radius);\n background: var(--sk-bg); cursor: pointer; transition: all 0.15s;\n}\n.bw-type-card:hover { border-color: var(--sk-primary); box-shadow: 0 0 0 3px var(--sk-primary-light); }\n.bw-type-name { font-weight: 600; font-size: 0.9375rem; }\n.bw-type-desc { color: var(--sk-text-secondary); font-size: 0.8125rem; }\n.bw-type-meta { display: flex; align-items: center; gap: 4px; font-size: 0.8125rem; color: var(--sk-text-tertiary); margin-top: 4px; }\n\n/* ── Date-Time Layout ── */\n.bw-datetime-layout {\n display: flex; gap: 0; border-top: 1px solid var(--sk-border); padding-top: 16px;\n}\n@media (max-width: 559px) {\n .bw-datetime-layout { flex-direction: column; }\n}\n@media (min-width: 560px) {\n .bw-datetime-layout { min-height: 400px; }\n .bw-calendar { flex: 1 1 auto; padding-right: 16px; border-right: 1px solid var(--sk-border); }\n .bw-times { width: 180px; flex-shrink: 0; padding-left: 16px; }\n}\n\n/* ── Calendar ── */\n.bw-cal-header { display: flex; align-items: center; justify-content: space-between; margin-bottom: 12px; }\n.bw-cal-title { font-weight: 600; font-size: 0.9375rem; color: var(--sk-text-primary); }\n.bw-cal-nav {\n display: inline-flex; align-items: center; justify-content: center;\n width: 32px; height: 32px; border-radius: 50%; border: none;\n background: transparent; cursor: pointer; color: var(--sk-text-primary); transition: background 0.15s;\n}\n.bw-cal-nav:hover:not(:disabled) { background: var(--sk-surface); }\n.bw-cal-nav:disabled { opacity: 0.25; cursor: default; }\n\n.bw-cal-weekdays { display: grid; grid-template-columns: repeat(7, 1fr); gap: 0; text-align: center; margin-bottom: 4px; }\n.bw-cal-wd { font-size: 0.6875rem; font-weight: 600; color: var(--sk-text-tertiary); text-transform: uppercase; letter-spacing: 0.04em; padding: 4px 0; }\n\n.bw-cal-grid { display: grid; grid-template-columns: repeat(7, 1fr); gap: 2px; }\n.bw-cal-empty { aspect-ratio: 1; }\n.bw-cal-day {\n aspect-ratio: 1; display: flex; align-items: center; justify-content: center;\n border: none; background: none; border-radius: 50%;\n font-size: 0.8125rem; font-weight: 500; cursor: pointer;\n color: var(--sk-text-primary); transition: all 0.15s; position: relative;\n}\n.bw-cal-day:hover:not(.disabled):not(.selected) { background: var(--sk-surface); }\n.bw-cal-day.today:not(.selected)::after {\n content: ''; position: absolute; bottom: 3px; left: 50%; transform: translateX(-50%);\n width: 4px; height: 4px; border-radius: 50%; background: var(--sk-primary);\n}\n.bw-cal-day.selected {\n background: var(--sk-primary); color: #fff; font-weight: 600;\n}\n/* Past / out-of-range: visible on light and dark parent pages */\n.bw-root button.bw-cal-day.disabled {\n color: var(--sk-text-tertiary);\n cursor: default;\n opacity: 1;\n}\n\n/* ── Time Slots ── */\n.bw-times { transition: opacity 0.2s; }\n.bw-times:not(.visible) { opacity: 0.5; }\n.bw-times.visible { opacity: 1; }\n.bw-times-placeholder {\n display: flex; flex-direction: column; align-items: center; justify-content: center; gap: 8px;\n height: 100%; min-height: 160px; color: var(--sk-text-tertiary); font-size: 0.8125rem; text-align: center; padding: 16px;\n}\n.bw-times-empty {\n display: flex; align-items: center; justify-content: center;\n height: 100%; min-height: 160px; color: var(--sk-text-tertiary); font-size: 0.8125rem; text-align: center; padding: 16px;\n}\n.bw-times-scroll { overflow-y: auto; max-height: 400px; overflow-x: hidden; }\n.bw-times-date { font-weight: 600; font-size: 0.8125rem; color: var(--sk-text-primary); margin: 0 0 12px 0; }\n.bw-time-group { margin-bottom: 16px; }\n.bw-times-scroll-hint {\n font-size: 0.6875rem; color: var(--sk-text-tertiary); text-align: center; margin: 8px 0 0 0; padding-bottom: 8px;\n}\n.bw-time-label { display: block; font-size: 0.6875rem; font-weight: 600; color: var(--sk-text-tertiary); text-transform: uppercase; letter-spacing: 0.04em; margin-bottom: 6px; }\n\n.bw-time-btn {\n display: block; width: 100%; min-height: 44px;\n padding: 10px 12px; margin-bottom: 6px;\n border: 1.5px solid var(--sk-border); border-radius: var(--sk-radius);\n background: var(--sk-bg); cursor: pointer;\n font-size: 0.875rem; font-weight: 500; color: var(--sk-primary); text-align: center;\n transition: all 0.15s;\n}\n.bw-time-btn:hover:not(:disabled) {\n border-color: var(--sk-primary); background: var(--sk-primary-light);\n}\n.bw-time-btn.selected {\n border-color: var(--sk-primary); background: var(--sk-primary); color: #fff;\n}\n.bw-time-btn:disabled { opacity: 0.5; cursor: not-allowed; }\n\n.bw-time-btn-wrap {\n display: flex; align-items: center; gap: 6px; margin-bottom: 6px;\n border: 1.5px solid var(--sk-primary); border-radius: var(--sk-radius); overflow: hidden;\n animation: bw-fade-in 0.15s ease-out;\n}\n.bw-time-btn-wrap .bw-time-text {\n flex: 1; padding: 10px 12px; font-size: 0.875rem; font-weight: 500; color: var(--sk-text-primary); text-align: center;\n background: var(--sk-primary-light);\n}\n.bw-time-confirm {\n display: inline-flex; align-items: center; justify-content: center; gap: 4px;\n min-height: 44px; padding: 10px 16px; border: none;\n background: var(--sk-primary); color: #fff;\n font-size: 0.8125rem; font-weight: 600; cursor: pointer;\n transition: background 0.15s;\n}\n.bw-time-confirm:hover:not(:disabled) { background: var(--sk-primary-hover); }\n.bw-time-confirm:disabled { opacity: 0.7; cursor: not-allowed; }\n\n/* ── Form ── */\n.bw-hold-notice {\n display: flex; align-items: center; gap: 8px;\n background: var(--sk-primary-light); color: var(--sk-primary);\n padding: 10px 14px; border-radius: var(--sk-radius);\n font-size: 0.8125rem; font-weight: 500; margin-bottom: 20px;\n}\n.bw-form { display: flex; flex-direction: column; gap: 16px; }\n.bw-field label {\n display: block; font-size: 0.8125rem; font-weight: 500; color: var(--sk-text-primary); margin-bottom: 4px;\n}\n.bw-req { color: var(--sk-error); }\n.bw-field input, .bw-field textarea {\n display: block; width: 100%;\n padding: 10px 12px; border: 1.5px solid var(--sk-input-border); border-radius: var(--sk-radius);\n font-size: 0.9375rem; font-family: inherit; color: var(--sk-text-primary); background: var(--sk-bg);\n transition: border-color 0.15s, box-shadow 0.15s;\n}\n.bw-field input::placeholder, .bw-field textarea::placeholder { color: var(--sk-text-tertiary); }\n.bw-field input:focus, .bw-field textarea:focus {\n outline: none; border-color: var(--sk-primary);\n box-shadow: 0 0 0 3px var(--sk-input-focus-ring);\n}\n.bw-submit {\n display: inline-flex; align-items: center; justify-content: center; gap: 8px;\n width: 100%; min-height: 48px; padding: 14px; margin-top: 4px;\n background: var(--sk-primary); color: #fff; border: none;\n border-radius: var(--sk-radius); font-size: 0.9375rem; font-weight: 600;\n cursor: pointer; transition: background 0.15s;\n}\n.bw-submit:hover:not(:disabled) { background: var(--sk-primary-hover); }\n.bw-submit:disabled { opacity: 0.55; cursor: not-allowed; }\n\n/* ── Success ── */\n.bw-success { text-align: center; }\n.bw-success-icon { margin: 0 auto 16px; width: 56px; height: 56px; animation: bw-fade-in 0.4s ease-out; }\n.bw-conf-code {\n display: inline-block; font-family: 'SF Mono', 'Fira Code', monospace;\n background: var(--sk-surface); padding: 6px 14px; border-radius: 6px;\n font-size: 0.8125rem; color: var(--sk-text-secondary); margin: 4px 0 20px; letter-spacing: 0.04em;\n}\n\n.bw-details-card {\n text-align: left; background: var(--sk-bg-elevated); border: 1px solid var(--sk-border);\n border-radius: var(--sk-radius); padding: 16px; margin-bottom: 20px;\n}\n.bw-detail-row { display: flex; gap: 12px; padding: 8px 0; border-bottom: 1px solid var(--sk-border); }\n.bw-detail-row:last-child { border-bottom: none; }\n.bw-detail-label { width: 70px; flex-shrink: 0; font-size: 0.8125rem; color: var(--sk-text-tertiary); font-weight: 500; }\n.bw-detail-value { font-size: 0.875rem; font-weight: 500; color: var(--sk-text-primary); }\n\n.bw-cal-links-label { font-size: 0.8125rem; color: var(--sk-text-secondary); margin: 0 0 8px 0; }\n.bw-cal-links { display: flex; gap: 8px; justify-content: center; margin-bottom: 20px; flex-wrap: wrap; }\n.bw-cal-link {\n display: inline-flex; align-items: center; gap: 6px;\n padding: 8px 14px; border: 1.5px solid var(--sk-border); border-radius: var(--sk-radius);\n text-decoration: none; color: var(--sk-text-primary); font-size: 0.8125rem; font-weight: 500;\n transition: all 0.15s;\n}\n.bw-cal-link:hover { border-color: var(--sk-primary); color: var(--sk-primary); }\n\n.bw-email-notice { font-size: 0.8125rem; color: var(--sk-text-tertiary); margin: 0 0 16px 0; }\n.bw-email-notice strong { color: var(--sk-text-primary); font-weight: 500; }\n.bw-where-link { color: var(--sk-primary, #14B8A6); text-decoration: none; font-weight: 500; }\n.bw-where-muted { color: var(--sk-text-tertiary); font-size: 0.8125rem; }\n.bw-manage-links { font-size: 0.8125rem; color: var(--sk-text-tertiary); margin: 12px 0 0 0; }\n.bw-manage-links a { color: var(--sk-primary, #14B8A6); text-decoration: none; font-weight: 500; }\n`\n\nexport default BookingWidget\n"]}
@@ -1,6 +1,6 @@
1
- import { HoneypotField, NativeFallbackFields, nativeFormProps } from './chunk-HDQTZAGE.mjs';
1
+ import { HoneypotField, NativeFallbackFields, nativeFormProps } from './chunk-X2XFLYZ3.mjs';
2
2
  import { FormField } from './chunk-H7274TKR.mjs';
3
- import { normalizeFormConfig } from './chunk-XW5KNCWJ.mjs';
3
+ import { normalizeFormConfig } from './chunk-TX2QQ7IX.mjs';
4
4
  import { DEFAULT_HONEYPOT_FIELD } from './chunk-TMVKRQGJ.mjs';
5
5
  import { jsxs, jsx } from 'react/jsx-runtime';
6
6
 
@@ -40,5 +40,5 @@ function StaticForm({ config: raw, className, nativeReturnTo }) {
40
40
  }
41
41
 
42
42
  export { StaticForm };
43
- //# sourceMappingURL=chunk-TS3N3LGZ.mjs.map
44
- //# sourceMappingURL=chunk-TS3N3LGZ.mjs.map
43
+ //# sourceMappingURL=chunk-VYHRAICF.mjs.map
44
+ //# sourceMappingURL=chunk-VYHRAICF.mjs.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/forms/StaticForm.tsx"],"names":[],"mappings":";;;;;;AA6DA,SAAS,oBAAoB,MAAA,EAA2B;AACtD,EAAA,MAAM,GAAA,GAAM,MAAA,CAAO,MAAA,IAAU,EAAC;AAC9B,EAAA,IAAI,CAAC,MAAA,CAAO,aAAA,EAAe,OAAO,GAAA;AAGlC,EAAA,MAAM,WAAA,GAAc,MAAA,CAAO,KAAA,GAAQ,CAAC,CAAA,EAAG,EAAA;AACvC,EAAA,OAAO,GAAA,CAAI,OAAO,CAAC,CAAA,KAAM,CAAC,CAAA,CAAE,OAAA,IAAW,CAAA,CAAE,OAAA,KAAY,WAAW,CAAA;AAClE;AAEO,SAAS,WAAW,EAAE,MAAA,EAAQ,GAAA,EAAK,SAAA,EAAW,gBAAe,EAAoB;AACtF,EAAA,IAAI,CAAC,KAAK,OAAO,IAAA;AACjB,EAAA,MAAM,MAAA,GAAS,oBAAoB,GAAU,CAAA;AAC7C,EAAA,MAAM,MAAA,GAAS,oBAAoB,MAAM,CAAA;AACzC,EAAA,MAAM,iBAAA,GAAoB,OAAO,cAAA,IAAkB,sBAAA;AAEnD,EAAA,uBACE,IAAA;AAAA,IAAC,MAAA;AAAA,IAAA;AAAA,MAGC,eAAA,EAAc,MAAA;AAAA,MACd,eAAA,EAAc,OAAA;AAAA,MACd,SAAA,EAAW,CAAA,QAAA,EAAW,SAAA,IAAa,EAAE,CAAA,CAAA;AAAA,MACpC,GAAG,gBAAgB,MAAM,CAAA;AAAA,MAE1B,QAAA,EAAA;AAAA,wBAAA,GAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,eAAA,EACb,QAAA,kBAAA,GAAA,CAAC,KAAA,EAAA,EAAI,WAAU,iBAAA,EACZ,QAAA,EAAA,MAAA,CAAO,GAAA,CAAI,CAAC,KAAA,qBACX,GAAA;AAAA,UAAC,KAAA;AAAA,UAAA;AAAA,YAEC,SAAA,EAAW,CAAA,+CAAA,EAAkD,KAAA,CAAM,KAAA,IAAS,MAAM,CAAA,CAAA;AAAA,YAGlF,8BAAC,SAAA,EAAA,EAAU,KAAA,EAAc,KAAA,EAAO,KAAA,CAAM,iBAAiB,EAAA,EAAI;AAAA,WAAA;AAAA,UAJtD,KAAA,CAAM,MAAM,KAAA,CAAM;AAAA,SAM1B,GACH,CAAA,EACF,CAAA;AAAA,4BAEC,KAAA,EAAA,EAAI,SAAA,EAAU,oBAAmB,KAAA,EAAO,EAAE,gBAAgB,UAAA,EAAW,EACpE,QAAA,kBAAA,GAAA,CAAC,QAAA,EAAA,EAAO,MAAK,QAAA,EAAS,SAAA,EAAU,qCAC7B,QAAA,EAAA,MAAA,CAAO,kBAAA,IAAsB,UAChC,CAAA,EACF,CAAA;AAAA,QAIC,MAAA,CAAO,gBAAA,oBAAoB,GAAA,CAAC,aAAA,EAAA,EAAc,MAAM,iBAAA,EAAmB,CAAA;AAAA,wBAGpE,GAAA,CAAC,oBAAA,EAAA,EAAqB,MAAA,EAAgB,QAAA,EAAU,cAAA,EAAgB;AAAA;AAAA;AAAA,GAClE;AAEJ","file":"chunk-TS3N3LGZ.mjs","sourcesContent":["/**\n * StaticForm — a complete, submittable managed form with ZERO client JavaScript.\n *\n * No `'use client'`. This renders in a Server Component, and what it emits is\n * a real `<form>`: every field, the honeypot, the signed native token, and a\n * submit button. With JavaScript disabled, off, or still downloading, the\n * browser performs an ordinary form-encoded POST to\n * `/api/public/forms/submit-native`, sonor-api runs the honeypot +\n * render-timestamp + quarantine stack, and the lead lands. 4.0.1 built that\n * endpoint; this is what finally puts it under every form by default.\n *\n * ── Why this exists ─────────────────────────────────────────────────────\n *\n * ManagedForm was a client component for historical reasons that no longer\n * hold: it used to fetch its own config (getFormConfig removed that) and it\n * could only submit via JSON (the native endpoint removed that). Nobody moved\n * the boundary afterward, so every site that rendered a form paid for the\n * whole forms runtime — validation, spotlight, celebration, momentum — as an\n * INITIAL script, on the LCP-critical path.\n *\n * Measured on upforge.io's homepage: 48 KB of form code in the initial chunk\n * set cost 6 Lighthouse points (88 -> 82, LCP 3.8s -> 4.7s). Deferring the\n * client component recovered the score but deleted the form from the HTML,\n * taking the no-JS floor and crawlable fields with it. Neither half was\n * acceptable; a server-rendered form is what makes both true at once.\n *\n * Pair it with <FormEnhancer> to upgrade this markup at idle. Alone, it is\n * still a working form — that is the point. Never make this file `'use\n * client'`, and never import a hook into it.\n */\n\nimport React from 'react'\nimport { DEFAULT_HONEYPOT_FIELD } from './contract'\nimport { FormField } from './FormField'\nimport { HoneypotField } from './HoneypotField'\nimport { nativeFormProps, NativeFallbackFields } from './native-fallback'\nimport { normalizeFormConfig } from './normalize-config'\nimport type { ManagedFormConfig } from './types'\n\nexport interface StaticFormProps {\n /**\n * RAW /api/public/forms/config payload from `getFormConfig`, or an\n * already-normalized config. Normalized here through the SAME function the\n * client fetch uses, so the shell and the enhancement cannot disagree about\n * field order, step count, or success copy.\n */\n config: Record<string, unknown> | ManagedFormConfig | null | undefined\n className?: string\n /**\n * Absolute URL the no-JS 303 should return to (usually the page hosting the\n * form). Without it the API falls back to the Referer origin — right site,\n * wrong page.\n */\n nativeReturnTo?: string\n}\n\n/**\n * Fields the static shell can render meaningfully. Conditional logic is a\n * runtime concern (it depends on values the visitor has not entered yet), so\n * a conditional field renders here and the enhancement takes over hiding it.\n */\nfunction visibleStaticFields(config: ManagedFormConfig) {\n const all = config.fields || []\n if (!config.is_multi_step) return all\n // Multi-step is JS-only navigation and is excluded from native POST, so the\n // shell shows step one as a preview of what the form asks for.\n const firstStepId = config.steps?.[0]?.id\n return all.filter((f) => !f.step_id || f.step_id === firstStepId)\n}\n\nexport function StaticForm({ config: raw, className, nativeReturnTo }: StaticFormProps) {\n if (!raw) return null\n const config = normalizeFormConfig(raw as any)\n const fields = visibleStaticFields(config)\n const honeypotFieldName = config.honeypot_field || DEFAULT_HONEYPOT_FIELD\n\n return (\n <form\n // Matches FormClient's classic branch attribute-for-attribute so the\n // enhancement swap is invisible. Change one, change the other.\n data-sk-state=\"idle\"\n data-sk-mount=\"shell\"\n className={`sk-form ${className || ''}`}\n {...nativeFormProps(config)}\n >\n <div className=\"sk-form__step\">\n <div className=\"sk-form__fields\">\n {fields.map((field) => (\n <div\n key={field.id || field.slug}\n className={`sk-form__field-wrapper sk-form__field-wrapper--${field.width || 'full'}`}\n >\n {/* No onChange — FormField renders native uncontrolled controls. */}\n <FormField field={field} value={field.default_value ?? ''} />\n </div>\n ))}\n </div>\n </div>\n\n <div className=\"sk-form__actions\" style={{ justifyContent: 'flex-end' }}>\n <button type=\"submit\" className=\"sk-form__btn sk-form__btn--submit\">\n {config.submit_button_text || 'Submit'}\n </button>\n </div>\n\n {/* Same trap the hydrated form uses; no state needed because the value\n is read and stripped server-side. */}\n {config.honeypot_enabled && <HoneypotField name={honeypotFieldName} />}\n\n {/* _sk_token auth + _sk_return destination for the native POST. */}\n <NativeFallbackFields config={config} returnTo={nativeReturnTo} />\n </form>\n )\n}\n"]}
1
+ {"version":3,"sources":["../src/forms/StaticForm.tsx"],"names":[],"mappings":";;;;;;AA6DA,SAAS,oBAAoB,MAAA,EAA2B;AACtD,EAAA,MAAM,GAAA,GAAM,MAAA,CAAO,MAAA,IAAU,EAAC;AAC9B,EAAA,IAAI,CAAC,MAAA,CAAO,aAAA,EAAe,OAAO,GAAA;AAGlC,EAAA,MAAM,WAAA,GAAc,MAAA,CAAO,KAAA,GAAQ,CAAC,CAAA,EAAG,EAAA;AACvC,EAAA,OAAO,GAAA,CAAI,OAAO,CAAC,CAAA,KAAM,CAAC,CAAA,CAAE,OAAA,IAAW,CAAA,CAAE,OAAA,KAAY,WAAW,CAAA;AAClE;AAEO,SAAS,WAAW,EAAE,MAAA,EAAQ,GAAA,EAAK,SAAA,EAAW,gBAAe,EAAoB;AACtF,EAAA,IAAI,CAAC,KAAK,OAAO,IAAA;AACjB,EAAA,MAAM,MAAA,GAAS,oBAAoB,GAAU,CAAA;AAC7C,EAAA,MAAM,MAAA,GAAS,oBAAoB,MAAM,CAAA;AACzC,EAAA,MAAM,iBAAA,GAAoB,OAAO,cAAA,IAAkB,sBAAA;AAEnD,EAAA,uBACE,IAAA;AAAA,IAAC,MAAA;AAAA,IAAA;AAAA,MAGC,eAAA,EAAc,MAAA;AAAA,MACd,eAAA,EAAc,OAAA;AAAA,MACd,SAAA,EAAW,CAAA,QAAA,EAAW,SAAA,IAAa,EAAE,CAAA,CAAA;AAAA,MACpC,GAAG,gBAAgB,MAAM,CAAA;AAAA,MAE1B,QAAA,EAAA;AAAA,wBAAA,GAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,eAAA,EACb,QAAA,kBAAA,GAAA,CAAC,KAAA,EAAA,EAAI,WAAU,iBAAA,EACZ,QAAA,EAAA,MAAA,CAAO,GAAA,CAAI,CAAC,KAAA,qBACX,GAAA;AAAA,UAAC,KAAA;AAAA,UAAA;AAAA,YAEC,SAAA,EAAW,CAAA,+CAAA,EAAkD,KAAA,CAAM,KAAA,IAAS,MAAM,CAAA,CAAA;AAAA,YAGlF,8BAAC,SAAA,EAAA,EAAU,KAAA,EAAc,KAAA,EAAO,KAAA,CAAM,iBAAiB,EAAA,EAAI;AAAA,WAAA;AAAA,UAJtD,KAAA,CAAM,MAAM,KAAA,CAAM;AAAA,SAM1B,GACH,CAAA,EACF,CAAA;AAAA,4BAEC,KAAA,EAAA,EAAI,SAAA,EAAU,oBAAmB,KAAA,EAAO,EAAE,gBAAgB,UAAA,EAAW,EACpE,QAAA,kBAAA,GAAA,CAAC,QAAA,EAAA,EAAO,MAAK,QAAA,EAAS,SAAA,EAAU,qCAC7B,QAAA,EAAA,MAAA,CAAO,kBAAA,IAAsB,UAChC,CAAA,EACF,CAAA;AAAA,QAIC,MAAA,CAAO,gBAAA,oBAAoB,GAAA,CAAC,aAAA,EAAA,EAAc,MAAM,iBAAA,EAAmB,CAAA;AAAA,wBAGpE,GAAA,CAAC,oBAAA,EAAA,EAAqB,MAAA,EAAgB,QAAA,EAAU,cAAA,EAAgB;AAAA;AAAA;AAAA,GAClE;AAEJ","file":"chunk-VYHRAICF.mjs","sourcesContent":["/**\n * StaticForm — a complete, submittable managed form with ZERO client JavaScript.\n *\n * No `'use client'`. This renders in a Server Component, and what it emits is\n * a real `<form>`: every field, the honeypot, the signed native token, and a\n * submit button. With JavaScript disabled, off, or still downloading, the\n * browser performs an ordinary form-encoded POST to\n * `/api/public/forms/submit-native`, sonor-api runs the honeypot +\n * render-timestamp + quarantine stack, and the lead lands. 4.0.1 built that\n * endpoint; this is what finally puts it under every form by default.\n *\n * ── Why this exists ─────────────────────────────────────────────────────\n *\n * ManagedForm was a client component for historical reasons that no longer\n * hold: it used to fetch its own config (getFormConfig removed that) and it\n * could only submit via JSON (the native endpoint removed that). Nobody moved\n * the boundary afterward, so every site that rendered a form paid for the\n * whole forms runtime — validation, spotlight, celebration, momentum — as an\n * INITIAL script, on the LCP-critical path.\n *\n * Measured on upforge.io's homepage: 48 KB of form code in the initial chunk\n * set cost 6 Lighthouse points (88 -> 82, LCP 3.8s -> 4.7s). Deferring the\n * client component recovered the score but deleted the form from the HTML,\n * taking the no-JS floor and crawlable fields with it. Neither half was\n * acceptable; a server-rendered form is what makes both true at once.\n *\n * Pair it with <FormEnhancer> to upgrade this markup at idle. Alone, it is\n * still a working form — that is the point. Never make this file `'use\n * client'`, and never import a hook into it.\n */\n\nimport React from 'react'\nimport { DEFAULT_HONEYPOT_FIELD } from './contract'\nimport { FormField } from './FormField'\nimport { HoneypotField } from './HoneypotField'\nimport { nativeFormProps, NativeFallbackFields } from './native-fallback'\nimport { normalizeFormConfig } from './normalize-config'\nimport type { ManagedFormConfig } from './types'\n\nexport interface StaticFormProps {\n /**\n * RAW /api/public/forms/config payload from `getFormConfig`, or an\n * already-normalized config. Normalized here through the SAME function the\n * client fetch uses, so the shell and the enhancement cannot disagree about\n * field order, step count, or success copy.\n */\n config: Record<string, unknown> | ManagedFormConfig | null | undefined\n className?: string\n /**\n * Absolute URL the no-JS 303 should return to (usually the page hosting the\n * form). Without it the API falls back to the Referer origin — right site,\n * wrong page.\n */\n nativeReturnTo?: string\n}\n\n/**\n * Fields the static shell can render meaningfully. Conditional logic is a\n * runtime concern (it depends on values the visitor has not entered yet), so\n * a conditional field renders here and the enhancement takes over hiding it.\n */\nfunction visibleStaticFields(config: ManagedFormConfig) {\n const all = config.fields || []\n if (!config.is_multi_step) return all\n // Multi-step is JS-only navigation and is excluded from native POST, so the\n // shell shows step one as a preview of what the form asks for.\n const firstStepId = config.steps?.[0]?.id\n return all.filter((f) => !f.step_id || f.step_id === firstStepId)\n}\n\nexport function StaticForm({ config: raw, className, nativeReturnTo }: StaticFormProps) {\n if (!raw) return null\n const config = normalizeFormConfig(raw as any)\n const fields = visibleStaticFields(config)\n const honeypotFieldName = config.honeypot_field || DEFAULT_HONEYPOT_FIELD\n\n return (\n <form\n // Matches FormClient's classic branch attribute-for-attribute so the\n // enhancement swap is invisible. Change one, change the other.\n data-sk-state=\"idle\"\n data-sk-mount=\"shell\"\n className={`sk-form ${className || ''}`}\n {...nativeFormProps(config)}\n >\n <div className=\"sk-form__step\">\n <div className=\"sk-form__fields\">\n {fields.map((field) => (\n <div\n key={field.id || field.slug}\n className={`sk-form__field-wrapper sk-form__field-wrapper--${field.width || 'full'}`}\n >\n {/* No onChange — FormField renders native uncontrolled controls. */}\n <FormField field={field} value={field.default_value ?? ''} />\n </div>\n ))}\n </div>\n </div>\n\n <div className=\"sk-form__actions\" style={{ justifyContent: 'flex-end' }}>\n <button type=\"submit\" className=\"sk-form__btn sk-form__btn--submit\">\n {config.submit_button_text || 'Submit'}\n </button>\n </div>\n\n {/* Same trap the hydrated form uses; no state needed because the value\n is read and stripped server-side. */}\n {config.honeypot_enabled && <HoneypotField name={honeypotFieldName} />}\n\n {/* _sk_token auth + _sk_return destination for the native POST. */}\n <NativeFallbackFields config={config} returnTo={nativeReturnTo} />\n </form>\n )\n}\n"]}
@@ -1,6 +1,6 @@
1
1
  'use strict';
2
2
 
3
- var chunk5BZDHZCN_js = require('./chunk-5BZDHZCN.js');
3
+ var chunkBNOQXDPJ_js = require('./chunk-BNOQXDPJ.js');
4
4
  var jsxRuntime = require('react/jsx-runtime');
5
5
 
6
6
  function HoneypotField({ name, value, onChange }) {
@@ -46,7 +46,7 @@ function nativeEligible(config) {
46
46
  }
47
47
  function nativeFormProps(config) {
48
48
  if (!nativeEligible(config)) return {};
49
- const { apiUrl } = chunk5BZDHZCN_js.getApiConfig();
49
+ const { apiUrl } = chunkBNOQXDPJ_js.getApiConfig();
50
50
  return { action: `${apiUrl}/api/public/forms/submit-native`, method: "post" };
51
51
  }
52
52
  function NativeFallbackFields({ config, returnTo }) {
@@ -60,5 +60,5 @@ function NativeFallbackFields({ config, returnTo }) {
60
60
  exports.HoneypotField = HoneypotField;
61
61
  exports.NativeFallbackFields = NativeFallbackFields;
62
62
  exports.nativeFormProps = nativeFormProps;
63
- //# sourceMappingURL=chunk-G3YUSRCL.js.map
64
- //# sourceMappingURL=chunk-G3YUSRCL.js.map
63
+ //# sourceMappingURL=chunk-W5NVW23S.js.map
64
+ //# sourceMappingURL=chunk-W5NVW23S.js.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/forms/HoneypotField.tsx","../src/forms/native-fallback.tsx"],"names":["jsx","getApiConfig","jsxs","Fragment"],"mappings":";;;;;AAqCO,SAAS,aAAA,CAAc,EAAE,IAAA,EAAM,KAAA,EAAO,UAAS,EAAuB;AAC3E,EAAA,MAAM,WAAA,GAAc,OAAO,QAAA,KAAa,UAAA;AACxC,EAAA,uBACEA,cAAA;AAAA,IAAC,OAAA;AAAA,IAAA;AAAA,MACC,IAAA,EAAK,MAAA;AAAA,MACL,IAAA;AAAA,MACA,QAAA,EAAU,EAAA;AAAA,MACV,YAAA,EAAa,cAAA;AAAA,MACb,aAAA,EAAY,MAAA;AAAA,MACZ,KAAA,EAAK,IAAA;AAAA,MACL,kBAAA,EAAiB,EAAA;AAAA,MAGjB,gBAAA,EAAe,EAAA;AAAA,MACf,eAAA,EAAc,MAAA;AAAA,MACd,gBAAA,EAAe,OAAA;AAAA,MACf,eAAA,EAAc,EAAA;AAAA,MACd,KAAA,EAAO;AAAA,QACL,QAAA,EAAU,UAAA;AAAA,QACV,IAAA,EAAM,KAAA;AAAA,QACN,KAAA,EAAO,CAAA;AAAA,QACP,MAAA,EAAQ,CAAA;AAAA,QACR,QAAA,EAAU,QAAA;AAAA,QACV,OAAA,EAAS,CAAA;AAAA,QACT,UAAA,EAAY,QAAA;AAAA,QACZ,aAAA,EAAe;AAAA,OACjB;AAAA,MACC,GAAI,WAAA,GACD;AAAA,QACE,OAAO,KAAA,IAAS,EAAA;AAAA,QAChB,QAAA,EAAU,CAAC,CAAA,KAA2C;AACpD,UAAA,QAAA,CAAU,CAAA,CAAE,OAAO,KAAK,CAAA;AACxB,UAAA,IAAI,CAAA,CAAE,OAAO,KAAA,EAAO;AAElB,YAAA,OAAA,CAAQ,KAAK,4BAA4B,CAAA;AAAA,UAC3C;AAAA,QACF;AAAA,OACF,GACA,EAAE,YAAA,EAAc,EAAA;AAAG;AAAA,GACzB;AAEJ;ACjDA,SAAS,eAAe,MAAA,EAAuD;AAC7E,EAAA,OAAO,CAAC,CAAC,MAAA,EAAQ,YAAA,IAAgB,CAAC,MAAA,CAAO,aAAA;AAC3C;AAGO,SAAS,gBACd,MAAA,EACsC;AACtC,EAAA,IAAI,CAAC,cAAA,CAAe,MAAM,CAAA,SAAU,EAAC;AACrC,EAAA,MAAM,EAAE,MAAA,EAAO,GAAIC,6BAAA,EAAa;AAChC,EAAA,OAAO,EAAE,MAAA,EAAQ,CAAA,EAAG,MAAM,CAAA,+BAAA,CAAA,EAAmC,QAAQ,MAAA,EAAO;AAC9E;AAaO,SAAS,oBAAA,CAAqB,EAAE,MAAA,EAAQ,QAAA,EAAS,EAA8B;AACpF,EAAA,IAAI,CAAC,cAAA,CAAe,MAAM,CAAA,EAAG,OAAO,IAAA;AACpC,EAAA,uBACEC,eAAA,CAAAC,mBAAA,EAAA,EACE,QAAA,EAAA;AAAA,oBAAAH,cAAAA,CAAC,OAAA,EAAA,EAAM,IAAA,EAAK,QAAA,EAAS,IAAA,EAAK,aAAY,KAAA,EAAO,MAAA,CAAQ,YAAA,EAAc,QAAA,EAAQ,IAAA,EAAC,CAAA;AAAA,IAC3E,QAAA,mBAAWA,cAAAA,CAAC,OAAA,EAAA,EAAM,IAAA,EAAK,QAAA,EAAS,IAAA,EAAK,YAAA,EAAa,KAAA,EAAO,QAAA,EAAU,QAAA,EAAQ,IAAA,EAAC,CAAA,GAAK;AAAA,GAAA,EACpF,CAAA;AAEJ","file":"chunk-G3YUSRCL.js","sourcesContent":["/**\n * Single source of truth for the honeypot input — rendered by BOTH form\n * experiences (classic and stage) inside their <form>. The customRender path\n * deliberately gets none (documented limitation: custom renders lose the\n * honeypot, which is why alternate experiences must be render branches).\n *\n * Invariants (do not weaken any of these):\n * - `inert` blocks focus/interaction at the browser level, surviving hostile\n * site CSS that could defeat the inline styles.\n * - data-sk-honeypot gives site CSS a stable opt-OUT hook.\n * - Controlled input: bots filling via JS still fire React onChange, so the\n * value reaches submitForm's data payload.\n * - Name comes from config (`honeypot_field || DEFAULT_HONEYPOT_FIELD` from\n * the shared contract) — resolved by the caller, never forked here.\n * - The trap must be invisible to AUTOFILL as well as to people. A browser or\n * password manager filling a hidden input flags a real visitor as a bot, and\n * because the value is stripped server-side the mistake is undiagnosable\n * after the fact. `autocomplete=\"off\"` does not achieve this — it is the one\n * value Chrome deliberately ignores for contact/address autofill — so the\n * trap declares `new-password` (never offered saved contact data) plus the\n * documented per-manager opt-outs.\n */\n\nimport React from 'react'\n\nexport interface HoneypotFieldProps {\n name: string\n value?: string\n /**\n * Omit for STATIC mode — an uncontrolled trap a Server Component can render.\n * The trap's whole job is server-side (the value is read off the submission\n * and stripped), so it needs no client state to work; the controlled form is\n * only so the hydrated JSON path can read it back out of React state.\n */\n onChange?: (value: string) => void\n}\n\nexport function HoneypotField({ name, value, onChange }: HoneypotFieldProps) {\n const interactive = typeof onChange === 'function'\n return (\n <input\n type=\"text\"\n name={name}\n tabIndex={-1}\n autoComplete=\"new-password\"\n aria-hidden=\"true\"\n inert\n data-sk-honeypot=\"\"\n // Password-manager opt-outs: 1Password, LastPass, Dashlane, Bitwarden.\n // Each ignores its own attribute; none respects autocomplete alone.\n data-1p-ignore=\"\"\n data-lpignore=\"true\"\n data-form-type=\"other\"\n data-bwignore=\"\"\n style={{\n position: 'absolute',\n left: -9999,\n width: 1,\n height: 1,\n overflow: 'hidden',\n opacity: 0,\n visibility: 'hidden',\n pointerEvents: 'none',\n }}\n {...(interactive\n ? {\n value: value ?? '',\n onChange: (e: React.ChangeEvent<HTMLInputElement>) => {\n onChange!(e.target.value)\n if (e.target.value) {\n // Bot detected\n console.warn('[Forms] Honeypot triggered')\n }\n },\n }\n : { defaultValue: '' })}\n />\n )\n}\n","'use client'\n\n/**\n * No-JS native submission fallback — the floor under every managed form.\n *\n * The classic form is the SSR/no-JS surface (experiences are post-hydration\n * chunks), so it alone carries a real `action`/`method` pointing at\n * sonor-api's POST /api/public/forms/submit-native. With JS running, the\n * form's onSubmit preventDefault()s and the JSON path wins; without JS the\n * browser performs an ordinary form-encoded POST and the lead still lands.\n *\n * Auth rides in the hidden `_sk_token` field: a signed, single-purpose\n * credential minted by the api-key-authenticated forms/config endpoint\n * (`native_token` in the response). No token in the config (older API, or no\n * signing secret) means no fallback — the form keeps its historical behavior\n * rather than pointing at an endpoint that will reject it.\n *\n * Multi-step forms are excluded: step navigation is JS, and a native POST of\n * step-1 fields alone fails whole-form validation server-side. Single-step\n * forms are the overwhelming lead-capture case.\n *\n * Single source of truth for the gating — the form attrs and the hidden\n * fields must always agree, so both read the same predicate.\n */\n\nimport React from 'react'\nimport type { ManagedFormConfig } from './types'\nimport { getApiConfig } from './submitForm'\n\nfunction nativeEligible(config: ManagedFormConfig | null | undefined): boolean {\n return !!config?.native_token && !config.is_multi_step\n}\n\n/** `action`/`method` for the classic <form> — empty when ineligible. */\nexport function nativeFormProps(\n config: ManagedFormConfig | null | undefined,\n): { action?: string; method?: 'post' } {\n if (!nativeEligible(config)) return {}\n const { apiUrl } = getApiConfig()\n return { action: `${apiUrl}/api/public/forms/submit-native`, method: 'post' }\n}\n\nexport interface NativeFallbackFieldsProps {\n config: ManagedFormConfig | null | undefined\n /**\n * Absolute URL the native 303 should land on (usually the page hosting the\n * form). Optional — without it the server falls back to the Referer origin,\n * which loses the path but still returns the visitor to the right site.\n */\n returnTo?: string\n}\n\n/** Hidden control fields the native endpoint reads (`_sk_*` namespace). */\nexport function NativeFallbackFields({ config, returnTo }: NativeFallbackFieldsProps) {\n if (!nativeEligible(config)) return null\n return (\n <>\n <input type=\"hidden\" name=\"_sk_token\" value={config!.native_token} readOnly />\n {returnTo ? <input type=\"hidden\" name=\"_sk_return\" value={returnTo} readOnly /> : null}\n </>\n )\n}\n"]}
1
+ {"version":3,"sources":["../src/forms/HoneypotField.tsx","../src/forms/native-fallback.tsx"],"names":["jsx","getApiConfig","jsxs","Fragment"],"mappings":";;;;;AAqCO,SAAS,aAAA,CAAc,EAAE,IAAA,EAAM,KAAA,EAAO,UAAS,EAAuB;AAC3E,EAAA,MAAM,WAAA,GAAc,OAAO,QAAA,KAAa,UAAA;AACxC,EAAA,uBACEA,cAAA;AAAA,IAAC,OAAA;AAAA,IAAA;AAAA,MACC,IAAA,EAAK,MAAA;AAAA,MACL,IAAA;AAAA,MACA,QAAA,EAAU,EAAA;AAAA,MACV,YAAA,EAAa,cAAA;AAAA,MACb,aAAA,EAAY,MAAA;AAAA,MACZ,KAAA,EAAK,IAAA;AAAA,MACL,kBAAA,EAAiB,EAAA;AAAA,MAGjB,gBAAA,EAAe,EAAA;AAAA,MACf,eAAA,EAAc,MAAA;AAAA,MACd,gBAAA,EAAe,OAAA;AAAA,MACf,eAAA,EAAc,EAAA;AAAA,MACd,KAAA,EAAO;AAAA,QACL,QAAA,EAAU,UAAA;AAAA,QACV,IAAA,EAAM,KAAA;AAAA,QACN,KAAA,EAAO,CAAA;AAAA,QACP,MAAA,EAAQ,CAAA;AAAA,QACR,QAAA,EAAU,QAAA;AAAA,QACV,OAAA,EAAS,CAAA;AAAA,QACT,UAAA,EAAY,QAAA;AAAA,QACZ,aAAA,EAAe;AAAA,OACjB;AAAA,MACC,GAAI,WAAA,GACD;AAAA,QACE,OAAO,KAAA,IAAS,EAAA;AAAA,QAChB,QAAA,EAAU,CAAC,CAAA,KAA2C;AACpD,UAAA,QAAA,CAAU,CAAA,CAAE,OAAO,KAAK,CAAA;AACxB,UAAA,IAAI,CAAA,CAAE,OAAO,KAAA,EAAO;AAElB,YAAA,OAAA,CAAQ,KAAK,4BAA4B,CAAA;AAAA,UAC3C;AAAA,QACF;AAAA,OACF,GACA,EAAE,YAAA,EAAc,EAAA;AAAG;AAAA,GACzB;AAEJ;ACjDA,SAAS,eAAe,MAAA,EAAuD;AAC7E,EAAA,OAAO,CAAC,CAAC,MAAA,EAAQ,YAAA,IAAgB,CAAC,MAAA,CAAO,aAAA;AAC3C;AAGO,SAAS,gBACd,MAAA,EACsC;AACtC,EAAA,IAAI,CAAC,cAAA,CAAe,MAAM,CAAA,SAAU,EAAC;AACrC,EAAA,MAAM,EAAE,MAAA,EAAO,GAAIC,6BAAA,EAAa;AAChC,EAAA,OAAO,EAAE,MAAA,EAAQ,CAAA,EAAG,MAAM,CAAA,+BAAA,CAAA,EAAmC,QAAQ,MAAA,EAAO;AAC9E;AAaO,SAAS,oBAAA,CAAqB,EAAE,MAAA,EAAQ,QAAA,EAAS,EAA8B;AACpF,EAAA,IAAI,CAAC,cAAA,CAAe,MAAM,CAAA,EAAG,OAAO,IAAA;AACpC,EAAA,uBACEC,eAAA,CAAAC,mBAAA,EAAA,EACE,QAAA,EAAA;AAAA,oBAAAH,cAAAA,CAAC,OAAA,EAAA,EAAM,IAAA,EAAK,QAAA,EAAS,IAAA,EAAK,aAAY,KAAA,EAAO,MAAA,CAAQ,YAAA,EAAc,QAAA,EAAQ,IAAA,EAAC,CAAA;AAAA,IAC3E,QAAA,mBAAWA,cAAAA,CAAC,OAAA,EAAA,EAAM,IAAA,EAAK,QAAA,EAAS,IAAA,EAAK,YAAA,EAAa,KAAA,EAAO,QAAA,EAAU,QAAA,EAAQ,IAAA,EAAC,CAAA,GAAK;AAAA,GAAA,EACpF,CAAA;AAEJ","file":"chunk-W5NVW23S.js","sourcesContent":["/**\n * Single source of truth for the honeypot input — rendered by BOTH form\n * experiences (classic and stage) inside their <form>. The customRender path\n * deliberately gets none (documented limitation: custom renders lose the\n * honeypot, which is why alternate experiences must be render branches).\n *\n * Invariants (do not weaken any of these):\n * - `inert` blocks focus/interaction at the browser level, surviving hostile\n * site CSS that could defeat the inline styles.\n * - data-sk-honeypot gives site CSS a stable opt-OUT hook.\n * - Controlled input: bots filling via JS still fire React onChange, so the\n * value reaches submitForm's data payload.\n * - Name comes from config (`honeypot_field || DEFAULT_HONEYPOT_FIELD` from\n * the shared contract) — resolved by the caller, never forked here.\n * - The trap must be invisible to AUTOFILL as well as to people. A browser or\n * password manager filling a hidden input flags a real visitor as a bot, and\n * because the value is stripped server-side the mistake is undiagnosable\n * after the fact. `autocomplete=\"off\"` does not achieve this — it is the one\n * value Chrome deliberately ignores for contact/address autofill — so the\n * trap declares `new-password` (never offered saved contact data) plus the\n * documented per-manager opt-outs.\n */\n\nimport React from 'react'\n\nexport interface HoneypotFieldProps {\n name: string\n value?: string\n /**\n * Omit for STATIC mode — an uncontrolled trap a Server Component can render.\n * The trap's whole job is server-side (the value is read off the submission\n * and stripped), so it needs no client state to work; the controlled form is\n * only so the hydrated JSON path can read it back out of React state.\n */\n onChange?: (value: string) => void\n}\n\nexport function HoneypotField({ name, value, onChange }: HoneypotFieldProps) {\n const interactive = typeof onChange === 'function'\n return (\n <input\n type=\"text\"\n name={name}\n tabIndex={-1}\n autoComplete=\"new-password\"\n aria-hidden=\"true\"\n inert\n data-sk-honeypot=\"\"\n // Password-manager opt-outs: 1Password, LastPass, Dashlane, Bitwarden.\n // Each ignores its own attribute; none respects autocomplete alone.\n data-1p-ignore=\"\"\n data-lpignore=\"true\"\n data-form-type=\"other\"\n data-bwignore=\"\"\n style={{\n position: 'absolute',\n left: -9999,\n width: 1,\n height: 1,\n overflow: 'hidden',\n opacity: 0,\n visibility: 'hidden',\n pointerEvents: 'none',\n }}\n {...(interactive\n ? {\n value: value ?? '',\n onChange: (e: React.ChangeEvent<HTMLInputElement>) => {\n onChange!(e.target.value)\n if (e.target.value) {\n // Bot detected\n console.warn('[Forms] Honeypot triggered')\n }\n },\n }\n : { defaultValue: '' })}\n />\n )\n}\n","'use client'\n\n/**\n * No-JS native submission fallback — the floor under every managed form.\n *\n * The classic form is the SSR/no-JS surface (experiences are post-hydration\n * chunks), so it alone carries a real `action`/`method` pointing at\n * sonor-api's POST /api/public/forms/submit-native. With JS running, the\n * form's onSubmit preventDefault()s and the JSON path wins; without JS the\n * browser performs an ordinary form-encoded POST and the lead still lands.\n *\n * Auth rides in the hidden `_sk_token` field: a signed, single-purpose\n * credential minted by the api-key-authenticated forms/config endpoint\n * (`native_token` in the response). No token in the config (older API, or no\n * signing secret) means no fallback — the form keeps its historical behavior\n * rather than pointing at an endpoint that will reject it.\n *\n * Multi-step forms are excluded: step navigation is JS, and a native POST of\n * step-1 fields alone fails whole-form validation server-side. Single-step\n * forms are the overwhelming lead-capture case.\n *\n * Single source of truth for the gating — the form attrs and the hidden\n * fields must always agree, so both read the same predicate.\n */\n\nimport React from 'react'\nimport type { ManagedFormConfig } from './types'\nimport { getApiConfig } from './submitForm'\n\nfunction nativeEligible(config: ManagedFormConfig | null | undefined): boolean {\n return !!config?.native_token && !config.is_multi_step\n}\n\n/** `action`/`method` for the classic <form> — empty when ineligible. */\nexport function nativeFormProps(\n config: ManagedFormConfig | null | undefined,\n): { action?: string; method?: 'post' } {\n if (!nativeEligible(config)) return {}\n const { apiUrl } = getApiConfig()\n return { action: `${apiUrl}/api/public/forms/submit-native`, method: 'post' }\n}\n\nexport interface NativeFallbackFieldsProps {\n config: ManagedFormConfig | null | undefined\n /**\n * Absolute URL the native 303 should land on (usually the page hosting the\n * form). Optional — without it the server falls back to the Referer origin,\n * which loses the path but still returns the visitor to the right site.\n */\n returnTo?: string\n}\n\n/** Hidden control fields the native endpoint reads (`_sk_*` namespace). */\nexport function NativeFallbackFields({ config, returnTo }: NativeFallbackFieldsProps) {\n if (!nativeEligible(config)) return null\n return (\n <>\n <input type=\"hidden\" name=\"_sk_token\" value={config!.native_token} readOnly />\n {returnTo ? <input type=\"hidden\" name=\"_sk_return\" value={returnTo} readOnly /> : null}\n </>\n )\n}\n"]}
@@ -0,0 +1,6 @@
1
+ // src/shared/version.ts
2
+ var SITE_KIT_VERSION = "5.5.0";
3
+
4
+ export { SITE_KIT_VERSION };
5
+ //# sourceMappingURL=chunk-WDBCXRTT.mjs.map
6
+ //# sourceMappingURL=chunk-WDBCXRTT.mjs.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/shared/version.ts"],"names":[],"mappings":";AASO,IAAM,gBAAA,GAAmB","file":"chunk-OUERH2T4.mjs","sourcesContent":["/**\n * @sonordev/site-kit shared - Package version constant\n *\n * Single source of truth for the version the kit reports at runtime (the\n * x-sitekit-version request header set by sonorFetch). Kept as a plain const\n * so client bundles don't need JSON imports; scripts/verify-dts.cjs asserts\n * it matches package.json at publish time, and version.test.ts asserts it in\n * dev, so it can't silently drift.\n */\nexport const SITE_KIT_VERSION = '5.3.2'\n"]}
1
+ {"version":3,"sources":["../src/shared/version.ts"],"names":[],"mappings":";AASO,IAAM,gBAAA,GAAmB","file":"chunk-WDBCXRTT.mjs","sourcesContent":["/**\n * @sonordev/site-kit shared - Package version constant\n *\n * Single source of truth for the version the kit reports at runtime (the\n * x-sitekit-version request header set by sonorFetch). Kept as a plain const\n * so client bundles don't need JSON imports; scripts/verify-dts.cjs asserts\n * it matches package.json at publish time, and version.test.ts asserts it in\n * dev, so it can't silently drift.\n */\nexport const SITE_KIT_VERSION = '5.5.0'\n"]}
@@ -1,4 +1,4 @@
1
- import { SITE_KIT_VERSION } from './chunk-OUERH2T4.mjs';
1
+ import { SITE_KIT_VERSION } from './chunk-WDBCXRTT.mjs';
2
2
  import 'server-only';
3
3
 
4
4
  var MINT_PATH = "/api/public/site-token";
@@ -130,5 +130,5 @@ async function mintWithRetry(rawKey, apiUrl) {
130
130
  }
131
131
 
132
132
  export { resolveClientCredential };
133
- //# sourceMappingURL=chunk-ZOJ3TLO5.mjs.map
134
- //# sourceMappingURL=chunk-ZOJ3TLO5.mjs.map
133
+ //# sourceMappingURL=chunk-WIZRCI6J.mjs.map
134
+ //# sourceMappingURL=chunk-WIZRCI6J.mjs.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/server/mint-site-token.ts"],"names":[],"mappings":"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","file":"chunk-ZOJ3TLO5.mjs","sourcesContent":["/**\n * @sonordev/site-kit/server — Client-token minting (server-only)\n *\n * SiteKitLayout holds the raw `SONOR_API_KEY` server-side but must NOT ship it to\n * the browser. This mints a short-lived, project-scoped token (server-to-server,\n * authenticated with the raw key, no browser Origin so it passes domain-binding)\n * and returns THAT for the layout to inject instead.\n *\n * `import 'server-only'` makes importing this into a client bundle a hard build\n * error — the raw key stays on the server.\n *\n * FAILS CLOSED. If minting genuinely fails, this throws and the build fails —\n * it does NOT publish the raw key. A failed deploy is loud and recoverable; a\n * leaked project secret in public HTML is neither. The only paths that still\n * return the raw key are a 404 (an older API that predates the endpoint, an\n * expected state during rollout) and the explicit `SONOR_SITE_TOKEN_FALLBACK=raw`\n * escape hatch, for when shipping beats being blocked.\n *\n * That posture is not academic. Through 3.5.0 a throttled mint (HTTP 429)\n * returned the raw key AND cached it for 60s, so every page rendered in that\n * window shipped the secret: one real build came out with 180 of 272 prerendered\n * pages carrying it. The build \"succeeded\" and nothing downstream noticed.\n * Rate limiting is transient by definition — the fix is to wait and retry, not\n * to downgrade to publishing the key.\n *\n * Two things keep the request count low enough that throttling is rare:\n * - a module-level memo, so a worker mints once and every page reuses the seed;\n * - an in-flight map, because that memo is only populated AFTER the await. Next\n * renders pages concurrently, so without coalescing the first N concurrent\n * renders in a process all miss the cache and all fire a request — a\n * stampede per worker, multiplied by one worker per core. That is how a\n * single site exhausted a 60/min budget.\n *\n * SEED FRESHNESS: a static page's seed carries `iat` = build time, and the API\n * refuses to refresh a seed older than SITE_TOKEN_MAX_REFRESH_AGE_SECONDS\n * (sonor-api common/site-auth/site-token.util.ts — currently 400 days, raised\n * from 30 alongside this fix). A site not rebuilt within that window serves a\n * seed the client cannot refresh, and its forms/analytics/engage start failing\n * for new visitors. Keep that limit comfortably longer than the fleet's\n * realistic redeploy gap; marketing sites routinely go many months untouched.\n */\nimport 'server-only'\nimport { SITE_KIT_VERSION } from '../shared/version'\n\nconst MINT_PATH = '/api/public/site-token'\nconst MINT_TIMEOUT_MS = 4_000\nconst SITE_TOKEN_PREFIX = 'st1.'\n\n/**\n * Retry budget for transient failures (429 / 5xx / network). Rate limiting is\n * measured per minute, so a few seconds of backoff clears it; the whole ladder\n * costs at most ~20s once per build worker, and only when something is wrong.\n */\nconst MINT_MAX_ATTEMPTS = 4\nconst MINT_BACKOFF_BASE_MS = 500\nconst MINT_BACKOFF_CAP_MS = 8_000\n\ninterface CacheEntry {\n credential: string\n expiresAt: number\n}\nconst cache = new Map<string, CacheEntry>()\n\n/**\n * Requests already in flight, keyed by raw key. The `cache` above is only\n * written after the response lands, so concurrent renders would otherwise each\n * start their own mint. See the module header.\n */\nconst inflight = new Map<string, Promise<string>>()\n\nconst sleep = (ms: number) => new Promise<void>((r) => setTimeout(r, ms))\n\n/**\n * Honour `Retry-After` when the server sends it (delta-seconds or HTTP date),\n * otherwise exponential backoff. Capped so a misconfigured server cannot stall\n * a build indefinitely.\n */\nfunction retryDelayMs(res: Response | null, attempt: number): number {\n const header = res?.headers?.get?.('retry-after')\n if (header) {\n const seconds = Number(header)\n const ms = Number.isFinite(seconds)\n ? seconds * 1000\n : Date.parse(header) - Date.now()\n if (Number.isFinite(ms) && ms > 0) return Math.min(ms, MINT_BACKOFF_CAP_MS)\n }\n return Math.min(MINT_BACKOFF_BASE_MS * 2 ** attempt, MINT_BACKOFF_CAP_MS)\n}\n\n/** 429 and 5xx are transient; waiting is the correct response to both. */\nconst isRetryableStatus = (status: number) => status === 429 || status >= 500\n\n/**\n * The escape hatch, for when a broken mint must not block a release. Opt-in and\n * loud: it re-enables publishing the project secret in page HTML.\n */\nfunction rawFallbackAllowed(): boolean {\n return (\n typeof process !== 'undefined' &&\n process.env?.SONOR_SITE_TOKEN_FALLBACK === 'raw'\n )\n}\n\nfunction failClosed(reason: string, rawKey: string, now: number): string {\n if (rawFallbackAllowed()) {\n console.warn(\n `[SiteKitLayout] Token mint failed (${reason}) and SONOR_SITE_TOKEN_FALLBACK=raw is set; ` +\n 'injecting the RAW API KEY into page HTML. The key is publicly readable wherever ' +\n 'this page is served — unset the escape hatch once the mint is healthy.',\n )\n cache.set(rawKey, { credential: rawKey, expiresAt: now + 60_000 })\n return rawKey\n }\n throw new Error(\n `site-kit: could not mint a site token (${reason}). Refusing to publish the raw ` +\n 'SONOR_API_KEY in page HTML, so this build fails instead. Check that the mint ' +\n 'endpoint is reachable and the key is valid, then rebuild. To ship anyway — ' +\n 'which publishes the project secret in public HTML — set SONOR_SITE_TOKEN_FALLBACK=raw.',\n )\n}\n\ntype FetchLike = typeof fetch\n\n/**\n * Next.js monkey-patches `globalThis.fetch` so every call participates in its\n * Data Cache and static-generation tracking. This mint must NOT participate.\n *\n * `cache: 'no-store'` marks the calling scope dynamic, so during `next build`\n * Next throws DynamicServerError *before the request goes out*. On a statically\n * prerendered route the mint therefore never ran at all — the catch below\n * swallowed the bailout and every page shipped the raw key. (Verified against\n * Next 16.2.9: the mint endpoint received zero requests for a static build.)\n *\n * The two obvious repairs are both wrong:\n * - `next: { revalidate: N }` LOWERS the route's revalidate window\n * (patch-fetch.js: `finalRevalidate < revalidateStore.revalidate`), quietly\n * converting fully-static pages into ISR across the whole fleet.\n * - `next: { revalidate: false }` keeps pages static but writes the token into\n * the Data Cache, which hosts persist across builds — a fresh deploy could\n * re-bake a months-old seed, which is the exact failure we're removing.\n *\n * A credential mint is not page data and has no business in the page data cache.\n * So we call the original fetch Next saves on the patched one and stay invisible\n * to the framework: no bailout, no cache entry, no effect on staticness. The\n * module-level memo above is the only cache we want — one mint per build\n * process, and a build-fresh seed on every deploy.\n *\n * @internal Exported for unit tests; not part of the package's public API.\n */\nexport function resolveFetch(): { fn: FetchLike; unpatched: boolean } {\n const current = globalThis.fetch as\n | (FetchLike & { _nextOriginalFetch?: FetchLike })\n | undefined\n if (!current) throw new Error('site-kit: global fetch is unavailable')\n const original = current._nextOriginalFetch\n if (typeof original === 'function') return { fn: original, unpatched: true }\n return { fn: current, unpatched: false }\n}\n\n/**\n * Next signals \"this render must go dynamic\" by THROWING (DynamicServerError,\n * static-gen bailout, redirect/notFound digests, React's postpone). Those are\n * the framework's control flow, not a mint failure. Swallowing one makes Next\n * believe the render succeeded statically — which is precisely how the raw key\n * ended up stranded in prerendered HTML with no error anywhere. Let them\n * propagate; only real network/HTTP failures fall back to the raw key.\n *\n * @internal Exported for unit tests; not part of the package's public API.\n */\nexport function isFrameworkSignal(err: unknown): boolean {\n if (!err || typeof err !== 'object') return false\n const e = err as { digest?: unknown; code?: unknown; $$typeof?: unknown }\n if (e.digest === 'DYNAMIC_SERVER_USAGE') return true\n if (e.code === 'NEXT_STATIC_GEN_BAILOUT') return true\n if (typeof e.digest === 'string' && e.digest.startsWith('NEXT_')) return true\n if (e.$$typeof === Symbol.for('react.postpone')) return true\n return false\n}\n\nexport async function resolveClientCredential(\n rawKey: string,\n apiUrl: string,\n): Promise<string> {\n if (!rawKey) return ''\n // Env should hold a raw key; if it already looks like a token, pass it through.\n if (rawKey.startsWith(SITE_TOKEN_PREFIX)) return rawKey\n\n const cached = cache.get(rawKey)\n if (cached && cached.expiresAt > Date.now()) return cached.credential\n\n // Collapse concurrent renders onto one request rather than a stampede.\n const pending = inflight.get(rawKey)\n if (pending) return pending\n\n const request = mintWithRetry(rawKey, apiUrl)\n inflight.set(rawKey, request)\n try {\n return await request\n } finally {\n inflight.delete(rawKey)\n }\n}\n\nasync function mintWithRetry(rawKey: string, apiUrl: string): Promise<string> {\n const base = (apiUrl || 'https://api.sonor.io').replace(/\\/+$/, '')\n let lastReason = 'unknown error'\n\n for (let attempt = 0; attempt < MINT_MAX_ATTEMPTS; attempt++) {\n let res: Response | null = null\n try {\n const { fn: fetchFn, unpatched } = resolveFetch()\n res = await fetchFn(`${base}${MINT_PATH}`, {\n method: 'POST',\n headers: {\n 'content-type': 'application/json',\n 'x-api-key': rawKey,\n 'x-sitekit-version': SITE_KIT_VERSION,\n },\n // Only meaningful on the fallback path, where a future Next stopped\n // exposing `_nextOriginalFetch` and we're back on the patched fetch.\n // `revalidate: false` is the one setting that neither bails out of static\n // generation nor downgrades the route to ISR; a Data Cache entry is the\n // lesser evil versus shipping the raw key again.\n ...(unpatched ? {} : ({ next: { revalidate: false } } as RequestInit)),\n signal:\n typeof AbortSignal !== 'undefined' && AbortSignal.timeout\n ? AbortSignal.timeout(MINT_TIMEOUT_MS)\n : undefined,\n })\n } catch (err) {\n // Never swallow the framework's own control flow — see isFrameworkSignal.\n if (isFrameworkSignal(err)) throw err\n lastReason = err instanceof Error ? err.message : 'network error'\n if (attempt < MINT_MAX_ATTEMPTS - 1) {\n await sleep(retryDelayMs(null, attempt))\n continue\n }\n break\n }\n\n if (res.ok) {\n const data: any = await res.json().catch(() => null)\n const token = data?.token\n const expiresIn = typeof data?.expiresIn === 'number' ? data.expiresIn : 3600\n if (typeof token === 'string' && token.startsWith(SITE_TOKEN_PREFIX)) {\n cache.set(rawKey, {\n credential: token,\n expiresAt: Date.now() + Math.min((expiresIn * 1000) / 2, 30 * 60_000),\n })\n return token\n }\n lastReason = 'mint returned no usable token'\n break\n }\n\n // 404 = an API older than the endpoint. Expected during rollout, and the raw\n // key is exactly what such an API still expects, so this stays a fallback\n // rather than a build failure.\n if (res.status === 404) {\n cache.set(rawKey, { credential: rawKey, expiresAt: Date.now() + 60_000 })\n return rawKey\n }\n\n lastReason = `HTTP ${res.status}`\n if (isRetryableStatus(res.status) && attempt < MINT_MAX_ATTEMPTS - 1) {\n const delay = retryDelayMs(res, attempt)\n console.warn(\n `[SiteKitLayout] Token mint returned ${res.status}; retrying in ${Math.round(delay)}ms ` +\n `(attempt ${attempt + 2}/${MINT_MAX_ATTEMPTS}).`,\n )\n await sleep(delay)\n continue\n }\n break\n }\n\n return failClosed(lastReason, rawKey, Date.now())\n}\n"]}
1
+ {"version":3,"sources":["../src/server/mint-site-token.ts"],"names":[],"mappings":"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","file":"chunk-WIZRCI6J.mjs","sourcesContent":["/**\n * @sonordev/site-kit/server — Client-token minting (server-only)\n *\n * SiteKitLayout holds the raw `SONOR_API_KEY` server-side but must NOT ship it to\n * the browser. This mints a short-lived, project-scoped token (server-to-server,\n * authenticated with the raw key, no browser Origin so it passes domain-binding)\n * and returns THAT for the layout to inject instead.\n *\n * `import 'server-only'` makes importing this into a client bundle a hard build\n * error — the raw key stays on the server.\n *\n * FAILS CLOSED. If minting genuinely fails, this throws and the build fails —\n * it does NOT publish the raw key. A failed deploy is loud and recoverable; a\n * leaked project secret in public HTML is neither. The only paths that still\n * return the raw key are a 404 (an older API that predates the endpoint, an\n * expected state during rollout) and the explicit `SONOR_SITE_TOKEN_FALLBACK=raw`\n * escape hatch, for when shipping beats being blocked.\n *\n * That posture is not academic. Through 3.5.0 a throttled mint (HTTP 429)\n * returned the raw key AND cached it for 60s, so every page rendered in that\n * window shipped the secret: one real build came out with 180 of 272 prerendered\n * pages carrying it. The build \"succeeded\" and nothing downstream noticed.\n * Rate limiting is transient by definition — the fix is to wait and retry, not\n * to downgrade to publishing the key.\n *\n * Two things keep the request count low enough that throttling is rare:\n * - a module-level memo, so a worker mints once and every page reuses the seed;\n * - an in-flight map, because that memo is only populated AFTER the await. Next\n * renders pages concurrently, so without coalescing the first N concurrent\n * renders in a process all miss the cache and all fire a request — a\n * stampede per worker, multiplied by one worker per core. That is how a\n * single site exhausted a 60/min budget.\n *\n * SEED FRESHNESS: a static page's seed carries `iat` = build time, and the API\n * refuses to refresh a seed older than SITE_TOKEN_MAX_REFRESH_AGE_SECONDS\n * (sonor-api common/site-auth/site-token.util.ts — currently 400 days, raised\n * from 30 alongside this fix). A site not rebuilt within that window serves a\n * seed the client cannot refresh, and its forms/analytics/engage start failing\n * for new visitors. Keep that limit comfortably longer than the fleet's\n * realistic redeploy gap; marketing sites routinely go many months untouched.\n */\nimport 'server-only'\nimport { SITE_KIT_VERSION } from '../shared/version'\n\nconst MINT_PATH = '/api/public/site-token'\nconst MINT_TIMEOUT_MS = 4_000\nconst SITE_TOKEN_PREFIX = 'st1.'\n\n/**\n * Retry budget for transient failures (429 / 5xx / network). Rate limiting is\n * measured per minute, so a few seconds of backoff clears it; the whole ladder\n * costs at most ~20s once per build worker, and only when something is wrong.\n */\nconst MINT_MAX_ATTEMPTS = 4\nconst MINT_BACKOFF_BASE_MS = 500\nconst MINT_BACKOFF_CAP_MS = 8_000\n\ninterface CacheEntry {\n credential: string\n expiresAt: number\n}\nconst cache = new Map<string, CacheEntry>()\n\n/**\n * Requests already in flight, keyed by raw key. The `cache` above is only\n * written after the response lands, so concurrent renders would otherwise each\n * start their own mint. See the module header.\n */\nconst inflight = new Map<string, Promise<string>>()\n\nconst sleep = (ms: number) => new Promise<void>((r) => setTimeout(r, ms))\n\n/**\n * Honour `Retry-After` when the server sends it (delta-seconds or HTTP date),\n * otherwise exponential backoff. Capped so a misconfigured server cannot stall\n * a build indefinitely.\n */\nfunction retryDelayMs(res: Response | null, attempt: number): number {\n const header = res?.headers?.get?.('retry-after')\n if (header) {\n const seconds = Number(header)\n const ms = Number.isFinite(seconds)\n ? seconds * 1000\n : Date.parse(header) - Date.now()\n if (Number.isFinite(ms) && ms > 0) return Math.min(ms, MINT_BACKOFF_CAP_MS)\n }\n return Math.min(MINT_BACKOFF_BASE_MS * 2 ** attempt, MINT_BACKOFF_CAP_MS)\n}\n\n/** 429 and 5xx are transient; waiting is the correct response to both. */\nconst isRetryableStatus = (status: number) => status === 429 || status >= 500\n\n/**\n * The escape hatch, for when a broken mint must not block a release. Opt-in and\n * loud: it re-enables publishing the project secret in page HTML.\n */\nfunction rawFallbackAllowed(): boolean {\n return (\n typeof process !== 'undefined' &&\n process.env?.SONOR_SITE_TOKEN_FALLBACK === 'raw'\n )\n}\n\nfunction failClosed(reason: string, rawKey: string, now: number): string {\n if (rawFallbackAllowed()) {\n console.warn(\n `[SiteKitLayout] Token mint failed (${reason}) and SONOR_SITE_TOKEN_FALLBACK=raw is set; ` +\n 'injecting the RAW API KEY into page HTML. The key is publicly readable wherever ' +\n 'this page is served — unset the escape hatch once the mint is healthy.',\n )\n cache.set(rawKey, { credential: rawKey, expiresAt: now + 60_000 })\n return rawKey\n }\n throw new Error(\n `site-kit: could not mint a site token (${reason}). Refusing to publish the raw ` +\n 'SONOR_API_KEY in page HTML, so this build fails instead. Check that the mint ' +\n 'endpoint is reachable and the key is valid, then rebuild. To ship anyway — ' +\n 'which publishes the project secret in public HTML — set SONOR_SITE_TOKEN_FALLBACK=raw.',\n )\n}\n\ntype FetchLike = typeof fetch\n\n/**\n * Next.js monkey-patches `globalThis.fetch` so every call participates in its\n * Data Cache and static-generation tracking. This mint must NOT participate.\n *\n * `cache: 'no-store'` marks the calling scope dynamic, so during `next build`\n * Next throws DynamicServerError *before the request goes out*. On a statically\n * prerendered route the mint therefore never ran at all — the catch below\n * swallowed the bailout and every page shipped the raw key. (Verified against\n * Next 16.2.9: the mint endpoint received zero requests for a static build.)\n *\n * The two obvious repairs are both wrong:\n * - `next: { revalidate: N }` LOWERS the route's revalidate window\n * (patch-fetch.js: `finalRevalidate < revalidateStore.revalidate`), quietly\n * converting fully-static pages into ISR across the whole fleet.\n * - `next: { revalidate: false }` keeps pages static but writes the token into\n * the Data Cache, which hosts persist across builds — a fresh deploy could\n * re-bake a months-old seed, which is the exact failure we're removing.\n *\n * A credential mint is not page data and has no business in the page data cache.\n * So we call the original fetch Next saves on the patched one and stay invisible\n * to the framework: no bailout, no cache entry, no effect on staticness. The\n * module-level memo above is the only cache we want — one mint per build\n * process, and a build-fresh seed on every deploy.\n *\n * @internal Exported for unit tests; not part of the package's public API.\n */\nexport function resolveFetch(): { fn: FetchLike; unpatched: boolean } {\n const current = globalThis.fetch as\n | (FetchLike & { _nextOriginalFetch?: FetchLike })\n | undefined\n if (!current) throw new Error('site-kit: global fetch is unavailable')\n const original = current._nextOriginalFetch\n if (typeof original === 'function') return { fn: original, unpatched: true }\n return { fn: current, unpatched: false }\n}\n\n/**\n * Next signals \"this render must go dynamic\" by THROWING (DynamicServerError,\n * static-gen bailout, redirect/notFound digests, React's postpone). Those are\n * the framework's control flow, not a mint failure. Swallowing one makes Next\n * believe the render succeeded statically — which is precisely how the raw key\n * ended up stranded in prerendered HTML with no error anywhere. Let them\n * propagate; only real network/HTTP failures fall back to the raw key.\n *\n * @internal Exported for unit tests; not part of the package's public API.\n */\nexport function isFrameworkSignal(err: unknown): boolean {\n if (!err || typeof err !== 'object') return false\n const e = err as { digest?: unknown; code?: unknown; $$typeof?: unknown }\n if (e.digest === 'DYNAMIC_SERVER_USAGE') return true\n if (e.code === 'NEXT_STATIC_GEN_BAILOUT') return true\n if (typeof e.digest === 'string' && e.digest.startsWith('NEXT_')) return true\n if (e.$$typeof === Symbol.for('react.postpone')) return true\n return false\n}\n\nexport async function resolveClientCredential(\n rawKey: string,\n apiUrl: string,\n): Promise<string> {\n if (!rawKey) return ''\n // Env should hold a raw key; if it already looks like a token, pass it through.\n if (rawKey.startsWith(SITE_TOKEN_PREFIX)) return rawKey\n\n const cached = cache.get(rawKey)\n if (cached && cached.expiresAt > Date.now()) return cached.credential\n\n // Collapse concurrent renders onto one request rather than a stampede.\n const pending = inflight.get(rawKey)\n if (pending) return pending\n\n const request = mintWithRetry(rawKey, apiUrl)\n inflight.set(rawKey, request)\n try {\n return await request\n } finally {\n inflight.delete(rawKey)\n }\n}\n\nasync function mintWithRetry(rawKey: string, apiUrl: string): Promise<string> {\n const base = (apiUrl || 'https://api.sonor.io').replace(/\\/+$/, '')\n let lastReason = 'unknown error'\n\n for (let attempt = 0; attempt < MINT_MAX_ATTEMPTS; attempt++) {\n let res: Response | null = null\n try {\n const { fn: fetchFn, unpatched } = resolveFetch()\n res = await fetchFn(`${base}${MINT_PATH}`, {\n method: 'POST',\n headers: {\n 'content-type': 'application/json',\n 'x-api-key': rawKey,\n 'x-sitekit-version': SITE_KIT_VERSION,\n },\n // Only meaningful on the fallback path, where a future Next stopped\n // exposing `_nextOriginalFetch` and we're back on the patched fetch.\n // `revalidate: false` is the one setting that neither bails out of static\n // generation nor downgrades the route to ISR; a Data Cache entry is the\n // lesser evil versus shipping the raw key again.\n ...(unpatched ? {} : ({ next: { revalidate: false } } as RequestInit)),\n signal:\n typeof AbortSignal !== 'undefined' && AbortSignal.timeout\n ? AbortSignal.timeout(MINT_TIMEOUT_MS)\n : undefined,\n })\n } catch (err) {\n // Never swallow the framework's own control flow — see isFrameworkSignal.\n if (isFrameworkSignal(err)) throw err\n lastReason = err instanceof Error ? err.message : 'network error'\n if (attempt < MINT_MAX_ATTEMPTS - 1) {\n await sleep(retryDelayMs(null, attempt))\n continue\n }\n break\n }\n\n if (res.ok) {\n const data: any = await res.json().catch(() => null)\n const token = data?.token\n const expiresIn = typeof data?.expiresIn === 'number' ? data.expiresIn : 3600\n if (typeof token === 'string' && token.startsWith(SITE_TOKEN_PREFIX)) {\n cache.set(rawKey, {\n credential: token,\n expiresAt: Date.now() + Math.min((expiresIn * 1000) / 2, 30 * 60_000),\n })\n return token\n }\n lastReason = 'mint returned no usable token'\n break\n }\n\n // 404 = an API older than the endpoint. Expected during rollout, and the raw\n // key is exactly what such an API still expects, so this stays a fallback\n // rather than a build failure.\n if (res.status === 404) {\n cache.set(rawKey, { credential: rawKey, expiresAt: Date.now() + 60_000 })\n return rawKey\n }\n\n lastReason = `HTTP ${res.status}`\n if (isRetryableStatus(res.status) && attempt < MINT_MAX_ATTEMPTS - 1) {\n const delay = retryDelayMs(res, attempt)\n console.warn(\n `[SiteKitLayout] Token mint returned ${res.status}; retrying in ${Math.round(delay)}ms ` +\n `(attempt ${attempt + 2}/${MINT_MAX_ATTEMPTS}).`,\n )\n await sleep(delay)\n continue\n }\n break\n }\n\n return failClosed(lastReason, rawKey, Date.now())\n}\n"]}
@@ -1,4 +1,4 @@
1
- import { getApiConfig } from './chunk-XW5KNCWJ.mjs';
1
+ import { getApiConfig } from './chunk-TX2QQ7IX.mjs';
2
2
  import { jsx, jsxs, Fragment } from 'react/jsx-runtime';
3
3
 
4
4
  function HoneypotField({ name, value, onChange }) {
@@ -56,5 +56,5 @@ function NativeFallbackFields({ config, returnTo }) {
56
56
  }
57
57
 
58
58
  export { HoneypotField, NativeFallbackFields, nativeFormProps };
59
- //# sourceMappingURL=chunk-HDQTZAGE.mjs.map
60
- //# sourceMappingURL=chunk-HDQTZAGE.mjs.map
59
+ //# sourceMappingURL=chunk-X2XFLYZ3.mjs.map
60
+ //# sourceMappingURL=chunk-X2XFLYZ3.mjs.map