@sonordev/site-kit 5.4.0 → 5.5.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (318) hide show
  1. package/AGENTS.md +16 -6
  2. package/README.md +9 -7
  3. package/agent-manifest.json +7 -7
  4. package/dist/AnalyticsProvider-KFXAH4GR.mjs +11 -0
  5. package/dist/{AnalyticsProvider-2XIOMRCN.mjs.map → AnalyticsProvider-KFXAH4GR.mjs.map} +1 -1
  6. package/dist/AnalyticsProvider-WDDW3IJW.js +32 -0
  7. package/dist/{AnalyticsProvider-Y2P2BPOI.js.map → AnalyticsProvider-WDDW3IJW.js.map} +1 -1
  8. package/dist/{BlogViewTracker-6EGEDPP3.js → BlogViewTracker-D4DIEP4Q.js} +6 -6
  9. package/dist/{BlogViewTracker-6EGEDPP3.js.map → BlogViewTracker-D4DIEP4Q.js.map} +1 -1
  10. package/dist/{BlogViewTracker-R4YQ76WP.mjs → BlogViewTracker-ZVEGGH3Y.mjs} +5 -5
  11. package/dist/{BlogViewTracker-R4YQ76WP.mjs.map → BlogViewTracker-ZVEGGH3Y.mjs.map} +1 -1
  12. package/dist/ChatWidget-2ZYPYIMQ.js +22 -0
  13. package/dist/{ChatWidget-2OFWPCWF.js.map → ChatWidget-2ZYPYIMQ.js.map} +1 -1
  14. package/dist/ChatWidget-FYCCLMQE.mjs +13 -0
  15. package/dist/{ChatWidget-4AOGHYXQ.mjs.map → ChatWidget-FYCCLMQE.mjs.map} +1 -1
  16. package/dist/EngageWidget-6HUZYOY7.mjs +11 -0
  17. package/dist/{EngageWidget-SFO2XRNG.mjs.map → EngageWidget-6HUZYOY7.mjs.map} +1 -1
  18. package/dist/EngageWidget-MYQTBBW6.js +20 -0
  19. package/dist/{EngageWidget-T4KAAD3G.js.map → EngageWidget-MYQTBBW6.js.map} +1 -1
  20. package/dist/{FileField-CE2XNBBG.js → FileField-JK2S24XU.js} +6 -6
  21. package/dist/{FileField-CE2XNBBG.js.map → FileField-JK2S24XU.js.map} +1 -1
  22. package/dist/{FileField-7DF2SLPF.mjs → FileField-OZZHWGPA.mjs} +5 -5
  23. package/dist/{FileField-7DF2SLPF.mjs.map → FileField-OZZHWGPA.mjs.map} +1 -1
  24. package/dist/{FormSpotlight-ZD3WR5BC.js → FormSpotlight-5AXFQU5M.js} +15 -15
  25. package/dist/{FormSpotlight-ZD3WR5BC.js.map → FormSpotlight-5AXFQU5M.js.map} +1 -1
  26. package/dist/{FormSpotlight-IRLKSZGV.mjs → FormSpotlight-XV42L72H.mjs} +3 -3
  27. package/dist/{FormSpotlight-IRLKSZGV.mjs.map → FormSpotlight-XV42L72H.mjs.map} +1 -1
  28. package/dist/{FormStage-OSPXOUQE.js → FormStage-HATUHNRV.js} +13 -13
  29. package/dist/{FormStage-OSPXOUQE.js.map → FormStage-HATUHNRV.js.map} +1 -1
  30. package/dist/{FormStage-2OSRNQJL.mjs → FormStage-RUK675HV.mjs} +3 -3
  31. package/dist/{FormStage-2OSRNQJL.mjs.map → FormStage-RUK675HV.mjs.map} +1 -1
  32. package/dist/ManagedForm-JWEXJEXK.js +23 -0
  33. package/dist/{ManagedForm-JCHGBBQW.js.map → ManagedForm-JWEXJEXK.js.map} +1 -1
  34. package/dist/ManagedForm-OA3MNGXT.mjs +14 -0
  35. package/dist/{ManagedForm-5G37EDJT.mjs.map → ManagedForm-OA3MNGXT.mjs.map} +1 -1
  36. package/dist/{ManagedNewsletterForm-4LVJZROZ.js → ManagedNewsletterForm-AAHH63KT.js} +8 -8
  37. package/dist/{ManagedNewsletterForm-4LVJZROZ.js.map → ManagedNewsletterForm-AAHH63KT.js.map} +1 -1
  38. package/dist/{ManagedNewsletterForm-QJSVH23S.mjs → ManagedNewsletterForm-HZKTNWLW.mjs} +7 -7
  39. package/dist/{ManagedNewsletterForm-QJSVH23S.mjs.map → ManagedNewsletterForm-HZKTNWLW.mjs.map} +1 -1
  40. package/dist/{SignalCore-L6Z3YTCF.mjs → SignalCore-X3GDGBZD.mjs} +5 -5
  41. package/dist/{SignalCore-L6Z3YTCF.mjs.map → SignalCore-X3GDGBZD.mjs.map} +1 -1
  42. package/dist/{SignalCore-NQ4YEOI7.js → SignalCore-YSNZYBKJ.js} +11 -11
  43. package/dist/{SignalCore-NQ4YEOI7.js.map → SignalCore-YSNZYBKJ.js.map} +1 -1
  44. package/dist/SitemapSync-2PTDBH5E.mjs +9 -0
  45. package/dist/{SitemapSync-MYSTLJOM.mjs.map → SitemapSync-2PTDBH5E.mjs.map} +1 -1
  46. package/dist/SitemapSync-3SFAI546.js +18 -0
  47. package/dist/{SitemapSync-3LUZWBTB.js.map → SitemapSync-3SFAI546.js.map} +1 -1
  48. package/dist/analytics/dispatch.d.ts +4 -4
  49. package/dist/analytics/index.js +15 -15
  50. package/dist/analytics/index.mjs +6 -6
  51. package/dist/{api-NTHZ6PAW.mjs → api-D745LGGU.mjs} +3 -3
  52. package/dist/api-D745LGGU.mjs.map +1 -0
  53. package/dist/{api-N5OLQXYN.js → api-XR5APCH3.js} +3 -3
  54. package/dist/api-XR5APCH3.js.map +1 -0
  55. package/dist/blog/index.js +20 -20
  56. package/dist/blog/index.mjs +3 -3
  57. package/dist/blog/server-ui.js +14 -14
  58. package/dist/blog/server-ui.mjs +2 -2
  59. package/dist/{chunk-WSUQ76LN.js → chunk-2CMSWJWC.js} +18 -18
  60. package/dist/{chunk-WSUQ76LN.js.map → chunk-2CMSWJWC.js.map} +1 -1
  61. package/dist/{chunk-QWLL3B6U.js → chunk-2OU4KBUN.js} +26 -23
  62. package/dist/chunk-2OU4KBUN.js.map +1 -0
  63. package/dist/{chunk-A2VLEORI.mjs → chunk-3B6CXGAK.mjs} +3 -3
  64. package/dist/{chunk-A2VLEORI.mjs.map → chunk-3B6CXGAK.mjs.map} +1 -1
  65. package/dist/{chunk-HMFFAUCD.js → chunk-3DWIYCQX.js} +2 -2
  66. package/dist/chunk-3DWIYCQX.js.map +1 -0
  67. package/dist/{chunk-3EPMDPWI.js → chunk-3SDMJMN2.js} +5 -5
  68. package/dist/{chunk-3EPMDPWI.js.map → chunk-3SDMJMN2.js.map} +1 -1
  69. package/dist/chunk-4U5NCKQY.mjs +39 -0
  70. package/dist/chunk-4U5NCKQY.mjs.map +1 -0
  71. package/dist/{chunk-I4PDSDVE.mjs → chunk-4XGACM7D.mjs} +3 -3
  72. package/dist/{chunk-I4PDSDVE.mjs.map → chunk-4XGACM7D.mjs.map} +1 -1
  73. package/dist/{chunk-HDDV63XJ.mjs → chunk-5TGAUWNO.mjs} +3 -3
  74. package/dist/{chunk-HDDV63XJ.mjs.map → chunk-5TGAUWNO.mjs.map} +1 -1
  75. package/dist/{chunk-RO55G3OA.mjs → chunk-64BOVMXG.mjs} +3 -3
  76. package/dist/{chunk-RO55G3OA.mjs.map → chunk-64BOVMXG.mjs.map} +1 -1
  77. package/dist/{chunk-JJ26JKBJ.mjs → chunk-7PPNXORV.mjs} +3 -3
  78. package/dist/{chunk-JJ26JKBJ.mjs.map → chunk-7PPNXORV.mjs.map} +1 -1
  79. package/dist/{chunk-LHYVFWHL.js → chunk-A3F5GRNJ.js} +8 -8
  80. package/dist/{chunk-LHYVFWHL.js.map → chunk-A3F5GRNJ.js.map} +1 -1
  81. package/dist/{chunk-SZHKNGNR.mjs → chunk-AEARU24Q.mjs} +40 -26
  82. package/dist/chunk-AEARU24Q.mjs.map +1 -0
  83. package/dist/{chunk-HBMF3M5F.js → chunk-BNOQXDPJ.js} +4 -4
  84. package/dist/{chunk-HBMF3M5F.js.map → chunk-BNOQXDPJ.js.map} +1 -1
  85. package/dist/{chunk-5737U6DI.js → chunk-CT5REGAK.js} +15 -15
  86. package/dist/{chunk-5737U6DI.js.map → chunk-CT5REGAK.js.map} +1 -1
  87. package/dist/{chunk-HH5KGXTK.mjs → chunk-DRLHQQBH.mjs} +4 -4
  88. package/dist/{chunk-HH5KGXTK.mjs.map → chunk-DRLHQQBH.mjs.map} +1 -1
  89. package/dist/{chunk-UOLY4NXK.mjs → chunk-DYULWKDC.mjs} +4 -4
  90. package/dist/{chunk-UOLY4NXK.mjs.map → chunk-DYULWKDC.mjs.map} +1 -1
  91. package/dist/chunk-ESP5RMB7.js +42 -0
  92. package/dist/chunk-ESP5RMB7.js.map +1 -0
  93. package/dist/{chunk-LF4L3ZP5.js → chunk-FF5N5D3D.js} +8 -8
  94. package/dist/{chunk-LF4L3ZP5.js.map → chunk-FF5N5D3D.js.map} +1 -1
  95. package/dist/{chunk-ITFZZ6YT.js → chunk-FYVLQ3OU.js} +3 -3
  96. package/dist/{chunk-ITFZZ6YT.js.map → chunk-FYVLQ3OU.js.map} +1 -1
  97. package/dist/{chunk-N6X76QUF.mjs → chunk-G5HUI4BO.mjs} +3 -3
  98. package/dist/{chunk-N6X76QUF.mjs.map → chunk-G5HUI4BO.mjs.map} +1 -1
  99. package/dist/chunk-G6WF4G3E.js +43 -0
  100. package/dist/chunk-G6WF4G3E.js.map +1 -0
  101. package/dist/{chunk-DQM5GR2P.mjs → chunk-HBI67P7Y.mjs} +4 -4
  102. package/dist/{chunk-DQM5GR2P.mjs.map → chunk-HBI67P7Y.mjs.map} +1 -1
  103. package/dist/{chunk-VA36CJRV.js → chunk-HFJQMIFM.js} +4 -4
  104. package/dist/{chunk-VA36CJRV.js.map → chunk-HFJQMIFM.js.map} +1 -1
  105. package/dist/{chunk-VWDT7H6L.js → chunk-HX3BRMOX.js} +3 -3
  106. package/dist/{chunk-VWDT7H6L.js.map → chunk-HX3BRMOX.js.map} +1 -1
  107. package/dist/{chunk-3TXX5KIN.js → chunk-JNRHTZL4.js} +2 -2
  108. package/dist/{chunk-3TXX5KIN.js.map → chunk-JNRHTZL4.js.map} +1 -1
  109. package/dist/{chunk-U53KN4SA.js → chunk-KAUUGRYB.js} +5 -5
  110. package/dist/{chunk-U53KN4SA.js.map → chunk-KAUUGRYB.js.map} +1 -1
  111. package/dist/{chunk-L2LJQIM3.js → chunk-KPKQKFT4.js} +11 -11
  112. package/dist/chunk-KPKQKFT4.js.map +1 -0
  113. package/dist/{chunk-ZLPXFV5Y.js → chunk-MCJF2KJ6.js} +5 -5
  114. package/dist/{chunk-ZLPXFV5Y.js.map → chunk-MCJF2KJ6.js.map} +1 -1
  115. package/dist/{chunk-URVGBWCP.js → chunk-MNYM2XU4.js} +4 -4
  116. package/dist/{chunk-URVGBWCP.js.map → chunk-MNYM2XU4.js.map} +1 -1
  117. package/dist/{chunk-ACTLQ2RH.mjs → chunk-MU7IEPDG.mjs} +4 -4
  118. package/dist/chunk-MU7IEPDG.mjs.map +1 -0
  119. package/dist/chunk-NSWO43XW.mjs +39 -0
  120. package/dist/chunk-NSWO43XW.mjs.map +1 -0
  121. package/dist/{chunk-KMGGAL2X.js → chunk-NZSFOZJV.js} +40 -26
  122. package/dist/chunk-NZSFOZJV.js.map +1 -0
  123. package/dist/{chunk-MIFP6QEQ.mjs → chunk-OFSA7LUH.mjs} +4 -4
  124. package/dist/{chunk-MIFP6QEQ.mjs.map → chunk-OFSA7LUH.mjs.map} +1 -1
  125. package/dist/{chunk-2KIGFOPM.js → chunk-PIPLBBDH.js} +8 -8
  126. package/dist/{chunk-2KIGFOPM.js.map → chunk-PIPLBBDH.js.map} +1 -1
  127. package/dist/{chunk-7PLH3H3W.js → chunk-Q26VZNM2.js} +3 -3
  128. package/dist/{chunk-7PLH3H3W.js.map → chunk-Q26VZNM2.js.map} +1 -1
  129. package/dist/{chunk-GQ6CUOLA.js → chunk-QEGUI2Q2.js} +15 -15
  130. package/dist/{chunk-GQ6CUOLA.js.map → chunk-QEGUI2Q2.js.map} +1 -1
  131. package/dist/{chunk-LBS4PRC7.js → chunk-QFNSM77X.js} +3 -3
  132. package/dist/{chunk-LBS4PRC7.js.map → chunk-QFNSM77X.js.map} +1 -1
  133. package/dist/{chunk-MTANHZKJ.mjs → chunk-R4MX6EOM.mjs} +7 -7
  134. package/dist/{chunk-MTANHZKJ.mjs.map → chunk-R4MX6EOM.mjs.map} +1 -1
  135. package/dist/{chunk-LIYSLNEK.mjs → chunk-RMMHWSPP.mjs} +3 -3
  136. package/dist/{chunk-LIYSLNEK.mjs.map → chunk-RMMHWSPP.mjs.map} +1 -1
  137. package/dist/{chunk-B4BFQSSS.mjs → chunk-RU54J2PY.mjs} +4 -4
  138. package/dist/chunk-RU54J2PY.mjs.map +1 -0
  139. package/dist/{chunk-SJXGIUHP.mjs → chunk-RZUZMUTN.mjs} +9 -8
  140. package/dist/chunk-RZUZMUTN.mjs.map +1 -0
  141. package/dist/{chunk-N6AVWMIB.mjs → chunk-S6FEC6UT.mjs} +9 -5
  142. package/dist/chunk-S6FEC6UT.mjs.map +1 -0
  143. package/dist/{chunk-3DPXOZAU.mjs → chunk-SHLWA6JY.mjs} +2 -2
  144. package/dist/chunk-SHLWA6JY.mjs.map +1 -0
  145. package/dist/{chunk-7IPSQ5JR.js → chunk-SQVYLIIN.js} +11 -7
  146. package/dist/chunk-SQVYLIIN.js.map +1 -0
  147. package/dist/chunk-SUZ3ZLB2.js +8 -0
  148. package/dist/{chunk-UTOHMK52.js.map → chunk-SUZ3ZLB2.js.map} +1 -1
  149. package/dist/{chunk-7Y2UPFSY.mjs → chunk-TALEV3IH.mjs} +3 -3
  150. package/dist/{chunk-7Y2UPFSY.mjs.map → chunk-TALEV3IH.mjs.map} +1 -1
  151. package/dist/{chunk-UOTXSWKZ.mjs → chunk-TP7H6BSK.mjs} +2 -2
  152. package/dist/{chunk-UOTXSWKZ.mjs.map → chunk-TP7H6BSK.mjs.map} +1 -1
  153. package/dist/{chunk-XWF7QPIP.mjs → chunk-TX2QQ7IX.mjs} +3 -3
  154. package/dist/{chunk-XWF7QPIP.mjs.map → chunk-TX2QQ7IX.mjs.map} +1 -1
  155. package/dist/{chunk-AWFZIXCT.js → chunk-UNPEMSLK.js} +12 -11
  156. package/dist/chunk-UNPEMSLK.js.map +1 -0
  157. package/dist/{chunk-NUH245XK.mjs → chunk-UZL2QU2V.mjs} +16 -13
  158. package/dist/chunk-UZL2QU2V.mjs.map +1 -0
  159. package/dist/{chunk-G5I3XEQS.mjs → chunk-V6NOM7PJ.mjs} +3 -3
  160. package/dist/{chunk-G5I3XEQS.mjs.map → chunk-V6NOM7PJ.mjs.map} +1 -1
  161. package/dist/{chunk-ZY5AVC4P.js → chunk-VAS3LH5W.js} +10 -10
  162. package/dist/{chunk-ZY5AVC4P.js.map → chunk-VAS3LH5W.js.map} +1 -1
  163. package/dist/{chunk-KQ3VAOAF.mjs → chunk-VYHRAICF.mjs} +4 -4
  164. package/dist/{chunk-KQ3VAOAF.mjs.map → chunk-VYHRAICF.mjs.map} +1 -1
  165. package/dist/{chunk-LUYUFILE.js → chunk-W5NVW23S.js} +4 -4
  166. package/dist/{chunk-LUYUFILE.js.map → chunk-W5NVW23S.js.map} +1 -1
  167. package/dist/chunk-WDBCXRTT.mjs +6 -0
  168. package/dist/{chunk-7U7C6XRI.mjs.map → chunk-WDBCXRTT.mjs.map} +1 -1
  169. package/dist/{chunk-6CUBSQMD.mjs → chunk-WIZRCI6J.mjs} +3 -3
  170. package/dist/{chunk-6CUBSQMD.mjs.map → chunk-WIZRCI6J.mjs.map} +1 -1
  171. package/dist/{chunk-EBMPXFOP.mjs → chunk-X2XFLYZ3.mjs} +3 -3
  172. package/dist/{chunk-EBMPXFOP.mjs.map → chunk-X2XFLYZ3.mjs.map} +1 -1
  173. package/dist/{chunk-B36PTS7B.mjs → chunk-XQYC4KMH.mjs} +3 -3
  174. package/dist/{chunk-B36PTS7B.mjs.map → chunk-XQYC4KMH.mjs.map} +1 -1
  175. package/dist/{chunk-DPDV5Z4G.js → chunk-YNC5D3FT.js} +12 -12
  176. package/dist/{chunk-DPDV5Z4G.js.map → chunk-YNC5D3FT.js.map} +1 -1
  177. package/dist/{chunk-4WQB2ORG.js → chunk-YYAFHIY7.js} +15 -15
  178. package/dist/chunk-YYAFHIY7.js.map +1 -0
  179. package/dist/{chunk-OXZYP32B.js → chunk-Z6S4MWSR.js} +7 -7
  180. package/dist/{chunk-OXZYP32B.js.map → chunk-Z6S4MWSR.js.map} +1 -1
  181. package/dist/{chunk-ZDFVYSKK.mjs → chunk-ZRQFG3L6.mjs} +5 -5
  182. package/dist/{chunk-ZDFVYSKK.mjs.map → chunk-ZRQFG3L6.mjs.map} +1 -1
  183. package/dist/cli/agent/checks.d.ts.map +1 -1
  184. package/dist/cli/agent/ssr-bailout.d.ts +27 -0
  185. package/dist/cli/agent/ssr-bailout.d.ts.map +1 -0
  186. package/dist/cli/agent/ssr-bailout.test.d.ts +2 -0
  187. package/dist/cli/agent/ssr-bailout.test.d.ts.map +1 -0
  188. package/dist/cli/codemod/transforms.d.ts.map +1 -1
  189. package/dist/cli/index.js +38 -51
  190. package/dist/cli/index.js.map +1 -1
  191. package/dist/cli/index.mjs +36 -49
  192. package/dist/cli/index.mjs.map +1 -1
  193. package/dist/cli/migrator/index.d.ts.map +1 -1
  194. package/dist/client/index.d.ts +1 -0
  195. package/dist/client/index.d.ts.map +1 -1
  196. package/dist/client/index.js +20 -7
  197. package/dist/client/index.js.map +1 -1
  198. package/dist/client/index.mjs +5 -4
  199. package/dist/client/index.mjs.map +1 -1
  200. package/dist/cms/index.js.map +1 -1
  201. package/dist/cms/index.mjs.map +1 -1
  202. package/dist/cms/sanity-image.d.ts +1 -1
  203. package/dist/commerce/index.js +58 -58
  204. package/dist/commerce/index.mjs +7 -7
  205. package/dist/engage/ChatWidget.d.ts.map +1 -1
  206. package/dist/engage/EngageWidget.d.ts +3 -4
  207. package/dist/engage/EngageWidget.d.ts.map +1 -1
  208. package/dist/engage/chat-launcher.test.d.ts +2 -0
  209. package/dist/engage/chat-launcher.test.d.ts.map +1 -0
  210. package/dist/engage/index.js +12 -10
  211. package/dist/engage/index.js.map +1 -1
  212. package/dist/engage/index.mjs +9 -7
  213. package/dist/engage/index.mjs.map +1 -1
  214. package/dist/engage/launcher-placement.d.ts +56 -0
  215. package/dist/engage/launcher-placement.d.ts.map +1 -0
  216. package/dist/engage/launcher-placement.test.d.ts +2 -0
  217. package/dist/engage/launcher-placement.test.d.ts.map +1 -0
  218. package/dist/engage/types.d.ts +41 -7
  219. package/dist/engage/types.d.ts.map +1 -1
  220. package/dist/fleet/index.js +8 -8
  221. package/dist/fleet/index.mjs +4 -4
  222. package/dist/forms/index.js +16 -16
  223. package/dist/forms/index.mjs +9 -9
  224. package/dist/forms/server.js +10 -10
  225. package/dist/forms/server.mjs +8 -8
  226. package/dist/forms/static.js +7 -7
  227. package/dist/forms/static.mjs +6 -6
  228. package/dist/images/ManagedImage.d.ts.map +1 -1
  229. package/dist/images/index.js +11 -11
  230. package/dist/images/index.mjs +4 -4
  231. package/dist/index.js +65 -65
  232. package/dist/index.mjs +11 -11
  233. package/dist/layout/SiteKitClientProviders.d.ts.map +1 -1
  234. package/dist/layout/client.d.ts.map +1 -1
  235. package/dist/layout/client.js +8 -8
  236. package/dist/layout/client.mjs +7 -7
  237. package/dist/layout/index.js +10 -10
  238. package/dist/layout/index.mjs +8 -8
  239. package/dist/layout/types.d.ts +7 -3
  240. package/dist/layout/types.d.ts.map +1 -1
  241. package/dist/llms/generateLLMsTxt.d.ts.map +1 -1
  242. package/dist/llms/index.js +12 -12
  243. package/dist/llms/index.mjs +2 -2
  244. package/dist/llms/types.d.ts +7 -1
  245. package/dist/llms/types.d.ts.map +1 -1
  246. package/dist/maps/index.js +5 -5
  247. package/dist/maps/index.mjs +3 -3
  248. package/dist/mcp/WebMcpTools.d.ts +5 -2
  249. package/dist/mcp/WebMcpTools.d.ts.map +1 -1
  250. package/dist/mcp/client.js.map +1 -1
  251. package/dist/mcp/client.mjs.map +1 -1
  252. package/dist/search/index.js +4 -4
  253. package/dist/search/index.mjs +3 -3
  254. package/dist/seo/LocationPageContent.d.ts +6 -5
  255. package/dist/seo/LocationPageContent.d.ts.map +1 -1
  256. package/dist/seo/api.d.ts +4 -5
  257. package/dist/seo/api.d.ts.map +1 -1
  258. package/dist/seo/client.js +5 -5
  259. package/dist/seo/client.mjs +4 -4
  260. package/dist/seo/index.js +42 -42
  261. package/dist/seo/index.js.map +1 -1
  262. package/dist/seo/index.mjs +8 -8
  263. package/dist/seo/index.mjs.map +1 -1
  264. package/dist/seo/routing.d.ts +9 -23
  265. package/dist/seo/routing.d.ts.map +1 -1
  266. package/dist/seo/server-api.d.ts +11 -5
  267. package/dist/seo/server-api.d.ts.map +1 -1
  268. package/dist/seo/server.js +18 -18
  269. package/dist/seo/server.mjs +2 -2
  270. package/dist/server/index.js +3 -3
  271. package/dist/server/index.mjs +2 -2
  272. package/dist/{server-api-HW4PL2L2.mjs → server-api-RG3ZL3DV.mjs} +3 -3
  273. package/dist/{server-api-HW4PL2L2.mjs.map → server-api-RG3ZL3DV.mjs.map} +1 -1
  274. package/dist/{server-api-DB2SIUP4.js → server-api-RYJQAUGO.js} +21 -21
  275. package/dist/{server-api-DB2SIUP4.js.map → server-api-RYJQAUGO.js.map} +1 -1
  276. package/dist/shared/version.d.ts +1 -1
  277. package/dist/shared/visual-viewport-gap.d.ts +52 -0
  278. package/dist/shared/visual-viewport-gap.d.ts.map +1 -0
  279. package/dist/shared/visual-viewport-gap.test.d.ts +2 -0
  280. package/dist/shared/visual-viewport-gap.test.d.ts.map +1 -0
  281. package/dist/signal/index.js +11 -11
  282. package/dist/signal/index.mjs +2 -2
  283. package/dist/sitemap/index.js +2 -2
  284. package/dist/sitemap/index.mjs +1 -1
  285. package/dist/sync/index.js +17 -17
  286. package/dist/sync/index.mjs +4 -4
  287. package/dist/types.d.ts +9 -0
  288. package/dist/types.d.ts.map +1 -1
  289. package/package.json +1 -1
  290. package/skills/site-kit/SKILL.md +8 -3
  291. package/dist/AnalyticsProvider-2XIOMRCN.mjs +0 -11
  292. package/dist/AnalyticsProvider-Y2P2BPOI.js +0 -32
  293. package/dist/ChatWidget-2OFWPCWF.js +0 -20
  294. package/dist/ChatWidget-4AOGHYXQ.mjs +0 -11
  295. package/dist/EngageWidget-SFO2XRNG.mjs +0 -9
  296. package/dist/EngageWidget-T4KAAD3G.js +0 -18
  297. package/dist/ManagedForm-5G37EDJT.mjs +0 -14
  298. package/dist/ManagedForm-JCHGBBQW.js +0 -23
  299. package/dist/SitemapSync-3LUZWBTB.js +0 -18
  300. package/dist/SitemapSync-MYSTLJOM.mjs +0 -9
  301. package/dist/api-N5OLQXYN.js.map +0 -1
  302. package/dist/api-NTHZ6PAW.mjs.map +0 -1
  303. package/dist/chunk-3DPXOZAU.mjs.map +0 -1
  304. package/dist/chunk-4WQB2ORG.js.map +0 -1
  305. package/dist/chunk-7IPSQ5JR.js.map +0 -1
  306. package/dist/chunk-7U7C6XRI.mjs +0 -6
  307. package/dist/chunk-ACTLQ2RH.mjs.map +0 -1
  308. package/dist/chunk-AWFZIXCT.js.map +0 -1
  309. package/dist/chunk-B4BFQSSS.mjs.map +0 -1
  310. package/dist/chunk-HMFFAUCD.js.map +0 -1
  311. package/dist/chunk-KMGGAL2X.js.map +0 -1
  312. package/dist/chunk-L2LJQIM3.js.map +0 -1
  313. package/dist/chunk-N6AVWMIB.mjs.map +0 -1
  314. package/dist/chunk-NUH245XK.mjs.map +0 -1
  315. package/dist/chunk-QWLL3B6U.js.map +0 -1
  316. package/dist/chunk-SJXGIUHP.mjs.map +0 -1
  317. package/dist/chunk-SZHKNGNR.mjs.map +0 -1
  318. package/dist/chunk-UTOHMK52.js +0 -8
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/engage/EchoUiActions.tsx","../src/engage/ChatWidget.tsx"],"names":["useForm","jsx","jsxs","alpha","useState","useRef","chatLauncherStyles","useEffect","sonorFetch","useCallback","messages","Fragment","ReactMarkdown"],"mappings":"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","file":"chunk-2OU4KBUN.js","sourcesContent":["/**\n * @sonordev/site-kit/engage - Echo UI Actions\n *\n * Renders the optional `uiActions` the visitor Echo concierge returns alongside\n * a chat reply (see signal-api echo.service.ts). Rendered beneath the assistant\n * message in ChatWidget, on-brand with the widget's primary-color tokens.\n *\n * - show_form → compact inline managed form (reuses the canonical\n * forms `useForm` fetch/validate/submit path) with optional prefill.\n * - suggest_action → clickable chip; sends the message as the next turn, or\n * navigates when the action is a path/URL.\n * - show_portfolio_item → intentionally ignored. Portfolio is Upforge-specific\n * and Upforge runs its own custom Echo chat, not this widget.\n */\n\n'use client'\n\nimport React from 'react'\nimport { useForm } from '../forms/useForm'\nimport type { FormField } from '../forms/types'\nimport type { UiAction } from './types'\n\n// ---------------------------------------------------------------------------\n// Helpers\n// ---------------------------------------------------------------------------\n\n/** rgba() from the widget's primary-color RGB triplet (mirrors ChatWidget.hexAlpha). */\nfunction alpha(rgb: string, a: number): string {\n return `rgba(var(--sk-primary-rgb, ${rgb}), ${a})`\n}\n\nfunction asString(v: unknown): string | undefined {\n return typeof v === 'string' && v.trim() ? v : undefined\n}\n\nfunction asRecord(v: unknown): Record<string, unknown> | undefined {\n return v && typeof v === 'object' && !Array.isArray(v) ? (v as Record<string, unknown>) : undefined\n}\n\n/** A path / URL / scheme we should navigate to rather than send as a chat turn. */\nfunction isNavigable(action: string): boolean {\n return /^(https?:\\/\\/|\\/|#|tel:|mailto:)/i.test(action.trim())\n}\n\n// ---------------------------------------------------------------------------\n// Inline managed form (show_form)\n// ---------------------------------------------------------------------------\n\ninterface InlineManagedFormProps {\n slug: string\n prefill?: Record<string, unknown>\n primaryColor: string\n primaryRgb: string\n}\n\nconst DISPLAY_ONLY: ReadonlyArray<string> = ['heading', 'section_header', 'paragraph']\n\nfunction InlineManagedForm({ slug, prefill, primaryColor, primaryRgb }: InlineManagedFormProps) {\n const {\n form,\n isLoading,\n fetchError,\n submitError,\n visibleFields,\n values,\n errors,\n setFieldValue,\n submit,\n isSubmitting,\n isComplete,\n } = useForm(slug, { initialValues: prefill || {} })\n\n const cardStyle: React.CSSProperties = {\n marginTop: 8,\n padding: 12,\n borderRadius: 12,\n border: `1px solid ${alpha(primaryRgb, 0.25)}`,\n backgroundColor: alpha(primaryRgb, 0.04),\n }\n\n if (isLoading) {\n return (\n <div style={cardStyle}>\n <p style={{ margin: 0, fontSize: 13, color: 'var(--sk-text-tertiary, #9ca3af)' }}>Loading form…</p>\n </div>\n )\n }\n\n if (fetchError || !form) {\n return (\n <div style={cardStyle}>\n <p style={{ margin: 0, fontSize: 13, color: 'var(--sk-text-tertiary, #9ca3af)' }}>\n This form is unavailable right now.\n </p>\n </div>\n )\n }\n\n if (isComplete) {\n return (\n <div style={cardStyle} role=\"status\" aria-live=\"polite\">\n <p style={{ margin: 0, fontSize: 13.5, color: 'var(--sk-text-primary, #111827)', lineHeight: 1.5 }}>\n {form.success_message}\n </p>\n </div>\n )\n }\n\n const inputBase: React.CSSProperties = {\n width: '100%',\n padding: '8px 10px',\n borderRadius: 8,\n // Longhand (not the `border` shorthand) so the error-state `borderColor`\n // override doesn't mix shorthand+longhand and trigger React's style warning.\n borderWidth: 1,\n borderStyle: 'solid',\n borderColor: 'var(--sk-border, #e5e7eb)',\n backgroundColor: 'var(--sk-bg, #ffffff)',\n color: 'var(--sk-text-primary, #111827)',\n fontSize: 13.5,\n boxSizing: 'border-box',\n outline: 'none',\n }\n\n const renderField = (field: FormField) => {\n const value = values[field.slug]\n const strValue = value == null ? '' : String(value)\n const err = errors[field.slug]\n const labelEl =\n !field.hide_label && field.label ? (\n <label\n htmlFor={`echo-form-${form.id}-${field.slug}`}\n style={{ display: 'block', fontSize: 12.5, fontWeight: 600, marginBottom: 4, color: 'var(--sk-text-secondary, #4b5563)' }}\n >\n {field.label}\n {field.is_required ? <span style={{ color: 'var(--sk-error, #dc2626)' }}> *</span> : null}\n </label>\n ) : null\n const id = `echo-form-${form.id}-${field.slug}`\n const common = {\n id,\n placeholder: field.placeholder || (field.hide_label ? field.label : undefined),\n 'aria-invalid': !!err,\n style: { ...inputBase, ...(err ? { borderColor: 'var(--sk-error, #dc2626)' } : {}) },\n } as const\n\n let control: React.ReactNode\n switch (field.field_type) {\n case 'textarea':\n control = (\n <textarea\n {...common}\n rows={3}\n value={strValue}\n onChange={(e) => setFieldValue(field.slug, e.target.value)}\n style={{ ...common.style, resize: 'vertical' as const }}\n />\n )\n break\n case 'select':\n control = (\n <select {...common} value={strValue} onChange={(e) => setFieldValue(field.slug, e.target.value)}>\n <option value=\"\">{field.placeholder || 'Select…'}</option>\n {(field.options || []).map((opt) => (\n <option key={opt.value} value={opt.value}>\n {opt.label}\n </option>\n ))}\n </select>\n )\n break\n case 'radio':\n control = (\n <div role=\"radiogroup\" style={{ display: 'flex', flexDirection: 'column', gap: 4 }}>\n {(field.options || []).map((opt) => (\n <label key={opt.value} style={{ display: 'flex', alignItems: 'center', gap: 6, fontSize: 13, cursor: 'pointer' }}>\n <input\n type=\"radio\"\n name={id}\n checked={strValue === opt.value}\n onChange={() => setFieldValue(field.slug, opt.value)}\n />\n {opt.label}\n </label>\n ))}\n </div>\n )\n break\n case 'checkbox':\n control = (\n <label style={{ display: 'flex', alignItems: 'center', gap: 6, fontSize: 13, cursor: 'pointer' }}>\n <input\n type=\"checkbox\"\n checked={value === true || value === 'true'}\n onChange={(e) => setFieldValue(field.slug, e.target.checked)}\n />\n {field.placeholder || field.label}\n </label>\n )\n break\n default: {\n const typeMap: Record<string, string> = {\n email: 'email',\n phone: 'tel',\n tel: 'tel',\n number: 'number',\n date: 'date',\n time: 'time',\n datetime: 'datetime-local',\n }\n control = (\n <input\n {...common}\n type={typeMap[field.field_type] || 'text'}\n value={strValue}\n onChange={(e) => setFieldValue(field.slug, e.target.value)}\n />\n )\n }\n }\n\n return (\n <div key={field.id || field.slug} style={{ marginBottom: 8 }}>\n {field.field_type === 'checkbox' ? null : labelEl}\n {control}\n {err ? <p style={{ margin: '4px 0 0', fontSize: 11.5, color: 'var(--sk-error, #dc2626)' }}>{err}</p> : null}\n </div>\n )\n }\n\n return (\n <form\n style={cardStyle}\n onSubmit={(e) => {\n e.preventDefault()\n void submit()\n }}\n >\n {form.name ? (\n <div style={{ fontSize: 13.5, fontWeight: 600, marginBottom: 8, color: 'var(--sk-text-primary, #111827)' }}>\n {form.name}\n </div>\n ) : null}\n\n {visibleFields.map((field) => {\n if (field.field_type === 'hidden') return null\n if (DISPLAY_ONLY.includes(field.field_type)) {\n return (\n <p key={field.id || field.slug} style={{ margin: '0 0 8px', fontSize: 12.5, color: 'var(--sk-text-secondary, #4b5563)' }}>\n {field.label}\n </p>\n )\n }\n return renderField(field)\n })}\n\n {submitError ? (\n <p role=\"alert\" style={{ margin: '0 0 8px', fontSize: 12, color: 'var(--sk-error, #dc2626)' }}>\n {submitError}\n </p>\n ) : null}\n\n <button\n type=\"submit\"\n disabled={isSubmitting}\n style={{\n width: '100%',\n padding: '9px 14px',\n borderRadius: 8,\n border: 'none',\n backgroundColor: primaryColor,\n color: '#fff',\n fontSize: 13.5,\n fontWeight: 600,\n cursor: isSubmitting ? 'default' : 'pointer',\n opacity: isSubmitting ? 0.7 : 1,\n }}\n >\n {isSubmitting ? 'Sending…' : form.submit_button_text || 'Submit'}\n </button>\n </form>\n )\n}\n\n// ---------------------------------------------------------------------------\n// Suggestion-action chip (suggest_action)\n// ---------------------------------------------------------------------------\n\ninterface SuggestActionChipProps {\n action?: string\n message: string\n primaryColor: string\n primaryRgb: string\n onSuggest: (action: string | undefined, message: string) => void\n}\n\nfunction SuggestActionChip({ action, message, primaryColor, primaryRgb, onSuggest }: SuggestActionChipProps) {\n return (\n <button\n type=\"button\"\n onClick={() => onSuggest(action, message)}\n style={{\n padding: '6px 12px',\n borderRadius: 16,\n border: `1px solid ${primaryColor}`,\n backgroundColor: alpha(primaryRgb, 0.063),\n color: primaryColor,\n fontSize: 13,\n cursor: 'pointer',\n }}\n >\n {message}\n </button>\n )\n}\n\n// ---------------------------------------------------------------------------\n// Dispatcher\n// ---------------------------------------------------------------------------\n\nexport interface EchoUiActionsProps {\n actions: UiAction[]\n primaryColor: string\n primaryRgb: string\n /** Called by a suggest_action chip — send the message as the next turn or navigate. */\n onSuggest: (action: string | undefined, message: string) => void\n}\n\nexport function EchoUiActions({ actions, primaryColor, primaryRgb, onSuggest }: EchoUiActionsProps) {\n if (!actions?.length) return null\n\n // Group the suggest_action chips so they flow together like the suggestion row.\n const chips = actions.filter((a) => a?.type === 'suggest_action')\n const forms = actions.filter((a) => a?.type === 'show_form')\n // show_portfolio_item (and any unknown type) is intentionally not rendered here.\n\n if (!chips.length && !forms.length) return null\n\n return (\n <div style={{ marginTop: 8, display: 'flex', flexDirection: 'column', gap: 8 }}>\n {forms.map((a, i) => {\n const slug = asString(a.data?.formSlug)\n if (!slug) return null\n return (\n <InlineManagedForm\n key={`form-${slug}-${i}`}\n slug={slug}\n prefill={asRecord(a.data?.prefill)}\n primaryColor={primaryColor}\n primaryRgb={primaryRgb}\n />\n )\n })}\n\n {chips.length ? (\n <div style={{ display: 'flex', flexWrap: 'wrap', gap: 6 }}>\n {chips.map((a, i) => {\n const message = asString(a.data?.message)\n const action = asString(a.data?.action)\n // A chip needs a label — fall back to the action when no message is given.\n const label = message || action\n if (!label) return null\n return (\n <SuggestActionChip\n key={`chip-${i}`}\n action={action}\n message={label}\n primaryColor={primaryColor}\n primaryRgb={primaryRgb}\n onSuggest={onSuggest}\n />\n )\n })}\n </div>\n ) : null}\n </div>\n )\n}\n\nexport { isNavigable }\n","/**\n * @sonordev/site-kit/engage - Chat Widget (Redesigned)\n *\n * Features:\n * - Pulls brand colors (primary/secondary) + business info from project settings via API\n * - Welcome screen with quick-action chips before first message\n * - Echo (AI) chat when mode is ai / hybrid; gateway returns Echo responses\n * - Automated handoff to live agent (re-checks availability; if agents online, POST handoff)\n * - Managed offline form when nobody is online (configurable heading/subheading)\n * - Socket.io with auto-reconnect for real-time live chat\n * - Proper AI → Live → Offline sequence routing\n */\n\n'use client'\n\nimport React, { useState, useRef, useEffect, useCallback } from 'react'\nimport ReactMarkdown from 'react-markdown'\nimport type { ChatConfig, UiAction } from './types'\nimport { EchoUiActions, isNavigable } from './EchoUiActions'\nimport { chatLauncherStyles } from './launcher-placement'\n// Canonical transport — refreshes a stale minted token and retries once on 401.\n// The credential is passed via options.apiKey (NOT an x-api-key/Authorization\n// header) so sonorFetch injects the freshest token; a hand-set header would pin\n// the stale build-time seed and 401.\nimport { sonorFetch } from '../shared/sonorFetch'\n\n// Socket type — the actual library is lazy-loaded via socket-loader.ts\n// to keep socket.io-client out of the main bundle entirely.\ntype Socket = { connected: boolean; disconnect: () => void; on: (ev: string, fn: (...args: any[]) => void) => void; emit: (ev: string, data?: any) => void }\n\n// ---------------------------------------------------------------------------\n// Types\n// ---------------------------------------------------------------------------\n\ninterface ChatWidgetProps {\n /** Optional: resolved from API key via project-info when not provided */\n projectId?: string\n config?: Partial<ChatConfig>\n apiUrl?: string\n /** Signal API base URL for direct AI chat (no Portal passthrough) */\n signalUrl?: string\n /** Clickable question chips shown in the welcome screen before the first message */\n suggested_questions?: string[]\n /** Name shown in the chat header for the AI assistant (overrides API config) */\n assistant_name?: string\n /** Welcome message shown when chat first opens (overrides API config) */\n welcome_message?: string\n /** Avatar URL for the assistant shown in the header */\n assistant_avatar?: string\n}\n\ninterface MessageAttachment {\n name: string\n url: string\n size?: number\n mimeType?: string\n}\n\ninterface Message {\n id: string\n role: 'user' | 'assistant' | 'agent' | 'system'\n content: string\n timestamp: Date\n agentName?: string\n attachments?: MessageAttachment[]\n suggestions?: string[]\n sendFailed?: boolean\n /** When true, show \"Talk to a person\" button (AI cannot answer or user requested handoff) */\n offerHandoff?: boolean\n /** Optional inline UI actions returned by the visitor Echo endpoint (forms, suggestion chips). */\n uiActions?: UiAction[]\n}\n\ninterface AvailabilityStatus {\n available: boolean\n mode: 'live' | 'ai' | 'offline'\n agentsOnline: number\n operatingHoursActive: boolean\n}\n\ninterface OfflineFormData {\n name: string\n email: string\n phone: string\n message: string\n}\n\n/** Enriched widget config from API (engage_chat_config + project settings) */\ninterface WidgetConfigFromApi {\n // Chat config fields\n is_enabled?: boolean\n position?: string\n initial_message?: string\n welcome_message?: string\n form_heading?: string\n form_description?: string\n offline_message?: string\n offlineFormSlug?: string\n chat_mode?: string\n signal_enabled?: boolean\n offline_mode?: string\n offline_heading?: string\n offline_subheading?: string\n welcome_screen_enabled?: boolean\n welcome_quick_actions?: string[]\n handoff_enabled?: boolean\n show_powered_by?: boolean\n business_hours?: any\n // Branding from Project Settings\n brand_primary?: string\n logo_url?: string\n project_name?: string\n // Business info from Project Settings\n business_info?: {\n name?: string\n phone?: string\n domain?: string\n address?: string\n hours?: any\n }\n}\n\n// ---------------------------------------------------------------------------\n// Helpers\n// ---------------------------------------------------------------------------\n\nfunction getApiConfig() {\n const isDev = typeof process !== 'undefined' && process.env?.NODE_ENV === 'development'\n const defaultApiUrl = isDev && process.env?.SONOR_API_URL\n ? process.env.SONOR_API_URL\n : 'https://api.sonor.io'\n const defaultSignalUrl = isDev && (process.env?.SONOR_SIGNAL_URL || process.env?.NEXT_PUBLIC_SIGNAL_API_URL)\n ? (process.env.SONOR_SIGNAL_URL || process.env.NEXT_PUBLIC_SIGNAL_API_URL)\n : 'https://signal.sonor.io'\n const apiUrl =\n typeof window !== 'undefined'\n ? (window as any).__SITE_KIT_API_URL__ || defaultApiUrl\n : defaultApiUrl\n const apiKey = typeof window !== 'undefined' ? (window as any).__SITE_KIT_API_KEY__ : undefined\n const signalUrl =\n typeof window !== 'undefined'\n ? (window as any).__SITE_KIT_SIGNAL_URL__ || defaultSignalUrl\n : defaultSignalUrl\n return { apiUrl, apiKey, signalUrl }\n}\n\nfunction generateVisitorId(): string {\n const stored = typeof localStorage !== 'undefined' ? localStorage.getItem('engage_visitor_id') : null\n if (stored) return stored\n const id = `visitor_${Date.now()}_${Math.random().toString(36).substr(2, 9)}`\n if (typeof localStorage !== 'undefined') localStorage.setItem('engage_visitor_id', id)\n return id\n}\n\n/** Convert plain URLs in text to markdown links so they render as buttons. Skips URLs already inside markdown links. */\nfunction linkifyUrls(text: string): string {\n return text.replace(\n /(^|[^(\\]])(https?:\\/\\/[^\\s<>\"{}|\\\\^`[\\])]+)/g,\n (_, before, url) => `${before}[${url}](${url})`,\n )\n}\n\n/** Detect if text expresses intent to talk to a live person */\nfunction userRequestedHandoff(text: string): boolean {\n const lower = text.toLowerCase().trim()\n const patterns = [\n /\\b(talk|speak)\\s+(to|with)\\s+(a\\s+)?(person|human|agent|representative|someone)\\b/,\n /\\b(real|live)\\s+(person|human|agent|support)\\b/,\n /\\bconnect\\s+(me\\s+)?(with|to)\\s+(a\\s+)?(person|human|agent)\\b/,\n /\\b(need|want)\\s+(to\\s+)?(talk|speak)\\s+(to|with)\\s+(someone|a\\s+person)\\b/,\n /\\bhuman\\s+(support|agent|help)\\b/,\n /\\b(talk|speak)\\s+to\\s+(a\\s+)?person\\b/,\n /\\bget\\s+(a\\s+)?(person|human)\\b/,\n ]\n return patterns.some((p) => p.test(lower))\n}\n\n/** Darken / lighten a hex colour */\nfunction adjustColor(hex: string, amount: number): string {\n const num = parseInt(hex.replace('#', ''), 16)\n const r = Math.min(255, Math.max(0, (num >> 16) + amount))\n const g = Math.min(255, Math.max(0, ((num >> 8) & 0x00ff) + amount))\n const b = Math.min(255, Math.max(0, (num & 0x0000ff) + amount))\n return `#${((1 << 24) | (r << 16) | (g << 8) | b).toString(16).slice(1)}`\n}\n\n/** Determine if a hex colour is light enough to need dark text */\nfunction isLightColor(hex: string): boolean {\n const num = parseInt(hex.replace('#', ''), 16)\n const r = num >> 16\n const g = (num >> 8) & 0x00ff\n const b = num & 0x0000ff\n return (r * 299 + g * 587 + b * 114) / 1000 > 160\n}\n\n/**\n * SSR-safe brand color: same on server and first client render (hydration).\n * `--sk-primary` is applied after mount in useEffect — reading getComputedStyle during render\n * caused server (API/config hex) vs client (CSS rgb) mismatches on the launcher button.\n */\nfunction staticPrimaryColor(apiFallback: string | undefined, hardDefault: string): string {\n return apiFallback || hardDefault\n}\n\n/**\n * Convert a hex color to an \"r, g, b\" string for use in rgba().\n * Returns the fallback if the input is not a valid hex color.\n */\nfunction hexToRgbString(hex: string, fallback = '37, 99, 235'): string {\n const match = hex.replace('#', '').match(/^([0-9a-f]{2})([0-9a-f]{2})([0-9a-f]{2})$/i)\n if (!match) return fallback\n return `${parseInt(match[1], 16)}, ${parseInt(match[2], 16)}, ${parseInt(match[3], 16)}`\n}\n\n/**\n * Generate an rgba() value from a CSS custom property holding an RGB triplet.\n * Usage: hexAlpha('--sk-primary-rgb', 0.125) → \"rgba(var(--sk-primary-rgb, 37, 99, 235), 0.125)\"\n */\nfunction hexAlpha(rgbVar: string, alpha: number, fallbackRgb = '37, 99, 235'): string {\n return `rgba(var(${rgbVar}, ${fallbackRgb}), ${alpha})`\n}\n\n// ---------------------------------------------------------------------------\n// Component\n// ---------------------------------------------------------------------------\n\nexport function ChatWidget({ projectId: propProjectId, config, apiUrl: propApiUrl, signalUrl: propSignalUrl, suggested_questions: propSuggestedQuestions, assistant_name: propAssistantName, welcome_message: propWelcomeMessage, assistant_avatar: propAssistantAvatar }: ChatWidgetProps) {\n // Resolve projectId from API key when not provided (backend derives project from key)\n const [resolvedProjectId, setResolvedProjectId] = useState<string | null>(propProjectId || null)\n const projectId = propProjectId || resolvedProjectId || ''\n\n // State -------------------------------------------------------------------\n const [isOpen, setIsOpen] = useState(false)\n const [messages, setMessages] = useState<Message[]>([])\n const [inputValue, setInputValue] = useState('')\n const [isLoading, setIsLoading] = useState(false)\n const [availability, setAvailability] = useState<AvailabilityStatus | null>(null)\n const [sessionId, setSessionId] = useState<string | null>(null)\n const [visitorId] = useState(generateVisitorId)\n const [agentTyping, setAgentTyping] = useState(false)\n const [showOfflineForm, setShowOfflineForm] = useState(false)\n const [offlineForm, setOfflineForm] = useState<OfflineFormData>({ name: '', email: '', phone: '', message: '' })\n const [offlineSubmitted, setOfflineSubmitted] = useState(false)\n const [connectionStatus, setConnectionStatus] = useState<'connecting' | 'connected' | 'disconnected'>('disconnected')\n const [widgetConfig, setWidgetConfig] = useState<WidgetConfigFromApi | null>(null)\n const [handoffOfflinePrompt, setHandoffOfflinePrompt] = useState<string | null>(null)\n const [pendingFiles, setPendingFiles] = useState<File[]>([])\n const [lastFailedSend, setLastFailedSend] = useState<{ content: string; attachments: MessageAttachment[] } | null>(null)\n const [showWelcome, setShowWelcome] = useState(true)\n const [checkingAvailability, setCheckingAvailability] = useState(false)\n const [checkingHandoff, setCheckingHandoff] = useState(false)\n const [isHandedOff, setIsHandedOff] = useState(false)\n const fileInputRef = useRef<HTMLInputElement>(null)\n const pendingInitialMessageRef = useRef<string | null>(null)\n const apiKeyMissingWarnedRef = useRef(false)\n const siteContextRef = useRef<string | null>(null)\n function ensureApiKey(): string | null {\n const { apiKey } = getApiConfig()\n if (apiKey) return apiKey\n if (!apiKeyMissingWarnedRef.current) {\n apiKeyMissingWarnedRef.current = true\n console.warn('[ChatWidget] No site credential found. Render SiteKitLayout in app/layout.tsx and set SONOR_API_KEY on the server.')\n }\n return null\n }\n\n const messagesEndRef = useRef<HTMLDivElement>(null)\n const inputRef = useRef<HTMLInputElement>(null)\n const socketRef = useRef<Socket | null>(null)\n const pollingIntervalRef = useRef<ReturnType<typeof setInterval> | null>(null)\n\n // Derived values ----------------------------------------------------------\n const position = config?.position || widgetConfig?.position || 'bottom-right'\n // Launcher and popup placement come from one clearance, so the popup always\n // opens above the launcher wherever the site has moved it, and from one\n // layer, so it always stacks beneath the launcher.\n const placement = chatLauncherStyles({\n position: position === 'bottom-left' ? 'bottom-left' : 'bottom-right',\n offsetBottom: config?.offsetBottom,\n zIndex: config?.zIndex,\n })\n const primaryFallback = staticPrimaryColor(widgetConfig?.brand_primary || config?.buttonColor, '#2563eb')\n const [primaryFromCssVar, setPrimaryFromCssVar] = useState<string | null>(null)\n const primaryColor = primaryFromCssVar ?? primaryFallback\n const primaryRgb = hexToRgbString(primaryColor)\n\n useEffect(() => {\n const cssValue = getComputedStyle(document.documentElement).getPropertyValue('--sk-primary').trim()\n setPrimaryFromCssVar(cssValue || null)\n }, [])\n // assistant_name prop overrides API config; falls back to project/business name\n const businessName = propAssistantName || widgetConfig?.project_name || widgetConfig?.business_info?.name || 'Chat with us'\n // assistant_avatar prop overrides logo from API config\n const logoUrl = propAssistantAvatar || widgetConfig?.logo_url || null\n const welcomeEnabled = widgetConfig?.welcome_screen_enabled !== false\n // suggested_questions prop overrides API welcome_quick_actions\n const quickActions: string[] = propSuggestedQuestions ?? (Array.isArray(widgetConfig?.welcome_quick_actions) ? widgetConfig.welcome_quick_actions : [])\n const showPoweredBy = widgetConfig?.show_powered_by !== false\n // welcome_message prop takes highest priority\n const welcomeMessage =\n propWelcomeMessage ?? widgetConfig?.initial_message ?? widgetConfig?.welcome_message ?? config?.welcomeMessage ?? 'Hi! How can I help you today?'\n const offlineHeading = widgetConfig?.offline_heading ?? 'No agents available right now'\n const offlineSubheading =\n handoffOfflinePrompt ?? widgetConfig?.offline_subheading ?? widgetConfig?.form_description ?? widgetConfig?.offline_message ?? config?.offlineMessage ?? \"Leave us a message and we'll get back to you!\"\n\n const baseUrl = propApiUrl || getApiConfig().apiUrl\n const signalUrl = propSignalUrl || getApiConfig().signalUrl\n\n // Resolve projectId from API key when not provided\n useEffect(() => {\n if (propProjectId || resolvedProjectId) return\n const { apiKey } = getApiConfig()\n if (!apiKey) return\n let cancelled = false\n sonorFetch(`${baseUrl}/api/public/seo/project-info`, {}, { apiKey, retries: 0 })\n .then((res) => (res.ok ? res.json() : null))\n .then((data) => {\n if (cancelled || !data?.valid || !data?.project_id) return\n setResolvedProjectId(data.project_id)\n })\n .catch(() => {})\n return () => { cancelled = true }\n }, [propProjectId, resolvedProjectId, baseUrl])\n\n // -------------------------------------------------------------------------\n // API calls\n // -------------------------------------------------------------------------\n\n const fetchWidgetConfig = useCallback(async () => {\n if (!projectId) return\n const apiKey = ensureApiKey()\n if (!apiKey) return\n try {\n const response = await sonorFetch(`${baseUrl}/engage/widget/config?projectId=${projectId}`, {}, { apiKey, retries: 0 })\n if (response.ok) {\n const { data } = await response.json()\n setWidgetConfig(data ?? null)\n }\n } catch (error) {\n if (process.env.NODE_ENV === 'development') {\n console.warn('[ChatWidget] Config fetch failed:', error instanceof Error ? error.message : error)\n }\n }\n }, [projectId, baseUrl])\n\n const checkAvailability = useCallback(async (): Promise<AvailabilityStatus | null> => {\n if (!projectId) return null\n const apiKey = ensureApiKey()\n if (!apiKey) return null\n try {\n const response = await sonorFetch(`${baseUrl}/engage/widget/availability?projectId=${projectId}`, {}, { apiKey, retries: 0 })\n if (response.ok) {\n const { data } = await response.json()\n setAvailability(data)\n return data\n }\n } catch (error) {\n if (process.env.NODE_ENV === 'development') {\n console.warn('[ChatWidget] Availability check failed:', error instanceof Error ? error.message : error)\n }\n }\n return null\n }, [projectId, baseUrl])\n\n const initSession = useCallback(async () => {\n const apiKey = ensureApiKey()\n if (!apiKey) return null\n try {\n const response = await sonorFetch(`${baseUrl}/engage/widget/session`, {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify({\n projectId,\n visitorId,\n sourceUrl: typeof window !== 'undefined' ? window.location.href : '',\n userAgent: typeof navigator !== 'undefined' ? navigator.userAgent : '',\n }),\n }, { apiKey, retries: 0 })\n if (response.ok) {\n const { data } = await response.json()\n const session = data.session ?? data\n const sid = session?.id ?? session?.session_id ?? data.id ?? data.session_id\n const signalEnabled = session?.chat_mode === 'ai' || session?.chat_mode === 'hybrid'\n setSessionId(sid)\n const messages = session?.messages ?? data.messages ?? []\n if (messages.length > 0) {\n setMessages(\n messages.map((m: any) => ({\n id: m.id,\n role: m.role === 'visitor' ? 'user' : m.role,\n content: m.content,\n timestamp: new Date(m.created_at),\n agentName: m.sender_name,\n })),\n )\n }\n return { id: sid, signalEnabled }\n }\n } catch (error) {\n console.error('[ChatWidget] Session init failed:', error)\n }\n return null\n }, [projectId, visitorId, baseUrl])\n\n /** Fetch llms.txt from same origin when chat opens (for site context in Echo) */\n const fetchSiteContext = useCallback(async () => {\n if (siteContextRef.current) return siteContextRef.current\n try {\n const base = typeof window !== 'undefined' ? window.location.origin : ''\n const res = await fetch(`${base}/llms.txt`, { cache: 'no-store' })\n if (res.ok) {\n const text = await res.text()\n if (text?.trim()) siteContextRef.current = text.trim()\n }\n } catch {\n // Ignore - Signal will fall back to fetching from project domain\n }\n return siteContextRef.current\n }, [])\n\n /** Send message directly to Signal API (no Portal passthrough). Auth via x-api-key. */\n const sendToSignalApi = useCallback(\n async (content: string, conversationId?: string | null) => {\n const apiKey = ensureApiKey()\n if (!apiKey) throw new Error('API key required for chat')\n\n const url = `${signalUrl.replace(/\\/$/, '')}/echo/public/chat`\n const siteContext = await fetchSiteContext()\n const body = {\n message: content,\n visitorId,\n ...(conversationId ? { conversationId } : {}),\n pageUrl: typeof window !== 'undefined' ? window.location.href : undefined,\n ...(siteContext ? { siteContext } : {}),\n }\n const res = await sonorFetch(url, {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n },\n body: JSON.stringify(body),\n }, { apiKey, retries: 0 })\n const json = await res.json()\n if (!res.ok) {\n throw new Error(json?.error?.message || json?.message || `Signal API error: ${res.status}`)\n }\n const data = json?.data ?? json\n const aiContent = data?.content ?? data?.response ?? data?.message ?? \"I'm sorry, I couldn't process that.\"\n const suggestions = data?.suggestions\n const offerHandoff = data?.offerHandoff === true || data?.offer_handoff === true\n // Optional inline UI actions (show_form / suggest_action / …) from the Echo concierge.\n const uiActions = Array.isArray(data?.uiActions)\n ? (data.uiActions as UiAction[]).filter((a) => a && typeof a === 'object' && typeof a.type === 'string' && a.data && typeof a.data === 'object')\n : undefined\n const newConversationId = data?.conversationId ?? conversationId\n return { content: aiContent, suggestions, offerHandoff, uiActions, conversationId: newConversationId }\n },\n [signalUrl, visitorId, fetchSiteContext],\n )\n\n /**\n * Single source of truth for appending an Echo (Signal) reply as an assistant\n * message. Suggestions, inline uiActions, and the handoff offer all attach\n * here so the three send paths (initial pending message, handleSubmit, and a\n * suggest_action chip) can never drift. `probeContent` is the user text we\n * scan for an explicit handoff request.\n */\n const pushEchoReply = useCallback(\n (\n reply: { content: string; suggestions?: string[]; offerHandoff?: boolean; uiActions?: UiAction[] },\n probeContent: string,\n ) => {\n setMessages((prev) => [\n ...prev,\n {\n id: `ai-${Date.now()}`,\n role: 'assistant',\n content: reply.content,\n timestamp: new Date(),\n ...(reply.suggestions?.length ? { suggestions: reply.suggestions } : {}),\n ...(reply.uiActions?.length ? { uiActions: reply.uiActions } : {}),\n ...(reply.offerHandoff || userRequestedHandoff(probeContent) ? { offerHandoff: true } : {}),\n },\n ])\n },\n [],\n )\n\n // -------------------------------------------------------------------------\n // Socket.io message handler\n // -------------------------------------------------------------------------\n\n const handleSocketMessage = useCallback((data: any) => {\n switch (data.type || data.event) {\n case 'message': {\n const role = data.role === 'visitor' ? 'user' : data.role === 'ai' ? 'assistant' : (data.role as Message['role'])\n const newMessage: Message = {\n id: data.id || `msg-${Date.now()}`,\n role,\n content: data.content ?? '',\n timestamp: new Date(),\n agentName: data.agentName,\n ...(data.attachments?.length ? { attachments: data.attachments } : {}),\n ...(data.suggestions?.length ? { suggestions: data.suggestions as string[] } : {}),\n }\n setMessages((prev) => [...prev, newMessage])\n if (role === 'assistant' || role === 'agent') {\n setAgentTyping(false)\n setIsLoading(false)\n }\n break\n }\n case 'agent:joined':\n setMessages((prev) => [\n ...prev,\n {\n id: `system-${Date.now()}`,\n role: 'system',\n content: data.agentName ? `${data.agentName} has joined the chat.` : 'An agent has joined the chat.',\n timestamp: new Date(),\n },\n ])\n break\n case 'typing':\n setAgentTyping(data.isTyping)\n break\n case 'handoff:initiated':\n setMessages((prev) => [\n ...prev,\n { id: `system-${Date.now()}`, role: 'system', content: data.message || 'Connecting you with a team member...', timestamp: new Date() },\n ])\n break\n case 'chat:closed':\n setMessages((prev) => [\n ...prev,\n { id: `system-${Date.now()}`, role: 'system', content: data.message || 'This chat has been closed.', timestamp: new Date() },\n ])\n break\n }\n }, [])\n\n // -------------------------------------------------------------------------\n // Socket.io connection (with auto-reconnect)\n // -------------------------------------------------------------------------\n\n const connectSocket = useCallback(\n async (currentSessionId: string) => {\n if (socketRef.current?.connected) return\n\n // Disconnect any stale socket first\n if (socketRef.current) {\n socketRef.current.disconnect()\n socketRef.current = null\n }\n\n // Lazy-load socket.io via separate module so bundlers never pull it\n // into the main engage chunk (avoids massive client bundle).\n const { createSocket } = await import('./socket-loader')\n\n const namespaceUrl = `${baseUrl.replace(/\\/$/, '')}/engage/chat`\n const socket = await createSocket(namespaceUrl, {\n query: { projectId, visitorId, sessionId: currentSessionId },\n transports: ['websocket', 'polling'],\n // Auto-reconnect config\n reconnection: true,\n reconnectionAttempts: 10,\n reconnectionDelay: 1000,\n reconnectionDelayMax: 10000,\n timeout: 15000,\n })\n\n socket.on('connect', () => {\n setConnectionStatus('connected')\n console.log('[ChatWidget] Socket.io connected')\n // Re-fetch messages to catch anything missed while disconnected\n if (currentSessionId) {\n const apiKey = ensureApiKey()\n if (apiKey) {\n sonorFetch(`${baseUrl}/engage/widget/messages?sessionId=${currentSessionId}`, {}, { apiKey, retries: 0 })\n .then((res) => (res.ok ? res.json() : null))\n .then((json) => {\n const data = json?.data ?? json\n if (Array.isArray(data) && data.length) {\n setMessages((prev) => {\n const byId = new Map(prev.map((m) => [m.id, m]))\n data.forEach((m: any) =>\n byId.set(m.id, {\n id: m.id,\n role: m.role === 'visitor' ? 'user' : m.role,\n content: m.content,\n timestamp: new Date(m.created_at),\n agentName: m.sender_name,\n attachments: m.attachments,\n }),\n )\n return Array.from(byId.values()).sort((a, b) => (a.timestamp as Date).getTime() - (b.timestamp as Date).getTime())\n })\n }\n })\n .catch((err) => console.warn('[ChatWidget] Refetch messages on reconnect failed', err))\n }\n }\n\n // Retry any buffered message\n if (lastFailedSend) {\n socket.emit('visitor:message', {\n content: lastFailedSend.content,\n attachments: lastFailedSend.attachments?.length ? lastFailedSend.attachments : undefined,\n })\n setLastFailedSend(null)\n setMessages((prev) => prev.filter((m) => !m.sendFailed))\n setIsLoading(true)\n }\n })\n\n socket.on('message', (data: any) => handleSocketMessage({ type: 'message', ...data }))\n socket.on('agent:joined', (data: any) => handleSocketMessage({ type: 'agent:joined', ...data }))\n socket.on('typing', (data: any) => handleSocketMessage({ type: 'typing', ...data }))\n socket.on('handoff:initiated', (data: any) => handleSocketMessage({ type: 'handoff:initiated', ...data }))\n socket.on('chat:closed', (data: any) => handleSocketMessage({ type: 'chat:closed', ...data }))\n\n socket.on('disconnect', (reason) => {\n setConnectionStatus('disconnected')\n console.log('[ChatWidget] Socket disconnected:', reason)\n })\n\n socket.on('reconnect_attempt', (attempt) => {\n setConnectionStatus('connecting')\n console.log(`[ChatWidget] Reconnect attempt #${attempt}`)\n })\n\n socket.on('reconnect_failed', () => {\n console.warn('[ChatWidget] All reconnect attempts failed, falling back to polling')\n if (isOpen && currentSessionId) startPolling(currentSessionId)\n })\n\n socket.on('connect_error', (err) => {\n console.error('[ChatWidget] Socket connect error:', err?.message || err, { baseUrl: namespaceUrl, projectId, visitorId })\n setConnectionStatus('connecting') // socket.io will auto-retry\n })\n\n socketRef.current = socket\n },\n [projectId, visitorId, baseUrl, isOpen, handleSocketMessage, lastFailedSend],\n )\n\n // Polling fallback\n const startPolling = useCallback(\n (currentSessionId: string) => {\n if (pollingIntervalRef.current) return\n pollingIntervalRef.current = setInterval(async () => {\n try {\n const apiKey = ensureApiKey()\n if (!apiKey) return\n const response = await sonorFetch(`${baseUrl}/engage/widget/messages?sessionId=${currentSessionId}`, {}, { apiKey, retries: 0 })\n if (response.ok) {\n const { data } = await response.json()\n setMessages((prev) => {\n const existingIds = new Set(prev.map((m) => m.id))\n const newMessages = data.filter((m: any) => !existingIds.has(m.id))\n if (newMessages.length > 0) {\n return [\n ...prev,\n ...newMessages.map((m: any) => ({\n id: m.id,\n role: m.role === 'visitor' ? 'user' : m.role,\n content: m.content,\n timestamp: new Date(m.created_at),\n agentName: m.sender_name,\n })),\n ]\n }\n return prev\n })\n }\n } catch (error) {\n console.error('[ChatWidget] Polling failed:', error)\n }\n }, 3000)\n },\n [baseUrl],\n )\n\n // -------------------------------------------------------------------------\n // Effects\n // -------------------------------------------------------------------------\n\n // Scroll to bottom on new messages\n useEffect(() => {\n messagesEndRef.current?.scrollIntoView({ behavior: 'smooth' })\n }, [messages, agentTyping])\n\n // Focus input when chat opens and welcome screen is hidden\n useEffect(() => {\n if (isOpen && !showWelcome && inputRef.current) inputRef.current.focus()\n }, [isOpen, showWelcome])\n\n // Fetch config + availability on mount\n useEffect(() => {\n fetchWidgetConfig()\n checkAvailability()\n const interval = setInterval(checkAvailability, 60000)\n return () => {\n clearInterval(interval)\n if (socketRef.current) {\n socketRef.current.disconnect()\n socketRef.current = null\n }\n }\n }, [fetchWidgetConfig, checkAvailability])\n\n // Init session and connect when chat opens (after welcome dismissed and routing decided)\n useEffect(() => {\n if (isOpen && !showWelcome && !checkingAvailability && !showOfflineForm && !sessionId) {\n initSession().then(async (result) => {\n if (!result?.id) return\n const { id, signalEnabled } = result\n const pending = pendingInitialMessageRef.current\n if (pending) {\n pendingInitialMessageRef.current = null\n }\n\n // AI mode: send pending message directly to Signal API (no Portal passthrough)\n if (signalEnabled && pending) {\n setIsLoading(true)\n setMessages((prev) => [\n ...prev,\n { id: `u-${Date.now()}`, role: 'user', content: pending, timestamp: new Date() },\n ])\n try {\n const reply = await sendToSignalApi(pending, id)\n pushEchoReply(reply, pending)\n } catch (err) {\n console.error('[ChatWidget] Signal API error:', err)\n setMessages((prev) => [\n ...prev,\n {\n id: `err-${Date.now()}`,\n role: 'assistant',\n content: 'I apologize, but I encountered an error. Would you like to speak with a team member?',\n timestamp: new Date(),\n suggestions: ['Talk to a person', 'Try again'],\n offerHandoff: true,\n },\n ])\n } finally {\n setIsLoading(false)\n }\n }\n\n // Only connect socket for live-only (non-Signal) projects.\n // Signal projects stay socket-free during the AI phase — the socket\n // connects later if/when a handoff to a live agent is confirmed.\n if (!signalEnabled) {\n setConnectionStatus('connecting')\n await connectSocket(id)\n }\n\n // Live mode: send pending via socket once connected\n if (!signalEnabled && pending) {\n const waitForSocket = () => new Promise<void>((resolve) => {\n const check = (attempts = 0) => {\n if (socketRef.current?.connected || attempts > 20) { resolve(); return }\n setTimeout(() => check(attempts + 1), 150)\n }\n check()\n })\n await waitForSocket()\n if (socketRef.current?.connected) {\n socketRef.current.emit('visitor:message', { content: pending })\n }\n }\n })\n }\n return () => {\n if (pollingIntervalRef.current) clearInterval(pollingIntervalRef.current)\n }\n }, [isOpen, showWelcome, checkingAvailability, showOfflineForm, sessionId, initSession, connectSocket, sendToSignalApi, pushEchoReply])\n\n // -------------------------------------------------------------------------\n // Handlers\n // -------------------------------------------------------------------------\n\n const handleToggle = useCallback(() => {\n setIsOpen((prev) => !prev)\n }, [])\n\n /** Start chatting (dismiss welcome screen) with availability routing */\n const startChat = useCallback(\n async (initialMessage?: string) => {\n setShowWelcome(false)\n\n const beginChatSession = () => {\n setMessages([{ id: 'welcome', role: 'assistant', content: welcomeMessage, timestamp: new Date() }])\n if (initialMessage) {\n // Stash the initial message — the session-init effect will send it\n // once the socket is connected. This avoids duplicate messages.\n pendingInitialMessageRef.current = initialMessage\n const userMsg: Message = { id: `user-${Date.now()}`, role: 'user', content: initialMessage, timestamp: new Date() }\n setMessages((prev) => [...prev, userMsg])\n setIsLoading(true)\n }\n }\n\n // Signal/AI mode → go straight to chat (AI is always available)\n if (widgetConfig?.signal_enabled) {\n beginChatSession()\n return\n }\n\n // ─── Live-only mode: check agent availability ───────────────────\n // No Signal → live chat with human agents or offline form.\n setCheckingAvailability(true)\n\n // First real-time check\n const firstCheck = await checkAvailability()\n if (firstCheck?.available && firstCheck.agentsOnline > 0) {\n setCheckingAvailability(false)\n beginChatSession()\n return\n }\n\n // No agents online – wait ~5 seconds for push notification response.\n // Future: this is where we send a push notification to agents via\n // the Sonor Messenger app. Agents get 5-6 seconds to open the\n // notification and come online before we fall through to the offline form.\n await new Promise((resolve) => setTimeout(resolve, 5000))\n\n // Re-check after the grace period\n const secondCheck = await checkAvailability()\n setCheckingAvailability(false)\n\n if (secondCheck?.available && secondCheck.agentsOnline > 0) {\n // An agent responded – start live chat\n beginChatSession()\n } else {\n // Still no agents – show offline form\n setShowOfflineForm(true)\n }\n },\n [widgetConfig?.signal_enabled, welcomeMessage, checkAvailability],\n )\n\n const uploadWidgetFile = useCallback(\n async (file: File): Promise<MessageAttachment | null> => {\n if (!sessionId || !visitorId) return null\n const apiKey = ensureApiKey()\n if (!apiKey) return null\n const form = new FormData()\n form.append('file', file)\n form.append('sessionId', sessionId)\n form.append('visitorId', visitorId)\n const res = await sonorFetch(`${baseUrl}/engage/widget/upload`, {\n method: 'POST',\n body: form,\n }, { apiKey, retries: 0 })\n if (!res.ok) throw new Error('Upload failed')\n const json = await res.json()\n const d = json?.data ?? json\n return d?.url ? { name: d.name ?? file.name, url: d.url, size: d.size, mimeType: d.mimeType } : null\n },\n [sessionId, visitorId, baseUrl],\n )\n\n const handleSubmit = useCallback(\n async (e: React.FormEvent) => {\n e.preventDefault()\n const hasText = !!inputValue.trim()\n const hasFiles = pendingFiles.length > 0\n if ((!hasText && !hasFiles) || isLoading) return\n\n const content = inputValue.trim() || ''\n let attachments: MessageAttachment[] = []\n if (pendingFiles.length) {\n try {\n for (const file of pendingFiles) {\n const att = await uploadWidgetFile(file)\n if (att) attachments.push(att)\n }\n setPendingFiles([])\n } catch (err) {\n console.error('[ChatWidget] File upload failed', err)\n setMessages((prev) => [...prev, { id: `err-${Date.now()}`, role: 'assistant', content: 'Failed to upload file. Please try again.', timestamp: new Date() }])\n return\n }\n }\n\n const userMessage: Message = {\n id: `user-${Date.now()}`,\n role: 'user',\n content,\n timestamp: new Date(),\n ...(attachments.length ? { attachments } : {}),\n }\n setMessages((prev) => [...prev, userMessage])\n setInputValue('')\n setIsLoading(true)\n\n // AI mode: call Signal API directly (no Portal passthrough)\n // Once handed off to a live agent, messages go through the socket instead.\n if (widgetConfig?.signal_enabled && !isHandedOff && hasText) {\n try {\n const reply = await sendToSignalApi(content, sessionId)\n const lastUserContent = messages.filter((m) => m.role === 'user').slice(-1)[0]?.content ?? ''\n pushEchoReply(reply, lastUserContent)\n } catch (err) {\n console.error('[ChatWidget] Signal API error:', err)\n setMessages((prev) => [\n ...prev,\n {\n id: `err-${Date.now()}`,\n role: 'assistant',\n content: 'I apologize, but I encountered an error. Would you like to speak with a team member?',\n timestamp: new Date(),\n suggestions: ['Talk to a person', 'Try again'],\n offerHandoff: true,\n },\n ])\n } finally {\n setIsLoading(false)\n }\n return\n }\n\n // Live mode: use socket\n const socket = socketRef.current\n if (socket?.connected) {\n socket.emit('visitor:message', { content: userMessage.content, attachments: attachments.length ? attachments : undefined })\n setLastFailedSend(null)\n return\n }\n\n // Buffer for retry on reconnect instead of showing error immediately\n setLastFailedSend({ content: userMessage.content, attachments })\n // Give socket.io a moment to reconnect before showing error\n setTimeout(() => {\n if (!socketRef.current?.connected) {\n setMessages((prev) => [\n ...prev,\n { id: `error-${Date.now()}`, role: 'system', content: 'Reconnecting...', timestamp: new Date(), sendFailed: true },\n ])\n setIsLoading(false)\n }\n }, 3000)\n },\n [inputValue, isLoading, pendingFiles, uploadWidgetFile, widgetConfig?.signal_enabled, isHandedOff, sendToSignalApi, sessionId, pushEchoReply],\n )\n\n /**\n * Send a plain text turn to Echo (used by suggest_action chips). AI-only —\n * uiActions only ever appear in Signal/AI mode, so this mirrors handleSubmit's\n * AI branch (routing through the same sendToSignalApi + pushEchoReply path).\n */\n const sendEchoText = useCallback(\n async (text: string) => {\n const content = text.trim()\n if (!content || isLoading) return\n setMessages((prev) => [\n ...prev,\n { id: `user-${Date.now()}`, role: 'user', content, timestamp: new Date() },\n ])\n setIsLoading(true)\n try {\n const reply = await sendToSignalApi(content, sessionId)\n pushEchoReply(reply, content)\n } catch (err) {\n console.error('[ChatWidget] Signal API error:', err)\n setMessages((prev) => [\n ...prev,\n {\n id: `err-${Date.now()}`,\n role: 'assistant',\n content: 'I apologize, but I encountered an error. Would you like to speak with a team member?',\n timestamp: new Date(),\n suggestions: ['Talk to a person', 'Try again'],\n offerHandoff: true,\n },\n ])\n } finally {\n setIsLoading(false)\n }\n },\n [isLoading, sessionId, sendToSignalApi, pushEchoReply],\n )\n\n /**\n * A suggest_action chip was clicked. Navigate when `action` is a path/URL\n * (internal path / hash same-tab, external URL new tab); otherwise send the\n * human-readable message as the next chat turn.\n */\n const handleSuggestAction = useCallback(\n (action: string | undefined, message: string) => {\n const a = (action || '').trim()\n if (a && isNavigable(a)) {\n if (typeof window !== 'undefined') {\n if (/^https?:\\/\\//i.test(a)) window.open(a, '_blank', 'noopener,noreferrer')\n else window.location.href = a\n }\n return\n }\n if (message?.trim()) void sendEchoText(message)\n },\n [sendEchoText],\n )\n\n const retryFailedSend = useCallback(() => {\n if (!lastFailedSend || !sessionId) return\n const socket = socketRef.current\n if (socket?.connected) {\n socket.emit('visitor:message', { content: lastFailedSend.content, attachments: lastFailedSend.attachments?.length ? lastFailedSend.attachments : undefined })\n setLastFailedSend(null)\n setMessages((prev) => prev.filter((m) => !m.sendFailed))\n setIsLoading(true)\n } else {\n connectSocket(sessionId)\n }\n }, [lastFailedSend, sessionId, connectSocket])\n\n const requestHandoff = useCallback(async () => {\n if (!sessionId) return\n const apiKey = ensureApiKey()\n if (!apiKey) return\n setCheckingHandoff(true)\n try {\n // Backend handles availability check (first check → 5s grace → second check)\n // and emits urgent notifications to agents if available.\n const res = await sonorFetch(`${baseUrl}/engage/widget/handoff`, {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify({ sessionId }),\n }, { apiKey, retries: 0 })\n const json = await res.json()\n const available = json?.data?.available === true\n setCheckingHandoff(false)\n\n if (available) {\n // Agents are online and notified — NOW connect the socket so the\n // visitor becomes visible in the agent's dashboard for the first time.\n setIsHandedOff(true)\n setConnectionStatus('connecting')\n await connectSocket(sessionId)\n setMessages((prev) => [\n ...prev,\n { id: `handoff-${Date.now()}`, role: 'system', content: 'Connecting you with a team member. Please hold on!', timestamp: new Date() },\n ])\n } else {\n // No agents online — show offline form\n setHandoffOfflinePrompt(widgetConfig?.offline_subheading ?? \"Nobody is online right now. Leave your details and we'll get back to you.\")\n setShowOfflineForm(true)\n setMessages((prev) => [\n ...prev,\n { id: `handoff-offline-${Date.now()}`, role: 'system', content: offlineHeading, timestamp: new Date() },\n ])\n }\n } catch (error) {\n setCheckingHandoff(false)\n console.error('[ChatWidget] Handoff request failed:', error)\n }\n }, [sessionId, baseUrl, widgetConfig, offlineHeading, connectSocket])\n\n const [offlineError, setOfflineError] = useState<string | null>(null)\n\n const handleOfflineSubmit = useCallback(\n async (e: React.FormEvent) => {\n e.preventDefault()\n if (!offlineForm.name || !offlineForm.email || !offlineForm.message) return\n const apiKey = ensureApiKey()\n if (!apiKey) return\n setIsLoading(true)\n setOfflineError(null)\n try {\n const response = await sonorFetch(`${baseUrl}/engage/widget/offline-form`, {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify({\n projectId,\n visitorId,\n ...offlineForm,\n pageUrl: typeof window !== 'undefined' ? window.location.href : '',\n ...(widgetConfig?.offlineFormSlug && { formSlug: widgetConfig.offlineFormSlug }),\n }),\n }, { apiKey, retries: 0 })\n if (response.ok) {\n setOfflineSubmitted(true)\n } else {\n const errorBody = await response.text().catch(() => '')\n console.error(`[ChatWidget] Offline form returned ${response.status}:`, errorBody)\n setOfflineError('Something went wrong. Please try again.')\n }\n } catch (error) {\n console.error('[ChatWidget] Offline form submission failed:', error)\n setOfflineError('Unable to send message. Please check your connection and try again.')\n } finally {\n setIsLoading(false)\n }\n },\n [offlineForm, projectId, visitorId, baseUrl, widgetConfig],\n )\n\n const handleKeyDown = useCallback((e: React.KeyboardEvent) => {\n if (e.key === 'Enter' && !e.shiftKey) {\n e.preventDefault()\n handleSubmit(e as any)\n }\n }, [handleSubmit])\n\n const handleTyping = useCallback(() => {\n const socket = socketRef.current\n if (socket?.connected) {\n socket.emit('visitor:typing', { isTyping: true })\n setTimeout(() => {\n if (socketRef.current?.connected) socketRef.current.emit('visitor:typing', { isTyping: false })\n }, 2000)\n }\n }, [])\n\n // -------------------------------------------------------------------------\n // Status label\n // -------------------------------------------------------------------------\n\n const statusLabel = (() => {\n if (showOfflineForm) return null\n if (checkingAvailability) return { dot: '#f59e0b', text: 'Checking for a team member...' }\n if (widgetConfig?.signal_enabled) return { dot: null, text: 'Echo Intelligent Site Assistant' }\n if (availability && availability.agentsOnline > 0) return { dot: '#22c55e', text: 'Online' }\n return { dot: 'var(--sk-text-tertiary, #9ca3af)', text: \"We'll respond soon\" }\n })()\n\n // -------------------------------------------------------------------------\n // Render: Chat Button\n // -------------------------------------------------------------------------\n\n const ChatButton = (\n <button\n type=\"button\"\n data-sk-echo-launcher\n onClick={handleToggle}\n aria-label={isOpen ? 'Close chat' : 'Open chat'}\n style={{\n position: 'fixed',\n ...placement.launcher,\n width: '60px',\n height: '60px',\n borderRadius: '50%',\n backgroundColor: primaryColor,\n border: 'none',\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n cursor: 'pointer',\n boxShadow: '0 4px 12px rgba(0, 0, 0, 0.25)',\n transition: 'transform 0.2s, box-shadow 0.2s',\n zIndex: placement.zIndex.launcher,\n }}\n onMouseEnter={(e) => {\n e.currentTarget.style.transform = 'scale(1.05)'\n e.currentTarget.style.boxShadow = '0 6px 16px rgba(0, 0, 0, 0.3)'\n }}\n onMouseLeave={(e) => {\n e.currentTarget.style.transform = 'scale(1)'\n e.currentTarget.style.boxShadow = '0 4px 12px rgba(0, 0, 0, 0.25)'\n }}\n >\n {isOpen ? (\n <svg width=\"24\" height=\"24\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"white\" strokeWidth=\"2\" strokeLinecap=\"round\" strokeLinejoin=\"round\">\n <line x1=\"18\" y1=\"6\" x2=\"6\" y2=\"18\" />\n <line x1=\"6\" y1=\"6\" x2=\"18\" y2=\"18\" />\n </svg>\n ) : (\n <svg width=\"28\" height=\"28\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"white\" strokeWidth=\"2\" strokeLinecap=\"round\" strokeLinejoin=\"round\">\n <path d=\"M21 15a2 2 0 0 1-2 2H7l-4 4V5a2 2 0 0 1 2-2h14a2 2 0 0 1 2 2z\" />\n </svg>\n )}\n </button>\n )\n\n // -------------------------------------------------------------------------\n // Render: Header (shared across all views)\n // -------------------------------------------------------------------------\n\n const Header = (\n <div\n style={{\n padding: '16px 20px',\n background: `linear-gradient(135deg, ${primaryColor}, ${adjustColor(primaryColor, -25)})`,\n color: isLightColor(primaryColor) ? '#1a1a1a' : 'white',\n display: 'flex',\n alignItems: 'center',\n gap: 12,\n }}\n >\n {/* Logo or icon */}\n <div\n style={{\n width: 40,\n height: 40,\n borderRadius: '50%',\n backgroundColor: 'rgba(255,255,255,0.2)',\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n overflow: 'hidden',\n flexShrink: 0,\n }}\n >\n {logoUrl ? (\n <img src={logoUrl} alt=\"\" style={{ width: 28, height: 28, objectFit: 'contain', filter: isLightColor(primaryColor) ? 'none' : 'brightness(0) invert(1)' }} />\n ) : (\n <svg width=\"22\" height=\"22\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\" strokeLinecap=\"round\" strokeLinejoin=\"round\">\n <path d=\"M21 15a2 2 0 0 1-2 2H7l-4 4V5a2 2 0 0 1 2-2h14a2 2 0 0 1 2 2z\" />\n </svg>\n )}\n </div>\n <div style={{ flex: 1, minWidth: 0 }}>\n <div style={{ fontWeight: 600, fontSize: 16, whiteSpace: 'nowrap', overflow: 'hidden', textOverflow: 'ellipsis' }}>\n {showOfflineForm ? offlineHeading : businessName}\n </div>\n {statusLabel && (\n <div style={{ fontSize: 13, opacity: 0.9, display: 'flex', alignItems: 'center', gap: 6, marginTop: 2 }}>\n {statusLabel.dot && (\n <span style={{ width: 8, height: 8, borderRadius: '50%', backgroundColor: statusLabel.dot, flexShrink: 0 }} />\n )}\n {statusLabel.text}\n </div>\n )}\n </div>\n\n {/* Connection status indicator */}\n {connectionStatus === 'connecting' && !showWelcome && !showOfflineForm && (\n <div style={{ fontSize: 11, opacity: 0.7, display: 'flex', alignItems: 'center', gap: 4 }}>\n <span style={{ animation: 'chatDot 1s infinite ease-in-out' }}>●</span>\n Connecting\n </div>\n )}\n </div>\n )\n\n // -------------------------------------------------------------------------\n // Render: Welcome Screen\n // -------------------------------------------------------------------------\n\n const WelcomeScreen = (\n <div style={{ flex: 1, display: 'flex', flexDirection: 'column', padding: 20, gap: 16 }}>\n <div style={{ textAlign: 'center', paddingTop: 8 }}>\n <div style={{ fontSize: 15, color: 'var(--sk-text-primary, #374151)', lineHeight: 1.5 }}>\n {welcomeMessage}\n </div>\n </div>\n\n {/* Quick action chips */}\n {quickActions.length > 0 && (\n <div style={{ display: 'flex', flexDirection: 'column', gap: 8 }}>\n {quickActions.map((action, i) => (\n <button\n key={i}\n type=\"button\"\n onClick={() => startChat(action)}\n style={{\n padding: '12px 16px',\n borderRadius: 12,\n border: `1px solid ${hexAlpha('--sk-primary-rgb', 0.2, primaryRgb)}`,\n backgroundColor: hexAlpha('--sk-primary-rgb', 0.031, primaryRgb),\n color: primaryColor,\n fontSize: 14,\n cursor: 'pointer',\n textAlign: 'left',\n transition: 'background-color 0.15s, border-color 0.15s',\n lineHeight: 1.4,\n }}\n onMouseEnter={(e) => {\n e.currentTarget.style.backgroundColor = hexAlpha('--sk-primary-rgb', 0.082, primaryRgb)\n e.currentTarget.style.borderColor = hexAlpha('--sk-primary-rgb', 0.333, primaryRgb)\n }}\n onMouseLeave={(e) => {\n e.currentTarget.style.backgroundColor = hexAlpha('--sk-primary-rgb', 0.031, primaryRgb)\n e.currentTarget.style.borderColor = hexAlpha('--sk-primary-rgb', 0.2, primaryRgb)\n }}\n >\n {action}\n </button>\n ))}\n </div>\n )}\n\n {/* Start chat button */}\n <button\n type=\"button\"\n onClick={() => startChat()}\n style={{\n padding: '12px 20px',\n borderRadius: 12,\n border: 'none',\n backgroundColor: primaryColor,\n color: isLightColor(primaryColor) ? '#1a1a1a' : 'white',\n fontSize: 14,\n fontWeight: 600,\n cursor: 'pointer',\n marginTop: 'auto',\n }}\n >\n Start a conversation\n </button>\n\n {/* Business phone */}\n {widgetConfig?.business_info?.phone && (\n <div style={{ textAlign: 'center', fontSize: 13, color: 'var(--sk-text-secondary, #6b7280)' }}>\n Or call us at{' '}\n <a href={`tel:${widgetConfig.business_info.phone}`} style={{ color: primaryColor, textDecoration: 'none', fontWeight: 500 }}>\n {widgetConfig.business_info.phone}\n </a>\n </div>\n )}\n </div>\n )\n\n // -------------------------------------------------------------------------\n // Render: Offline Form\n // -------------------------------------------------------------------------\n\n const OfflineFormView = (\n <div style={{ padding: 20, flex: 1, overflowY: 'auto' }}>\n {offlineSubmitted ? (\n <div style={{ textAlign: 'center', padding: 20 }}>\n <div style={{ width: 56, height: 56, borderRadius: '50%', backgroundColor: hexAlpha('--sk-primary-rgb', 0.082, primaryRgb), display: 'flex', alignItems: 'center', justifyContent: 'center', margin: '0 auto 16px' }}>\n <svg width=\"28\" height=\"28\" viewBox=\"0 0 24 24\" fill=\"none\" stroke={primaryColor} strokeWidth=\"2\" strokeLinecap=\"round\" strokeLinejoin=\"round\">\n <polyline points=\"20 6 9 17 4 12\" />\n </svg>\n </div>\n <h3 style={{ margin: '0 0 8px', fontSize: 18, fontWeight: 600, color: 'var(--sk-text-primary, #111827)' }}>Message Sent!</h3>\n <p style={{ margin: 0, color: 'var(--sk-text-secondary, #6b7280)', fontSize: 14 }}>{offlineSubheading}</p>\n </div>\n ) : (\n <form onSubmit={handleOfflineSubmit}>\n <p style={{ margin: '0 0 16px', color: 'var(--sk-text-secondary, #6b7280)', fontSize: 14 }}>{offlineSubheading}</p>\n {[\n { name: 'name' as const, type: 'text', placeholder: 'Your name *', required: true },\n { name: 'email' as const, type: 'email', placeholder: 'Your email *', required: true },\n { name: 'phone' as const, type: 'tel', placeholder: 'Phone (optional)', required: false },\n ].map((field) => (\n <div key={field.name} style={{ marginBottom: 12 }}>\n <input\n type={field.type}\n placeholder={field.placeholder}\n value={offlineForm[field.name]}\n onChange={(e) => setOfflineForm((prev) => ({ ...prev, [field.name]: e.target.value }))}\n required={field.required}\n style={{ width: '100%', padding: '10px 12px', borderRadius: 8, border: '1px solid var(--sk-border, #e5e7eb)', fontSize: 14, outline: 'none', boxSizing: 'border-box' }}\n onFocus={(e) => (e.currentTarget.style.borderColor = primaryColor)}\n onBlur={(e) => (e.currentTarget.style.borderColor = 'var(--sk-border, #e5e7eb)')}\n />\n </div>\n ))}\n <div style={{ marginBottom: 16 }}>\n <textarea\n placeholder=\"How can we help? *\"\n value={offlineForm.message}\n onChange={(e) => setOfflineForm((prev) => ({ ...prev, message: e.target.value }))}\n required\n rows={4}\n style={{ width: '100%', padding: '10px 12px', borderRadius: 8, border: '1px solid var(--sk-border, #e5e7eb)', fontSize: 14, outline: 'none', resize: 'vertical', boxSizing: 'border-box' }}\n onFocus={(e) => (e.currentTarget.style.borderColor = primaryColor)}\n onBlur={(e) => (e.currentTarget.style.borderColor = 'var(--sk-border, #e5e7eb)')}\n />\n </div>\n {offlineError && (\n <div style={{ padding: '8px 12px', borderRadius: 8, backgroundColor: 'var(--sk-error-bg, #fef2f2)', border: '1px solid var(--sk-error, #fecaca)', color: 'var(--sk-error, #dc2626)', fontSize: 13, marginBottom: 12 }}>\n {offlineError}\n </div>\n )}\n <button\n type=\"submit\"\n disabled={isLoading}\n style={{\n width: '100%',\n padding: '12px',\n borderRadius: 8,\n border: 'none',\n backgroundColor: primaryColor,\n color: isLightColor(primaryColor) ? '#1a1a1a' : 'white',\n fontSize: 14,\n fontWeight: 600,\n cursor: isLoading ? 'wait' : 'pointer',\n opacity: isLoading ? 0.7 : 1,\n }}\n >\n {isLoading ? 'Sending...' : 'Send Message'}\n </button>\n </form>\n )}\n </div>\n )\n\n // -------------------------------------------------------------------------\n // Render: Checking Availability Screen\n // -------------------------------------------------------------------------\n\n const CheckingScreen = (\n <div style={{ flex: 1, display: 'flex', flexDirection: 'column', alignItems: 'center', justifyContent: 'center', padding: 32, gap: 20, textAlign: 'center' }}>\n {/* Pulsing radar icon */}\n <div style={{ position: 'relative', width: 64, height: 64 }}>\n <div\n style={{\n position: 'absolute',\n inset: 0,\n borderRadius: '50%',\n backgroundColor: hexAlpha('--sk-primary-rgb', 0.082, primaryRgb),\n animation: 'checkPulse 2s infinite ease-out',\n }}\n />\n <div\n style={{\n position: 'absolute',\n inset: 8,\n borderRadius: '50%',\n backgroundColor: hexAlpha('--sk-primary-rgb', 0.145, primaryRgb),\n animation: 'checkPulse 2s infinite ease-out 0.4s',\n }}\n />\n <div\n style={{\n position: 'absolute',\n inset: 16,\n borderRadius: '50%',\n backgroundColor: primaryColor,\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n }}\n >\n <svg width=\"18\" height=\"18\" viewBox=\"0 0 24 24\" fill=\"none\" stroke={isLightColor(primaryColor) ? '#1a1a1a' : 'white'} strokeWidth=\"2\" strokeLinecap=\"round\" strokeLinejoin=\"round\">\n <path d=\"M16 21v-2a4 4 0 0 0-4-4H5a4 4 0 0 0-4 4v2\" />\n <circle cx=\"8.5\" cy=\"7\" r=\"4\" />\n <line x1=\"20\" y1=\"8\" x2=\"20\" y2=\"14\" />\n <line x1=\"23\" y1=\"11\" x2=\"17\" y2=\"11\" />\n </svg>\n </div>\n </div>\n\n <div>\n <div style={{ fontSize: 16, fontWeight: 600, color: 'var(--sk-text-primary, #111827)', marginBottom: 6 }}>\n {checkingHandoff ? 'Looking for online support' : 'Checking for a team member'}\n </div>\n <div style={{ fontSize: 14, color: 'var(--sk-text-secondary, #6b7280)', lineHeight: 1.5 }}>\n One moment please\n <span style={{ display: 'inline-flex', width: 20 }}>\n <span style={{ animation: 'checkDots 1.5s infinite steps(4, end)' }}>...</span>\n </span>\n </div>\n </div>\n\n {/* Progress bar */}\n <div style={{ width: '80%', height: 3, backgroundColor: 'var(--sk-border, #e5e7eb)', borderRadius: 2, overflow: 'hidden' }}>\n <div\n style={{\n width: '100%',\n height: '100%',\n backgroundColor: primaryColor,\n borderRadius: 2,\n animation: 'checkProgress 5s linear forwards',\n transformOrigin: 'left',\n }}\n />\n </div>\n\n <div style={{ fontSize: 12, color: 'var(--sk-text-tertiary, #9ca3af)' }}>\n This usually takes just a few seconds\n </div>\n </div>\n )\n\n // -------------------------------------------------------------------------\n // Render: Messages View\n // -------------------------------------------------------------------------\n\n const MessagesView = (\n <>\n {/* Messages area */}\n <div\n style={{ flex: 1, overflowY: 'auto', padding: 16, display: 'flex', flexDirection: 'column', gap: 12, backgroundColor: 'var(--sk-bg-elevated, #f9fafb)' }}\n >\n {messages.map((message) => {\n const isAssistant = message.role === 'assistant' || message.role === 'agent'\n return (\n <div key={message.id} style={{ display: 'flex', justifyContent: message.role === 'user' ? 'flex-end' : 'flex-start' }}>\n <div\n style={{\n maxWidth: '80%',\n padding: message.role === 'system' ? '8px 12px' : isAssistant ? '12px 16px' : '10px 14px',\n borderRadius: message.role === 'user' ? '16px 16px 4px 16px' : message.role === 'system' ? '8px' : '16px 16px 16px 4px',\n backgroundColor: message.role === 'user' ? primaryColor : message.role === 'system' ? 'var(--sk-border, #e5e7eb)' : 'var(--sk-bg, #ffffff)',\n color: message.role === 'user' ? (isLightColor(primaryColor) ? '#1a1a1a' : 'white') : message.role === 'system' ? 'var(--sk-text-secondary, #6b7280)' : 'var(--sk-text-primary, #111827)',\n boxShadow: message.role === 'system' ? 'none' : '0 1px 2px rgba(0,0,0,0.08)',\n fontSize: message.role === 'system' ? 13 : 14,\n fontStyle: message.role === 'system' ? 'italic' : 'normal',\n lineHeight: isAssistant ? 1.6 : 1.5,\n whiteSpace: isAssistant ? 'normal' : 'pre-wrap',\n wordBreak: 'break-word',\n textAlign: isAssistant ? 'left' : undefined,\n borderLeft: isAssistant ? `3px solid ${hexAlpha('--sk-primary-rgb', 0.2, primaryRgb)}` : undefined,\n }}\n >\n {message.agentName && message.role === 'agent' && (\n <div style={{ fontSize: 12, opacity: 0.6, marginBottom: 4 }}>{message.agentName}</div>\n )}\n {isAssistant ? (\n <div className=\"chatMessageContent\">\n <ReactMarkdown\n components={{\n p: ({ children }) => <p style={{ margin: '0 0 8px', lineHeight: 1.6 }}>{children}</p>,\n strong: ({ children }) => <strong style={{ fontWeight: 600 }}>{children}</strong>,\n ul: ({ children }) => <ul style={{ margin: '4px 0 8px', paddingLeft: 20 }}>{children}</ul>,\n ol: ({ children }) => <ol style={{ margin: '4px 0 8px', paddingLeft: 20 }}>{children}</ol>,\n li: ({ children }) => <li style={{ marginBottom: 4 }}>{children}</li>,\n h3: ({ children }) => <h3 style={{ margin: '12px 0 6px', fontSize: 15, fontWeight: 600 }}>{children}</h3>,\n h4: ({ children }) => <h4 style={{ margin: '8px 0 4px', fontSize: 14, fontWeight: 600 }}>{children}</h4>,\n a: ({ href, children }) => (\n <a\n href={href}\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n style={{\n display: 'inline-block',\n marginTop: 6,\n marginRight: 6,\n padding: '8px 14px',\n borderRadius: 8,\n backgroundColor: hexAlpha('--sk-primary-rgb', 0.082, primaryRgb),\n color: primaryColor,\n fontWeight: 600,\n fontSize: 13,\n textDecoration: 'none',\n border: `1px solid ${hexAlpha('--sk-primary-rgb', 0.25, primaryRgb)}`,\n boxShadow: '0 1px 2px rgba(0,0,0,0.06)',\n transition: 'background-color 0.15s, transform 0.1s',\n }}\n onMouseOver={(e) => {\n e.currentTarget.style.backgroundColor = hexAlpha('--sk-primary-rgb', 0.145, primaryRgb)\n e.currentTarget.style.transform = 'translateY(-1px)'\n }}\n onMouseOut={(e) => {\n e.currentTarget.style.backgroundColor = hexAlpha('--sk-primary-rgb', 0.082, primaryRgb)\n e.currentTarget.style.transform = 'translateY(0)'\n }}\n >\n {children}\n </a>\n ),\n }}\n >\n {linkifyUrls(message.content)}\n </ReactMarkdown>\n </div>\n ) : (\n message.content\n )}\n {/* Attachments */}\n {message.attachments?.length ? (\n <div style={{ marginTop: 8, display: 'flex', flexDirection: 'column', gap: 6 }}>\n {message.attachments.map((att, i) =>\n att.mimeType?.startsWith('image/') ? (\n <a key={i} href={att.url} target=\"_blank\" rel=\"noopener noreferrer\" style={{ display: 'block' }}>\n <img src={att.url} alt={att.name} style={{ maxWidth: '100%', maxHeight: 200, borderRadius: 8, objectFit: 'contain' }} />\n </a>\n ) : (\n <a key={i} href={att.url} target=\"_blank\" rel=\"noopener noreferrer\" style={{ fontSize: 13, wordBreak: 'break-all', display: 'flex', alignItems: 'center', gap: 6 }}>\n <svg width=\"14\" height=\"14\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\" strokeLinecap=\"round\" strokeLinejoin=\"round\">\n <path d=\"M21.44 11.05l-9.19 9.19a6 6 0 0 1-8.49-8.49l9.19-9.19a4 4 0 0 1 5.66 5.66l-9.2 9.19a2 2 0 0 1-2.83-2.83l8.49-8.48\" />\n </svg>\n {att.name}\n </a>\n ),\n )}\n </div>\n ) : null}\n {/* Suggestion chips */}\n {message.suggestions?.length ? (\n <div style={{ display: 'flex', flexWrap: 'wrap', gap: 6, marginTop: 8 }}>\n {message.suggestions.map((s, i) => (\n <button\n key={i}\n type=\"button\"\n onClick={() => {\n if (/talk\\s+to\\s+(a\\s+)?person/i.test(s)) {\n requestHandoff()\n } else {\n setInputValue(s)\n inputRef.current?.focus()\n }\n }}\n style={{\n padding: '6px 12px',\n borderRadius: 16,\n border: `1px solid ${primaryColor}`,\n backgroundColor: hexAlpha('--sk-primary-rgb', 0.063, primaryRgb),\n color: primaryColor,\n fontSize: 13,\n cursor: 'pointer',\n }}\n >\n {s}\n </button>\n ))}\n </div>\n ) : null}\n {/* Inline Echo UI actions (managed form / suggestion chips) */}\n {message.uiActions?.length ? (\n <EchoUiActions\n actions={message.uiActions}\n primaryColor={primaryColor}\n primaryRgb={primaryRgb}\n onSuggest={handleSuggestAction}\n />\n ) : null}\n {/* Retry on failed send */}\n {message.sendFailed && lastFailedSend && (\n <div style={{ marginTop: 8 }}>\n <button\n type=\"button\"\n onClick={retryFailedSend}\n style={{ padding: '6px 12px', borderRadius: 6, border: '1px solid var(--sk-error, #dc2626)', backgroundColor: 'var(--sk-error-bg, #fef2f2)', color: 'var(--sk-error, #dc2626)', fontSize: 13, cursor: 'pointer' }}\n >\n Retry send\n </button>\n </div>\n )}\n {/* Handoff button — only when user requested it or AI cannot answer (hide if \"Talk to a person\" chip already shown) */}\n {widgetConfig?.signal_enabled && message.role === 'assistant' && widgetConfig?.handoff_enabled !== false && message.offerHandoff && !message.suggestions?.some((s) => /talk\\s+to\\s+(a\\s+)?person/i.test(s)) && message.id === messages.filter((m) => m.role === 'assistant').slice(-1)[0]?.id && (\n <button\n onClick={requestHandoff}\n style={{\n display: 'inline-block',\n marginTop: 8,\n padding: '6px 12px',\n borderRadius: 6,\n border: `1px solid ${primaryColor}`,\n backgroundColor: 'transparent',\n color: primaryColor,\n fontSize: 13,\n cursor: 'pointer',\n }}\n >\n Talk to a person\n </button>\n )}\n </div>\n </div>\n )\n })}\n\n {/* Typing indicator */}\n {(isLoading || agentTyping) && (\n <div style={{ display: 'flex', justifyContent: 'flex-start' }}>\n <div\n style={{\n padding: '10px 14px',\n borderRadius: '16px 16px 16px 4px',\n backgroundColor: 'var(--sk-bg, #ffffff)',\n boxShadow: '0 1px 2px rgba(0,0,0,0.08)',\n display: 'flex',\n gap: 4,\n color: 'var(--sk-text-tertiary, #9ca3af)',\n }}\n >\n <span style={{ animation: 'chatDot 1.4s infinite ease-in-out', animationDelay: '0s' }}>●</span>\n <span style={{ animation: 'chatDot 1.4s infinite ease-in-out', animationDelay: '0.2s' }}>●</span>\n <span style={{ animation: 'chatDot 1.4s infinite ease-in-out', animationDelay: '0.4s' }}>●</span>\n </div>\n </div>\n )}\n\n <div ref={messagesEndRef} />\n </div>\n\n {/* Failed send bar */}\n {lastFailedSend && (\n <div style={{ padding: '8px 12px', backgroundColor: 'var(--sk-error-bg, #fef2f2)', borderTop: '1px solid var(--sk-error, #fecaca)', display: 'flex', alignItems: 'center', justifyContent: 'space-between', gap: 8 }}>\n <span style={{ fontSize: 13, color: 'var(--sk-error, #dc2626)' }}>Failed to send</span>\n <button type=\"button\" onClick={retryFailedSend} style={{ padding: '4px 10px', borderRadius: 6, border: '1px solid var(--sk-error, #dc2626)', background: 'var(--sk-bg, #fff)', color: 'var(--sk-error, #dc2626)', fontSize: 12, cursor: 'pointer' }}>\n Retry\n </button>\n </div>\n )}\n\n {/* Input */}\n <form onSubmit={handleSubmit} style={{ padding: 12, borderTop: '1px solid var(--sk-border, #e5e7eb)', backgroundColor: 'var(--sk-bg, #ffffff)' }}>\n <div style={{ display: 'flex', gap: 8 }}>\n <input\n ref={inputRef}\n type=\"text\"\n value={inputValue}\n onChange={(e) => {\n setInputValue(e.target.value)\n handleTyping()\n }}\n onKeyDown={handleKeyDown}\n placeholder=\"Type a message...\"\n disabled={isLoading}\n style={{\n flex: 1,\n padding: '10px 14px',\n borderRadius: 24,\n border: '1px solid var(--sk-border, #e5e7eb)',\n fontSize: 14,\n outline: 'none',\n transition: 'border-color 0.2s',\n }}\n onFocus={(e) => (e.currentTarget.style.borderColor = primaryColor)}\n onBlur={(e) => (e.currentTarget.style.borderColor = 'var(--sk-border, #e5e7eb)')}\n />\n <button\n type=\"submit\"\n disabled={!inputValue.trim() || isLoading}\n style={{\n width: 40,\n height: 40,\n borderRadius: '50%',\n border: 'none',\n backgroundColor: (inputValue.trim() || pendingFiles.length) && !isLoading ? primaryColor : 'var(--sk-border, #e5e7eb)',\n color: (inputValue.trim() || pendingFiles.length) && !isLoading && isLightColor(primaryColor) ? '#1a1a1a' : 'white',\n cursor: inputValue.trim() && !isLoading ? 'pointer' : 'not-allowed',\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n transition: 'background-color 0.2s',\n flexShrink: 0,\n }}\n >\n <svg width=\"18\" height=\"18\" viewBox=\"0 0 24 24\" fill=\"currentColor\">\n <path d=\"M2.01 21L23 12 2.01 3 2 10l15 2-15 2z\" />\n </svg>\n </button>\n </div>\n </form>\n </>\n )\n\n // -------------------------------------------------------------------------\n // Render: Popup\n // -------------------------------------------------------------------------\n\n const ChatPopup = isOpen && (\n <div\n style={{\n position: 'fixed',\n ...placement.popup,\n width: '380px',\n maxWidth: 'calc(100vw - 40px)',\n height: '520px',\n backgroundColor: 'var(--sk-bg, #ffffff)',\n borderRadius: '16px',\n boxShadow: '0 8px 32px rgba(0, 0, 0, 0.2)',\n display: 'flex',\n flexDirection: 'column',\n overflow: 'hidden',\n zIndex: placement.zIndex.popup,\n animation: 'chatSlideUp 0.3s ease-out',\n }}\n >\n {Header}\n\n {/* Content: Welcome → Checking → Chat → Offline */}\n {checkingAvailability || checkingHandoff ? CheckingScreen : showOfflineForm ? OfflineFormView : showWelcome && welcomeEnabled && messages.length === 0 ? WelcomeScreen : MessagesView}\n\n {/* Powered by */}\n {showPoweredBy && (\n <div style={{ padding: '6px 0', textAlign: 'center', fontSize: 11, color: 'var(--sk-text-tertiary, #9ca3af)', backgroundColor: 'var(--sk-bg, #ffffff)', borderTop: '1px solid var(--sk-bg-elevated, #f3f4f6)' }}>\n Powered by{' '}\n <a href=\"https://sonor.io\" target=\"_blank\" rel=\"noopener noreferrer\" style={{ color: 'var(--sk-text-secondary, #6b7280)', textDecoration: 'none', fontWeight: 500 }}>\n Sonor\n </a>\n </div>\n )}\n\n {/* CSS animations and markdown styles */}\n <style>{`\n @keyframes chatSlideUp {\n from { opacity: 0; transform: translateY(20px); }\n to { opacity: 1; transform: translateY(0); }\n }\n @keyframes chatDot {\n 0%, 80%, 100% { opacity: 0.3; }\n 40% { opacity: 1; }\n }\n @keyframes checkPulse {\n 0% { transform: scale(1); opacity: 1; }\n 100% { transform: scale(1.8); opacity: 0; }\n }\n @keyframes checkDots {\n 0% { content: ''; }\n 25% { content: '.'; }\n 50% { content: '..'; }\n 75% { content: '...'; }\n }\n @keyframes checkProgress {\n from { transform: scaleX(0); }\n to { transform: scaleX(1); }\n }\n .chatMessageContent p:first-child { margin-top: 0; }\n .chatMessageContent p:last-child { margin-bottom: 0; }\n `}</style>\n </div>\n )\n\n // Show button immediately; popup content needs projectId (resolved from API key via project-info)\n return (\n <>\n {ChatPopup}\n {ChatButton}\n </>\n )\n}\n"]}
@@ -1,5 +1,5 @@
1
1
  'use client';
2
- import { useSignalExperiment, useSignalEvent } from './chunk-N6X76QUF.mjs';
2
+ import { useSignalExperiment, useSignalEvent } from './chunk-G5HUI4BO.mjs';
3
3
  import React, { useEffect } from 'react';
4
4
  import { jsx, Fragment } from 'react/jsx-runtime';
5
5
 
@@ -71,5 +71,5 @@ function ExperimentConversion({
71
71
  }
72
72
 
73
73
  export { ExperimentConversion, SignalExperiment, useExperimentVariant };
74
- //# sourceMappingURL=chunk-A2VLEORI.mjs.map
75
- //# sourceMappingURL=chunk-A2VLEORI.mjs.map
74
+ //# sourceMappingURL=chunk-3B6CXGAK.mjs.map
75
+ //# sourceMappingURL=chunk-3B6CXGAK.mjs.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/signal/SignalExperiment.tsx"],"names":[],"mappings":";;;;AAgDO,SAAS,gBAAA,CAAiB;AAAA,EAC/B,YAAA;AAAA,EACA,QAAA;AAAA,EACA,QAAA;AAAA,EACA,eAAA,GAAkB,IAAA;AAAA,EAClB;AACF,CAAA,EAA0B;AACxB,EAAA,MAAM,EAAE,UAAA,EAAY,OAAA,EAAS,SAAA,EAAU,GAAI,oBAAoB,YAAY,CAAA;AAC3E,EAAA,MAAM,aAAa,cAAA,EAAe;AAGlC,EAAA,SAAA,CAAU,MAAM;AACd,IAAA,IAAI,mBAAmB,OAAA,EAAS;AAC9B,MAAA,UAAA,CAAW;AAAA,QACT,UAAA,EAAY,YAAA;AAAA,QACZ,UAAA,EAAY,YAAA;AAAA,QACZ,UAAA,EAAY;AAAA,UACV,aAAA,EAAe,YAAA;AAAA,UACf,WAAA,EAAa;AAAA;AACf,OACD,CAAA;AAAA,IACH;AAAA,EACF,GAAG,CAAC,YAAA,EAAc,OAAA,EAAS,eAAA,EAAiB,UAAU,CAAC,CAAA;AAGvD,EAAA,IAAI,QAAA,EAAU;AACZ,IAAA,uBAAO,GAAA,CAAA,QAAA,EAAA,EAAG,mBAAS,EAAE,OAAA,EAAS,WAAW,SAAA,EAAW,SAAA,EAAW,CAAA,EAAE,CAAA;AAAA,EACnE;AAGA,EAAA,MAAM,kBAAkB,OAAA,IAAW,SAAA;AACnC,EAAA,MAAM,OAAA,GAAU,SAAS,eAAe,CAAA;AAExC,EAAA,IAAI,YAAY,MAAA,EAAW;AACzB,IAAA,uCAAU,QAAA,EAAA,OAAA,EAAQ,CAAA;AAAA,EACpB;AAGA,EAAA,IAAI,QAAA,EAAU;AACZ,IAAA,uCAAU,QAAA,EAAA,QAAA,EAAS,CAAA;AAAA,EACrB;AAEA,EAAA,uBAAO,GAAA,CAAA,QAAA,EAAA,EAAG,QAAA,EAAA,QAAA,CAAS,OAAA,IAAW,IAAA,EAAK,CAAA;AACrC;AAYO,SAAS,qBAAqB,YAAA,EAAsB;AACzD,EAAA,OAAO,oBAAoB,YAAY,CAAA;AACzC;AAoBO,SAAS,oBAAA,CAAqB;AAAA,EACnC,YAAA;AAAA,EACA,WAAA,GAAc,OAAA;AAAA,EACd,KAAA;AAAA,EACA;AACF,CAAA,EAKG;AACD,EAAA,MAAM,aAAa,cAAA,EAAe;AAClC,EAAA,MAAM,EAAE,OAAA,EAAQ,GAAI,mBAAA,CAAoB,YAAY,CAAA;AAEpD,EAAA,MAAM,oBAAoB,MAAM;AAC9B,IAAA,UAAA,CAAW;AAAA,MACT,UAAA,EAAY,YAAA;AAAA,MACZ,UAAA,EAAY,YAAA;AAAA,MACZ,UAAA,EAAY;AAAA,QACV,aAAA,EAAe,YAAA;AAAA,QACf,WAAA,EAAa,OAAA;AAAA,QACb,YAAA,EAAc,WAAA;AAAA,QACd;AAAA;AACF,KACD,CAAA;AAAA,EACH,CAAA;AAEA,EAAA,OAAO,KAAA,CAAM,aAAa,QAAA,EAAU;AAAA,IAClC,OAAA,EAAS,CAAC,CAAA,KAAwB;AAChC,MAAA,iBAAA,EAAkB;AAElB,MAAA,IAAK,QAAA,CAAS,MAAsD,OAAA,EAAS;AAC3E,QAAC,QAAA,CAAS,KAAA,CAAsD,OAAA,CAAS,CAAC,CAAA;AAAA,MAC5E;AAAA,IACF;AAAA,GACD,CAAA;AACH","file":"chunk-A2VLEORI.mjs","sourcesContent":["/**\n * @sonordev/site-kit/signal - SignalExperiment\n * \n * A/B test component that renders different variants based on Signal assignment.\n * Uses Thompson Sampling (Bayesian bandit) for optimization.\n */\n\n'use client'\n\nimport React, { useMemo, useEffect } from 'react'\nimport { useSignalExperiment, useSignalEvent } from './SignalBridge'\n\ninterface SignalExperimentProps {\n /** Unique experiment ID */\n experimentId: string\n \n /** Variants to test - keys are variant names, values are React nodes */\n variants: Record<string, React.ReactNode>\n \n /** Fallback content if no assignment (defaults to 'control' variant) */\n fallback?: React.ReactNode\n \n /** Track impression automatically */\n trackImpression?: boolean\n \n /** Children function for more control */\n children?: (props: { variant: string; isControl: boolean }) => React.ReactNode\n}\n\n/**\n * Renders different content variants based on Signal's A/B assignment.\n * \n * @example\n * // Simple variant switching\n * <SignalExperiment experimentId=\"hero-cta\" variants={{\n * control: <Button>Get Started</Button>,\n * variant_a: <Button variant=\"primary\">Start Free Trial</Button>,\n * variant_b: <Button variant=\"secondary\">Book a Demo</Button>,\n * }} />\n * \n * @example\n * // With render prop for more control\n * <SignalExperiment experimentId=\"pricing-layout\">\n * {({ variant, isControl }) => (\n * <PricingSection layout={isControl ? 'cards' : 'table'} />\n * )}\n * </SignalExperiment>\n */\nexport function SignalExperiment({\n experimentId,\n variants,\n fallback,\n trackImpression = true,\n children,\n}: SignalExperimentProps) {\n const { assignment, variant, isControl } = useSignalExperiment(experimentId)\n const trackEvent = useSignalEvent()\n \n // Track impression when variant is rendered\n useEffect(() => {\n if (trackImpression && variant) {\n trackEvent({\n event_type: 'experiment',\n event_name: 'impression',\n event_data: {\n experiment_id: experimentId,\n variant_key: variant,\n },\n })\n }\n }, [experimentId, variant, trackImpression, trackEvent])\n \n // If using render prop\n if (children) {\n return <>{children({ variant: variant || 'control', isControl })}</>\n }\n \n // Determine what to render\n const selectedVariant = variant || 'control'\n const content = variants[selectedVariant]\n \n if (content !== undefined) {\n return <>{content}</>\n }\n \n // Fallback to provided fallback or control\n if (fallback) {\n return <>{fallback}</>\n }\n \n return <>{variants.control || null}</>\n}\n\n/**\n * Hook for conditional experiment logic\n * \n * @example\n * const { variant, isControl } = useExperimentVariant('pricing-test')\n * \n * return isControl \n * ? <OldPricing />\n * : <NewPricing showAnnual={variant === 'annual_first'} />\n */\nexport function useExperimentVariant(experimentId: string) {\n return useSignalExperiment(experimentId)\n}\n\n/**\n * Component for tracking experiment conversions\n * Wraps interactive elements to track when they convert\n * \n * @example\n * <SignalExperiment experimentId=\"signup-button\" variants={{\n * control: (\n * <ExperimentConversion experimentId=\"signup-button\" outcomeType=\"click\">\n * <Button>Sign Up</Button>\n * </ExperimentConversion>\n * ),\n * variant_a: (\n * <ExperimentConversion experimentId=\"signup-button\" outcomeType=\"click\">\n * <Button variant=\"large\">Join Now - It's Free!</Button>\n * </ExperimentConversion>\n * ),\n * }} />\n */\nexport function ExperimentConversion({\n experimentId,\n outcomeType = 'click',\n value,\n children,\n}: {\n experimentId: string\n outcomeType?: string\n value?: number\n children: React.ReactElement<{ onClick?: (e: React.MouseEvent) => void }>\n}) {\n const trackEvent = useSignalEvent()\n const { variant } = useSignalExperiment(experimentId)\n\n const handleInteraction = () => {\n trackEvent({\n event_type: 'experiment',\n event_name: 'conversion',\n event_data: {\n experiment_id: experimentId,\n variant_key: variant,\n outcome_type: outcomeType,\n value,\n },\n })\n }\n\n return React.cloneElement(children, {\n onClick: (e: React.MouseEvent) => {\n handleInteraction()\n // Call original onClick if exists\n if ((children.props as { onClick?: (e: React.MouseEvent) => void }).onClick) {\n (children.props as { onClick?: (e: React.MouseEvent) => void }).onClick!(e)\n }\n },\n })\n}\n"]}
1
+ {"version":3,"sources":["../src/signal/SignalExperiment.tsx"],"names":[],"mappings":";;;;AAgDO,SAAS,gBAAA,CAAiB;AAAA,EAC/B,YAAA;AAAA,EACA,QAAA;AAAA,EACA,QAAA;AAAA,EACA,eAAA,GAAkB,IAAA;AAAA,EAClB;AACF,CAAA,EAA0B;AACxB,EAAA,MAAM,EAAE,UAAA,EAAY,OAAA,EAAS,SAAA,EAAU,GAAI,oBAAoB,YAAY,CAAA;AAC3E,EAAA,MAAM,aAAa,cAAA,EAAe;AAGlC,EAAA,SAAA,CAAU,MAAM;AACd,IAAA,IAAI,mBAAmB,OAAA,EAAS;AAC9B,MAAA,UAAA,CAAW;AAAA,QACT,UAAA,EAAY,YAAA;AAAA,QACZ,UAAA,EAAY,YAAA;AAAA,QACZ,UAAA,EAAY;AAAA,UACV,aAAA,EAAe,YAAA;AAAA,UACf,WAAA,EAAa;AAAA;AACf,OACD,CAAA;AAAA,IACH;AAAA,EACF,GAAG,CAAC,YAAA,EAAc,OAAA,EAAS,eAAA,EAAiB,UAAU,CAAC,CAAA;AAGvD,EAAA,IAAI,QAAA,EAAU;AACZ,IAAA,uBAAO,GAAA,CAAA,QAAA,EAAA,EAAG,mBAAS,EAAE,OAAA,EAAS,WAAW,SAAA,EAAW,SAAA,EAAW,CAAA,EAAE,CAAA;AAAA,EACnE;AAGA,EAAA,MAAM,kBAAkB,OAAA,IAAW,SAAA;AACnC,EAAA,MAAM,OAAA,GAAU,SAAS,eAAe,CAAA;AAExC,EAAA,IAAI,YAAY,MAAA,EAAW;AACzB,IAAA,uCAAU,QAAA,EAAA,OAAA,EAAQ,CAAA;AAAA,EACpB;AAGA,EAAA,IAAI,QAAA,EAAU;AACZ,IAAA,uCAAU,QAAA,EAAA,QAAA,EAAS,CAAA;AAAA,EACrB;AAEA,EAAA,uBAAO,GAAA,CAAA,QAAA,EAAA,EAAG,QAAA,EAAA,QAAA,CAAS,OAAA,IAAW,IAAA,EAAK,CAAA;AACrC;AAYO,SAAS,qBAAqB,YAAA,EAAsB;AACzD,EAAA,OAAO,oBAAoB,YAAY,CAAA;AACzC;AAoBO,SAAS,oBAAA,CAAqB;AAAA,EACnC,YAAA;AAAA,EACA,WAAA,GAAc,OAAA;AAAA,EACd,KAAA;AAAA,EACA;AACF,CAAA,EAKG;AACD,EAAA,MAAM,aAAa,cAAA,EAAe;AAClC,EAAA,MAAM,EAAE,OAAA,EAAQ,GAAI,mBAAA,CAAoB,YAAY,CAAA;AAEpD,EAAA,MAAM,oBAAoB,MAAM;AAC9B,IAAA,UAAA,CAAW;AAAA,MACT,UAAA,EAAY,YAAA;AAAA,MACZ,UAAA,EAAY,YAAA;AAAA,MACZ,UAAA,EAAY;AAAA,QACV,aAAA,EAAe,YAAA;AAAA,QACf,WAAA,EAAa,OAAA;AAAA,QACb,YAAA,EAAc,WAAA;AAAA,QACd;AAAA;AACF,KACD,CAAA;AAAA,EACH,CAAA;AAEA,EAAA,OAAO,KAAA,CAAM,aAAa,QAAA,EAAU;AAAA,IAClC,OAAA,EAAS,CAAC,CAAA,KAAwB;AAChC,MAAA,iBAAA,EAAkB;AAElB,MAAA,IAAK,QAAA,CAAS,MAAsD,OAAA,EAAS;AAC3E,QAAC,QAAA,CAAS,KAAA,CAAsD,OAAA,CAAS,CAAC,CAAA;AAAA,MAC5E;AAAA,IACF;AAAA,GACD,CAAA;AACH","file":"chunk-3B6CXGAK.mjs","sourcesContent":["/**\n * @sonordev/site-kit/signal - SignalExperiment\n * \n * A/B test component that renders different variants based on Signal assignment.\n * Uses Thompson Sampling (Bayesian bandit) for optimization.\n */\n\n'use client'\n\nimport React, { useMemo, useEffect } from 'react'\nimport { useSignalExperiment, useSignalEvent } from './SignalBridge'\n\ninterface SignalExperimentProps {\n /** Unique experiment ID */\n experimentId: string\n \n /** Variants to test - keys are variant names, values are React nodes */\n variants: Record<string, React.ReactNode>\n \n /** Fallback content if no assignment (defaults to 'control' variant) */\n fallback?: React.ReactNode\n \n /** Track impression automatically */\n trackImpression?: boolean\n \n /** Children function for more control */\n children?: (props: { variant: string; isControl: boolean }) => React.ReactNode\n}\n\n/**\n * Renders different content variants based on Signal's A/B assignment.\n * \n * @example\n * // Simple variant switching\n * <SignalExperiment experimentId=\"hero-cta\" variants={{\n * control: <Button>Get Started</Button>,\n * variant_a: <Button variant=\"primary\">Start Free Trial</Button>,\n * variant_b: <Button variant=\"secondary\">Book a Demo</Button>,\n * }} />\n * \n * @example\n * // With render prop for more control\n * <SignalExperiment experimentId=\"pricing-layout\">\n * {({ variant, isControl }) => (\n * <PricingSection layout={isControl ? 'cards' : 'table'} />\n * )}\n * </SignalExperiment>\n */\nexport function SignalExperiment({\n experimentId,\n variants,\n fallback,\n trackImpression = true,\n children,\n}: SignalExperimentProps) {\n const { assignment, variant, isControl } = useSignalExperiment(experimentId)\n const trackEvent = useSignalEvent()\n \n // Track impression when variant is rendered\n useEffect(() => {\n if (trackImpression && variant) {\n trackEvent({\n event_type: 'experiment',\n event_name: 'impression',\n event_data: {\n experiment_id: experimentId,\n variant_key: variant,\n },\n })\n }\n }, [experimentId, variant, trackImpression, trackEvent])\n \n // If using render prop\n if (children) {\n return <>{children({ variant: variant || 'control', isControl })}</>\n }\n \n // Determine what to render\n const selectedVariant = variant || 'control'\n const content = variants[selectedVariant]\n \n if (content !== undefined) {\n return <>{content}</>\n }\n \n // Fallback to provided fallback or control\n if (fallback) {\n return <>{fallback}</>\n }\n \n return <>{variants.control || null}</>\n}\n\n/**\n * Hook for conditional experiment logic\n * \n * @example\n * const { variant, isControl } = useExperimentVariant('pricing-test')\n * \n * return isControl \n * ? <OldPricing />\n * : <NewPricing showAnnual={variant === 'annual_first'} />\n */\nexport function useExperimentVariant(experimentId: string) {\n return useSignalExperiment(experimentId)\n}\n\n/**\n * Component for tracking experiment conversions\n * Wraps interactive elements to track when they convert\n * \n * @example\n * <SignalExperiment experimentId=\"signup-button\" variants={{\n * control: (\n * <ExperimentConversion experimentId=\"signup-button\" outcomeType=\"click\">\n * <Button>Sign Up</Button>\n * </ExperimentConversion>\n * ),\n * variant_a: (\n * <ExperimentConversion experimentId=\"signup-button\" outcomeType=\"click\">\n * <Button variant=\"large\">Join Now - It's Free!</Button>\n * </ExperimentConversion>\n * ),\n * }} />\n */\nexport function ExperimentConversion({\n experimentId,\n outcomeType = 'click',\n value,\n children,\n}: {\n experimentId: string\n outcomeType?: string\n value?: number\n children: React.ReactElement<{ onClick?: (e: React.MouseEvent) => void }>\n}) {\n const trackEvent = useSignalEvent()\n const { variant } = useSignalExperiment(experimentId)\n\n const handleInteraction = () => {\n trackEvent({\n event_type: 'experiment',\n event_name: 'conversion',\n event_data: {\n experiment_id: experimentId,\n variant_key: variant,\n outcome_type: outcomeType,\n value,\n },\n })\n }\n\n return React.cloneElement(children, {\n onClick: (e: React.MouseEvent) => {\n handleInteraction()\n // Call original onClick if exists\n if ((children.props as { onClick?: (e: React.MouseEvent) => void }).onClick) {\n (children.props as { onClick?: (e: React.MouseEvent) => void }).onClick!(e)\n }\n },\n })\n}\n"]}
@@ -26,5 +26,5 @@ function trackConversion(options) {
26
26
  exports.registerAnalyticsDispatcher = registerAnalyticsDispatcher;
27
27
  exports.trackConversion = trackConversion;
28
28
  exports.trackEvent = trackEvent;
29
- //# sourceMappingURL=chunk-HMFFAUCD.js.map
30
- //# sourceMappingURL=chunk-HMFFAUCD.js.map
29
+ //# sourceMappingURL=chunk-3DWIYCQX.js.map
30
+ //# sourceMappingURL=chunk-3DWIYCQX.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/analytics/dispatch.ts"],"names":[],"mappings":";;;AA4BA,IAAM,SAAA,GAAY,EAAA;AAElB,IAAI,UAAA,GAAyC,IAAA;AAC7C,IAAI,QAAsB,EAAC;AAMpB,SAAS,4BAA4B,IAAA,EAAwC;AAClF,EAAA,UAAA,GAAa,IAAA;AACb,EAAA,IAAI,CAAC,IAAA,EAAM;AACX,EAAA,MAAM,OAAA,GAAU,KAAA;AAChB,EAAA,KAAA,GAAQ,EAAC;AACT,EAAA,KAAA,MAAW,QAAQ,OAAA,EAAS;AAC1B,IAAA,IAAI,KAAK,IAAA,KAAS,OAAA,EAAS,IAAA,CAAK,UAAA,CAAW,KAAK,OAAO,CAAA;AAAA,SAClD,IAAA,CAAK,eAAA,CAAgB,IAAA,CAAK,OAAO,CAAA;AAAA,EACxC;AACF;AAOO,SAAS,WAAW,OAAA,EAAkC;AAC3D,EAAA,IAAI,UAAA,EAAY,UAAA,CAAW,UAAA,CAAW,OAAO,CAAA;AAAA,OAAA,IACpC,KAAA,CAAM,SAAS,SAAA,EAAW,KAAA,CAAM,KAAK,EAAE,IAAA,EAAM,OAAA,EAAS,OAAA,EAAS,CAAA;AAC1E;AAGO,SAAS,gBAAgB,OAAA,EAAuC;AACrE,EAAA,IAAI,UAAA,EAAY,UAAA,CAAW,eAAA,CAAgB,OAAO,CAAA;AAAA,OAAA,IACzC,KAAA,CAAM,SAAS,SAAA,EAAW,KAAA,CAAM,KAAK,EAAE,IAAA,EAAM,YAAA,EAAc,OAAA,EAAS,CAAA;AAC/E","file":"chunk-3DWIYCQX.js","sourcesContent":["/**\n * @sonordev/site-kit — standalone analytics dispatch bridge\n *\n * The analytics API is hook-based (useAnalytics), which requires living\n * inside <AnalyticsProvider>. But SiteKitLayout mounts the provider as a\n * childless deferred SIBLING of the page tree (see SiteKitClientProviders),\n * so page components — and sibling packages like @sonordev/agency-site-kit —\n * can never reach the context.\n *\n * This module is the bridge: AnalyticsProvider registers its trackEvent /\n * trackConversion here on mount (single source of payload construction — do\n * NOT re-implement the POST anywhere else), and the standalone functions\n * below queue until it does. If the provider never mounts, calls no-op after\n * the queue cap — tracking must never break a page.\n */\n\nimport type { TrackEventOptions, TrackConversionOptions } from './types'\n\ninterface AnalyticsDispatcher {\n trackEvent: (options: TrackEventOptions) => void\n trackConversion: (options: TrackConversionOptions) => void\n}\n\ntype QueuedCall =\n | { kind: 'event'; options: TrackEventOptions }\n | { kind: 'conversion'; options: TrackConversionOptions }\n\n/** Pre-mount buffer — bounded so a page without analytics can't grow it forever. */\nconst MAX_QUEUE = 50\n\nlet dispatcher: AnalyticsDispatcher | null = null\nlet queue: QueuedCall[] = []\n\n/**\n * Called by AnalyticsProvider on mount/unmount. Flushes anything queued\n * before the (idle-deferred) provider arrived.\n */\nexport function registerAnalyticsDispatcher(next: AnalyticsDispatcher | null): void {\n dispatcher = next\n if (!next) return\n const pending = queue\n queue = []\n for (const call of pending) {\n if (call.kind === 'event') next.trackEvent(call.options)\n else next.trackConversion(call.options)\n }\n}\n\n/**\n * Track a custom analytics event from anywhere client-side — no provider\n * context needed. Queues until AnalyticsProvider mounts; no-ops (bounded)\n * if it never does.\n */\nexport function trackEvent(options: TrackEventOptions): void {\n if (dispatcher) dispatcher.trackEvent(options)\n else if (queue.length < MAX_QUEUE) queue.push({ kind: 'event', options })\n}\n\n/** Conversion twin of {@link trackEvent}. */\nexport function trackConversion(options: TrackConversionOptions): void {\n if (dispatcher) dispatcher.trackConversion(options)\n else if (queue.length < MAX_QUEUE) queue.push({ kind: 'conversion', options })\n}\n"]}
@@ -1,14 +1,14 @@
1
1
  'use client';
2
2
  'use strict';
3
3
 
4
- var chunkHMFFAUCD_js = require('./chunk-HMFFAUCD.js');
4
+ var chunk3DWIYCQX_js = require('./chunk-3DWIYCQX.js');
5
5
  var react = require('react');
6
6
 
7
7
  function useContactTracking(options = {}) {
8
8
  const { autoTrack = true, debug = false } = options;
9
9
  const trackPhoneClick = react.useCallback((phoneNumber, metadata) => {
10
10
  if (debug) console.log("[Analytics] Phone click:", phoneNumber);
11
- chunkHMFFAUCD_js.trackConversion({
11
+ chunk3DWIYCQX_js.trackConversion({
12
12
  type: "phone_call",
13
13
  metadata: {
14
14
  phoneNumber: phoneNumber.replace(/\D/g, ""),
@@ -20,7 +20,7 @@ function useContactTracking(options = {}) {
20
20
  }, [debug]);
21
21
  const trackEmailClick = react.useCallback((email, metadata) => {
22
22
  if (debug) console.log("[Analytics] Email click:", email);
23
- chunkHMFFAUCD_js.trackConversion({
23
+ chunk3DWIYCQX_js.trackConversion({
24
24
  type: "email_click",
25
25
  metadata: {
26
26
  email,
@@ -67,5 +67,5 @@ function ContactTracking({ debug = false }) {
67
67
 
68
68
  exports.ContactTracking = ContactTracking;
69
69
  exports.useContactTracking = useContactTracking;
70
- //# sourceMappingURL=chunk-3EPMDPWI.js.map
71
- //# sourceMappingURL=chunk-3EPMDPWI.js.map
70
+ //# sourceMappingURL=chunk-3SDMJMN2.js.map
71
+ //# sourceMappingURL=chunk-3SDMJMN2.js.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/analytics/useContactTracking.ts"],"names":["useCallback","trackConversion","useEffect"],"mappings":"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","file":"chunk-3EPMDPWI.js","sourcesContent":["/**\n * @sonordev/site-kit/analytics - Contact Tracking Hook\n * \n * Tracks phone calls and email clicks as conversions.\n * Use this hook to automatically track tel: and mailto: links,\n * or manually track contact interactions.\n */\n\n'use client'\n\nimport { useCallback, useEffect } from 'react'\n// Deliberately the standalone dispatch bridge, NOT useAnalytics().\n//\n// SiteKitLayout mounts AnalyticsProvider as a childless deferred SIBLING of\n// the page tree (wrapping children in a dynamic ssr:false provider de-opts the\n// whole route to client rendering - see SiteKitClientProviders). That means no\n// component a site can actually place is ever inside the provider, so the hook\n// form threw \"useAnalytics must be used within an AnalyticsProvider\" and this\n// component could not be used with the documented layout at all.\n//\n// dispatch queues until the deferred provider registers itself, so calls made\n// before analytics is ready still land.\nimport { trackConversion } from './dispatch'\n\nexport interface UseContactTrackingOptions {\n /** Automatically track all tel: and mailto: links (default: true) */\n autoTrack?: boolean\n /** Debug mode - logs events to console */\n debug?: boolean\n}\n\nexport interface ContactTrackingReturn {\n /** Manually track a phone call click */\n trackPhoneClick: (phoneNumber: string, metadata?: Record<string, unknown>) => void\n /** Manually track an email click */\n trackEmailClick: (email: string, metadata?: Record<string, unknown>) => void\n}\n\n/**\n * Hook for tracking phone and email contact interactions as conversions.\n * \n * @example\n * ```tsx\n * // Auto-track all tel: and mailto: links\n * useContactTracking()\n * \n * // Manual tracking\n * const { trackPhoneClick, trackEmailClick } = useContactTracking()\n * trackPhoneClick('513-555-1234')\n * trackEmailClick('hello@example.com')\n * ```\n */\nexport function useContactTracking(options: UseContactTrackingOptions = {}): ContactTrackingReturn {\n const { autoTrack = true, debug = false } = options\n\n const trackPhoneClick = useCallback((phoneNumber: string, metadata?: Record<string, unknown>) => {\n if (debug) console.log('[Analytics] Phone click:', phoneNumber)\n \n trackConversion({\n type: 'phone_call',\n metadata: {\n phoneNumber: phoneNumber.replace(/\\D/g, ''), // Normalize to digits\n rawNumber: phoneNumber,\n ...metadata,\n },\n })\n }, [debug])\n \n const trackEmailClick = useCallback((email: string, metadata?: Record<string, unknown>) => {\n if (debug) console.log('[Analytics] Email click:', email)\n \n trackConversion({\n type: 'email_click',\n metadata: {\n email,\n ...metadata,\n },\n })\n }, [debug])\n \n // Auto-track tel: and mailto: links\n useEffect(() => {\n if (!autoTrack || typeof document === 'undefined') return\n \n const handleClick = (e: MouseEvent) => {\n const target = e.target as HTMLElement\n const anchor = target.closest('a')\n if (!anchor) return\n \n const href = anchor.getAttribute('href')\n if (!href) return\n \n if (href.startsWith('tel:')) {\n const phone = href.replace('tel:', '').trim()\n trackPhoneClick(phone, {\n linkText: anchor.textContent?.trim(),\n source: 'auto',\n })\n } else if (href.startsWith('mailto:')) {\n const email = href.replace('mailto:', '').split('?')[0].trim()\n trackEmailClick(email, {\n linkText: anchor.textContent?.trim(),\n source: 'auto',\n })\n }\n }\n \n document.addEventListener('click', handleClick, { capture: true })\n \n return () => {\n document.removeEventListener('click', handleClick, { capture: true })\n }\n }, [autoTrack, trackPhoneClick, trackEmailClick])\n \n return {\n trackPhoneClick,\n trackEmailClick,\n }\n}\n\n/**\n * Component wrapper for contact tracking\n * Simply include this component to auto-track all tel: and mailto: links\n * \n * @example\n * ```tsx\n * <ContactTracking />\n * ```\n */\nexport function ContactTracking({ debug = false }: { debug?: boolean }) {\n useContactTracking({ autoTrack: true, debug })\n return null\n}\n"]}
1
+ {"version":3,"sources":["../src/analytics/useContactTracking.ts"],"names":["useCallback","trackConversion","useEffect"],"mappings":"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","file":"chunk-3SDMJMN2.js","sourcesContent":["/**\n * @sonordev/site-kit/analytics - Contact Tracking Hook\n * \n * Tracks phone calls and email clicks as conversions.\n * Use this hook to automatically track tel: and mailto: links,\n * or manually track contact interactions.\n */\n\n'use client'\n\nimport { useCallback, useEffect } from 'react'\n// Deliberately the standalone dispatch bridge, NOT useAnalytics().\n//\n// SiteKitLayout mounts AnalyticsProvider as a childless deferred SIBLING of\n// the page tree (wrapping children in a dynamic ssr:false provider de-opts the\n// whole route to client rendering - see SiteKitClientProviders). That means no\n// component a site can actually place is ever inside the provider, so the hook\n// form threw \"useAnalytics must be used within an AnalyticsProvider\" and this\n// component could not be used with the documented layout at all.\n//\n// dispatch queues until the deferred provider registers itself, so calls made\n// before analytics is ready still land.\nimport { trackConversion } from './dispatch'\n\nexport interface UseContactTrackingOptions {\n /** Automatically track all tel: and mailto: links (default: true) */\n autoTrack?: boolean\n /** Debug mode - logs events to console */\n debug?: boolean\n}\n\nexport interface ContactTrackingReturn {\n /** Manually track a phone call click */\n trackPhoneClick: (phoneNumber: string, metadata?: Record<string, unknown>) => void\n /** Manually track an email click */\n trackEmailClick: (email: string, metadata?: Record<string, unknown>) => void\n}\n\n/**\n * Hook for tracking phone and email contact interactions as conversions.\n * \n * @example\n * ```tsx\n * // Auto-track all tel: and mailto: links\n * useContactTracking()\n * \n * // Manual tracking\n * const { trackPhoneClick, trackEmailClick } = useContactTracking()\n * trackPhoneClick('513-555-1234')\n * trackEmailClick('hello@example.com')\n * ```\n */\nexport function useContactTracking(options: UseContactTrackingOptions = {}): ContactTrackingReturn {\n const { autoTrack = true, debug = false } = options\n\n const trackPhoneClick = useCallback((phoneNumber: string, metadata?: Record<string, unknown>) => {\n if (debug) console.log('[Analytics] Phone click:', phoneNumber)\n \n trackConversion({\n type: 'phone_call',\n metadata: {\n phoneNumber: phoneNumber.replace(/\\D/g, ''), // Normalize to digits\n rawNumber: phoneNumber,\n ...metadata,\n },\n })\n }, [debug])\n \n const trackEmailClick = useCallback((email: string, metadata?: Record<string, unknown>) => {\n if (debug) console.log('[Analytics] Email click:', email)\n \n trackConversion({\n type: 'email_click',\n metadata: {\n email,\n ...metadata,\n },\n })\n }, [debug])\n \n // Auto-track tel: and mailto: links\n useEffect(() => {\n if (!autoTrack || typeof document === 'undefined') return\n \n const handleClick = (e: MouseEvent) => {\n const target = e.target as HTMLElement\n const anchor = target.closest('a')\n if (!anchor) return\n \n const href = anchor.getAttribute('href')\n if (!href) return\n \n if (href.startsWith('tel:')) {\n const phone = href.replace('tel:', '').trim()\n trackPhoneClick(phone, {\n linkText: anchor.textContent?.trim(),\n source: 'auto',\n })\n } else if (href.startsWith('mailto:')) {\n const email = href.replace('mailto:', '').split('?')[0].trim()\n trackEmailClick(email, {\n linkText: anchor.textContent?.trim(),\n source: 'auto',\n })\n }\n }\n \n document.addEventListener('click', handleClick, { capture: true })\n \n return () => {\n document.removeEventListener('click', handleClick, { capture: true })\n }\n }, [autoTrack, trackPhoneClick, trackEmailClick])\n \n return {\n trackPhoneClick,\n trackEmailClick,\n }\n}\n\n/**\n * Component wrapper for contact tracking\n * Simply include this component to auto-track all tel: and mailto: links\n * \n * @example\n * ```tsx\n * <ContactTracking />\n * ```\n */\nexport function ContactTracking({ debug = false }: { debug?: boolean }) {\n useContactTracking({ autoTrack: true, debug })\n return null\n}\n"]}
@@ -0,0 +1,39 @@
1
+ import { VISUAL_VIEWPORT_GAP_PROPERTY } from './chunk-NSWO43XW.mjs';
2
+
3
+ // src/engage/launcher-placement.ts
4
+ var DEFAULT_LAUNCHER_OFFSET_BOTTOM = "20px";
5
+ var DEFAULT_ENGAGE_Z_INDEX = 9999;
6
+ var LAUNCHER_OFFSET_PROPERTY = "--sk-echo-offset-bottom";
7
+ var SIDE_GUTTER = "20px";
8
+ var POPUP_ABOVE_LAUNCHER = "70px";
9
+ var POPUP_VERTICAL_RESERVE = "100px";
10
+ function toCssLength(value) {
11
+ if (typeof value === "number") return Number.isFinite(value) ? `${value}px` : void 0;
12
+ const trimmed = value?.trim();
13
+ return trimmed ? trimmed : void 0;
14
+ }
15
+ function chatLauncherStyles({ position, offsetBottom, zIndex } = {}) {
16
+ const side = position === "bottom-left" ? { left: SIDE_GUTTER } : { right: SIDE_GUTTER };
17
+ const offset = toCssLength(offsetBottom) ?? DEFAULT_LAUNCHER_OFFSET_BOTTOM;
18
+ const layer = typeof zIndex === "number" && Number.isFinite(zIndex) ? zIndex : DEFAULT_ENGAGE_Z_INDEX;
19
+ const clearance = `var(${LAUNCHER_OFFSET_PROPERTY}, ${offset}) + env(safe-area-inset-bottom, 0px) + var(${VISUAL_VIEWPORT_GAP_PROPERTY}, 0px)`;
20
+ return {
21
+ launcher: {
22
+ ...side,
23
+ bottom: `calc(${clearance})`
24
+ },
25
+ popup: {
26
+ ...side,
27
+ bottom: `calc(${clearance} + ${POPUP_ABOVE_LAUNCHER})`,
28
+ maxHeight: `calc(100dvh - (${clearance}) - ${POPUP_VERTICAL_RESERVE})`
29
+ },
30
+ // One beneath the launcher. At 0 or below, the same layer instead: -1
31
+ // would paint the popup behind the page's own content, and at a shared
32
+ // layer the launcher, which renders after the popup, still paints on top.
33
+ zIndex: { launcher: layer, popup: layer > 0 ? layer - 1 : layer }
34
+ };
35
+ }
36
+
37
+ export { DEFAULT_ENGAGE_Z_INDEX, chatLauncherStyles };
38
+ //# sourceMappingURL=chunk-4U5NCKQY.mjs.map
39
+ //# sourceMappingURL=chunk-4U5NCKQY.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/engage/launcher-placement.ts"],"names":[],"mappings":";;;AAkBO,IAAM,8BAAA,GAAiC,MAAA;AAOvC,IAAM,sBAAA,GAAyB;AAO/B,IAAM,wBAAA,GAA2B,yBAAA;AAGxC,IAAM,WAAA,GAAc,MAAA;AAEpB,IAAM,oBAAA,GAAuB,MAAA;AAE7B,IAAM,sBAAA,GAAyB,OAAA;AAe/B,SAAS,YAAY,KAAA,EAAwD;AAC3E,EAAA,IAAI,OAAO,KAAA,KAAU,QAAA,EAAU,OAAO,MAAA,CAAO,SAAS,KAAK,CAAA,GAAI,CAAA,EAAG,KAAK,CAAA,EAAA,CAAA,GAAO,MAAA;AAC9E,EAAA,MAAM,OAAA,GAAU,OAAO,IAAA,EAAK;AAC5B,EAAA,OAAO,UAAU,OAAA,GAAU,MAAA;AAC7B;AAaO,SAAS,mBACd,EAAE,QAAA,EAAU,cAAc,MAAA,EAAO,GAA2B,EAAC,EACzC;AACpB,EAAA,MAAM,IAAA,GACJ,aAAa,aAAA,GAAgB,EAAE,MAAM,WAAA,EAAY,GAAI,EAAE,KAAA,EAAO,WAAA,EAAY;AAC5E,EAAA,MAAM,MAAA,GAAS,WAAA,CAAY,YAAY,CAAA,IAAK,8BAAA;AAC5C,EAAA,MAAM,KAAA,GACJ,OAAO,MAAA,KAAW,QAAA,IAAY,OAAO,QAAA,CAAS,MAAM,IAAI,MAAA,GAAS,sBAAA;AAMnE,EAAA,MAAM,YACJ,CAAA,IAAA,EAAO,wBAAwB,CAAA,EAAA,EAAK,MAAM,8CAEhC,4BAA4B,CAAA,MAAA,CAAA;AAExC,EAAA,OAAO;AAAA,IACL,QAAA,EAAU;AAAA,MACR,GAAG,IAAA;AAAA,MACH,MAAA,EAAQ,QAAQ,SAAS,CAAA,CAAA;AAAA,KAC3B;AAAA,IACA,KAAA,EAAO;AAAA,MACL,GAAG,IAAA;AAAA,MACH,MAAA,EAAQ,CAAA,KAAA,EAAQ,SAAS,CAAA,GAAA,EAAM,oBAAoB,CAAA,CAAA,CAAA;AAAA,MACnD,SAAA,EAAW,CAAA,eAAA,EAAkB,SAAS,CAAA,IAAA,EAAO,sBAAsB,CAAA,CAAA;AAAA,KACrE;AAAA;AAAA;AAAA;AAAA,IAIA,MAAA,EAAQ,EAAE,QAAA,EAAU,KAAA,EAAO,OAAO,KAAA,GAAQ,CAAA,GAAI,KAAA,GAAQ,CAAA,GAAI,KAAA;AAAM,GAClE;AACF","file":"chunk-4U5NCKQY.mjs","sourcesContent":["/**\n * @sonordev/site-kit/engage - Chat launcher placement\n *\n * Single source of truth for where the Echo launcher sits and, derived from\n * it, where the chat popup opens, on screen and in the stacking order.\n * ChatWidget styles both elements from here.\n *\n * The popup used to be positioned by its own hardcoded numbers, so a site\n * that lifted the launcher with `!important` (the only way past an inline\n * style) left the popup behind, and the launcher then sat over the popup's\n * input row. Deriving both from one clearance makes that impossible.\n */\n\nimport type { CSSProperties } from 'react'\nimport { VISUAL_VIEWPORT_GAP_PROPERTY } from '../shared/visual-viewport-gap'\nimport type { ChatLauncherPlacement } from './types'\n\n/** Launcher clearance above the bottom edge when a site sets nothing. */\nexport const DEFAULT_LAUNCHER_OFFSET_BOTTOM = '20px'\n\n/**\n * Layer everything Engage renders stacks on when a site sets nothing:\n * popups, nudges, bars and the chat launcher, with the chat popup one below.\n * EngageWidget's default comes from here too.\n */\nexport const DEFAULT_ENGAGE_Z_INDEX = 9999\n\n/**\n * Custom property a stylesheet can set to move the launcher. Wins over the\n * `offsetBottom` option. Deliberately never declared by the kit: a property\n * with a value can never fall through to its own `var()` fallback.\n */\nexport const LAUNCHER_OFFSET_PROPERTY = '--sk-echo-offset-bottom'\n\n/** The launcher's gutter from the side edge. */\nconst SIDE_GUTTER = '20px'\n/** Launcher height (60px) plus the 10px gap the popup keeps above it. */\nconst POPUP_ABOVE_LAUNCHER = '70px'\n/** What the popup's max height gives up: 70px beneath it, 30px clear of the top edge. */\nconst POPUP_VERTICAL_RESERVE = '100px'\n\nexport interface ChatLauncherStyles {\n /** Spread into the launcher's inline style. */\n launcher: CSSProperties\n /** Spread into the popup's inline style. */\n popup: CSSProperties\n /**\n * Each element's `z-index`. Kept out of the spreads so it stays in the\n * slot it always had in each inline style, and the default markup is\n * byte-identical to 5.4's.\n */\n zIndex: { launcher: number; popup: number }\n}\n\nfunction toCssLength(value: string | number | undefined): string | undefined {\n if (typeof value === 'number') return Number.isFinite(value) ? `${value}px` : undefined\n const trimmed = value?.trim()\n return trimmed ? trimmed : undefined\n}\n\n/**\n * Placement styles for the launcher and popup. Everything that is not\n * placement stays in ChatWidget.\n *\n * With no options this resolves to the pre-5.5 geometry: launcher 20px above\n * the safe-area inset, popup 90px above it, popup at most `100dvh - 120px`\n * tall, launcher on z-index 9999 and popup on 9998. The difference is that\n * the inset and the visual viewport gap now also come off the popup's max\n * height, so a tall popup can't run past the top of the screen on a phone\n * with a home indicator.\n */\nexport function chatLauncherStyles(\n { position, offsetBottom, zIndex }: ChatLauncherPlacement = {},\n): ChatLauncherStyles {\n const side: CSSProperties =\n position === 'bottom-left' ? { left: SIDE_GUTTER } : { right: SIDE_GUTTER }\n const offset = toCssLength(offsetBottom) ?? DEFAULT_LAUNCHER_OFFSET_BOTTOM\n const layer =\n typeof zIndex === 'number' && Number.isFinite(zIndex) ? zIndex : DEFAULT_ENGAGE_Z_INDEX\n\n // The launcher's height above the bottom of what the visitor can see: the\n // site's offset (stylesheet token first, so it can vary by page or\n // breakpoint), then the home-indicator inset, then any layout/visual\n // viewport gap (0 unless the site mounts VisualViewportGap).\n const clearance =\n `var(${LAUNCHER_OFFSET_PROPERTY}, ${offset})` +\n ' + env(safe-area-inset-bottom, 0px)' +\n ` + var(${VISUAL_VIEWPORT_GAP_PROPERTY}, 0px)`\n\n return {\n launcher: {\n ...side,\n bottom: `calc(${clearance})`,\n },\n popup: {\n ...side,\n bottom: `calc(${clearance} + ${POPUP_ABOVE_LAUNCHER})`,\n maxHeight: `calc(100dvh - (${clearance}) - ${POPUP_VERTICAL_RESERVE})`,\n },\n // One beneath the launcher. At 0 or below, the same layer instead: -1\n // would paint the popup behind the page's own content, and at a shared\n // layer the launcher, which renders after the popup, still paints on top.\n zIndex: { launcher: layer, popup: layer > 0 ? layer - 1 : layer },\n }\n}\n"]}