@sonordev/site-kit 8.8.1 → 8.10.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 (468) hide show
  1. package/CHANGELOG.md +22 -0
  2. package/README.md +9 -0
  3. package/agent-manifest.json +49 -42
  4. package/dist/AddressAutocomplete-LQS6GQ4R.js +241 -0
  5. package/dist/AnalyticsProvider-JWS7BLFY.js +19 -0
  6. package/dist/{ArticleViewTracker-PV2RD3P6.js → ArticleViewTracker-CDPVMUAO.js} +11 -10
  7. package/dist/{BlocksPopup-NEEFV2L3.js → BlocksPopup-C5PNJ7U6.js} +4 -5
  8. package/dist/ChatWidget-HEPOE3YC.js +30 -0
  9. package/dist/{FileField-MJ3RCNFJ.js → FileField-6R5LS5NU.js} +1 -3
  10. package/dist/{FormSpotlight-NQPQFZS7.js → FormSpotlight-2BSE7PD2.js} +5 -4
  11. package/dist/{FormStage-4T5PJR5K.js → FormStage-3G46OPPO.js} +5 -4
  12. package/dist/ManagedForm-LTXEU25N.js +29 -0
  13. package/dist/{ManagedNewsletterForm-TUYGN6O3.js → ManagedNewsletterForm-WE6P5DMV.js} +21 -11
  14. package/dist/{SignalCore-OW3YIH6M.js → SignalCore-IP7FE6SN.js} +90 -36
  15. package/dist/{SiteChat-XMKHBSEK.js → SiteChat-3FQYMHCP.js} +2 -2
  16. package/dist/{SiteDesignReporter-BRH7ORQS.js → SiteDesignReporter-HGTX4FX2.js} +5 -6
  17. package/dist/SitePopups-V7MCNSGE.js +19 -0
  18. package/dist/SitemapSync-OAJ7SIET.js +7 -0
  19. package/dist/SitemapSync.d.ts +1 -1
  20. package/dist/_client/booking-widget.d.ts +1 -1
  21. package/dist/_client/booking-widget.js +6 -7
  22. package/dist/_client/reviewed-signal-experiment.d.ts +9 -0
  23. package/dist/_client/reviewed-signal-experiment.js +89 -0
  24. package/dist/_client/testimonial-section.d.ts +1 -1
  25. package/dist/admin-auth/index.d.ts +3 -3
  26. package/dist/affiliates/AffiliatesWidget.d.ts +1 -1
  27. package/dist/affiliates/api.d.ts +1 -1
  28. package/dist/affiliates/index.d.ts +6 -6
  29. package/dist/affiliates/index.js +1 -3
  30. package/dist/affiliates/useAffiliates.d.ts +1 -1
  31. package/dist/analytics/AnalyticsProvider.d.ts +1 -1
  32. package/dist/analytics/dispatch.d.ts +1 -1
  33. package/dist/analytics/index.d.ts +6 -6
  34. package/dist/analytics/index.js +22 -12
  35. package/dist/analytics/publication-cta.d.ts +1 -1
  36. package/dist/analytics/send-gate.d.ts +8 -4
  37. package/dist/api-X6N6V2H3.js +5 -0
  38. package/dist/articles/Article.d.ts +1 -1
  39. package/dist/articles/ArticleFAQ.d.ts +1 -1
  40. package/dist/articles/ArticleFaqSection.d.ts +1 -1
  41. package/dist/articles/ArticleList.d.ts +1 -1
  42. package/dist/articles/ArticleViewTracker.d.ts +1 -1
  43. package/dist/articles/AuthorCard.d.ts +1 -1
  44. package/dist/articles/AuthorPage.d.ts +1 -1
  45. package/dist/articles/ClusterLandingPage.d.ts +1 -1
  46. package/dist/articles/ClusterNavigation.d.ts +1 -1
  47. package/dist/articles/ManagedNewsletterForm.d.ts +2 -2
  48. package/dist/articles/NewsletterShell.d.ts +1 -1
  49. package/dist/articles/NewsletterWidget.d.ts +1 -1
  50. package/dist/articles/PublicationLayout.d.ts +1 -1
  51. package/dist/articles/PublicationSidebar.d.ts +1 -1
  52. package/dist/articles/RelatedPosts.d.ts +1 -1
  53. package/dist/articles/ServiceCallout.d.ts +1 -1
  54. package/dist/articles/TableOfContents.d.ts +1 -1
  55. package/dist/articles/article-photos.d.ts +1 -1
  56. package/dist/articles/article-styles.d.ts +1 -1
  57. package/dist/articles/article-tables.d.ts +1 -1
  58. package/dist/articles/artwork.d.ts +1 -1
  59. package/dist/articles/author-schema.d.ts +1 -1
  60. package/dist/articles/author-social.d.ts +1 -1
  61. package/dist/articles/excerpt.d.ts +1 -1
  62. package/dist/articles/index.d.ts +1 -1
  63. package/dist/articles/index.js +3 -3
  64. package/dist/articles/news-sitemap.d.ts +1 -1
  65. package/dist/articles/processArticleHtml.d.ts +1 -1
  66. package/dist/articles/public-reads.d.ts +1 -1
  67. package/dist/articles/reading-time.d.ts +1 -1
  68. package/dist/articles/routes.d.ts +1 -1
  69. package/dist/articles/server-core.d.ts +1 -1
  70. package/dist/articles/server-ui.d.ts +1 -1
  71. package/dist/articles/server-ui.js +6 -6
  72. package/dist/articles/server.d.ts +1 -1
  73. package/dist/articles/server.js +5 -5
  74. package/dist/articles/types.d.ts +1 -1
  75. package/dist/articles/widget-styles.d.ts +1 -1
  76. package/dist/brand/extract-brand-profile.d.ts +1 -1
  77. package/dist/chat/ChatWidget.d.ts +1 -1
  78. package/dist/chat/EchoUiActions.d.ts +1 -1
  79. package/dist/chat/SiteChat.d.ts +2 -2
  80. package/dist/chat/chat-messages.d.ts +1 -1
  81. package/dist/chat/index.d.ts +7 -7
  82. package/dist/chat/index.js +17 -9
  83. package/dist/chat/launcher-placement.d.ts +1 -1
  84. package/dist/{chunk-OPUY4RS6.js → chunk-2LBKIE2K.js} +2 -1
  85. package/dist/chunk-3RBOES2C.js +36 -0
  86. package/dist/{chunk-XIDWNXZN.js → chunk-3W3MN6Z7.js} +2 -2
  87. package/dist/{chunk-CVADNHJ4.js → chunk-3WMNHFZH.js} +9 -0
  88. package/dist/chunk-533ZSRJF.js +147 -0
  89. package/dist/{chunk-UPFU63L4.js → chunk-55GFMOI6.js} +1 -1
  90. package/dist/chunk-5IVD6G77.js +37 -0
  91. package/dist/chunk-6CIO4X6P.js +77 -0
  92. package/dist/{chunk-G7BRCSV6.js → chunk-727353NY.js} +11 -7
  93. package/dist/{chunk-PSS6M4CG.js → chunk-75N2WALV.js} +2 -2
  94. package/dist/{chunk-ZQSCMYZO.js → chunk-7643MCD2.js} +6 -3
  95. package/dist/chunk-7IZUUXXO.js +1 -0
  96. package/dist/{chunk-GXWM5KNS.js → chunk-7PWXPN53.js} +40 -45
  97. package/dist/{chunk-C7TLGL3R.js → chunk-7VMA3KCN.js} +30 -4
  98. package/dist/{chunk-IDC5CVBR.js → chunk-A66TIJWU.js} +1 -1
  99. package/dist/chunk-ACZ5JNSL.js +78 -0
  100. package/dist/chunk-AG2RDHYZ.js +45 -0
  101. package/dist/{chunk-LNSNA3W4.js → chunk-C4XK472G.js} +4 -3
  102. package/dist/chunk-D4M5K6JN.js +25 -0
  103. package/dist/{chunk-F6WLHVMQ.js → chunk-D4R3FQED.js} +1 -1
  104. package/dist/{chunk-URLTBVRX.js → chunk-DW5X4BC7.js} +3 -3
  105. package/dist/chunk-FRY6PBT6.js +31 -0
  106. package/dist/{chunk-JYITKUUB.js → chunk-G5WUX7VE.js} +1 -1
  107. package/dist/{chunk-VPZJ7ZTL.js → chunk-HHEDRZOJ.js} +1 -1
  108. package/dist/{chunk-2WM4TNDF.js → chunk-HLN7A4GL.js} +1 -1
  109. package/dist/{chunk-DYROJGI2.js → chunk-HNVLINPI.js} +1 -1
  110. package/dist/{chunk-NFGAXWCN.js → chunk-J4R7MHV2.js} +31 -13
  111. package/dist/chunk-JT7GHHMV.js +56 -0
  112. package/dist/chunk-KMNHNCVG.js +20 -0
  113. package/dist/chunk-KQKUXIUD.js +25 -0
  114. package/dist/chunk-MDBXGN6W.js +13 -0
  115. package/dist/{chunk-IWNJCRXW.js → chunk-MIKVCYGX.js} +125 -118
  116. package/dist/{chunk-GQN4BGK6.js → chunk-MKU5ZORB.js} +2 -31
  117. package/dist/chunk-MOACHHOJ.js +20 -0
  118. package/dist/{chunk-M5JIHQ42.js → chunk-NBNDH2J6.js} +2 -2
  119. package/dist/{chunk-YRQS7VAH.js → chunk-NH7K252M.js} +6 -4
  120. package/dist/chunk-NHDRA4Y5.js +6 -0
  121. package/dist/{chunk-SLFYTELD.js → chunk-NWEIHCSE.js} +3 -1
  122. package/dist/{chunk-EATJPSTS.js → chunk-O5LQUBBN.js} +1 -1
  123. package/dist/chunk-OCNODBH4.js +2 -0
  124. package/dist/{chunk-TP32MRXV.js → chunk-OEHIXCYS.js} +2 -2
  125. package/dist/{chunk-Y6SHFILE.js → chunk-OEOSR5EG.js} +1 -1
  126. package/dist/{chunk-KG5IEV7I.js → chunk-ORSQKTMN.js} +1 -1
  127. package/dist/{chunk-SVHPILS3.js → chunk-P7S45DD7.js} +1 -1
  128. package/dist/chunk-PVY7X5UR.js +21 -0
  129. package/dist/{chunk-HN7GVGWC.js → chunk-Q2OE32TH.js} +3 -3
  130. package/dist/chunk-RMPXSEEU.js +62 -0
  131. package/dist/{chunk-THXELZTQ.js → chunk-RUV6DCKL.js} +1 -1
  132. package/dist/{chunk-2WDWQI7K.js → chunk-RYR6N4X4.js} +1 -1
  133. package/dist/{chunk-ODOV76VW.js → chunk-STIVFCWM.js} +1 -1
  134. package/dist/{chunk-6BFQI3ZE.js → chunk-TLKLHSRJ.js} +2 -2
  135. package/dist/chunk-TPHOIE4I.js +73 -0
  136. package/dist/{chunk-SBPUFTMP.js → chunk-UMF5OILQ.js} +2 -2
  137. package/dist/chunk-WYNDBJG7.js +66 -0
  138. package/dist/{chunk-OWZWRP7Y.js → chunk-XAPSYDVT.js} +2 -2
  139. package/dist/{chunk-PAYCK7FC.js → chunk-XJZLXUTG.js} +1 -1
  140. package/dist/{chunk-YEX5RAEU.js → chunk-Y7DZ2ND2.js} +38 -27
  141. package/dist/{chunk-AYQEIMGS.js → chunk-YJ6PRJ7Y.js} +103 -22
  142. package/dist/chunk-Z4XJOVQX.js +9 -0
  143. package/dist/{chunk-6DXQHNZK.js → chunk-Z62W7Q3T.js} +1 -1
  144. package/dist/client/index.d.ts +8 -8
  145. package/dist/client/index.js +9 -8
  146. package/dist/config/index.d.ts +1 -1
  147. package/dist/contracts/broadcast-layouts.d.ts +8 -0
  148. package/dist/contracts/crm-disposition.d.ts +87 -0
  149. package/dist/contracts/decision-roles.d.ts +39 -0
  150. package/dist/contracts/entries.d.ts +1 -1
  151. package/dist/contracts/funnels.d.ts +85 -2
  152. package/dist/contracts/portfolio.d.ts +1 -1
  153. package/dist/contracts/publication-branding.d.ts +3 -3
  154. package/dist/contracts/resonance-constants.d.ts +4 -0
  155. package/dist/contracts/resonance.d.ts +8461 -0
  156. package/dist/contracts/signal-experiments.d.ts +219 -0
  157. package/dist/contracts/site-edit.d.ts +2 -2
  158. package/dist/contracts/sites.d.ts +1 -1
  159. package/dist/contracts/slots.d.ts +2 -2
  160. package/dist/contracts/wire-schema.d.ts +36 -0
  161. package/dist/controls-KLG6VQLO.js +14 -0
  162. package/dist/cta-bar/CtaBar.d.ts +1 -1
  163. package/dist/cta-bar/client.js +3 -2
  164. package/dist/cta-bar/index.d.ts +4 -4
  165. package/dist/cta-bar/index.js +4 -3
  166. package/dist/fleet/FleetHeartbeat.d.ts +2 -2
  167. package/dist/fleet/contract.d.ts +1 -1
  168. package/dist/fleet/heartbeat.d.ts +2 -2
  169. package/dist/fleet/index.d.ts +6 -6
  170. package/dist/fleet/index.js +4 -5
  171. package/dist/forms/AddressAutocomplete.d.ts +20 -0
  172. package/dist/forms/FileField.d.ts +1 -1
  173. package/dist/forms/FormClient.d.ts +4 -3
  174. package/dist/forms/FormEnhancer.d.ts +3 -2
  175. package/dist/forms/FormField.d.ts +3 -1
  176. package/dist/forms/FormSpotlight.d.ts +2 -2
  177. package/dist/forms/FormStage.d.ts +2 -2
  178. package/dist/forms/ManagedForm.d.ts +2 -2
  179. package/dist/forms/PrivateFileField.d.ts +1 -1
  180. package/dist/forms/ServerForm.d.ts +5 -4
  181. package/dist/forms/StaticForm.d.ts +1 -1
  182. package/dist/forms/contract.d.ts +1 -1
  183. package/dist/forms/controls.d.ts +5 -0
  184. package/dist/forms/experience-plan.d.ts +1 -1
  185. package/dist/forms/field-autocomplete.d.ts +1 -1
  186. package/dist/forms/field-controls.d.ts +4 -2
  187. package/dist/forms/field-rules.d.ts +1 -1
  188. package/dist/forms/form-dom-values.d.ts +1 -1
  189. package/dist/forms/index.d.ts +18 -18
  190. package/dist/forms/index.js +21 -11
  191. package/dist/forms/normalize-config.d.ts +1 -1
  192. package/dist/forms/server.d.ts +4 -4
  193. package/dist/forms/server.js +5 -5
  194. package/dist/forms/static.d.ts +2 -2
  195. package/dist/forms/static.js +2 -2
  196. package/dist/forms/submitForm.d.ts +2 -2
  197. package/dist/forms/tracking-session.d.ts +1 -1
  198. package/dist/forms/types.d.ts +9 -0
  199. package/dist/forms/useForm.d.ts +2 -2
  200. package/dist/forms/webmcp.d.ts +2 -2
  201. package/dist/images/api.d.ts +1 -1
  202. package/dist/images/index.d.ts +6 -6
  203. package/dist/images/index.js +2 -4
  204. package/dist/images/server.d.ts +2 -2
  205. package/dist/index.d.ts +13 -13
  206. package/dist/index.js +1 -1
  207. package/dist/landing/contract.d.ts +1 -1
  208. package/dist/landing/contract.js +2 -1
  209. package/dist/landing/index.d.ts +3 -3
  210. package/dist/landing/index.js +3 -2
  211. package/dist/landing/managed-server.d.ts +2 -2
  212. package/dist/landing/managed.d.ts +10 -2
  213. package/dist/landing/server.d.ts +7 -7
  214. package/dist/landing/server.js +13 -8
  215. package/dist/layout/AiDiscoveryLinks.d.ts +1 -1
  216. package/dist/layout/SiteKitClientProviders.d.ts +1 -1
  217. package/dist/layout/SiteKitLayout.d.ts +2 -2
  218. package/dist/layout/client.d.ts +1 -1
  219. package/dist/layout/client.js +15 -11
  220. package/dist/layout/index.d.ts +5 -5
  221. package/dist/layout/index.js +17 -13
  222. package/dist/layout/types.d.ts +2 -2
  223. package/dist/llms/AEOComponents.d.ts +1 -1
  224. package/dist/llms/SpeakableSchema.d.ts +1 -1
  225. package/dist/llms/api.d.ts +1 -1
  226. package/dist/llms/client.d.ts +3 -3
  227. package/dist/llms/contract.d.ts +1 -1
  228. package/dist/llms/generateLLMsTxt.d.ts +1 -1
  229. package/dist/llms/handlers.d.ts +1 -1
  230. package/dist/llms/index.d.ts +21 -21
  231. package/dist/llms/index.js +5 -5
  232. package/dist/llms/merge.d.ts +1 -1
  233. package/dist/llms/sourcedFacts.d.ts +1 -1
  234. package/dist/llms/types.d.ts +5 -5
  235. package/dist/llms/writeLLMsTxt.d.ts +3 -3
  236. package/dist/maps/GoogleMap.d.ts +1 -1
  237. package/dist/maps/NeighborhoodMap.d.ts +1 -1
  238. package/dist/maps/api.d.ts +1 -1
  239. package/dist/maps/index.d.ts +5 -5
  240. package/dist/maps/index.js +8 -80
  241. package/dist/maps/places-library.d.ts +34 -0
  242. package/dist/mcp/WebMcpTools.d.ts +1 -1
  243. package/dist/mcp/client.d.ts +2 -2
  244. package/dist/mcp/discovery.d.ts +2 -2
  245. package/dist/mcp/handlers.d.ts +4 -4
  246. package/dist/mcp/index.d.ts +12 -12
  247. package/dist/mcp/protocol.d.ts +1 -1
  248. package/dist/mcp/report.d.ts +1 -1
  249. package/dist/mcp/serverCard.d.ts +1 -1
  250. package/dist/mcp/sonor.d.ts +5 -5
  251. package/dist/mcp/sonor.js +12 -12
  252. package/dist/mcp/transport.d.ts +1 -1
  253. package/dist/motion/Parallax.d.ts +1 -1
  254. package/dist/motion/ScrollScene.d.ts +1 -1
  255. package/dist/motion/gsap.d.ts +2 -2
  256. package/dist/motion/index.d.ts +9 -9
  257. package/dist/motion/three.d.ts +1 -1
  258. package/dist/og/index.d.ts +5 -5
  259. package/dist/og/pages.d.ts +1 -1
  260. package/dist/og/route-fit.d.ts +17 -0
  261. package/dist/og/template.d.ts +1 -1
  262. package/dist/places-library-RU2YNKFK.js +54 -0
  263. package/dist/portfolio/contract.d.ts +1 -1
  264. package/dist/press-kit/articles/Article.d.ts +2 -2
  265. package/dist/press-kit/articles/ArticleFaqSection.d.ts +1 -1
  266. package/dist/press-kit/articles/ArticleList.d.ts +2 -2
  267. package/dist/press-kit/articles/AuthorCard.d.ts +1 -1
  268. package/dist/press-kit/articles/AuthorPage.d.ts +1 -1
  269. package/dist/press-kit/articles/ClusterLandingPage.d.ts +2 -2
  270. package/dist/press-kit/articles/ClusterNavigation.d.ts +2 -2
  271. package/dist/press-kit/articles/ManagedNewsletterForm.d.ts +2 -2
  272. package/dist/press-kit/articles/PublicationLayout.d.ts +2 -2
  273. package/dist/press-kit/articles/PublicationSidebar.d.ts +1 -1
  274. package/dist/press-kit/articles/RelatedPosts.d.ts +2 -2
  275. package/dist/press-kit/articles/TableOfContents.d.ts +1 -1
  276. package/dist/press-kit/articles/article-body.d.ts +1 -1
  277. package/dist/press-kit/articles/article-headings.d.ts +1 -1
  278. package/dist/press-kit/articles/article-photos.d.ts +1 -1
  279. package/dist/press-kit/articles/artwork.d.ts +2 -2
  280. package/dist/press-kit/articles/author-schema.d.ts +2 -2
  281. package/dist/press-kit/articles/author-social.d.ts +1 -1
  282. package/dist/press-kit/articles/index.d.ts +23 -23
  283. package/dist/press-kit/articles/news-sitemap.d.ts +2 -2
  284. package/dist/press-kit/articles/public-reads.d.ts +1 -1
  285. package/dist/press-kit/articles/publication-reads.d.ts +2 -2
  286. package/dist/press-kit/articles/reading-time.d.ts +1 -1
  287. package/dist/press-kit/articles/server-core.d.ts +20 -20
  288. package/dist/press-kit/articles/server-ui.d.ts +20 -20
  289. package/dist/press-kit/articles/types.d.ts +1 -1
  290. package/dist/proxy/index.d.ts +5 -5
  291. package/dist/proxy/index.js +1 -1
  292. package/dist/reputation/TestimonialSection.d.ts +1 -1
  293. package/dist/reputation/VisualReviewCard.d.ts +1 -1
  294. package/dist/reputation/api.d.ts +1 -1
  295. package/dist/reputation/index.d.ts +4 -4
  296. package/dist/reputation/server.d.ts +3 -3
  297. package/dist/resonance/ResonanceRuntime.d.ts +7 -0
  298. package/dist/resonance/bridge.d.ts +16 -0
  299. package/dist/resonance/consent-adapter.d.ts +26 -0
  300. package/dist/resonance/controller-registry.d.ts +14 -0
  301. package/dist/resonance/controller.d.ts +103 -0
  302. package/dist/resonance/form-context.d.ts +5 -0
  303. package/dist/resonance/index.d.ts +4 -0
  304. package/dist/resonance/index.js +9 -0
  305. package/dist/resonance/meta-pixel.d.ts +67 -0
  306. package/dist/resonance/providers.d.ts +32 -0
  307. package/dist/resonance/runtime-core.d.ts +5 -0
  308. package/dist/revalidate/index.d.ts +3 -3
  309. package/dist/revalidate/index.js +2 -2
  310. package/dist/robots/index.d.ts +3 -3
  311. package/dist/robots/indexnow.js +2 -2
  312. package/dist/runtime/index.d.ts +7 -7
  313. package/dist/runtime/index.js +4 -5
  314. package/dist/runtime-core-EU2RZMOL.js +2213 -0
  315. package/dist/seo/ManagedFAQ.d.ts +1 -1
  316. package/dist/seo/ManagedInternalLinks.d.ts +1 -1
  317. package/dist/seo/ManagedSchema.d.ts +1 -1
  318. package/dist/seo/ManagedScripts.d.ts +1 -1
  319. package/dist/seo/client.d.ts +1 -1
  320. package/dist/seo/client.js +3 -5
  321. package/dist/seo/entry-indexnow.d.ts +1 -1
  322. package/dist/seo/entry-llms-client.d.ts +1 -1
  323. package/dist/seo/entry-llms-contract.d.ts +1 -1
  324. package/dist/seo/entry-llms.d.ts +1 -1
  325. package/dist/seo/entry-meta-contract.d.ts +1 -1
  326. package/dist/seo/entry-og-route.d.ts +1 -1
  327. package/dist/seo/entry-og.d.ts +1 -1
  328. package/dist/seo/entry-pages-contract.d.ts +1 -1
  329. package/dist/seo/entry-redirects.d.ts +1 -1
  330. package/dist/seo/entry-robots.d.ts +1 -1
  331. package/dist/seo/entry-sitemap.d.ts +1 -1
  332. package/dist/seo/getManagedMetadata.d.ts +1 -1
  333. package/dist/seo/index.d.ts +12 -12
  334. package/dist/seo/index.js +9 -11
  335. package/dist/seo/indexnow.d.ts +1 -1
  336. package/dist/seo/indexnow.js +2 -2
  337. package/dist/seo/llms/client.d.ts +1 -1
  338. package/dist/seo/llms/contract.d.ts +1 -1
  339. package/dist/seo/llms.d.ts +1 -1
  340. package/dist/seo/llms.js +5 -5
  341. package/dist/seo/meta/contract.d.ts +1 -1
  342. package/dist/seo/og.d.ts +1 -1
  343. package/dist/seo/pages/contract.d.ts +1 -1
  344. package/dist/seo/redirects.d.ts +1 -1
  345. package/dist/seo/register-sitemap-cli-impl.d.ts +1 -1
  346. package/dist/seo/register-sitemap-cli.js +1 -1
  347. package/dist/seo/robots.d.ts +1 -1
  348. package/dist/seo/routing.d.ts +1 -1
  349. package/dist/seo/server.d.ts +4 -4
  350. package/dist/seo/server.js +3 -3
  351. package/dist/seo/sitemap.d.ts +1 -1
  352. package/dist/seo/sitemap.js +3 -3
  353. package/dist/seo/types.d.ts +1 -1
  354. package/dist/seo-meta/contract.d.ts +1 -1
  355. package/dist/seo-pages/contract.d.ts +1 -1
  356. package/dist/server/index.d.ts +5 -5
  357. package/dist/server/index.js +3 -3
  358. package/dist/server/mint-site-token.d.ts +1 -1
  359. package/dist/server/server-fetch.d.ts +8 -0
  360. package/dist/{server-api-XIKDWSNO.js → server-api-A34TABT2.js} +2 -2
  361. package/dist/shared/build-entries.d.ts +3 -1
  362. package/dist/shared/color.d.ts +1 -1
  363. package/dist/shared/fetchWithRetry.d.ts +6 -0
  364. package/dist/shared/frame.d.ts +1 -1
  365. package/dist/shared/identity-storage.d.ts +6 -4
  366. package/dist/shared/identity.d.ts +1 -3
  367. package/dist/shared/index.d.ts +5 -5
  368. package/dist/shared/index.js +1 -1
  369. package/dist/shared/measurement-analytics.d.ts +1 -0
  370. package/dist/shared/measurement-policy.d.ts +6 -0
  371. package/dist/shared/measurement-proof.d.ts +5 -0
  372. package/dist/shared/measurement-store.d.ts +34 -0
  373. package/dist/shared/measurement-writer.d.ts +6 -0
  374. package/dist/shared/publishCredential.d.ts +1 -1
  375. package/dist/shared/reporting-gate.d.ts +3 -1
  376. package/dist/shared/site-token-claims.d.ts +18 -0
  377. package/dist/shared/site-token-configuration.d.ts +9 -0
  378. package/dist/shared/site-token-refresh.d.ts +7 -0
  379. package/dist/shared/site-token-state.d.ts +23 -0
  380. package/dist/shared/siteToken.d.ts +5 -39
  381. package/dist/shared/sonor-auth-state.d.ts +3 -0
  382. package/dist/shared/sonor-beacon.d.ts +13 -0
  383. package/dist/shared/sonor-fetch-runtime.d.ts +2 -0
  384. package/dist/shared/sonor-fetch.d.ts +7 -0
  385. package/dist/shared/sonorFetch.d.ts +4 -49
  386. package/dist/shared/version.d.ts +1 -1
  387. package/dist/signal/ReviewedSignalExperiment.d.ts +9 -0
  388. package/dist/signal/SignalBridge.d.ts +4 -4
  389. package/dist/signal/SignalCore.d.ts +2 -1
  390. package/dist/signal/SignalExperiment.d.ts +13 -5
  391. package/dist/signal/index.d.ts +3 -3
  392. package/dist/signal/index.js +4 -73
  393. package/dist/signal/store.d.ts +10 -7
  394. package/dist/signal/types.d.ts +4 -0
  395. package/dist/sitemap/index.d.ts +5 -5
  396. package/dist/sitemap/index.js +3 -3
  397. package/dist/sites/contract.d.ts +1 -1
  398. package/dist/sites/normalize.d.ts +1 -1
  399. package/dist/slots/ManagedLink.d.ts +2 -2
  400. package/dist/slots/ManagedList.d.ts +2 -2
  401. package/dist/slots/ManagedRichText.d.ts +1 -1
  402. package/dist/slots/ManagedSlot.d.ts +1 -1
  403. package/dist/slots/contract.d.ts +1 -1
  404. package/dist/slots/edit/locate.d.ts +1 -1
  405. package/dist/slots/index.d.ts +14 -14
  406. package/dist/slots/index.js +2 -2
  407. package/dist/slots/server-api.d.ts +1 -1
  408. package/dist/{chunk-FLOJUMFR.js → sonor-fetch-runtime-SLPBNZY4.js} +27 -36
  409. package/dist/sync/AddToCalendar.d.ts +1 -1
  410. package/dist/sync/BookingWidget.d.ts +1 -1
  411. package/dist/sync/MeetingFormatStep.d.ts +1 -1
  412. package/dist/sync/api.d.ts +2 -2
  413. package/dist/sync/booking-flow.d.ts +1 -1
  414. package/dist/sync/index.d.ts +3 -3
  415. package/dist/sync/index.js +6 -7
  416. package/dist/types.d.ts +6 -6
  417. package/dist/website/BlocksPopup.d.ts +1 -1
  418. package/dist/website/PopupBlocks.d.ts +1 -1
  419. package/dist/website/SiteDesignReporter.d.ts +2 -2
  420. package/dist/website/SitePopups.d.ts +1 -1
  421. package/dist/website/contract.d.ts +1 -1
  422. package/dist/website/cta-bar.d.ts +1 -1
  423. package/dist/website/cta-bar.js +4 -3
  424. package/dist/website/design.d.ts +2 -2
  425. package/dist/website/images/server.d.ts +1 -1
  426. package/dist/website/images-server.d.ts +1 -1
  427. package/dist/website/images.d.ts +1 -1
  428. package/dist/website/images.js +2 -4
  429. package/dist/website/index.d.ts +4 -4
  430. package/dist/website/index.js +5 -6
  431. package/dist/website/landing/server.d.ts +1 -1
  432. package/dist/website/landing/server.js +13 -8
  433. package/dist/website/landing-server.d.ts +1 -1
  434. package/dist/website/landing.d.ts +1 -1
  435. package/dist/website/landing.js +3 -2
  436. package/dist/website/popup-rules.d.ts +2 -2
  437. package/dist/website/popup-types.d.ts +1 -1
  438. package/dist/website/popups.d.ts +4 -4
  439. package/dist/website/popups.js +14 -8
  440. package/dist/website/slots/contract.d.ts +1 -1
  441. package/dist/website/slots-contract.d.ts +1 -1
  442. package/dist/website/slots.d.ts +2 -2
  443. package/dist/website/slots.js +2 -2
  444. package/dist/{writeLLMsTxt-4HHUAOA6.js → writeLLMsTxt-2CBYGKZO.js} +2 -2
  445. package/docs.json +5 -0
  446. package/package.json +8 -2
  447. package/src/analytics/README.md +21 -0
  448. package/src/cta-bar/README.md +4 -0
  449. package/src/forms/README.md +76 -0
  450. package/src/landing/README.md +14 -0
  451. package/src/layout/README.md +3 -0
  452. package/src/resonance/README.md +273 -0
  453. package/src/runtime/README.md +6 -1
  454. package/src/signal/README.md +21 -0
  455. package/src/website/README.md +14 -2
  456. package/dist/AnalyticsProvider-7SBJ27SI.js +0 -13
  457. package/dist/ChatWidget-V46UBDOM.js +0 -20
  458. package/dist/ManagedForm-DDDVMKLJ.js +0 -19
  459. package/dist/SitePopups-VU2C3Z6B.js +0 -13
  460. package/dist/SitemapSync-C4H3HF3L.js +0 -9
  461. package/dist/chunk-5ROTTMBL.js +0 -19
  462. package/dist/chunk-5TM3WPCI.js +0 -7
  463. package/dist/chunk-7HW4TZB5.js +0 -148
  464. package/dist/chunk-IPQKQEWI.js +0 -52
  465. package/dist/chunk-LCDVPAMR.js +0 -24
  466. package/dist/chunk-LQJC5S2M.js +0 -236
  467. package/dist/chunk-SHAUX2MQ.js +0 -163
  468. /package/dist/{chunk-3MJNBOUO.js → chunk-2QPVU63T.js} +0 -0
@@ -1,13 +1,16 @@
1
1
  'use client';
2
+ import { setFirstPartyIdentityScope } from './chunk-KQKUXIUD.js';
2
3
  import { SITE_EDIT_PARAM } from './chunk-6G43IRWR.js';
3
- import { publishSiteCredential } from './chunk-OPUY4RS6.js';
4
- import { FleetHeartbeat } from './chunk-HN7GVGWC.js';
4
+ import { publishSiteCredential } from './chunk-2LBKIE2K.js';
5
+ import { ResonanceRuntime } from './chunk-3RBOES2C.js';
6
+ import { FleetHeartbeat } from './chunk-Q2OE32TH.js';
5
7
  import { useDeferredActivation } from './chunk-YC7ELZS3.js';
6
8
  import { resolveSiteHost } from './chunk-FESKKJAS.js';
7
- import { getOrCreateVisitorId, getOrCreateSessionId } from './chunk-IPQKQEWI.js';
8
- import { announceFrameReady, isPrivatePreview, isCrossOriginFrame } from './chunk-ZQSCMYZO.js';
9
- import { SignalBridge } from './chunk-SHAUX2MQ.js';
10
- import React, { useState, useRef, useCallback, useEffect, Suspense } from 'react';
9
+ import { getOrCreateVisitorId, getOrCreateSessionId } from './chunk-JT7GHHMV.js';
10
+ import { resolveAnalyticsTarget, announceFrameReady, isPrivatePreview, isCrossOriginFrame } from './chunk-7643MCD2.js';
11
+ import { SignalBridge } from './chunk-533ZSRJF.js';
12
+ import { primeMeasurementPolicy, subscribeMeasurementPolicy, measurementPolicySnapshot, serverMeasurementPolicySnapshot, analyticsPurposePermitted } from './chunk-FRY6PBT6.js';
13
+ import React, { useSyncExternalStore, useState, useEffect, useRef, useCallback, Suspense } from 'react';
11
14
  import dynamic from 'next/dynamic';
12
15
  import { jsx, Fragment, jsxs } from 'react/jsx-runtime';
13
16
 
@@ -33,23 +36,23 @@ function startEditBridge() {
33
36
  };
34
37
  }
35
38
  var LazyAnalyticsProvider = dynamic(
36
- () => import('./AnalyticsProvider-7SBJ27SI.js').then((m) => ({ default: m.AnalyticsProvider })),
39
+ () => import('./AnalyticsProvider-JWS7BLFY.js').then((m) => ({ default: m.AnalyticsProvider })),
37
40
  { ssr: false }
38
41
  );
39
42
  var LazySiteChat = dynamic(
40
- () => import('./SiteChat-XMKHBSEK.js').then((m) => ({ default: m.SiteChat })),
43
+ () => import('./SiteChat-3FQYMHCP.js').then((m) => ({ default: m.SiteChat })),
41
44
  { ssr: false }
42
45
  );
43
46
  var LazySitePopups = dynamic(
44
- () => import('./SitePopups-VU2C3Z6B.js').then((m) => ({ default: m.SitePopups })),
47
+ () => import('./SitePopups-V7MCNSGE.js').then((m) => ({ default: m.SitePopups })),
45
48
  { ssr: false }
46
49
  );
47
50
  var LazySiteDesignReporter = dynamic(
48
- () => import('./SiteDesignReporter-BRH7ORQS.js').then((m) => ({ default: m.SiteDesignReporter })),
51
+ () => import('./SiteDesignReporter-HGTX4FX2.js').then((m) => ({ default: m.SiteDesignReporter })),
49
52
  { ssr: false }
50
53
  );
51
54
  var LazySitemapSync = dynamic(
52
- () => import('./SitemapSync-C4H3HF3L.js').then((m) => ({ default: m.SitemapSync })),
55
+ () => import('./SitemapSync-OAJ7SIET.js').then((m) => ({ default: m.SitemapSync })),
53
56
  { ssr: false }
54
57
  );
55
58
  function SiteKitClientProviders({
@@ -68,14 +71,28 @@ function SiteKitClientProviders({
68
71
  defer = true,
69
72
  debug = false
70
73
  }) {
74
+ primeMeasurementPolicy();
71
75
  const modulesReady = useDeferredActivation(defer);
72
76
  const analyticsConfig = typeof analytics === "object" ? analytics : {};
73
77
  const site = resolveSiteHost(analyticsConfig.site);
74
78
  publishSiteCredential({ apiKey, apiUrl, site, debug });
75
79
  const designConfig = design === false ? false : typeof design === "object" ? design : {};
76
80
  if (typeof window !== "undefined") window.__SITE_KIT_DESIGN__ = designConfig;
77
- const [visitorId] = useState(() => getOrCreateVisitorId());
78
- const [sessionId] = useState(() => getOrCreateSessionId());
81
+ const policy = useSyncExternalStore(subscribeMeasurementPolicy, measurementPolicySnapshot, serverMeasurementPolicySnapshot);
82
+ const [visitorId, setVisitorId] = useState("");
83
+ const [sessionId, setSessionId] = useState("");
84
+ useEffect(() => {
85
+ setFirstPartyIdentityScope(projectId, site);
86
+ }, [projectId, site]);
87
+ useEffect(() => {
88
+ if (!(modulesReady || signal) || !analyticsPurposePermitted() || !resolveAnalyticsTarget({ apiKey, apiUrl, allowInFrame: analyticsConfig.allowInFrame, allowLocalhost: analyticsConfig.allowLocalhost })) {
89
+ setVisitorId("");
90
+ setSessionId("");
91
+ return;
92
+ }
93
+ setVisitorId(getOrCreateVisitorId());
94
+ setSessionId(getOrCreateSessionId());
95
+ }, [modulesReady, signal, apiKey, apiUrl, policy.collectionEpoch, analyticsConfig.allowInFrame, analyticsConfig.allowLocalhost]);
79
96
  const pageMetadataRef = useRef(null);
80
97
  const onPageMetadata = useCallback((metadata) => {
81
98
  pageMetadataRef.current = metadata;
@@ -84,6 +101,7 @@ function SiteKitClientProviders({
84
101
  useEffect(() => startEditBridge(), []);
85
102
  const siblings = [];
86
103
  if (isPrivatePreview()) return /* @__PURE__ */ jsx(Fragment, { children });
104
+ siblings.push(/* @__PURE__ */ jsx(Suspense, { fallback: null, children: /* @__PURE__ */ jsx(ResonanceRuntime, { site, apiUrl, apiKey }) }, "sk-resonance"));
87
105
  if (signal) {
88
106
  const signalConfig = typeof signal === "object" ? signal : {};
89
107
  siblings.push(
@@ -0,0 +1,56 @@
1
+ 'use client';
2
+ import { uuid } from './chunk-GJWI74ZZ.js';
3
+ import { identityStorageKeys, memoryIdentity } from './chunk-5IVD6G77.js';
4
+ import { analyticsPurposePermitted, subscribeMeasurementPolicy, measurementPolicySnapshot, serverMeasurementPolicySnapshot } from './chunk-FRY6PBT6.js';
5
+ import { useSyncExternalStore, useState, useEffect } from 'react';
6
+
7
+ function getOrCreateVisitorId() {
8
+ var _a;
9
+ if (typeof window === "undefined" || !analyticsPurposePermitted()) return "";
10
+ const keys = identityStorageKeys();
11
+ let stored = null;
12
+ try {
13
+ stored = window.localStorage.getItem(keys.visitor);
14
+ const visitorId = stored || uuid();
15
+ window.localStorage.setItem(keys.visitor, visitorId);
16
+ return visitorId;
17
+ } catch {
18
+ return (_a = memoryIdentity).visitorId || (_a.visitorId = stored || uuid());
19
+ }
20
+ }
21
+ function getOrCreateSessionId(timeoutMinutes = 30) {
22
+ var _a;
23
+ if (typeof window === "undefined" || !analyticsPurposePermitted()) return "";
24
+ const keys = identityStorageKeys();
25
+ const now = Date.now();
26
+ const timeoutMs = timeoutMinutes * 60 * 1e3;
27
+ let existingSession = null;
28
+ try {
29
+ existingSession = window.sessionStorage.getItem(keys.session);
30
+ const lastActivity = window.sessionStorage.getItem(keys.time);
31
+ if (existingSession && lastActivity) {
32
+ const elapsed = now - parseInt(lastActivity, 10);
33
+ if (elapsed < timeoutMs) {
34
+ window.sessionStorage.setItem(keys.time, now.toString());
35
+ window.sessionStorage.setItem(keys.session, existingSession);
36
+ return existingSession;
37
+ }
38
+ }
39
+ const newSession = uuid();
40
+ window.sessionStorage.setItem(keys.session, newSession);
41
+ window.sessionStorage.setItem(keys.time, now.toString());
42
+ return newSession;
43
+ } catch {
44
+ return (_a = memoryIdentity).sessionId || (_a.sessionId = existingSession || uuid());
45
+ }
46
+ }
47
+ function useSiteKitIdentity() {
48
+ const policy = useSyncExternalStore(subscribeMeasurementPolicy, measurementPolicySnapshot, serverMeasurementPolicySnapshot);
49
+ const [identity, setIdentity] = useState({ visitorId: "", sessionId: "" });
50
+ useEffect(() => {
51
+ setIdentity({ visitorId: getOrCreateVisitorId(), sessionId: getOrCreateSessionId() });
52
+ }, [policy.collectionEpoch]);
53
+ return analyticsPurposePermitted() ? identity : { visitorId: "", sessionId: "" };
54
+ }
55
+
56
+ export { getOrCreateSessionId, getOrCreateVisitorId, useSiteKitIdentity };
@@ -0,0 +1,20 @@
1
+ import { measurementStore } from './chunk-FRY6PBT6.js';
2
+
3
+ // src/shared/measurement-proof.ts
4
+ function currentSubjectProof(now = Date.now()) {
5
+ const { proof, config, cmpValid } = measurementStore.current;
6
+ if (!proof || !config || !config.enabled || !cmpValid || Date.parse(config.expiresAt) <= now || Date.parse(proof.expiresAt) <= now) return null;
7
+ const first = proof.receipts[0];
8
+ return first.projectId === config.projectId && first.site === config.site && first.configRevision === config.configRevision && first.policyRevision === config.policyRevision ? proof : null;
9
+ }
10
+ function advertisingPurposesPermitted(now = Date.now()) {
11
+ const proof = currentSubjectProof(now);
12
+ if (!proof || !measurementStore.current.config) return false;
13
+ const needed = /* @__PURE__ */ new Set(["ad_storage", "ad_user_data", "ad_personalization", ...measurementStore.current.config.consentPolicy.requiredPurposes]);
14
+ return [...needed].every((p) => measurementStore.current.choices[p] === "granted" && proof.receipts.some((r) => r.purpose === p && r.state === "granted" && r.consentRevision === proof.currentConsentRevision));
15
+ }
16
+ function experimentMeasurementPermitted(now = Date.now()) {
17
+ return !!currentSubjectProof(now) && measurementStore.current.choices.analytics_storage === "granted";
18
+ }
19
+
20
+ export { advertisingPurposesPermitted, currentSubjectProof, experimentMeasurementPermitted };
@@ -0,0 +1,25 @@
1
+ import { measurementStore, analyticsPurposePermitted } from './chunk-FRY6PBT6.js';
2
+
3
+ // src/shared/measurement-writer.ts
4
+ var listeners = measurementStore.listeners;
5
+ function updateMeasurementPolicy(patch) {
6
+ const before = analyticsPurposePermitted(), oldScope = measurementStore.current.identityScope;
7
+ measurementStore.current = { ...measurementStore.current, ...patch, version: measurementStore.current.version + 1 };
8
+ if (patch.choices && patch.cmpValid !== false && patch.choices.analytics_storage !== measurementStore.lastObservedAnalyticsChoice) {
9
+ measurementStore.lastObservedAnalyticsChoice = patch.choices.analytics_storage;
10
+ measurementStore.current = { ...measurementStore.current, analyticsChoiceEpoch: measurementStore.current.analyticsChoiceEpoch + 1 };
11
+ }
12
+ if (before !== analyticsPurposePermitted() || oldScope !== measurementStore.current.identityScope) measurementStore.current = { ...measurementStore.current, collectionEpoch: measurementStore.current.collectionEpoch + 1 };
13
+ for (const listener of listeners) {
14
+ try {
15
+ listener();
16
+ } catch {
17
+ }
18
+ }
19
+ }
20
+ function setFirstPartyIdentityScope(projectId, site) {
21
+ const next = measurementStore.current.config ? `${measurementStore.current.config.projectId}:${measurementStore.current.config.site}:${measurementStore.current.config.configRevision}` : projectId && site ? `${projectId}:${site}:legacy` : null;
22
+ if (next !== measurementStore.current.identityScope) updateMeasurementPolicy({ identityScope: next });
23
+ }
24
+
25
+ export { setFirstPartyIdentityScope, updateMeasurementPolicy };
@@ -0,0 +1,13 @@
1
+ import { currentSubjectProof, advertisingPurposesPermitted, experimentMeasurementPermitted } from './chunk-KMNHNCVG.js';
2
+ import { resonanceControllerState } from './chunk-MOACHHOJ.js';
3
+ import { measurementPolicySnapshot } from './chunk-FRY6PBT6.js';
4
+
5
+ // src/resonance/form-context.ts
6
+ function currentResonanceFormContext(projectId, site) {
7
+ const config = measurementPolicySnapshot().config;
8
+ const proof = currentSubjectProof();
9
+ if (!config || config.projectId !== projectId || config.site !== site || !proof || !advertisingPurposesPermitted() && !experimentMeasurementPermitted()) return null;
10
+ return { subjectProof: proof.subjectProof, exposureId: resonanceControllerState.controller?.formExposureId() ?? null };
11
+ }
12
+
13
+ export { currentResonanceFormContext };
@@ -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-ACZ5JNSL.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-Z4XJOVQX.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();
@@ -1,38 +1,9 @@
1
1
  'use client';
2
2
  import { isEmptyValue, isDisplayOnly } from './chunk-C2FZBUSS.js';
3
- import { useMemo, useState, useEffect } from 'react';
3
+ import { useState, useEffect } from 'react';
4
4
 
5
5
  var NO_CONTROLS = {};
6
- function useFieldControls(fields) {
7
- const needsDate = useMemo(
8
- () => (fields ?? []).some((f) => f.field_type === "date" || f.field_type === "datetime"),
9
- [fields]
10
- );
11
- const needsFile = useMemo(
12
- () => (fields ?? []).some((f) => f.field_type === "file"),
13
- [fields]
14
- );
15
- const [controls, setControls] = useState(NO_CONTROLS);
16
- useEffect(() => {
17
- let cancelled = false;
18
- if (needsDate) {
19
- import('./DatePicker-JEBV6WYJ.js').then((m) => {
20
- if (!cancelled) setControls((prev) => ({ ...prev, Date: m.DatePicker }));
21
- }).catch(() => {
22
- });
23
- }
24
- if (needsFile) {
25
- import('./FileField-MJ3RCNFJ.js').then((m) => {
26
- if (!cancelled) setControls((prev) => ({ ...prev, File: m.FileField }));
27
- }).catch(() => {
28
- });
29
- }
30
- return () => {
31
- cancelled = true;
32
- };
33
- }, [needsDate, needsFile]);
34
- return controls;
35
- }
6
+ function useFieldControls(o=[],l){const n=!!l;let t=!1,f=!1;for(const{field_type:e}of o)(e==="date"||e==="datetime")&&(t=!0),e==="file"&&(f=!0);const[s,i]=useState(NO_CONTROLS);return useEffect(()=>{let e=!1;return(t||f||n)&&import("./controls-KLG6VQLO.js").then(({default:r})=>{e||r([t,f,n],(c,u)=>{e||i(a=>({...a,[c]:u}))})}).catch(()=>{}),()=>{e=!0}},[t,f,n]),l?{...s,address:l}:s}
36
7
 
37
8
  // src/forms/experience-plan.ts
38
9
  function stageQuestions(config) {
@@ -0,0 +1,20 @@
1
+ // src/resonance/controller-registry.ts
2
+ var makeStore = () => ({ controller: null, blockers: [], registrationConflict: false });
3
+ var resonanceControllerState = typeof window === "undefined" ? makeStore() : window.__SONOR_RESONANCE_RUNTIME_V1__ ?? (window.__SONOR_RESONANCE_RUNTIME_V1__ = makeStore());
4
+ function recordRenderedResonanceExposure(exposure, context) {
5
+ try {
6
+ const controller = resonanceControllerState.controller;
7
+ const pending = context ? controller?.renderedExposure(exposure, context) : controller?.renderedExposure(exposure);
8
+ if (!pending) return false;
9
+ void pending.catch(() => {
10
+ });
11
+ return true;
12
+ } catch {
13
+ return false;
14
+ }
15
+ }
16
+ function releaseRenderedResonanceExposure(exposure) {
17
+ resonanceControllerState.controller?.releaseRenderedExposure(exposure);
18
+ }
19
+
20
+ export { recordRenderedResonanceExposure, releaseRenderedResonanceExposure, resonanceControllerState };
@@ -1,7 +1,7 @@
1
1
  import { trackedFreshFetch } from './chunk-UAYAJPEP.js';
2
- import { isNextControlFlow } from './chunk-C7TLGL3R.js';
2
+ import { isNextControlFlow } from './chunk-7VMA3KCN.js';
3
3
  import { monotonicMs } from './chunk-MH2DSGC6.js';
4
- import { SITE_KIT_VERSION } from './chunk-F6WLHVMQ.js';
4
+ import { SITE_KIT_VERSION } from './chunk-D4R3FQED.js';
5
5
  import 'server-only';
6
6
 
7
7
  var MINT_PATH = "/api/public/site-token";