@sonordev/site-kit 1.5.4 → 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 (271) 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-T2S5WUMJ.js.map → EngageWidget-IDBEBGQR.js.map} +1 -1
  7. package/dist/EngageWidget-SRRI4W7U.mjs +4 -0
  8. package/dist/{EngageWidget-RWBCI4RM.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-DK2WNYQA.js → chunk-6ZGM7S5O.js} +108 -86
  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-VZMRZQ2D.mjs → chunk-MSRLAD7F.mjs} +107 -86
  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-OE5DEMCV.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-35MALWVX.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.d.mts +3 -2
  103. package/dist/engage/index.d.ts +3 -2
  104. package/dist/engage/index.js +6 -6
  105. package/dist/engage/index.js.map +1 -1
  106. package/dist/engage/index.mjs +3 -3
  107. package/dist/engage/index.mjs.map +1 -1
  108. package/dist/forms/index.js +379 -84
  109. package/dist/forms/index.js.map +1 -1
  110. package/dist/forms/index.mjs +375 -65
  111. package/dist/forms/index.mjs.map +1 -1
  112. package/dist/forms/styles.css +312 -0
  113. package/dist/images/index.js +11 -11
  114. package/dist/images/index.mjs +2 -2
  115. package/dist/images/server.js +4 -4
  116. package/dist/images/server.mjs +1 -1
  117. package/dist/index.d.mts +4 -131
  118. package/dist/index.d.ts +4 -131
  119. package/dist/index.js +85 -1373
  120. package/dist/index.js.map +1 -1
  121. package/dist/index.mjs +13 -1294
  122. package/dist/index.mjs.map +1 -1
  123. package/dist/layout/client.js +2 -2
  124. package/dist/layout/client.mjs +1 -1
  125. package/dist/layout/index.js +21 -11
  126. package/dist/layout/index.js.map +1 -1
  127. package/dist/layout/index.mjs +17 -7
  128. package/dist/layout/index.mjs.map +1 -1
  129. package/dist/llms/index.d.mts +3 -3
  130. package/dist/llms/index.d.ts +3 -3
  131. package/dist/llms/index.js +12 -12
  132. package/dist/llms/index.js.map +1 -1
  133. package/dist/llms/index.mjs +2 -2
  134. package/dist/llms/index.mjs.map +1 -1
  135. package/dist/manifest/index.js +4 -4
  136. package/dist/manifest/index.js.map +1 -1
  137. package/dist/manifest/index.mjs +3 -3
  138. package/dist/manifest/index.mjs.map +1 -1
  139. package/dist/middleware/index.js +3 -3
  140. package/dist/middleware/index.mjs +2 -2
  141. package/dist/redirects/index.js +6 -6
  142. package/dist/redirects/index.mjs +2 -2
  143. package/dist/robots/index.js +3 -3
  144. package/dist/robots/index.js.map +1 -1
  145. package/dist/robots/index.mjs +2 -2
  146. package/dist/robots/index.mjs.map +1 -1
  147. package/dist/{routing-DZYzyDHw.d.ts → routing-DQ_Et-OP.d.mts} +4 -4
  148. package/dist/{routing-B5XS-6_W.d.mts → routing-IYiJNIIX.d.ts} +4 -4
  149. package/dist/seo/index.d.mts +3 -5
  150. package/dist/seo/index.d.ts +3 -5
  151. package/dist/seo/index.js +77 -76
  152. package/dist/seo/index.js.map +1 -1
  153. package/dist/seo/index.mjs +41 -40
  154. package/dist/seo/index.mjs.map +1 -1
  155. package/dist/seo/register-sitemap-cli.js +3 -3
  156. package/dist/seo/register-sitemap-cli.js.map +1 -1
  157. package/dist/seo/register-sitemap-cli.mjs +3 -3
  158. package/dist/seo/register-sitemap-cli.mjs.map +1 -1
  159. package/dist/seo/server.d.mts +3 -3
  160. package/dist/seo/server.d.ts +3 -3
  161. package/dist/seo/server.js +7 -7
  162. package/dist/seo/server.js.map +1 -1
  163. package/dist/seo/server.mjs +5 -5
  164. package/dist/seo/server.mjs.map +1 -1
  165. package/dist/{server-api-XGKRGUMG.js → server-api-36R24YWN.js} +21 -21
  166. package/dist/{server-api-XGKRGUMG.js.map → server-api-36R24YWN.js.map} +1 -1
  167. package/dist/{server-api-COVFLFZ2.mjs → server-api-UIZU4JM3.mjs} +3 -3
  168. package/dist/{server-api-COVFLFZ2.mjs.map → server-api-UIZU4JM3.mjs.map} +1 -1
  169. package/dist/setup/index.d.mts +2 -5
  170. package/dist/setup/index.d.ts +2 -5
  171. package/dist/setup/index.js +0 -31
  172. package/dist/setup/index.mjs +1 -4
  173. package/dist/site-config/index.js +3 -3
  174. package/dist/site-config/index.mjs +1 -1
  175. package/dist/sitemap/index.js +10 -9
  176. package/dist/sitemap/index.js.map +1 -1
  177. package/dist/sitemap/index.mjs +8 -7
  178. package/dist/sitemap/index.mjs.map +1 -1
  179. package/dist/sync/index.js +13 -13
  180. package/dist/sync/index.mjs +1 -1
  181. package/dist/{types-KZP_VWZp.d.ts → types-CGkyylOa.d.mts} +2 -2
  182. package/dist/{types-KZP_VWZp.d.mts → types-CGkyylOa.d.ts} +2 -2
  183. package/package.json +6 -13
  184. package/dist/AnalyticsProvider-BBLU4U2T.mjs +0 -4
  185. package/dist/AnalyticsProvider-EMDIAAWR.js +0 -25
  186. package/dist/EngageWidget-RWBCI4RM.mjs +0 -4
  187. package/dist/EngageWidget-T2S5WUMJ.js +0 -13
  188. package/dist/SetupWizard-Cki06kB0.d.mts +0 -12
  189. package/dist/SetupWizard-Cki06kB0.d.ts +0 -12
  190. package/dist/SignalBridge-6UYUZ2CN.js +0 -33
  191. package/dist/SignalBridge-WGHMEILW.mjs +0 -4
  192. package/dist/chunk-35MALWVX.mjs.map +0 -1
  193. package/dist/chunk-36Y7OWES.mjs.map +0 -1
  194. package/dist/chunk-373TK6TZ.js +0 -321
  195. package/dist/chunk-373TK6TZ.js.map +0 -1
  196. package/dist/chunk-4MOJJSNA.js +0 -14867
  197. package/dist/chunk-4MOJJSNA.js.map +0 -1
  198. package/dist/chunk-4QHHFCAA.mjs.map +0 -1
  199. package/dist/chunk-4X5TFGKD.mjs.map +0 -1
  200. package/dist/chunk-5YDPPOUU.mjs +0 -810
  201. package/dist/chunk-5YDPPOUU.mjs.map +0 -1
  202. package/dist/chunk-7FKPJQVS.mjs +0 -289
  203. package/dist/chunk-7FKPJQVS.mjs.map +0 -1
  204. package/dist/chunk-C3A5HXHX.mjs.map +0 -1
  205. package/dist/chunk-DK2WNYQA.js.map +0 -1
  206. package/dist/chunk-DY4K6X3A.js.map +0 -1
  207. package/dist/chunk-ELDJDBQL.js.map +0 -1
  208. package/dist/chunk-EUNL6GAL.js.map +0 -1
  209. package/dist/chunk-FI2ME55T.mjs.map +0 -1
  210. package/dist/chunk-FMB2RZDH.mjs.map +0 -1
  211. package/dist/chunk-G6VGUAK2.js.map +0 -1
  212. package/dist/chunk-GJD4CFHN.js.map +0 -1
  213. package/dist/chunk-GVXZWXQ7.js +0 -814
  214. package/dist/chunk-GVXZWXQ7.js.map +0 -1
  215. package/dist/chunk-HF2FWDBJ.mjs +0 -968
  216. package/dist/chunk-HF2FWDBJ.mjs.map +0 -1
  217. package/dist/chunk-IFAW7JFO.js +0 -1429
  218. package/dist/chunk-IFAW7JFO.js.map +0 -1
  219. package/dist/chunk-IJ2LWZID.js.map +0 -1
  220. package/dist/chunk-IKIJEKU3.mjs +0 -1427
  221. package/dist/chunk-IKIJEKU3.mjs.map +0 -1
  222. package/dist/chunk-JFTGG6HK.mjs +0 -14848
  223. package/dist/chunk-JFTGG6HK.mjs.map +0 -1
  224. package/dist/chunk-JM3ZR6LB.js +0 -981
  225. package/dist/chunk-JM3ZR6LB.js.map +0 -1
  226. package/dist/chunk-KJN2C6YE.js.map +0 -1
  227. package/dist/chunk-M5FLRLHI.mjs.map +0 -1
  228. package/dist/chunk-MCGLYYAR.mjs +0 -341
  229. package/dist/chunk-MCGLYYAR.mjs.map +0 -1
  230. package/dist/chunk-MG23BS36.js.map +0 -1
  231. package/dist/chunk-N24BPFF6.mjs.map +0 -1
  232. package/dist/chunk-NRNK7LXK.mjs.map +0 -1
  233. package/dist/chunk-OE5DEMCV.js.map +0 -1
  234. package/dist/chunk-PTTDKFL7.js.map +0 -1
  235. package/dist/chunk-S7FRYNSU.mjs +0 -315
  236. package/dist/chunk-S7FRYNSU.mjs.map +0 -1
  237. package/dist/chunk-SLB5V4RT.js +0 -302
  238. package/dist/chunk-SLB5V4RT.js.map +0 -1
  239. package/dist/chunk-VZMDH3R4.mjs.map +0 -1
  240. package/dist/chunk-VZMRZQ2D.mjs.map +0 -1
  241. package/dist/chunk-WW7UM7XY.js.map +0 -1
  242. package/dist/chunk-X4J33XQD.js.map +0 -1
  243. package/dist/chunk-XFOL6JDF.mjs.map +0 -1
  244. package/dist/chunk-YBTYDBWY.js.map +0 -1
  245. package/dist/chunk-ZQO6FZZB.js +0 -343
  246. package/dist/chunk-ZQO6FZZB.js.map +0 -1
  247. package/dist/chunk-ZU6YPEAF.mjs.map +0 -1
  248. package/dist/generators-DOFWGRXS.js +0 -37
  249. package/dist/generators-DOFWGRXS.js.map +0 -1
  250. package/dist/generators-R62APO62.mjs +0 -4
  251. package/dist/generators-R62APO62.mjs.map +0 -1
  252. package/dist/migrator-3WQB3KQ2.mjs +0 -4
  253. package/dist/migrator-3WQB3KQ2.mjs.map +0 -1
  254. package/dist/migrator-HFVQYK5R.js +0 -37
  255. package/dist/migrator-HFVQYK5R.js.map +0 -1
  256. package/dist/scanner-AF7YUCFG.mjs +0 -4
  257. package/dist/scanner-AF7YUCFG.mjs.map +0 -1
  258. package/dist/scanner-DBD5K6F7.js +0 -53
  259. package/dist/scanner-DBD5K6F7.js.map +0 -1
  260. package/dist/setup/client.d.mts +0 -60
  261. package/dist/setup/client.d.ts +0 -60
  262. package/dist/setup/client.js +0 -31
  263. package/dist/setup/client.js.map +0 -1
  264. package/dist/setup/client.mjs +0 -6
  265. package/dist/setup/client.mjs.map +0 -1
  266. package/dist/setup/server.d.mts +0 -14
  267. package/dist/setup/server.d.ts +0 -14
  268. package/dist/setup/server.js +0 -13
  269. package/dist/setup/server.js.map +0 -1
  270. package/dist/setup/server.mjs +0 -4
  271. package/dist/setup/server.mjs.map +0 -1
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/SiteKitProvider.tsx","../src/affiliates/api.ts","../src/affiliates/useAffiliates.ts","../src/affiliates/AffiliatesWidget.tsx","../src/signal/SignalExperiment.tsx","../src/setup/SetupAssistant.tsx"],"names":["useEffect","getTrackingUrl","jsx","jsxs","Fragment","React","useState","onComplete"],"mappings":"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","file":"index.mjs","sourcesContent":["/**\n * @sonordev/site-kit - SiteKitProvider\n * \n * @deprecated SiteKitProvider forces all components to be client-side, breaking Next.js server components.\n * Use individual components/providers instead:\n * \n * - Server components (SEO, Images, Blog): Import directly, no provider needed\n * - Client components (Analytics, Engage): Use AnalyticsProvider, EngageWidget directly\n * \n * **Why deprecated:**\n * - Forces client-side rendering for all children (breaks server components)\n * - Uses React Context which doesn't work in server components\n * - Most Site-Kit components should be server components for better performance\n * \n * **Migration:**\n * ```tsx\n * // ❌ OLD (client-only):\n * <SiteKitProvider apiKey=\"...\" analytics={{ enabled: true }}>\n * <ManagedFavicon />\n * </SiteKitProvider>\n * \n * // ✅ NEW (server-first):\n * <ManagedFavicon /> // Already has env defaults, no provider needed\n * \n * // For Analytics (client component):\n * <AnalyticsProvider apiKey={process.env.SONOR_API_KEY}>\n * {children}\n * </AnalyticsProvider>\n * ```\n * \n * Legacy provider - use only for backwards compatibility.\n */\n\n'use client'\n\nimport React, { createContext, useContext, useMemo, useEffect, ReactNode, Suspense } from 'react'\nimport type { SiteKitConfig } from './types'\n\n// Module providers\nimport { AnalyticsProvider } from './analytics/AnalyticsProvider'\nimport { EngageWidget } from './engage/EngageWidget'\nimport { configureFormsApi } from './forms/formsApi'\nimport { SitemapSync } from './SitemapSync'\nimport { SignalBridge } from './signal/SignalBridge'\n\ninterface SignalConfig {\n enabled: boolean\n realtime?: boolean\n experiments?: boolean\n behaviorTracking?: boolean\n}\n\ninterface SiteKitContextValue extends SiteKitConfig {\n isReady: boolean\n signal?: SignalConfig\n signalUrl?: string\n}\n\nconst SiteKitContext = createContext<SiteKitContextValue | null>(null)\n\nexport function useSiteKit(): SiteKitContextValue {\n const context = useContext(SiteKitContext)\n if (!context) {\n throw new Error('useSiteKit must be used within a SiteKitProvider')\n }\n return context\n}\n\ninterface SiteKitProviderProps extends SiteKitConfig {\n children: ReactNode\n signalUrl?: string\n}\n\nexport function SiteKitProvider({\n children,\n apiKey,\n apiUrl,\n signalUrl,\n projectId,\n recaptchaSiteKey,\n analytics,\n engage,\n forms,\n signal,\n sitemapSync = true,\n debug = false,\n}: SiteKitProviderProps & { signal?: SignalConfig }) {\n // Production: hardcoded URLs. Dev: use env vars from .env.local if set.\n const isDev = typeof process !== 'undefined' && process.env?.NODE_ENV === 'development'\n const defaultApiUrl = isDev && (process.env?.SONOR_API_URL || process.env?.NEXT_PUBLIC_UPTRADE_API_URL)\n ? (process.env.SONOR_API_URL || process.env.NEXT_PUBLIC_UPTRADE_API_URL)\n : 'https://api.sonor.io'\n const defaultSignalUrl = isDev && (process.env?.SONOR_SIGNAL_URL || process.env?.NEXT_PUBLIC_SIGNAL_API_URL)\n ? (process.env.SONOR_SIGNAL_URL || process.env.NEXT_PUBLIC_SIGNAL_API_URL)\n : 'https://signal.sonor.io'\n const finalApiUrl = apiUrl || defaultApiUrl || 'https://api.sonor.io'\n const finalSignalUrl = signalUrl || defaultSignalUrl || 'https://signal.sonor.io'\n const finalRecaptchaSiteKey = recaptchaSiteKey ?? (typeof process !== 'undefined' ? process.env?.NEXT_PUBLIC_RECAPTCHA_SITE_KEY : undefined)\n \n // Validate API key\n if (!apiKey) {\n console.error('@sonordev/site-kit: No API key provided. Set SONOR_API_KEY (or NEXT_PUBLIC_UPTRADE_API_KEY) environment variable.')\n }\n \n // Set window globals synchronously so hooks (e.g. useAffiliates) see the key before their effects run\n if (typeof window !== 'undefined') {\n ;(window as any).__SITE_KIT_API_URL__ = finalApiUrl\n ;(window as any).__SITE_KIT_SIGNAL_URL__ = finalSignalUrl\n ;(window as any).__SITE_KIT_API_KEY__ = apiKey\n ;(window as any).__SITE_KIT_RECAPTCHA_SITE_KEY__ = finalRecaptchaSiteKey\n ;(window as any).__SITE_KIT_DEBUG__ = debug\n }\n \n useEffect(() => {\n if (apiKey && typeof window !== 'undefined') {\n configureFormsApi({\n baseUrl: finalApiUrl,\n apiKey,\n })\n }\n }, [finalApiUrl, apiKey])\n\n const contextValue = useMemo<SiteKitContextValue>(\n () => ({\n apiUrl: finalApiUrl,\n signalUrl: finalSignalUrl,\n apiKey,\n analytics,\n engage,\n forms,\n signal,\n debug,\n isReady: true,\n }),\n [finalApiUrl, finalSignalUrl, apiKey, analytics, engage, forms, signal, debug]\n )\n\n // Build the provider tree based on enabled modules\n let content = <>{children}</>\n\n // Wrap with SignalBridge if enabled (must be outermost for context access)\n if (signal?.enabled) {\n content = (\n <SignalBridge\n enabled={signal.enabled}\n realtime={signal.realtime !== false}\n experiments={signal.experiments !== false}\n behaviorTracking={signal.behaviorTracking !== false}\n >\n {content}\n </SignalBridge>\n )\n }\n\n // Wrap with Analytics if enabled\n if (analytics?.enabled) {\n content = (\n <Suspense fallback={null}>\n <AnalyticsProvider\n apiUrl={finalApiUrl}\n apiKey={apiKey}\n trackPageViews={analytics.trackPageViews !== false}\n trackWebVitals={analytics.trackWebVitals !== false}\n trackScrollDepth={analytics.trackScrollDepth !== false}\n trackClicks={analytics.trackClicks !== false}\n debug={debug}\n >\n {content}\n </AnalyticsProvider>\n </Suspense>\n )\n }\n\n // Add Engage widget if enabled (doesn't wrap, just renders alongside)\n if (engage?.enabled) {\n content = (\n <>\n {content}\n <EngageWidget \n apiUrl={finalApiUrl} \n apiKey={apiKey}\n projectId={projectId}\n position={engage.position || 'bottom-right'}\n chatEnabled={engage.chatEnabled !== false}\n />\n </>\n )\n }\n\n // Optional client sitemap sync — prefer build-time createSitemap() when available (App Router)\n if (sitemapSync) {\n content = (\n <>\n {content}\n <SitemapSync debug={debug} />\n </>\n )\n }\n\n return (\n <SiteKitContext.Provider value={contextValue}>\n {content}\n </SiteKitContext.Provider>\n )\n}\n\n/**\n * Hook to check if a specific module is enabled\n */\nexport function useModuleEnabled(module: 'analytics' | 'engage' | 'forms' | 'seo'): boolean {\n const context = useSiteKit()\n \n switch (module) {\n case 'analytics':\n return context.analytics?.enabled ?? false\n case 'engage':\n return context.engage?.enabled ?? false\n case 'forms':\n return context.forms?.enabled ?? false\n case 'seo':\n return true // SEO is always enabled via RSC components\n default:\n return false\n }\n}\n","/**\n * @sonordev/site-kit/affiliates - Affiliates API\n * \n * API functions for fetching affiliate data for client sites.\n * All data goes through Portal API with API key auth - never Supabase directly.\n */\n\nimport type { Affiliate, AffiliateWithOffers, FetchAffiliatesOptions } from './types'\n\n// ============================================\n// API Config Helpers\n// ============================================\n\nfunction getApiConfig() {\n const apiUrl = typeof window !== 'undefined' \n ? (window as any).__SITE_KIT_API_URL__ || 'https://api.sonor.io'\n : 'https://api.sonor.io'\n const apiKey = typeof window !== 'undefined' \n ? (window as any).__SITE_KIT_API_KEY__ || ''\n : ''\n return { apiUrl, apiKey }\n}\n\nasync function apiGet<T>(endpoint: string): Promise<T | null> {\n const { apiUrl, apiKey } = getApiConfig()\n \n if (!apiKey) {\n console.error('[Affiliates] No API key configured')\n return null\n }\n \n try {\n const response = await fetch(`${apiUrl}${endpoint}`, {\n method: 'GET',\n headers: {\n 'x-api-key': apiKey,\n },\n })\n \n if (!response.ok) {\n console.error(`[Affiliates] API error: ${response.statusText}`)\n return null\n }\n \n return await response.json()\n } catch (error) {\n console.error('[Affiliates] Network error:', error)\n return null\n }\n}\n\n// ============================================\n// Fetch Affiliates\n// ============================================\n\n/**\n * Fetch all active affiliates for the project\n * \n * @example\n * ```ts\n * const affiliates = await fetchAffiliates()\n * ```\n */\nexport async function fetchAffiliates(\n options: FetchAffiliatesOptions = {}\n): Promise<AffiliateWithOffers[]> {\n const result = await apiGet<{ affiliates: AffiliateWithOffers[] }>(\n '/api/public/affiliates'\n )\n \n return result?.affiliates || []\n}\n\n/**\n * Build a tracking URL for an affiliate offer\n * When clicked, this redirects through our tracking endpoint and then to the destination\n * \n * @example\n * ```ts\n * const trackingUrl = getTrackingUrl(affiliate.id, offer.id)\n * // Returns: https://api.sonor.io/a/{affiliateId}/{offerId}\n * ```\n */\nexport function getTrackingUrl(affiliateId: string, offerId: string): string {\n const { apiUrl } = getApiConfig()\n return `${apiUrl}/a/${affiliateId}/${offerId}`\n}\n","/**\n * @sonordev/site-kit/affiliates - useAffiliates Hook\n * \n * React hook for fetching and displaying affiliates on client sites.\n */\n\n'use client'\n\nimport { useState, useEffect } from 'react'\nimport type { AffiliateWithOffers } from './types'\nimport { fetchAffiliates, getTrackingUrl } from './api'\n\nexport interface UseAffiliatesResult {\n affiliates: AffiliateWithOffers[]\n isLoading: boolean\n error: string | null\n getTrackingUrl: (affiliateId: string, offerId: string) => string\n}\n\n/**\n * Hook to fetch affiliates for display on client sites\n * \n * @example\n * ```tsx\n * function AffiliatesSection() {\n * const { affiliates, isLoading } = useAffiliates()\n * \n * if (isLoading) return <div>Loading...</div>\n * \n * return (\n * <div className=\"grid grid-cols-3 gap-4\">\n * {affiliates.map(affiliate => (\n * <AffiliateCard key={affiliate.id} affiliate={affiliate} />\n * ))}\n * </div>\n * )\n * }\n * ```\n */\nexport function useAffiliates(): UseAffiliatesResult {\n const [affiliates, setAffiliates] = useState<AffiliateWithOffers[]>([])\n const [isLoading, setIsLoading] = useState(true)\n const [error, setError] = useState<string | null>(null)\n\n useEffect(() => {\n async function load() {\n try {\n setIsLoading(true)\n setError(null)\n const data = await fetchAffiliates()\n setAffiliates(data)\n } catch (err) {\n setError(err instanceof Error ? err.message : 'Failed to load affiliates')\n } finally {\n setIsLoading(false)\n }\n }\n \n load()\n }, [])\n\n return {\n affiliates,\n isLoading,\n error,\n getTrackingUrl,\n }\n}\n","/**\n * @sonordev/site-kit/affiliates - AffiliatesWidget Component\n * \n * Unstyled, headless component for displaying affiliates.\n * Client sites can wrap this or use it directly with their own styling.\n */\n\n'use client'\n\nimport React from 'react'\nimport { useAffiliates } from './useAffiliates'\nimport type { AffiliateWithOffers, AffiliateOffer } from './types'\n\n// ============================================\n// Affiliate Card (Unstyled)\n// ============================================\n\nexport interface AffiliateCardProps {\n affiliate: AffiliateWithOffers\n className?: string\n /** Optional custom render for the logo */\n renderLogo?: (affiliate: AffiliateWithOffers) => React.ReactNode\n /** Show offers as links below the card */\n showOffers?: boolean\n}\n\n/**\n * Single affiliate card - unstyled, bring your own CSS\n * \n * @example\n * ```tsx\n * <AffiliateCard \n * affiliate={affiliate}\n * className=\"p-4 bg-white rounded-lg shadow\"\n * showOffers\n * />\n * ```\n */\nexport function AffiliateCard({\n affiliate,\n className = '',\n renderLogo,\n showOffers = false,\n}: AffiliateCardProps) {\n const { getTrackingUrl } = useAffiliates()\n \n const defaultLogo = (\n <div data-affiliate-logo className=\"affiliate-logo\">\n {affiliate.logo_url ? (\n <img \n src={affiliate.logo_url} \n alt={affiliate.name}\n loading=\"lazy\"\n />\n ) : (\n <span>{affiliate.name.charAt(0)}</span>\n )}\n </div>\n )\n\n return (\n <div className={className} data-affiliate-card data-affiliate-id={affiliate.id}>\n {/* Logo */}\n {renderLogo ? renderLogo(affiliate) : defaultLogo}\n \n {/* Name */}\n <div data-affiliate-name className=\"affiliate-name\">\n {affiliate.name}\n </div>\n \n {/* Website link */}\n {affiliate.website_url && (\n <a \n href={affiliate.website_url}\n target=\"_blank\"\n rel=\"noopener noreferrer sponsored\"\n data-affiliate-website\n className=\"affiliate-website\"\n >\n Visit Website\n </a>\n )}\n \n {/* Offers */}\n {showOffers && affiliate.offers && affiliate.offers.length > 0 && (\n <div data-affiliate-offers className=\"affiliate-offers\">\n {affiliate.offers.map(offer => (\n <a\n key={offer.id}\n href={getTrackingUrl(affiliate.id, offer.id)}\n target=\"_blank\"\n rel=\"noopener noreferrer sponsored\"\n data-affiliate-offer\n data-offer-id={offer.id}\n className=\"affiliate-offer\"\n >\n {offer.name}\n </a>\n ))}\n </div>\n )}\n </div>\n )\n}\n\n// ============================================\n// Affiliates Grid (Unstyled)\n// ============================================\n\nexport interface AffiliatesWidgetProps {\n className?: string\n /** Custom loading component */\n loadingComponent?: React.ReactNode\n /** Custom empty state component */\n emptyComponent?: React.ReactNode\n /** Custom error component */\n errorComponent?: React.ReactNode\n /** Show offers on each card */\n showOffers?: boolean\n /** Custom render function for each affiliate */\n renderAffiliate?: (affiliate: AffiliateWithOffers) => React.ReactNode\n /** Maximum number to display */\n limit?: number\n}\n\n/**\n * Display a grid of affiliates - unstyled, bring your own CSS\n * \n * @example\n * ```tsx\n * // Basic usage\n * <AffiliatesWidget className=\"grid grid-cols-3 gap-4\" />\n * \n * // With custom rendering\n * <AffiliatesWidget\n * renderAffiliate={(affiliate) => (\n * <MyCustomCard key={affiliate.id} data={affiliate} />\n * )}\n * />\n * ```\n */\nexport function AffiliatesWidget({\n className = '',\n loadingComponent,\n emptyComponent,\n errorComponent,\n showOffers = false,\n renderAffiliate,\n limit,\n}: AffiliatesWidgetProps) {\n const { affiliates, isLoading, error, getTrackingUrl } = useAffiliates()\n \n if (isLoading) {\n return loadingComponent || <div data-affiliates-loading>Loading affiliates...</div>\n }\n \n if (error) {\n return errorComponent || <div data-affiliates-error>{error}</div>\n }\n \n const displayAffiliates = limit ? affiliates.slice(0, limit) : affiliates\n \n if (displayAffiliates.length === 0) {\n return emptyComponent || null\n }\n \n return (\n <div className={className} data-affiliates-widget>\n {displayAffiliates.map(affiliate => \n renderAffiliate \n ? renderAffiliate(affiliate)\n : <AffiliateCard \n key={affiliate.id} \n affiliate={affiliate} \n showOffers={showOffers}\n />\n )}\n </div>\n )\n}\n","/**\n * @sonordev/site-kit/signal - SignalExperiment\n * \n * A/B test component that renders different variants based on Signal assignment.\n * Uses Thompson Sampling (Bayesian bandit) for optimization.\n */\n\n'use client'\n\nimport React, { useMemo, useEffect } from 'react'\nimport { useSignalExperiment, useSignalEvent } from './SignalBridge'\n\ninterface SignalExperimentProps {\n /** Unique experiment ID */\n experimentId: string\n \n /** Variants to test - keys are variant names, values are React nodes */\n variants: Record<string, React.ReactNode>\n \n /** Fallback content if no assignment (defaults to 'control' variant) */\n fallback?: React.ReactNode\n \n /** Track impression automatically */\n trackImpression?: boolean\n \n /** Children function for more control */\n children?: (props: { variant: string; isControl: boolean }) => React.ReactNode\n}\n\n/**\n * Renders different content variants based on Signal's A/B assignment.\n * \n * @example\n * // Simple variant switching\n * <SignalExperiment experimentId=\"hero-cta\" variants={{\n * control: <Button>Get Started</Button>,\n * variant_a: <Button variant=\"primary\">Start Free Trial</Button>,\n * variant_b: <Button variant=\"secondary\">Book a Demo</Button>,\n * }} />\n * \n * @example\n * // With render prop for more control\n * <SignalExperiment experimentId=\"pricing-layout\">\n * {({ variant, isControl }) => (\n * <PricingSection layout={isControl ? 'cards' : 'table'} />\n * )}\n * </SignalExperiment>\n */\nexport function SignalExperiment({\n experimentId,\n variants,\n fallback,\n trackImpression = true,\n children,\n}: SignalExperimentProps) {\n const { assignment, variant, isControl } = useSignalExperiment(experimentId)\n const trackEvent = useSignalEvent()\n \n // Track impression when variant is rendered\n useEffect(() => {\n if (trackImpression && variant) {\n trackEvent({\n event_type: 'experiment',\n event_name: 'impression',\n event_data: {\n experiment_id: experimentId,\n variant_key: variant,\n },\n })\n }\n }, [experimentId, variant, trackImpression, trackEvent])\n \n // If using render prop\n if (children) {\n return <>{children({ variant: variant || 'control', isControl })}</>\n }\n \n // Determine what to render\n const selectedVariant = variant || 'control'\n const content = variants[selectedVariant]\n \n if (content !== undefined) {\n return <>{content}</>\n }\n \n // Fallback to provided fallback or control\n if (fallback) {\n return <>{fallback}</>\n }\n \n return <>{variants.control || null}</>\n}\n\n/**\n * Hook for conditional experiment logic\n * \n * @example\n * const { variant, isControl } = useExperimentVariant('pricing-test')\n * \n * return isControl \n * ? <OldPricing />\n * : <NewPricing showAnnual={variant === 'annual_first'} />\n */\nexport function useExperimentVariant(experimentId: string) {\n return useSignalExperiment(experimentId)\n}\n\n/**\n * Component for tracking experiment conversions\n * Wraps interactive elements to track when they convert\n * \n * @example\n * <SignalExperiment experimentId=\"signup-button\" variants={{\n * control: (\n * <ExperimentConversion experimentId=\"signup-button\" outcomeType=\"click\">\n * <Button>Sign Up</Button>\n * </ExperimentConversion>\n * ),\n * variant_a: (\n * <ExperimentConversion experimentId=\"signup-button\" outcomeType=\"click\">\n * <Button variant=\"large\">Join Now - It's Free!</Button>\n * </ExperimentConversion>\n * ),\n * }} />\n */\nexport function ExperimentConversion({\n experimentId,\n outcomeType = 'click',\n value,\n children,\n}: {\n experimentId: string\n outcomeType?: string\n value?: number\n children: React.ReactElement\n}) {\n const trackEvent = useSignalEvent()\n const { variant } = useSignalExperiment(experimentId)\n \n const handleInteraction = () => {\n trackEvent({\n event_type: 'experiment',\n event_name: 'conversion',\n event_data: {\n experiment_id: experimentId,\n variant_key: variant,\n outcome_type: outcomeType,\n value,\n },\n })\n }\n \n return React.cloneElement(children, {\n onClick: (e: React.MouseEvent) => {\n handleInteraction()\n // Call original onClick if exists\n if (children.props.onClick) {\n children.props.onClick(e)\n }\n },\n })\n}\n","/**\n * @sonordev/site-kit/setup - Conversational Setup Assistant\n * \n * AI-powered conversational interface for setting up site-kit.\n * Uses Echo/Signal to guide users through configuration.\n * \n * Features:\n * - Streaming AI responses for real-time feedback\n * - Brand extraction from existing websites\n * - Module recommendations based on business type\n * - Integration verification\n * - Copilot instructions generation\n */\n\n'use client'\n\nimport React, { useState, useRef, useEffect, useCallback } from 'react'\n\n// ============================================\n// Types\n// ============================================\n\ninterface Message {\n id: string\n role: 'assistant' | 'user' | 'system'\n content: string\n timestamp: Date\n actions?: ActionButton[]\n component?: React.ReactNode\n isStreaming?: boolean\n}\n\ninterface ActionButton {\n id: string\n label: string\n action: string\n variant?: 'primary' | 'secondary' | 'outline'\n data?: Record<string, unknown>\n}\n\ninterface SetupContext {\n flow: 'new' | 'existing' | 'rebuild' | null\n step: string\n project_id?: string\n org_id?: string\n domain?: string\n business_type?: string\n scan_results?: ScanResults\n scrape_results?: ScrapeResults\n selected_modules?: string[]\n brand?: BrandInfo\n}\n\ninterface ScanResults {\n forms: { file: string; form_library: string; fields: number }[]\n widgets: { file: string; widget_type: string }[]\n metadata: { file: string; type: string }[]\n sitemaps: { file: string; type: string }[]\n}\n\ninterface ScrapeResults {\n scrape_id: string\n domain: string\n pages_found: number\n faqs_imported: number\n routes: { path: string; title: string }[]\n brand?: BrandInfo\n}\n\ninterface BrandInfo {\n business_name: string\n tagline?: string\n primary_color?: string\n secondary_color?: string\n logo_url?: string\n phone_numbers?: string[]\n email_addresses?: string[]\n social_profiles?: Record<string, string>\n}\n\ninterface SetupState {\n step: 'welcome' | 'auth' | 'project' | 'modules' | 'config' | 'verify' | 'complete'\n isAuthenticated: boolean\n userEmail?: string\n accessToken?: string\n selectedOrg?: { id: string; name: string }\n selectedProject?: { id: string; name: string; domain: string }\n selectedModules: string[]\n config: Record<string, unknown>\n errors: string[]\n context: SetupContext\n}\n\ninterface SetupAssistantProps {\n /** Sonor API URL */\n apiUrl?: string\n \n /** Signal API URL for AI chat */\n signalUrl?: string\n \n /** Supabase URL for auth */\n supabaseUrl?: string\n \n /** Supabase anon key */\n supabaseKey?: string\n \n /** Pre-selected project ID (if coming from Sonor) */\n projectId?: string\n \n /** Pre-selected org ID (if coming from Sonor) */\n orgId?: string\n \n /** Auth token (if already authenticated) */\n authToken?: string\n \n /** Callback when setup is complete */\n onComplete?: (config: SetupState) => void\n \n /** Custom welcome message */\n welcomeMessage?: string\n}\n\n// ============================================\n// Styles (inline for portability)\n// ============================================\n\nconst styles = {\n container: {\n display: 'flex',\n flexDirection: 'column' as const,\n height: '100vh',\n maxWidth: '800px',\n margin: '0 auto',\n padding: '1rem',\n fontFamily: 'system-ui, -apple-system, sans-serif',\n },\n header: {\n display: 'flex',\n alignItems: 'center',\n gap: '0.75rem',\n padding: '1rem 0',\n borderBottom: '1px solid #e5e7eb',\n },\n logo: {\n width: '32px',\n height: '32px',\n borderRadius: '8px',\n background: 'linear-gradient(135deg, #3b82f6, #8b5cf6)',\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n color: 'white',\n fontWeight: 'bold',\n },\n title: {\n fontSize: '1.25rem',\n fontWeight: '600',\n color: '#111827',\n },\n subtitle: {\n fontSize: '0.875rem',\n color: '#6b7280',\n },\n messages: {\n flex: 1,\n overflowY: 'auto' as const,\n padding: '1rem 0',\n display: 'flex',\n flexDirection: 'column' as const,\n gap: '1rem',\n },\n message: {\n display: 'flex',\n gap: '0.75rem',\n maxWidth: '85%',\n },\n messageAssistant: {\n alignSelf: 'flex-start',\n },\n messageUser: {\n alignSelf: 'flex-end',\n flexDirection: 'row-reverse' as const,\n },\n avatar: {\n width: '32px',\n height: '32px',\n borderRadius: '50%',\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n fontSize: '0.875rem',\n flexShrink: 0,\n },\n avatarAssistant: {\n background: 'linear-gradient(135deg, #3b82f6, #8b5cf6)',\n color: 'white',\n },\n avatarUser: {\n background: '#e5e7eb',\n color: '#374151',\n },\n bubble: {\n padding: '0.75rem 1rem',\n borderRadius: '1rem',\n fontSize: '0.9375rem',\n lineHeight: '1.5',\n },\n bubbleAssistant: {\n background: '#f3f4f6',\n color: '#111827',\n borderTopLeftRadius: '4px',\n },\n bubbleUser: {\n background: '#3b82f6',\n color: 'white',\n borderTopRightRadius: '4px',\n },\n actions: {\n display: 'flex',\n flexWrap: 'wrap' as const,\n gap: '0.5rem',\n marginTop: '0.75rem',\n },\n actionButton: {\n padding: '0.5rem 1rem',\n borderRadius: '0.5rem',\n fontSize: '0.875rem',\n fontWeight: '500',\n cursor: 'pointer',\n border: 'none',\n transition: 'all 0.15s',\n },\n actionPrimary: {\n background: '#3b82f6',\n color: 'white',\n },\n actionSecondary: {\n background: '#e5e7eb',\n color: '#374151',\n },\n actionOutline: {\n background: 'transparent',\n color: '#3b82f6',\n border: '1px solid #3b82f6',\n },\n inputContainer: {\n display: 'flex',\n gap: '0.5rem',\n padding: '1rem 0',\n borderTop: '1px solid #e5e7eb',\n },\n input: {\n flex: 1,\n padding: '0.75rem 1rem',\n borderRadius: '0.75rem',\n border: '1px solid #d1d5db',\n fontSize: '0.9375rem',\n outline: 'none',\n },\n sendButton: {\n padding: '0.75rem 1.5rem',\n borderRadius: '0.75rem',\n background: '#3b82f6',\n color: 'white',\n border: 'none',\n fontWeight: '500',\n cursor: 'pointer',\n },\n typing: {\n display: 'flex',\n gap: '4px',\n padding: '0.75rem 1rem',\n background: '#f3f4f6',\n borderRadius: '1rem',\n width: 'fit-content',\n },\n typingDot: {\n width: '8px',\n height: '8px',\n borderRadius: '50%',\n background: '#9ca3af',\n animation: 'typing 1.4s infinite',\n },\n moduleCard: {\n display: 'flex',\n alignItems: 'center',\n gap: '0.75rem',\n padding: '0.75rem',\n background: 'white',\n border: '1px solid #e5e7eb',\n borderRadius: '0.5rem',\n cursor: 'pointer',\n transition: 'all 0.15s',\n },\n moduleCardSelected: {\n borderColor: '#3b82f6',\n background: '#eff6ff',\n },\n moduleIcon: {\n fontSize: '1.5rem',\n },\n moduleInfo: {\n flex: 1,\n },\n moduleName: {\n fontWeight: '500',\n color: '#111827',\n },\n moduleDesc: {\n fontSize: '0.75rem',\n color: '#6b7280',\n },\n checkbox: {\n width: '20px',\n height: '20px',\n accentColor: '#3b82f6',\n },\n}\n\n// ============================================\n// Available Modules\n// ============================================\n\nconst MODULES = [\n { id: 'analytics', name: 'Analytics', icon: '📊', description: 'Page views, events, sessions, web vitals', recommended: true },\n { id: 'seo', name: 'SEO', icon: '🔍', description: 'Managed FAQs, meta tags, schema markup', recommended: true },\n { id: 'forms', name: 'Forms', icon: '📝', description: 'Sonor-managed forms with submissions', recommended: true },\n { id: 'engage', name: 'Engage', icon: '💬', description: 'Live chat, popups, nudges, banners', recommended: false },\n { id: 'commerce', name: 'Commerce', icon: '🛒', description: 'Products, services, checkout', recommended: false },\n { id: 'signal', name: 'Signal AI', icon: '🤖', description: 'Autonomous optimization & A/B testing', recommended: false },\n]\n\n// ============================================\n// Setup Assistant Component\n// ============================================\n\nexport function SetupAssistant({\n apiUrl = 'https://api.sonor.io',\n signalUrl = 'https://signal.sonor.io',\n supabaseUrl,\n supabaseKey,\n projectId,\n orgId,\n authToken,\n onComplete,\n welcomeMessage,\n}: SetupAssistantProps) {\n const [messages, setMessages] = useState<Message[]>([])\n const [input, setInput] = useState('')\n const [isTyping, setIsTyping] = useState(false)\n const [isExtracting, setIsExtracting] = useState(false)\n const [state, setState] = useState<SetupState>({\n step: 'welcome',\n isAuthenticated: !!authToken,\n selectedModules: ['analytics', 'seo', 'forms'],\n config: {},\n errors: [],\n context: {\n flow: null,\n step: 'welcome',\n project_id: projectId,\n org_id: orgId,\n },\n })\n \n const messagesEndRef = useRef<HTMLDivElement>(null)\n const inputRef = useRef<HTMLInputElement>(null)\n const streamingMessageRef = useRef<string | null>(null)\n \n // ============================================\n // Signal API Integration with Streaming\n // ============================================\n \n const sendToSignalStreaming = useCallback(async (\n message: string, \n context: SetupContext,\n onToken: (token: string) => void,\n onComplete: (result: { actions?: ActionButton[]; updated_context?: Partial<SetupContext> }) => void\n ): Promise<void> => {\n try {\n const response = await fetch(`${signalUrl}/api/skills/setup/chat/stream`, {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n ...(authToken ? { Authorization: `Bearer ${authToken}` } : {}),\n },\n body: JSON.stringify({\n message,\n context,\n project_id: projectId,\n org_id: orgId,\n }),\n })\n \n if (!response.ok) {\n throw new Error('Signal API error')\n }\n \n const reader = response.body?.getReader()\n if (!reader) throw new Error('No response body')\n \n const decoder = new TextDecoder()\n let buffer = ''\n let actions: ActionButton[] = []\n let updatedContext: Partial<SetupContext> = {}\n \n while (true) {\n const { done, value } = await reader.read()\n if (done) break\n \n buffer += decoder.decode(value, { stream: true })\n \n // Process SSE events\n const lines = buffer.split('\\n')\n buffer = lines.pop() || ''\n \n for (const line of lines) {\n if (line.startsWith('data: ')) {\n const data = line.slice(6)\n if (data === '[DONE]') continue\n \n try {\n const event = JSON.parse(data)\n \n if (event.type === 'token') {\n onToken(event.content)\n } else if (event.type === 'actions') {\n actions = event.actions\n } else if (event.type === 'context') {\n updatedContext = event.context\n }\n } catch {\n // Non-JSON data, treat as token\n onToken(data)\n }\n }\n }\n }\n \n onComplete({ actions, updated_context: updatedContext })\n } catch (error) {\n console.error('Signal streaming error:', error)\n // Fallback to non-streaming\n const result = await sendToSignal(message, context)\n onToken(result.response)\n onComplete({ actions: result.actions, updated_context: result.updated_context })\n }\n }, [signalUrl, authToken, projectId, orgId])\n \n const sendToSignal = useCallback(async (message: string, context: SetupContext): Promise<{\n response: string\n actions?: ActionButton[]\n updated_context?: Partial<SetupContext>\n }> => {\n try {\n const response = await fetch(`${signalUrl}/api/skills/setup/chat`, {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n ...(authToken ? { Authorization: `Bearer ${authToken}` } : {}),\n },\n body: JSON.stringify({\n message,\n context,\n project_id: projectId,\n org_id: orgId,\n }),\n })\n \n if (!response.ok) {\n throw new Error('Signal API error')\n }\n \n return await response.json()\n } catch (error) {\n console.error('Signal API error:', error)\n // Fallback to local handling\n return {\n response: 'I had trouble connecting to Signal. Let me help you locally.',\n actions: [\n { id: '1', label: 'Continue', action: 'continue_local', variant: 'primary' },\n ],\n }\n }\n }, [signalUrl, authToken, projectId, orgId])\n \n // ============================================\n // Brand Extraction\n // ============================================\n \n const extractBrandFromDomain = useCallback(async (domain: string): Promise<BrandInfo | null> => {\n setIsExtracting(true)\n try {\n const response = await fetch(`${apiUrl}/site-scrape/brand-only`, {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n ...(authToken ? { Authorization: `Bearer ${authToken}` } : {}),\n },\n body: JSON.stringify({ domain }),\n })\n \n if (!response.ok) {\n throw new Error('Brand extraction failed')\n }\n \n const data = await response.json()\n return {\n business_name: data.business_name,\n tagline: data.tagline,\n primary_color: data.primary_color,\n secondary_color: data.secondary_color,\n logo_url: data.logo_url,\n phone_numbers: data.phone_numbers,\n email_addresses: data.email_addresses,\n social_profiles: data.social_profiles,\n }\n } catch (error) {\n console.error('Brand extraction error:', error)\n return null\n } finally {\n setIsExtracting(false)\n }\n }, [apiUrl, authToken])\n\n // ============================================\n // Message Helpers\n // ============================================\n \n const addMessage = useCallback((message: Omit<Message, 'id' | 'timestamp'>) => {\n const newMessage: Message = {\n ...message,\n id: crypto.randomUUID(),\n timestamp: new Date(),\n }\n setMessages(prev => [...prev, newMessage])\n return newMessage\n }, [])\n \n const updateMessage = useCallback((id: string, update: Partial<Message>) => {\n setMessages(prev => prev.map(m => \n m.id === id ? { ...m, ...update } : m\n ))\n }, [])\n \n const addStreamingMessage = useCallback(() => {\n const id = crypto.randomUUID()\n const newMessage: Message = {\n id,\n role: 'assistant',\n content: '',\n timestamp: new Date(),\n isStreaming: true,\n }\n setMessages(prev => [...prev, newMessage])\n streamingMessageRef.current = id\n return id\n }, [])\n \n const appendToStreamingMessage = useCallback((token: string) => {\n const id = streamingMessageRef.current\n if (!id) return\n \n setMessages(prev => prev.map(m => \n m.id === id ? { ...m, content: m.content + token } : m\n ))\n }, [])\n \n const finalizeStreamingMessage = useCallback((actions?: ActionButton[]) => {\n const id = streamingMessageRef.current\n if (!id) return\n \n setMessages(prev => prev.map(m => \n m.id === id ? { ...m, isStreaming: false, actions } : m\n ))\n streamingMessageRef.current = null\n }, [])\n \n const addAssistantMessage = useCallback((\n content: string, \n actions?: ActionButton[],\n component?: React.ReactNode\n ) => {\n setIsTyping(true)\n // Simulate typing delay\n setTimeout(() => {\n setIsTyping(false)\n addMessage({ role: 'assistant', content, actions, component })\n }, 500 + Math.random() * 500)\n }, [addMessage])\n \n const scrollToBottom = useCallback(() => {\n messagesEndRef.current?.scrollIntoView({ behavior: 'smooth' })\n }, [])\n \n useEffect(() => {\n scrollToBottom()\n }, [messages, isTyping, scrollToBottom])\n\n // ============================================\n // Welcome Flow\n // ============================================\n \n useEffect(() => {\n // Initial welcome message with flow selection\n const welcome = welcomeMessage || \n `Hey! 👋 I'm Signal, your AI setup assistant.\\n\\nI'll help you integrate Sonor Site-Kit into your project. What are we working with today?`\n \n setTimeout(() => {\n addAssistantMessage(welcome, [\n { id: '1', label: '🆕 New Site', action: 'set_flow_new', variant: 'primary' },\n { id: '2', label: '📁 Existing Project', action: 'set_flow_existing', variant: 'secondary' },\n { id: '3', label: '🔄 Rebuild from Live Site', action: 'set_flow_rebuild', variant: 'outline' },\n ])\n }, 500)\n }, [])\n\n // ============================================\n // Action Handlers\n // ============================================\n \n const handleAction = useCallback(async (action: string, data?: Record<string, unknown>) => {\n switch (action) {\n case 'start':\n addMessage({ role: 'user', content: \"Let's do it!\" })\n setState(prev => ({ ...prev, step: 'auth' }))\n addAssistantMessage(\n `Great! First, let's connect to your Sonor account.\\n\\nYou can sign in with your existing Sonor credentials:`,\n [\n { id: '1', label: 'Sign in with Email', action: 'auth_email', variant: 'primary' },\n { id: '2', label: 'Sign in with Google', action: 'auth_google', variant: 'secondary' },\n { id: '3', label: \"I don't have an account\", action: 'auth_signup', variant: 'outline' },\n ]\n )\n break\n \n case 'explain':\n addMessage({ role: 'user', content: 'Tell me more first' })\n addAssistantMessage(\n `Sonor Site-Kit is a lightweight package that connects your site to Sonor.\\n\\n` +\n `Here's what you can enable:\\n\\n` +\n `📊 **Analytics** - Track page views, events, and Core Web Vitals\\n` +\n `🔍 **SEO** - Managed meta tags, FAQs, and schema markup\\n` +\n `📝 **Forms** - Sonor-managed forms with spam protection\\n` +\n `💬 **Engage** - Live chat, popups, and nudges\\n` +\n `🛒 **Commerce** - Products, services, and checkout\\n` +\n `🤖 **Signal AI** - Autonomous optimization and A/B testing\\n\\n` +\n `You only pay for what you use, and everything is managed from your Sonor dashboard.`,\n [\n { id: '1', label: \"Sounds good, let's set it up\", action: 'start', variant: 'primary' },\n ]\n )\n break\n \n case 'auth_email':\n addMessage({ role: 'user', content: 'Sign in with Email' })\n addAssistantMessage(\n `What's your Sonor email address?`\n )\n setState(prev => ({ ...prev, step: 'auth' }))\n // Focus input for email entry\n setTimeout(() => inputRef.current?.focus(), 600)\n break\n \n case 'auth_google':\n addMessage({ role: 'user', content: 'Sign in with Google' })\n addAssistantMessage(\n `Opening Google sign-in... (In a real implementation, this would trigger OAuth)`\n )\n // Simulate successful auth\n setTimeout(() => {\n setState(prev => ({ \n ...prev, \n step: 'project',\n isAuthenticated: true,\n userEmail: 'user@example.com',\n }))\n handleAuthSuccess('user@example.com')\n }, 1500)\n break\n \n case 'select_project':\n addMessage({ role: 'user', content: `Selected: ${(data as any)?.name}` })\n setState(prev => ({ \n ...prev, \n step: 'modules',\n selectedProject: data as any,\n }))\n showModuleSelection()\n break\n \n case 'confirm_modules':\n addMessage({ role: 'user', content: `Selected ${state.selectedModules.length} modules` })\n setState(prev => ({ ...prev, step: 'config' }))\n showConfigGeneration()\n break\n \n case 'copy_code':\n addMessage({ role: 'user', content: 'Copy integration code' })\n // Copy to clipboard (would be implemented)\n addAssistantMessage(\n `✅ Code copied to clipboard!\\n\\nPaste this in your root layout file (e.g., \\`app/layout.tsx\\` or \\`pages/_app.tsx\\`).\\n\\nWant me to help you verify the integration?`,\n [\n { id: '1', label: 'Yes, verify my setup', action: 'verify', variant: 'primary' },\n { id: '2', label: \"I'm all set, thanks!\", action: 'complete', variant: 'outline' },\n ]\n )\n break\n \n case 'verify':\n addMessage({ role: 'user', content: 'Verify my setup' })\n setState(prev => ({ ...prev, step: 'verify' }))\n addAssistantMessage(\n `To verify your setup, start your dev server and visit any page.\\n\\n` +\n `I'll check for:\\n` +\n `• ✓ SiteKitProvider is loading\\n` +\n `• ✓ API key is valid\\n` +\n `• ✓ Analytics events are sending\\n` +\n `• ✓ Modules are initializing\\n\\n` +\n `Run \\`npm run dev\\` and let me know when you're ready:`,\n [\n { id: '1', label: 'My dev server is running', action: 'check_connection', variant: 'primary' },\n ]\n )\n break\n \n case 'check_connection':\n addMessage({ role: 'user', content: 'My dev server is running' })\n setIsTyping(true)\n // Simulate verification check\n setTimeout(() => {\n setIsTyping(false)\n addAssistantMessage(\n `🎉 **Everything looks great!**\\n\\n` +\n `I detected your site at \\`localhost:3000\\` and verified:\\n\\n` +\n `✅ SiteKitProvider initialized\\n` +\n `✅ API key authenticated\\n` +\n `✅ Analytics tracking active\\n` +\n `✅ SEO components ready\\n\\n` +\n `You're all set! Your data will start appearing in your Sonor dashboard within a few minutes.`,\n [\n { id: '1', label: 'Open Sonor Dashboard', action: 'open_dashboard', variant: 'primary' },\n { id: '2', label: 'Enable Signal AI', action: 'enable_signal', variant: 'secondary' },\n ]\n )\n setState(prev => ({ ...prev, step: 'complete' }))\n }, 2000)\n break\n \n case 'complete':\n addMessage({ role: 'user', content: \"I'm all set, thanks!\" })\n addAssistantMessage(\n `Awesome! 🚀\\n\\n` +\n `Your site-kit integration is ready. Here's what happens next:\\n\\n` +\n `• Analytics data will appear in Sonor within ~5 minutes\\n` +\n `• You can manage SEO, forms, and engage from the dashboard\\n` +\n `• If you enabled Signal, it'll start learning from your traffic\\n\\n` +\n `Need help anytime? Just come back to \\`/_uptrade/setup\\` or ping us in Sonor.\\n\\n` +\n `Happy building! 🎨`\n )\n onComplete?.(state)\n break\n \n case 'enable_signal':\n addMessage({ role: 'user', content: 'Enable Signal AI' })\n addAssistantMessage(\n `Great choice! 🤖\\n\\n` +\n `Signal AI will:\\n` +\n `• Monitor your site for SEO issues\\n` +\n `• Run A/B tests on CTAs and content\\n` +\n `• Optimize popups and engagement timing\\n` +\n `• Learn from user behavior to improve conversions\\n\\n` +\n `To enable Signal, add \\`signal={{ enabled: true }}\\` to your SiteKitProvider:\\n\\n` +\n `\\`\\`\\`tsx\\n` +\n `<SiteKitProvider\\n` +\n ` apiKey={process.env.SONOR_API_KEY!}\\n` +\n ` analytics={{ enabled: true }}\\n` +\n ` signal={{ enabled: true }} // Add this\\n` +\n `>\\n` +\n `\\`\\`\\`\\n\\n` +\n `Signal requires the Business plan. Want me to check your plan?`,\n [\n { id: '1', label: 'Check my plan', action: 'check_plan', variant: 'primary' },\n { id: '2', label: \"I'll do this later\", action: 'complete', variant: 'outline' },\n ]\n )\n break\n \n case 'confirm_brand':\n addMessage({ role: 'user', content: 'Brand info confirmed' })\n setState(prev => ({ ...prev, step: 'modules' }))\n showModuleSelectionWithRecommendations()\n break\n \n case 'edit_brand':\n addMessage({ role: 'user', content: 'Edit brand info' })\n addAssistantMessage(\n `No problem! Let me know what to change:\\n\\n` +\n `• Business name\\n` +\n `• Primary color (hex like #3b82f6)\\n` +\n `• Tagline\\n\\n` +\n `Just type what you'd like to update.`\n )\n break\n \n case 'manual_brand':\n addMessage({ role: 'user', content: 'Enter brand manually' })\n addAssistantMessage(\n `Sure! What's your business name?`\n )\n setState(prev => ({ \n ...prev, \n context: { ...prev.context, step: 'brand_manual' } \n }))\n break\n \n case 'skip_brand':\n addMessage({ role: 'user', content: 'Skip brand for now' })\n setState(prev => ({ ...prev, step: 'modules' }))\n showModuleSelection()\n break\n \n case 'extract_brand':\n addMessage({ role: 'user', content: 'Extract from website' })\n addAssistantMessage(\n `What's the website URL? I'll extract the brand colors, name, and logo.`\n )\n break\n \n case 'set_flow_new':\n addMessage({ role: 'user', content: 'New Site' })\n setState(prev => ({ \n ...prev, \n context: { ...prev.context, flow: 'new', step: 'brand' }\n }))\n addAssistantMessage(\n `Great! For a new site, I'll help you:\\n\\n` +\n `1. Set up your brand (colors, name)\\n` +\n `2. Choose which modules to enable\\n` +\n `3. Generate integration code\\n\\n` +\n `Do you have an existing website I can extract brand info from? Or would you prefer to enter it manually?`,\n [\n { id: '1', label: 'Extract from website', action: 'extract_brand', variant: 'primary' },\n { id: '2', label: 'Enter manually', action: 'manual_brand', variant: 'outline' },\n { id: '3', label: 'Skip for now', action: 'skip_brand', variant: 'outline' },\n ]\n )\n break\n \n case 'set_flow_existing':\n addMessage({ role: 'user', content: 'Existing Project' })\n setState(prev => ({ \n ...prev, \n context: { ...prev.context, flow: 'existing', step: 'scan' }\n }))\n addAssistantMessage(\n `For an existing project, I can scan your codebase to find:\\n\\n` +\n `• Forms to migrate (contact forms, newsletter signups)\\n` +\n `• Chat widgets to replace (Intercom, Crisp, etc.)\\n` +\n `• Metadata patterns to enhance\\n` +\n `• Sitemap configuration\\n\\n` +\n `Run this in your project root:\\n\\n` +\n `\\`\\`\\`bash\\nnpx @sonordev/site-kit scan\\n\\`\\`\\`\\n\\n` +\n `Then paste the output here, or tell me about your project.`,\n [\n { id: '1', label: 'I ran the scan', action: 'show_scan_results', variant: 'primary' },\n { id: '2', label: 'Skip scan', action: 'skip_scan', variant: 'outline' },\n ]\n )\n break\n \n case 'set_flow_rebuild':\n addMessage({ role: 'user', content: 'Rebuild from Live Site' })\n setState(prev => ({ \n ...prev, \n context: { ...prev.context, flow: 'rebuild', step: 'scrape' }\n }))\n addAssistantMessage(\n `I'll help you rebuild with site-kit. Enter the live site URL and I'll:\\n\\n` +\n `• Extract brand colors and business info\\n` +\n `• Import FAQs with schema markup\\n` +\n `• Suggest redirect mappings\\n` +\n `• Generate copilot-instructions.md\\n\\n` +\n `What's the website URL?`\n )\n break\n \n case 'show_scan_results':\n addMessage({ role: 'user', content: 'I ran the scan' })\n addAssistantMessage(\n `Great! Paste the scan output here, or describe what you found.\\n\\n` +\n `I'll analyze the results and recommend a migration plan.`\n )\n break\n \n case 'skip_scan':\n addMessage({ role: 'user', content: 'Skip scan' })\n setState(prev => ({ ...prev, step: 'modules' }))\n showModuleSelection()\n break\n \n case 'generate_redirects':\n addMessage({ role: 'user', content: 'Generate redirects' })\n if (state.context.scrape_results?.routes) {\n addStreamingMessage()\n await sendToSignalStreaming(\n `Generate SEO-optimized redirects for these routes: ${JSON.stringify(state.context.scrape_results.routes)}`,\n state.context,\n (token) => appendToStreamingMessage(token),\n (result) => finalizeStreamingMessage(result.actions)\n )\n } else {\n addAssistantMessage(\n `I need a list of routes to generate redirects. Would you like to:\\n\\n` +\n `1. Scrape a website for routes\\n` +\n `2. Paste a list of URLs\\n\\n` +\n `What's easier?`,\n [\n { id: '1', label: 'Scrape website', action: 'set_flow_rebuild', variant: 'primary' },\n { id: '2', label: 'Paste URLs', action: 'paste_urls', variant: 'outline' },\n ]\n )\n }\n break\n \n case 'generate_copilot_instructions':\n addMessage({ role: 'user', content: 'Generate Copilot instructions' })\n addStreamingMessage()\n await sendToSignalStreaming(\n `Generate copilot-instructions.md for project with modules: ${state.selectedModules.join(', ')} and brand: ${state.context.brand?.business_name || 'Unknown'}`,\n state.context,\n (token) => appendToStreamingMessage(token),\n (result) => {\n finalizeStreamingMessage([\n { id: '1', label: '📋 Copy to clipboard', action: 'copy_copilot_instructions', variant: 'primary' },\n { id: '2', label: 'Continue', action: 'complete', variant: 'outline' },\n ])\n }\n )\n break\n \n case 'verify_now':\n addMessage({ role: 'user', content: 'Verify integration' })\n verifyIntegration()\n break\n }\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [addMessage, addAssistantMessage, addStreamingMessage, appendToStreamingMessage, finalizeStreamingMessage, sendToSignalStreaming, state, onComplete])\n \n // ============================================\n // Auth Success Handler\n // ============================================\n \n const handleAuthSuccess = useCallback((email: string) => {\n addAssistantMessage(\n `Welcome back, ${email.split('@')[0]}! 👋\\n\\n` +\n `I found these projects in your account. Which one are we setting up?`,\n [\n { id: '1', label: 'MyCompany.com', action: 'select_project', variant: 'secondary', data: { id: '1', name: 'MyCompany.com', domain: 'mycompany.com' } },\n { id: '2', label: 'Blog Project', action: 'select_project', variant: 'secondary', data: { id: '2', name: 'Blog Project', domain: 'blog.mycompany.com' } },\n { id: '3', label: '+ Create new project', action: 'create_project', variant: 'outline' },\n ]\n )\n }, [addAssistantMessage])\n \n // ============================================\n // Integration Verification\n // ============================================\n \n const verifyIntegration = useCallback(async () => {\n setState(prev => ({ ...prev, step: 'verify' }))\n setIsTyping(true)\n \n try {\n const response = await fetch(`${signalUrl}/api/skills/setup/verify`, {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n ...(authToken ? { Authorization: `Bearer ${authToken}` } : {}),\n },\n body: JSON.stringify({\n project_id: projectId || state.context.project_id,\n dev_url: 'http://localhost:3000',\n }),\n })\n \n setIsTyping(false)\n \n if (!response.ok) {\n throw new Error('Verification failed')\n }\n \n const result = await response.json()\n \n if (result.overall_status === 'success') {\n const checkList = result.checks.map((c: { check: string; passed: boolean }) => \n `${c.passed ? '✅' : '❌'} ${c.check.replace(/_/g, ' ')}`\n ).join('\\n')\n \n addAssistantMessage(\n `🎉 **Integration Verified!**\\n\\n${checkList}\\n\\n` +\n `Your site-kit integration is working perfectly. Data will start appearing in Sonor shortly.`,\n [\n { id: '1', label: 'Open Sonor Dashboard', action: 'open_dashboard', variant: 'primary' },\n { id: '2', label: 'Generate Copilot Instructions', action: 'generate_copilot_instructions', variant: 'secondary' },\n ]\n )\n setState(prev => ({ ...prev, step: 'complete' }))\n } else {\n const issues = result.issues?.join('\\n• ') || 'Unknown issue'\n addAssistantMessage(\n `⚠️ **Verification Found Issues**\\n\\n• ${issues}\\n\\n` +\n `Would you like help troubleshooting?`,\n [\n { id: '1', label: 'Help me fix this', action: 'troubleshoot', variant: 'primary' },\n { id: '2', label: 'Skip for now', action: 'complete', variant: 'outline' },\n ]\n )\n }\n } catch (error) {\n setIsTyping(false)\n addAssistantMessage(\n `I couldn't verify the integration automatically. Make sure your dev server is running.\\n\\n` +\n `You can manually verify by:\\n` +\n `1. Opening your site in the browser\\n` +\n `2. Checking the Network tab for requests to api.sonor.io\\n` +\n `3. Looking for analytics events in your Sonor dashboard`,\n [\n { id: '1', label: 'Try again', action: 'verify_now', variant: 'primary' },\n { id: '2', label: 'Continue anyway', action: 'complete', variant: 'outline' },\n ]\n )\n }\n }, [signalUrl, authToken, projectId, state.context.project_id, addAssistantMessage])\n \n // ============================================\n // Module Selection with Recommendations\n // ============================================\n \n const showModuleSelectionWithRecommendations = useCallback(async () => {\n const { brand, business_type, scan_results } = state.context\n \n // Get AI recommendations if we have context\n if (brand || business_type) {\n try {\n const result = await sendToSignal(\n `Recommend modules for: ${brand?.business_name || 'Unknown'}, type: ${business_type || 'general'}`,\n { ...state.context, step: 'recommend_modules' }\n )\n \n // Parse recommendations from response\n addAssistantMessage(\n result.response,\n undefined,\n <ModuleSelector\n modules={MODULES}\n selected={state.selectedModules}\n onChange={(modules) => setState(prev => ({ ...prev, selectedModules: modules }))}\n onConfirm={() => handleAction('confirm_modules')}\n />\n )\n return\n } catch (error) {\n // Fall back to default\n }\n }\n \n // Default module selection\n showModuleSelection()\n }, [state.context, state.selectedModules, sendToSignal, handleAction])\n\n // ============================================\n // Module Selection\n // ============================================\n \n const showModuleSelection = useCallback(() => {\n addAssistantMessage(\n `Perfect! Now let's choose which features to enable.\\n\\n` +\n `I've pre-selected the essentials, but you can customize:`,\n undefined,\n <ModuleSelector\n modules={MODULES}\n selected={state.selectedModules}\n onChange={(modules) => setState(prev => ({ ...prev, selectedModules: modules }))}\n onConfirm={() => handleAction('confirm_modules')}\n />\n )\n }, [addAssistantMessage, state.selectedModules, handleAction])\n \n // ============================================\n // Config Generation\n // ============================================\n \n const showConfigGeneration = useCallback(() => {\n const code = generateIntegrationCode(state)\n \n addAssistantMessage(\n `Here's your integration code! 🎉\\n\\n` +\n `Add this to your root layout:`,\n [\n { id: '1', label: '📋 Copy Code', action: 'copy_code', variant: 'primary' },\n ],\n <CodeBlock code={code} />\n )\n }, [addAssistantMessage, state])\n \n // ============================================\n // Text Input Handler\n // ============================================\n \n const handleSubmit = useCallback(async (e: React.FormEvent) => {\n e.preventDefault()\n if (!input.trim()) return\n \n const userInput = input.trim()\n setInput('')\n addMessage({ role: 'user', content: userInput })\n \n // Handle based on current step\n if (state.step === 'auth' && userInput.includes('@')) {\n // Email entered\n setState(prev => ({ \n ...prev, \n isAuthenticated: true,\n userEmail: userInput,\n step: 'project',\n }))\n addAssistantMessage(\n `Sending magic link to ${userInput}...\\n\\n` +\n `(In production, you'd receive an email. For now, I'll simulate a successful login.)`,\n )\n setTimeout(() => handleAuthSuccess(userInput), 1500)\n } else if (userInput.toLowerCase().includes('http') || userInput.match(/^[\\w.-]+\\.[a-z]{2,}$/i)) {\n // URL or domain entered - extract brand\n const domain = userInput.replace(/^https?:\\/\\//, '').split('/')[0]\n setIsTyping(true)\n addAssistantMessage(`Analyzing ${domain} to extract brand information...`)\n \n const brand = await extractBrandFromDomain(domain)\n setIsTyping(false)\n \n if (brand) {\n setState(prev => ({\n ...prev,\n context: { ...prev.context, brand, domain },\n }))\n \n const brandSummary = [\n brand.business_name && `**Business:** ${brand.business_name}`,\n brand.tagline && `**Tagline:** ${brand.tagline}`,\n brand.primary_color && `**Primary Color:** ${brand.primary_color}`,\n brand.phone_numbers?.length && `**Phone:** ${brand.phone_numbers[0]}`,\n ].filter(Boolean).join('\\n')\n \n addAssistantMessage(\n `Found brand information:\\n\\n${brandSummary}\\n\\nDoes this look right?`,\n [\n { id: '1', label: 'Yes, looks good!', action: 'confirm_brand', variant: 'primary' },\n { id: '2', label: 'Edit brand info', action: 'edit_brand', variant: 'outline' },\n ]\n )\n } else {\n addAssistantMessage(\n `I couldn't extract brand info from ${domain}. You can enter it manually, or we can continue without it.`,\n [\n { id: '1', label: 'Enter manually', action: 'manual_brand', variant: 'primary' },\n { id: '2', label: 'Skip for now', action: 'skip_brand', variant: 'outline' },\n ]\n )\n }\n } else {\n // Natural language input - send to Signal API with streaming\n addStreamingMessage()\n \n try {\n await sendToSignalStreaming(\n userInput, \n state.context,\n (token) => appendToStreamingMessage(token),\n (result) => {\n if (result.updated_context) {\n setState(prev => ({\n ...prev,\n context: { ...prev.context, ...result.updated_context },\n }))\n }\n finalizeStreamingMessage(result.actions)\n }\n )\n } catch (error) {\n finalizeStreamingMessage()\n addAssistantMessage(\n `I understand you said: \"${userInput}\"\\n\\n` +\n `Let me help you with that. What would you like to do?`,\n [\n { id: '1', label: 'Continue setup', action: 'start', variant: 'primary' },\n { id: '2', label: 'Ask a question', action: 'help', variant: 'outline' },\n ]\n )\n }\n }\n }, [input, state.step, state.context, addMessage, addAssistantMessage, handleAuthSuccess, sendToSignalStreaming, appendToStreamingMessage, finalizeStreamingMessage, addStreamingMessage, extractBrandFromDomain])\n\n // ============================================\n // Render\n // ============================================\n \n return (\n <div style={styles.container}>\n {/* Header */}\n <div style={styles.header}>\n <div style={styles.logo}>U</div>\n <div>\n <div style={styles.title}>Sonor Setup</div>\n <div style={styles.subtitle}>Site-Kit Integration Wizard</div>\n </div>\n </div>\n \n {/* Messages */}\n <div style={styles.messages}>\n {messages.map(message => (\n <div\n key={message.id}\n style={{\n ...styles.message,\n ...(message.role === 'assistant' ? styles.messageAssistant : styles.messageUser),\n }}\n >\n <div\n style={{\n ...styles.avatar,\n ...(message.role === 'assistant' ? styles.avatarAssistant : styles.avatarUser),\n }}\n >\n {message.role === 'assistant' ? '✨' : '👤'}\n </div>\n <div>\n <div\n style={{\n ...styles.bubble,\n ...(message.role === 'assistant' ? styles.bubbleAssistant : styles.bubbleUser),\n }}\n >\n {message.content.split('\\n').map((line, i) => (\n <React.Fragment key={i}>\n {line}\n {i < message.content.split('\\n').length - 1 && <br />}\n </React.Fragment>\n ))}\n </div>\n \n {/* Custom component */}\n {message.component}\n \n {/* Action buttons */}\n {message.actions && (\n <div style={styles.actions}>\n {message.actions.map(action => (\n <button\n key={action.id}\n onClick={() => handleAction(action.action, action.data)}\n style={{\n ...styles.actionButton,\n ...(action.variant === 'primary' ? styles.actionPrimary : \n action.variant === 'outline' ? styles.actionOutline :\n styles.actionSecondary),\n }}\n >\n {action.label}\n </button>\n ))}\n </div>\n )}\n </div>\n </div>\n ))}\n \n {/* Typing indicator */}\n {isTyping && (\n <div style={{ ...styles.message, ...styles.messageAssistant }}>\n <div style={{ ...styles.avatar, ...styles.avatarAssistant }}>✨</div>\n <div style={styles.typing}>\n <div style={{ ...styles.typingDot, animationDelay: '0s' }} />\n <div style={{ ...styles.typingDot, animationDelay: '0.2s' }} />\n <div style={{ ...styles.typingDot, animationDelay: '0.4s' }} />\n </div>\n </div>\n )}\n \n <div ref={messagesEndRef} />\n </div>\n \n {/* Input */}\n <form onSubmit={handleSubmit} style={styles.inputContainer}>\n <input\n ref={inputRef}\n type=\"text\"\n value={input}\n onChange={(e) => setInput(e.target.value)}\n placeholder=\"Type a message...\"\n style={styles.input}\n />\n <button type=\"submit\" style={styles.sendButton}>\n Send\n </button>\n </form>\n \n {/* Typing animation keyframes */}\n <style>{`\n @keyframes typing {\n 0%, 60%, 100% { transform: translateY(0); opacity: 0.5; }\n 30% { transform: translateY(-4px); opacity: 1; }\n }\n `}</style>\n </div>\n )\n}\n\n// ============================================\n// Module Selector Component\n// ============================================\n\nfunction ModuleSelector({\n modules,\n selected,\n onChange,\n onConfirm,\n}: {\n modules: typeof MODULES\n selected: string[]\n onChange: (modules: string[]) => void\n onConfirm: () => void\n}) {\n const toggle = (id: string) => {\n onChange(\n selected.includes(id)\n ? selected.filter(m => m !== id)\n : [...selected, id]\n )\n }\n \n return (\n <div style={{ marginTop: '0.75rem', display: 'flex', flexDirection: 'column', gap: '0.5rem' }}>\n {modules.map(module => (\n <div\n key={module.id}\n onClick={() => toggle(module.id)}\n style={{\n ...styles.moduleCard,\n ...(selected.includes(module.id) ? styles.moduleCardSelected : {}),\n }}\n >\n <span style={styles.moduleIcon}>{module.icon}</span>\n <div style={styles.moduleInfo}>\n <div style={styles.moduleName}>\n {module.name}\n {module.recommended && (\n <span style={{ marginLeft: '0.5rem', fontSize: '0.625rem', background: '#dbeafe', color: '#1d4ed8', padding: '2px 6px', borderRadius: '4px' }}>\n Recommended\n </span>\n )}\n </div>\n <div style={styles.moduleDesc}>{module.description}</div>\n </div>\n <input\n type=\"checkbox\"\n checked={selected.includes(module.id)}\n onChange={() => toggle(module.id)}\n style={styles.checkbox}\n />\n </div>\n ))}\n \n <button\n onClick={onConfirm}\n style={{ ...styles.actionButton, ...styles.actionPrimary, marginTop: '0.5rem' }}\n >\n Continue with {selected.length} modules\n </button>\n </div>\n )\n}\n\n// ============================================\n// Code Block Component\n// ============================================\n\nfunction CodeBlock({ code }: { code: string }) {\n return (\n <pre style={{\n marginTop: '0.75rem',\n padding: '1rem',\n background: '#1f2937',\n color: '#e5e7eb',\n borderRadius: '0.5rem',\n fontSize: '0.8125rem',\n overflowX: 'auto',\n fontFamily: 'monospace',\n }}>\n {code}\n </pre>\n )\n}\n\n// ============================================\n// Code Generation\n// ============================================\n\nfunction generateIntegrationCode(state: SetupState): string {\n const { selectedModules } = state\n \n const moduleConfigs: string[] = []\n \n if (selectedModules.includes('analytics')) {\n moduleConfigs.push(` analytics={{ enabled: true }}`)\n }\n \n if (selectedModules.includes('engage')) {\n moduleConfigs.push(` engage={{ enabled: true }}`)\n }\n \n if (selectedModules.includes('forms')) {\n moduleConfigs.push(` forms={{ enabled: true }}`)\n }\n \n if (selectedModules.includes('signal')) {\n moduleConfigs.push(` signal={{ enabled: true, realtime: true }}`)\n }\n \n return `// app/layout.tsx (or pages/_app.tsx)\nimport { SiteKitProvider } from '@sonordev/site-kit'\n\nexport default function RootLayout({ children }) {\n return (\n <html>\n <body>\n <SiteKitProvider\n apiKey={process.env.SONOR_API_KEY!}\n${moduleConfigs.join('\\n')}\n >\n {children}\n </SiteKitProvider>\n </body>\n </html>\n )\n}`\n}\n"]}
1
+ {"version":3,"sources":["../src/affiliates/api.ts","../src/affiliates/useAffiliates.ts","../src/affiliates/AffiliatesWidget.tsx","../src/signal/SignalExperiment.tsx"],"names":["getTrackingUrl","useEffect","jsx"],"mappings":"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","file":"index.mjs","sourcesContent":["/**\n * @sonordev/site-kit/affiliates - Affiliates API\n * \n * API functions for fetching affiliate data for client sites.\n * All data goes through Portal API with API key auth - never Supabase directly.\n */\n\nimport type { Affiliate, AffiliateWithOffers, FetchAffiliatesOptions } from './types'\n\n// ============================================\n// API Config Helpers\n// ============================================\n\nfunction getApiConfig() {\n const apiUrl = typeof window !== 'undefined' \n ? (window as any).__SITE_KIT_API_URL__ || 'https://api.sonor.io'\n : 'https://api.sonor.io'\n const apiKey = typeof window !== 'undefined' \n ? (window as any).__SITE_KIT_API_KEY__ || ''\n : ''\n return { apiUrl, apiKey }\n}\n\nasync function apiGet<T>(endpoint: string): Promise<T | null> {\n const { apiUrl, apiKey } = getApiConfig()\n \n if (!apiKey) {\n console.error('[Affiliates] No API key configured')\n return null\n }\n \n try {\n const response = await fetch(`${apiUrl}${endpoint}`, {\n method: 'GET',\n headers: {\n 'x-api-key': apiKey,\n },\n })\n \n if (!response.ok) {\n console.error(`[Affiliates] API error: ${response.statusText}`)\n return null\n }\n \n return await response.json()\n } catch (error) {\n console.error('[Affiliates] Network error:', error)\n return null\n }\n}\n\n// ============================================\n// Fetch Affiliates\n// ============================================\n\n/**\n * Fetch all active affiliates for the project\n * \n * @example\n * ```ts\n * const affiliates = await fetchAffiliates()\n * ```\n */\nexport async function fetchAffiliates(\n options: FetchAffiliatesOptions = {}\n): Promise<AffiliateWithOffers[]> {\n const result = await apiGet<{ affiliates: AffiliateWithOffers[] }>(\n '/api/public/affiliates'\n )\n \n return result?.affiliates || []\n}\n\n/**\n * Build a tracking URL for an affiliate offer\n * When clicked, this redirects through our tracking endpoint and then to the destination\n * \n * @example\n * ```ts\n * const trackingUrl = getTrackingUrl(affiliate.id, offer.id)\n * // Returns: https://api.sonor.io/a/{affiliateId}/{offerId}\n * ```\n */\nexport function getTrackingUrl(affiliateId: string, offerId: string): string {\n const { apiUrl } = getApiConfig()\n return `${apiUrl}/a/${affiliateId}/${offerId}`\n}\n","/**\n * @sonordev/site-kit/affiliates - useAffiliates Hook\n * \n * React hook for fetching and displaying affiliates on client sites.\n */\n\n'use client'\n\nimport { useState, useEffect } from 'react'\nimport type { AffiliateWithOffers } from './types'\nimport { fetchAffiliates, getTrackingUrl } from './api'\n\nexport interface UseAffiliatesResult {\n affiliates: AffiliateWithOffers[]\n isLoading: boolean\n error: string | null\n getTrackingUrl: (affiliateId: string, offerId: string) => string\n}\n\n/**\n * Hook to fetch affiliates for display on client sites\n * \n * @example\n * ```tsx\n * function AffiliatesSection() {\n * const { affiliates, isLoading } = useAffiliates()\n * \n * if (isLoading) return <div>Loading...</div>\n * \n * return (\n * <div className=\"grid grid-cols-3 gap-4\">\n * {affiliates.map(affiliate => (\n * <AffiliateCard key={affiliate.id} affiliate={affiliate} />\n * ))}\n * </div>\n * )\n * }\n * ```\n */\nexport function useAffiliates(): UseAffiliatesResult {\n const [affiliates, setAffiliates] = useState<AffiliateWithOffers[]>([])\n const [isLoading, setIsLoading] = useState(true)\n const [error, setError] = useState<string | null>(null)\n\n useEffect(() => {\n async function load() {\n try {\n setIsLoading(true)\n setError(null)\n const data = await fetchAffiliates()\n setAffiliates(data)\n } catch (err) {\n setError(err instanceof Error ? err.message : 'Failed to load affiliates')\n } finally {\n setIsLoading(false)\n }\n }\n \n load()\n }, [])\n\n return {\n affiliates,\n isLoading,\n error,\n getTrackingUrl,\n }\n}\n","/**\n * @sonordev/site-kit/affiliates - AffiliatesWidget Component\n * \n * Unstyled, headless component for displaying affiliates.\n * Client sites can wrap this or use it directly with their own styling.\n */\n\n'use client'\n\nimport React from 'react'\nimport { useAffiliates } from './useAffiliates'\nimport type { AffiliateWithOffers, AffiliateOffer } from './types'\n\n// ============================================\n// Affiliate Card (Unstyled)\n// ============================================\n\nexport interface AffiliateCardProps {\n affiliate: AffiliateWithOffers\n className?: string\n /** Optional custom render for the logo */\n renderLogo?: (affiliate: AffiliateWithOffers) => React.ReactNode\n /** Show offers as links below the card */\n showOffers?: boolean\n}\n\n/**\n * Single affiliate card - unstyled, bring your own CSS\n * \n * @example\n * ```tsx\n * <AffiliateCard \n * affiliate={affiliate}\n * className=\"p-4 bg-white rounded-lg shadow\"\n * showOffers\n * />\n * ```\n */\nexport function AffiliateCard({\n affiliate,\n className = '',\n renderLogo,\n showOffers = false,\n}: AffiliateCardProps) {\n const { getTrackingUrl } = useAffiliates()\n \n const defaultLogo = (\n <div data-affiliate-logo className=\"affiliate-logo\">\n {affiliate.logo_url ? (\n <img \n src={affiliate.logo_url} \n alt={affiliate.name}\n loading=\"lazy\"\n />\n ) : (\n <span>{affiliate.name.charAt(0)}</span>\n )}\n </div>\n )\n\n return (\n <div className={className} data-affiliate-card data-affiliate-id={affiliate.id}>\n {/* Logo */}\n {renderLogo ? renderLogo(affiliate) : defaultLogo}\n \n {/* Name */}\n <div data-affiliate-name className=\"affiliate-name\">\n {affiliate.name}\n </div>\n \n {/* Website link */}\n {affiliate.website_url && (\n <a \n href={affiliate.website_url}\n target=\"_blank\"\n rel=\"noopener noreferrer sponsored\"\n data-affiliate-website\n className=\"affiliate-website\"\n >\n Visit Website\n </a>\n )}\n \n {/* Offers */}\n {showOffers && affiliate.offers && affiliate.offers.length > 0 && (\n <div data-affiliate-offers className=\"affiliate-offers\">\n {affiliate.offers.map(offer => (\n <a\n key={offer.id}\n href={getTrackingUrl(affiliate.id, offer.id)}\n target=\"_blank\"\n rel=\"noopener noreferrer sponsored\"\n data-affiliate-offer\n data-offer-id={offer.id}\n className=\"affiliate-offer\"\n >\n {offer.name}\n </a>\n ))}\n </div>\n )}\n </div>\n )\n}\n\n// ============================================\n// Affiliates Grid (Unstyled)\n// ============================================\n\nexport interface AffiliatesWidgetProps {\n className?: string\n /** Custom loading component */\n loadingComponent?: React.ReactNode\n /** Custom empty state component */\n emptyComponent?: React.ReactNode\n /** Custom error component */\n errorComponent?: React.ReactNode\n /** Show offers on each card */\n showOffers?: boolean\n /** Custom render function for each affiliate */\n renderAffiliate?: (affiliate: AffiliateWithOffers) => React.ReactNode\n /** Maximum number to display */\n limit?: number\n}\n\n/**\n * Display a grid of affiliates - unstyled, bring your own CSS\n * \n * @example\n * ```tsx\n * // Basic usage\n * <AffiliatesWidget className=\"grid grid-cols-3 gap-4\" />\n * \n * // With custom rendering\n * <AffiliatesWidget\n * renderAffiliate={(affiliate) => (\n * <MyCustomCard key={affiliate.id} data={affiliate} />\n * )}\n * />\n * ```\n */\nexport function AffiliatesWidget({\n className = '',\n loadingComponent,\n emptyComponent,\n errorComponent,\n showOffers = false,\n renderAffiliate,\n limit,\n}: AffiliatesWidgetProps) {\n const { affiliates, isLoading, error, getTrackingUrl } = useAffiliates()\n \n if (isLoading) {\n return loadingComponent || <div data-affiliates-loading>Loading affiliates...</div>\n }\n \n if (error) {\n return errorComponent || <div data-affiliates-error>{error}</div>\n }\n \n const displayAffiliates = limit ? affiliates.slice(0, limit) : affiliates\n \n if (displayAffiliates.length === 0) {\n return emptyComponent || null\n }\n \n return (\n <div className={className} data-affiliates-widget>\n {displayAffiliates.map(affiliate => \n renderAffiliate \n ? renderAffiliate(affiliate)\n : <AffiliateCard \n key={affiliate.id} \n affiliate={affiliate} \n showOffers={showOffers}\n />\n )}\n </div>\n )\n}\n","/**\n * @sonordev/site-kit/signal - SignalExperiment\n * \n * A/B test component that renders different variants based on Signal assignment.\n * Uses Thompson Sampling (Bayesian bandit) for optimization.\n */\n\n'use client'\n\nimport React, { useMemo, useEffect } from 'react'\nimport { useSignalExperiment, useSignalEvent } from './SignalBridge'\n\ninterface SignalExperimentProps {\n /** Unique experiment ID */\n experimentId: string\n \n /** Variants to test - keys are variant names, values are React nodes */\n variants: Record<string, React.ReactNode>\n \n /** Fallback content if no assignment (defaults to 'control' variant) */\n fallback?: React.ReactNode\n \n /** Track impression automatically */\n trackImpression?: boolean\n \n /** Children function for more control */\n children?: (props: { variant: string; isControl: boolean }) => React.ReactNode\n}\n\n/**\n * Renders different content variants based on Signal's A/B assignment.\n * \n * @example\n * // Simple variant switching\n * <SignalExperiment experimentId=\"hero-cta\" variants={{\n * control: <Button>Get Started</Button>,\n * variant_a: <Button variant=\"primary\">Start Free Trial</Button>,\n * variant_b: <Button variant=\"secondary\">Book a Demo</Button>,\n * }} />\n * \n * @example\n * // With render prop for more control\n * <SignalExperiment experimentId=\"pricing-layout\">\n * {({ variant, isControl }) => (\n * <PricingSection layout={isControl ? 'cards' : 'table'} />\n * )}\n * </SignalExperiment>\n */\nexport function SignalExperiment({\n experimentId,\n variants,\n fallback,\n trackImpression = true,\n children,\n}: SignalExperimentProps) {\n const { assignment, variant, isControl } = useSignalExperiment(experimentId)\n const trackEvent = useSignalEvent()\n \n // Track impression when variant is rendered\n useEffect(() => {\n if (trackImpression && variant) {\n trackEvent({\n event_type: 'experiment',\n event_name: 'impression',\n event_data: {\n experiment_id: experimentId,\n variant_key: variant,\n },\n })\n }\n }, [experimentId, variant, trackImpression, trackEvent])\n \n // If using render prop\n if (children) {\n return <>{children({ variant: variant || 'control', isControl })}</>\n }\n \n // Determine what to render\n const selectedVariant = variant || 'control'\n const content = variants[selectedVariant]\n \n if (content !== undefined) {\n return <>{content}</>\n }\n \n // Fallback to provided fallback or control\n if (fallback) {\n return <>{fallback}</>\n }\n \n return <>{variants.control || null}</>\n}\n\n/**\n * Hook for conditional experiment logic\n * \n * @example\n * const { variant, isControl } = useExperimentVariant('pricing-test')\n * \n * return isControl \n * ? <OldPricing />\n * : <NewPricing showAnnual={variant === 'annual_first'} />\n */\nexport function useExperimentVariant(experimentId: string) {\n return useSignalExperiment(experimentId)\n}\n\n/**\n * Component for tracking experiment conversions\n * Wraps interactive elements to track when they convert\n * \n * @example\n * <SignalExperiment experimentId=\"signup-button\" variants={{\n * control: (\n * <ExperimentConversion experimentId=\"signup-button\" outcomeType=\"click\">\n * <Button>Sign Up</Button>\n * </ExperimentConversion>\n * ),\n * variant_a: (\n * <ExperimentConversion experimentId=\"signup-button\" outcomeType=\"click\">\n * <Button variant=\"large\">Join Now - It's Free!</Button>\n * </ExperimentConversion>\n * ),\n * }} />\n */\nexport function ExperimentConversion({\n experimentId,\n outcomeType = 'click',\n value,\n children,\n}: {\n experimentId: string\n outcomeType?: string\n value?: number\n children: React.ReactElement\n}) {\n const trackEvent = useSignalEvent()\n const { variant } = useSignalExperiment(experimentId)\n \n const handleInteraction = () => {\n trackEvent({\n event_type: 'experiment',\n event_name: 'conversion',\n event_data: {\n experiment_id: experimentId,\n variant_key: variant,\n outcome_type: outcomeType,\n value,\n },\n })\n }\n \n return React.cloneElement(children, {\n onClick: (e: React.MouseEvent) => {\n handleInteraction()\n // Call original onClick if exists\n if (children.props.onClick) {\n children.props.onClick(e)\n }\n },\n })\n}\n"]}
@@ -1,14 +1,14 @@
1
1
  'use client';
2
2
  'use strict';
3
3
 
4
- var chunkOE5DEMCV_js = require('../chunk-OE5DEMCV.js');
4
+ var chunkUD5447TC_js = require('../chunk-UD5447TC.js');
5
5
  require('../chunk-ZSMWDLMK.js');
6
6
 
7
7
 
8
8
 
9
9
  Object.defineProperty(exports, "SiteKitClientProviders", {
10
10
  enumerable: true,
11
- get: function () { return chunkOE5DEMCV_js.SiteKitClientProviders; }
11
+ get: function () { return chunkUD5447TC_js.SiteKitClientProviders; }
12
12
  });
13
13
  //# sourceMappingURL=client.js.map
14
14
  //# sourceMappingURL=client.js.map
@@ -1,5 +1,5 @@
1
1
  'use client';
2
- export { SiteKitClientProviders } from '../chunk-35MALWVX.mjs';
2
+ export { SiteKitClientProviders } from '../chunk-WN2PUL6B.mjs';
3
3
  import '../chunk-4XPGGLVP.mjs';
4
4
  //# sourceMappingURL=client.mjs.map
5
5
  //# sourceMappingURL=client.mjs.map
@@ -1,12 +1,19 @@
1
1
  'use strict';
2
2
 
3
- var chunkOE5DEMCV_js = require('../chunk-OE5DEMCV.js');
4
- var chunkDY4K6X3A_js = require('../chunk-DY4K6X3A.js');
5
- var chunkKJN2C6YE_js = require('../chunk-KJN2C6YE.js');
6
- require('../chunk-PTTDKFL7.js');
3
+ var chunkUD5447TC_js = require('../chunk-UD5447TC.js');
4
+ var chunkGCPPXUAI_js = require('../chunk-GCPPXUAI.js');
5
+ var chunkI34XL5VJ_js = require('../chunk-I34XL5VJ.js');
6
+ require('../chunk-FCXQECM7.js');
7
7
  require('../chunk-ZSMWDLMK.js');
8
8
  var jsxRuntime = require('react/jsx-runtime');
9
9
 
10
+ function portalApiOrigin(apiUrl) {
11
+ try {
12
+ return new URL(apiUrl.replace(/\/$/, "")).origin;
13
+ } catch {
14
+ return "https://api.sonor.io";
15
+ }
16
+ }
10
17
  async function SiteKitLayout({
11
18
  children,
12
19
  apiKey,
@@ -20,18 +27,21 @@ async function SiteKitLayout({
20
27
  managedScripts = true,
21
28
  debug = false
22
29
  }) {
23
- const resolvedApiKey = apiKey ?? process.env.SONOR_API_KEY ?? process.env.UPTRADE_API_KEY ?? process.env.NEXT_PUBLIC_UPTRADE_API_KEY ?? "";
24
- const resolvedApiUrl = apiUrl ?? process.env.SONOR_API_URL ?? process.env.UPTRADE_API_URL ?? process.env.NEXT_PUBLIC_UPTRADE_API_URL ?? "https://api.sonor.io";
30
+ const resolvedApiKey = apiKey ?? process.env.SONOR_API_KEY ?? "";
31
+ const resolvedApiUrl = apiUrl ?? process.env.SONOR_API_URL ?? "https://api.sonor.io";
25
32
  if (!resolvedApiKey && debug) {
26
33
  console.warn(
27
- "[SiteKitLayout] No API key found. Set SONOR_API_KEY (or UPTRADE_API_KEY)."
34
+ "[SiteKitLayout] No API key found. Set SONOR_API_KEY."
28
35
  );
29
36
  }
37
+ const apiOrigin = portalApiOrigin(resolvedApiUrl);
30
38
  return /* @__PURE__ */ jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [
31
- favicon && /* @__PURE__ */ jsxRuntime.jsx(chunkDY4K6X3A_js.ManagedFavicon, { apiKey: resolvedApiKey, apiUrl: resolvedApiUrl }),
32
- managedScripts && /* @__PURE__ */ jsxRuntime.jsx(chunkKJN2C6YE_js.ManagedScripts, { position: "head" }),
39
+ /* @__PURE__ */ jsxRuntime.jsx("link", { rel: "preconnect", href: apiOrigin, crossOrigin: "anonymous" }),
40
+ /* @__PURE__ */ jsxRuntime.jsx("link", { rel: "dns-prefetch", href: apiOrigin }),
41
+ favicon && /* @__PURE__ */ jsxRuntime.jsx(chunkGCPPXUAI_js.ManagedFavicon, { apiKey: resolvedApiKey, apiUrl: resolvedApiUrl }),
42
+ managedScripts && /* @__PURE__ */ jsxRuntime.jsx(chunkI34XL5VJ_js.ManagedScripts, { position: "head" }),
33
43
  /* @__PURE__ */ jsxRuntime.jsx(
34
- chunkOE5DEMCV_js.SiteKitClientProviders,
44
+ chunkUD5447TC_js.SiteKitClientProviders,
35
45
  {
36
46
  apiKey: resolvedApiKey,
37
47
  apiUrl: resolvedApiUrl,
@@ -44,7 +54,7 @@ async function SiteKitLayout({
44
54
  children
45
55
  }
46
56
  ),
47
- managedScripts && /* @__PURE__ */ jsxRuntime.jsx(chunkKJN2C6YE_js.ManagedScripts, { position: "body-end" })
57
+ managedScripts && /* @__PURE__ */ jsxRuntime.jsx(chunkI34XL5VJ_js.ManagedScripts, { position: "body-end" })
48
58
  ] });
49
59
  }
50
60
 
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/layout/SiteKitLayout.tsx"],"names":["jsxs","Fragment","jsx","ManagedFavicon","ManagedScripts","SiteKitClientProviders"],"mappings":";;;;;;;;;AA8EA,eAAsB,aAAA,CAAc;AAAA,EAClC,QAAA;AAAA,EACA,MAAA;AAAA,EACA,MAAA;AAAA,EACA,SAAA;AAAA,EACA,SAAA,GAAY,IAAA;AAAA,EACZ,MAAA,GAAS,IAAA;AAAA,EACT,MAAA,GAAS,KAAA;AAAA,EACT,WAAA,GAAc,IAAA;AAAA,EACd,OAAA,GAAU,IAAA;AAAA,EACV,cAAA,GAAiB,IAAA;AAAA,EACjB,KAAA,GAAQ;AACV,CAAA,EAAuB;AAErB,EAAA,MAAM,cAAA,GACJ,MAAA,IACA,OAAA,CAAQ,GAAA,CAAI,aAAA,IACZ,QAAQ,GAAA,CAAI,eAAA,IACZ,OAAA,CAAQ,GAAA,CAAI,2BAAA,IACZ,EAAA;AACF,EAAA,MAAM,cAAA,GACJ,MAAA,IACA,OAAA,CAAQ,GAAA,CAAI,aAAA,IACZ,QAAQ,GAAA,CAAI,eAAA,IACZ,OAAA,CAAQ,GAAA,CAAI,2BAAA,IACZ,sBAAA;AAEF,EAAA,IAAI,CAAC,kBAAkB,KAAA,EAAO;AAC5B,IAAA,OAAA,CAAQ,IAAA;AAAA,MACN;AAAA,KACF;AAAA,EACF;AAEA,EAAA,uBACEA,eAAA,CAAAC,mBAAA,EAAA,EAEG,QAAA,EAAA;AAAA,IAAA,OAAA,oBAAWC,cAAA,CAACC,+BAAA,EAAA,EAAe,MAAA,EAAQ,cAAA,EAAgB,QAAQ,cAAA,EAAgB,CAAA;AAAA,IAC3E,cAAA,oBAAkBD,cAAA,CAACE,+BAAA,EAAA,EAAe,QAAA,EAAS,MAAA,EAAO,CAAA;AAAA,oBAGnDF,cAAA;AAAA,MAACG,uCAAA;AAAA,MAAA;AAAA,QACC,MAAA,EAAQ,cAAA;AAAA,QACR,MAAA,EAAQ,cAAA;AAAA,QACR,SAAA;AAAA,QACA,SAAA;AAAA,QACA,MAAA;AAAA,QACA,MAAA;AAAA,QACA,WAAA;AAAA,QACA,KAAA;AAAA,QAEC;AAAA;AAAA,KACH;AAAA,IAGC,cAAA,oBAAkBH,cAAA,CAACE,+BAAA,EAAA,EAAe,QAAA,EAAS,UAAA,EAAW;AAAA,GAAA,EACzD,CAAA;AAEJ","file":"index.js","sourcesContent":["/**\n * @sonordev/site-kit/layout — SiteKitLayout\n *\n * The master layout component. A single RSC that auto-composes every\n * site-kit feature your layout needs:\n *\n * Server-side (RSC):\n * - ManagedFavicon (link tags from Portal logo)\n * - ManagedScripts position=\"head\" (tracking pixels, analytics tags)\n * - ManagedScripts position=\"body-end\"\n *\n * Client-side (island):\n * - AnalyticsProvider (page views, scroll depth, heatmap, web vitals)\n * - EngageWidget (popups, nudges, chat)\n * - SignalBridge (A/B experiments, behavior tracking)\n * - SitemapSync (keeps Portal seo_pages in sync)\n *\n * @example\n * ```tsx\n * // app/layout.tsx\n * import { SiteKitLayout } from '@sonordev/site-kit/layout'\n *\n * export default function RootLayout({ children }) {\n * return (\n * <html lang=\"en\">\n * <body>\n * <SiteKitLayout>\n * <Header />\n * <main>{children}</main>\n * <Footer />\n * </SiteKitLayout>\n * </body>\n * </html>\n * )\n * }\n * ```\n *\n * @example Opt out of specific features:\n * ```tsx\n * <SiteKitLayout engage={false} signal={false}>\n * {children}\n * </SiteKitLayout>\n * ```\n */\n\nimport * as React from 'react'\nimport { ManagedFavicon } from '../images/ManagedFavicon'\nimport { ManagedScripts } from '../seo/ManagedScripts'\nimport { SiteKitClientProviders } from './SiteKitClientProviders'\nimport type { AnalyticsConfig, EngageConfig, SignalConfig } from './types'\n\nexport interface SiteKitLayoutProps {\n children: React.ReactNode\n\n /** Portal API key. Defaults to SONOR_API_KEY env var. */\n apiKey?: string\n /** Portal API URL. Defaults to env or https://api.sonor.io */\n apiUrl?: string\n /** Project ID (for Engage chat room routing). Auto-resolved if not provided. */\n projectId?: string\n\n /** Analytics tracking. true (default) | false | config object */\n analytics?: boolean | AnalyticsConfig\n /** Engage widgets (popups, chat). true (default) | false | config object */\n engage?: boolean | EngageConfig\n /** Signal AI (experiments, behavior). false (default) | true | config object */\n signal?: boolean | SignalConfig\n /** SitemapSync client component. Default: true */\n sitemapSync?: boolean\n /** ManagedFavicon in <head>. Default: true */\n favicon?: boolean\n /** ManagedScripts (head + body-end). Default: true */\n managedScripts?: boolean\n\n /** Debug mode — logs to console. Default: false */\n debug?: boolean\n}\n\nexport async function SiteKitLayout({\n children,\n apiKey,\n apiUrl,\n projectId,\n analytics = true,\n engage = true,\n signal = false,\n sitemapSync = true,\n favicon = true,\n managedScripts = true,\n debug = false,\n}: SiteKitLayoutProps) {\n // Resolve API config from env (server-side, safe)\n const resolvedApiKey =\n apiKey ??\n process.env.SONOR_API_KEY ??\n process.env.UPTRADE_API_KEY ??\n process.env.NEXT_PUBLIC_UPTRADE_API_KEY ??\n ''\n const resolvedApiUrl =\n apiUrl ??\n process.env.SONOR_API_URL ??\n process.env.UPTRADE_API_URL ??\n process.env.NEXT_PUBLIC_UPTRADE_API_URL ??\n 'https://api.sonor.io'\n\n if (!resolvedApiKey && debug) {\n console.warn(\n '[SiteKitLayout] No API key found. Set SONOR_API_KEY (or UPTRADE_API_KEY).',\n )\n }\n\n return (\n <>\n {/* Server-rendered head components */}\n {favicon && <ManagedFavicon apiKey={resolvedApiKey} apiUrl={resolvedApiUrl} />}\n {managedScripts && <ManagedScripts position=\"head\" />}\n\n {/* Client-side providers island */}\n <SiteKitClientProviders\n apiKey={resolvedApiKey}\n apiUrl={resolvedApiUrl}\n projectId={projectId}\n analytics={analytics}\n engage={engage}\n signal={signal}\n sitemapSync={sitemapSync}\n debug={debug}\n >\n {children}\n </SiteKitClientProviders>\n\n {/* Server-rendered body-end scripts */}\n {managedScripts && <ManagedScripts position=\"body-end\" />}\n </>\n )\n}\n"]}
1
+ {"version":3,"sources":["../../src/layout/SiteKitLayout.tsx"],"names":["jsxs","Fragment","jsx","ManagedFavicon","ManagedScripts","SiteKitClientProviders"],"mappings":";;;;;;;;;AAoDA,SAAS,gBAAgB,MAAA,EAAwB;AAC/C,EAAA,IAAI;AACF,IAAA,OAAO,IAAI,GAAA,CAAI,MAAA,CAAO,QAAQ,KAAA,EAAO,EAAE,CAAC,CAAA,CAAE,MAAA;AAAA,EAC5C,CAAA,CAAA,MAAQ;AACN,IAAA,OAAO,sBAAA;AAAA,EACT;AACF;AA6BA,eAAsB,aAAA,CAAc;AAAA,EAClC,QAAA;AAAA,EACA,MAAA;AAAA,EACA,MAAA;AAAA,EACA,SAAA;AAAA,EACA,SAAA,GAAY,IAAA;AAAA,EACZ,MAAA,GAAS,IAAA;AAAA,EACT,MAAA,GAAS,KAAA;AAAA,EACT,WAAA,GAAc,IAAA;AAAA,EACd,OAAA,GAAU,IAAA;AAAA,EACV,cAAA,GAAiB,IAAA;AAAA,EACjB,KAAA,GAAQ;AACV,CAAA,EAAuB;AAErB,EAAA,MAAM,cAAA,GACJ,MAAA,IACA,OAAA,CAAQ,GAAA,CAAI,aAAA,IACZ,EAAA;AACF,EAAA,MAAM,cAAA,GACJ,MAAA,IACA,OAAA,CAAQ,GAAA,CAAI,aAAA,IACZ,sBAAA;AAEF,EAAA,IAAI,CAAC,kBAAkB,KAAA,EAAO;AAC5B,IAAA,OAAA,CAAQ,IAAA;AAAA,MACN;AAAA,KACF;AAAA,EACF;AAEA,EAAA,MAAM,SAAA,GAAY,gBAAgB,cAAc,CAAA;AAEhD,EAAA,uBACEA,eAAA,CAAAC,mBAAA,EAAA,EACE,QAAA,EAAA;AAAA,oBAAAC,cAAA,CAAC,UAAK,GAAA,EAAI,YAAA,EAAa,IAAA,EAAM,SAAA,EAAW,aAAY,WAAA,EAAY,CAAA;AAAA,oBAChEA,cAAA,CAAC,MAAA,EAAA,EAAK,GAAA,EAAI,cAAA,EAAe,MAAM,SAAA,EAAW,CAAA;AAAA,IAEzC,2BAAWA,cAAA,CAACC,+BAAA,EAAA,EAAe,MAAA,EAAQ,cAAA,EAAgB,QAAQ,cAAA,EAAgB,CAAA;AAAA,IAC3E,cAAA,oBAAkBD,cAAA,CAACE,+BAAA,EAAA,EAAe,QAAA,EAAS,MAAA,EAAO,CAAA;AAAA,oBAGnDF,cAAA;AAAA,MAACG,uCAAA;AAAA,MAAA;AAAA,QACC,MAAA,EAAQ,cAAA;AAAA,QACR,MAAA,EAAQ,cAAA;AAAA,QACR,SAAA;AAAA,QACA,SAAA;AAAA,QACA,MAAA;AAAA,QACA,MAAA;AAAA,QACA,WAAA;AAAA,QACA,KAAA;AAAA,QAEC;AAAA;AAAA,KACH;AAAA,IAGC,cAAA,oBAAkBH,cAAA,CAACE,+BAAA,EAAA,EAAe,QAAA,EAAS,UAAA,EAAW;AAAA,GAAA,EACzD,CAAA;AAEJ","file":"index.js","sourcesContent":["/**\n * @sonordev/site-kit/layout — SiteKitLayout\n *\n * The master layout component. A single RSC that auto-composes every\n * site-kit feature your layout needs:\n *\n * Server-side (RSC):\n * - ManagedFavicon (link tags from Portal logo)\n * - ManagedScripts position=\"head\" (tracking pixels, analytics tags)\n * - ManagedScripts position=\"body-end\"\n *\n * Client-side (island):\n * - AnalyticsProvider (page views, scroll depth, heatmap, web vitals)\n * - EngageWidget (popups, nudges, chat)\n * - SignalBridge (A/B experiments, behavior tracking)\n * - SitemapSync (keeps Portal seo_pages in sync)\n *\n * @example\n * ```tsx\n * // app/layout.tsx\n * import { SiteKitLayout } from '@sonordev/site-kit/layout'\n *\n * export default function RootLayout({ children }) {\n * return (\n * <html lang=\"en\">\n * <body>\n * <SiteKitLayout>\n * <Header />\n * <main>{children}</main>\n * <Footer />\n * </SiteKitLayout>\n * </body>\n * </html>\n * )\n * }\n * ```\n *\n * @example Opt out of specific features:\n * ```tsx\n * <SiteKitLayout engage={false} signal={false}>\n * {children}\n * </SiteKitLayout>\n * ```\n */\n\nimport * as React from 'react'\nimport { ManagedFavicon } from '../images/ManagedFavicon'\nimport { ManagedScripts } from '../seo/ManagedScripts'\nimport { SiteKitClientProviders } from './SiteKitClientProviders'\nimport type { AnalyticsConfig, EngageConfig, SignalConfig } from './types'\n\n/** Origin for Portal API preconnect (handles custom SONOR_API_URL in staging). */\nfunction portalApiOrigin(apiUrl: string): string {\n try {\n return new URL(apiUrl.replace(/\\/$/, '')).origin\n } catch {\n return 'https://api.sonor.io'\n }\n}\n\nexport interface SiteKitLayoutProps {\n children: React.ReactNode\n\n /** Portal API key. Defaults to SONOR_API_KEY env var. */\n apiKey?: string\n /** Portal API URL. Defaults to env or https://api.sonor.io */\n apiUrl?: string\n /** Project ID (for Engage chat room routing). Auto-resolved if not provided. */\n projectId?: string\n\n /** Analytics tracking. true (default) | false | config object */\n analytics?: boolean | AnalyticsConfig\n /** Engage widgets (popups, chat). true (default) | false | config object */\n engage?: boolean | EngageConfig\n /** Signal AI (experiments, behavior). false (default) | true | config object */\n signal?: boolean | SignalConfig\n /** SitemapSync client component. Default: true */\n sitemapSync?: boolean\n /** ManagedFavicon in <head>. Default: true */\n favicon?: boolean\n /** ManagedScripts (head + body-end). Default: true */\n managedScripts?: boolean\n\n /** Debug mode — logs to console. Default: false */\n debug?: boolean\n}\n\nexport async function SiteKitLayout({\n children,\n apiKey,\n apiUrl,\n projectId,\n analytics = true,\n engage = true,\n signal = false,\n sitemapSync = true,\n favicon = true,\n managedScripts = true,\n debug = false,\n}: SiteKitLayoutProps) {\n // Resolve API config from env (server-side, safe)\n const resolvedApiKey =\n apiKey ??\n process.env.SONOR_API_KEY ??\n ''\n const resolvedApiUrl =\n apiUrl ??\n process.env.SONOR_API_URL ??\n 'https://api.sonor.io'\n\n if (!resolvedApiKey && debug) {\n console.warn(\n '[SiteKitLayout] No API key found. Set SONOR_API_KEY.',\n )\n }\n\n const apiOrigin = portalApiOrigin(resolvedApiUrl)\n\n return (\n <>\n <link rel=\"preconnect\" href={apiOrigin} crossOrigin=\"anonymous\" />\n <link rel=\"dns-prefetch\" href={apiOrigin} />\n {/* Server-rendered head components */}\n {favicon && <ManagedFavicon apiKey={resolvedApiKey} apiUrl={resolvedApiUrl} />}\n {managedScripts && <ManagedScripts position=\"head\" />}\n\n {/* Client-side providers island */}\n <SiteKitClientProviders\n apiKey={resolvedApiKey}\n apiUrl={resolvedApiUrl}\n projectId={projectId}\n analytics={analytics}\n engage={engage}\n signal={signal}\n sitemapSync={sitemapSync}\n debug={debug}\n >\n {children}\n </SiteKitClientProviders>\n\n {/* Server-rendered body-end scripts */}\n {managedScripts && <ManagedScripts position=\"body-end\" />}\n </>\n )\n}\n"]}
@@ -1,10 +1,17 @@
1
- import { SiteKitClientProviders } from '../chunk-35MALWVX.mjs';
2
- import { ManagedFavicon } from '../chunk-N24BPFF6.mjs';
3
- import { ManagedScripts } from '../chunk-M5FLRLHI.mjs';
4
- import '../chunk-FMB2RZDH.mjs';
1
+ import { SiteKitClientProviders } from '../chunk-WN2PUL6B.mjs';
2
+ import { ManagedFavicon } from '../chunk-CU6OGBKK.mjs';
3
+ import { ManagedScripts } from '../chunk-OM6R7CDP.mjs';
4
+ import '../chunk-J4U3IEXL.mjs';
5
5
  import '../chunk-4XPGGLVP.mjs';
6
6
  import { jsxs, Fragment, jsx } from 'react/jsx-runtime';
7
7
 
8
+ function portalApiOrigin(apiUrl) {
9
+ try {
10
+ return new URL(apiUrl.replace(/\/$/, "")).origin;
11
+ } catch {
12
+ return "https://api.sonor.io";
13
+ }
14
+ }
8
15
  async function SiteKitLayout({
9
16
  children,
10
17
  apiKey,
@@ -18,14 +25,17 @@ async function SiteKitLayout({
18
25
  managedScripts = true,
19
26
  debug = false
20
27
  }) {
21
- const resolvedApiKey = apiKey ?? process.env.SONOR_API_KEY ?? process.env.UPTRADE_API_KEY ?? process.env.NEXT_PUBLIC_UPTRADE_API_KEY ?? "";
22
- const resolvedApiUrl = apiUrl ?? process.env.SONOR_API_URL ?? process.env.UPTRADE_API_URL ?? process.env.NEXT_PUBLIC_UPTRADE_API_URL ?? "https://api.sonor.io";
28
+ const resolvedApiKey = apiKey ?? process.env.SONOR_API_KEY ?? "";
29
+ const resolvedApiUrl = apiUrl ?? process.env.SONOR_API_URL ?? "https://api.sonor.io";
23
30
  if (!resolvedApiKey && debug) {
24
31
  console.warn(
25
- "[SiteKitLayout] No API key found. Set SONOR_API_KEY (or UPTRADE_API_KEY)."
32
+ "[SiteKitLayout] No API key found. Set SONOR_API_KEY."
26
33
  );
27
34
  }
35
+ const apiOrigin = portalApiOrigin(resolvedApiUrl);
28
36
  return /* @__PURE__ */ jsxs(Fragment, { children: [
37
+ /* @__PURE__ */ jsx("link", { rel: "preconnect", href: apiOrigin, crossOrigin: "anonymous" }),
38
+ /* @__PURE__ */ jsx("link", { rel: "dns-prefetch", href: apiOrigin }),
29
39
  favicon && /* @__PURE__ */ jsx(ManagedFavicon, { apiKey: resolvedApiKey, apiUrl: resolvedApiUrl }),
30
40
  managedScripts && /* @__PURE__ */ jsx(ManagedScripts, { position: "head" }),
31
41
  /* @__PURE__ */ jsx(
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/layout/SiteKitLayout.tsx"],"names":[],"mappings":";;;;;;;AA8EA,eAAsB,aAAA,CAAc;AAAA,EAClC,QAAA;AAAA,EACA,MAAA;AAAA,EACA,MAAA;AAAA,EACA,SAAA;AAAA,EACA,SAAA,GAAY,IAAA;AAAA,EACZ,MAAA,GAAS,IAAA;AAAA,EACT,MAAA,GAAS,KAAA;AAAA,EACT,WAAA,GAAc,IAAA;AAAA,EACd,OAAA,GAAU,IAAA;AAAA,EACV,cAAA,GAAiB,IAAA;AAAA,EACjB,KAAA,GAAQ;AACV,CAAA,EAAuB;AAErB,EAAA,MAAM,cAAA,GACJ,MAAA,IACA,OAAA,CAAQ,GAAA,CAAI,aAAA,IACZ,QAAQ,GAAA,CAAI,eAAA,IACZ,OAAA,CAAQ,GAAA,CAAI,2BAAA,IACZ,EAAA;AACF,EAAA,MAAM,cAAA,GACJ,MAAA,IACA,OAAA,CAAQ,GAAA,CAAI,aAAA,IACZ,QAAQ,GAAA,CAAI,eAAA,IACZ,OAAA,CAAQ,GAAA,CAAI,2BAAA,IACZ,sBAAA;AAEF,EAAA,IAAI,CAAC,kBAAkB,KAAA,EAAO;AAC5B,IAAA,OAAA,CAAQ,IAAA;AAAA,MACN;AAAA,KACF;AAAA,EACF;AAEA,EAAA,uBACE,IAAA,CAAA,QAAA,EAAA,EAEG,QAAA,EAAA;AAAA,IAAA,OAAA,oBAAW,GAAA,CAAC,cAAA,EAAA,EAAe,MAAA,EAAQ,cAAA,EAAgB,QAAQ,cAAA,EAAgB,CAAA;AAAA,IAC3E,cAAA,oBAAkB,GAAA,CAAC,cAAA,EAAA,EAAe,QAAA,EAAS,MAAA,EAAO,CAAA;AAAA,oBAGnD,GAAA;AAAA,MAAC,sBAAA;AAAA,MAAA;AAAA,QACC,MAAA,EAAQ,cAAA;AAAA,QACR,MAAA,EAAQ,cAAA;AAAA,QACR,SAAA;AAAA,QACA,SAAA;AAAA,QACA,MAAA;AAAA,QACA,MAAA;AAAA,QACA,WAAA;AAAA,QACA,KAAA;AAAA,QAEC;AAAA;AAAA,KACH;AAAA,IAGC,cAAA,oBAAkB,GAAA,CAAC,cAAA,EAAA,EAAe,QAAA,EAAS,UAAA,EAAW;AAAA,GAAA,EACzD,CAAA;AAEJ","file":"index.mjs","sourcesContent":["/**\n * @sonordev/site-kit/layout — SiteKitLayout\n *\n * The master layout component. A single RSC that auto-composes every\n * site-kit feature your layout needs:\n *\n * Server-side (RSC):\n * - ManagedFavicon (link tags from Portal logo)\n * - ManagedScripts position=\"head\" (tracking pixels, analytics tags)\n * - ManagedScripts position=\"body-end\"\n *\n * Client-side (island):\n * - AnalyticsProvider (page views, scroll depth, heatmap, web vitals)\n * - EngageWidget (popups, nudges, chat)\n * - SignalBridge (A/B experiments, behavior tracking)\n * - SitemapSync (keeps Portal seo_pages in sync)\n *\n * @example\n * ```tsx\n * // app/layout.tsx\n * import { SiteKitLayout } from '@sonordev/site-kit/layout'\n *\n * export default function RootLayout({ children }) {\n * return (\n * <html lang=\"en\">\n * <body>\n * <SiteKitLayout>\n * <Header />\n * <main>{children}</main>\n * <Footer />\n * </SiteKitLayout>\n * </body>\n * </html>\n * )\n * }\n * ```\n *\n * @example Opt out of specific features:\n * ```tsx\n * <SiteKitLayout engage={false} signal={false}>\n * {children}\n * </SiteKitLayout>\n * ```\n */\n\nimport * as React from 'react'\nimport { ManagedFavicon } from '../images/ManagedFavicon'\nimport { ManagedScripts } from '../seo/ManagedScripts'\nimport { SiteKitClientProviders } from './SiteKitClientProviders'\nimport type { AnalyticsConfig, EngageConfig, SignalConfig } from './types'\n\nexport interface SiteKitLayoutProps {\n children: React.ReactNode\n\n /** Portal API key. Defaults to SONOR_API_KEY env var. */\n apiKey?: string\n /** Portal API URL. Defaults to env or https://api.sonor.io */\n apiUrl?: string\n /** Project ID (for Engage chat room routing). Auto-resolved if not provided. */\n projectId?: string\n\n /** Analytics tracking. true (default) | false | config object */\n analytics?: boolean | AnalyticsConfig\n /** Engage widgets (popups, chat). true (default) | false | config object */\n engage?: boolean | EngageConfig\n /** Signal AI (experiments, behavior). false (default) | true | config object */\n signal?: boolean | SignalConfig\n /** SitemapSync client component. Default: true */\n sitemapSync?: boolean\n /** ManagedFavicon in <head>. Default: true */\n favicon?: boolean\n /** ManagedScripts (head + body-end). Default: true */\n managedScripts?: boolean\n\n /** Debug mode — logs to console. Default: false */\n debug?: boolean\n}\n\nexport async function SiteKitLayout({\n children,\n apiKey,\n apiUrl,\n projectId,\n analytics = true,\n engage = true,\n signal = false,\n sitemapSync = true,\n favicon = true,\n managedScripts = true,\n debug = false,\n}: SiteKitLayoutProps) {\n // Resolve API config from env (server-side, safe)\n const resolvedApiKey =\n apiKey ??\n process.env.SONOR_API_KEY ??\n process.env.UPTRADE_API_KEY ??\n process.env.NEXT_PUBLIC_UPTRADE_API_KEY ??\n ''\n const resolvedApiUrl =\n apiUrl ??\n process.env.SONOR_API_URL ??\n process.env.UPTRADE_API_URL ??\n process.env.NEXT_PUBLIC_UPTRADE_API_URL ??\n 'https://api.sonor.io'\n\n if (!resolvedApiKey && debug) {\n console.warn(\n '[SiteKitLayout] No API key found. Set SONOR_API_KEY (or UPTRADE_API_KEY).',\n )\n }\n\n return (\n <>\n {/* Server-rendered head components */}\n {favicon && <ManagedFavicon apiKey={resolvedApiKey} apiUrl={resolvedApiUrl} />}\n {managedScripts && <ManagedScripts position=\"head\" />}\n\n {/* Client-side providers island */}\n <SiteKitClientProviders\n apiKey={resolvedApiKey}\n apiUrl={resolvedApiUrl}\n projectId={projectId}\n analytics={analytics}\n engage={engage}\n signal={signal}\n sitemapSync={sitemapSync}\n debug={debug}\n >\n {children}\n </SiteKitClientProviders>\n\n {/* Server-rendered body-end scripts */}\n {managedScripts && <ManagedScripts position=\"body-end\" />}\n </>\n )\n}\n"]}
1
+ {"version":3,"sources":["../../src/layout/SiteKitLayout.tsx"],"names":[],"mappings":";;;;;;;AAoDA,SAAS,gBAAgB,MAAA,EAAwB;AAC/C,EAAA,IAAI;AACF,IAAA,OAAO,IAAI,GAAA,CAAI,MAAA,CAAO,QAAQ,KAAA,EAAO,EAAE,CAAC,CAAA,CAAE,MAAA;AAAA,EAC5C,CAAA,CAAA,MAAQ;AACN,IAAA,OAAO,sBAAA;AAAA,EACT;AACF;AA6BA,eAAsB,aAAA,CAAc;AAAA,EAClC,QAAA;AAAA,EACA,MAAA;AAAA,EACA,MAAA;AAAA,EACA,SAAA;AAAA,EACA,SAAA,GAAY,IAAA;AAAA,EACZ,MAAA,GAAS,IAAA;AAAA,EACT,MAAA,GAAS,KAAA;AAAA,EACT,WAAA,GAAc,IAAA;AAAA,EACd,OAAA,GAAU,IAAA;AAAA,EACV,cAAA,GAAiB,IAAA;AAAA,EACjB,KAAA,GAAQ;AACV,CAAA,EAAuB;AAErB,EAAA,MAAM,cAAA,GACJ,MAAA,IACA,OAAA,CAAQ,GAAA,CAAI,aAAA,IACZ,EAAA;AACF,EAAA,MAAM,cAAA,GACJ,MAAA,IACA,OAAA,CAAQ,GAAA,CAAI,aAAA,IACZ,sBAAA;AAEF,EAAA,IAAI,CAAC,kBAAkB,KAAA,EAAO;AAC5B,IAAA,OAAA,CAAQ,IAAA;AAAA,MACN;AAAA,KACF;AAAA,EACF;AAEA,EAAA,MAAM,SAAA,GAAY,gBAAgB,cAAc,CAAA;AAEhD,EAAA,uBACE,IAAA,CAAA,QAAA,EAAA,EACE,QAAA,EAAA;AAAA,oBAAA,GAAA,CAAC,UAAK,GAAA,EAAI,YAAA,EAAa,IAAA,EAAM,SAAA,EAAW,aAAY,WAAA,EAAY,CAAA;AAAA,oBAChE,GAAA,CAAC,MAAA,EAAA,EAAK,GAAA,EAAI,cAAA,EAAe,MAAM,SAAA,EAAW,CAAA;AAAA,IAEzC,2BAAW,GAAA,CAAC,cAAA,EAAA,EAAe,MAAA,EAAQ,cAAA,EAAgB,QAAQ,cAAA,EAAgB,CAAA;AAAA,IAC3E,cAAA,oBAAkB,GAAA,CAAC,cAAA,EAAA,EAAe,QAAA,EAAS,MAAA,EAAO,CAAA;AAAA,oBAGnD,GAAA;AAAA,MAAC,sBAAA;AAAA,MAAA;AAAA,QACC,MAAA,EAAQ,cAAA;AAAA,QACR,MAAA,EAAQ,cAAA;AAAA,QACR,SAAA;AAAA,QACA,SAAA;AAAA,QACA,MAAA;AAAA,QACA,MAAA;AAAA,QACA,WAAA;AAAA,QACA,KAAA;AAAA,QAEC;AAAA;AAAA,KACH;AAAA,IAGC,cAAA,oBAAkB,GAAA,CAAC,cAAA,EAAA,EAAe,QAAA,EAAS,UAAA,EAAW;AAAA,GAAA,EACzD,CAAA;AAEJ","file":"index.mjs","sourcesContent":["/**\n * @sonordev/site-kit/layout — SiteKitLayout\n *\n * The master layout component. A single RSC that auto-composes every\n * site-kit feature your layout needs:\n *\n * Server-side (RSC):\n * - ManagedFavicon (link tags from Portal logo)\n * - ManagedScripts position=\"head\" (tracking pixels, analytics tags)\n * - ManagedScripts position=\"body-end\"\n *\n * Client-side (island):\n * - AnalyticsProvider (page views, scroll depth, heatmap, web vitals)\n * - EngageWidget (popups, nudges, chat)\n * - SignalBridge (A/B experiments, behavior tracking)\n * - SitemapSync (keeps Portal seo_pages in sync)\n *\n * @example\n * ```tsx\n * // app/layout.tsx\n * import { SiteKitLayout } from '@sonordev/site-kit/layout'\n *\n * export default function RootLayout({ children }) {\n * return (\n * <html lang=\"en\">\n * <body>\n * <SiteKitLayout>\n * <Header />\n * <main>{children}</main>\n * <Footer />\n * </SiteKitLayout>\n * </body>\n * </html>\n * )\n * }\n * ```\n *\n * @example Opt out of specific features:\n * ```tsx\n * <SiteKitLayout engage={false} signal={false}>\n * {children}\n * </SiteKitLayout>\n * ```\n */\n\nimport * as React from 'react'\nimport { ManagedFavicon } from '../images/ManagedFavicon'\nimport { ManagedScripts } from '../seo/ManagedScripts'\nimport { SiteKitClientProviders } from './SiteKitClientProviders'\nimport type { AnalyticsConfig, EngageConfig, SignalConfig } from './types'\n\n/** Origin for Portal API preconnect (handles custom SONOR_API_URL in staging). */\nfunction portalApiOrigin(apiUrl: string): string {\n try {\n return new URL(apiUrl.replace(/\\/$/, '')).origin\n } catch {\n return 'https://api.sonor.io'\n }\n}\n\nexport interface SiteKitLayoutProps {\n children: React.ReactNode\n\n /** Portal API key. Defaults to SONOR_API_KEY env var. */\n apiKey?: string\n /** Portal API URL. Defaults to env or https://api.sonor.io */\n apiUrl?: string\n /** Project ID (for Engage chat room routing). Auto-resolved if not provided. */\n projectId?: string\n\n /** Analytics tracking. true (default) | false | config object */\n analytics?: boolean | AnalyticsConfig\n /** Engage widgets (popups, chat). true (default) | false | config object */\n engage?: boolean | EngageConfig\n /** Signal AI (experiments, behavior). false (default) | true | config object */\n signal?: boolean | SignalConfig\n /** SitemapSync client component. Default: true */\n sitemapSync?: boolean\n /** ManagedFavicon in <head>. Default: true */\n favicon?: boolean\n /** ManagedScripts (head + body-end). Default: true */\n managedScripts?: boolean\n\n /** Debug mode — logs to console. Default: false */\n debug?: boolean\n}\n\nexport async function SiteKitLayout({\n children,\n apiKey,\n apiUrl,\n projectId,\n analytics = true,\n engage = true,\n signal = false,\n sitemapSync = true,\n favicon = true,\n managedScripts = true,\n debug = false,\n}: SiteKitLayoutProps) {\n // Resolve API config from env (server-side, safe)\n const resolvedApiKey =\n apiKey ??\n process.env.SONOR_API_KEY ??\n ''\n const resolvedApiUrl =\n apiUrl ??\n process.env.SONOR_API_URL ??\n 'https://api.sonor.io'\n\n if (!resolvedApiKey && debug) {\n console.warn(\n '[SiteKitLayout] No API key found. Set SONOR_API_KEY.',\n )\n }\n\n const apiOrigin = portalApiOrigin(resolvedApiUrl)\n\n return (\n <>\n <link rel=\"preconnect\" href={apiOrigin} crossOrigin=\"anonymous\" />\n <link rel=\"dns-prefetch\" href={apiOrigin} />\n {/* Server-rendered head components */}\n {favicon && <ManagedFavicon apiKey={resolvedApiKey} apiUrl={resolvedApiUrl} />}\n {managedScripts && <ManagedScripts position=\"head\" />}\n\n {/* Client-side providers island */}\n <SiteKitClientProviders\n apiKey={resolvedApiKey}\n apiUrl={resolvedApiUrl}\n projectId={projectId}\n analytics={analytics}\n engage={engage}\n signal={signal}\n sitemapSync={sitemapSync}\n debug={debug}\n >\n {children}\n </SiteKitClientProviders>\n\n {/* Server-rendered body-end scripts */}\n {managedScripts && <ManagedScripts position=\"body-end\" />}\n </>\n )\n}\n"]}
@@ -23,7 +23,7 @@ import * as React from 'react';
23
23
  *
24
24
  * export async function GET() {
25
25
  * const { markdown } = await generateLLMsTxt({
26
- * projectId: process.env.UPTRADE_PROJECT_ID!
26
+ * projectId: process.env.SONOR_API_KEY!
27
27
  * })
28
28
  *
29
29
  * return new Response(markdown, {
@@ -52,7 +52,7 @@ interface LLMsTxtHandlerOptions extends GenerateLLMSTxtOptions {
52
52
  /**
53
53
  * Create a route handler for /llms.txt
54
54
  *
55
- * Zero-config by default - uses NEXT_PUBLIC_UPTRADE_API_KEY from environment.
55
+ * Zero-config by default - uses SONOR_API_KEY from environment.
56
56
  *
57
57
  * @example
58
58
  * ```ts
@@ -75,7 +75,7 @@ declare function createLLMsTxtHandler(options?: LLMsTxtHandlerOptions): () => Pr
75
75
  /**
76
76
  * Create a route handler for /llms-full.txt
77
77
  *
78
- * Zero-config by default - uses NEXT_PUBLIC_UPTRADE_API_KEY from environment.
78
+ * Zero-config by default - uses SONOR_API_KEY from environment.
79
79
  *
80
80
  * @example
81
81
  * ```ts
@@ -23,7 +23,7 @@ import * as React from 'react';
23
23
  *
24
24
  * export async function GET() {
25
25
  * const { markdown } = await generateLLMsTxt({
26
- * projectId: process.env.UPTRADE_PROJECT_ID!
26
+ * projectId: process.env.SONOR_API_KEY!
27
27
  * })
28
28
  *
29
29
  * return new Response(markdown, {
@@ -52,7 +52,7 @@ interface LLMsTxtHandlerOptions extends GenerateLLMSTxtOptions {
52
52
  /**
53
53
  * Create a route handler for /llms.txt
54
54
  *
55
- * Zero-config by default - uses NEXT_PUBLIC_UPTRADE_API_KEY from environment.
55
+ * Zero-config by default - uses SONOR_API_KEY from environment.
56
56
  *
57
57
  * @example
58
58
  * ```ts
@@ -75,7 +75,7 @@ declare function createLLMsTxtHandler(options?: LLMsTxtHandlerOptions): () => Pr
75
75
  /**
76
76
  * Create a route handler for /llms-full.txt
77
77
  *
78
- * Zero-config by default - uses NEXT_PUBLIC_UPTRADE_API_KEY from environment.
78
+ * Zero-config by default - uses SONOR_API_KEY from environment.
79
79
  *
80
80
  * @example
81
81
  * ```ts