@sonordev/site-kit 8.8.1 → 8.9.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 (456) hide show
  1. package/CHANGELOG.md +18 -0
  2. package/README.md +9 -0
  3. package/agent-manifest.json +49 -42
  4. package/dist/AnalyticsProvider-X7JJN3QL.js +19 -0
  5. package/dist/{ArticleViewTracker-PV2RD3P6.js → ArticleViewTracker-7Q6AMCKX.js} +11 -10
  6. package/dist/{BlocksPopup-NEEFV2L3.js → BlocksPopup-U5VIYEBA.js} +4 -5
  7. package/dist/ChatWidget-EAATOFCT.js +30 -0
  8. package/dist/{FileField-MJ3RCNFJ.js → FileField-YWMSK7RF.js} +1 -3
  9. package/dist/{FormSpotlight-NQPQFZS7.js → FormSpotlight-MAXDW3TK.js} +1 -1
  10. package/dist/{FormStage-4T5PJR5K.js → FormStage-VAHRVOIZ.js} +1 -1
  11. package/dist/ManagedForm-7IZT7ZII.js +29 -0
  12. package/dist/{ManagedNewsletterForm-TUYGN6O3.js → ManagedNewsletterForm-VVXZSEAL.js} +21 -11
  13. package/dist/{SignalCore-OW3YIH6M.js → SignalCore-HAN4O7QG.js} +90 -36
  14. package/dist/{SiteChat-XMKHBSEK.js → SiteChat-3JLCEL2N.js} +2 -2
  15. package/dist/{SiteDesignReporter-BRH7ORQS.js → SiteDesignReporter-6CCO645E.js} +5 -6
  16. package/dist/SitePopups-ZGHQNGGH.js +19 -0
  17. package/dist/SitemapSync-5LSYCBKS.js +7 -0
  18. package/dist/SitemapSync.d.ts +1 -1
  19. package/dist/_client/booking-widget.d.ts +1 -1
  20. package/dist/_client/booking-widget.js +6 -7
  21. package/dist/_client/reviewed-signal-experiment.d.ts +9 -0
  22. package/dist/_client/reviewed-signal-experiment.js +89 -0
  23. package/dist/_client/testimonial-section.d.ts +1 -1
  24. package/dist/admin-auth/index.d.ts +3 -3
  25. package/dist/affiliates/AffiliatesWidget.d.ts +1 -1
  26. package/dist/affiliates/api.d.ts +1 -1
  27. package/dist/affiliates/index.d.ts +6 -6
  28. package/dist/affiliates/index.js +1 -3
  29. package/dist/affiliates/useAffiliates.d.ts +1 -1
  30. package/dist/analytics/AnalyticsProvider.d.ts +1 -1
  31. package/dist/analytics/dispatch.d.ts +1 -1
  32. package/dist/analytics/index.d.ts +6 -6
  33. package/dist/analytics/index.js +22 -12
  34. package/dist/analytics/publication-cta.d.ts +1 -1
  35. package/dist/analytics/send-gate.d.ts +8 -4
  36. package/dist/articles/Article.d.ts +1 -1
  37. package/dist/articles/ArticleFAQ.d.ts +1 -1
  38. package/dist/articles/ArticleFaqSection.d.ts +1 -1
  39. package/dist/articles/ArticleList.d.ts +1 -1
  40. package/dist/articles/ArticleViewTracker.d.ts +1 -1
  41. package/dist/articles/AuthorCard.d.ts +1 -1
  42. package/dist/articles/AuthorPage.d.ts +1 -1
  43. package/dist/articles/ClusterLandingPage.d.ts +1 -1
  44. package/dist/articles/ClusterNavigation.d.ts +1 -1
  45. package/dist/articles/ManagedNewsletterForm.d.ts +2 -2
  46. package/dist/articles/NewsletterShell.d.ts +1 -1
  47. package/dist/articles/NewsletterWidget.d.ts +1 -1
  48. package/dist/articles/PublicationLayout.d.ts +1 -1
  49. package/dist/articles/PublicationSidebar.d.ts +1 -1
  50. package/dist/articles/RelatedPosts.d.ts +1 -1
  51. package/dist/articles/ServiceCallout.d.ts +1 -1
  52. package/dist/articles/TableOfContents.d.ts +1 -1
  53. package/dist/articles/article-photos.d.ts +1 -1
  54. package/dist/articles/article-styles.d.ts +1 -1
  55. package/dist/articles/article-tables.d.ts +1 -1
  56. package/dist/articles/artwork.d.ts +1 -1
  57. package/dist/articles/author-schema.d.ts +1 -1
  58. package/dist/articles/author-social.d.ts +1 -1
  59. package/dist/articles/excerpt.d.ts +1 -1
  60. package/dist/articles/index.d.ts +1 -1
  61. package/dist/articles/index.js +3 -3
  62. package/dist/articles/news-sitemap.d.ts +1 -1
  63. package/dist/articles/processArticleHtml.d.ts +1 -1
  64. package/dist/articles/public-reads.d.ts +1 -1
  65. package/dist/articles/reading-time.d.ts +1 -1
  66. package/dist/articles/routes.d.ts +1 -1
  67. package/dist/articles/server-core.d.ts +1 -1
  68. package/dist/articles/server-ui.d.ts +1 -1
  69. package/dist/articles/server-ui.js +6 -6
  70. package/dist/articles/server.d.ts +1 -1
  71. package/dist/articles/server.js +5 -5
  72. package/dist/articles/types.d.ts +1 -1
  73. package/dist/articles/widget-styles.d.ts +1 -1
  74. package/dist/brand/extract-brand-profile.d.ts +1 -1
  75. package/dist/chat/ChatWidget.d.ts +1 -1
  76. package/dist/chat/EchoUiActions.d.ts +1 -1
  77. package/dist/chat/SiteChat.d.ts +2 -2
  78. package/dist/chat/chat-messages.d.ts +1 -1
  79. package/dist/chat/index.d.ts +7 -7
  80. package/dist/chat/index.js +17 -9
  81. package/dist/chat/launcher-placement.d.ts +1 -1
  82. package/dist/{chunk-OPUY4RS6.js → chunk-2LBKIE2K.js} +2 -1
  83. package/dist/{chunk-XIDWNXZN.js → chunk-3W3MN6Z7.js} +2 -2
  84. package/dist/{chunk-UPFU63L4.js → chunk-55GFMOI6.js} +1 -1
  85. package/dist/chunk-5IVD6G77.js +37 -0
  86. package/dist/{chunk-URLTBVRX.js → chunk-6EDE7BOE.js} +3 -3
  87. package/dist/{chunk-DYROJGI2.js → chunk-6NLVHTYY.js} +1 -1
  88. package/dist/{chunk-ZQSCMYZO.js → chunk-7643MCD2.js} +6 -3
  89. package/dist/chunk-7IZUUXXO.js +1 -0
  90. package/dist/{chunk-C7TLGL3R.js → chunk-7VMA3KCN.js} +30 -4
  91. package/dist/{chunk-OWZWRP7Y.js → chunk-ADQ3VCKK.js} +2 -2
  92. package/dist/chunk-AG2RDHYZ.js +45 -0
  93. package/dist/chunk-AWLPFFPO.js +36 -0
  94. package/dist/{chunk-LNSNA3W4.js → chunk-C4XK472G.js} +4 -3
  95. package/dist/{chunk-TP32MRXV.js → chunk-CJ43K7RA.js} +2 -2
  96. package/dist/chunk-D4M5K6JN.js +25 -0
  97. package/dist/{chunk-F6WLHVMQ.js → chunk-DXE6SXWW.js} +1 -1
  98. package/dist/{chunk-YEX5RAEU.js → chunk-EBEM5BI5.js} +38 -27
  99. package/dist/chunk-F3RKFGRW.js +2 -0
  100. package/dist/chunk-FAY6MOLL.js +62 -0
  101. package/dist/chunk-FRY6PBT6.js +31 -0
  102. package/dist/{chunk-JYITKUUB.js → chunk-G5WUX7VE.js} +1 -1
  103. package/dist/chunk-HJD6KXKH.js +147 -0
  104. package/dist/{chunk-6BFQI3ZE.js → chunk-IO6BWRZ5.js} +2 -2
  105. package/dist/{chunk-THXELZTQ.js → chunk-ISMHDUBW.js} +1 -1
  106. package/dist/{chunk-SLFYTELD.js → chunk-J4LJE4NB.js} +1 -1
  107. package/dist/chunk-JT7GHHMV.js +56 -0
  108. package/dist/{chunk-NFGAXWCN.js → chunk-KGIQYVQ2.js} +31 -13
  109. package/dist/chunk-KMNHNCVG.js +20 -0
  110. package/dist/chunk-KQKUXIUD.js +25 -0
  111. package/dist/{chunk-M5JIHQ42.js → chunk-L3S5WH4C.js} +2 -2
  112. package/dist/chunk-MDBXGN6W.js +13 -0
  113. package/dist/chunk-MOACHHOJ.js +20 -0
  114. package/dist/{chunk-6DXQHNZK.js → chunk-MP35JETP.js} +1 -1
  115. package/dist/chunk-NHDRA4Y5.js +6 -0
  116. package/dist/{chunk-AYQEIMGS.js → chunk-NZHECYLF.js} +103 -22
  117. package/dist/{chunk-EATJPSTS.js → chunk-O5LQUBBN.js} +1 -1
  118. package/dist/{chunk-Y6SHFILE.js → chunk-OEOSR5EG.js} +1 -1
  119. package/dist/{chunk-GQN4BGK6.js → chunk-OUD4RTBD.js} +1 -1
  120. package/dist/chunk-PMXQPO5Q.js +78 -0
  121. package/dist/chunk-PVY7X5UR.js +21 -0
  122. package/dist/{chunk-KG5IEV7I.js → chunk-QLJ2SC3T.js} +1 -1
  123. package/dist/{chunk-2WM4TNDF.js → chunk-QXAJPB6O.js} +1 -1
  124. package/dist/{chunk-2WDWQI7K.js → chunk-RYR6N4X4.js} +1 -1
  125. package/dist/{chunk-G7BRCSV6.js → chunk-S33CUULL.js} +3 -3
  126. package/dist/{chunk-YRQS7VAH.js → chunk-S63QY5XW.js} +2 -2
  127. package/dist/{chunk-GXWM5KNS.js → chunk-SO6RSRUP.js} +40 -45
  128. package/dist/{chunk-ODOV76VW.js → chunk-STIVFCWM.js} +1 -1
  129. package/dist/{chunk-SVHPILS3.js → chunk-T4A5J6SJ.js} +1 -1
  130. package/dist/chunk-TPHOIE4I.js +73 -0
  131. package/dist/{chunk-IWNJCRXW.js → chunk-UG53ZW7S.js} +125 -118
  132. package/dist/chunk-VXCUXHZO.js +9 -0
  133. package/dist/{chunk-SBPUFTMP.js → chunk-WHFWDK2H.js} +2 -2
  134. package/dist/chunk-WYNDBJG7.js +66 -0
  135. package/dist/{chunk-HN7GVGWC.js → chunk-XDH5B3PR.js} +3 -3
  136. package/dist/{chunk-PAYCK7FC.js → chunk-XJZLXUTG.js} +1 -1
  137. package/dist/{chunk-IDC5CVBR.js → chunk-YVEYO3OD.js} +1 -1
  138. package/dist/{chunk-PSS6M4CG.js → chunk-ZRSXCT4O.js} +2 -2
  139. package/dist/client/index.d.ts +8 -8
  140. package/dist/client/index.js +9 -8
  141. package/dist/config/index.d.ts +1 -1
  142. package/dist/contracts/broadcast-layouts.d.ts +8 -0
  143. package/dist/contracts/crm-disposition.d.ts +87 -0
  144. package/dist/contracts/decision-roles.d.ts +39 -0
  145. package/dist/contracts/entries.d.ts +1 -1
  146. package/dist/contracts/funnels.d.ts +85 -2
  147. package/dist/contracts/portfolio.d.ts +1 -1
  148. package/dist/contracts/publication-branding.d.ts +3 -3
  149. package/dist/contracts/resonance-constants.d.ts +4 -0
  150. package/dist/contracts/resonance.d.ts +8461 -0
  151. package/dist/contracts/signal-experiments.d.ts +219 -0
  152. package/dist/contracts/site-edit.d.ts +2 -2
  153. package/dist/contracts/sites.d.ts +1 -1
  154. package/dist/contracts/slots.d.ts +2 -2
  155. package/dist/contracts/wire-schema.d.ts +36 -0
  156. package/dist/cta-bar/CtaBar.d.ts +1 -1
  157. package/dist/cta-bar/client.js +3 -2
  158. package/dist/cta-bar/index.d.ts +4 -4
  159. package/dist/cta-bar/index.js +4 -3
  160. package/dist/fleet/FleetHeartbeat.d.ts +2 -2
  161. package/dist/fleet/contract.d.ts +1 -1
  162. package/dist/fleet/heartbeat.d.ts +2 -2
  163. package/dist/fleet/index.d.ts +6 -6
  164. package/dist/fleet/index.js +4 -5
  165. package/dist/forms/FileField.d.ts +1 -1
  166. package/dist/forms/FormClient.d.ts +2 -2
  167. package/dist/forms/FormEnhancer.d.ts +1 -1
  168. package/dist/forms/FormField.d.ts +1 -1
  169. package/dist/forms/FormSpotlight.d.ts +1 -1
  170. package/dist/forms/FormStage.d.ts +1 -1
  171. package/dist/forms/ManagedForm.d.ts +1 -1
  172. package/dist/forms/PrivateFileField.d.ts +1 -1
  173. package/dist/forms/ServerForm.d.ts +3 -3
  174. package/dist/forms/StaticForm.d.ts +1 -1
  175. package/dist/forms/contract.d.ts +1 -1
  176. package/dist/forms/experience-plan.d.ts +1 -1
  177. package/dist/forms/field-autocomplete.d.ts +1 -1
  178. package/dist/forms/field-controls.d.ts +1 -1
  179. package/dist/forms/field-rules.d.ts +1 -1
  180. package/dist/forms/form-dom-values.d.ts +1 -1
  181. package/dist/forms/index.d.ts +18 -18
  182. package/dist/forms/index.js +21 -11
  183. package/dist/forms/normalize-config.d.ts +1 -1
  184. package/dist/forms/server.d.ts +4 -4
  185. package/dist/forms/server.js +3 -3
  186. package/dist/forms/static.d.ts +2 -2
  187. package/dist/forms/submitForm.d.ts +2 -2
  188. package/dist/forms/tracking-session.d.ts +1 -1
  189. package/dist/forms/useForm.d.ts +2 -2
  190. package/dist/forms/webmcp.d.ts +2 -2
  191. package/dist/images/api.d.ts +1 -1
  192. package/dist/images/index.d.ts +6 -6
  193. package/dist/images/index.js +2 -4
  194. package/dist/images/server.d.ts +2 -2
  195. package/dist/index.d.ts +13 -13
  196. package/dist/index.js +1 -1
  197. package/dist/landing/contract.d.ts +1 -1
  198. package/dist/landing/contract.js +2 -1
  199. package/dist/landing/index.d.ts +3 -3
  200. package/dist/landing/index.js +3 -2
  201. package/dist/landing/managed-server.d.ts +2 -2
  202. package/dist/landing/managed.d.ts +10 -2
  203. package/dist/landing/server.d.ts +7 -7
  204. package/dist/landing/server.js +11 -6
  205. package/dist/layout/AiDiscoveryLinks.d.ts +1 -1
  206. package/dist/layout/SiteKitClientProviders.d.ts +1 -1
  207. package/dist/layout/SiteKitLayout.d.ts +2 -2
  208. package/dist/layout/client.d.ts +1 -1
  209. package/dist/layout/client.js +15 -11
  210. package/dist/layout/index.d.ts +5 -5
  211. package/dist/layout/index.js +17 -13
  212. package/dist/layout/types.d.ts +2 -2
  213. package/dist/llms/AEOComponents.d.ts +1 -1
  214. package/dist/llms/SpeakableSchema.d.ts +1 -1
  215. package/dist/llms/api.d.ts +1 -1
  216. package/dist/llms/client.d.ts +3 -3
  217. package/dist/llms/contract.d.ts +1 -1
  218. package/dist/llms/generateLLMsTxt.d.ts +1 -1
  219. package/dist/llms/handlers.d.ts +1 -1
  220. package/dist/llms/index.d.ts +21 -21
  221. package/dist/llms/index.js +5 -5
  222. package/dist/llms/merge.d.ts +1 -1
  223. package/dist/llms/sourcedFacts.d.ts +1 -1
  224. package/dist/llms/types.d.ts +5 -5
  225. package/dist/llms/writeLLMsTxt.d.ts +3 -3
  226. package/dist/maps/GoogleMap.d.ts +1 -1
  227. package/dist/maps/NeighborhoodMap.d.ts +1 -1
  228. package/dist/maps/api.d.ts +1 -1
  229. package/dist/maps/index.d.ts +5 -5
  230. package/dist/maps/index.js +1 -3
  231. package/dist/mcp/WebMcpTools.d.ts +1 -1
  232. package/dist/mcp/client.d.ts +2 -2
  233. package/dist/mcp/discovery.d.ts +2 -2
  234. package/dist/mcp/handlers.d.ts +4 -4
  235. package/dist/mcp/index.d.ts +12 -12
  236. package/dist/mcp/protocol.d.ts +1 -1
  237. package/dist/mcp/report.d.ts +1 -1
  238. package/dist/mcp/serverCard.d.ts +1 -1
  239. package/dist/mcp/sonor.d.ts +5 -5
  240. package/dist/mcp/sonor.js +10 -10
  241. package/dist/mcp/transport.d.ts +1 -1
  242. package/dist/motion/Parallax.d.ts +1 -1
  243. package/dist/motion/ScrollScene.d.ts +1 -1
  244. package/dist/motion/gsap.d.ts +2 -2
  245. package/dist/motion/index.d.ts +9 -9
  246. package/dist/motion/three.d.ts +1 -1
  247. package/dist/og/index.d.ts +5 -5
  248. package/dist/og/pages.d.ts +1 -1
  249. package/dist/og/route-fit.d.ts +17 -0
  250. package/dist/og/template.d.ts +1 -1
  251. package/dist/portfolio/contract.d.ts +1 -1
  252. package/dist/press-kit/articles/Article.d.ts +2 -2
  253. package/dist/press-kit/articles/ArticleFaqSection.d.ts +1 -1
  254. package/dist/press-kit/articles/ArticleList.d.ts +2 -2
  255. package/dist/press-kit/articles/AuthorCard.d.ts +1 -1
  256. package/dist/press-kit/articles/AuthorPage.d.ts +1 -1
  257. package/dist/press-kit/articles/ClusterLandingPage.d.ts +2 -2
  258. package/dist/press-kit/articles/ClusterNavigation.d.ts +2 -2
  259. package/dist/press-kit/articles/ManagedNewsletterForm.d.ts +2 -2
  260. package/dist/press-kit/articles/PublicationLayout.d.ts +2 -2
  261. package/dist/press-kit/articles/PublicationSidebar.d.ts +1 -1
  262. package/dist/press-kit/articles/RelatedPosts.d.ts +2 -2
  263. package/dist/press-kit/articles/TableOfContents.d.ts +1 -1
  264. package/dist/press-kit/articles/article-body.d.ts +1 -1
  265. package/dist/press-kit/articles/article-headings.d.ts +1 -1
  266. package/dist/press-kit/articles/article-photos.d.ts +1 -1
  267. package/dist/press-kit/articles/artwork.d.ts +2 -2
  268. package/dist/press-kit/articles/author-schema.d.ts +2 -2
  269. package/dist/press-kit/articles/author-social.d.ts +1 -1
  270. package/dist/press-kit/articles/index.d.ts +23 -23
  271. package/dist/press-kit/articles/news-sitemap.d.ts +2 -2
  272. package/dist/press-kit/articles/public-reads.d.ts +1 -1
  273. package/dist/press-kit/articles/publication-reads.d.ts +2 -2
  274. package/dist/press-kit/articles/reading-time.d.ts +1 -1
  275. package/dist/press-kit/articles/server-core.d.ts +20 -20
  276. package/dist/press-kit/articles/server-ui.d.ts +20 -20
  277. package/dist/press-kit/articles/types.d.ts +1 -1
  278. package/dist/proxy/index.d.ts +5 -5
  279. package/dist/proxy/index.js +1 -1
  280. package/dist/reputation/TestimonialSection.d.ts +1 -1
  281. package/dist/reputation/VisualReviewCard.d.ts +1 -1
  282. package/dist/reputation/api.d.ts +1 -1
  283. package/dist/reputation/index.d.ts +4 -4
  284. package/dist/reputation/server.d.ts +3 -3
  285. package/dist/resonance/ResonanceRuntime.d.ts +7 -0
  286. package/dist/resonance/bridge.d.ts +16 -0
  287. package/dist/resonance/consent-adapter.d.ts +26 -0
  288. package/dist/resonance/controller-registry.d.ts +14 -0
  289. package/dist/resonance/controller.d.ts +103 -0
  290. package/dist/resonance/form-context.d.ts +5 -0
  291. package/dist/resonance/index.d.ts +4 -0
  292. package/dist/resonance/index.js +9 -0
  293. package/dist/resonance/meta-pixel.d.ts +67 -0
  294. package/dist/resonance/providers.d.ts +32 -0
  295. package/dist/resonance/runtime-core.d.ts +5 -0
  296. package/dist/revalidate/index.d.ts +3 -3
  297. package/dist/revalidate/index.js +2 -2
  298. package/dist/robots/index.d.ts +3 -3
  299. package/dist/robots/indexnow.js +2 -2
  300. package/dist/runtime/index.d.ts +7 -7
  301. package/dist/runtime/index.js +4 -5
  302. package/dist/runtime-core-WT7KKLWQ.js +2213 -0
  303. package/dist/seo/ManagedFAQ.d.ts +1 -1
  304. package/dist/seo/ManagedInternalLinks.d.ts +1 -1
  305. package/dist/seo/ManagedSchema.d.ts +1 -1
  306. package/dist/seo/ManagedScripts.d.ts +1 -1
  307. package/dist/seo/client.d.ts +1 -1
  308. package/dist/seo/client.js +3 -5
  309. package/dist/seo/entry-indexnow.d.ts +1 -1
  310. package/dist/seo/entry-llms-client.d.ts +1 -1
  311. package/dist/seo/entry-llms-contract.d.ts +1 -1
  312. package/dist/seo/entry-llms.d.ts +1 -1
  313. package/dist/seo/entry-meta-contract.d.ts +1 -1
  314. package/dist/seo/entry-og-route.d.ts +1 -1
  315. package/dist/seo/entry-og.d.ts +1 -1
  316. package/dist/seo/entry-pages-contract.d.ts +1 -1
  317. package/dist/seo/entry-redirects.d.ts +1 -1
  318. package/dist/seo/entry-robots.d.ts +1 -1
  319. package/dist/seo/entry-sitemap.d.ts +1 -1
  320. package/dist/seo/getManagedMetadata.d.ts +1 -1
  321. package/dist/seo/index.d.ts +12 -12
  322. package/dist/seo/index.js +9 -11
  323. package/dist/seo/indexnow.d.ts +1 -1
  324. package/dist/seo/indexnow.js +2 -2
  325. package/dist/seo/llms/client.d.ts +1 -1
  326. package/dist/seo/llms/contract.d.ts +1 -1
  327. package/dist/seo/llms.d.ts +1 -1
  328. package/dist/seo/llms.js +5 -5
  329. package/dist/seo/meta/contract.d.ts +1 -1
  330. package/dist/seo/og.d.ts +1 -1
  331. package/dist/seo/pages/contract.d.ts +1 -1
  332. package/dist/seo/redirects.d.ts +1 -1
  333. package/dist/seo/register-sitemap-cli-impl.d.ts +1 -1
  334. package/dist/seo/register-sitemap-cli.js +1 -1
  335. package/dist/seo/robots.d.ts +1 -1
  336. package/dist/seo/routing.d.ts +1 -1
  337. package/dist/seo/server.d.ts +4 -4
  338. package/dist/seo/server.js +3 -3
  339. package/dist/seo/sitemap.d.ts +1 -1
  340. package/dist/seo/sitemap.js +3 -3
  341. package/dist/seo/types.d.ts +1 -1
  342. package/dist/seo-meta/contract.d.ts +1 -1
  343. package/dist/seo-pages/contract.d.ts +1 -1
  344. package/dist/server/index.d.ts +5 -5
  345. package/dist/server/index.js +3 -3
  346. package/dist/server/mint-site-token.d.ts +1 -1
  347. package/dist/server/server-fetch.d.ts +8 -0
  348. package/dist/{server-api-XIKDWSNO.js → server-api-A34TABT2.js} +2 -2
  349. package/dist/shared/build-entries.d.ts +3 -1
  350. package/dist/shared/color.d.ts +1 -1
  351. package/dist/shared/fetchWithRetry.d.ts +6 -0
  352. package/dist/shared/frame.d.ts +1 -1
  353. package/dist/shared/identity-storage.d.ts +6 -4
  354. package/dist/shared/identity.d.ts +1 -3
  355. package/dist/shared/index.d.ts +5 -5
  356. package/dist/shared/index.js +1 -1
  357. package/dist/shared/measurement-analytics.d.ts +1 -0
  358. package/dist/shared/measurement-policy.d.ts +6 -0
  359. package/dist/shared/measurement-proof.d.ts +5 -0
  360. package/dist/shared/measurement-store.d.ts +34 -0
  361. package/dist/shared/measurement-writer.d.ts +6 -0
  362. package/dist/shared/publishCredential.d.ts +1 -1
  363. package/dist/shared/reporting-gate.d.ts +3 -1
  364. package/dist/shared/site-token-claims.d.ts +18 -0
  365. package/dist/shared/site-token-configuration.d.ts +9 -0
  366. package/dist/shared/site-token-refresh.d.ts +7 -0
  367. package/dist/shared/site-token-state.d.ts +23 -0
  368. package/dist/shared/siteToken.d.ts +5 -39
  369. package/dist/shared/sonor-auth-state.d.ts +3 -0
  370. package/dist/shared/sonor-beacon.d.ts +13 -0
  371. package/dist/shared/sonor-fetch-runtime.d.ts +2 -0
  372. package/dist/shared/sonor-fetch.d.ts +7 -0
  373. package/dist/shared/sonorFetch.d.ts +4 -49
  374. package/dist/shared/version.d.ts +1 -1
  375. package/dist/signal/ReviewedSignalExperiment.d.ts +9 -0
  376. package/dist/signal/SignalBridge.d.ts +4 -4
  377. package/dist/signal/SignalCore.d.ts +2 -1
  378. package/dist/signal/SignalExperiment.d.ts +13 -5
  379. package/dist/signal/index.d.ts +3 -3
  380. package/dist/signal/index.js +4 -73
  381. package/dist/signal/store.d.ts +10 -7
  382. package/dist/signal/types.d.ts +4 -0
  383. package/dist/sitemap/index.d.ts +5 -5
  384. package/dist/sitemap/index.js +3 -3
  385. package/dist/sites/contract.d.ts +1 -1
  386. package/dist/sites/normalize.d.ts +1 -1
  387. package/dist/slots/ManagedLink.d.ts +2 -2
  388. package/dist/slots/ManagedList.d.ts +2 -2
  389. package/dist/slots/ManagedRichText.d.ts +1 -1
  390. package/dist/slots/ManagedSlot.d.ts +1 -1
  391. package/dist/slots/contract.d.ts +1 -1
  392. package/dist/slots/edit/locate.d.ts +1 -1
  393. package/dist/slots/index.d.ts +14 -14
  394. package/dist/slots/index.js +2 -2
  395. package/dist/slots/server-api.d.ts +1 -1
  396. package/dist/{chunk-FLOJUMFR.js → sonor-fetch-runtime-3PFGUXMF.js} +27 -36
  397. package/dist/sync/AddToCalendar.d.ts +1 -1
  398. package/dist/sync/BookingWidget.d.ts +1 -1
  399. package/dist/sync/MeetingFormatStep.d.ts +1 -1
  400. package/dist/sync/api.d.ts +2 -2
  401. package/dist/sync/booking-flow.d.ts +1 -1
  402. package/dist/sync/index.d.ts +3 -3
  403. package/dist/sync/index.js +6 -7
  404. package/dist/types.d.ts +6 -6
  405. package/dist/website/BlocksPopup.d.ts +1 -1
  406. package/dist/website/PopupBlocks.d.ts +1 -1
  407. package/dist/website/SiteDesignReporter.d.ts +2 -2
  408. package/dist/website/SitePopups.d.ts +1 -1
  409. package/dist/website/contract.d.ts +1 -1
  410. package/dist/website/cta-bar.d.ts +1 -1
  411. package/dist/website/cta-bar.js +4 -3
  412. package/dist/website/design.d.ts +2 -2
  413. package/dist/website/images/server.d.ts +1 -1
  414. package/dist/website/images-server.d.ts +1 -1
  415. package/dist/website/images.d.ts +1 -1
  416. package/dist/website/images.js +2 -4
  417. package/dist/website/index.d.ts +4 -4
  418. package/dist/website/index.js +5 -6
  419. package/dist/website/landing/server.d.ts +1 -1
  420. package/dist/website/landing/server.js +11 -6
  421. package/dist/website/landing-server.d.ts +1 -1
  422. package/dist/website/landing.d.ts +1 -1
  423. package/dist/website/landing.js +3 -2
  424. package/dist/website/popup-rules.d.ts +2 -2
  425. package/dist/website/popup-types.d.ts +1 -1
  426. package/dist/website/popups.d.ts +4 -4
  427. package/dist/website/popups.js +14 -8
  428. package/dist/website/slots/contract.d.ts +1 -1
  429. package/dist/website/slots-contract.d.ts +1 -1
  430. package/dist/website/slots.d.ts +2 -2
  431. package/dist/website/slots.js +2 -2
  432. package/dist/{writeLLMsTxt-4HHUAOA6.js → writeLLMsTxt-JUACXQKP.js} +2 -2
  433. package/docs.json +5 -0
  434. package/package.json +8 -2
  435. package/src/analytics/README.md +21 -0
  436. package/src/cta-bar/README.md +4 -0
  437. package/src/forms/README.md +29 -0
  438. package/src/landing/README.md +14 -0
  439. package/src/layout/README.md +3 -0
  440. package/src/resonance/README.md +273 -0
  441. package/src/runtime/README.md +6 -1
  442. package/src/signal/README.md +21 -0
  443. package/src/website/README.md +14 -2
  444. package/dist/AnalyticsProvider-7SBJ27SI.js +0 -13
  445. package/dist/ChatWidget-V46UBDOM.js +0 -20
  446. package/dist/ManagedForm-DDDVMKLJ.js +0 -19
  447. package/dist/SitePopups-VU2C3Z6B.js +0 -13
  448. package/dist/SitemapSync-C4H3HF3L.js +0 -9
  449. package/dist/chunk-5ROTTMBL.js +0 -19
  450. package/dist/chunk-5TM3WPCI.js +0 -7
  451. package/dist/chunk-7HW4TZB5.js +0 -148
  452. package/dist/chunk-IPQKQEWI.js +0 -52
  453. package/dist/chunk-LCDVPAMR.js +0 -24
  454. package/dist/chunk-LQJC5S2M.js +0 -236
  455. package/dist/chunk-SHAUX2MQ.js +0 -163
  456. /package/dist/{chunk-3MJNBOUO.js → chunk-2QPVU63T.js} +0 -0
@@ -56,6 +56,14 @@ function isNextControlFlow(error) {
56
56
  }
57
57
  return false;
58
58
  }
59
+ var ServerApiFetchError = class extends Error {
60
+ constructor(category, status = null) {
61
+ super(`Sonor server request failed (${category})`);
62
+ this.category = category;
63
+ this.status = status;
64
+ this.name = "ServerApiFetchError";
65
+ }
66
+ };
59
67
  async function serverApiFetch(path, options = {}) {
60
68
  const {
61
69
  method = "GET",
@@ -70,16 +78,18 @@ async function serverApiFetch(path, options = {}) {
70
78
  timeoutMs = DEFAULT_ATTEMPT_TIMEOUT_MS,
71
79
  totalTimeoutMs = DEFAULT_TOTAL_TIMEOUT_MS,
72
80
  requireKey = false,
81
+ throwOnError = false,
73
82
  logPrefix = "@sonordev/site-kit",
74
83
  init
75
84
  } = options;
76
85
  const overrides = { apiKey: overrideApiKey, apiUrl: overrideApiUrl };
77
86
  let config;
78
- if (requireKey) {
87
+ if (requireKey && !throwOnError) {
79
88
  config = requireServerApiConfig(overrides);
80
89
  } else {
81
90
  const resolved = resolveServerApiConfig(overrides);
82
91
  if (!resolved) {
92
+ if (throwOnError) throw new ServerApiFetchError("configuration");
83
93
  console.warn(`${logPrefix}: Missing SONOR_API_KEY \u2014 request to ${path} skipped.`);
84
94
  return null;
85
95
  }
@@ -87,21 +97,32 @@ async function serverApiFetch(path, options = {}) {
87
97
  }
88
98
  const { apiUrl, apiKey } = config;
89
99
  const url = `${apiUrl}${path.startsWith("/") ? path : `/${path}`}`;
90
- const serializedBody = body === void 0 ? void 0 : typeof body === "string" ? body : JSON.stringify(body);
100
+ let serializedBody;
101
+ try {
102
+ serializedBody = body === void 0 ? void 0 : typeof body === "string" ? body : JSON.stringify(body);
103
+ } catch (error) {
104
+ if (isNextControlFlow(error)) throw error;
105
+ if (throwOnError) throw new ServerApiFetchError("configuration");
106
+ throw error;
107
+ }
91
108
  const attempts = retry ? Math.max(1, maxAttempts) : 1;
92
109
  const deadline = monotonicMs() + Math.max(1, totalTimeoutMs);
93
110
  for (let attempt = 1; attempt <= attempts; attempt++) {
111
+ if (throwOnError && init?.signal?.aborted) throw new ServerApiFetchError("cancelled");
94
112
  const remaining = deadline - monotonicMs();
95
113
  if (remaining <= 0) {
114
+ if (throwOnError) throw new ServerApiFetchError("timeout");
96
115
  console.warn(
97
116
  `${logPrefix}: Time budget (${totalTimeoutMs}ms) exhausted for ${method} ${path} after ${attempt - 1} attempt(s).`
98
117
  );
99
118
  return null;
100
119
  }
120
+ let signal;
101
121
  try {
122
+ signal = attemptSignal(Math.min(timeoutMs, remaining), init?.signal);
102
123
  const response = await fetch(url, {
103
124
  ...init,
104
- signal: attemptSignal(Math.min(timeoutMs, remaining), init?.signal),
125
+ signal,
105
126
  method,
106
127
  headers: {
107
128
  "Content-Type": "application/json",
@@ -124,6 +145,7 @@ async function serverApiFetch(path, options = {}) {
124
145
  continue;
125
146
  }
126
147
  if (!response.ok) {
148
+ if (throwOnError) throw new ServerApiFetchError("http", response.status);
127
149
  let detail = response.statusText;
128
150
  try {
129
151
  const err = await response.json().catch(() => ({}));
@@ -136,12 +158,15 @@ async function serverApiFetch(path, options = {}) {
136
158
  return await response.json();
137
159
  } catch (error) {
138
160
  if (isNextControlFlow(error)) throw error;
161
+ if (throwOnError && error instanceof ServerApiFetchError) throw error;
162
+ if (throwOnError && init?.signal?.aborted) throw new ServerApiFetchError("cancelled");
139
163
  if (retry && attempt < attempts && monotonicMs() < deadline) {
140
164
  await sleep(
141
165
  Math.min(200 * attempt * attempt + retryJitter() * 150, Math.max(0, deadline - monotonicMs()))
142
166
  );
143
167
  continue;
144
168
  }
169
+ if (throwOnError) throw new ServerApiFetchError(signal?.aborted || monotonicMs() >= deadline ? "timeout" : "network");
145
170
  console.warn(
146
171
  `${logPrefix}: Network error for ${url}:`,
147
172
  error instanceof Error ? error.message : error
@@ -149,7 +174,8 @@ async function serverApiFetch(path, options = {}) {
149
174
  return null;
150
175
  }
151
176
  }
177
+ if (throwOnError) throw new ServerApiFetchError("timeout");
152
178
  return null;
153
179
  }
154
180
 
155
- export { isNextControlFlow, requireServerApiConfig, resolveApiOrigin, resolveServerApiConfig, serverApiFetch };
181
+ export { ServerApiFetchError, isNextControlFlow, requireServerApiConfig, resolveApiOrigin, resolveServerApiConfig, serverApiFetch };
@@ -1,7 +1,7 @@
1
1
  'use client';
2
2
  import { locToPath, isMalformedSitemapPath, inferPageType } from './chunk-YVKRYQRG.js';
3
- import { resolveAnalyticsTarget } from './chunk-ZQSCMYZO.js';
4
- import { sonorFetch } from './chunk-FLOJUMFR.js';
3
+ import { resolveAnalyticsTarget } from './chunk-7643MCD2.js';
4
+ import { sonorFetch } from './chunk-VXCUXHZO.js';
5
5
  import { useRef, useEffect } from 'react';
6
6
 
7
7
  var SYNC_STAMP_KEY = "_sk_sitemap_synced_at";
@@ -0,0 +1,45 @@
1
+ import { subscribeMeasurementPolicy, measurementPolicySnapshot, analyticsPurposePermitted } from './chunk-FRY6PBT6.js';
2
+
3
+ // src/analytics/dispatch.ts
4
+ function isCurrentCall(call) {
5
+ const current = measurementPolicySnapshot();
6
+ return analyticsPurposePermitted() && call.collectionEpoch === current.collectionEpoch && call.identityScope === current.identityScope;
7
+ }
8
+ function enqueue(call) {
9
+ if (queue.length >= MAX_QUEUE) return;
10
+ const { collectionEpoch, identityScope } = measurementPolicySnapshot();
11
+ queue.push({ ...call, collectionEpoch, identityScope });
12
+ }
13
+ var MAX_QUEUE = 50;
14
+ var dispatcher = null;
15
+ var queue = [];
16
+ subscribeMeasurementPolicy(() => {
17
+ queue = queue.filter(isCurrentCall);
18
+ });
19
+ function registerAnalyticsDispatcher(next) {
20
+ dispatcher = next;
21
+ if (!next) return;
22
+ if (!analyticsPurposePermitted()) {
23
+ queue = [];
24
+ return;
25
+ }
26
+ const pending = queue;
27
+ queue = [];
28
+ for (const call of pending) {
29
+ if (!isCurrentCall(call)) continue;
30
+ if (call.kind === "event") next.trackEvent(call.options);
31
+ else next.trackConversion(call.options);
32
+ }
33
+ }
34
+ function trackEvent(options) {
35
+ if (!analyticsPurposePermitted()) return;
36
+ if (dispatcher) dispatcher.trackEvent(options);
37
+ else enqueue({ kind: "event", options });
38
+ }
39
+ function trackConversion(options) {
40
+ if (!analyticsPurposePermitted()) return;
41
+ if (dispatcher) dispatcher.trackConversion(options);
42
+ else enqueue({ kind: "conversion", options });
43
+ }
44
+
45
+ export { registerAnalyticsDispatcher, trackConversion, trackEvent };
@@ -0,0 +1,36 @@
1
+ 'use client';
2
+ import { useDeferredActivation } from './chunk-YC7ELZS3.js';
3
+ import { primeMeasurementPolicy } from './chunk-FRY6PBT6.js';
4
+ import { useRef, useEffect } from 'react';
5
+ import { usePathname } from 'next/navigation';
6
+
7
+ function ResonanceRuntime({ site, apiUrl, apiKey }) {
8
+ primeMeasurementPolicy();
9
+ const pathname = usePathname();
10
+ const ready = useDeferredActivation(true);
11
+ const latestPath = useRef(pathname);
12
+ latestPath.current = pathname;
13
+ const active = useRef(void 0);
14
+ useEffect(() => {
15
+ if (!ready) return;
16
+ let cancelled = false;
17
+ void import('./runtime-core-WT7KKLWQ.js').then(({ mountResonanceRuntime }) => {
18
+ if (cancelled) return;
19
+ const runtime = mountResonanceRuntime({ site, apiUrl, apiKey });
20
+ active.current = runtime;
21
+ if (latestPath.current) runtime?.navigate(latestPath.current);
22
+ }).catch(() => {
23
+ });
24
+ return () => {
25
+ cancelled = true;
26
+ active.current?.stop();
27
+ active.current = void 0;
28
+ };
29
+ }, [site, apiUrl, apiKey, ready]);
30
+ useEffect(() => {
31
+ if (pathname) active.current?.navigate(pathname);
32
+ }, [pathname]);
33
+ return null;
34
+ }
35
+
36
+ export { ResonanceRuntime };
@@ -1,5 +1,6 @@
1
- import { CtaBarBehavior } from './chunk-UPFU63L4.js';
1
+ import { CtaBarBehavior } from './chunk-55GFMOI6.js';
2
2
  import { GlassStyles } from './chunk-JE4A5S4F.js';
3
+ import * as React from 'react';
3
4
  import { jsxs, Fragment, jsx } from 'react/jsx-runtime';
4
5
 
5
6
  var CTA_BAR_STYLE_HREF = "sk-cta-bar";
@@ -178,7 +179,7 @@ function CtaBar({
178
179
  "data-hidden": showAfter ? "" : void 0,
179
180
  children: [
180
181
  children,
181
- /* @__PURE__ */ jsx(
182
+ /* @__PURE__ */ jsx(React.Suspense, { fallback: null, children: /* @__PURE__ */ jsx(
182
183
  CtaBarBehavior,
183
184
  {
184
185
  showAfter,
@@ -187,7 +188,7 @@ function CtaBar({
187
188
  compactOnScroll,
188
189
  track
189
190
  }
190
- )
191
+ ) })
191
192
  ]
192
193
  }
193
194
  )
@@ -2,9 +2,9 @@
2
2
  import { VISUAL_VIEWPORT_GAP_PROPERTY } from './chunk-6T6CQVNL.js';
3
3
  import { GlassStyles } from './chunk-JE4A5S4F.js';
4
4
  import { DEFAULT_WIDGET_Z_INDEX } from './chunk-27FISYK4.js';
5
- import { useForm } from './chunk-IWNJCRXW.js';
5
+ import { useForm } from './chunk-UG53ZW7S.js';
6
6
  import { parseColor, relativeLuminance, DARK_LUMINANCE, contrastRatio } from './chunk-S22FSH7C.js';
7
- import { sonorFetch } from './chunk-FLOJUMFR.js';
7
+ import { sonorFetch } from './chunk-VXCUXHZO.js';
8
8
  import { readPublishedApiConfig } from './chunk-W7OPEMGJ.js';
9
9
  import { useState, useEffect, useRef, useLayoutEffect, useCallback, Fragment as Fragment$1 } from 'react';
10
10
  import { lexer } from 'marked';
@@ -0,0 +1,25 @@
1
+ // src/shared/site-token-state.ts
2
+ function initialTokenState() {
3
+ return {
4
+ seed: void 0,
5
+ isToken: false,
6
+ apiUrl: "https://api.sonor.io",
7
+ token: null,
8
+ refreshing: null
9
+ };
10
+ }
11
+ var TOKEN_STATE_KEY = "__SONOR_SITE_TOKEN_STATE__";
12
+ var siteTokenState = (() => {
13
+ if (typeof window === "undefined") return initialTokenState();
14
+ const w = window;
15
+ return w[TOKEN_STATE_KEY] ?? (w[TOKEN_STATE_KEY] = initialTokenState());
16
+ })();
17
+ function isTokenMode() {
18
+ return siteTokenState.isToken;
19
+ }
20
+ function currentCredential(seed) {
21
+ if (!siteTokenState.isToken) return seed ?? siteTokenState.seed;
22
+ return siteTokenState.token ?? seed ?? siteTokenState.seed;
23
+ }
24
+
25
+ export { currentCredential, isTokenMode, siteTokenState };
@@ -1,4 +1,4 @@
1
1
  // src/shared/version.ts
2
- var SITE_KIT_VERSION = "8.8.1";
2
+ var SITE_KIT_VERSION = "8.9.0";
3
3
 
4
4
  export { SITE_KIT_VERSION };
@@ -1,10 +1,12 @@
1
1
  'use client';
2
2
  import { DEFAULT_WIDGET_Z_INDEX } from './chunk-27FISYK4.js';
3
- import { readAnalyticsIdentity } from './chunk-5ROTTMBL.js';
4
- import { getOrCreateVisitorId } from './chunk-IPQKQEWI.js';
5
- import { resolveAnalyticsTarget } from './chunk-ZQSCMYZO.js';
6
- import { sonorFetch } from './chunk-FLOJUMFR.js';
7
- import { useState, useEffect, useCallback, useRef } from 'react';
3
+ import { readAnalyticsIdentity } from './chunk-PVY7X5UR.js';
4
+ import { getOrCreateVisitorId } from './chunk-JT7GHHMV.js';
5
+ import { resolveAnalyticsTarget as resolveAnalyticsTarget$1, analyticsSend } from './chunk-PMXQPO5Q.js';
6
+ import { resolveAnalyticsTarget } from './chunk-7643MCD2.js';
7
+ import { sonorFetch } from './chunk-VXCUXHZO.js';
8
+ import { subscribeMeasurementPolicy, measurementPolicySnapshot, serverMeasurementPolicySnapshot } from './chunk-FRY6PBT6.js';
9
+ import { useState, useEffect, useCallback, useSyncExternalStore, useRef } from 'react';
8
10
  import ReactDOM from 'react-dom';
9
11
  import dynamic from 'next/dynamic';
10
12
  import { usePathname } from 'next/navigation';
@@ -161,7 +163,7 @@ function activatePopup(active, id, popups) {
161
163
  return [...active, id];
162
164
  }
163
165
  var LazyBlocksPopup = dynamic(
164
- () => import('./BlocksPopup-NEEFV2L3.js').then((m) => ({ default: m.BlocksPopup })),
166
+ () => import('./BlocksPopup-U5VIYEBA.js').then((m) => ({ default: m.BlocksPopup })),
165
167
  { ssr: false }
166
168
  );
167
169
  function SitePopups(props) {
@@ -173,7 +175,9 @@ function AllowedSitePopups({
173
175
  apiUrl,
174
176
  apiKey,
175
177
  zIndex = DEFAULT_WIDGET_Z_INDEX,
176
- debug = false
178
+ debug = false,
179
+ allowInFrame = false,
180
+ allowLocalhost = false
177
181
  }) {
178
182
  const pathname = usePathname();
179
183
  const [popups, setPopups] = useState([]);
@@ -182,13 +186,19 @@ function AllowedSitePopups({
182
186
  useEffect(() => {
183
187
  let cancelled = false;
184
188
  async function load() {
185
- const visitorId = getOrCreateVisitorId();
186
- const url = typeof window !== "undefined" ? window.location.href : "";
189
+ const epoch = measurementPolicySnapshot().collectionEpoch;
190
+ const endpoint = `${apiUrl.replace(/\/$/, "")}/engage/widget/elements`;
191
+ const requestUrl = () => {
192
+ const tracking = !!resolveAnalyticsTarget$1({ apiUrl, apiKey, allowInFrame, allowLocalhost, measurementEpoch: epoch });
193
+ const visitorId = tracking ? getOrCreateVisitorId() : "";
194
+ const url = typeof window !== "undefined" ? tracking ? window.location.href : window.location.origin + window.location.pathname : "";
195
+ return `${endpoint}?url=${encodeURIComponent(url)}&visitorId=${encodeURIComponent(visitorId)}&deviceType=${getDeviceType()}`;
196
+ };
187
197
  try {
188
198
  const response = await sonorFetch(
189
- `${apiUrl.replace(/\/$/, "")}/engage/widget/elements?url=${encodeURIComponent(url)}&visitorId=${encodeURIComponent(visitorId)}&deviceType=${getDeviceType()}`,
199
+ requestUrl(),
190
200
  {},
191
- { apiKey }
201
+ { apiKey, prepareUrl: requestUrl }
192
202
  );
193
203
  if (!response.ok) {
194
204
  if (debug) console.error("[SitePopups] Error loading popups:", response.statusText);
@@ -207,7 +217,7 @@ function AllowedSitePopups({
207
217
  return () => {
208
218
  cancelled = true;
209
219
  };
210
- }, [apiUrl, apiKey, debug]);
220
+ }, [apiUrl, apiKey, debug, allowInFrame, allowLocalhost]);
211
221
  useEffect(() => {
212
222
  watchFormInput();
213
223
  }, []);
@@ -290,7 +300,9 @@ function AllowedSitePopups({
290
300
  onEngaged: () => recordSeen(popup.id),
291
301
  zIndex,
292
302
  apiUrl,
293
- apiKey
303
+ apiKey,
304
+ allowInFrame,
305
+ allowLocalhost
294
306
  },
295
307
  popup.id
296
308
  );
@@ -304,18 +316,22 @@ function PopupView({
304
316
  onEngaged,
305
317
  zIndex,
306
318
  apiUrl,
307
- apiKey
319
+ apiKey,
320
+ allowInFrame,
321
+ allowLocalhost
308
322
  }) {
323
+ const policy = useSyncExternalStore(subscribeMeasurementPolicy, measurementPolicySnapshot, serverMeasurementPolicySnapshot);
324
+ const gate = { apiUrl: apiUrl.replace(/\/+$/, ""), apiKey, allowInFrame, allowLocalhost, measurementEpoch: policy.collectionEpoch };
309
325
  const rootRef = useRef(null);
310
326
  const counted = useRef(false);
311
327
  useEffect(() => {
312
328
  const el = rootRef.current;
313
- if (!el || counted.current) return;
329
+ if (!el || counted.current || !resolveAnalyticsTarget$1(gate)) return;
314
330
  const observer = new IntersectionObserver(
315
331
  ([entry]) => {
316
- if (entry.isIntersecting && !counted.current) {
332
+ if (entry.isIntersecting && entry.intersectionRatio >= 0.5 && !counted.current && resolveAnalyticsTarget$1(gate)) {
317
333
  counted.current = true;
318
- trackPopupEvent(apiUrl, apiKey, "impression", { elementId: popup.id });
334
+ trackPopupEvent("impression", { elementId: popup.id }, gate);
319
335
  observer.disconnect();
320
336
  }
321
337
  },
@@ -323,7 +339,7 @@ function PopupView({
323
339
  );
324
340
  observer.observe(el);
325
341
  return () => observer.disconnect();
326
- }, [apiUrl, apiKey, popup.id]);
342
+ }, [apiUrl, apiKey, popup.id, allowInFrame, allowLocalhost, policy.collectionEpoch]);
327
343
  const layout = popup.layout;
328
344
  const position = layout?.corner ?? popup.config?.position;
329
345
  const corner = position === "bottom-left" || position === "top-left" || position === "top-right" ? position : "bottom-right";
@@ -341,20 +357,15 @@ function PopupView({
341
357
  onClose: onDismiss,
342
358
  onButton: (url) => {
343
359
  onEngaged();
344
- trackPopupEvent(apiUrl, apiKey, "click", { elementId: popup.id, action: "navigate", url });
360
+ trackPopupEvent("click", { elementId: popup.id, action: "navigate", url }, gate);
345
361
  }
346
362
  }
347
363
  );
348
364
  }
349
- function trackPopupEvent(apiUrl, apiKey, endpoint, data) {
365
+ function trackPopupEvent(endpoint, data, gate) {
366
+ if (!resolveAnalyticsTarget$1(gate)) return;
350
367
  const { visitorId } = readAnalyticsIdentity();
351
- sonorFetch(`${apiUrl.replace(/\/$/, "")}/engage/widget/${endpoint}`, {
352
- method: "POST",
353
- headers: { "Content-Type": "application/json" },
354
- body: JSON.stringify({ ...data, visitorId, pageUrl: window.location.href }),
355
- keepalive: true
356
- }, { apiKey, retries: 0 }).catch(() => {
357
- });
368
+ void analyticsSend(`/engage/widget/${endpoint}`, { ...data, visitorId, pageUrl: window.location.href }, { ...gate, keepalive: true });
358
369
  }
359
370
  function getDeviceType() {
360
371
  if (typeof navigator === "undefined") return "desktop";
@@ -0,0 +1,2 @@
1
+ 'use client';
2
+ import{useSignalExperiment as v,useSignalEvent as x}from"./chunk-HJD6KXKH.js";import{recordRenderedResonanceExposure as E}from"./chunk-MOACHHOJ.js";import{subscribeMeasurementPolicy as C,measurementPolicySnapshot as S,serverMeasurementPolicySnapshot as R}from"./chunk-FRY6PBT6.js";import k,{lazy as h,Suspense as w,useRef as j,useSyncExternalStore as P,useEffect as $}from"react";import{usePathname as b}from"next/navigation";import{jsx as o,Fragment as m}from"react/jsx-runtime";var K=h(()=>import("./_client/reviewed-signal-experiment.js"));function O(e){if(e.reviewedContext){const n=e.reviewedContext.controlVariantKey,c=e.children?e.children({variant:n,isControl:!0}):Object.prototype.hasOwnProperty.call(e.variants,n)&&e.variants[n]!==void 0?e.variants[n]:e.fallback||null;return o(w,{fallback:c,children:o(K,{...e,reviewedContext:e.reviewedContext})})}return o(M,{...e})}function M({experimentId:e,variants:n,fallback:c,trackImpression:a=!0,children:s}){const{assignment:i,variant:t,isControl:l}=v(e),f=x(),d=b(),p=j(""),r=P(C,S,R);if($(()=>{const _=!!s||!!t&&n[t]!==void 0;if(a&&t&&_){const u=r.config;if(u){if(!i?.assignment_id||!i.experiment_revision||i.site!==u.site)return;const g=`${i.assignment_id}:${i.experiment_revision}:${t}:${d}:${r.proof?.currentConsentRevision}`;if(g===p.current)return;E({projectId:u.projectId,site:u.site,experimentId:e,experimentRevision:i.experiment_revision,assignmentId:i.assignment_id,variantKey:t,occurredAt:new Date().toISOString()})&&(p.current=g);return}f({event_type:"experiment",event_name:"impression",event_data:{experiment_id:e,variant_key:t}})}},[e,t,i,d,a,f,s,n,r.config?.projectId,r.config?.site,r.config?.configRevision,r.config?.policyRevision,r.proof?.currentConsentRevision]),s)return o(m,{children:s({variant:t||"control",isControl:l})});const y=n[t||"control"];return y!==void 0?o(m,{children:y}):c?o(m,{children:c}):o(m,{children:n.control||null})}function V(e){return v(e)}function z({experimentId:e,outcomeType:n="click",value:c,children:a}){const s=x(),{variant:i}=v(e),t=()=>{s({event_type:"experiment",event_name:"conversion",event_data:{experiment_id:e,variant_key:i,outcome_type:n,value:c}})};return k.cloneElement(a,{onClick:l=>{t(),a.props.onClick&&a.props.onClick(l)}})}export{z as ExperimentConversion,O as SignalExperiment,V as useExperimentVariant};
@@ -0,0 +1,62 @@
1
+ import { isSiteToken, configureSiteCredential, storeToken, tokenExp } from './chunk-TPHOIE4I.js';
2
+ import { siteTokenState } from './chunk-D4M5K6JN.js';
3
+ import { SITE_KIT_VERSION } from './chunk-DXE6SXWW.js';
4
+
5
+ // src/shared/site-token-refresh.ts
6
+ var REFRESH_SKEW_MS = 5 * 6e4;
7
+ var REFRESH_TIMEOUT_MS = 6e3;
8
+ function needsRefresh() {
9
+ if (!siteTokenState.isToken) return false;
10
+ if (!siteTokenState.token) return true;
11
+ return Date.now() >= tokenExp(siteTokenState.token) - REFRESH_SKEW_MS;
12
+ }
13
+ async function doRefresh() {
14
+ const current = siteTokenState.token;
15
+ if (!current) return null;
16
+ try {
17
+ const res = await fetch(`${siteTokenState.apiUrl}/api/public/site-token/refresh`, {
18
+ method: "POST",
19
+ headers: {
20
+ "content-type": "application/json",
21
+ "x-sitekit-version": SITE_KIT_VERSION,
22
+ // Send the current token as x-api-key too, so the server's key-scoped
23
+ // throttler buckets refreshes by token rather than by shared CDN IP.
24
+ "x-api-key": current
25
+ },
26
+ body: JSON.stringify({ token: current }),
27
+ signal: typeof AbortSignal !== "undefined" && AbortSignal.timeout ? AbortSignal.timeout(REFRESH_TIMEOUT_MS) : void 0
28
+ });
29
+ if (!res.ok) return null;
30
+ const data = await res.json().catch(() => null);
31
+ const next = data?.token;
32
+ if (typeof next === "string" && isSiteToken(next)) {
33
+ siteTokenState.token = next;
34
+ storeToken(next);
35
+ return next;
36
+ }
37
+ return null;
38
+ } catch {
39
+ return null;
40
+ }
41
+ }
42
+ function refreshSiteToken() {
43
+ if (!siteTokenState.isToken) return Promise.resolve(null);
44
+ if (siteTokenState.refreshing) return siteTokenState.refreshing;
45
+ siteTokenState.refreshing = doRefresh().finally(() => {
46
+ siteTokenState.refreshing = null;
47
+ });
48
+ return siteTokenState.refreshing;
49
+ }
50
+ async function getFreshCredential(seed) {
51
+ if (!siteTokenState.isToken && isSiteToken(seed)) {
52
+ configureSiteCredential({ credential: seed });
53
+ }
54
+ if (!siteTokenState.isToken) return seed ?? siteTokenState.seed;
55
+ if (needsRefresh()) {
56
+ const refreshed = await refreshSiteToken();
57
+ if (refreshed) return refreshed;
58
+ }
59
+ return siteTokenState.token ?? seed ?? siteTokenState.seed;
60
+ }
61
+
62
+ export { getFreshCredential, refreshSiteToken };
@@ -0,0 +1,31 @@
1
+ // src/shared/measurement-store.ts
2
+ var MEASUREMENT_PURPOSES = ["analytics_storage", "ad_storage", "ad_user_data", "ad_personalization"];
3
+ var unknownChoices = () => ({ analytics_storage: "unknown", ad_storage: "unknown", ad_user_data: "unknown", ad_personalization: "unknown" });
4
+ var initialMeasurementPolicy = { version: 0, collectionEpoch: 0, analyticsChoiceEpoch: 0, policy: "legacy_unconfigured", config: null, analyticsRequired: false, choices: unknownChoices(), cmpValid: false, preferencePending: false, proof: null, identityScope: null };
5
+ var makeStore = () => ({ current: initialMeasurementPolicy, primed: false, lastObservedAnalyticsChoice: "unknown", listeners: /* @__PURE__ */ new Set() });
6
+ var measurementStore = typeof window === "undefined" ? makeStore() : window.__SONOR_MEASUREMENT_POLICY_V1__ ?? (window.__SONOR_MEASUREMENT_POLICY_V1__ = makeStore());
7
+ function primeMeasurementPolicy() {
8
+ if (typeof window === "undefined" || measurementStore.primed) return;
9
+ measurementStore.primed = true;
10
+ if (!measurementStore.current.config) measurementStore.current = { ...measurementStore.current, policy: "resolving", collectionEpoch: measurementStore.current.collectionEpoch + 1, version: measurementStore.current.version + 1 };
11
+ }
12
+ var measurementPolicySnapshot = () => measurementStore.current;
13
+ var serverMeasurementPolicySnapshot = () => initialMeasurementPolicy;
14
+ var subscribeMeasurementPolicy = (listener) => {
15
+ measurementStore.listeners.add(listener);
16
+ return () => {
17
+ measurementStore.listeners.delete(listener);
18
+ };
19
+ };
20
+
21
+ // src/shared/measurement-analytics.ts
22
+ function analyticsPurposePermitted() {
23
+ const current = measurementPolicySnapshot();
24
+ const { choices, analyticsRequired, policy } = current;
25
+ if (choices.analytics_storage === "denied" || choices.analytics_storage === "withdrawn") return false;
26
+ if (policy === "resolving" || current.preferencePending || policy === "configured" && !!current.config && Date.parse(current.config.expiresAt) <= Date.now()) return false;
27
+ if (choices.analytics_storage === "granted") return true;
28
+ return !analyticsRequired;
29
+ }
30
+
31
+ export { MEASUREMENT_PURPOSES, analyticsPurposePermitted, measurementPolicySnapshot, measurementStore, primeMeasurementPolicy, serverMeasurementPolicySnapshot, subscribeMeasurementPolicy, unknownChoices };
@@ -4,7 +4,7 @@ import { stripHtmlTags } from './chunk-IBHBEUZV.js';
4
4
  import { resolveArticleUrl, createPublicationRoutes, resolvePublicationUrl, articleCategorySlug } from './chunk-4K735O3J.js';
5
5
  import { withoutSchemaPlaceholders } from './chunk-VWWITFWM.js';
6
6
  import { withSiteParam, withSiteBody } from './chunk-MJP63SSS.js';
7
- import { resolveServerApiConfig } from './chunk-C7TLGL3R.js';
7
+ import { resolveServerApiConfig } from './chunk-7VMA3KCN.js';
8
8
  import 'server-only';
9
9
  import { notFound } from 'next/navigation';
10
10
 
@@ -0,0 +1,147 @@
1
+ 'use client';
2
+ import { measurementPolicySnapshot, subscribeMeasurementPolicy, analyticsPurposePermitted, serverMeasurementPolicySnapshot } from './chunk-FRY6PBT6.js';
3
+ import { useSyncExternalStore, useEffect } from 'react';
4
+ import dynamic from 'next/dynamic';
5
+ import { jsxs, Fragment, jsx } from 'react/jsx-runtime';
6
+
7
+ var pendingEvents = [];
8
+ var pendingOutcomes = [];
9
+ var MAX_PENDING = 100;
10
+ var warnedNoBridge = false;
11
+ var core = null;
12
+ var queueEpoch = measurementPolicySnapshot().collectionEpoch;
13
+ subscribeMeasurementPolicy(() => {
14
+ const epoch = measurementPolicySnapshot().collectionEpoch;
15
+ if (!analyticsPurposePermitted() || epoch !== queueEpoch) {
16
+ pendingEvents.length = 0;
17
+ pendingOutcomes.length = 0;
18
+ }
19
+ queueEpoch = epoch;
20
+ });
21
+ function trackEvent(event) {
22
+ if (!analyticsPurposePermitted()) return;
23
+ if (core) {
24
+ core.trackEvent(event);
25
+ return;
26
+ }
27
+ if (pendingEvents.length < MAX_PENDING) pendingEvents.push(event);
28
+ else if (!warnedNoBridge) {
29
+ warnedNoBridge = true;
30
+ console.warn("[site-kit] Signal events are queuing but no SignalBridge has mounted \u2014 is signal enabled on SiteKitLayout?");
31
+ }
32
+ }
33
+ function trackOutcome(outcome) {
34
+ if (!analyticsPurposePermitted()) return;
35
+ if (core) {
36
+ core.trackOutcome(outcome);
37
+ return;
38
+ }
39
+ if (pendingOutcomes.length < MAX_PENDING) pendingOutcomes.push(outcome);
40
+ }
41
+ var signalQueueApi = {
42
+ trackEvent,
43
+ trackOutcome,
44
+ getExperiment: (experimentId) => core?.getExperiment(experimentId) ?? null,
45
+ refreshConfig: async () => {
46
+ await core?.refreshConfig();
47
+ }
48
+ };
49
+ function registerSignalCore(api) {
50
+ core = api;
51
+ if (!api) return;
52
+ while (pendingEvents.length && analyticsPurposePermitted() && queueEpoch === measurementPolicySnapshot().collectionEpoch) api.trackEvent(pendingEvents.shift());
53
+ while (pendingOutcomes.length && analyticsPurposePermitted() && queueEpoch === measurementPolicySnapshot().collectionEpoch) api.trackOutcome(pendingOutcomes.shift());
54
+ }
55
+ var STUB = Object.freeze({ config: null, loading: true, error: null, ...signalQueueApi });
56
+ var current = STUB;
57
+ var listeners = /* @__PURE__ */ new Set();
58
+ function emit() {
59
+ for (const listener of listeners) listener();
60
+ }
61
+ function publishSignal(value) {
62
+ current = value;
63
+ emit();
64
+ }
65
+ function publishSignalCoreState(state) {
66
+ publishSignal({ config: state.config, loading: state.loading, error: state.error, ...signalQueueApi });
67
+ }
68
+ function resetSignal() {
69
+ core = null;
70
+ pendingEvents.length = 0;
71
+ pendingOutcomes.length = 0;
72
+ current = STUB;
73
+ emit();
74
+ }
75
+ function subscribe(onChange) {
76
+ listeners.add(onChange);
77
+ return () => {
78
+ listeners.delete(onChange);
79
+ };
80
+ }
81
+ var getSnapshot = () => current;
82
+ var getServerSnapshot = () => STUB;
83
+ function useSignal() {
84
+ return useSyncExternalStore(subscribe, getSnapshot, getServerSnapshot);
85
+ }
86
+ var LazySignalCore = dynamic(
87
+ () => import('./SignalCore-HAN4O7QG.js').then((m) => ({ default: m.SignalCore })),
88
+ { ssr: false }
89
+ );
90
+ function SignalBridge({
91
+ enabled = true,
92
+ realtime = true,
93
+ experiments = true,
94
+ behaviorTracking = true,
95
+ visitorId: externalVisitorId,
96
+ sessionId: externalSessionId,
97
+ pageMetadataRef,
98
+ children
99
+ }) {
100
+ useEffect(() => {
101
+ publishSignalCoreState({ config: null, loading: true, error: null });
102
+ return () => resetSignal();
103
+ }, []);
104
+ return /* @__PURE__ */ jsxs(Fragment, { children: [
105
+ children,
106
+ enabled && /* @__PURE__ */ jsx(
107
+ LazySignalCore,
108
+ {
109
+ enabled,
110
+ realtime,
111
+ experiments,
112
+ behaviorTracking,
113
+ externalVisitorId,
114
+ externalSessionId,
115
+ pageMetadataRef,
116
+ onRegister: registerSignalCore,
117
+ onState: publishSignalCoreState
118
+ }
119
+ )
120
+ ] });
121
+ }
122
+ function useSignalConfig() {
123
+ const { config } = useSignal();
124
+ return config;
125
+ }
126
+ function useSignalEvent() {
127
+ const { trackEvent: trackEvent2 } = useSignal();
128
+ return trackEvent2;
129
+ }
130
+ function useSignalOutcome() {
131
+ const { trackOutcome: trackOutcome2 } = useSignal();
132
+ return { trackOutcome: trackOutcome2 };
133
+ }
134
+ function useSignalExperiment(experimentId) {
135
+ const { getExperiment, config } = useSignal();
136
+ useSyncExternalStore(subscribeMeasurementPolicy, measurementPolicySnapshot, serverMeasurementPolicySnapshot);
137
+ const assignment = getExperiment(experimentId);
138
+ const experiment = config?.experiments?.find((e) => e.id === experimentId);
139
+ const isRunning = experiment?.status === "running";
140
+ return {
141
+ assignment: isRunning ? assignment : null,
142
+ variant: isRunning && assignment ? assignment.variant_key : null,
143
+ isControl: !isRunning || !assignment || assignment.variant_key === "control"
144
+ };
145
+ }
146
+
147
+ export { SignalBridge, useSignal, useSignalConfig, useSignalEvent, useSignalExperiment, useSignalOutcome };