@sonordev/site-kit 8.8.0 → 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 (461) hide show
  1. package/CHANGELOG.md +22 -0
  2. package/README.md +9 -0
  3. package/agent-manifest.json +8 -1
  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-LQJC5S2M.js → chunk-J6D3NEDE.js} +57 -0
  108. package/dist/chunk-JT7GHHMV.js +56 -0
  109. package/dist/{chunk-NFGAXWCN.js → chunk-KGIQYVQ2.js} +31 -13
  110. package/dist/chunk-KMNHNCVG.js +20 -0
  111. package/dist/chunk-KQKUXIUD.js +25 -0
  112. package/dist/{chunk-M5JIHQ42.js → chunk-L3S5WH4C.js} +2 -2
  113. package/dist/chunk-MDBXGN6W.js +13 -0
  114. package/dist/chunk-MOACHHOJ.js +20 -0
  115. package/dist/{chunk-6DXQHNZK.js → chunk-MP35JETP.js} +1 -1
  116. package/dist/chunk-NHDRA4Y5.js +6 -0
  117. package/dist/{chunk-AYQEIMGS.js → chunk-NZHECYLF.js} +103 -22
  118. package/dist/{chunk-EATJPSTS.js → chunk-O5LQUBBN.js} +1 -1
  119. package/dist/{chunk-Y6SHFILE.js → chunk-OEOSR5EG.js} +1 -1
  120. package/dist/{chunk-GQN4BGK6.js → chunk-OUD4RTBD.js} +1 -1
  121. package/dist/chunk-PMXQPO5Q.js +78 -0
  122. package/dist/chunk-PVY7X5UR.js +21 -0
  123. package/dist/{chunk-KG5IEV7I.js → chunk-QLJ2SC3T.js} +1 -1
  124. package/dist/{chunk-2WM4TNDF.js → chunk-QXAJPB6O.js} +1 -1
  125. package/dist/{chunk-2WDWQI7K.js → chunk-RYR6N4X4.js} +1 -1
  126. package/dist/{chunk-G7BRCSV6.js → chunk-S33CUULL.js} +3 -3
  127. package/dist/{chunk-YRQS7VAH.js → chunk-S63QY5XW.js} +2 -2
  128. package/dist/{chunk-GXWM5KNS.js → chunk-SO6RSRUP.js} +40 -45
  129. package/dist/{chunk-ODOV76VW.js → chunk-STIVFCWM.js} +1 -1
  130. package/dist/{chunk-SVHPILS3.js → chunk-T4A5J6SJ.js} +1 -1
  131. package/dist/chunk-TPHOIE4I.js +73 -0
  132. package/dist/{chunk-IWNJCRXW.js → chunk-UG53ZW7S.js} +125 -118
  133. package/dist/chunk-VXCUXHZO.js +9 -0
  134. package/dist/{chunk-SBPUFTMP.js → chunk-WHFWDK2H.js} +2 -2
  135. package/dist/chunk-WYNDBJG7.js +66 -0
  136. package/dist/{chunk-HN7GVGWC.js → chunk-XDH5B3PR.js} +3 -3
  137. package/dist/{chunk-PAYCK7FC.js → chunk-XJZLXUTG.js} +1 -1
  138. package/dist/{chunk-IDC5CVBR.js → chunk-YVEYO3OD.js} +1 -1
  139. package/dist/{chunk-PSS6M4CG.js → chunk-ZRSXCT4O.js} +2 -2
  140. package/dist/client/index.d.ts +8 -8
  141. package/dist/client/index.js +9 -8
  142. package/dist/config/index.d.ts +1 -1
  143. package/dist/contracts/broadcast-layouts.d.ts +8 -0
  144. package/dist/contracts/crm-disposition.d.ts +87 -0
  145. package/dist/contracts/decision-roles.d.ts +39 -0
  146. package/dist/contracts/entries.d.ts +1 -1
  147. package/dist/contracts/funnels.d.ts +85 -2
  148. package/dist/contracts/portfolio.d.ts +1 -1
  149. package/dist/contracts/publication-branding.d.ts +3 -3
  150. package/dist/contracts/resonance-constants.d.ts +4 -0
  151. package/dist/contracts/resonance.d.ts +8461 -0
  152. package/dist/contracts/signal-experiments.d.ts +219 -0
  153. package/dist/contracts/site-edit.d.ts +2 -2
  154. package/dist/contracts/sites.d.ts +1 -1
  155. package/dist/contracts/slots.d.ts +2 -2
  156. package/dist/contracts/wire-schema.d.ts +36 -0
  157. package/dist/cta-bar/CtaBar.d.ts +1 -1
  158. package/dist/cta-bar/client.js +3 -2
  159. package/dist/cta-bar/index.d.ts +4 -4
  160. package/dist/cta-bar/index.js +4 -3
  161. package/dist/fleet/FleetHeartbeat.d.ts +2 -2
  162. package/dist/fleet/contract.d.ts +1 -1
  163. package/dist/fleet/heartbeat.d.ts +2 -2
  164. package/dist/fleet/index.d.ts +6 -6
  165. package/dist/fleet/index.js +4 -5
  166. package/dist/forms/FileField.d.ts +1 -1
  167. package/dist/forms/FormClient.d.ts +2 -2
  168. package/dist/forms/FormEnhancer.d.ts +1 -1
  169. package/dist/forms/FormField.d.ts +1 -1
  170. package/dist/forms/FormSpotlight.d.ts +1 -1
  171. package/dist/forms/FormStage.d.ts +1 -1
  172. package/dist/forms/ManagedForm.d.ts +1 -1
  173. package/dist/forms/PrivateFileField.d.ts +1 -1
  174. package/dist/forms/ServerForm.d.ts +3 -3
  175. package/dist/forms/StaticForm.d.ts +1 -1
  176. package/dist/forms/contract.d.ts +1 -1
  177. package/dist/forms/experience-plan.d.ts +1 -1
  178. package/dist/forms/field-autocomplete.d.ts +1 -1
  179. package/dist/forms/field-controls.d.ts +1 -1
  180. package/dist/forms/field-rules.d.ts +1 -1
  181. package/dist/forms/form-dom-values.d.ts +1 -1
  182. package/dist/forms/index.d.ts +18 -18
  183. package/dist/forms/index.js +21 -11
  184. package/dist/forms/normalize-config.d.ts +1 -1
  185. package/dist/forms/server.d.ts +4 -4
  186. package/dist/forms/server.js +3 -3
  187. package/dist/forms/static.d.ts +2 -2
  188. package/dist/forms/submitForm.d.ts +2 -2
  189. package/dist/forms/tracking-session.d.ts +1 -1
  190. package/dist/forms/useForm.d.ts +2 -2
  191. package/dist/forms/webmcp.d.ts +2 -2
  192. package/dist/images/api.d.ts +1 -1
  193. package/dist/images/index.d.ts +6 -6
  194. package/dist/images/index.js +2 -4
  195. package/dist/images/server.d.ts +2 -2
  196. package/dist/index.d.ts +13 -13
  197. package/dist/index.js +1 -1
  198. package/dist/landing/contract.d.ts +1 -1
  199. package/dist/landing/contract.js +2 -1
  200. package/dist/landing/index.d.ts +3 -3
  201. package/dist/landing/index.js +3 -2
  202. package/dist/landing/managed-server.d.ts +2 -2
  203. package/dist/landing/managed.d.ts +10 -2
  204. package/dist/landing/server.d.ts +7 -7
  205. package/dist/landing/server.js +11 -6
  206. package/dist/layout/AiDiscoveryLinks.d.ts +1 -1
  207. package/dist/layout/SiteKitClientProviders.d.ts +1 -1
  208. package/dist/layout/SiteKitLayout.d.ts +2 -2
  209. package/dist/layout/client.d.ts +1 -1
  210. package/dist/layout/client.js +15 -11
  211. package/dist/layout/index.d.ts +5 -5
  212. package/dist/layout/index.js +17 -13
  213. package/dist/layout/types.d.ts +2 -2
  214. package/dist/llms/AEOComponents.d.ts +1 -1
  215. package/dist/llms/SpeakableSchema.d.ts +1 -1
  216. package/dist/llms/api.d.ts +1 -1
  217. package/dist/llms/client.d.ts +3 -3
  218. package/dist/llms/contract.d.ts +1 -1
  219. package/dist/llms/generateLLMsTxt.d.ts +1 -1
  220. package/dist/llms/handlers.d.ts +1 -1
  221. package/dist/llms/index.d.ts +21 -21
  222. package/dist/llms/index.js +5 -5
  223. package/dist/llms/merge.d.ts +1 -1
  224. package/dist/llms/sourcedFacts.d.ts +1 -1
  225. package/dist/llms/types.d.ts +5 -5
  226. package/dist/llms/writeLLMsTxt.d.ts +3 -3
  227. package/dist/maps/GoogleMap.d.ts +1 -1
  228. package/dist/maps/NeighborhoodMap.d.ts +1 -1
  229. package/dist/maps/api.d.ts +1 -1
  230. package/dist/maps/index.d.ts +5 -5
  231. package/dist/maps/index.js +1 -3
  232. package/dist/mcp/WebMcpTools.d.ts +1 -1
  233. package/dist/mcp/client.d.ts +2 -2
  234. package/dist/mcp/discovery.d.ts +2 -2
  235. package/dist/mcp/handlers.d.ts +4 -4
  236. package/dist/mcp/index.d.ts +12 -12
  237. package/dist/mcp/protocol.d.ts +1 -1
  238. package/dist/mcp/report.d.ts +1 -1
  239. package/dist/mcp/serverCard.d.ts +1 -1
  240. package/dist/mcp/sonor.d.ts +5 -5
  241. package/dist/mcp/sonor.js +10 -10
  242. package/dist/mcp/transport.d.ts +1 -1
  243. package/dist/motion/Parallax.d.ts +1 -1
  244. package/dist/motion/ScrollScene.d.ts +1 -1
  245. package/dist/motion/gsap.d.ts +2 -2
  246. package/dist/motion/index.d.ts +9 -9
  247. package/dist/motion/three.d.ts +1 -1
  248. package/dist/og/index.d.ts +5 -5
  249. package/dist/og/pages.d.ts +1 -1
  250. package/dist/og/route-fit.d.ts +17 -0
  251. package/dist/og/route.d.ts +8 -0
  252. package/dist/og/route.js +1 -1
  253. package/dist/og/template.d.ts +1 -1
  254. package/dist/portfolio/contract.d.ts +1 -1
  255. package/dist/press-kit/articles/Article.d.ts +2 -2
  256. package/dist/press-kit/articles/ArticleFaqSection.d.ts +1 -1
  257. package/dist/press-kit/articles/ArticleList.d.ts +2 -2
  258. package/dist/press-kit/articles/AuthorCard.d.ts +1 -1
  259. package/dist/press-kit/articles/AuthorPage.d.ts +1 -1
  260. package/dist/press-kit/articles/ClusterLandingPage.d.ts +2 -2
  261. package/dist/press-kit/articles/ClusterNavigation.d.ts +2 -2
  262. package/dist/press-kit/articles/ManagedNewsletterForm.d.ts +2 -2
  263. package/dist/press-kit/articles/PublicationLayout.d.ts +2 -2
  264. package/dist/press-kit/articles/PublicationSidebar.d.ts +1 -1
  265. package/dist/press-kit/articles/RelatedPosts.d.ts +2 -2
  266. package/dist/press-kit/articles/TableOfContents.d.ts +1 -1
  267. package/dist/press-kit/articles/article-body.d.ts +1 -1
  268. package/dist/press-kit/articles/article-headings.d.ts +1 -1
  269. package/dist/press-kit/articles/article-photos.d.ts +1 -1
  270. package/dist/press-kit/articles/artwork.d.ts +2 -2
  271. package/dist/press-kit/articles/author-schema.d.ts +2 -2
  272. package/dist/press-kit/articles/author-social.d.ts +1 -1
  273. package/dist/press-kit/articles/index.d.ts +23 -23
  274. package/dist/press-kit/articles/news-sitemap.d.ts +2 -2
  275. package/dist/press-kit/articles/public-reads.d.ts +1 -1
  276. package/dist/press-kit/articles/publication-reads.d.ts +2 -2
  277. package/dist/press-kit/articles/reading-time.d.ts +1 -1
  278. package/dist/press-kit/articles/server-core.d.ts +20 -20
  279. package/dist/press-kit/articles/server-ui.d.ts +20 -20
  280. package/dist/press-kit/articles/types.d.ts +1 -1
  281. package/dist/proxy/index.d.ts +5 -5
  282. package/dist/proxy/index.js +1 -1
  283. package/dist/reputation/TestimonialSection.d.ts +1 -1
  284. package/dist/reputation/VisualReviewCard.d.ts +1 -1
  285. package/dist/reputation/api.d.ts +1 -1
  286. package/dist/reputation/index.d.ts +4 -4
  287. package/dist/reputation/server.d.ts +3 -3
  288. package/dist/resonance/ResonanceRuntime.d.ts +7 -0
  289. package/dist/resonance/bridge.d.ts +16 -0
  290. package/dist/resonance/consent-adapter.d.ts +26 -0
  291. package/dist/resonance/controller-registry.d.ts +14 -0
  292. package/dist/resonance/controller.d.ts +103 -0
  293. package/dist/resonance/form-context.d.ts +5 -0
  294. package/dist/resonance/index.d.ts +4 -0
  295. package/dist/resonance/index.js +9 -0
  296. package/dist/resonance/meta-pixel.d.ts +67 -0
  297. package/dist/resonance/providers.d.ts +32 -0
  298. package/dist/resonance/runtime-core.d.ts +5 -0
  299. package/dist/revalidate/index.d.ts +3 -3
  300. package/dist/revalidate/index.js +2 -2
  301. package/dist/robots/index.d.ts +3 -3
  302. package/dist/robots/indexnow.js +2 -2
  303. package/dist/runtime/index.d.ts +7 -7
  304. package/dist/runtime/index.js +4 -5
  305. package/dist/runtime-core-WT7KKLWQ.js +2213 -0
  306. package/dist/seo/ManagedFAQ.d.ts +1 -1
  307. package/dist/seo/ManagedInternalLinks.d.ts +1 -1
  308. package/dist/seo/ManagedSchema.d.ts +1 -1
  309. package/dist/seo/ManagedScripts.d.ts +1 -1
  310. package/dist/seo/client.d.ts +1 -1
  311. package/dist/seo/client.js +3 -5
  312. package/dist/seo/entry-indexnow.d.ts +1 -1
  313. package/dist/seo/entry-llms-client.d.ts +1 -1
  314. package/dist/seo/entry-llms-contract.d.ts +1 -1
  315. package/dist/seo/entry-llms.d.ts +1 -1
  316. package/dist/seo/entry-meta-contract.d.ts +1 -1
  317. package/dist/seo/entry-og-route.d.ts +1 -1
  318. package/dist/seo/entry-og.d.ts +1 -1
  319. package/dist/seo/entry-pages-contract.d.ts +1 -1
  320. package/dist/seo/entry-redirects.d.ts +1 -1
  321. package/dist/seo/entry-robots.d.ts +1 -1
  322. package/dist/seo/entry-sitemap.d.ts +1 -1
  323. package/dist/seo/getManagedMetadata.d.ts +1 -1
  324. package/dist/seo/index.d.ts +12 -12
  325. package/dist/seo/index.js +9 -11
  326. package/dist/seo/indexnow.d.ts +1 -1
  327. package/dist/seo/indexnow.js +2 -2
  328. package/dist/seo/llms/client.d.ts +1 -1
  329. package/dist/seo/llms/contract.d.ts +1 -1
  330. package/dist/seo/llms.d.ts +1 -1
  331. package/dist/seo/llms.js +5 -5
  332. package/dist/seo/meta/contract.d.ts +1 -1
  333. package/dist/seo/og/route.d.ts +1 -1
  334. package/dist/seo/og/route.js +1 -1
  335. package/dist/seo/og.d.ts +1 -1
  336. package/dist/seo/pages/contract.d.ts +1 -1
  337. package/dist/seo/redirects.d.ts +1 -1
  338. package/dist/seo/register-sitemap-cli-impl.d.ts +1 -1
  339. package/dist/seo/register-sitemap-cli.js +1 -1
  340. package/dist/seo/robots.d.ts +1 -1
  341. package/dist/seo/routing.d.ts +1 -1
  342. package/dist/seo/server.d.ts +4 -4
  343. package/dist/seo/server.js +3 -3
  344. package/dist/seo/sitemap.d.ts +1 -1
  345. package/dist/seo/sitemap.js +3 -3
  346. package/dist/seo/types.d.ts +1 -1
  347. package/dist/seo-meta/contract.d.ts +1 -1
  348. package/dist/seo-pages/contract.d.ts +1 -1
  349. package/dist/server/index.d.ts +5 -5
  350. package/dist/server/index.js +3 -3
  351. package/dist/server/mint-site-token.d.ts +1 -1
  352. package/dist/server/server-fetch.d.ts +8 -0
  353. package/dist/{server-api-XIKDWSNO.js → server-api-A34TABT2.js} +2 -2
  354. package/dist/shared/build-entries.d.ts +3 -1
  355. package/dist/shared/color.d.ts +1 -1
  356. package/dist/shared/fetchWithRetry.d.ts +6 -0
  357. package/dist/shared/frame.d.ts +1 -1
  358. package/dist/shared/identity-storage.d.ts +6 -4
  359. package/dist/shared/identity.d.ts +1 -3
  360. package/dist/shared/index.d.ts +5 -5
  361. package/dist/shared/index.js +1 -1
  362. package/dist/shared/measurement-analytics.d.ts +1 -0
  363. package/dist/shared/measurement-policy.d.ts +6 -0
  364. package/dist/shared/measurement-proof.d.ts +5 -0
  365. package/dist/shared/measurement-store.d.ts +34 -0
  366. package/dist/shared/measurement-writer.d.ts +6 -0
  367. package/dist/shared/publishCredential.d.ts +1 -1
  368. package/dist/shared/reporting-gate.d.ts +3 -1
  369. package/dist/shared/site-token-claims.d.ts +18 -0
  370. package/dist/shared/site-token-configuration.d.ts +9 -0
  371. package/dist/shared/site-token-refresh.d.ts +7 -0
  372. package/dist/shared/site-token-state.d.ts +23 -0
  373. package/dist/shared/siteToken.d.ts +5 -39
  374. package/dist/shared/sonor-auth-state.d.ts +3 -0
  375. package/dist/shared/sonor-beacon.d.ts +13 -0
  376. package/dist/shared/sonor-fetch-runtime.d.ts +2 -0
  377. package/dist/shared/sonor-fetch.d.ts +7 -0
  378. package/dist/shared/sonorFetch.d.ts +4 -49
  379. package/dist/shared/version.d.ts +1 -1
  380. package/dist/signal/ReviewedSignalExperiment.d.ts +9 -0
  381. package/dist/signal/SignalBridge.d.ts +4 -4
  382. package/dist/signal/SignalCore.d.ts +2 -1
  383. package/dist/signal/SignalExperiment.d.ts +13 -5
  384. package/dist/signal/index.d.ts +3 -3
  385. package/dist/signal/index.js +4 -73
  386. package/dist/signal/store.d.ts +10 -7
  387. package/dist/signal/types.d.ts +4 -0
  388. package/dist/sitemap/index.d.ts +5 -5
  389. package/dist/sitemap/index.js +3 -3
  390. package/dist/sites/contract.d.ts +1 -1
  391. package/dist/sites/normalize.d.ts +1 -1
  392. package/dist/slots/ManagedLink.d.ts +2 -2
  393. package/dist/slots/ManagedList.d.ts +2 -2
  394. package/dist/slots/ManagedRichText.d.ts +1 -1
  395. package/dist/slots/ManagedSlot.d.ts +1 -1
  396. package/dist/slots/contract.d.ts +1 -1
  397. package/dist/slots/edit/locate.d.ts +1 -1
  398. package/dist/slots/index.d.ts +14 -14
  399. package/dist/slots/index.js +2 -2
  400. package/dist/slots/server-api.d.ts +1 -1
  401. package/dist/{chunk-FLOJUMFR.js → sonor-fetch-runtime-3PFGUXMF.js} +27 -36
  402. package/dist/sync/AddToCalendar.d.ts +1 -1
  403. package/dist/sync/BookingWidget.d.ts +1 -1
  404. package/dist/sync/MeetingFormatStep.d.ts +1 -1
  405. package/dist/sync/api.d.ts +2 -2
  406. package/dist/sync/booking-flow.d.ts +1 -1
  407. package/dist/sync/index.d.ts +3 -3
  408. package/dist/sync/index.js +6 -7
  409. package/dist/types.d.ts +6 -6
  410. package/dist/website/BlocksPopup.d.ts +1 -1
  411. package/dist/website/PopupBlocks.d.ts +1 -1
  412. package/dist/website/SiteDesignReporter.d.ts +2 -2
  413. package/dist/website/SitePopups.d.ts +1 -1
  414. package/dist/website/contract.d.ts +1 -1
  415. package/dist/website/cta-bar.d.ts +1 -1
  416. package/dist/website/cta-bar.js +4 -3
  417. package/dist/website/design.d.ts +2 -2
  418. package/dist/website/images/server.d.ts +1 -1
  419. package/dist/website/images-server.d.ts +1 -1
  420. package/dist/website/images.d.ts +1 -1
  421. package/dist/website/images.js +2 -4
  422. package/dist/website/index.d.ts +4 -4
  423. package/dist/website/index.js +5 -6
  424. package/dist/website/landing/server.d.ts +1 -1
  425. package/dist/website/landing/server.js +11 -6
  426. package/dist/website/landing-server.d.ts +1 -1
  427. package/dist/website/landing.d.ts +1 -1
  428. package/dist/website/landing.js +3 -2
  429. package/dist/website/popup-rules.d.ts +2 -2
  430. package/dist/website/popup-types.d.ts +1 -1
  431. package/dist/website/popups.d.ts +4 -4
  432. package/dist/website/popups.js +14 -8
  433. package/dist/website/slots/contract.d.ts +1 -1
  434. package/dist/website/slots-contract.d.ts +1 -1
  435. package/dist/website/slots.d.ts +2 -2
  436. package/dist/website/slots.js +2 -2
  437. package/dist/{writeLLMsTxt-4HHUAOA6.js → writeLLMsTxt-JUACXQKP.js} +2 -2
  438. package/docs.json +5 -0
  439. package/package.json +8 -2
  440. package/src/analytics/README.md +21 -0
  441. package/src/cta-bar/README.md +4 -0
  442. package/src/forms/README.md +29 -0
  443. package/src/landing/README.md +14 -0
  444. package/src/layout/README.md +3 -0
  445. package/src/og/README.md +28 -0
  446. package/src/resonance/README.md +273 -0
  447. package/src/runtime/README.md +6 -1
  448. package/src/signal/README.md +21 -0
  449. package/src/website/README.md +14 -2
  450. package/dist/AnalyticsProvider-7SBJ27SI.js +0 -13
  451. package/dist/ChatWidget-V46UBDOM.js +0 -20
  452. package/dist/ManagedForm-DDDVMKLJ.js +0 -19
  453. package/dist/SitePopups-VU2C3Z6B.js +0 -13
  454. package/dist/SitemapSync-C4H3HF3L.js +0 -9
  455. package/dist/chunk-5ROTTMBL.js +0 -19
  456. package/dist/chunk-5TM3WPCI.js +0 -7
  457. package/dist/chunk-7HW4TZB5.js +0 -148
  458. package/dist/chunk-IPQKQEWI.js +0 -52
  459. package/dist/chunk-LCDVPAMR.js +0 -24
  460. package/dist/chunk-SHAUX2MQ.js +0 -163
  461. /package/dist/{chunk-3MJNBOUO.js → chunk-2QPVU63T.js} +0 -0
@@ -1,10 +1,10 @@
1
1
  'use client';
2
- import { registerAnalyticsDispatcher } from './chunk-LCDVPAMR.js';
3
- import { getOrCreateVisitorId, getOrCreateSessionId } from './chunk-IPQKQEWI.js';
2
+ import { registerAnalyticsDispatcher } from './chunk-AG2RDHYZ.js';
3
+ import { getOrCreateVisitorId, getOrCreateSessionId } from './chunk-JT7GHHMV.js';
4
4
  import { onPageLeave } from './chunk-L2V5PUFN.js';
5
- import { resolveAnalyticsTarget } from './chunk-ZQSCMYZO.js';
6
- import { sonorFetch, sonorBeacon } from './chunk-FLOJUMFR.js';
7
- import { createContext, useRef, useEffect, useState, useMemo, useCallback, useContext } from 'react';
5
+ import { resolveAnalyticsTarget, analyticsSend, analyticsBeacon } from './chunk-PMXQPO5Q.js';
6
+ import { subscribeMeasurementPolicy, measurementPolicySnapshot, serverMeasurementPolicySnapshot } from './chunk-FRY6PBT6.js';
7
+ import { createContext, useRef, useSyncExternalStore, useEffect, useState, useMemo, useCallback, useContext } from 'react';
8
8
  import { usePathname } from 'next/navigation';
9
9
  import { jsxs, jsx } from 'react/jsx-runtime';
10
10
 
@@ -73,33 +73,6 @@ function getMeasurementContext(options = {}) {
73
73
  connectionType: connection?.effectiveType || connection?.type || void 0
74
74
  };
75
75
  }
76
-
77
- // src/analytics/send-gate.ts
78
- async function analyticsSend(path, body, options = {}) {
79
- const target = resolveAnalyticsTarget(options);
80
- if (!target) return null;
81
- try {
82
- return await sonorFetch(
83
- `${target.apiUrl}${path}`,
84
- {
85
- method: options.method || "POST",
86
- headers: { "Content-Type": "application/json" },
87
- ...options.keepalive ? { keepalive: true } : {},
88
- ...body === void 0 ? {} : { body: JSON.stringify(body) }
89
- },
90
- { apiKey: target.apiKey, retries: options.retries ?? 0 }
91
- );
92
- } catch {
93
- return null;
94
- }
95
- }
96
- function analyticsBeacon(path, body, options = {}) {
97
- const target = resolveAnalyticsTarget(options);
98
- if (!target) return;
99
- sonorBeacon(`${target.apiUrl}${path}`, body, target.apiKey);
100
- }
101
-
102
- // src/analytics/WebVitals.tsx
103
76
  function pathForMetric(metric, fallback) {
104
77
  const url = metric.navigationURL;
105
78
  if (url) {
@@ -165,15 +138,19 @@ function WebVitals({
165
138
  const landingPathRef = useRef(pathname || "/");
166
139
  const propsRef = useRef({ propApiUrl, propApiKey, propSite, allowInFrame, allowLocalhost, debug, visitorId, sessionId, sessionTimeout });
167
140
  propsRef.current = { propApiUrl, propApiKey, propSite, allowInFrame, allowLocalhost, debug, visitorId, sessionId, sessionTimeout };
141
+ const policy = useSyncExternalStore(subscribeMeasurementPolicy, measurementPolicySnapshot, serverMeasurementPolicySnapshot);
168
142
  useEffect(() => {
143
+ const epoch = policy.collectionEpoch;
144
+ const permitted = () => epoch === measurementPolicySnapshot().collectionEpoch && !!resolveAnalyticsTarget({ apiUrl: propApiUrl, apiKey: propApiKey, allowInFrame, allowLocalhost, debug });
145
+ if (!permitted()) return;
169
146
  let cancelled = false;
170
147
  let teardown;
171
148
  import('./web-vitals.attribution-N2PCCF4Q.js').then(({ onCLS, onLCP, onTTFB, onINP, onFCP }) => {
172
- if (cancelled) return;
149
+ if (cancelled || !permitted()) return;
173
150
  const { propApiUrl: propApiUrl2, propApiKey: propApiKey2, propSite: propSite2, allowInFrame: allowInFrame2, allowLocalhost: allowLocalhost2, debug: debug2, visitorId: visitorId2, sessionId: sessionId2, sessionTimeout: sessionTimeout2 } = propsRef.current;
174
151
  const sent = /* @__PURE__ */ new Map();
175
152
  const report = (metric, viaBeacon = false) => {
176
- if (!resolveAnalyticsTarget({ apiUrl: propApiUrl2, apiKey: propApiKey2, allowInFrame: allowInFrame2, allowLocalhost: allowLocalhost2, debug: debug2 })) return;
153
+ if (cancelled || !permitted()) return;
177
154
  if (sent.get(metric.id) === metric.value) return;
178
155
  sent.set(metric.id, metric.value);
179
156
  const site = propSite2 || (typeof window !== "undefined" ? window.__SITE_KIT_SITE__ || window.location.host : "");
@@ -202,6 +179,7 @@ function WebVitals({
202
179
  const opts = { reportSoftNavs: true };
203
180
  const pending = [];
204
181
  const collect = (metric) => {
182
+ if (cancelled || !permitted()) return;
205
183
  pending.push(metric);
206
184
  report(metric);
207
185
  };
@@ -225,7 +203,7 @@ function WebVitals({
225
203
  cancelled = true;
226
204
  teardown?.();
227
205
  };
228
- }, []);
206
+ }, [policy.collectionEpoch]);
229
207
  return null;
230
208
  }
231
209
 
@@ -656,21 +634,26 @@ function AnalyticsProvider({
656
634
  allowLocalhost = false
657
635
  }) {
658
636
  const pathname = usePathname();
637
+ const policy = useSyncExternalStore(subscribeMeasurementPolicy, measurementPolicySnapshot, serverMeasurementPolicySnapshot);
659
638
  const [queryString, setQueryString] = useState("");
639
+ const navigationRef = useRef({ path: pathname, serial: 0 });
640
+ if (navigationRef.current.path !== pathname) navigationRef.current = { path: pathname, serial: navigationRef.current.serial + 1 };
641
+ const currentNavigationKey = `${propSite ?? ""}:${policy.identityScope ?? "legacy"}:${navigationRef.current.serial}`;
642
+ const lastReportedNavigationRef = useRef("");
660
643
  const site = propSite || (typeof window !== "undefined" ? window.__SITE_KIT_SITE__ || window.location.host : "");
661
644
  const gate = useMemo(
662
- () => ({ apiUrl: propApiUrl, apiKey: propApiKey, allowInFrame, allowLocalhost, debug }),
663
- [propApiUrl, propApiKey, allowInFrame, allowLocalhost, debug]
645
+ () => ({ apiUrl: propApiUrl, apiKey: propApiKey, allowInFrame, allowLocalhost, debug, measurementEpoch: policy.collectionEpoch }),
646
+ [propApiUrl, propApiKey, allowInFrame, allowLocalhost, debug, policy.collectionEpoch]
664
647
  );
665
648
  useEffect(() => {
666
- if (typeof window === "undefined") return;
649
+ if (typeof window === "undefined" || !resolveAnalyticsTarget(gate)) return;
667
650
  setQueryString(window.location.search);
668
651
  const handlePopState = () => {
669
652
  setQueryString(window.location.search);
670
653
  };
671
654
  window.addEventListener("popstate", handlePopState);
672
655
  return () => window.removeEventListener("popstate", handlePopState);
673
- }, [pathname]);
656
+ }, [pathname, gate]);
674
657
  const visitorIdRef = useRef("");
675
658
  const sessionIdRef = useRef("");
676
659
  const lastPathRef = useRef("");
@@ -680,9 +663,15 @@ function AnalyticsProvider({
680
663
  const pageEnterTimeRef = useRef(0);
681
664
  const currentScrollDepthRef = useRef(0);
682
665
  useEffect(() => {
666
+ if (!resolveAnalyticsTarget(gate)) {
667
+ visitorIdRef.current = "";
668
+ sessionIdRef.current = "";
669
+ lastPathRef.current = "";
670
+ return;
671
+ }
683
672
  visitorIdRef.current = externalVisitorId || getOrCreateVisitorId();
684
673
  sessionIdRef.current = externalSessionId || getOrCreateSessionId(sessionTimeout);
685
- }, [sessionTimeout, externalVisitorId, externalSessionId]);
674
+ }, [sessionTimeout, externalVisitorId, externalSessionId, gate]);
686
675
  useEffect(() => {
687
676
  if (!validateAgainstSitemap) {
688
677
  if (debug) console.log("[Analytics] Page validation disabled");
@@ -724,11 +713,12 @@ function AnalyticsProvider({
724
713
  fetchValidPages();
725
714
  }, [gate, validateAgainstSitemap, debug]);
726
715
  useEffect(() => {
727
- if (!trackPageViews) return;
716
+ if (!trackPageViews || !resolveAnalyticsTarget(gate)) return;
728
717
  if (!pathname) return;
729
718
  const normalizedPath = pathname === "/" ? "/" : pathname.replace(/\/+$/, "");
730
719
  if (excludePaths.some((p) => normalizedPath.startsWith(p))) return;
731
- if (normalizedPath === lastPathRef.current) return;
720
+ if (currentNavigationKey === lastReportedNavigationRef.current) return;
721
+ lastReportedNavigationRef.current = currentNavigationKey;
732
722
  lastPathRef.current = normalizedPath;
733
723
  const trackPageView = async () => {
734
724
  if (!resolveAnalyticsTarget(gate)) {
@@ -738,8 +728,9 @@ function AnalyticsProvider({
738
728
  const utmParams = getUTMParams();
739
729
  const pageTitle = document.title;
740
730
  const pageMetadata = await collectPageMetadata(
741
- () => lastPathRef.current !== normalizedPath
731
+ () => lastPathRef.current !== normalizedPath || !resolveAnalyticsTarget(gate)
742
732
  );
733
+ if (!resolveAnalyticsTarget(gate)) return;
743
734
  if (onPageMetadata) {
744
735
  onPageMetadata(pageMetadata);
745
736
  }
@@ -794,7 +785,7 @@ function AnalyticsProvider({
794
785
  }
795
786
  };
796
787
  scheduleIdleTask(() => trackPageView());
797
- }, [pathname, queryString, gate, trackPageViews, excludePaths, debug, validateAgainstSitemap]);
788
+ }, [pathname, queryString, gate, trackPageViews, excludePaths, debug, validateAgainstSitemap, currentNavigationKey]);
798
789
  useEffect(() => {
799
790
  if (!trackJourneys) return;
800
791
  if (!pathname) return;
@@ -959,6 +950,7 @@ function AnalyticsProvider({
959
950
  if (typeof window === "undefined") return;
960
951
  if (!resolveAnalyticsTarget(gate)) return;
961
952
  const handleClick = async (e) => {
953
+ if (!resolveAnalyticsTarget(gate)) return;
962
954
  const target = e.target;
963
955
  if (!target) return;
964
956
  const docHeight = document.documentElement.scrollHeight;
@@ -1016,7 +1008,9 @@ function AnalyticsProvider({
1016
1008
  return () => document.removeEventListener("click", click);
1017
1009
  }, [gate, site, pathname]);
1018
1010
  const trackEvent = useCallback((options) => {
1011
+ if (!resolveAnalyticsTarget(gate)) return;
1019
1012
  const doTrack = async () => {
1013
+ if (!resolveAnalyticsTarget(gate)) return;
1020
1014
  const event = {
1021
1015
  sessionId: sessionIdRef.current,
1022
1016
  visitorId: visitorIdRef.current,
@@ -1040,6 +1034,7 @@ function AnalyticsProvider({
1040
1034
  }, [gate, site, pathname, debug]);
1041
1035
  const trackConversion = useCallback((options) => {
1042
1036
  const doTrack = async () => {
1037
+ if (!resolveAnalyticsTarget(gate)) return;
1043
1038
  const conversion = {
1044
1039
  sessionId: sessionIdRef.current,
1045
1040
  visitorId: visitorIdRef.current,
@@ -1073,7 +1068,7 @@ function AnalyticsProvider({
1073
1068
  visitorId: visitorIdRef.current
1074
1069
  }), [trackEvent, trackConversion]);
1075
1070
  return /* @__PURE__ */ jsxs(AnalyticsContext.Provider, { value: contextValue, children: [
1076
- trackWebVitals && /* @__PURE__ */ jsx(
1071
+ trackWebVitals && !!resolveAnalyticsTarget(gate) && /* @__PURE__ */ jsx(
1077
1072
  WebVitals,
1078
1073
  {
1079
1074
  apiUrl: propApiUrl,
@@ -1,6 +1,6 @@
1
1
  import { withSiteBody } from './chunk-MJP63SSS.js';
2
2
  import { SITE_CACHE_TAGS } from './chunk-HY7ZEU2C.js';
3
- import { serverApiFetch, requireServerApiConfig } from './chunk-C7TLGL3R.js';
3
+ import { serverApiFetch, requireServerApiConfig } from './chunk-7VMA3KCN.js';
4
4
  import { postRegisterSitemap, resolveSyncSite } from './chunk-DIKNRN34.js';
5
5
  import { cache } from 'react';
6
6
  import 'server-only';
@@ -1,5 +1,5 @@
1
1
  'use client';
2
- import { sonorFetch } from './chunk-FLOJUMFR.js';
2
+ import { sonorFetch } from './chunk-VXCUXHZO.js';
3
3
  import { useState, useCallback, useEffect } from 'react';
4
4
  import { jsx, Fragment, jsxs } from 'react/jsx-runtime';
5
5
 
@@ -0,0 +1,73 @@
1
+ import { siteTokenState } from './chunk-D4M5K6JN.js';
2
+
3
+ // src/shared/site-token-claims.ts
4
+ var SITE_TOKEN_PREFIX = "st1.";
5
+ function isSiteToken(credential) {
6
+ return typeof credential === "string" && credential.startsWith(SITE_TOKEN_PREFIX);
7
+ }
8
+ function decodeSiteTokenClaims(token) {
9
+ if (!isSiteToken(token)) return null;
10
+ const seg = token.split(".")[1];
11
+ if (!seg) return null;
12
+ try {
13
+ const b64 = seg.replace(/-/g, "+").replace(/_/g, "/");
14
+ const json = typeof atob === "function" ? atob(b64) : Buffer.from(seg, "base64url").toString("utf8");
15
+ const claims = JSON.parse(json);
16
+ return typeof claims === "object" && claims ? claims : null;
17
+ } catch {
18
+ return null;
19
+ }
20
+ }
21
+ function credentialBreakerId(credential) {
22
+ if (!credential) return "(anonymous)";
23
+ const claims = decodeSiteTokenClaims(credential);
24
+ if (claims?.pid) return `pid:${claims.pid}`;
25
+ return credential.slice(0, 16);
26
+ }
27
+ function tokenExp(token) {
28
+ const claims = decodeSiteTokenClaims(token);
29
+ return typeof claims?.exp === "number" ? claims.exp * 1e3 : 0;
30
+ }
31
+
32
+ // src/shared/site-token-configuration.ts
33
+ var STORAGE_KEY = "__sonor_site_token__";
34
+ function readStoredToken() {
35
+ if (typeof window === "undefined") return null;
36
+ try {
37
+ const raw = window.sessionStorage.getItem(STORAGE_KEY);
38
+ if (!raw) return null;
39
+ const parsed = JSON.parse(raw);
40
+ return typeof parsed?.token === "string" ? parsed.token : null;
41
+ } catch {
42
+ return null;
43
+ }
44
+ }
45
+ function storeToken(token) {
46
+ if (typeof window === "undefined") return;
47
+ try {
48
+ window.sessionStorage.setItem(STORAGE_KEY, JSON.stringify({ token }));
49
+ } catch {
50
+ }
51
+ try {
52
+ ;
53
+ window.__SITE_KIT_API_KEY__ = token;
54
+ } catch {
55
+ }
56
+ }
57
+ function configureSiteCredential(opts) {
58
+ siteTokenState.seed = opts.credential;
59
+ siteTokenState.isToken = isSiteToken(opts.credential);
60
+ if (opts.apiUrl) siteTokenState.apiUrl = opts.apiUrl.replace(/\/+$/, "");
61
+ if (!siteTokenState.isToken) {
62
+ siteTokenState.token = null;
63
+ return;
64
+ }
65
+ const prior = siteTokenState.token;
66
+ let best = opts.credential ?? null;
67
+ const stored = readStoredToken();
68
+ if (stored && tokenExp(stored) > tokenExp(best)) best = stored;
69
+ if (prior && tokenExp(prior) > tokenExp(best)) best = prior;
70
+ siteTokenState.token = best;
71
+ }
72
+
73
+ export { configureSiteCredential, credentialBreakerId, isSiteToken, storeToken, tokenExp };
@@ -1,14 +1,20 @@
1
1
  'use client';
2
2
  import { readAgentSubmit, formToolAttributes } from './chunk-Q6E4OPGG.js';
3
- import { readAnalyticsIdentity } from './chunk-5ROTTMBL.js';
3
+ import { currentResonanceFormContext } from './chunk-MDBXGN6W.js';
4
+ import { readAnalyticsIdentity } from './chunk-PVY7X5UR.js';
4
5
  import { isFieldVisible, validateField, isFieldComplete, unseenControlValues } from './chunk-C2FZBUSS.js';
5
6
  import { normalizeFormConfig, DEFAULT_FORM_SUCCESS_MESSAGE } from './chunk-TYSIAWC3.js';
6
7
  import { DEFAULT_HONEYPOT_FIELD } from './chunk-NJCTQH2P.js';
7
8
  import { onPageLeave } from './chunk-L2V5PUFN.js';
9
+ import { resolveAnalyticsTarget, analyticsSend, analyticsBeacon } from './chunk-PMXQPO5Q.js';
10
+ import { RESONANCE_SUBJECT_HEADER } from './chunk-NHDRA4Y5.js';
8
11
  import { uuid } from './chunk-GJWI74ZZ.js';
9
- import { sonorFetch, sonorBeacon } from './chunk-FLOJUMFR.js';
10
- import { readPublishedApiConfig, getClientApiConfig } from './chunk-W7OPEMGJ.js';
11
- import { useRef, useCallback, useEffect, useState, useMemo } from 'react';
12
+ import { sameSite } from './chunk-NZOJHERI.js';
13
+ import { sonorFetch } from './chunk-VXCUXHZO.js';
14
+ import { readPublishedApiConfig, getClientApiConfig, readPublishedSite } from './chunk-W7OPEMGJ.js';
15
+ import { normalizeSiteHost } from './chunk-A4CC4ZG3.js';
16
+ import { subscribeMeasurementPolicy, measurementPolicySnapshot, serverMeasurementPolicySnapshot, analyticsPurposePermitted } from './chunk-FRY6PBT6.js';
17
+ import { useSyncExternalStore, useCallback, useRef, useEffect, useState, useMemo } from 'react';
12
18
 
13
19
  // src/forms/field-interactions.ts
14
20
  var MAX_TRACKED_FIELDS = 100;
@@ -171,6 +177,9 @@ function useFormTracking({
171
177
  debug = false,
172
178
  isFieldComplete: isFieldComplete2
173
179
  }) {
180
+ const policy = useSyncExternalStore(subscribeMeasurementPolicy, measurementPolicySnapshot, serverMeasurementPolicySnapshot);
181
+ const epoch = policy.collectionEpoch;
182
+ const permitted = useCallback(() => measurementPolicySnapshot().collectionEpoch === epoch && !!resolveAnalyticsTarget(), [epoch]);
174
183
  const sessionRef = useRef(null);
175
184
  const sessionIdRef = useRef("");
176
185
  const startTimeRef = useRef(0);
@@ -186,11 +195,17 @@ function useFormTracking({
186
195
  return session.fields.snapshot((slug) => check ? check(slug) : false, now);
187
196
  }, []);
188
197
  useEffect(() => {
189
- if (!enabled) return;
198
+ if (!enabled || !permitted()) return;
190
199
  if (!formId) {
191
200
  if (debug) console.warn("[Forms] Tracking skipped: formId is empty");
192
201
  return;
193
202
  }
203
+ const registryKey = `${formId}:${measurementPolicySnapshot().identityScope ?? "legacy"}:${policy.analyticsChoiceEpoch}`;
204
+ analyticsIdRef.current = null;
205
+ sessionIdRef.current = "";
206
+ stepTimesRef.current = {};
207
+ currentStepRef.current = 1;
208
+ maxStepRef.current = 1;
194
209
  const startTracking = async (sessionId) => {
195
210
  const { apiUrl, apiKey } = readPublishedApiConfig();
196
211
  if (!apiUrl || !apiKey) {
@@ -198,19 +213,12 @@ function useFormTracking({
198
213
  return null;
199
214
  }
200
215
  try {
201
- const response = await sonorFetch(
202
- `${apiUrl}/api/public/forms/analytics/start`,
203
- {
204
- method: "POST",
205
- headers: { "Content-Type": "application/json" },
206
- body: JSON.stringify({
207
- formId,
208
- sessionId,
209
- deviceType: getDeviceType()
210
- })
211
- },
212
- { apiKey, retries: 0 }
213
- );
216
+ const response = await analyticsSend("/api/public/forms/analytics/start", {
217
+ formId,
218
+ sessionId,
219
+ deviceType: getDeviceType()
220
+ }, { apiUrl, apiKey, measurementEpoch: epoch });
221
+ if (!response || !permitted()) return null;
214
222
  if (!response.ok) {
215
223
  throw new Error(`HTTP ${response.status}: ${response.statusText}`);
216
224
  }
@@ -222,24 +230,24 @@ function useFormTracking({
222
230
  return null;
223
231
  }
224
232
  };
225
- const session = acquireTrackingSession(formId, startTracking);
233
+ const session = acquireTrackingSession(registryKey, startTracking);
226
234
  sessionRef.current = session;
227
235
  sessionIdRef.current = session.sessionId;
228
236
  startTimeRef.current = session.startedAt;
229
237
  stepStartTimeRef.current = Date.now();
230
238
  let joined = true;
231
239
  void session.analyticsId.then((id) => {
232
- if (joined) analyticsIdRef.current = id;
240
+ if (joined && permitted()) analyticsIdRef.current = id;
233
241
  });
234
242
  const reportAbandon = (analyticsId) => {
235
- if (!analyticsId) return;
243
+ if (!analyticsId || !permitted()) return;
236
244
  const { apiUrl, apiKey } = readPublishedApiConfig();
237
245
  if (!apiUrl || !apiKey) return;
238
246
  if (!claimAbandon(session)) return;
239
247
  const now = Date.now();
240
248
  stepTimesRef.current[currentStepRef.current] = Math.floor((now - stepStartTimeRef.current) / 1e3);
241
- sonorBeacon(
242
- `${apiUrl}/api/public/forms/analytics/abandon`,
249
+ analyticsBeacon(
250
+ "/api/public/forms/analytics/abandon",
243
251
  {
244
252
  analyticsId,
245
253
  step: currentStepRef.current,
@@ -249,7 +257,7 @@ function useFormTracking({
249
257
  fieldInteractions: fieldReport(session, now),
250
258
  abandonmentField: session.fields.lastField
251
259
  },
252
- apiKey
260
+ { apiUrl, apiKey, measurementEpoch: epoch }
253
261
  );
254
262
  if (debug) console.log("[Forms] Abandonment tracked:", session.fields.lastField);
255
263
  };
@@ -260,33 +268,37 @@ function useFormTracking({
260
268
  return () => {
261
269
  joined = false;
262
270
  stopLeaveListener();
263
- releaseTrackingSession(formId, session);
271
+ releaseTrackingSession(registryKey, session);
272
+ analyticsIdRef.current = null;
273
+ sessionIdRef.current = "";
264
274
  sessionRef.current = null;
265
275
  };
266
- }, [formId, enabled, debug, fieldReport]);
276
+ }, [formId, enabled, debug, fieldReport, permitted, epoch]);
267
277
  const resolveAnalyticsId = useCallback(async () => {
278
+ if (!permitted()) return null;
268
279
  if (analyticsIdRef.current) return analyticsIdRef.current;
269
280
  const session = sessionRef.current;
270
281
  if (!session) return null;
271
282
  const id = await session.analyticsId;
283
+ if (!permitted()) return null;
272
284
  if (id) analyticsIdRef.current = id;
273
285
  return id;
274
- }, []);
286
+ }, [permitted]);
275
287
  const trackFieldFocus = useCallback((slug) => {
276
288
  const session = sessionRef.current;
277
- if (!session || session.completed) return;
289
+ if (!permitted() || !session || session.completed) return;
278
290
  if (session.fields.focus(slug)) noteActivity(session);
279
- }, []);
291
+ }, [permitted]);
280
292
  const trackFieldBlur = useCallback((slug) => {
281
- sessionRef.current?.fields.blur(slug);
282
- }, []);
293
+ if (permitted()) sessionRef.current?.fields.blur(slug);
294
+ }, [permitted]);
283
295
  const trackFieldChange = useCallback((slug) => {
284
296
  const session = sessionRef.current;
285
- if (!session || session.completed) return;
297
+ if (!permitted() || !session || session.completed) return;
286
298
  if (session.fields.change(slug)) noteActivity(session);
287
- }, []);
299
+ }, [permitted]);
288
300
  const trackStepChange = useCallback(async (step) => {
289
- if (!enabled) return;
301
+ if (!enabled || !permitted()) return;
290
302
  const { apiUrl, apiKey } = readPublishedApiConfig();
291
303
  if (!apiUrl || !apiKey) {
292
304
  if (debug) console.error("[Forms] Missing API URL or API key");
@@ -301,23 +313,16 @@ function useFormTracking({
301
313
  const session = sessionRef.current;
302
314
  if (session) noteActivity(session);
303
315
  const analyticsId = await resolveAnalyticsId();
304
- if (!analyticsId) return;
316
+ if (!analyticsId || !permitted()) return;
305
317
  try {
306
- const response = await sonorFetch(
307
- `${apiUrl}/api/public/forms/analytics/step`,
308
- {
309
- method: "POST",
310
- headers: { "Content-Type": "application/json" },
311
- body: JSON.stringify({
312
- analyticsId,
313
- step,
314
- maxStep: maxStepRef.current,
315
- stepTimes: stepTimesRef.current,
316
- ...session ? { fieldInteractions: fieldReport(session, Date.now()) } : {}
317
- })
318
- },
319
- { apiKey, retries: 0 }
320
- );
318
+ const response = await analyticsSend("/api/public/forms/analytics/step", {
319
+ analyticsId,
320
+ step,
321
+ maxStep: maxStepRef.current,
322
+ stepTimes: stepTimesRef.current,
323
+ ...session ? { fieldInteractions: fieldReport(session, Date.now()) } : {}
324
+ }, { apiUrl, apiKey, measurementEpoch: epoch });
325
+ if (!response || !permitted()) return;
321
326
  if (!response.ok) {
322
327
  throw new Error(`HTTP ${response.status}: ${response.statusText}`);
323
328
  }
@@ -325,9 +330,9 @@ function useFormTracking({
325
330
  } catch (error) {
326
331
  if (debug) console.error("[Forms] Error updating step:", error);
327
332
  }
328
- }, [enabled, debug, resolveAnalyticsId, fieldReport]);
333
+ }, [enabled, debug, resolveAnalyticsId, fieldReport, permitted, epoch]);
329
334
  const trackComplete = useCallback(async () => {
330
- if (!enabled) return;
335
+ if (!enabled || !permitted()) return;
331
336
  const session = sessionRef.current;
332
337
  if (session) markCompleted(session);
333
338
  const { apiUrl, apiKey } = readPublishedApiConfig();
@@ -340,28 +345,16 @@ function useFormTracking({
340
345
  stepTimesRef.current[currentStepRef.current] = finalStepTime;
341
346
  const fieldInteractions = session ? fieldReport(session, now) : void 0;
342
347
  const analyticsId = await resolveAnalyticsId();
343
- if (!analyticsId) return;
348
+ if (!analyticsId || !permitted()) return;
344
349
  try {
345
- const response = await sonorFetch(
346
- `${apiUrl}/api/public/forms/analytics/complete`,
347
- {
348
- method: "POST",
349
- // A form with a redirect_url navigates away right after submit, which
350
- // cancels an ordinary in-flight fetch. And since completion now
351
- // suppresses the abandon beacon, losing this would leave the row
352
- // neither completed nor abandoned.
353
- keepalive: true,
354
- headers: { "Content-Type": "application/json" },
355
- body: JSON.stringify({
356
- analyticsId,
357
- totalSteps,
358
- stepTimes: stepTimesRef.current,
359
- totalTimeSeconds: Math.floor((now - startTimeRef.current) / 1e3),
360
- ...fieldInteractions ? { fieldInteractions } : {}
361
- })
362
- },
363
- { apiKey, retries: 0 }
364
- );
350
+ const response = await analyticsSend("/api/public/forms/analytics/complete", {
351
+ analyticsId,
352
+ totalSteps,
353
+ stepTimes: stepTimesRef.current,
354
+ totalTimeSeconds: Math.floor((now - startTimeRef.current) / 1e3),
355
+ ...fieldInteractions ? { fieldInteractions } : {}
356
+ }, { apiUrl, apiKey, measurementEpoch: epoch, keepalive: true });
357
+ if (!response || !permitted()) return;
365
358
  if (!response.ok) {
366
359
  throw new Error(`HTTP ${response.status}: ${response.statusText}`);
367
360
  }
@@ -369,14 +362,14 @@ function useFormTracking({
369
362
  } catch (error) {
370
363
  if (debug) console.error("[Forms] Error completing tracking:", error);
371
364
  }
372
- }, [enabled, totalSteps, debug, resolveAnalyticsId, fieldReport]);
365
+ }, [enabled, totalSteps, debug, resolveAnalyticsId, fieldReport, permitted, epoch]);
373
366
  return {
374
367
  trackStepChange,
375
368
  trackComplete,
376
369
  trackFieldFocus,
377
370
  trackFieldBlur,
378
371
  trackFieldChange,
379
- sessionId: sessionIdRef.current
372
+ sessionId: permitted() ? sessionIdRef.current : ""
380
373
  };
381
374
  }
382
375
  function getDeviceType() {
@@ -576,51 +569,65 @@ async function submitForm({
576
569
  throw new Error("Verification could not be completed. Please try again.");
577
570
  }
578
571
  const honeypotFieldName = config.honeypot_field || DEFAULT_HONEYPOT_FIELD;
579
- const utm = getUTMParams();
580
- const ga4 = readGa4Identity();
581
- const identity = readAnalyticsIdentity();
582
- const payload = {
583
- formId: config.id,
584
- form_id: config.id,
585
- data: {
586
- ...values,
587
- ...config.honeypot_enabled ? { [honeypotFieldName]: honeypotValue } : {}
588
- },
589
- metadata: {
590
- pageUrl: typeof window !== "undefined" ? window.location.href : null,
591
- referrer: typeof document !== "undefined" ? document.referrer || null : null,
592
- userAgent: typeof navigator !== "undefined" ? navigator.userAgent : null,
593
- sessionId: identity.sessionId,
594
- // Anonymous visitor id (_sk_vid) — the same id Analytics/Signal stamp on
595
- // page views, so the Sonor side can bind this lead to its browsing session
596
- // (page -> lead attribution). Sent on every submission; null pre-hydration.
597
- visitorId: identity.visitorId,
598
- recaptchaToken: recaptchaToken || void 0,
599
- utmSource: utm.utm_source,
600
- utmMedium: utm.utm_medium,
601
- utmCampaign: utm.utm_campaign,
602
- utmTerm: utm.utm_term,
603
- utmContent: utm.utm_content,
604
- ...ga4,
605
- // Sub-site host — preserved on form_submissions for lead attribution
606
- // across multi-site projects. Resolved by SiteKitClientProviders.
607
- site: typeof window !== "undefined" ? window.__SITE_KIT_SITE__ || window.location.host : void 0,
608
- _formLoadedAt: formLoadedAt,
609
- ...agentInvoked ? { agentInvoked: true } : {}
572
+ const formData = {
573
+ ...values,
574
+ ...config.honeypot_enabled ? { [honeypotFieldName]: honeypotValue } : {}
575
+ };
576
+ const prepareAttempt = (attempt) => {
577
+ const policy = measurementPolicySnapshot();
578
+ const site = readPublishedSite() || (typeof window !== "undefined" ? window.location.hostname : "");
579
+ const matchingScope = !policy.config || policy.config.projectId === config.project_id && policy.config.site === site;
580
+ const analytics = analyticsPurposePermitted() && matchingScope;
581
+ const utm = analytics ? getUTMParams() : {};
582
+ let ga4 = {};
583
+ if (analytics) {
584
+ try {
585
+ ga4 = readGa4Identity();
586
+ } catch {
587
+ }
610
588
  }
589
+ const identity = analytics ? readAnalyticsIdentity() : { visitorId: null, sessionId: null };
590
+ const sameOrigin = getClientApiConfig().apiUrl === apiUrl;
591
+ const actualSite = typeof window !== "undefined" && sameSite(normalizeSiteHost(window.location.host), site);
592
+ const context = sameOrigin && actualSite ? currentResonanceFormContext(config.project_id, site) : null;
593
+ const headers = new Headers(attempt.headers);
594
+ headers.delete(RESONANCE_SUBJECT_HEADER);
595
+ if (context) headers.set(RESONANCE_SUBJECT_HEADER, context.subjectProof);
596
+ const payload = {
597
+ formId: config.id,
598
+ form_id: config.id,
599
+ data: formData,
600
+ metadata: {
601
+ pageUrl: typeof window !== "undefined" ? analytics ? window.location.href : window.location.origin + window.location.pathname : null,
602
+ referrer: analytics && typeof document !== "undefined" ? document.referrer || null : null,
603
+ userAgent: typeof navigator !== "undefined" ? navigator.userAgent : null,
604
+ sessionId: identity.sessionId,
605
+ visitorId: identity.visitorId,
606
+ recaptchaToken: recaptchaToken || void 0,
607
+ utmSource: utm.utm_source ?? null,
608
+ utmMedium: utm.utm_medium ?? null,
609
+ utmCampaign: utm.utm_campaign ?? null,
610
+ utmTerm: utm.utm_term ?? null,
611
+ utmContent: utm.utm_content ?? null,
612
+ ...ga4,
613
+ site: site || void 0,
614
+ _formLoadedAt: formLoadedAt,
615
+ ...agentInvoked ? { agentInvoked: true } : {},
616
+ ...context?.exposureId ? { resonanceExposureId: context.exposureId } : {}
617
+ }
618
+ };
619
+ return { ...attempt, headers, body: JSON.stringify(payload) };
611
620
  };
612
- const response = await sonorFetch(
613
- `${apiUrl}/api/public/forms/submit`,
614
- {
615
- method: "POST",
616
- headers: {
617
- "Content-Type": "application/json",
618
- Authorization: `Bearer ${apiKey}`
619
- },
620
- body: JSON.stringify(payload)
621
- },
622
- { retries: 2, timeoutMs: 2e4 }
623
- );
621
+ const initialRequest = prepareAttempt({
622
+ method: "POST",
623
+ headers: { "Content-Type": "application/json", Authorization: `Bearer ${apiKey}` }
624
+ });
625
+ const response = await sonorFetch(`${apiUrl}/api/public/forms/submit`, initialRequest, {
626
+ apiKey,
627
+ retries: 2,
628
+ timeoutMs: 2e4,
629
+ prepareAttempt
630
+ });
624
631
  const data = await response.json().catch(() => null);
625
632
  if (!response.ok) {
626
633
  const msg = (data?.message ?? data?.error ?? (response.statusText || `HTTP ${response.status}`)).toString().trim();