@sonordev/site-kit 6.1.3 → 6.3.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 (260) hide show
  1. package/agent-manifest.json +7 -1
  2. package/dist/{AnalyticsProvider-QK6XBDEJ.js → AnalyticsProvider-JKWJGIH2.js} +10 -10
  3. package/dist/{AnalyticsProvider-QK6XBDEJ.js.map → AnalyticsProvider-JKWJGIH2.js.map} +1 -1
  4. package/dist/{AnalyticsProvider-TIJWTISP.mjs → AnalyticsProvider-T4UBUUV4.mjs} +6 -6
  5. package/dist/{AnalyticsProvider-TIJWTISP.mjs.map → AnalyticsProvider-T4UBUUV4.mjs.map} +1 -1
  6. package/dist/{ArticleViewTracker-I66RBWDK.mjs → ArticleViewTracker-AYYSXNJS.mjs} +5 -5
  7. package/dist/{ArticleViewTracker-I66RBWDK.mjs.map → ArticleViewTracker-AYYSXNJS.mjs.map} +1 -1
  8. package/dist/{ArticleViewTracker-ALE672ZR.js → ArticleViewTracker-F5IP734Z.js} +6 -6
  9. package/dist/{ArticleViewTracker-ALE672ZR.js.map → ArticleViewTracker-F5IP734Z.js.map} +1 -1
  10. package/dist/ChatWidget-3RVBHZCS.mjs +17 -0
  11. package/dist/{ChatWidget-LNOY4TUZ.mjs.map → ChatWidget-3RVBHZCS.mjs.map} +1 -1
  12. package/dist/ChatWidget-RFSI2XNU.js +34 -0
  13. package/dist/{ChatWidget-566CQUN6.js.map → ChatWidget-RFSI2XNU.js.map} +1 -1
  14. package/dist/EngageWidget-QO5S6YV5.js +21 -0
  15. package/dist/{EngageWidget-DF47YUHQ.js.map → EngageWidget-QO5S6YV5.js.map} +1 -1
  16. package/dist/EngageWidget-TE6S5KYT.mjs +12 -0
  17. package/dist/{EngageWidget-IGF7SC3R.mjs.map → EngageWidget-TE6S5KYT.mjs.map} +1 -1
  18. package/dist/{FileField-IK6E5IOC.js → FileField-JQSRKWXW.js} +6 -6
  19. package/dist/{FileField-IK6E5IOC.js.map → FileField-JQSRKWXW.js.map} +1 -1
  20. package/dist/{FileField-AG63W2BC.mjs → FileField-OXZXB3UW.mjs} +5 -5
  21. package/dist/{FileField-AG63W2BC.mjs.map → FileField-OXZXB3UW.mjs.map} +1 -1
  22. package/dist/{FormSpotlight-6MUDJWW5.js → FormSpotlight-H2A3JIFI.js} +9 -9
  23. package/dist/{FormSpotlight-6MUDJWW5.js.map → FormSpotlight-H2A3JIFI.js.map} +1 -1
  24. package/dist/{FormSpotlight-H7V4GBXG.mjs → FormSpotlight-PZ5RLZRV.mjs} +3 -3
  25. package/dist/{FormSpotlight-H7V4GBXG.mjs.map → FormSpotlight-PZ5RLZRV.mjs.map} +1 -1
  26. package/dist/{FormStage-ACETL7SD.mjs → FormStage-CIHL7OBA.mjs} +3 -3
  27. package/dist/{FormStage-ACETL7SD.mjs.map → FormStage-CIHL7OBA.mjs.map} +1 -1
  28. package/dist/{FormStage-ZXZRZ2LS.js → FormStage-ZA2FABYQ.js} +9 -9
  29. package/dist/{FormStage-ZXZRZ2LS.js.map → FormStage-ZA2FABYQ.js.map} +1 -1
  30. package/dist/ManagedForm-BVLS2QZR.js +25 -0
  31. package/dist/{ManagedForm-4U54NPW2.js.map → ManagedForm-BVLS2QZR.js.map} +1 -1
  32. package/dist/ManagedForm-PTCWSTC5.mjs +16 -0
  33. package/dist/{ManagedForm-MOBWSG4D.mjs.map → ManagedForm-PTCWSTC5.mjs.map} +1 -1
  34. package/dist/{ManagedNewsletterForm-5LBGBE2F.js → ManagedNewsletterForm-IB5VD43M.js} +8 -8
  35. package/dist/{ManagedNewsletterForm-5LBGBE2F.js.map → ManagedNewsletterForm-IB5VD43M.js.map} +1 -1
  36. package/dist/{ManagedNewsletterForm-OV3OEMUP.mjs → ManagedNewsletterForm-WMCRFDL7.mjs} +7 -7
  37. package/dist/{ManagedNewsletterForm-OV3OEMUP.mjs.map → ManagedNewsletterForm-WMCRFDL7.mjs.map} +1 -1
  38. package/dist/{SignalCore-QCVR7TZV.js → SignalCore-Q57NY7EG.js} +11 -11
  39. package/dist/{SignalCore-QCVR7TZV.js.map → SignalCore-Q57NY7EG.js.map} +1 -1
  40. package/dist/{SignalCore-XM2MHEGR.mjs → SignalCore-R44AWPYN.mjs} +5 -5
  41. package/dist/{SignalCore-XM2MHEGR.mjs.map → SignalCore-R44AWPYN.mjs.map} +1 -1
  42. package/dist/SitemapSync-NICUUMQF.mjs +9 -0
  43. package/dist/{SitemapSync-74EVNOFQ.mjs.map → SitemapSync-NICUUMQF.mjs.map} +1 -1
  44. package/dist/SitemapSync-ZP4PKZZ3.js +18 -0
  45. package/dist/{SitemapSync-BQFZAE3X.js.map → SitemapSync-ZP4PKZZ3.js.map} +1 -1
  46. package/dist/admin-auth/index.d.ts +109 -0
  47. package/dist/admin-auth/index.d.ts.map +1 -0
  48. package/dist/admin-auth/index.js +0 -0
  49. package/dist/admin-auth/index.js.map +1 -0
  50. package/dist/admin-auth/index.mjs +0 -0
  51. package/dist/admin-auth/index.mjs.map +1 -0
  52. package/dist/admin-auth/session.d.ts +32 -0
  53. package/dist/admin-auth/session.d.ts.map +1 -0
  54. package/dist/analytics/index.js +9 -9
  55. package/dist/analytics/index.mjs +4 -4
  56. package/dist/articles/index.js +1 -1
  57. package/dist/articles/index.mjs +1 -1
  58. package/dist/articles/server-ui.js +1 -1
  59. package/dist/articles/server-ui.mjs +1 -1
  60. package/dist/{chunk-YK7SEUFJ.mjs → chunk-22MXW53O.mjs} +4 -4
  61. package/dist/{chunk-YK7SEUFJ.mjs.map → chunk-22MXW53O.mjs.map} +1 -1
  62. package/dist/{chunk-I7KIVKVW.js → chunk-2JZFTPPE.js} +3 -3
  63. package/dist/{chunk-I7KIVKVW.js.map → chunk-2JZFTPPE.js.map} +1 -1
  64. package/dist/{chunk-BGBP4UN4.js → chunk-4BQQGOHC.js} +4 -4
  65. package/dist/{chunk-BGBP4UN4.js.map → chunk-4BQQGOHC.js.map} +1 -1
  66. package/dist/{chunk-LXBPTKYT.mjs → chunk-5XLPWHQC.mjs} +4 -4
  67. package/dist/{chunk-LXBPTKYT.mjs.map → chunk-5XLPWHQC.mjs.map} +1 -1
  68. package/dist/{chunk-TIFVAASU.mjs → chunk-5YA6SI4Z.mjs} +2 -2
  69. package/dist/{chunk-CTAYH725.js → chunk-6AAT724D.js} +11 -11
  70. package/dist/{chunk-CTAYH725.js.map → chunk-6AAT724D.js.map} +1 -1
  71. package/dist/{chunk-AGEE4CGH.js → chunk-6AIXHYFO.js} +5 -5
  72. package/dist/{chunk-AGEE4CGH.js.map → chunk-6AIXHYFO.js.map} +1 -1
  73. package/dist/{chunk-I4PUQYBI.mjs → chunk-6SH6HLWS.mjs} +3 -3
  74. package/dist/{chunk-I4PUQYBI.mjs.map → chunk-6SH6HLWS.mjs.map} +1 -1
  75. package/dist/{chunk-S6CMQTVZ.js → chunk-72WO3AE5.js} +5 -5
  76. package/dist/{chunk-S6CMQTVZ.js.map → chunk-72WO3AE5.js.map} +1 -1
  77. package/dist/{chunk-AEW7EFYU.js → chunk-AEN7EL6N.js} +20 -6
  78. package/dist/chunk-AEN7EL6N.js.map +1 -0
  79. package/dist/{chunk-5IQOPL7T.mjs → chunk-BSTV3T6P.mjs} +3 -3
  80. package/dist/{chunk-5IQOPL7T.mjs.map → chunk-BSTV3T6P.mjs.map} +1 -1
  81. package/dist/{chunk-2SLA2LOD.js → chunk-C3MRX7NL.js} +12 -12
  82. package/dist/{chunk-2SLA2LOD.js.map → chunk-C3MRX7NL.js.map} +1 -1
  83. package/dist/{chunk-D5KKVWZK.mjs → chunk-CBZJNMYS.mjs} +3 -3
  84. package/dist/{chunk-D5KKVWZK.mjs.map → chunk-CBZJNMYS.mjs.map} +1 -1
  85. package/dist/chunk-COCYQHK3.mjs +6 -0
  86. package/dist/{chunk-5FBALULE.mjs.map → chunk-COCYQHK3.mjs.map} +1 -1
  87. package/dist/{chunk-PTQHPWEK.mjs → chunk-DFAW62AX.mjs} +151 -165
  88. package/dist/chunk-DFAW62AX.mjs.map +1 -0
  89. package/dist/{chunk-NRT7MOEO.mjs → chunk-DN6BLVU7.mjs} +4 -4
  90. package/dist/{chunk-NRT7MOEO.mjs.map → chunk-DN6BLVU7.mjs.map} +1 -1
  91. package/dist/{chunk-IUNFAKOS.mjs → chunk-ED5GOAF6.mjs} +3 -3
  92. package/dist/{chunk-IUNFAKOS.mjs.map → chunk-ED5GOAF6.mjs.map} +1 -1
  93. package/dist/{chunk-IZRVSIOK.js → chunk-F4DZDIR4.js} +4 -4
  94. package/dist/{chunk-IZRVSIOK.js.map → chunk-F4DZDIR4.js.map} +1 -1
  95. package/dist/{chunk-VDGCZVUF.js → chunk-FFE6P6PQ.js} +14 -14
  96. package/dist/{chunk-VDGCZVUF.js.map → chunk-FFE6P6PQ.js.map} +1 -1
  97. package/dist/{chunk-RQG7I6O4.js → chunk-GBOSAWBR.js} +4 -4
  98. package/dist/{chunk-RQG7I6O4.js.map → chunk-GBOSAWBR.js.map} +1 -1
  99. package/dist/{chunk-DVZ4BMXX.mjs → chunk-HQCWWQAI.mjs} +7 -7
  100. package/dist/{chunk-DVZ4BMXX.mjs.map → chunk-HQCWWQAI.mjs.map} +1 -1
  101. package/dist/{chunk-KDLN2MR5.js → chunk-I5XK32OJ.js} +18 -18
  102. package/dist/{chunk-KDLN2MR5.js.map → chunk-I5XK32OJ.js.map} +1 -1
  103. package/dist/{chunk-XXSSUCJB.js → chunk-I7AZC5ZQ.js} +2 -2
  104. package/dist/{chunk-RGXYE2ZI.mjs → chunk-IHG7W5JH.mjs} +4 -4
  105. package/dist/{chunk-RGXYE2ZI.mjs.map → chunk-IHG7W5JH.mjs.map} +1 -1
  106. package/dist/chunk-IMWON7OV.mjs +27 -0
  107. package/dist/chunk-IMWON7OV.mjs.map +1 -0
  108. package/dist/{chunk-KEEZX6Q4.js → chunk-JCBENABK.js} +3 -3
  109. package/dist/{chunk-KEEZX6Q4.js.map → chunk-JCBENABK.js.map} +1 -1
  110. package/dist/chunk-JLIL5EFG.js +8 -0
  111. package/dist/{chunk-OI3FCJSP.js.map → chunk-JLIL5EFG.js.map} +1 -1
  112. package/dist/{chunk-7K6L33BX.mjs → chunk-JOYMIGR2.mjs} +22 -22
  113. package/dist/{chunk-ATPQ6264.js → chunk-JS75ORH7.js} +24 -24
  114. package/dist/{chunk-3MLVI5DH.mjs → chunk-KLKUI3US.mjs} +3 -3
  115. package/dist/{chunk-3MLVI5DH.mjs.map → chunk-KLKUI3US.mjs.map} +1 -1
  116. package/dist/{chunk-XCOMBHLF.js → chunk-L6XXUNJB.js} +8 -8
  117. package/dist/{chunk-XCOMBHLF.js.map → chunk-L6XXUNJB.js.map} +1 -1
  118. package/dist/{chunk-OZTVJSFX.js → chunk-LIWPIG7U.js} +160 -172
  119. package/dist/chunk-LIWPIG7U.js.map +1 -0
  120. package/dist/{chunk-OWEJXMKY.mjs → chunk-M436JMD4.mjs} +3 -3
  121. package/dist/{chunk-OWEJXMKY.mjs.map → chunk-M436JMD4.mjs.map} +1 -1
  122. package/dist/{chunk-EVETX2XF.mjs → chunk-NCURAYKL.mjs} +4 -4
  123. package/dist/{chunk-EVETX2XF.mjs.map → chunk-NCURAYKL.mjs.map} +1 -1
  124. package/dist/{chunk-ZUQSVCMD.js → chunk-NN2YE5WT.js} +3 -3
  125. package/dist/{chunk-RH4XEXTK.mjs → chunk-NNZDWY3L.mjs} +3 -3
  126. package/dist/{chunk-5OUOVPXC.js → chunk-OMYR2ORG.js} +8 -8
  127. package/dist/{chunk-5OUOVPXC.js.map → chunk-OMYR2ORG.js.map} +1 -1
  128. package/dist/{chunk-JSM4AYSZ.js → chunk-OZLYJSFE.js} +14 -14
  129. package/dist/{chunk-JSM4AYSZ.js.map → chunk-OZLYJSFE.js.map} +1 -1
  130. package/dist/{chunk-ESPOINPT.mjs → chunk-P2VWGMQU.mjs} +3 -3
  131. package/dist/{chunk-ESPOINPT.mjs.map → chunk-P2VWGMQU.mjs.map} +1 -1
  132. package/dist/{chunk-7VRK3DWU.js → chunk-P35JIP3J.js} +6 -6
  133. package/dist/{chunk-7VRK3DWU.js.map → chunk-P35JIP3J.js.map} +1 -1
  134. package/dist/{chunk-IWHAJBYL.js → chunk-PXN7LIYZ.js} +15 -15
  135. package/dist/{chunk-IWHAJBYL.js.map → chunk-PXN7LIYZ.js.map} +1 -1
  136. package/dist/{chunk-GYKFHQSZ.mjs → chunk-QSCE66KQ.mjs} +3 -3
  137. package/dist/{chunk-GYKFHQSZ.mjs.map → chunk-QSCE66KQ.mjs.map} +1 -1
  138. package/dist/{chunk-QSN2QST7.mjs → chunk-QUMXVJ2C.mjs} +3 -3
  139. package/dist/{chunk-QSN2QST7.mjs.map → chunk-QUMXVJ2C.mjs.map} +1 -1
  140. package/dist/{chunk-6FIIA6ME.mjs → chunk-RB53MKRX.mjs} +4 -4
  141. package/dist/{chunk-6FIIA6ME.mjs.map → chunk-RB53MKRX.mjs.map} +1 -1
  142. package/dist/{chunk-JAA42HR7.js → chunk-RDKICSVU.js} +7 -7
  143. package/dist/{chunk-JAA42HR7.js.map → chunk-RDKICSVU.js.map} +1 -1
  144. package/dist/{chunk-EXVHO3CZ.mjs → chunk-REGHZJQF.mjs} +3 -3
  145. package/dist/{chunk-EXVHO3CZ.mjs.map → chunk-REGHZJQF.mjs.map} +1 -1
  146. package/dist/{chunk-MTHMOXZF.js → chunk-RNEPZD2I.js} +6 -6
  147. package/dist/{chunk-MTHMOXZF.js.map → chunk-RNEPZD2I.js.map} +1 -1
  148. package/dist/{chunk-CI7T4ZRP.mjs → chunk-RSP6RDR2.mjs} +4 -4
  149. package/dist/{chunk-CI7T4ZRP.mjs.map → chunk-RSP6RDR2.mjs.map} +1 -1
  150. package/dist/{chunk-MLXUMVBK.mjs → chunk-UCMMIGC6.mjs} +20 -6
  151. package/dist/chunk-UCMMIGC6.mjs.map +1 -0
  152. package/dist/{chunk-MQEVQ5YB.js → chunk-UJFRMHUN.js} +3 -3
  153. package/dist/{chunk-MQEVQ5YB.js.map → chunk-UJFRMHUN.js.map} +1 -1
  154. package/dist/{chunk-3RISRHOK.mjs → chunk-W7HSYABM.mjs} +8 -8
  155. package/dist/{chunk-3RISRHOK.mjs.map → chunk-W7HSYABM.mjs.map} +1 -1
  156. package/dist/{chunk-OUP6UL74.mjs → chunk-X5WJ5XPZ.mjs} +3 -3
  157. package/dist/{chunk-OUP6UL74.mjs.map → chunk-X5WJ5XPZ.mjs.map} +1 -1
  158. package/dist/{chunk-P4J3WG6C.js → chunk-XRUKYQ43.js} +4 -4
  159. package/dist/{chunk-P4J3WG6C.js.map → chunk-XRUKYQ43.js.map} +1 -1
  160. package/dist/{chunk-YEHC7VMW.mjs → chunk-YZCRYK5M.mjs} +3 -3
  161. package/dist/{chunk-YEHC7VMW.mjs.map → chunk-YZCRYK5M.mjs.map} +1 -1
  162. package/dist/chunk-YZJ22HUQ.js +29 -0
  163. package/dist/chunk-YZJ22HUQ.js.map +1 -0
  164. package/dist/{chunk-EVKP4SOM.js → chunk-ZKM6ELMZ.js} +10 -10
  165. package/dist/{chunk-EVKP4SOM.js.map → chunk-ZKM6ELMZ.js.map} +1 -1
  166. package/dist/cli/index.js +211 -211
  167. package/dist/cli/index.mjs +151 -151
  168. package/dist/client/index.js +4 -4
  169. package/dist/client/index.mjs +3 -3
  170. package/dist/commerce/index.js +57 -57
  171. package/dist/commerce/index.mjs +5 -5
  172. package/dist/engage/ChatWidget.d.ts +61 -1
  173. package/dist/engage/ChatWidget.d.ts.map +1 -1
  174. package/dist/engage/chat-messages.d.ts +86 -0
  175. package/dist/engage/chat-messages.d.ts.map +1 -0
  176. package/dist/engage/index.js +10 -10
  177. package/dist/engage/index.mjs +7 -7
  178. package/dist/fleet/index.js +8 -8
  179. package/dist/fleet/index.mjs +4 -4
  180. package/dist/forms/index.js +16 -16
  181. package/dist/forms/index.mjs +9 -9
  182. package/dist/forms/server.js +10 -10
  183. package/dist/forms/server.mjs +8 -8
  184. package/dist/forms/static.js +7 -7
  185. package/dist/forms/static.mjs +6 -6
  186. package/dist/images/index.js +11 -11
  187. package/dist/images/index.mjs +4 -4
  188. package/dist/index.js +63 -63
  189. package/dist/index.mjs +9 -9
  190. package/dist/layout/client.js +8 -8
  191. package/dist/layout/client.mjs +7 -7
  192. package/dist/layout/index.js +10 -10
  193. package/dist/layout/index.mjs +8 -8
  194. package/dist/{lib-6GWWPDJR.js → lib-6HOOMENJ.js} +7 -7
  195. package/dist/{lib-WFB5RLEQ.js → lib-BGAWCSUH.js} +8 -8
  196. package/dist/{lib-N5PD6JNJ.mjs → lib-R7IQ4ZHE.mjs} +2 -2
  197. package/dist/lib-RSDMEKDQ.mjs +4 -0
  198. package/dist/maps/index.js +5 -5
  199. package/dist/maps/index.mjs +3 -3
  200. package/dist/motion/CountUp.d.ts +49 -0
  201. package/dist/motion/CountUp.d.ts.map +1 -0
  202. package/dist/motion/Parallax.d.ts +14 -0
  203. package/dist/motion/Parallax.d.ts.map +1 -1
  204. package/dist/motion/ScrollScene.d.ts +1 -1
  205. package/dist/motion/ScrollScene.d.ts.map +1 -1
  206. package/dist/motion/engine.d.ts +19 -0
  207. package/dist/motion/engine.d.ts.map +1 -1
  208. package/dist/motion/gsap.d.ts +55 -6
  209. package/dist/motion/gsap.d.ts.map +1 -1
  210. package/dist/motion/gsap.js +101 -4
  211. package/dist/motion/gsap.js.map +1 -1
  212. package/dist/motion/gsap.mjs +96 -3
  213. package/dist/motion/gsap.mjs.map +1 -1
  214. package/dist/motion/index.d.ts +1 -1
  215. package/dist/motion/index.d.ts.map +1 -1
  216. package/dist/motion/index.js +21 -40
  217. package/dist/motion/index.js.map +1 -1
  218. package/dist/motion/index.mjs +11 -32
  219. package/dist/motion/index.mjs.map +1 -1
  220. package/dist/motion/three.js +5 -5
  221. package/dist/motion/three.mjs +1 -1
  222. package/dist/search/index.js +4 -4
  223. package/dist/search/index.mjs +3 -3
  224. package/dist/seo/client.js +5 -5
  225. package/dist/seo/client.mjs +4 -4
  226. package/dist/seo/index.js +5 -5
  227. package/dist/seo/index.mjs +4 -4
  228. package/dist/seo/register-sitemap-cli.js +2 -2
  229. package/dist/seo/register-sitemap-cli.mjs +1 -1
  230. package/dist/server/index.js +3 -3
  231. package/dist/server/index.mjs +2 -2
  232. package/dist/shared/build-entries.d.ts +1 -0
  233. package/dist/shared/build-entries.d.ts.map +1 -1
  234. package/dist/shared/version.d.ts +1 -1
  235. package/dist/signal/index.js +11 -11
  236. package/dist/signal/index.mjs +2 -2
  237. package/dist/sync/index.js +17 -17
  238. package/dist/sync/index.mjs +4 -4
  239. package/dist/{web-vitals.attribution-CHXXWO72.mjs → web-vitals.attribution-7LKLZ5GR.mjs} +3 -3
  240. package/dist/web-vitals.attribution-7LKLZ5GR.mjs.map +1 -0
  241. package/dist/{web-vitals.attribution-SQVZNHN3.js → web-vitals.attribution-ONVYQNRB.js} +3 -3
  242. package/dist/web-vitals.attribution-ONVYQNRB.js.map +1 -0
  243. package/package.json +6 -1
  244. package/dist/ChatWidget-566CQUN6.js +0 -26
  245. package/dist/ChatWidget-LNOY4TUZ.mjs +0 -17
  246. package/dist/EngageWidget-DF47YUHQ.js +0 -21
  247. package/dist/EngageWidget-IGF7SC3R.mjs +0 -12
  248. package/dist/ManagedForm-4U54NPW2.js +0 -25
  249. package/dist/ManagedForm-MOBWSG4D.mjs +0 -16
  250. package/dist/SitemapSync-74EVNOFQ.mjs +0 -9
  251. package/dist/SitemapSync-BQFZAE3X.js +0 -18
  252. package/dist/chunk-5FBALULE.mjs +0 -6
  253. package/dist/chunk-AEW7EFYU.js.map +0 -1
  254. package/dist/chunk-MLXUMVBK.mjs.map +0 -1
  255. package/dist/chunk-OI3FCJSP.js +0 -8
  256. package/dist/chunk-OZTVJSFX.js.map +0 -1
  257. package/dist/chunk-PTQHPWEK.mjs.map +0 -1
  258. package/dist/lib-BD4KKQBI.mjs +0 -4
  259. package/dist/web-vitals.attribution-CHXXWO72.mjs.map +0 -1
  260. package/dist/web-vitals.attribution-SQVZNHN3.js.map +0 -1
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/fleet/heartbeat.ts","../src/fleet/FleetHeartbeat.tsx"],"names":[],"mappings":"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","file":"chunk-EVETX2XF.mjs","sourcesContent":["/**\n * @sonordev/site-kit/fleet — heartbeat sender (single source of truth for the POST)\n *\n * One place that turns fleet inputs into a validated payload and ships it to\n * `/api/public/fleet/heartbeat`. Used by BOTH the client component\n * (FleetHeartbeat) and any build-time caller, so the send path never forks.\n *\n * It routes through the shared analytics send gate and `sonorFetch`, which stamps\n * the x-sitekit-version header, attaches x-api-key, and honors the auth\n * circuit breaker — a site on a stale/canceled key will not spam the API.\n */\n\nimport { resolveAnalyticsTarget, type AnalyticsGateOptions } from '../shared/reporting-gate'\nimport { sonorFetch } from '../shared/sonorFetch'\nimport { SITE_KIT_VERSION } from '../shared/version'\nimport {\n buildFleetHeartbeatPayload,\n sanitizeFleetVersion,\n type FleetHeartbeatPayload,\n type FleetHeartbeatSource,\n type FleetModule,\n} from './contract'\n\n/** Canonical ingest path — resolved against the site's Sonor API origin. */\nexport const FLEET_HEARTBEAT_PATH = '/api/public/fleet/heartbeat'\n\nexport interface SendFleetHeartbeatOptions extends AnalyticsGateOptions {\n /** Sonor API origin (e.g. https://api.sonor.io). Trailing slash tolerated. */\n apiUrl: string\n /** Project API key — scopes the request; the project is resolved server-side. */\n apiKey: string\n /** Client-observable active modules (validated/deduped by the contract). */\n modules?: FleetModule[] | string[]\n /** Normalized host for the multi-site sub-dimension (server re-normalizes). */\n site?: string | null\n /** Installed Next.js version, if the caller can resolve it. */\n nextVersion?: string | null\n /** 'client' (runtime boot) or 'build' (CI). Default 'client'. */\n source?: FleetHeartbeatSource\n /** Override the reported kit version. Defaults to the runtime SITE_KIT_VERSION. */\n kitVersion?: string\n /** Log one info line with the result. Never logs at error level. */\n debug?: boolean\n}\n\n/**\n * Best-effort runtime detection of the host Next.js version. Unreliable by\n * design — Next does not expose its version consistently across app/pages\n * router — so it returns null unless a site injects `__SITE_KIT_NEXT_VERSION__`\n * or `window.next.version` is present. Build-time callers should pass\n * `nextVersion` explicitly (resolvable from `next/package.json`).\n */\nexport function detectNextVersion(): string | null {\n if (typeof window === 'undefined') return null\n const w = window as unknown as {\n __SITE_KIT_NEXT_VERSION__?: string\n next?: { version?: string }\n }\n return sanitizeFleetVersion(w.__SITE_KIT_NEXT_VERSION__ ?? w.next?.version ?? null)\n}\n\n/**\n * Fire one heartbeat. Fire-and-forget by contract: it never throws — a\n * telemetry POST must never break a visitor's page or a site's build. Returns\n * true only when the POST was accepted (2xx).\n */\nexport async function sendFleetHeartbeat(opts: SendFleetHeartbeatOptions): Promise<boolean> {\n const { apiUrl, apiKey } = opts\n if (!apiUrl || !apiKey) return false\n const target = resolveAnalyticsTarget(opts)\n if (!target) return false\n\n const payload: FleetHeartbeatPayload = buildFleetHeartbeatPayload({\n kitVersion: opts.kitVersion || SITE_KIT_VERSION,\n nextVersion: opts.nextVersion,\n modules: opts.modules,\n site: opts.site,\n source: opts.source,\n })\n\n try {\n const res = await sonorFetch(\n `${target.apiUrl.replace(/\\/$/, '')}${FLEET_HEARTBEAT_PATH}`,\n {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify(payload),\n },\n { apiKey: target.apiKey, retries: 0 },\n )\n if (opts.debug) {\n // info, never error: a visitor's console must stay clean (Lighthouse).\n console.info(\n `[Sonor fleet] heartbeat ${res.status} v${payload.kit_version} [${payload.modules.join(',') || 'none'}]`,\n )\n }\n return res.ok\n } catch (err) {\n if (opts.debug) console.info('[Sonor fleet] heartbeat skipped (network)', err)\n return false\n }\n}\n","/**\n * @sonordev/site-kit/fleet — FleetHeartbeat\n *\n * A childless, effect-only client component that reports this site's build\n * fingerprint (kit version, Next.js version, active modules, host) to Sonor\n * exactly once per browser session. It exists so the platform can answer\n * \"which version / modules / key state is each site running\" without shelling\n * into every client repo.\n *\n * It is mounted as a deferred, CHILDLESS SIBLING — never a wrapper — by\n * SiteKitClientProviders, behind the same idle/first-interaction gate as\n * Analytics and Engage, so it never enters the critical hydration path (see\n * CLAUDE.md \"the page must server-render\"). It renders null and carries no\n * visitor data.\n */\n\n'use client'\n\nimport { useEffect, useRef } from 'react'\nimport { useDeferredActivation } from '../shared/defer'\nimport { SITE_KIT_VERSION } from '../shared/version'\nimport { detectNextVersion, sendFleetHeartbeat } from './heartbeat'\nimport { resolveAnalyticsTarget, type AnalyticsGateOptions } from '../shared/reporting-gate'\nimport type { FleetModule } from './contract'\n\n/** Session guard key — one heartbeat per session, re-sent when version/host changes. */\nconst SESSION_GUARD_KEY = '_sk_fleet_hb'\n\nexport interface FleetHeartbeatProps extends AnalyticsGateOptions {\n /** Sonor API origin. Falls back to `window.__SITE_KIT_API_URL__` then api.sonor.io. */\n apiUrl?: string\n /** Project API key. Falls back to `window.__SITE_KIT_API_KEY__`. */\n apiKey?: string\n /** Host for the multi-site sub-dimension. Falls back to `__SITE_KIT_SITE__` then location.host. */\n site?: string | null\n /** Client-observable active modules (SiteKitClientProviders passes the enabled set). */\n modules?: FleetModule[]\n /** Installed Next.js version if known; otherwise best-effort runtime detection. */\n nextVersion?: string | null\n /**\n * Self-defer to idle / first interaction. Default true so standalone use is\n * safe. SiteKitClientProviders already gates the mount and passes false.\n */\n defer?: boolean\n /** Send at most once per browser session per (version, host). Default true. */\n oncePerSession?: boolean\n debug?: boolean\n}\n\nexport function FleetHeartbeat({\n apiUrl,\n apiKey,\n site,\n modules,\n nextVersion,\n defer = true,\n oncePerSession = true,\n debug = false,\n allowInFrame = false,\n allowLocalhost = false,\n}: FleetHeartbeatProps) {\n const ready = useDeferredActivation(defer)\n const sentRef = useRef(false)\n\n useEffect(() => {\n if (!ready || sentRef.current) return\n if (typeof window === 'undefined') return\n\n const w = window as unknown as {\n __SITE_KIT_API_URL__?: string\n __SITE_KIT_API_KEY__?: string\n __SITE_KIT_SITE__?: string\n }\n const target = resolveAnalyticsTarget({ apiUrl, apiKey, allowInFrame, allowLocalhost, debug })\n if (!target) return // Gate before stamping session storage.\n const { apiUrl: url, apiKey: key } = target\n\n const resolvedSite = site ?? w.__SITE_KIT_SITE__ ?? window.location.host ?? ''\n\n // Once-per-session-per-(version,host): keeps heartbeat volume to one POST\n // per visitor session while still re-reporting after an upgrade or on a\n // different sub-site. Storage-disabled browsers simply send once per load.\n if (oncePerSession) {\n const stamp = `${SITE_KIT_VERSION}:${resolvedSite}`\n try {\n if (sessionStorage.getItem(SESSION_GUARD_KEY) === stamp) {\n sentRef.current = true\n return\n }\n sessionStorage.setItem(SESSION_GUARD_KEY, stamp)\n } catch {\n /* storage unavailable — fall through and send this load */\n }\n }\n\n sentRef.current = true\n void sendFleetHeartbeat({\n apiUrl: url,\n apiKey: key,\n site: resolvedSite,\n modules,\n nextVersion: nextVersion ?? detectNextVersion(),\n source: 'client',\n allowInFrame,\n allowLocalhost,\n debug,\n })\n }, [ready, apiUrl, apiKey, site, modules, nextVersion, oncePerSession, debug, allowInFrame, allowLocalhost])\n\n return null\n}\n"]}
1
+ {"version":3,"sources":["../src/fleet/heartbeat.ts","../src/fleet/FleetHeartbeat.tsx"],"names":[],"mappings":"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","file":"chunk-NCURAYKL.mjs","sourcesContent":["/**\n * @sonordev/site-kit/fleet — heartbeat sender (single source of truth for the POST)\n *\n * One place that turns fleet inputs into a validated payload and ships it to\n * `/api/public/fleet/heartbeat`. Used by BOTH the client component\n * (FleetHeartbeat) and any build-time caller, so the send path never forks.\n *\n * It routes through the shared analytics send gate and `sonorFetch`, which stamps\n * the x-sitekit-version header, attaches x-api-key, and honors the auth\n * circuit breaker — a site on a stale/canceled key will not spam the API.\n */\n\nimport { resolveAnalyticsTarget, type AnalyticsGateOptions } from '../shared/reporting-gate'\nimport { sonorFetch } from '../shared/sonorFetch'\nimport { SITE_KIT_VERSION } from '../shared/version'\nimport {\n buildFleetHeartbeatPayload,\n sanitizeFleetVersion,\n type FleetHeartbeatPayload,\n type FleetHeartbeatSource,\n type FleetModule,\n} from './contract'\n\n/** Canonical ingest path — resolved against the site's Sonor API origin. */\nexport const FLEET_HEARTBEAT_PATH = '/api/public/fleet/heartbeat'\n\nexport interface SendFleetHeartbeatOptions extends AnalyticsGateOptions {\n /** Sonor API origin (e.g. https://api.sonor.io). Trailing slash tolerated. */\n apiUrl: string\n /** Project API key — scopes the request; the project is resolved server-side. */\n apiKey: string\n /** Client-observable active modules (validated/deduped by the contract). */\n modules?: FleetModule[] | string[]\n /** Normalized host for the multi-site sub-dimension (server re-normalizes). */\n site?: string | null\n /** Installed Next.js version, if the caller can resolve it. */\n nextVersion?: string | null\n /** 'client' (runtime boot) or 'build' (CI). Default 'client'. */\n source?: FleetHeartbeatSource\n /** Override the reported kit version. Defaults to the runtime SITE_KIT_VERSION. */\n kitVersion?: string\n /** Log one info line with the result. Never logs at error level. */\n debug?: boolean\n}\n\n/**\n * Best-effort runtime detection of the host Next.js version. Unreliable by\n * design — Next does not expose its version consistently across app/pages\n * router — so it returns null unless a site injects `__SITE_KIT_NEXT_VERSION__`\n * or `window.next.version` is present. Build-time callers should pass\n * `nextVersion` explicitly (resolvable from `next/package.json`).\n */\nexport function detectNextVersion(): string | null {\n if (typeof window === 'undefined') return null\n const w = window as unknown as {\n __SITE_KIT_NEXT_VERSION__?: string\n next?: { version?: string }\n }\n return sanitizeFleetVersion(w.__SITE_KIT_NEXT_VERSION__ ?? w.next?.version ?? null)\n}\n\n/**\n * Fire one heartbeat. Fire-and-forget by contract: it never throws — a\n * telemetry POST must never break a visitor's page or a site's build. Returns\n * true only when the POST was accepted (2xx).\n */\nexport async function sendFleetHeartbeat(opts: SendFleetHeartbeatOptions): Promise<boolean> {\n const { apiUrl, apiKey } = opts\n if (!apiUrl || !apiKey) return false\n const target = resolveAnalyticsTarget(opts)\n if (!target) return false\n\n const payload: FleetHeartbeatPayload = buildFleetHeartbeatPayload({\n kitVersion: opts.kitVersion || SITE_KIT_VERSION,\n nextVersion: opts.nextVersion,\n modules: opts.modules,\n site: opts.site,\n source: opts.source,\n })\n\n try {\n const res = await sonorFetch(\n `${target.apiUrl.replace(/\\/$/, '')}${FLEET_HEARTBEAT_PATH}`,\n {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify(payload),\n },\n { apiKey: target.apiKey, retries: 0 },\n )\n if (opts.debug) {\n // info, never error: a visitor's console must stay clean (Lighthouse).\n console.info(\n `[Sonor fleet] heartbeat ${res.status} v${payload.kit_version} [${payload.modules.join(',') || 'none'}]`,\n )\n }\n return res.ok\n } catch (err) {\n if (opts.debug) console.info('[Sonor fleet] heartbeat skipped (network)', err)\n return false\n }\n}\n","/**\n * @sonordev/site-kit/fleet — FleetHeartbeat\n *\n * A childless, effect-only client component that reports this site's build\n * fingerprint (kit version, Next.js version, active modules, host) to Sonor\n * exactly once per browser session. It exists so the platform can answer\n * \"which version / modules / key state is each site running\" without shelling\n * into every client repo.\n *\n * It is mounted as a deferred, CHILDLESS SIBLING — never a wrapper — by\n * SiteKitClientProviders, behind the same idle/first-interaction gate as\n * Analytics and Engage, so it never enters the critical hydration path (see\n * CLAUDE.md \"the page must server-render\"). It renders null and carries no\n * visitor data.\n */\n\n'use client'\n\nimport { useEffect, useRef } from 'react'\nimport { useDeferredActivation } from '../shared/defer'\nimport { SITE_KIT_VERSION } from '../shared/version'\nimport { detectNextVersion, sendFleetHeartbeat } from './heartbeat'\nimport { resolveAnalyticsTarget, type AnalyticsGateOptions } from '../shared/reporting-gate'\nimport type { FleetModule } from './contract'\n\n/** Session guard key — one heartbeat per session, re-sent when version/host changes. */\nconst SESSION_GUARD_KEY = '_sk_fleet_hb'\n\nexport interface FleetHeartbeatProps extends AnalyticsGateOptions {\n /** Sonor API origin. Falls back to `window.__SITE_KIT_API_URL__` then api.sonor.io. */\n apiUrl?: string\n /** Project API key. Falls back to `window.__SITE_KIT_API_KEY__`. */\n apiKey?: string\n /** Host for the multi-site sub-dimension. Falls back to `__SITE_KIT_SITE__` then location.host. */\n site?: string | null\n /** Client-observable active modules (SiteKitClientProviders passes the enabled set). */\n modules?: FleetModule[]\n /** Installed Next.js version if known; otherwise best-effort runtime detection. */\n nextVersion?: string | null\n /**\n * Self-defer to idle / first interaction. Default true so standalone use is\n * safe. SiteKitClientProviders already gates the mount and passes false.\n */\n defer?: boolean\n /** Send at most once per browser session per (version, host). Default true. */\n oncePerSession?: boolean\n debug?: boolean\n}\n\nexport function FleetHeartbeat({\n apiUrl,\n apiKey,\n site,\n modules,\n nextVersion,\n defer = true,\n oncePerSession = true,\n debug = false,\n allowInFrame = false,\n allowLocalhost = false,\n}: FleetHeartbeatProps) {\n const ready = useDeferredActivation(defer)\n const sentRef = useRef(false)\n\n useEffect(() => {\n if (!ready || sentRef.current) return\n if (typeof window === 'undefined') return\n\n const w = window as unknown as {\n __SITE_KIT_API_URL__?: string\n __SITE_KIT_API_KEY__?: string\n __SITE_KIT_SITE__?: string\n }\n const target = resolveAnalyticsTarget({ apiUrl, apiKey, allowInFrame, allowLocalhost, debug })\n if (!target) return // Gate before stamping session storage.\n const { apiUrl: url, apiKey: key } = target\n\n const resolvedSite = site ?? w.__SITE_KIT_SITE__ ?? window.location.host ?? ''\n\n // Once-per-session-per-(version,host): keeps heartbeat volume to one POST\n // per visitor session while still re-reporting after an upgrade or on a\n // different sub-site. Storage-disabled browsers simply send once per load.\n if (oncePerSession) {\n const stamp = `${SITE_KIT_VERSION}:${resolvedSite}`\n try {\n if (sessionStorage.getItem(SESSION_GUARD_KEY) === stamp) {\n sentRef.current = true\n return\n }\n sessionStorage.setItem(SESSION_GUARD_KEY, stamp)\n } catch {\n /* storage unavailable — fall through and send this load */\n }\n }\n\n sentRef.current = true\n void sendFleetHeartbeat({\n apiUrl: url,\n apiKey: key,\n site: resolvedSite,\n modules,\n nextVersion: nextVersion ?? detectNextVersion(),\n source: 'client',\n allowInFrame,\n allowLocalhost,\n debug,\n })\n }, [ready, apiUrl, apiKey, site, modules, nextVersion, oncePerSession, debug, allowInFrame, allowLocalhost])\n\n return null\n}\n"]}
@@ -2,9 +2,9 @@
2
2
 
3
3
  var chunkSNAQBZPT_js = require('./chunk-SNAQBZPT.js');
4
4
 
5
- // ../../../../../../../Volumes/Uptrade Media/GitHub/Sonor/site-kit/node_modules/.pnpm/dotenv@17.4.2/node_modules/dotenv/lib/main.js
5
+ // node_modules/.pnpm/dotenv@17.4.2/node_modules/dotenv/lib/main.js
6
6
  var require_main = chunkSNAQBZPT_js.__commonJS({
7
- "../../../../../../../Volumes/Uptrade Media/GitHub/Sonor/site-kit/node_modules/.pnpm/dotenv@17.4.2/node_modules/dotenv/lib/main.js"(exports, module) {
7
+ "node_modules/.pnpm/dotenv@17.4.2/node_modules/dotenv/lib/main.js"(exports, module) {
8
8
  var fs = chunkSNAQBZPT_js.__require("fs");
9
9
  var path = chunkSNAQBZPT_js.__require("path");
10
10
  var os = chunkSNAQBZPT_js.__require("os");
@@ -322,4 +322,4 @@ var require_main = chunkSNAQBZPT_js.__commonJS({
322
322
  });
323
323
 
324
324
  exports.require_main = require_main;
325
- //# sourceMappingURL=chunk-ZUQSVCMD.js.map
325
+ //# sourceMappingURL=chunk-NN2YE5WT.js.map
@@ -1,8 +1,8 @@
1
1
  import { __commonJS, __require } from './chunk-BEXTDHO4.mjs';
2
2
 
3
- // ../../../../../../../Volumes/Uptrade Media/GitHub/Sonor/site-kit/node_modules/.pnpm/dotenv@17.4.2/node_modules/dotenv/lib/main.js
3
+ // node_modules/.pnpm/dotenv@17.4.2/node_modules/dotenv/lib/main.js
4
4
  var require_main = __commonJS({
5
- "../../../../../../../Volumes/Uptrade Media/GitHub/Sonor/site-kit/node_modules/.pnpm/dotenv@17.4.2/node_modules/dotenv/lib/main.js"(exports, module) {
5
+ "node_modules/.pnpm/dotenv@17.4.2/node_modules/dotenv/lib/main.js"(exports, module) {
6
6
  var fs = __require("fs");
7
7
  var path = __require("path");
8
8
  var os = __require("os");
@@ -320,4 +320,4 @@ var require_main = __commonJS({
320
320
  });
321
321
 
322
322
  export { require_main };
323
- //# sourceMappingURL=chunk-RH4XEXTK.mjs.map
323
+ //# sourceMappingURL=chunk-NNZDWY3L.mjs.map
@@ -1,7 +1,7 @@
1
1
  'use client';
2
2
  'use strict';
3
3
 
4
- var chunkKEEZX6Q4_js = require('./chunk-KEEZX6Q4.js');
4
+ var chunkJCBENABK_js = require('./chunk-JCBENABK.js');
5
5
  var React = require('react');
6
6
  var jsxRuntime = require('react/jsx-runtime');
7
7
 
@@ -16,8 +16,8 @@ function SignalExperiment({
16
16
  trackImpression = true,
17
17
  children
18
18
  }) {
19
- const { assignment, variant, isControl } = chunkKEEZX6Q4_js.useSignalExperiment(experimentId);
20
- const trackEvent = chunkKEEZX6Q4_js.useSignalEvent();
19
+ const { assignment, variant, isControl } = chunkJCBENABK_js.useSignalExperiment(experimentId);
20
+ const trackEvent = chunkJCBENABK_js.useSignalEvent();
21
21
  React.useEffect(() => {
22
22
  if (trackImpression && variant) {
23
23
  trackEvent({
@@ -44,7 +44,7 @@ function SignalExperiment({
44
44
  return /* @__PURE__ */ jsxRuntime.jsx(jsxRuntime.Fragment, { children: variants.control || null });
45
45
  }
46
46
  function useExperimentVariant(experimentId) {
47
- return chunkKEEZX6Q4_js.useSignalExperiment(experimentId);
47
+ return chunkJCBENABK_js.useSignalExperiment(experimentId);
48
48
  }
49
49
  function ExperimentConversion({
50
50
  experimentId,
@@ -52,8 +52,8 @@ function ExperimentConversion({
52
52
  value,
53
53
  children
54
54
  }) {
55
- const trackEvent = chunkKEEZX6Q4_js.useSignalEvent();
56
- const { variant } = chunkKEEZX6Q4_js.useSignalExperiment(experimentId);
55
+ const trackEvent = chunkJCBENABK_js.useSignalEvent();
56
+ const { variant } = chunkJCBENABK_js.useSignalExperiment(experimentId);
57
57
  const handleInteraction = () => {
58
58
  trackEvent({
59
59
  event_type: "experiment",
@@ -79,5 +79,5 @@ function ExperimentConversion({
79
79
  exports.ExperimentConversion = ExperimentConversion;
80
80
  exports.SignalExperiment = SignalExperiment;
81
81
  exports.useExperimentVariant = useExperimentVariant;
82
- //# sourceMappingURL=chunk-5OUOVPXC.js.map
83
- //# sourceMappingURL=chunk-5OUOVPXC.js.map
82
+ //# sourceMappingURL=chunk-OMYR2ORG.js.map
83
+ //# sourceMappingURL=chunk-OMYR2ORG.js.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/signal/SignalExperiment.tsx"],"names":["useSignalExperiment","useSignalEvent","useEffect","jsx","Fragment","React"],"mappings":";;;;;;;;;;AAgDO,SAAS,gBAAA,CAAiB;AAAA,EAC/B,YAAA;AAAA,EACA,QAAA;AAAA,EACA,QAAA;AAAA,EACA,eAAA,GAAkB,IAAA;AAAA,EAClB;AACF,CAAA,EAA0B;AACxB,EAAA,MAAM,EAAE,UAAA,EAAY,OAAA,EAAS,SAAA,EAAU,GAAIA,qCAAoB,YAAY,CAAA;AAC3E,EAAA,MAAM,aAAaC,+BAAA,EAAe;AAGlC,EAAAC,eAAA,CAAU,MAAM;AACd,IAAA,IAAI,mBAAmB,OAAA,EAAS;AAC9B,MAAA,UAAA,CAAW;AAAA,QACT,UAAA,EAAY,YAAA;AAAA,QACZ,UAAA,EAAY,YAAA;AAAA,QACZ,UAAA,EAAY;AAAA,UACV,aAAA,EAAe,YAAA;AAAA,UACf,WAAA,EAAa;AAAA;AACf,OACD,CAAA;AAAA,IACH;AAAA,EACF,GAAG,CAAC,YAAA,EAAc,OAAA,EAAS,eAAA,EAAiB,UAAU,CAAC,CAAA;AAGvD,EAAA,IAAI,QAAA,EAAU;AACZ,IAAA,uBAAOC,cAAA,CAAAC,mBAAA,EAAA,EAAG,mBAAS,EAAE,OAAA,EAAS,WAAW,SAAA,EAAW,SAAA,EAAW,CAAA,EAAE,CAAA;AAAA,EACnE;AAGA,EAAA,MAAM,kBAAkB,OAAA,IAAW,SAAA;AACnC,EAAA,MAAM,OAAA,GAAU,SAAS,eAAe,CAAA;AAExC,EAAA,IAAI,YAAY,MAAA,EAAW;AACzB,IAAA,6DAAU,QAAA,EAAA,OAAA,EAAQ,CAAA;AAAA,EACpB;AAGA,EAAA,IAAI,QAAA,EAAU;AACZ,IAAA,6DAAU,QAAA,EAAA,QAAA,EAAS,CAAA;AAAA,EACrB;AAEA,EAAA,uBAAOD,cAAA,CAAAC,mBAAA,EAAA,EAAG,QAAA,EAAA,QAAA,CAAS,OAAA,IAAW,IAAA,EAAK,CAAA;AACrC;AAYO,SAAS,qBAAqB,YAAA,EAAsB;AACzD,EAAA,OAAOJ,qCAAoB,YAAY,CAAA;AACzC;AAoBO,SAAS,oBAAA,CAAqB;AAAA,EACnC,YAAA;AAAA,EACA,WAAA,GAAc,OAAA;AAAA,EACd,KAAA;AAAA,EACA;AACF,CAAA,EAKG;AACD,EAAA,MAAM,aAAaC,+BAAA,EAAe;AAClC,EAAA,MAAM,EAAE,OAAA,EAAQ,GAAID,oCAAA,CAAoB,YAAY,CAAA;AAEpD,EAAA,MAAM,oBAAoB,MAAM;AAC9B,IAAA,UAAA,CAAW;AAAA,MACT,UAAA,EAAY,YAAA;AAAA,MACZ,UAAA,EAAY,YAAA;AAAA,MACZ,UAAA,EAAY;AAAA,QACV,aAAA,EAAe,YAAA;AAAA,QACf,WAAA,EAAa,OAAA;AAAA,QACb,YAAA,EAAc,WAAA;AAAA,QACd;AAAA;AACF,KACD,CAAA;AAAA,EACH,CAAA;AAEA,EAAA,OAAOK,sBAAA,CAAM,aAAa,QAAA,EAAU;AAAA,IAClC,OAAA,EAAS,CAAC,CAAA,KAAwB;AAChC,MAAA,iBAAA,EAAkB;AAElB,MAAA,IAAK,QAAA,CAAS,MAAsD,OAAA,EAAS;AAC3E,QAAC,QAAA,CAAS,KAAA,CAAsD,OAAA,CAAS,CAAC,CAAA;AAAA,MAC5E;AAAA,IACF;AAAA,GACD,CAAA;AACH","file":"chunk-5OUOVPXC.js","sourcesContent":["/**\n * @sonordev/site-kit/signal - SignalExperiment\n * \n * A/B test component that renders different variants based on Signal assignment.\n * Uses Thompson Sampling (Bayesian bandit) for optimization.\n */\n\n'use client'\n\nimport React, { useMemo, useEffect } from 'react'\nimport { useSignalExperiment, useSignalEvent } from './SignalBridge'\n\ninterface SignalExperimentProps {\n /** Unique experiment ID */\n experimentId: string\n \n /** Variants to test - keys are variant names, values are React nodes */\n variants: Record<string, React.ReactNode>\n \n /** Fallback content if no assignment (defaults to 'control' variant) */\n fallback?: React.ReactNode\n \n /** Track impression automatically */\n trackImpression?: boolean\n \n /** Children function for more control */\n children?: (props: { variant: string; isControl: boolean }) => React.ReactNode\n}\n\n/**\n * Renders different content variants based on Signal's A/B assignment.\n * \n * @example\n * // Simple variant switching\n * <SignalExperiment experimentId=\"hero-cta\" variants={{\n * control: <Button>Get Started</Button>,\n * variant_a: <Button variant=\"primary\">Start Free Trial</Button>,\n * variant_b: <Button variant=\"secondary\">Book a Demo</Button>,\n * }} />\n * \n * @example\n * // With render prop for more control\n * <SignalExperiment experimentId=\"pricing-layout\">\n * {({ variant, isControl }) => (\n * <PricingSection layout={isControl ? 'cards' : 'table'} />\n * )}\n * </SignalExperiment>\n */\nexport function SignalExperiment({\n experimentId,\n variants,\n fallback,\n trackImpression = true,\n children,\n}: SignalExperimentProps) {\n const { assignment, variant, isControl } = useSignalExperiment(experimentId)\n const trackEvent = useSignalEvent()\n \n // Track impression when variant is rendered\n useEffect(() => {\n if (trackImpression && variant) {\n trackEvent({\n event_type: 'experiment',\n event_name: 'impression',\n event_data: {\n experiment_id: experimentId,\n variant_key: variant,\n },\n })\n }\n }, [experimentId, variant, trackImpression, trackEvent])\n \n // If using render prop\n if (children) {\n return <>{children({ variant: variant || 'control', isControl })}</>\n }\n \n // Determine what to render\n const selectedVariant = variant || 'control'\n const content = variants[selectedVariant]\n \n if (content !== undefined) {\n return <>{content}</>\n }\n \n // Fallback to provided fallback or control\n if (fallback) {\n return <>{fallback}</>\n }\n \n return <>{variants.control || null}</>\n}\n\n/**\n * Hook for conditional experiment logic\n * \n * @example\n * const { variant, isControl } = useExperimentVariant('pricing-test')\n * \n * return isControl \n * ? <OldPricing />\n * : <NewPricing showAnnual={variant === 'annual_first'} />\n */\nexport function useExperimentVariant(experimentId: string) {\n return useSignalExperiment(experimentId)\n}\n\n/**\n * Component for tracking experiment conversions\n * Wraps interactive elements to track when they convert\n * \n * @example\n * <SignalExperiment experimentId=\"signup-button\" variants={{\n * control: (\n * <ExperimentConversion experimentId=\"signup-button\" outcomeType=\"click\">\n * <Button>Sign Up</Button>\n * </ExperimentConversion>\n * ),\n * variant_a: (\n * <ExperimentConversion experimentId=\"signup-button\" outcomeType=\"click\">\n * <Button variant=\"large\">Join Now - It's Free!</Button>\n * </ExperimentConversion>\n * ),\n * }} />\n */\nexport function ExperimentConversion({\n experimentId,\n outcomeType = 'click',\n value,\n children,\n}: {\n experimentId: string\n outcomeType?: string\n value?: number\n children: React.ReactElement<{ onClick?: (e: React.MouseEvent) => void }>\n}) {\n const trackEvent = useSignalEvent()\n const { variant } = useSignalExperiment(experimentId)\n\n const handleInteraction = () => {\n trackEvent({\n event_type: 'experiment',\n event_name: 'conversion',\n event_data: {\n experiment_id: experimentId,\n variant_key: variant,\n outcome_type: outcomeType,\n value,\n },\n })\n }\n\n return React.cloneElement(children, {\n onClick: (e: React.MouseEvent) => {\n handleInteraction()\n // Call original onClick if exists\n if ((children.props as { onClick?: (e: React.MouseEvent) => void }).onClick) {\n (children.props as { onClick?: (e: React.MouseEvent) => void }).onClick!(e)\n }\n },\n })\n}\n"]}
1
+ {"version":3,"sources":["../src/signal/SignalExperiment.tsx"],"names":["useSignalExperiment","useSignalEvent","useEffect","jsx","Fragment","React"],"mappings":";;;;;;;;;;AAgDO,SAAS,gBAAA,CAAiB;AAAA,EAC/B,YAAA;AAAA,EACA,QAAA;AAAA,EACA,QAAA;AAAA,EACA,eAAA,GAAkB,IAAA;AAAA,EAClB;AACF,CAAA,EAA0B;AACxB,EAAA,MAAM,EAAE,UAAA,EAAY,OAAA,EAAS,SAAA,EAAU,GAAIA,qCAAoB,YAAY,CAAA;AAC3E,EAAA,MAAM,aAAaC,+BAAA,EAAe;AAGlC,EAAAC,eAAA,CAAU,MAAM;AACd,IAAA,IAAI,mBAAmB,OAAA,EAAS;AAC9B,MAAA,UAAA,CAAW;AAAA,QACT,UAAA,EAAY,YAAA;AAAA,QACZ,UAAA,EAAY,YAAA;AAAA,QACZ,UAAA,EAAY;AAAA,UACV,aAAA,EAAe,YAAA;AAAA,UACf,WAAA,EAAa;AAAA;AACf,OACD,CAAA;AAAA,IACH;AAAA,EACF,GAAG,CAAC,YAAA,EAAc,OAAA,EAAS,eAAA,EAAiB,UAAU,CAAC,CAAA;AAGvD,EAAA,IAAI,QAAA,EAAU;AACZ,IAAA,uBAAOC,cAAA,CAAAC,mBAAA,EAAA,EAAG,mBAAS,EAAE,OAAA,EAAS,WAAW,SAAA,EAAW,SAAA,EAAW,CAAA,EAAE,CAAA;AAAA,EACnE;AAGA,EAAA,MAAM,kBAAkB,OAAA,IAAW,SAAA;AACnC,EAAA,MAAM,OAAA,GAAU,SAAS,eAAe,CAAA;AAExC,EAAA,IAAI,YAAY,MAAA,EAAW;AACzB,IAAA,6DAAU,QAAA,EAAA,OAAA,EAAQ,CAAA;AAAA,EACpB;AAGA,EAAA,IAAI,QAAA,EAAU;AACZ,IAAA,6DAAU,QAAA,EAAA,QAAA,EAAS,CAAA;AAAA,EACrB;AAEA,EAAA,uBAAOD,cAAA,CAAAC,mBAAA,EAAA,EAAG,QAAA,EAAA,QAAA,CAAS,OAAA,IAAW,IAAA,EAAK,CAAA;AACrC;AAYO,SAAS,qBAAqB,YAAA,EAAsB;AACzD,EAAA,OAAOJ,qCAAoB,YAAY,CAAA;AACzC;AAoBO,SAAS,oBAAA,CAAqB;AAAA,EACnC,YAAA;AAAA,EACA,WAAA,GAAc,OAAA;AAAA,EACd,KAAA;AAAA,EACA;AACF,CAAA,EAKG;AACD,EAAA,MAAM,aAAaC,+BAAA,EAAe;AAClC,EAAA,MAAM,EAAE,OAAA,EAAQ,GAAID,oCAAA,CAAoB,YAAY,CAAA;AAEpD,EAAA,MAAM,oBAAoB,MAAM;AAC9B,IAAA,UAAA,CAAW;AAAA,MACT,UAAA,EAAY,YAAA;AAAA,MACZ,UAAA,EAAY,YAAA;AAAA,MACZ,UAAA,EAAY;AAAA,QACV,aAAA,EAAe,YAAA;AAAA,QACf,WAAA,EAAa,OAAA;AAAA,QACb,YAAA,EAAc,WAAA;AAAA,QACd;AAAA;AACF,KACD,CAAA;AAAA,EACH,CAAA;AAEA,EAAA,OAAOK,sBAAA,CAAM,aAAa,QAAA,EAAU;AAAA,IAClC,OAAA,EAAS,CAAC,CAAA,KAAwB;AAChC,MAAA,iBAAA,EAAkB;AAElB,MAAA,IAAK,QAAA,CAAS,MAAsD,OAAA,EAAS;AAC3E,QAAC,QAAA,CAAS,KAAA,CAAsD,OAAA,CAAS,CAAC,CAAA;AAAA,MAC5E;AAAA,IACF;AAAA,GACD,CAAA;AACH","file":"chunk-OMYR2ORG.js","sourcesContent":["/**\n * @sonordev/site-kit/signal - SignalExperiment\n * \n * A/B test component that renders different variants based on Signal assignment.\n * Uses Thompson Sampling (Bayesian bandit) for optimization.\n */\n\n'use client'\n\nimport React, { useMemo, useEffect } from 'react'\nimport { useSignalExperiment, useSignalEvent } from './SignalBridge'\n\ninterface SignalExperimentProps {\n /** Unique experiment ID */\n experimentId: string\n \n /** Variants to test - keys are variant names, values are React nodes */\n variants: Record<string, React.ReactNode>\n \n /** Fallback content if no assignment (defaults to 'control' variant) */\n fallback?: React.ReactNode\n \n /** Track impression automatically */\n trackImpression?: boolean\n \n /** Children function for more control */\n children?: (props: { variant: string; isControl: boolean }) => React.ReactNode\n}\n\n/**\n * Renders different content variants based on Signal's A/B assignment.\n * \n * @example\n * // Simple variant switching\n * <SignalExperiment experimentId=\"hero-cta\" variants={{\n * control: <Button>Get Started</Button>,\n * variant_a: <Button variant=\"primary\">Start Free Trial</Button>,\n * variant_b: <Button variant=\"secondary\">Book a Demo</Button>,\n * }} />\n * \n * @example\n * // With render prop for more control\n * <SignalExperiment experimentId=\"pricing-layout\">\n * {({ variant, isControl }) => (\n * <PricingSection layout={isControl ? 'cards' : 'table'} />\n * )}\n * </SignalExperiment>\n */\nexport function SignalExperiment({\n experimentId,\n variants,\n fallback,\n trackImpression = true,\n children,\n}: SignalExperimentProps) {\n const { assignment, variant, isControl } = useSignalExperiment(experimentId)\n const trackEvent = useSignalEvent()\n \n // Track impression when variant is rendered\n useEffect(() => {\n if (trackImpression && variant) {\n trackEvent({\n event_type: 'experiment',\n event_name: 'impression',\n event_data: {\n experiment_id: experimentId,\n variant_key: variant,\n },\n })\n }\n }, [experimentId, variant, trackImpression, trackEvent])\n \n // If using render prop\n if (children) {\n return <>{children({ variant: variant || 'control', isControl })}</>\n }\n \n // Determine what to render\n const selectedVariant = variant || 'control'\n const content = variants[selectedVariant]\n \n if (content !== undefined) {\n return <>{content}</>\n }\n \n // Fallback to provided fallback or control\n if (fallback) {\n return <>{fallback}</>\n }\n \n return <>{variants.control || null}</>\n}\n\n/**\n * Hook for conditional experiment logic\n * \n * @example\n * const { variant, isControl } = useExperimentVariant('pricing-test')\n * \n * return isControl \n * ? <OldPricing />\n * : <NewPricing showAnnual={variant === 'annual_first'} />\n */\nexport function useExperimentVariant(experimentId: string) {\n return useSignalExperiment(experimentId)\n}\n\n/**\n * Component for tracking experiment conversions\n * Wraps interactive elements to track when they convert\n * \n * @example\n * <SignalExperiment experimentId=\"signup-button\" variants={{\n * control: (\n * <ExperimentConversion experimentId=\"signup-button\" outcomeType=\"click\">\n * <Button>Sign Up</Button>\n * </ExperimentConversion>\n * ),\n * variant_a: (\n * <ExperimentConversion experimentId=\"signup-button\" outcomeType=\"click\">\n * <Button variant=\"large\">Join Now - It's Free!</Button>\n * </ExperimentConversion>\n * ),\n * }} />\n */\nexport function ExperimentConversion({\n experimentId,\n outcomeType = 'click',\n value,\n children,\n}: {\n experimentId: string\n outcomeType?: string\n value?: number\n children: React.ReactElement<{ onClick?: (e: React.MouseEvent) => void }>\n}) {\n const trackEvent = useSignalEvent()\n const { variant } = useSignalExperiment(experimentId)\n\n const handleInteraction = () => {\n trackEvent({\n event_type: 'experiment',\n event_name: 'conversion',\n event_data: {\n experiment_id: experimentId,\n variant_key: variant,\n outcome_type: outcomeType,\n value,\n },\n })\n }\n\n return React.cloneElement(children, {\n onClick: (e: React.MouseEvent) => {\n handleInteraction()\n // Call original onClick if exists\n if ((children.props as { onClick?: (e: React.MouseEvent) => void }).onClick) {\n (children.props as { onClick?: (e: React.MouseEvent) => void }).onClick!(e)\n }\n },\n })\n}\n"]}
@@ -1,8 +1,8 @@
1
1
  'use client';
2
2
  'use strict';
3
3
 
4
- var chunkMTHMOXZF_js = require('./chunk-MTHMOXZF.js');
5
- var chunkIWHAJBYL_js = require('./chunk-IWHAJBYL.js');
4
+ var chunkRNEPZD2I_js = require('./chunk-RNEPZD2I.js');
5
+ var chunkPXN7LIYZ_js = require('./chunk-PXN7LIYZ.js');
6
6
  var jsxRuntime = require('react/jsx-runtime');
7
7
  var React5 = require('react');
8
8
 
@@ -112,7 +112,7 @@ async function apiPost(endpoint, body = {}) {
112
112
  return null;
113
113
  }
114
114
  try {
115
- const response = await chunkIWHAJBYL_js.sonorFetch(`${apiUrl}${endpoint}`, {
115
+ const response = await chunkPXN7LIYZ_js.sonorFetch(`${apiUrl}${endpoint}`, {
116
116
  method: "POST",
117
117
  headers: { "Content-Type": "application/json" },
118
118
  body: JSON.stringify(body)
@@ -279,7 +279,7 @@ async function fetchActiveProcessor() {
279
279
  const { apiUrl, apiKey } = getApiConfig();
280
280
  if (!apiKey) return null;
281
281
  try {
282
- const response = await chunkIWHAJBYL_js.sonorFetch(`${apiUrl}/api/public/commerce/processor`, {
282
+ const response = await chunkPXN7LIYZ_js.sonorFetch(`${apiUrl}/api/public/commerce/processor`, {
283
283
  method: "POST",
284
284
  headers: { "Content-Type": "application/json" },
285
285
  body: JSON.stringify({})
@@ -295,7 +295,7 @@ async function registerForEvent(eventId, scheduleId, customer) {
295
295
  const { apiUrl, apiKey } = getApiConfig();
296
296
  const analyticsSessionId = typeof sessionStorage !== "undefined" ? sessionStorage.getItem("_sk_sid") : null;
297
297
  try {
298
- const response = await chunkIWHAJBYL_js.sonorFetch(`${apiUrl}/api/public/commerce/register`, {
298
+ const response = await chunkPXN7LIYZ_js.sonorFetch(`${apiUrl}/api/public/commerce/register`, {
299
299
  method: "POST",
300
300
  headers: { "Content-Type": "application/json" },
301
301
  body: JSON.stringify({
@@ -345,7 +345,7 @@ function toCheckoutBody(options) {
345
345
  async function validateDiscountCode(code, subtotal, offeringIds = []) {
346
346
  const { apiUrl, apiKey } = getApiConfig();
347
347
  try {
348
- const response = await chunkIWHAJBYL_js.sonorFetch(`${apiUrl}/api/public/commerce/discount/validate`, {
348
+ const response = await chunkPXN7LIYZ_js.sonorFetch(`${apiUrl}/api/public/commerce/discount/validate`, {
349
349
  method: "POST",
350
350
  headers: { "Content-Type": "application/json" },
351
351
  // offering_ids is the API's name. Older APIs read only that, so
@@ -365,7 +365,7 @@ async function fetchProcessorConfig() {
365
365
  const { apiUrl, apiKey } = getApiConfig();
366
366
  if (!apiKey) return null;
367
367
  try {
368
- const response = await chunkIWHAJBYL_js.sonorFetch(`${apiUrl}/api/public/commerce/processor-config`, {
368
+ const response = await chunkPXN7LIYZ_js.sonorFetch(`${apiUrl}/api/public/commerce/processor-config`, {
369
369
  method: "POST",
370
370
  headers: { "Content-Type": "application/json" },
371
371
  body: JSON.stringify({})
@@ -381,7 +381,7 @@ async function createPaymentIntent(options) {
381
381
  const apiKey = getApiKey();
382
382
  const sessionId = typeof sessionStorage !== "undefined" ? sessionStorage.getItem("_sk_sid") : null;
383
383
  try {
384
- const response = await chunkIWHAJBYL_js.sonorFetch(`${apiUrl}/api/public/commerce/create-payment-intent`, {
384
+ const response = await chunkPXN7LIYZ_js.sonorFetch(`${apiUrl}/api/public/commerce/create-payment-intent`, {
385
385
  method: "POST",
386
386
  headers: { "Content-Type": "application/json" },
387
387
  body: JSON.stringify({
@@ -401,7 +401,7 @@ async function createCheckoutSession(optionsOrOfferingId, legacyOptions) {
401
401
  const options = typeof optionsOrOfferingId === "string" ? { offeringId: optionsOrOfferingId, ...legacyOptions } : optionsOrOfferingId;
402
402
  const analyticsSessionId = typeof sessionStorage !== "undefined" ? sessionStorage.getItem("_sk_sid") : null;
403
403
  try {
404
- const response = await chunkIWHAJBYL_js.sonorFetch(`${apiUrl}/api/public/commerce/checkout`, {
404
+ const response = await chunkPXN7LIYZ_js.sonorFetch(`${apiUrl}/api/public/commerce/checkout`, {
405
405
  method: "POST",
406
406
  headers: { "Content-Type": "application/json" },
407
407
  body: JSON.stringify({
@@ -3123,7 +3123,7 @@ function ProductDetail({
3123
3123
  const [checkoutError, setCheckoutError] = React5.useState(null);
3124
3124
  const [showStickyBar, setShowStickyBar] = React5.useState(false);
3125
3125
  const buyButtonRef = React5.useRef(null);
3126
- const analytics = chunkMTHMOXZF_js.useAnalyticsOptional();
3126
+ const analytics = chunkRNEPZD2I_js.useAnalyticsOptional();
3127
3127
  React5.useEffect(() => {
3128
3128
  if (propProduct) {
3129
3129
  setProduct(propProduct);
@@ -4494,7 +4494,7 @@ function CheckoutForm({
4494
4494
  const [discountResult, setDiscountResult] = React5.useState(null);
4495
4495
  const [applyingDiscount, setApplyingDiscount] = React5.useState(false);
4496
4496
  const isProduct = offering.type === "product";
4497
- const analytics = chunkMTHMOXZF_js.useAnalyticsOptional();
4497
+ const analytics = chunkRNEPZD2I_js.useAnalyticsOptional();
4498
4498
  React5.useEffect(() => {
4499
4499
  fetchProcessorConfig().then((config) => {
4500
4500
  if (config?.processor) setProcessor(config.processor);
@@ -7270,7 +7270,7 @@ function EventsWidget({
7270
7270
  setLoading(true);
7271
7271
  setError(null);
7272
7272
  try {
7273
- const response = await chunkIWHAJBYL_js.sonorFetch(`${apiUrl}/api/public/commerce/events`, {
7273
+ const response = await chunkPXN7LIYZ_js.sonorFetch(`${apiUrl}/api/public/commerce/events`, {
7274
7274
  method: "POST",
7275
7275
  headers: { "Content-Type": "application/json" },
7276
7276
  body: JSON.stringify({
@@ -8067,5 +8067,5 @@ exports.shippingSelection = shippingSelection;
8067
8067
  exports.useEventModal = useEventModal;
8068
8068
  exports.validateAddress = validateAddress;
8069
8069
  exports.validateDiscountCode = validateDiscountCode;
8070
- //# sourceMappingURL=chunk-JSM4AYSZ.js.map
8071
- //# sourceMappingURL=chunk-JSM4AYSZ.js.map
8070
+ //# sourceMappingURL=chunk-OZLYJSFE.js.map
8071
+ //# sourceMappingURL=chunk-OZLYJSFE.js.map