@sonordev/site-kit 1.5.5 → 2.0.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 (269) hide show
  1. package/dist/AnalyticsProvider-J7UMCBCJ.mjs +4 -0
  2. package/dist/{AnalyticsProvider-BBLU4U2T.mjs.map → AnalyticsProvider-J7UMCBCJ.mjs.map} +1 -1
  3. package/dist/AnalyticsProvider-PPDJIGWY.js +25 -0
  4. package/dist/{AnalyticsProvider-EMDIAAWR.js.map → AnalyticsProvider-PPDJIGWY.js.map} +1 -1
  5. package/dist/EngageWidget-IDBEBGQR.js +13 -0
  6. package/dist/{EngageWidget-UHWXXCAX.js.map → EngageWidget-IDBEBGQR.js.map} +1 -1
  7. package/dist/EngageWidget-SRRI4W7U.mjs +4 -0
  8. package/dist/{EngageWidget-CVZMTSB6.mjs.map → EngageWidget-SRRI4W7U.mjs.map} +1 -1
  9. package/dist/SignalBridge-D6W6OLVG.mjs +4 -0
  10. package/dist/{SignalBridge-WGHMEILW.mjs.map → SignalBridge-D6W6OLVG.mjs.map} +1 -1
  11. package/dist/SignalBridge-THATXU2R.js +33 -0
  12. package/dist/{SignalBridge-6UYUZ2CN.js.map → SignalBridge-THATXU2R.js.map} +1 -1
  13. package/dist/analytics/index.js +9 -9
  14. package/dist/analytics/index.mjs +2 -2
  15. package/dist/blog/index.js +75 -75
  16. package/dist/blog/index.js.map +1 -1
  17. package/dist/blog/index.mjs +75 -75
  18. package/dist/blog/index.mjs.map +1 -1
  19. package/dist/blog/server.js +2 -2
  20. package/dist/blog/server.js.map +1 -1
  21. package/dist/blog/server.mjs +2 -2
  22. package/dist/blog/server.mjs.map +1 -1
  23. package/dist/brand.css +87 -0
  24. package/dist/{chunk-ZU6YPEAF.mjs → chunk-2OJCYWSQ.mjs} +85 -73
  25. package/dist/chunk-2OJCYWSQ.mjs.map +1 -0
  26. package/dist/{chunk-PM2KQ6YK.mjs → chunk-3CXAWGUP.mjs} +3 -3
  27. package/dist/{chunk-PM2KQ6YK.mjs.map → chunk-3CXAWGUP.mjs.map} +1 -1
  28. package/dist/{chunk-36Y7OWES.mjs → chunk-3YQCPLGP.mjs} +4 -4
  29. package/dist/chunk-3YQCPLGP.mjs.map +1 -0
  30. package/dist/{chunk-XWWBUC2I.js → chunk-6ZGM7S5O.js} +77 -61
  31. package/dist/chunk-6ZGM7S5O.js.map +1 -0
  32. package/dist/{chunk-XFOL6JDF.mjs → chunk-7LAOWIWE.mjs} +4 -4
  33. package/dist/chunk-7LAOWIWE.mjs.map +1 -0
  34. package/dist/{chunk-YBTYDBWY.js → chunk-7M3FNAS5.js} +6 -8
  35. package/dist/chunk-7M3FNAS5.js.map +1 -0
  36. package/dist/{chunk-4QHHFCAA.mjs → chunk-AOIG5PVY.mjs} +6 -8
  37. package/dist/chunk-AOIG5PVY.mjs.map +1 -0
  38. package/dist/{chunk-VZMDH3R4.mjs → chunk-B22WSN4L.mjs} +4 -4
  39. package/dist/chunk-B22WSN4L.mjs.map +1 -0
  40. package/dist/{chunk-ELDJDBQL.js → chunk-BVUOATPG.js} +7 -7
  41. package/dist/chunk-BVUOATPG.js.map +1 -0
  42. package/dist/{chunk-N24BPFF6.mjs → chunk-CU6OGBKK.mjs} +6 -6
  43. package/dist/chunk-CU6OGBKK.mjs.map +1 -0
  44. package/dist/{chunk-NRNK7LXK.mjs → chunk-DWI5ZKPM.mjs} +4 -4
  45. package/dist/chunk-DWI5ZKPM.mjs.map +1 -0
  46. package/dist/{chunk-KRPFLF62.mjs → chunk-F5NXD7VQ.mjs} +10 -12
  47. package/dist/{chunk-KRPFLF62.mjs.map → chunk-F5NXD7VQ.mjs.map} +1 -1
  48. package/dist/{chunk-PTTDKFL7.js → chunk-FCXQECM7.js} +6 -6
  49. package/dist/chunk-FCXQECM7.js.map +1 -0
  50. package/dist/{chunk-DY4K6X3A.js → chunk-GCPPXUAI.js} +6 -6
  51. package/dist/chunk-GCPPXUAI.js.map +1 -0
  52. package/dist/{chunk-KJN2C6YE.js → chunk-I34XL5VJ.js} +5 -5
  53. package/dist/chunk-I34XL5VJ.js.map +1 -0
  54. package/dist/{chunk-G6VGUAK2.js → chunk-IFVMZFNT.js} +4 -4
  55. package/dist/chunk-IFVMZFNT.js.map +1 -0
  56. package/dist/{chunk-FMB2RZDH.mjs → chunk-J4U3IEXL.mjs} +6 -6
  57. package/dist/chunk-J4U3IEXL.mjs.map +1 -0
  58. package/dist/{chunk-EUNL6GAL.js → chunk-JP5WGL75.js} +4 -4
  59. package/dist/chunk-JP5WGL75.js.map +1 -0
  60. package/dist/{chunk-MG23BS36.js → chunk-L3UB4B74.js} +5 -5
  61. package/dist/chunk-L3UB4B74.js.map +1 -0
  62. package/dist/{chunk-FVCQBTNK.mjs → chunk-MSRLAD7F.mjs} +77 -61
  63. package/dist/chunk-MSRLAD7F.mjs.map +1 -0
  64. package/dist/{chunk-M5FLRLHI.mjs → chunk-OM6R7CDP.mjs} +3 -3
  65. package/dist/chunk-OM6R7CDP.mjs.map +1 -0
  66. package/dist/{chunk-4X5TFGKD.mjs → chunk-P3POHQWW.mjs} +422 -426
  67. package/dist/chunk-P3POHQWW.mjs.map +1 -0
  68. package/dist/{chunk-GJD4CFHN.js → chunk-RLNG67S5.js} +7 -7
  69. package/dist/chunk-RLNG67S5.js.map +1 -0
  70. package/dist/{chunk-FTSXKDP3.js → chunk-RO6DHV6S.js} +10 -12
  71. package/dist/{chunk-FTSXKDP3.js.map → chunk-RO6DHV6S.js.map} +1 -1
  72. package/dist/{chunk-WW7UM7XY.js → chunk-TZAD7CZD.js} +424 -428
  73. package/dist/chunk-TZAD7CZD.js.map +1 -0
  74. package/dist/{chunk-TXZNP76P.js → chunk-UD5447TC.js} +13 -15
  75. package/dist/chunk-UD5447TC.js.map +1 -0
  76. package/dist/{chunk-TC6TOW2T.js → chunk-UJ757WGI.js} +4 -4
  77. package/dist/{chunk-TC6TOW2T.js.map → chunk-UJ757WGI.js.map} +1 -1
  78. package/dist/{chunk-C3A5HXHX.mjs → chunk-V6V6OXS2.mjs} +5 -5
  79. package/dist/chunk-V6V6OXS2.mjs.map +1 -0
  80. package/dist/{chunk-X4J33XQD.js → chunk-W6K7MQCC.js} +6 -6
  81. package/dist/chunk-W6K7MQCC.js.map +1 -0
  82. package/dist/{chunk-FI2ME55T.mjs → chunk-W7RZ3OTA.mjs} +7 -7
  83. package/dist/chunk-W7RZ3OTA.mjs.map +1 -0
  84. package/dist/{chunk-IJ2LWZID.js → chunk-WETCVFIK.js} +85 -73
  85. package/dist/chunk-WETCVFIK.js.map +1 -0
  86. package/dist/{chunk-VNAJQKYG.mjs → chunk-WN2PUL6B.mjs} +13 -15
  87. package/dist/chunk-WN2PUL6B.mjs.map +1 -0
  88. package/dist/cli/index.js +19339 -3461
  89. package/dist/cli/index.js.map +1 -1
  90. package/dist/cli/index.mjs +19331 -3452
  91. package/dist/cli/index.mjs.map +1 -1
  92. package/dist/cms/index.d.mts +1 -1
  93. package/dist/cms/index.d.ts +1 -1
  94. package/dist/cms/index.js +3 -3
  95. package/dist/cms/index.js.map +1 -1
  96. package/dist/cms/index.mjs +2 -2
  97. package/dist/cms/index.mjs.map +1 -1
  98. package/dist/cms/server.js +4 -4
  99. package/dist/cms/server.mjs +1 -1
  100. package/dist/commerce/index.js +47 -47
  101. package/dist/commerce/index.mjs +3 -3
  102. package/dist/engage/index.js +6 -6
  103. package/dist/engage/index.js.map +1 -1
  104. package/dist/engage/index.mjs +3 -3
  105. package/dist/engage/index.mjs.map +1 -1
  106. package/dist/forms/index.js +379 -84
  107. package/dist/forms/index.js.map +1 -1
  108. package/dist/forms/index.mjs +375 -65
  109. package/dist/forms/index.mjs.map +1 -1
  110. package/dist/forms/styles.css +312 -0
  111. package/dist/images/index.js +11 -11
  112. package/dist/images/index.mjs +2 -2
  113. package/dist/images/server.js +4 -4
  114. package/dist/images/server.mjs +1 -1
  115. package/dist/index.d.mts +4 -131
  116. package/dist/index.d.ts +4 -131
  117. package/dist/index.js +85 -1373
  118. package/dist/index.js.map +1 -1
  119. package/dist/index.mjs +13 -1294
  120. package/dist/index.mjs.map +1 -1
  121. package/dist/layout/client.js +2 -2
  122. package/dist/layout/client.mjs +1 -1
  123. package/dist/layout/index.js +21 -11
  124. package/dist/layout/index.js.map +1 -1
  125. package/dist/layout/index.mjs +17 -7
  126. package/dist/layout/index.mjs.map +1 -1
  127. package/dist/llms/index.d.mts +3 -3
  128. package/dist/llms/index.d.ts +3 -3
  129. package/dist/llms/index.js +12 -12
  130. package/dist/llms/index.js.map +1 -1
  131. package/dist/llms/index.mjs +2 -2
  132. package/dist/llms/index.mjs.map +1 -1
  133. package/dist/manifest/index.js +4 -4
  134. package/dist/manifest/index.js.map +1 -1
  135. package/dist/manifest/index.mjs +3 -3
  136. package/dist/manifest/index.mjs.map +1 -1
  137. package/dist/middleware/index.js +3 -3
  138. package/dist/middleware/index.mjs +2 -2
  139. package/dist/redirects/index.js +6 -6
  140. package/dist/redirects/index.mjs +2 -2
  141. package/dist/robots/index.js +3 -3
  142. package/dist/robots/index.js.map +1 -1
  143. package/dist/robots/index.mjs +2 -2
  144. package/dist/robots/index.mjs.map +1 -1
  145. package/dist/{routing-DZYzyDHw.d.ts → routing-DQ_Et-OP.d.mts} +4 -4
  146. package/dist/{routing-B5XS-6_W.d.mts → routing-IYiJNIIX.d.ts} +4 -4
  147. package/dist/seo/index.d.mts +3 -5
  148. package/dist/seo/index.d.ts +3 -5
  149. package/dist/seo/index.js +77 -76
  150. package/dist/seo/index.js.map +1 -1
  151. package/dist/seo/index.mjs +41 -40
  152. package/dist/seo/index.mjs.map +1 -1
  153. package/dist/seo/register-sitemap-cli.js +3 -3
  154. package/dist/seo/register-sitemap-cli.js.map +1 -1
  155. package/dist/seo/register-sitemap-cli.mjs +3 -3
  156. package/dist/seo/register-sitemap-cli.mjs.map +1 -1
  157. package/dist/seo/server.d.mts +3 -3
  158. package/dist/seo/server.d.ts +3 -3
  159. package/dist/seo/server.js +7 -7
  160. package/dist/seo/server.js.map +1 -1
  161. package/dist/seo/server.mjs +5 -5
  162. package/dist/seo/server.mjs.map +1 -1
  163. package/dist/{server-api-XGKRGUMG.js → server-api-36R24YWN.js} +21 -21
  164. package/dist/{server-api-XGKRGUMG.js.map → server-api-36R24YWN.js.map} +1 -1
  165. package/dist/{server-api-COVFLFZ2.mjs → server-api-UIZU4JM3.mjs} +3 -3
  166. package/dist/{server-api-COVFLFZ2.mjs.map → server-api-UIZU4JM3.mjs.map} +1 -1
  167. package/dist/setup/index.d.mts +2 -5
  168. package/dist/setup/index.d.ts +2 -5
  169. package/dist/setup/index.js +0 -31
  170. package/dist/setup/index.mjs +1 -4
  171. package/dist/site-config/index.js +3 -3
  172. package/dist/site-config/index.mjs +1 -1
  173. package/dist/sitemap/index.js +10 -9
  174. package/dist/sitemap/index.js.map +1 -1
  175. package/dist/sitemap/index.mjs +8 -7
  176. package/dist/sitemap/index.mjs.map +1 -1
  177. package/dist/sync/index.js +13 -13
  178. package/dist/sync/index.mjs +1 -1
  179. package/dist/{types-KZP_VWZp.d.mts → types-CGkyylOa.d.mts} +2 -2
  180. package/dist/{types-KZP_VWZp.d.ts → types-CGkyylOa.d.ts} +2 -2
  181. package/package.json +4 -12
  182. package/dist/AnalyticsProvider-BBLU4U2T.mjs +0 -4
  183. package/dist/AnalyticsProvider-EMDIAAWR.js +0 -25
  184. package/dist/EngageWidget-CVZMTSB6.mjs +0 -4
  185. package/dist/EngageWidget-UHWXXCAX.js +0 -13
  186. package/dist/SetupWizard-Cki06kB0.d.mts +0 -12
  187. package/dist/SetupWizard-Cki06kB0.d.ts +0 -12
  188. package/dist/SignalBridge-6UYUZ2CN.js +0 -33
  189. package/dist/SignalBridge-WGHMEILW.mjs +0 -4
  190. package/dist/chunk-36Y7OWES.mjs.map +0 -1
  191. package/dist/chunk-373TK6TZ.js +0 -321
  192. package/dist/chunk-373TK6TZ.js.map +0 -1
  193. package/dist/chunk-4MOJJSNA.js +0 -14867
  194. package/dist/chunk-4MOJJSNA.js.map +0 -1
  195. package/dist/chunk-4QHHFCAA.mjs.map +0 -1
  196. package/dist/chunk-4X5TFGKD.mjs.map +0 -1
  197. package/dist/chunk-5YDPPOUU.mjs +0 -810
  198. package/dist/chunk-5YDPPOUU.mjs.map +0 -1
  199. package/dist/chunk-7FKPJQVS.mjs +0 -289
  200. package/dist/chunk-7FKPJQVS.mjs.map +0 -1
  201. package/dist/chunk-C3A5HXHX.mjs.map +0 -1
  202. package/dist/chunk-DY4K6X3A.js.map +0 -1
  203. package/dist/chunk-ELDJDBQL.js.map +0 -1
  204. package/dist/chunk-EUNL6GAL.js.map +0 -1
  205. package/dist/chunk-FI2ME55T.mjs.map +0 -1
  206. package/dist/chunk-FMB2RZDH.mjs.map +0 -1
  207. package/dist/chunk-FVCQBTNK.mjs.map +0 -1
  208. package/dist/chunk-G6VGUAK2.js.map +0 -1
  209. package/dist/chunk-GJD4CFHN.js.map +0 -1
  210. package/dist/chunk-GVXZWXQ7.js +0 -814
  211. package/dist/chunk-GVXZWXQ7.js.map +0 -1
  212. package/dist/chunk-HF2FWDBJ.mjs +0 -968
  213. package/dist/chunk-HF2FWDBJ.mjs.map +0 -1
  214. package/dist/chunk-IFAW7JFO.js +0 -1429
  215. package/dist/chunk-IFAW7JFO.js.map +0 -1
  216. package/dist/chunk-IJ2LWZID.js.map +0 -1
  217. package/dist/chunk-IKIJEKU3.mjs +0 -1427
  218. package/dist/chunk-IKIJEKU3.mjs.map +0 -1
  219. package/dist/chunk-JFTGG6HK.mjs +0 -14848
  220. package/dist/chunk-JFTGG6HK.mjs.map +0 -1
  221. package/dist/chunk-JM3ZR6LB.js +0 -981
  222. package/dist/chunk-JM3ZR6LB.js.map +0 -1
  223. package/dist/chunk-KJN2C6YE.js.map +0 -1
  224. package/dist/chunk-M5FLRLHI.mjs.map +0 -1
  225. package/dist/chunk-MCGLYYAR.mjs +0 -341
  226. package/dist/chunk-MCGLYYAR.mjs.map +0 -1
  227. package/dist/chunk-MG23BS36.js.map +0 -1
  228. package/dist/chunk-N24BPFF6.mjs.map +0 -1
  229. package/dist/chunk-NRNK7LXK.mjs.map +0 -1
  230. package/dist/chunk-PTTDKFL7.js.map +0 -1
  231. package/dist/chunk-S7FRYNSU.mjs +0 -315
  232. package/dist/chunk-S7FRYNSU.mjs.map +0 -1
  233. package/dist/chunk-SLB5V4RT.js +0 -302
  234. package/dist/chunk-SLB5V4RT.js.map +0 -1
  235. package/dist/chunk-TXZNP76P.js.map +0 -1
  236. package/dist/chunk-VNAJQKYG.mjs.map +0 -1
  237. package/dist/chunk-VZMDH3R4.mjs.map +0 -1
  238. package/dist/chunk-WW7UM7XY.js.map +0 -1
  239. package/dist/chunk-X4J33XQD.js.map +0 -1
  240. package/dist/chunk-XFOL6JDF.mjs.map +0 -1
  241. package/dist/chunk-XWWBUC2I.js.map +0 -1
  242. package/dist/chunk-YBTYDBWY.js.map +0 -1
  243. package/dist/chunk-ZQO6FZZB.js +0 -343
  244. package/dist/chunk-ZQO6FZZB.js.map +0 -1
  245. package/dist/chunk-ZU6YPEAF.mjs.map +0 -1
  246. package/dist/generators-DOFWGRXS.js +0 -37
  247. package/dist/generators-DOFWGRXS.js.map +0 -1
  248. package/dist/generators-R62APO62.mjs +0 -4
  249. package/dist/generators-R62APO62.mjs.map +0 -1
  250. package/dist/migrator-3WQB3KQ2.mjs +0 -4
  251. package/dist/migrator-3WQB3KQ2.mjs.map +0 -1
  252. package/dist/migrator-HFVQYK5R.js +0 -37
  253. package/dist/migrator-HFVQYK5R.js.map +0 -1
  254. package/dist/scanner-AF7YUCFG.mjs +0 -4
  255. package/dist/scanner-AF7YUCFG.mjs.map +0 -1
  256. package/dist/scanner-DBD5K6F7.js +0 -53
  257. package/dist/scanner-DBD5K6F7.js.map +0 -1
  258. package/dist/setup/client.d.mts +0 -60
  259. package/dist/setup/client.d.ts +0 -60
  260. package/dist/setup/client.js +0 -31
  261. package/dist/setup/client.js.map +0 -1
  262. package/dist/setup/client.mjs +0 -6
  263. package/dist/setup/client.mjs.map +0 -1
  264. package/dist/setup/server.d.mts +0 -14
  265. package/dist/setup/server.d.ts +0 -14
  266. package/dist/setup/server.js +0 -13
  267. package/dist/setup/server.js.map +0 -1
  268. package/dist/setup/server.mjs +0 -4
  269. package/dist/setup/server.mjs.map +0 -1
package/dist/index.js CHANGED
@@ -1,138 +1,22 @@
1
1
  'use strict';
2
2
 
3
- var chunkYBTYDBWY_js = require('./chunk-YBTYDBWY.js');
4
- var chunkX4J33XQD_js = require('./chunk-X4J33XQD.js');
5
- var chunkG6VGUAK2_js = require('./chunk-G6VGUAK2.js');
6
- require('./chunk-DY4K6X3A.js');
3
+ var chunk7M3FNAS5_js = require('./chunk-7M3FNAS5.js');
4
+ var chunkIFVMZFNT_js = require('./chunk-IFVMZFNT.js');
7
5
  var chunkTKQLH33E_js = require('./chunk-TKQLH33E.js');
8
- require('./chunk-EUNL6GAL.js');
9
- var chunkWW7UM7XY_js = require('./chunk-WW7UM7XY.js');
10
- var chunkIJ2LWZID_js = require('./chunk-IJ2LWZID.js');
11
- var chunkIFAW7JFO_js = require('./chunk-IFAW7JFO.js');
12
- var chunkQW4RQHSK_js = require('./chunk-QW4RQHSK.js');
13
- require('./chunk-TC6TOW2T.js');
14
- var chunkFTSXKDP3_js = require('./chunk-FTSXKDP3.js');
15
- var chunkXWWBUC2I_js = require('./chunk-XWWBUC2I.js');
16
- var chunk373TK6TZ_js = require('./chunk-373TK6TZ.js');
6
+ require('./chunk-GCPPXUAI.js');
7
+ var chunkTZAD7CZD_js = require('./chunk-TZAD7CZD.js');
8
+ var chunkWETCVFIK_js = require('./chunk-WETCVFIK.js');
9
+ var chunkW6K7MQCC_js = require('./chunk-W6K7MQCC.js');
10
+ require('./chunk-JP5WGL75.js');
11
+ require('./chunk-UJ757WGI.js');
12
+ require('./chunk-RO6DHV6S.js');
17
13
  require('./chunk-ZSMWDLMK.js');
18
- var React2 = require('react');
14
+ var React = require('react');
19
15
  var jsxRuntime = require('react/jsx-runtime');
20
16
 
21
17
  function _interopDefault (e) { return e && e.__esModule ? e : { default: e }; }
22
18
 
23
- var React2__default = /*#__PURE__*/_interopDefault(React2);
24
-
25
- var SiteKitContext = React2.createContext(null);
26
- function useSiteKit() {
27
- const context = React2.useContext(SiteKitContext);
28
- if (!context) {
29
- throw new Error("useSiteKit must be used within a SiteKitProvider");
30
- }
31
- return context;
32
- }
33
- function SiteKitProvider({
34
- children,
35
- apiKey,
36
- apiUrl,
37
- signalUrl,
38
- projectId,
39
- recaptchaSiteKey,
40
- analytics,
41
- engage,
42
- forms,
43
- signal,
44
- sitemapSync = true,
45
- debug = false
46
- }) {
47
- const isDev = typeof process !== "undefined" && process.env?.NODE_ENV === "development";
48
- const defaultApiUrl = isDev && (process.env?.SONOR_API_URL || process.env?.NEXT_PUBLIC_UPTRADE_API_URL) ? process.env.SONOR_API_URL || process.env.NEXT_PUBLIC_UPTRADE_API_URL : "https://api.sonor.io";
49
- const defaultSignalUrl = isDev && (process.env?.SONOR_SIGNAL_URL || process.env?.NEXT_PUBLIC_SIGNAL_API_URL) ? process.env.SONOR_SIGNAL_URL || process.env.NEXT_PUBLIC_SIGNAL_API_URL : "https://signal.sonor.io";
50
- const finalApiUrl = apiUrl || defaultApiUrl || "https://api.sonor.io";
51
- const finalSignalUrl = signalUrl || defaultSignalUrl || "https://signal.sonor.io";
52
- const finalRecaptchaSiteKey = recaptchaSiteKey ?? (typeof process !== "undefined" ? process.env?.NEXT_PUBLIC_RECAPTCHA_SITE_KEY : void 0);
53
- if (!apiKey) {
54
- console.error("@sonordev/site-kit: No API key provided. Set SONOR_API_KEY (or NEXT_PUBLIC_UPTRADE_API_KEY) environment variable.");
55
- }
56
- if (typeof window !== "undefined") {
57
- window.__SITE_KIT_API_URL__ = finalApiUrl;
58
- window.__SITE_KIT_SIGNAL_URL__ = finalSignalUrl;
59
- window.__SITE_KIT_API_KEY__ = apiKey;
60
- window.__SITE_KIT_RECAPTCHA_SITE_KEY__ = finalRecaptchaSiteKey;
61
- window.__SITE_KIT_DEBUG__ = debug;
62
- }
63
- React2.useEffect(() => {
64
- if (apiKey && typeof window !== "undefined") {
65
- chunk373TK6TZ_js.configureFormsApi({
66
- baseUrl: finalApiUrl,
67
- apiKey
68
- });
69
- }
70
- }, [finalApiUrl, apiKey]);
71
- const contextValue = React2.useMemo(
72
- () => ({
73
- apiUrl: finalApiUrl,
74
- signalUrl: finalSignalUrl,
75
- apiKey,
76
- analytics,
77
- engage,
78
- forms,
79
- signal,
80
- debug,
81
- isReady: true
82
- }),
83
- [finalApiUrl, finalSignalUrl, apiKey, analytics, engage, forms, signal, debug]
84
- );
85
- let content = /* @__PURE__ */ jsxRuntime.jsx(jsxRuntime.Fragment, { children });
86
- if (signal?.enabled) {
87
- content = /* @__PURE__ */ jsxRuntime.jsx(
88
- chunkYBTYDBWY_js.SignalBridge,
89
- {
90
- enabled: signal.enabled,
91
- realtime: signal.realtime !== false,
92
- experiments: signal.experiments !== false,
93
- behaviorTracking: signal.behaviorTracking !== false,
94
- children: content
95
- }
96
- );
97
- }
98
- if (analytics?.enabled) {
99
- content = /* @__PURE__ */ jsxRuntime.jsx(React2.Suspense, { fallback: null, children: /* @__PURE__ */ jsxRuntime.jsx(
100
- chunkFTSXKDP3_js.AnalyticsProvider,
101
- {
102
- apiUrl: finalApiUrl,
103
- apiKey,
104
- trackPageViews: analytics.trackPageViews !== false,
105
- trackWebVitals: analytics.trackWebVitals !== false,
106
- trackScrollDepth: analytics.trackScrollDepth !== false,
107
- trackClicks: analytics.trackClicks !== false,
108
- debug,
109
- children: content
110
- }
111
- ) });
112
- }
113
- if (engage?.enabled) {
114
- content = /* @__PURE__ */ jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [
115
- content,
116
- /* @__PURE__ */ jsxRuntime.jsx(
117
- chunkXWWBUC2I_js.EngageWidget,
118
- {
119
- apiUrl: finalApiUrl,
120
- apiKey,
121
- projectId,
122
- position: engage.position || "bottom-right",
123
- chatEnabled: engage.chatEnabled !== false
124
- }
125
- )
126
- ] });
127
- }
128
- if (sitemapSync) {
129
- content = /* @__PURE__ */ jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [
130
- content,
131
- /* @__PURE__ */ jsxRuntime.jsx(chunkQW4RQHSK_js.SitemapSync, { debug })
132
- ] });
133
- }
134
- return /* @__PURE__ */ jsxRuntime.jsx(SiteKitContext.Provider, { value: contextValue, children: content });
135
- }
19
+ var React__default = /*#__PURE__*/_interopDefault(React);
136
20
 
137
21
  // src/affiliates/api.ts
138
22
  function getApiConfig() {
@@ -174,10 +58,10 @@ function getTrackingUrl(affiliateId, offerId) {
174
58
  return `${apiUrl}/a/${affiliateId}/${offerId}`;
175
59
  }
176
60
  function useAffiliates() {
177
- const [affiliates, setAffiliates] = React2.useState([]);
178
- const [isLoading, setIsLoading] = React2.useState(true);
179
- const [error, setError] = React2.useState(null);
180
- React2.useEffect(() => {
61
+ const [affiliates, setAffiliates] = React.useState([]);
62
+ const [isLoading, setIsLoading] = React.useState(true);
63
+ const [error, setError] = React.useState(null);
64
+ React.useEffect(() => {
181
65
  async function load() {
182
66
  try {
183
67
  setIsLoading(true);
@@ -281,9 +165,9 @@ function SignalExperiment({
281
165
  trackImpression = true,
282
166
  children
283
167
  }) {
284
- const { assignment, variant, isControl } = chunkYBTYDBWY_js.useSignalExperiment(experimentId);
285
- const trackEvent = chunkYBTYDBWY_js.useSignalEvent();
286
- React2.useEffect(() => {
168
+ const { assignment, variant, isControl } = chunk7M3FNAS5_js.useSignalExperiment(experimentId);
169
+ const trackEvent = chunk7M3FNAS5_js.useSignalEvent();
170
+ React.useEffect(() => {
287
171
  if (trackImpression && variant) {
288
172
  trackEvent({
289
173
  event_type: "experiment",
@@ -309,7 +193,7 @@ function SignalExperiment({
309
193
  return /* @__PURE__ */ jsxRuntime.jsx(jsxRuntime.Fragment, { children: variants.control || null });
310
194
  }
311
195
  function useExperimentVariant(experimentId) {
312
- return chunkYBTYDBWY_js.useSignalExperiment(experimentId);
196
+ return chunk7M3FNAS5_js.useSignalExperiment(experimentId);
313
197
  }
314
198
  function ExperimentConversion({
315
199
  experimentId,
@@ -317,8 +201,8 @@ function ExperimentConversion({
317
201
  value,
318
202
  children
319
203
  }) {
320
- const trackEvent = chunkYBTYDBWY_js.useSignalEvent();
321
- const { variant } = chunkYBTYDBWY_js.useSignalExperiment(experimentId);
204
+ const trackEvent = chunk7M3FNAS5_js.useSignalEvent();
205
+ const { variant } = chunk7M3FNAS5_js.useSignalExperiment(experimentId);
322
206
  const handleInteraction = () => {
323
207
  trackEvent({
324
208
  event_type: "experiment",
@@ -331,7 +215,7 @@ function ExperimentConversion({
331
215
  }
332
216
  });
333
217
  };
334
- return React2__default.default.cloneElement(children, {
218
+ return React__default.default.cloneElement(children, {
335
219
  onClick: (e) => {
336
220
  handleInteraction();
337
221
  if (children.props.onClick) {
@@ -340,1239 +224,58 @@ function ExperimentConversion({
340
224
  }
341
225
  });
342
226
  }
343
- var styles = {
344
- container: {
345
- display: "flex",
346
- flexDirection: "column",
347
- height: "100vh",
348
- maxWidth: "800px",
349
- margin: "0 auto",
350
- padding: "1rem",
351
- fontFamily: "system-ui, -apple-system, sans-serif"
352
- },
353
- header: {
354
- display: "flex",
355
- alignItems: "center",
356
- gap: "0.75rem",
357
- padding: "1rem 0",
358
- borderBottom: "1px solid #e5e7eb"
359
- },
360
- logo: {
361
- width: "32px",
362
- height: "32px",
363
- borderRadius: "8px",
364
- background: "linear-gradient(135deg, #3b82f6, #8b5cf6)",
365
- display: "flex",
366
- alignItems: "center",
367
- justifyContent: "center",
368
- color: "white",
369
- fontWeight: "bold"
370
- },
371
- title: {
372
- fontSize: "1.25rem",
373
- fontWeight: "600",
374
- color: "#111827"
375
- },
376
- subtitle: {
377
- fontSize: "0.875rem",
378
- color: "#6b7280"
379
- },
380
- messages: {
381
- flex: 1,
382
- overflowY: "auto",
383
- padding: "1rem 0",
384
- display: "flex",
385
- flexDirection: "column",
386
- gap: "1rem"
387
- },
388
- message: {
389
- display: "flex",
390
- gap: "0.75rem",
391
- maxWidth: "85%"
392
- },
393
- messageAssistant: {
394
- alignSelf: "flex-start"
395
- },
396
- messageUser: {
397
- alignSelf: "flex-end",
398
- flexDirection: "row-reverse"
399
- },
400
- avatar: {
401
- width: "32px",
402
- height: "32px",
403
- borderRadius: "50%",
404
- display: "flex",
405
- alignItems: "center",
406
- justifyContent: "center",
407
- fontSize: "0.875rem",
408
- flexShrink: 0
409
- },
410
- avatarAssistant: {
411
- background: "linear-gradient(135deg, #3b82f6, #8b5cf6)",
412
- color: "white"
413
- },
414
- avatarUser: {
415
- background: "#e5e7eb",
416
- color: "#374151"
417
- },
418
- bubble: {
419
- padding: "0.75rem 1rem",
420
- borderRadius: "1rem",
421
- fontSize: "0.9375rem",
422
- lineHeight: "1.5"
423
- },
424
- bubbleAssistant: {
425
- background: "#f3f4f6",
426
- color: "#111827",
427
- borderTopLeftRadius: "4px"
428
- },
429
- bubbleUser: {
430
- background: "#3b82f6",
431
- color: "white",
432
- borderTopRightRadius: "4px"
433
- },
434
- actions: {
435
- display: "flex",
436
- flexWrap: "wrap",
437
- gap: "0.5rem",
438
- marginTop: "0.75rem"
439
- },
440
- actionButton: {
441
- padding: "0.5rem 1rem",
442
- borderRadius: "0.5rem",
443
- fontSize: "0.875rem",
444
- fontWeight: "500",
445
- cursor: "pointer",
446
- border: "none",
447
- transition: "all 0.15s"
448
- },
449
- actionPrimary: {
450
- background: "#3b82f6",
451
- color: "white"
452
- },
453
- actionSecondary: {
454
- background: "#e5e7eb",
455
- color: "#374151"
456
- },
457
- actionOutline: {
458
- background: "transparent",
459
- color: "#3b82f6",
460
- border: "1px solid #3b82f6"
461
- },
462
- inputContainer: {
463
- display: "flex",
464
- gap: "0.5rem",
465
- padding: "1rem 0",
466
- borderTop: "1px solid #e5e7eb"
467
- },
468
- input: {
469
- flex: 1,
470
- padding: "0.75rem 1rem",
471
- borderRadius: "0.75rem",
472
- border: "1px solid #d1d5db",
473
- fontSize: "0.9375rem",
474
- outline: "none"
475
- },
476
- sendButton: {
477
- padding: "0.75rem 1.5rem",
478
- borderRadius: "0.75rem",
479
- background: "#3b82f6",
480
- color: "white",
481
- border: "none",
482
- fontWeight: "500",
483
- cursor: "pointer"
484
- },
485
- typing: {
486
- display: "flex",
487
- gap: "4px",
488
- padding: "0.75rem 1rem",
489
- background: "#f3f4f6",
490
- borderRadius: "1rem",
491
- width: "fit-content"
492
- },
493
- typingDot: {
494
- width: "8px",
495
- height: "8px",
496
- borderRadius: "50%",
497
- background: "#9ca3af",
498
- animation: "typing 1.4s infinite"
499
- },
500
- moduleCard: {
501
- display: "flex",
502
- alignItems: "center",
503
- gap: "0.75rem",
504
- padding: "0.75rem",
505
- background: "white",
506
- border: "1px solid #e5e7eb",
507
- borderRadius: "0.5rem",
508
- cursor: "pointer",
509
- transition: "all 0.15s"
510
- },
511
- moduleCardSelected: {
512
- borderColor: "#3b82f6",
513
- background: "#eff6ff"
514
- },
515
- moduleIcon: {
516
- fontSize: "1.5rem"
517
- },
518
- moduleInfo: {
519
- flex: 1
520
- },
521
- moduleName: {
522
- fontWeight: "500",
523
- color: "#111827"
524
- },
525
- moduleDesc: {
526
- fontSize: "0.75rem",
527
- color: "#6b7280"
528
- },
529
- checkbox: {
530
- width: "20px",
531
- height: "20px",
532
- accentColor: "#3b82f6"
533
- }
534
- };
535
- var MODULES = [
536
- { id: "analytics", name: "Analytics", icon: "\u{1F4CA}", description: "Page views, events, sessions, web vitals", recommended: true },
537
- { id: "seo", name: "SEO", icon: "\u{1F50D}", description: "Managed FAQs, meta tags, schema markup", recommended: true },
538
- { id: "forms", name: "Forms", icon: "\u{1F4DD}", description: "Sonor-managed forms with submissions", recommended: true },
539
- { id: "engage", name: "Engage", icon: "\u{1F4AC}", description: "Live chat, popups, nudges, banners", recommended: false },
540
- { id: "commerce", name: "Commerce", icon: "\u{1F6D2}", description: "Products, services, checkout", recommended: false },
541
- { id: "signal", name: "Signal AI", icon: "\u{1F916}", description: "Autonomous optimization & A/B testing", recommended: false }
542
- ];
543
- function SetupAssistant({
544
- apiUrl = "https://api.sonor.io",
545
- signalUrl = "https://signal.sonor.io",
546
- supabaseUrl,
547
- supabaseKey,
548
- projectId,
549
- orgId,
550
- authToken,
551
- onComplete,
552
- welcomeMessage
553
- }) {
554
- const [messages, setMessages] = React2.useState([]);
555
- const [input, setInput] = React2.useState("");
556
- const [isTyping, setIsTyping] = React2.useState(false);
557
- const [isExtracting, setIsExtracting] = React2.useState(false);
558
- const [state, setState] = React2.useState({
559
- step: "welcome",
560
- isAuthenticated: !!authToken,
561
- selectedModules: ["analytics", "seo", "forms"],
562
- config: {},
563
- errors: [],
564
- context: {
565
- flow: null,
566
- step: "welcome",
567
- project_id: projectId,
568
- org_id: orgId
569
- }
570
- });
571
- const messagesEndRef = React2.useRef(null);
572
- const inputRef = React2.useRef(null);
573
- const streamingMessageRef = React2.useRef(null);
574
- const sendToSignalStreaming = React2.useCallback(async (message, context, onToken, onComplete2) => {
575
- try {
576
- const response = await fetch(`${signalUrl}/api/skills/setup/chat/stream`, {
577
- method: "POST",
578
- headers: {
579
- "Content-Type": "application/json",
580
- ...authToken ? { Authorization: `Bearer ${authToken}` } : {}
581
- },
582
- body: JSON.stringify({
583
- message,
584
- context,
585
- project_id: projectId,
586
- org_id: orgId
587
- })
588
- });
589
- if (!response.ok) {
590
- throw new Error("Signal API error");
591
- }
592
- const reader = response.body?.getReader();
593
- if (!reader) throw new Error("No response body");
594
- const decoder = new TextDecoder();
595
- let buffer = "";
596
- let actions = [];
597
- let updatedContext = {};
598
- while (true) {
599
- const { done, value } = await reader.read();
600
- if (done) break;
601
- buffer += decoder.decode(value, { stream: true });
602
- const lines = buffer.split("\n");
603
- buffer = lines.pop() || "";
604
- for (const line of lines) {
605
- if (line.startsWith("data: ")) {
606
- const data = line.slice(6);
607
- if (data === "[DONE]") continue;
608
- try {
609
- const event = JSON.parse(data);
610
- if (event.type === "token") {
611
- onToken(event.content);
612
- } else if (event.type === "actions") {
613
- actions = event.actions;
614
- } else if (event.type === "context") {
615
- updatedContext = event.context;
616
- }
617
- } catch {
618
- onToken(data);
619
- }
620
- }
621
- }
622
- }
623
- onComplete2({ actions, updated_context: updatedContext });
624
- } catch (error) {
625
- console.error("Signal streaming error:", error);
626
- const result = await sendToSignal(message, context);
627
- onToken(result.response);
628
- onComplete2({ actions: result.actions, updated_context: result.updated_context });
629
- }
630
- }, [signalUrl, authToken, projectId, orgId]);
631
- const sendToSignal = React2.useCallback(async (message, context) => {
632
- try {
633
- const response = await fetch(`${signalUrl}/api/skills/setup/chat`, {
634
- method: "POST",
635
- headers: {
636
- "Content-Type": "application/json",
637
- ...authToken ? { Authorization: `Bearer ${authToken}` } : {}
638
- },
639
- body: JSON.stringify({
640
- message,
641
- context,
642
- project_id: projectId,
643
- org_id: orgId
644
- })
645
- });
646
- if (!response.ok) {
647
- throw new Error("Signal API error");
648
- }
649
- return await response.json();
650
- } catch (error) {
651
- console.error("Signal API error:", error);
652
- return {
653
- response: "I had trouble connecting to Signal. Let me help you locally.",
654
- actions: [
655
- { id: "1", label: "Continue", action: "continue_local", variant: "primary" }
656
- ]
657
- };
658
- }
659
- }, [signalUrl, authToken, projectId, orgId]);
660
- const extractBrandFromDomain = React2.useCallback(async (domain) => {
661
- setIsExtracting(true);
662
- try {
663
- const response = await fetch(`${apiUrl}/site-scrape/brand-only`, {
664
- method: "POST",
665
- headers: {
666
- "Content-Type": "application/json",
667
- ...authToken ? { Authorization: `Bearer ${authToken}` } : {}
668
- },
669
- body: JSON.stringify({ domain })
670
- });
671
- if (!response.ok) {
672
- throw new Error("Brand extraction failed");
673
- }
674
- const data = await response.json();
675
- return {
676
- business_name: data.business_name,
677
- tagline: data.tagline,
678
- primary_color: data.primary_color,
679
- secondary_color: data.secondary_color,
680
- logo_url: data.logo_url,
681
- phone_numbers: data.phone_numbers,
682
- email_addresses: data.email_addresses,
683
- social_profiles: data.social_profiles
684
- };
685
- } catch (error) {
686
- console.error("Brand extraction error:", error);
687
- return null;
688
- } finally {
689
- setIsExtracting(false);
690
- }
691
- }, [apiUrl, authToken]);
692
- const addMessage = React2.useCallback((message) => {
693
- const newMessage = {
694
- ...message,
695
- id: crypto.randomUUID(),
696
- timestamp: /* @__PURE__ */ new Date()
697
- };
698
- setMessages((prev) => [...prev, newMessage]);
699
- return newMessage;
700
- }, []);
701
- React2.useCallback((id, update) => {
702
- setMessages((prev) => prev.map(
703
- (m) => m.id === id ? { ...m, ...update } : m
704
- ));
705
- }, []);
706
- const addStreamingMessage = React2.useCallback(() => {
707
- const id = crypto.randomUUID();
708
- const newMessage = {
709
- id,
710
- role: "assistant",
711
- content: "",
712
- timestamp: /* @__PURE__ */ new Date(),
713
- isStreaming: true
714
- };
715
- setMessages((prev) => [...prev, newMessage]);
716
- streamingMessageRef.current = id;
717
- return id;
718
- }, []);
719
- const appendToStreamingMessage = React2.useCallback((token) => {
720
- const id = streamingMessageRef.current;
721
- if (!id) return;
722
- setMessages((prev) => prev.map(
723
- (m) => m.id === id ? { ...m, content: m.content + token } : m
724
- ));
725
- }, []);
726
- const finalizeStreamingMessage = React2.useCallback((actions) => {
727
- const id = streamingMessageRef.current;
728
- if (!id) return;
729
- setMessages((prev) => prev.map(
730
- (m) => m.id === id ? { ...m, isStreaming: false, actions } : m
731
- ));
732
- streamingMessageRef.current = null;
733
- }, []);
734
- const addAssistantMessage = React2.useCallback((content, actions, component) => {
735
- setIsTyping(true);
736
- setTimeout(() => {
737
- setIsTyping(false);
738
- addMessage({ role: "assistant", content, actions, component });
739
- }, 500 + Math.random() * 500);
740
- }, [addMessage]);
741
- const scrollToBottom = React2.useCallback(() => {
742
- messagesEndRef.current?.scrollIntoView({ behavior: "smooth" });
743
- }, []);
744
- React2.useEffect(() => {
745
- scrollToBottom();
746
- }, [messages, isTyping, scrollToBottom]);
747
- React2.useEffect(() => {
748
- const welcome = welcomeMessage || `Hey! \u{1F44B} I'm Signal, your AI setup assistant.
749
-
750
- I'll help you integrate Sonor Site-Kit into your project. What are we working with today?`;
751
- setTimeout(() => {
752
- addAssistantMessage(welcome, [
753
- { id: "1", label: "\u{1F195} New Site", action: "set_flow_new", variant: "primary" },
754
- { id: "2", label: "\u{1F4C1} Existing Project", action: "set_flow_existing", variant: "secondary" },
755
- { id: "3", label: "\u{1F504} Rebuild from Live Site", action: "set_flow_rebuild", variant: "outline" }
756
- ]);
757
- }, 500);
758
- }, []);
759
- const handleAction = React2.useCallback(async (action, data) => {
760
- switch (action) {
761
- case "start":
762
- addMessage({ role: "user", content: "Let's do it!" });
763
- setState((prev) => ({ ...prev, step: "auth" }));
764
- addAssistantMessage(
765
- `Great! First, let's connect to your Sonor account.
766
-
767
- You can sign in with your existing Sonor credentials:`,
768
- [
769
- { id: "1", label: "Sign in with Email", action: "auth_email", variant: "primary" },
770
- { id: "2", label: "Sign in with Google", action: "auth_google", variant: "secondary" },
771
- { id: "3", label: "I don't have an account", action: "auth_signup", variant: "outline" }
772
- ]
773
- );
774
- break;
775
- case "explain":
776
- addMessage({ role: "user", content: "Tell me more first" });
777
- addAssistantMessage(
778
- `Sonor Site-Kit is a lightweight package that connects your site to Sonor.
779
-
780
- Here's what you can enable:
781
-
782
- \u{1F4CA} **Analytics** - Track page views, events, and Core Web Vitals
783
- \u{1F50D} **SEO** - Managed meta tags, FAQs, and schema markup
784
- \u{1F4DD} **Forms** - Sonor-managed forms with spam protection
785
- \u{1F4AC} **Engage** - Live chat, popups, and nudges
786
- \u{1F6D2} **Commerce** - Products, services, and checkout
787
- \u{1F916} **Signal AI** - Autonomous optimization and A/B testing
788
-
789
- You only pay for what you use, and everything is managed from your Sonor dashboard.`,
790
- [
791
- { id: "1", label: "Sounds good, let's set it up", action: "start", variant: "primary" }
792
- ]
793
- );
794
- break;
795
- case "auth_email":
796
- addMessage({ role: "user", content: "Sign in with Email" });
797
- addAssistantMessage(
798
- `What's your Sonor email address?`
799
- );
800
- setState((prev) => ({ ...prev, step: "auth" }));
801
- setTimeout(() => inputRef.current?.focus(), 600);
802
- break;
803
- case "auth_google":
804
- addMessage({ role: "user", content: "Sign in with Google" });
805
- addAssistantMessage(
806
- `Opening Google sign-in... (In a real implementation, this would trigger OAuth)`
807
- );
808
- setTimeout(() => {
809
- setState((prev) => ({
810
- ...prev,
811
- step: "project",
812
- isAuthenticated: true,
813
- userEmail: "user@example.com"
814
- }));
815
- handleAuthSuccess("user@example.com");
816
- }, 1500);
817
- break;
818
- case "select_project":
819
- addMessage({ role: "user", content: `Selected: ${data?.name}` });
820
- setState((prev) => ({
821
- ...prev,
822
- step: "modules",
823
- selectedProject: data
824
- }));
825
- showModuleSelection();
826
- break;
827
- case "confirm_modules":
828
- addMessage({ role: "user", content: `Selected ${state.selectedModules.length} modules` });
829
- setState((prev) => ({ ...prev, step: "config" }));
830
- showConfigGeneration();
831
- break;
832
- case "copy_code":
833
- addMessage({ role: "user", content: "Copy integration code" });
834
- addAssistantMessage(
835
- `\u2705 Code copied to clipboard!
836
-
837
- Paste this in your root layout file (e.g., \`app/layout.tsx\` or \`pages/_app.tsx\`).
838
-
839
- Want me to help you verify the integration?`,
840
- [
841
- { id: "1", label: "Yes, verify my setup", action: "verify", variant: "primary" },
842
- { id: "2", label: "I'm all set, thanks!", action: "complete", variant: "outline" }
843
- ]
844
- );
845
- break;
846
- case "verify":
847
- addMessage({ role: "user", content: "Verify my setup" });
848
- setState((prev) => ({ ...prev, step: "verify" }));
849
- addAssistantMessage(
850
- `To verify your setup, start your dev server and visit any page.
851
-
852
- I'll check for:
853
- \u2022 \u2713 SiteKitProvider is loading
854
- \u2022 \u2713 API key is valid
855
- \u2022 \u2713 Analytics events are sending
856
- \u2022 \u2713 Modules are initializing
857
-
858
- Run \`npm run dev\` and let me know when you're ready:`,
859
- [
860
- { id: "1", label: "My dev server is running", action: "check_connection", variant: "primary" }
861
- ]
862
- );
863
- break;
864
- case "check_connection":
865
- addMessage({ role: "user", content: "My dev server is running" });
866
- setIsTyping(true);
867
- setTimeout(() => {
868
- setIsTyping(false);
869
- addAssistantMessage(
870
- `\u{1F389} **Everything looks great!**
871
-
872
- I detected your site at \`localhost:3000\` and verified:
873
-
874
- \u2705 SiteKitProvider initialized
875
- \u2705 API key authenticated
876
- \u2705 Analytics tracking active
877
- \u2705 SEO components ready
878
-
879
- You're all set! Your data will start appearing in your Sonor dashboard within a few minutes.`,
880
- [
881
- { id: "1", label: "Open Sonor Dashboard", action: "open_dashboard", variant: "primary" },
882
- { id: "2", label: "Enable Signal AI", action: "enable_signal", variant: "secondary" }
883
- ]
884
- );
885
- setState((prev) => ({ ...prev, step: "complete" }));
886
- }, 2e3);
887
- break;
888
- case "complete":
889
- addMessage({ role: "user", content: "I'm all set, thanks!" });
890
- addAssistantMessage(
891
- `Awesome! \u{1F680}
892
-
893
- Your site-kit integration is ready. Here's what happens next:
894
-
895
- \u2022 Analytics data will appear in Sonor within ~5 minutes
896
- \u2022 You can manage SEO, forms, and engage from the dashboard
897
- \u2022 If you enabled Signal, it'll start learning from your traffic
898
-
899
- Need help anytime? Just come back to \`/_uptrade/setup\` or ping us in Sonor.
900
-
901
- Happy building! \u{1F3A8}`
902
- );
903
- onComplete?.(state);
904
- break;
905
- case "enable_signal":
906
- addMessage({ role: "user", content: "Enable Signal AI" });
907
- addAssistantMessage(
908
- `Great choice! \u{1F916}
909
-
910
- Signal AI will:
911
- \u2022 Monitor your site for SEO issues
912
- \u2022 Run A/B tests on CTAs and content
913
- \u2022 Optimize popups and engagement timing
914
- \u2022 Learn from user behavior to improve conversions
915
-
916
- To enable Signal, add \`signal={{ enabled: true }}\` to your SiteKitProvider:
917
-
918
- \`\`\`tsx
919
- <SiteKitProvider
920
- apiKey={process.env.SONOR_API_KEY!}
921
- analytics={{ enabled: true }}
922
- signal={{ enabled: true }} // Add this
923
- >
924
- \`\`\`
925
-
926
- Signal requires the Business plan. Want me to check your plan?`,
927
- [
928
- { id: "1", label: "Check my plan", action: "check_plan", variant: "primary" },
929
- { id: "2", label: "I'll do this later", action: "complete", variant: "outline" }
930
- ]
931
- );
932
- break;
933
- case "confirm_brand":
934
- addMessage({ role: "user", content: "Brand info confirmed" });
935
- setState((prev) => ({ ...prev, step: "modules" }));
936
- showModuleSelectionWithRecommendations();
937
- break;
938
- case "edit_brand":
939
- addMessage({ role: "user", content: "Edit brand info" });
940
- addAssistantMessage(
941
- `No problem! Let me know what to change:
942
-
943
- \u2022 Business name
944
- \u2022 Primary color (hex like #3b82f6)
945
- \u2022 Tagline
946
-
947
- Just type what you'd like to update.`
948
- );
949
- break;
950
- case "manual_brand":
951
- addMessage({ role: "user", content: "Enter brand manually" });
952
- addAssistantMessage(
953
- `Sure! What's your business name?`
954
- );
955
- setState((prev) => ({
956
- ...prev,
957
- context: { ...prev.context, step: "brand_manual" }
958
- }));
959
- break;
960
- case "skip_brand":
961
- addMessage({ role: "user", content: "Skip brand for now" });
962
- setState((prev) => ({ ...prev, step: "modules" }));
963
- showModuleSelection();
964
- break;
965
- case "extract_brand":
966
- addMessage({ role: "user", content: "Extract from website" });
967
- addAssistantMessage(
968
- `What's the website URL? I'll extract the brand colors, name, and logo.`
969
- );
970
- break;
971
- case "set_flow_new":
972
- addMessage({ role: "user", content: "New Site" });
973
- setState((prev) => ({
974
- ...prev,
975
- context: { ...prev.context, flow: "new", step: "brand" }
976
- }));
977
- addAssistantMessage(
978
- `Great! For a new site, I'll help you:
979
-
980
- 1. Set up your brand (colors, name)
981
- 2. Choose which modules to enable
982
- 3. Generate integration code
983
-
984
- Do you have an existing website I can extract brand info from? Or would you prefer to enter it manually?`,
985
- [
986
- { id: "1", label: "Extract from website", action: "extract_brand", variant: "primary" },
987
- { id: "2", label: "Enter manually", action: "manual_brand", variant: "outline" },
988
- { id: "3", label: "Skip for now", action: "skip_brand", variant: "outline" }
989
- ]
990
- );
991
- break;
992
- case "set_flow_existing":
993
- addMessage({ role: "user", content: "Existing Project" });
994
- setState((prev) => ({
995
- ...prev,
996
- context: { ...prev.context, flow: "existing", step: "scan" }
997
- }));
998
- addAssistantMessage(
999
- `For an existing project, I can scan your codebase to find:
1000
-
1001
- \u2022 Forms to migrate (contact forms, newsletter signups)
1002
- \u2022 Chat widgets to replace (Intercom, Crisp, etc.)
1003
- \u2022 Metadata patterns to enhance
1004
- \u2022 Sitemap configuration
1005
-
1006
- Run this in your project root:
1007
-
1008
- \`\`\`bash
1009
- npx @sonordev/site-kit scan
1010
- \`\`\`
1011
-
1012
- Then paste the output here, or tell me about your project.`,
1013
- [
1014
- { id: "1", label: "I ran the scan", action: "show_scan_results", variant: "primary" },
1015
- { id: "2", label: "Skip scan", action: "skip_scan", variant: "outline" }
1016
- ]
1017
- );
1018
- break;
1019
- case "set_flow_rebuild":
1020
- addMessage({ role: "user", content: "Rebuild from Live Site" });
1021
- setState((prev) => ({
1022
- ...prev,
1023
- context: { ...prev.context, flow: "rebuild", step: "scrape" }
1024
- }));
1025
- addAssistantMessage(
1026
- `I'll help you rebuild with site-kit. Enter the live site URL and I'll:
1027
-
1028
- \u2022 Extract brand colors and business info
1029
- \u2022 Import FAQs with schema markup
1030
- \u2022 Suggest redirect mappings
1031
- \u2022 Generate copilot-instructions.md
1032
-
1033
- What's the website URL?`
1034
- );
1035
- break;
1036
- case "show_scan_results":
1037
- addMessage({ role: "user", content: "I ran the scan" });
1038
- addAssistantMessage(
1039
- `Great! Paste the scan output here, or describe what you found.
1040
-
1041
- I'll analyze the results and recommend a migration plan.`
1042
- );
1043
- break;
1044
- case "skip_scan":
1045
- addMessage({ role: "user", content: "Skip scan" });
1046
- setState((prev) => ({ ...prev, step: "modules" }));
1047
- showModuleSelection();
1048
- break;
1049
- case "generate_redirects":
1050
- addMessage({ role: "user", content: "Generate redirects" });
1051
- if (state.context.scrape_results?.routes) {
1052
- addStreamingMessage();
1053
- await sendToSignalStreaming(
1054
- `Generate SEO-optimized redirects for these routes: ${JSON.stringify(state.context.scrape_results.routes)}`,
1055
- state.context,
1056
- (token) => appendToStreamingMessage(token),
1057
- (result) => finalizeStreamingMessage(result.actions)
1058
- );
1059
- } else {
1060
- addAssistantMessage(
1061
- `I need a list of routes to generate redirects. Would you like to:
1062
-
1063
- 1. Scrape a website for routes
1064
- 2. Paste a list of URLs
1065
-
1066
- What's easier?`,
1067
- [
1068
- { id: "1", label: "Scrape website", action: "set_flow_rebuild", variant: "primary" },
1069
- { id: "2", label: "Paste URLs", action: "paste_urls", variant: "outline" }
1070
- ]
1071
- );
1072
- }
1073
- break;
1074
- case "generate_copilot_instructions":
1075
- addMessage({ role: "user", content: "Generate Copilot instructions" });
1076
- addStreamingMessage();
1077
- await sendToSignalStreaming(
1078
- `Generate copilot-instructions.md for project with modules: ${state.selectedModules.join(", ")} and brand: ${state.context.brand?.business_name || "Unknown"}`,
1079
- state.context,
1080
- (token) => appendToStreamingMessage(token),
1081
- (result) => {
1082
- finalizeStreamingMessage([
1083
- { id: "1", label: "\u{1F4CB} Copy to clipboard", action: "copy_copilot_instructions", variant: "primary" },
1084
- { id: "2", label: "Continue", action: "complete", variant: "outline" }
1085
- ]);
1086
- }
1087
- );
1088
- break;
1089
- case "verify_now":
1090
- addMessage({ role: "user", content: "Verify integration" });
1091
- verifyIntegration();
1092
- break;
1093
- }
1094
- }, [addMessage, addAssistantMessage, addStreamingMessage, appendToStreamingMessage, finalizeStreamingMessage, sendToSignalStreaming, state, onComplete]);
1095
- const handleAuthSuccess = React2.useCallback((email) => {
1096
- addAssistantMessage(
1097
- `Welcome back, ${email.split("@")[0]}! \u{1F44B}
1098
-
1099
- I found these projects in your account. Which one are we setting up?`,
1100
- [
1101
- { id: "1", label: "MyCompany.com", action: "select_project", variant: "secondary", data: { id: "1", name: "MyCompany.com", domain: "mycompany.com" } },
1102
- { id: "2", label: "Blog Project", action: "select_project", variant: "secondary", data: { id: "2", name: "Blog Project", domain: "blog.mycompany.com" } },
1103
- { id: "3", label: "+ Create new project", action: "create_project", variant: "outline" }
1104
- ]
1105
- );
1106
- }, [addAssistantMessage]);
1107
- const verifyIntegration = React2.useCallback(async () => {
1108
- setState((prev) => ({ ...prev, step: "verify" }));
1109
- setIsTyping(true);
1110
- try {
1111
- const response = await fetch(`${signalUrl}/api/skills/setup/verify`, {
1112
- method: "POST",
1113
- headers: {
1114
- "Content-Type": "application/json",
1115
- ...authToken ? { Authorization: `Bearer ${authToken}` } : {}
1116
- },
1117
- body: JSON.stringify({
1118
- project_id: projectId || state.context.project_id,
1119
- dev_url: "http://localhost:3000"
1120
- })
1121
- });
1122
- setIsTyping(false);
1123
- if (!response.ok) {
1124
- throw new Error("Verification failed");
1125
- }
1126
- const result = await response.json();
1127
- if (result.overall_status === "success") {
1128
- const checkList = result.checks.map(
1129
- (c) => `${c.passed ? "\u2705" : "\u274C"} ${c.check.replace(/_/g, " ")}`
1130
- ).join("\n");
1131
- addAssistantMessage(
1132
- `\u{1F389} **Integration Verified!**
1133
-
1134
- ${checkList}
1135
-
1136
- Your site-kit integration is working perfectly. Data will start appearing in Sonor shortly.`,
1137
- [
1138
- { id: "1", label: "Open Sonor Dashboard", action: "open_dashboard", variant: "primary" },
1139
- { id: "2", label: "Generate Copilot Instructions", action: "generate_copilot_instructions", variant: "secondary" }
1140
- ]
1141
- );
1142
- setState((prev) => ({ ...prev, step: "complete" }));
1143
- } else {
1144
- const issues = result.issues?.join("\n\u2022 ") || "Unknown issue";
1145
- addAssistantMessage(
1146
- `\u26A0\uFE0F **Verification Found Issues**
1147
-
1148
- \u2022 ${issues}
1149
-
1150
- Would you like help troubleshooting?`,
1151
- [
1152
- { id: "1", label: "Help me fix this", action: "troubleshoot", variant: "primary" },
1153
- { id: "2", label: "Skip for now", action: "complete", variant: "outline" }
1154
- ]
1155
- );
1156
- }
1157
- } catch (error) {
1158
- setIsTyping(false);
1159
- addAssistantMessage(
1160
- `I couldn't verify the integration automatically. Make sure your dev server is running.
1161
-
1162
- You can manually verify by:
1163
- 1. Opening your site in the browser
1164
- 2. Checking the Network tab for requests to api.sonor.io
1165
- 3. Looking for analytics events in your Sonor dashboard`,
1166
- [
1167
- { id: "1", label: "Try again", action: "verify_now", variant: "primary" },
1168
- { id: "2", label: "Continue anyway", action: "complete", variant: "outline" }
1169
- ]
1170
- );
1171
- }
1172
- }, [signalUrl, authToken, projectId, state.context.project_id, addAssistantMessage]);
1173
- const showModuleSelectionWithRecommendations = React2.useCallback(async () => {
1174
- const { brand, business_type, scan_results } = state.context;
1175
- if (brand || business_type) {
1176
- try {
1177
- const result = await sendToSignal(
1178
- `Recommend modules for: ${brand?.business_name || "Unknown"}, type: ${business_type || "general"}`,
1179
- { ...state.context, step: "recommend_modules" }
1180
- );
1181
- addAssistantMessage(
1182
- result.response,
1183
- void 0,
1184
- /* @__PURE__ */ jsxRuntime.jsx(
1185
- ModuleSelector,
1186
- {
1187
- modules: MODULES,
1188
- selected: state.selectedModules,
1189
- onChange: (modules) => setState((prev) => ({ ...prev, selectedModules: modules })),
1190
- onConfirm: () => handleAction("confirm_modules")
1191
- }
1192
- )
1193
- );
1194
- return;
1195
- } catch (error) {
1196
- }
1197
- }
1198
- showModuleSelection();
1199
- }, [state.context, state.selectedModules, sendToSignal, handleAction]);
1200
- const showModuleSelection = React2.useCallback(() => {
1201
- addAssistantMessage(
1202
- `Perfect! Now let's choose which features to enable.
1203
-
1204
- I've pre-selected the essentials, but you can customize:`,
1205
- void 0,
1206
- /* @__PURE__ */ jsxRuntime.jsx(
1207
- ModuleSelector,
1208
- {
1209
- modules: MODULES,
1210
- selected: state.selectedModules,
1211
- onChange: (modules) => setState((prev) => ({ ...prev, selectedModules: modules })),
1212
- onConfirm: () => handleAction("confirm_modules")
1213
- }
1214
- )
1215
- );
1216
- }, [addAssistantMessage, state.selectedModules, handleAction]);
1217
- const showConfigGeneration = React2.useCallback(() => {
1218
- const code = generateIntegrationCode(state);
1219
- addAssistantMessage(
1220
- `Here's your integration code! \u{1F389}
1221
-
1222
- Add this to your root layout:`,
1223
- [
1224
- { id: "1", label: "\u{1F4CB} Copy Code", action: "copy_code", variant: "primary" }
1225
- ],
1226
- /* @__PURE__ */ jsxRuntime.jsx(CodeBlock, { code })
1227
- );
1228
- }, [addAssistantMessage, state]);
1229
- const handleSubmit = React2.useCallback(async (e) => {
1230
- e.preventDefault();
1231
- if (!input.trim()) return;
1232
- const userInput = input.trim();
1233
- setInput("");
1234
- addMessage({ role: "user", content: userInput });
1235
- if (state.step === "auth" && userInput.includes("@")) {
1236
- setState((prev) => ({
1237
- ...prev,
1238
- isAuthenticated: true,
1239
- userEmail: userInput,
1240
- step: "project"
1241
- }));
1242
- addAssistantMessage(
1243
- `Sending magic link to ${userInput}...
1244
-
1245
- (In production, you'd receive an email. For now, I'll simulate a successful login.)`
1246
- );
1247
- setTimeout(() => handleAuthSuccess(userInput), 1500);
1248
- } else if (userInput.toLowerCase().includes("http") || userInput.match(/^[\w.-]+\.[a-z]{2,}$/i)) {
1249
- const domain = userInput.replace(/^https?:\/\//, "").split("/")[0];
1250
- setIsTyping(true);
1251
- addAssistantMessage(`Analyzing ${domain} to extract brand information...`);
1252
- const brand = await extractBrandFromDomain(domain);
1253
- setIsTyping(false);
1254
- if (brand) {
1255
- setState((prev) => ({
1256
- ...prev,
1257
- context: { ...prev.context, brand, domain }
1258
- }));
1259
- const brandSummary = [
1260
- brand.business_name && `**Business:** ${brand.business_name}`,
1261
- brand.tagline && `**Tagline:** ${brand.tagline}`,
1262
- brand.primary_color && `**Primary Color:** ${brand.primary_color}`,
1263
- brand.phone_numbers?.length && `**Phone:** ${brand.phone_numbers[0]}`
1264
- ].filter(Boolean).join("\n");
1265
- addAssistantMessage(
1266
- `Found brand information:
1267
-
1268
- ${brandSummary}
1269
-
1270
- Does this look right?`,
1271
- [
1272
- { id: "1", label: "Yes, looks good!", action: "confirm_brand", variant: "primary" },
1273
- { id: "2", label: "Edit brand info", action: "edit_brand", variant: "outline" }
1274
- ]
1275
- );
1276
- } else {
1277
- addAssistantMessage(
1278
- `I couldn't extract brand info from ${domain}. You can enter it manually, or we can continue without it.`,
1279
- [
1280
- { id: "1", label: "Enter manually", action: "manual_brand", variant: "primary" },
1281
- { id: "2", label: "Skip for now", action: "skip_brand", variant: "outline" }
1282
- ]
1283
- );
1284
- }
1285
- } else {
1286
- addStreamingMessage();
1287
- try {
1288
- await sendToSignalStreaming(
1289
- userInput,
1290
- state.context,
1291
- (token) => appendToStreamingMessage(token),
1292
- (result) => {
1293
- if (result.updated_context) {
1294
- setState((prev) => ({
1295
- ...prev,
1296
- context: { ...prev.context, ...result.updated_context }
1297
- }));
1298
- }
1299
- finalizeStreamingMessage(result.actions);
1300
- }
1301
- );
1302
- } catch (error) {
1303
- finalizeStreamingMessage();
1304
- addAssistantMessage(
1305
- `I understand you said: "${userInput}"
1306
-
1307
- Let me help you with that. What would you like to do?`,
1308
- [
1309
- { id: "1", label: "Continue setup", action: "start", variant: "primary" },
1310
- { id: "2", label: "Ask a question", action: "help", variant: "outline" }
1311
- ]
1312
- );
1313
- }
1314
- }
1315
- }, [input, state.step, state.context, addMessage, addAssistantMessage, handleAuthSuccess, sendToSignalStreaming, appendToStreamingMessage, finalizeStreamingMessage, addStreamingMessage, extractBrandFromDomain]);
1316
- return /* @__PURE__ */ jsxRuntime.jsxs("div", { style: styles.container, children: [
1317
- /* @__PURE__ */ jsxRuntime.jsxs("div", { style: styles.header, children: [
1318
- /* @__PURE__ */ jsxRuntime.jsx("div", { style: styles.logo, children: "U" }),
1319
- /* @__PURE__ */ jsxRuntime.jsxs("div", { children: [
1320
- /* @__PURE__ */ jsxRuntime.jsx("div", { style: styles.title, children: "Sonor Setup" }),
1321
- /* @__PURE__ */ jsxRuntime.jsx("div", { style: styles.subtitle, children: "Site-Kit Integration Wizard" })
1322
- ] })
1323
- ] }),
1324
- /* @__PURE__ */ jsxRuntime.jsxs("div", { style: styles.messages, children: [
1325
- messages.map((message) => /* @__PURE__ */ jsxRuntime.jsxs(
1326
- "div",
1327
- {
1328
- style: {
1329
- ...styles.message,
1330
- ...message.role === "assistant" ? styles.messageAssistant : styles.messageUser
1331
- },
1332
- children: [
1333
- /* @__PURE__ */ jsxRuntime.jsx(
1334
- "div",
1335
- {
1336
- style: {
1337
- ...styles.avatar,
1338
- ...message.role === "assistant" ? styles.avatarAssistant : styles.avatarUser
1339
- },
1340
- children: message.role === "assistant" ? "\u2728" : "\u{1F464}"
1341
- }
1342
- ),
1343
- /* @__PURE__ */ jsxRuntime.jsxs("div", { children: [
1344
- /* @__PURE__ */ jsxRuntime.jsx(
1345
- "div",
1346
- {
1347
- style: {
1348
- ...styles.bubble,
1349
- ...message.role === "assistant" ? styles.bubbleAssistant : styles.bubbleUser
1350
- },
1351
- children: message.content.split("\n").map((line, i) => /* @__PURE__ */ jsxRuntime.jsxs(React2__default.default.Fragment, { children: [
1352
- line,
1353
- i < message.content.split("\n").length - 1 && /* @__PURE__ */ jsxRuntime.jsx("br", {})
1354
- ] }, i))
1355
- }
1356
- ),
1357
- message.component,
1358
- message.actions && /* @__PURE__ */ jsxRuntime.jsx("div", { style: styles.actions, children: message.actions.map((action) => /* @__PURE__ */ jsxRuntime.jsx(
1359
- "button",
1360
- {
1361
- onClick: () => handleAction(action.action, action.data),
1362
- style: {
1363
- ...styles.actionButton,
1364
- ...action.variant === "primary" ? styles.actionPrimary : action.variant === "outline" ? styles.actionOutline : styles.actionSecondary
1365
- },
1366
- children: action.label
1367
- },
1368
- action.id
1369
- )) })
1370
- ] })
1371
- ]
1372
- },
1373
- message.id
1374
- )),
1375
- isTyping && /* @__PURE__ */ jsxRuntime.jsxs("div", { style: { ...styles.message, ...styles.messageAssistant }, children: [
1376
- /* @__PURE__ */ jsxRuntime.jsx("div", { style: { ...styles.avatar, ...styles.avatarAssistant }, children: "\u2728" }),
1377
- /* @__PURE__ */ jsxRuntime.jsxs("div", { style: styles.typing, children: [
1378
- /* @__PURE__ */ jsxRuntime.jsx("div", { style: { ...styles.typingDot, animationDelay: "0s" } }),
1379
- /* @__PURE__ */ jsxRuntime.jsx("div", { style: { ...styles.typingDot, animationDelay: "0.2s" } }),
1380
- /* @__PURE__ */ jsxRuntime.jsx("div", { style: { ...styles.typingDot, animationDelay: "0.4s" } })
1381
- ] })
1382
- ] }),
1383
- /* @__PURE__ */ jsxRuntime.jsx("div", { ref: messagesEndRef })
1384
- ] }),
1385
- /* @__PURE__ */ jsxRuntime.jsxs("form", { onSubmit: handleSubmit, style: styles.inputContainer, children: [
1386
- /* @__PURE__ */ jsxRuntime.jsx(
1387
- "input",
1388
- {
1389
- ref: inputRef,
1390
- type: "text",
1391
- value: input,
1392
- onChange: (e) => setInput(e.target.value),
1393
- placeholder: "Type a message...",
1394
- style: styles.input
1395
- }
1396
- ),
1397
- /* @__PURE__ */ jsxRuntime.jsx("button", { type: "submit", style: styles.sendButton, children: "Send" })
1398
- ] }),
1399
- /* @__PURE__ */ jsxRuntime.jsx("style", { children: `
1400
- @keyframes typing {
1401
- 0%, 60%, 100% { transform: translateY(0); opacity: 0.5; }
1402
- 30% { transform: translateY(-4px); opacity: 1; }
1403
- }
1404
- ` })
1405
- ] });
1406
- }
1407
- function ModuleSelector({
1408
- modules,
1409
- selected,
1410
- onChange,
1411
- onConfirm
1412
- }) {
1413
- const toggle = (id) => {
1414
- onChange(
1415
- selected.includes(id) ? selected.filter((m) => m !== id) : [...selected, id]
1416
- );
1417
- };
1418
- return /* @__PURE__ */ jsxRuntime.jsxs("div", { style: { marginTop: "0.75rem", display: "flex", flexDirection: "column", gap: "0.5rem" }, children: [
1419
- modules.map((module) => /* @__PURE__ */ jsxRuntime.jsxs(
1420
- "div",
1421
- {
1422
- onClick: () => toggle(module.id),
1423
- style: {
1424
- ...styles.moduleCard,
1425
- ...selected.includes(module.id) ? styles.moduleCardSelected : {}
1426
- },
1427
- children: [
1428
- /* @__PURE__ */ jsxRuntime.jsx("span", { style: styles.moduleIcon, children: module.icon }),
1429
- /* @__PURE__ */ jsxRuntime.jsxs("div", { style: styles.moduleInfo, children: [
1430
- /* @__PURE__ */ jsxRuntime.jsxs("div", { style: styles.moduleName, children: [
1431
- module.name,
1432
- module.recommended && /* @__PURE__ */ jsxRuntime.jsx("span", { style: { marginLeft: "0.5rem", fontSize: "0.625rem", background: "#dbeafe", color: "#1d4ed8", padding: "2px 6px", borderRadius: "4px" }, children: "Recommended" })
1433
- ] }),
1434
- /* @__PURE__ */ jsxRuntime.jsx("div", { style: styles.moduleDesc, children: module.description })
1435
- ] }),
1436
- /* @__PURE__ */ jsxRuntime.jsx(
1437
- "input",
1438
- {
1439
- type: "checkbox",
1440
- checked: selected.includes(module.id),
1441
- onChange: () => toggle(module.id),
1442
- style: styles.checkbox
1443
- }
1444
- )
1445
- ]
1446
- },
1447
- module.id
1448
- )),
1449
- /* @__PURE__ */ jsxRuntime.jsxs(
1450
- "button",
1451
- {
1452
- onClick: onConfirm,
1453
- style: { ...styles.actionButton, ...styles.actionPrimary, marginTop: "0.5rem" },
1454
- children: [
1455
- "Continue with ",
1456
- selected.length,
1457
- " modules"
1458
- ]
1459
- }
1460
- )
1461
- ] });
1462
- }
1463
- function CodeBlock({ code }) {
1464
- return /* @__PURE__ */ jsxRuntime.jsx("pre", { style: {
1465
- marginTop: "0.75rem",
1466
- padding: "1rem",
1467
- background: "#1f2937",
1468
- color: "#e5e7eb",
1469
- borderRadius: "0.5rem",
1470
- fontSize: "0.8125rem",
1471
- overflowX: "auto",
1472
- fontFamily: "monospace"
1473
- }, children: code });
1474
- }
1475
- function generateIntegrationCode(state) {
1476
- const { selectedModules } = state;
1477
- const moduleConfigs = [];
1478
- if (selectedModules.includes("analytics")) {
1479
- moduleConfigs.push(` analytics={{ enabled: true }}`);
1480
- }
1481
- if (selectedModules.includes("engage")) {
1482
- moduleConfigs.push(` engage={{ enabled: true }}`);
1483
- }
1484
- if (selectedModules.includes("forms")) {
1485
- moduleConfigs.push(` forms={{ enabled: true }}`);
1486
- }
1487
- if (selectedModules.includes("signal")) {
1488
- moduleConfigs.push(` signal={{ enabled: true, realtime: true }}`);
1489
- }
1490
- return `// app/layout.tsx (or pages/_app.tsx)
1491
- import { SiteKitProvider } from '@sonordev/site-kit'
1492
-
1493
- export default function RootLayout({ children }) {
1494
- return (
1495
- <html>
1496
- <body>
1497
- <SiteKitProvider
1498
- apiKey={process.env.SONOR_API_KEY!}
1499
- ${moduleConfigs.join("\n")}
1500
- >
1501
- {children}
1502
- </SiteKitProvider>
1503
- </body>
1504
- </html>
1505
- )
1506
- }`;
1507
- }
1508
227
 
1509
228
  Object.defineProperty(exports, "SignalBridge", {
1510
229
  enumerable: true,
1511
- get: function () { return chunkYBTYDBWY_js.SignalBridge; }
230
+ get: function () { return chunk7M3FNAS5_js.SignalBridge; }
1512
231
  });
1513
232
  Object.defineProperty(exports, "useSignal", {
1514
233
  enumerable: true,
1515
- get: function () { return chunkYBTYDBWY_js.useSignal; }
234
+ get: function () { return chunk7M3FNAS5_js.useSignal; }
1516
235
  });
1517
236
  Object.defineProperty(exports, "useSignalConfig", {
1518
237
  enumerable: true,
1519
- get: function () { return chunkYBTYDBWY_js.useSignalConfig; }
238
+ get: function () { return chunk7M3FNAS5_js.useSignalConfig; }
1520
239
  });
1521
240
  Object.defineProperty(exports, "useSignalEvent", {
1522
241
  enumerable: true,
1523
- get: function () { return chunkYBTYDBWY_js.useSignalEvent; }
242
+ get: function () { return chunk7M3FNAS5_js.useSignalEvent; }
1524
243
  });
1525
244
  Object.defineProperty(exports, "useSignalExperiment", {
1526
245
  enumerable: true,
1527
- get: function () { return chunkYBTYDBWY_js.useSignalExperiment; }
246
+ get: function () { return chunk7M3FNAS5_js.useSignalExperiment; }
1528
247
  });
1529
248
  Object.defineProperty(exports, "useSignalOutcome", {
1530
249
  enumerable: true,
1531
- get: function () { return chunkYBTYDBWY_js.useSignalOutcome; }
1532
- });
1533
- Object.defineProperty(exports, "clearRedirectCache", {
1534
- enumerable: true,
1535
- get: function () { return chunkX4J33XQD_js.clearRedirectCache; }
1536
- });
1537
- Object.defineProperty(exports, "fetchRedirectRules", {
1538
- enumerable: true,
1539
- get: function () { return chunkX4J33XQD_js.fetchRedirectRules; }
1540
- });
1541
- Object.defineProperty(exports, "generateNextRedirects", {
1542
- enumerable: true,
1543
- get: function () { return chunkX4J33XQD_js.generateNextRedirects; }
1544
- });
1545
- Object.defineProperty(exports, "handleManagedRedirects", {
1546
- enumerable: true,
1547
- get: function () { return chunkX4J33XQD_js.handleManagedRedirects; }
250
+ get: function () { return chunk7M3FNAS5_js.useSignalOutcome; }
1548
251
  });
1549
252
  Object.defineProperty(exports, "ManagedImage", {
1550
253
  enumerable: true,
1551
- get: function () { return chunkG6VGUAK2_js.ManagedImage; }
254
+ get: function () { return chunkIFVMZFNT_js.ManagedImage; }
1552
255
  });
1553
256
  Object.defineProperty(exports, "assignImageToSlot", {
1554
257
  enumerable: true,
1555
- get: function () { return chunkG6VGUAK2_js.assignImageToSlot; }
258
+ get: function () { return chunkIFVMZFNT_js.assignImageToSlot; }
1556
259
  });
1557
260
  Object.defineProperty(exports, "clearImageSlot", {
1558
261
  enumerable: true,
1559
- get: function () { return chunkG6VGUAK2_js.clearImageSlot; }
262
+ get: function () { return chunkIFVMZFNT_js.clearImageSlot; }
1560
263
  });
1561
264
  Object.defineProperty(exports, "fetchManagedImage", {
1562
265
  enumerable: true,
1563
- get: function () { return chunkG6VGUAK2_js.fetchManagedImage; }
266
+ get: function () { return chunkIFVMZFNT_js.fetchManagedImage; }
1564
267
  });
1565
268
  Object.defineProperty(exports, "fetchManagedImages", {
1566
269
  enumerable: true,
1567
- get: function () { return chunkG6VGUAK2_js.fetchManagedImages; }
270
+ get: function () { return chunkIFVMZFNT_js.fetchManagedImages; }
1568
271
  });
1569
272
  Object.defineProperty(exports, "listImageFiles", {
1570
273
  enumerable: true,
1571
- get: function () { return chunkG6VGUAK2_js.listImageFiles; }
274
+ get: function () { return chunkIFVMZFNT_js.listImageFiles; }
1572
275
  });
1573
276
  Object.defineProperty(exports, "uploadImage", {
1574
277
  enumerable: true,
1575
- get: function () { return chunkG6VGUAK2_js.uploadImage; }
278
+ get: function () { return chunkIFVMZFNT_js.uploadImage; }
1576
279
  });
1577
280
  Object.defineProperty(exports, "TestimonialSection", {
1578
281
  enumerable: true,
@@ -1588,162 +291,171 @@ Object.defineProperty(exports, "fetchReviews", {
1588
291
  });
1589
292
  Object.defineProperty(exports, "CalendarView", {
1590
293
  enumerable: true,
1591
- get: function () { return chunkWW7UM7XY_js.CalendarView; }
294
+ get: function () { return chunkTZAD7CZD_js.CalendarView; }
1592
295
  });
1593
296
  Object.defineProperty(exports, "CheckoutForm", {
1594
297
  enumerable: true,
1595
- get: function () { return chunkWW7UM7XY_js.CheckoutForm; }
298
+ get: function () { return chunkTZAD7CZD_js.CheckoutForm; }
1596
299
  });
1597
300
  Object.defineProperty(exports, "EventCalendar", {
1598
301
  enumerable: true,
1599
- get: function () { return chunkWW7UM7XY_js.EventCalendar; }
302
+ get: function () { return chunkTZAD7CZD_js.EventCalendar; }
1600
303
  });
1601
304
  Object.defineProperty(exports, "EventEmbed", {
1602
305
  enumerable: true,
1603
- get: function () { return chunkWW7UM7XY_js.EventEmbed; }
306
+ get: function () { return chunkTZAD7CZD_js.EventEmbed; }
1604
307
  });
1605
308
  Object.defineProperty(exports, "EventModal", {
1606
309
  enumerable: true,
1607
- get: function () { return chunkWW7UM7XY_js.EventModal; }
310
+ get: function () { return chunkTZAD7CZD_js.EventModal; }
1608
311
  });
1609
312
  Object.defineProperty(exports, "EventTile", {
1610
313
  enumerable: true,
1611
- get: function () { return chunkWW7UM7XY_js.EventTile; }
314
+ get: function () { return chunkTZAD7CZD_js.EventTile; }
1612
315
  });
1613
316
  Object.defineProperty(exports, "OfferingCard", {
1614
317
  enumerable: true,
1615
- get: function () { return chunkWW7UM7XY_js.OfferingCard; }
318
+ get: function () { return chunkTZAD7CZD_js.OfferingCard; }
1616
319
  });
1617
320
  Object.defineProperty(exports, "OfferingList", {
1618
321
  enumerable: true,
1619
- get: function () { return chunkWW7UM7XY_js.OfferingList; }
322
+ get: function () { return chunkTZAD7CZD_js.OfferingList; }
1620
323
  });
1621
324
  Object.defineProperty(exports, "ProductEmbed", {
1622
325
  enumerable: true,
1623
- get: function () { return chunkWW7UM7XY_js.ProductEmbed; }
326
+ get: function () { return chunkTZAD7CZD_js.ProductEmbed; }
1624
327
  });
1625
328
  Object.defineProperty(exports, "RegistrationForm", {
1626
329
  enumerable: true,
1627
- get: function () { return chunkWW7UM7XY_js.RegistrationForm; }
330
+ get: function () { return chunkTZAD7CZD_js.RegistrationForm; }
1628
331
  });
1629
332
  Object.defineProperty(exports, "UpcomingEvents", {
1630
333
  enumerable: true,
1631
- get: function () { return chunkWW7UM7XY_js.UpcomingEvents; }
334
+ get: function () { return chunkTZAD7CZD_js.UpcomingEvents; }
1632
335
  });
1633
336
  Object.defineProperty(exports, "createCheckoutSession", {
1634
337
  enumerable: true,
1635
- get: function () { return chunkWW7UM7XY_js.createCheckoutSession; }
338
+ get: function () { return chunkTZAD7CZD_js.createCheckoutSession; }
1636
339
  });
1637
340
  Object.defineProperty(exports, "fetchNextEvent", {
1638
341
  enumerable: true,
1639
- get: function () { return chunkWW7UM7XY_js.fetchNextEvent; }
342
+ get: function () { return chunkTZAD7CZD_js.fetchNextEvent; }
1640
343
  });
1641
344
  Object.defineProperty(exports, "fetchOffering", {
1642
345
  enumerable: true,
1643
- get: function () { return chunkWW7UM7XY_js.fetchOffering; }
346
+ get: function () { return chunkTZAD7CZD_js.fetchOffering; }
1644
347
  });
1645
348
  Object.defineProperty(exports, "fetchOfferings", {
1646
349
  enumerable: true,
1647
- get: function () { return chunkWW7UM7XY_js.fetchOfferings; }
350
+ get: function () { return chunkTZAD7CZD_js.fetchOfferings; }
1648
351
  });
1649
352
  Object.defineProperty(exports, "fetchProducts", {
1650
353
  enumerable: true,
1651
- get: function () { return chunkWW7UM7XY_js.fetchProducts; }
354
+ get: function () { return chunkTZAD7CZD_js.fetchProducts; }
1652
355
  });
1653
356
  Object.defineProperty(exports, "fetchServices", {
1654
357
  enumerable: true,
1655
- get: function () { return chunkWW7UM7XY_js.fetchServices; }
358
+ get: function () { return chunkTZAD7CZD_js.fetchServices; }
1656
359
  });
1657
360
  Object.defineProperty(exports, "fetchUpcomingEvents", {
1658
361
  enumerable: true,
1659
- get: function () { return chunkWW7UM7XY_js.fetchUpcomingEvents; }
362
+ get: function () { return chunkTZAD7CZD_js.fetchUpcomingEvents; }
1660
363
  });
1661
364
  Object.defineProperty(exports, "formatDate", {
1662
365
  enumerable: true,
1663
- get: function () { return chunkWW7UM7XY_js.formatDate; }
366
+ get: function () { return chunkTZAD7CZD_js.formatDate; }
1664
367
  });
1665
368
  Object.defineProperty(exports, "formatDateTime", {
1666
369
  enumerable: true,
1667
- get: function () { return chunkWW7UM7XY_js.formatDateTime; }
370
+ get: function () { return chunkTZAD7CZD_js.formatDateTime; }
1668
371
  });
1669
372
  Object.defineProperty(exports, "formatPrice", {
1670
373
  enumerable: true,
1671
- get: function () { return chunkWW7UM7XY_js.formatPrice; }
374
+ get: function () { return chunkTZAD7CZD_js.formatPrice; }
1672
375
  });
1673
376
  Object.defineProperty(exports, "getOfferingUrl", {
1674
377
  enumerable: true,
1675
- get: function () { return chunkWW7UM7XY_js.getOfferingUrl; }
378
+ get: function () { return chunkTZAD7CZD_js.getOfferingUrl; }
1676
379
  });
1677
380
  Object.defineProperty(exports, "registerForEvent", {
1678
381
  enumerable: true,
1679
- get: function () { return chunkWW7UM7XY_js.registerForEvent; }
382
+ get: function () { return chunkTZAD7CZD_js.registerForEvent; }
1680
383
  });
1681
384
  Object.defineProperty(exports, "useEventModal", {
1682
385
  enumerable: true,
1683
- get: function () { return chunkWW7UM7XY_js.useEventModal; }
386
+ get: function () { return chunkTZAD7CZD_js.useEventModal; }
1684
387
  });
1685
388
  Object.defineProperty(exports, "BookingWidget", {
1686
389
  enumerable: true,
1687
- get: function () { return chunkIJ2LWZID_js.BookingWidget; }
390
+ get: function () { return chunkWETCVFIK_js.BookingWidget; }
1688
391
  });
1689
392
  Object.defineProperty(exports, "createBooking", {
1690
393
  enumerable: true,
1691
- get: function () { return chunkIJ2LWZID_js.createBooking; }
394
+ get: function () { return chunkWETCVFIK_js.createBooking; }
1692
395
  });
1693
396
  Object.defineProperty(exports, "createSlotHold", {
1694
397
  enumerable: true,
1695
- get: function () { return chunkIJ2LWZID_js.createSlotHold; }
398
+ get: function () { return chunkWETCVFIK_js.createSlotHold; }
1696
399
  });
1697
400
  Object.defineProperty(exports, "detectTimezone", {
1698
401
  enumerable: true,
1699
- get: function () { return chunkIJ2LWZID_js.detectTimezone; }
402
+ get: function () { return chunkWETCVFIK_js.detectTimezone; }
1700
403
  });
1701
404
  Object.defineProperty(exports, "fetchAvailability", {
1702
405
  enumerable: true,
1703
- get: function () { return chunkIJ2LWZID_js.fetchAvailability; }
406
+ get: function () { return chunkWETCVFIK_js.fetchAvailability; }
1704
407
  });
1705
408
  Object.defineProperty(exports, "fetchAvailableDates", {
1706
409
  enumerable: true,
1707
- get: function () { return chunkIJ2LWZID_js.fetchAvailableDates; }
410
+ get: function () { return chunkWETCVFIK_js.fetchAvailableDates; }
1708
411
  });
1709
412
  Object.defineProperty(exports, "fetchBookingTypeDetails", {
1710
413
  enumerable: true,
1711
- get: function () { return chunkIJ2LWZID_js.fetchBookingTypeDetails; }
414
+ get: function () { return chunkWETCVFIK_js.fetchBookingTypeDetails; }
1712
415
  });
1713
416
  Object.defineProperty(exports, "fetchBookingTypes", {
1714
417
  enumerable: true,
1715
- get: function () { return chunkIJ2LWZID_js.fetchBookingTypes; }
418
+ get: function () { return chunkWETCVFIK_js.fetchBookingTypes; }
1716
419
  });
1717
420
  Object.defineProperty(exports, "formatBookingDate", {
1718
421
  enumerable: true,
1719
- get: function () { return chunkIJ2LWZID_js.formatDate; }
422
+ get: function () { return chunkWETCVFIK_js.formatDate; }
1720
423
  });
1721
424
  Object.defineProperty(exports, "formatBookingTime", {
1722
425
  enumerable: true,
1723
- get: function () { return chunkIJ2LWZID_js.formatTime; }
426
+ get: function () { return chunkWETCVFIK_js.formatTime; }
1724
427
  });
1725
428
  Object.defineProperty(exports, "formatDuration", {
1726
429
  enumerable: true,
1727
- get: function () { return chunkIJ2LWZID_js.formatDuration; }
430
+ get: function () { return chunkWETCVFIK_js.formatDuration; }
1728
431
  });
1729
432
  Object.defineProperty(exports, "releaseSlotHold", {
1730
433
  enumerable: true,
1731
- get: function () { return chunkIJ2LWZID_js.releaseSlotHold; }
434
+ get: function () { return chunkWETCVFIK_js.releaseSlotHold; }
435
+ });
436
+ Object.defineProperty(exports, "clearRedirectCache", {
437
+ enumerable: true,
438
+ get: function () { return chunkW6K7MQCC_js.clearRedirectCache; }
439
+ });
440
+ Object.defineProperty(exports, "fetchRedirectRules", {
441
+ enumerable: true,
442
+ get: function () { return chunkW6K7MQCC_js.fetchRedirectRules; }
1732
443
  });
1733
- Object.defineProperty(exports, "SetupWizard", {
444
+ Object.defineProperty(exports, "generateNextRedirects", {
445
+ enumerable: true,
446
+ get: function () { return chunkW6K7MQCC_js.generateNextRedirects; }
447
+ });
448
+ Object.defineProperty(exports, "handleManagedRedirects", {
1734
449
  enumerable: true,
1735
- get: function () { return chunkIFAW7JFO_js.SetupWizard; }
450
+ get: function () { return chunkW6K7MQCC_js.handleManagedRedirects; }
1736
451
  });
1737
452
  exports.AffiliateCard = AffiliateCard;
1738
453
  exports.AffiliatesWidget = AffiliatesWidget;
1739
454
  exports.ExperimentConversion = ExperimentConversion;
1740
- exports.SetupAssistant = SetupAssistant;
1741
455
  exports.SignalExperiment = SignalExperiment;
1742
- exports.SiteKitProvider = SiteKitProvider;
1743
456
  exports.fetchAffiliates = fetchAffiliates;
1744
457
  exports.getTrackingUrl = getTrackingUrl;
1745
458
  exports.useAffiliates = useAffiliates;
1746
459
  exports.useExperimentVariant = useExperimentVariant;
1747
- exports.useSiteKit = useSiteKit;
1748
460
  //# sourceMappingURL=index.js.map
1749
461
  //# sourceMappingURL=index.js.map