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