@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
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@sonordev/site-kit",
3
- "version": "8.8.0",
3
+ "version": "8.9.0",
4
4
  "type": "module",
5
5
  "packageManager": "pnpm@11.5.3",
6
6
  "description": "Sonor's Next.js foundation: SEO, analytics, forms, chat, booking, AI visibility and agent tools. Add @sonordev/press-kit for publications or @sonordev/commerce-kit for selling. Legacy article imports remain compatible in 8.x.",
@@ -43,6 +43,10 @@
43
43
  "types": "./dist/analytics/index.d.ts",
44
44
  "default": "./dist/analytics/index.js"
45
45
  },
46
+ "./resonance": {
47
+ "types": "./dist/resonance/index.d.ts",
48
+ "default": "./dist/resonance/index.js"
49
+ },
46
50
  "./signal": {
47
51
  "types": "./dist/signal/index.d.ts",
48
52
  "default": "./dist/signal/index.js"
@@ -373,6 +377,8 @@
373
377
  "test:integration:baseline": "node test/integration/run.mjs --update-baseline",
374
378
  "test:integration:selfcheck": "node test/integration/checks/selfcheck.mjs",
375
379
  "test:integration:setup": "playwright install chromium",
380
+ "test:meta-capture": "node test/meta-capture/run.mjs",
381
+ "test:meta-mutants": "node test/meta-capture/run-mutants.mjs",
376
382
  "clean": "rm -rf dist",
377
383
  "typecheck": "tsc --noEmit",
378
384
  "typecheck:setup": "tsc --noEmit -p packages/sonor-setup/tsconfig.json",
@@ -429,7 +435,7 @@
429
435
  "@babel/parser": "^8.0.4",
430
436
  "@babel/traverse": "^8.0.4",
431
437
  "@babel/types": "^8.0.4",
432
- "@sonordev/contracts": "^2.7.0",
438
+ "@sonordev/contracts": "^2.22.0",
433
439
  "@types/babel__generator": "^7.27.0",
434
440
  "@types/babel__traverse": "^7.28.0",
435
441
  "@types/inquirer": "^9.0.10",
@@ -260,3 +260,24 @@ site without forcing each microsite into its own Sonor project.
260
260
  Most projects leave it implicit: `NEXT_PUBLIC_SITE_URL` is already set per
261
261
  microsite, so the dimension fills in automatically. The dashboard shows a
262
262
  "Site" picker + a "Sites" tab as soon as ≥2 distinct hosts are detected.
263
+
264
+ ## Consent-aware collection (8.9)
265
+
266
+ The shared purpose policy gates identity initialization, collectors and each
267
+ transport attempt. Explicit analytics denial stops collection. Unknown consent
268
+ stops it when your maintained CMP or server policy requires analytics consent.
269
+ Unconfigured legacy analytics retains its unknown-policy behavior.
270
+
271
+ Connect the existing consent manager through the [Resonance adapter](../resonance/README.md).
272
+ Withdrawal discards pending work so a later grant can't replay it. Resonance
273
+ occurrences are a separate evidence stream and don't increment analytics
274
+ pageview counts. Accepted managed-form conversions remain server-owned.
275
+
276
+ Configured telemetry carries the current scoped subject proof in its dedicated
277
+ header through the existing analytics transport. The proof is refreshed for
278
+ each attempt and for unload-time keepalive requests. It isn't attached to
279
+ functional or arbitrary API routes, and never enters a URL or browser storage.
280
+ The server checks current receipts independently of the browser gate.
281
+
282
+
283
+ Optional telemetry rechecks current purpose permission after transport execution loads and before every attempt. A preference change during loading or credential refresh drops the pending telemetry; it doesn't authorize replay after a later grant. The existing event IDs and functional request bodies keep their meaning.
@@ -3,6 +3,10 @@
3
3
  The Liquid Glass mobile CTA bar (6.1.0). A floating frosted capsule that
4
4
  keeps a site's one or two highest-intent actions a thumb away on phones.
5
5
 
6
+ On dynamic routes with Next.js Cache Components, the bar keeps its actions
7
+ in the server-rendered page while its pathname-dependent behavior waits
8
+ inside its own Suspense boundary.
9
+
6
10
  It replaces a hand-rolled sticky mobile bar, and handles what each of those
7
11
  ends up solving on its own:
8
12
 
@@ -342,3 +342,32 @@ import '@sonordev/site-kit/forms/styles.css' // Optional default styles
342
342
  ```
343
343
 
344
344
  All components use `.sk-form__*` class names. Override with `className` prop or CSS variables.
345
+
346
+ ## Purpose-aware submission and tracking (8.9)
347
+
348
+ Managed form values can still submit when measurement is denied or unavailable.
349
+ The canonical submit helper refreshes optional measurement context before every
350
+ network attempt, including a credential-refresh retry. A withdrawal removes
351
+ that context while preserving the functional request.
352
+
353
+ GA4 cookie reads, UTM fields and existing analytics visitor/session IDs follow
354
+ the analytics purpose policy. Advertising grants alone don't authorize those
355
+ reads. The separate opaque measurement proof can accompany an eligible request
356
+ for server verification. A managed experiment exposure reference is included
357
+ only after the measurement endpoint accepted that exposure. The server still
358
+ verifies its subject, scope and current consent against the canonical accepted
359
+ submission. The browser doesn't post a form conversion.
360
+
361
+ The existing form analytics hook uses the shared analytics gate for starts,
362
+ field interactions, steps, completion and abandonment. Unknown required consent
363
+ and explicit denial stop collection. Regrant creates a fresh tracking period
364
+ without replaying denied interactions. Trackers in the same current period
365
+ still share one row. Legacy sites without an analytics requirement keep their
366
+ first-party unknown-policy behavior.
367
+
368
+ Connect your maintained consent manager through the
369
+ [Resonance adapter](../resonance/README.md). Keep it separate from newsletter
370
+ subscriptions and form follow-up permission.
371
+
372
+
373
+ Functional form submission stays available without optional measurement. Current measurement context is resolved at each actual attempt, including after transport loading or credential refresh. A withdrawn or stale context is omitted from the functional request; it isn't recovered from an old queued grant.
@@ -34,6 +34,20 @@ Keep `SiteKitLayout` in your root layout and use its deferred analytics sibling.
34
34
 
35
35
  Published-page reads use `no-store` in this version so an outdated or removed publication isn't served from the fetch cache. Keep the route dynamic and avoid wrapping this reader in a persistent cache. `managedFunnelMetadata` defaults to noindex, nofollow. Keep these campaign routes out of your sitemap.
36
36
 
37
+ On Next.js 16.3 and later with Cache Components, `instant = false` applies
38
+ only to this per-request route. There isn't a useful static publication
39
+ shell: the content and its availability both come from the fresh read.
40
+ Navigation waits for that read, so the complete content and managed form
41
+ arrive as readable server HTML, including without JavaScript. Keep the
42
+ reader uncached and verify visible content with JavaScript disabled.
43
+
44
+ Add this export to the page **only when `cacheComponents: true` is enabled**
45
+ in your Next config; Next rejects it when Cache Components is off:
46
+
47
+ ```tsx
48
+ export const instant = false
49
+ ```
50
+
37
51
  Use the normal revalidation route:
38
52
 
39
53
  ```ts
@@ -99,3 +99,6 @@ on private child routes; they don't include the current URL, preview token, or
99
99
  article content. Private preview cache, indexing, and reporting rules stay in
100
100
  place. If private pages must contain no discovery tags at all, render
101
101
  `AiDiscoveryLinks` in a public route-group layout instead of the root layout.
102
+
103
+
104
+ The layout publishes the current credential and first-party identity scope before child effects. Purpose checks stay synchronous while optional runtime work loads, so pending preferences and withdrawal don't create a collection window. Page content remains server-rendered independently of measurement.
package/src/og/README.md CHANGED
@@ -279,6 +279,34 @@ dropped), and fonts supplied as ArrayBuffers. Reach for it only when the cards
279
279
  can't be rendered at build time; per-URL cards in `og.config.ts` cover
280
280
  everything `generateStaticParams` can list.
281
281
 
282
+ ### Full-wordmark article cards
283
+
284
+ Available in Site Kit 8.8.1 and later.
285
+
286
+ Pass `logo: { src, width, height, alt }` in the card returned to
287
+ `createOgImage` to select the branded layout. The intrinsic logo dimensions
288
+ preserve its aspect ratio. Use an absolute HTTP(S) image URL or a base64 image
289
+ data URI; rasterizing a local SVG to PNG is useful when preparing assets.
290
+ Invalid logo sources or dimensions throw before rendering.
291
+
292
+ The 1200×630 card keeps the full wordmark at the upper left, with the title
293
+ below and one edge-to-edge photograph on the right. Set `theme.bg` to the
294
+ publication's light panel color and `theme.text` to its dark text color.
295
+ Optional `kicker` and `bar` provide a small publication label and domain.
296
+ The branded layout uses `title`, `logo`, `photoUrl`, `kicker`, `bar` and the
297
+ theme; `subtitle` belongs to the original layout.
298
+
299
+ Branded titles fit from 64px down to 36px while retaining the logo and photo.
300
+ Exceptionally long titles receive an ellipsis on the card; full page metadata
301
+ stays unchanged. Without a photo the copy gets the wider panel. Cards without
302
+ `logo` retain the original layout and fitting behavior.
303
+
304
+ For publication articles, use Press Kit's existing
305
+ `resolveArticleArtwork(post, 'article')` to choose the raw article artwork.
306
+ Don't use an already composed promotional card as `photoUrl`. Supply fonts
307
+ through the existing `fonts` option as ArrayBuffers, and keep the page's
308
+ `generateArticleMetadata` call on `images: false` so the file card is used.
309
+
282
310
  ### Code cards on a `trailingSlash: true` site
283
311
 
284
312
  Next serves a code card at `<page>/opengraph-image`, with no extension, and
@@ -0,0 +1,273 @@
1
+ # Resonance measurement
2
+
3
+ `@sonordev/site-kit/resonance` connects the site's consent manager to scoped
4
+ measurement receipts and approved advertising destinations. `SiteKitLayout`
5
+ mounts its childless runtime alongside the existing analytics provider. Page
6
+ content and managed forms still render when measurement is unavailable. The
7
+ small shell blocks unresolved collection immediately; its controller loads
8
+ after the page reaches idle or the visitor interacts.
9
+
10
+ On dynamic routes with Next.js Cache Components, the layout gives the
11
+ pathname-dependent runtime its own Suspense boundary. Measurement stays
12
+ blocked while it's unresolved, and page content renders independently.
13
+
14
+ ## Connect your consent manager
15
+
16
+ Register one adapter for the consent manager your site already uses. The
17
+ adapter reads its actual current preferences and subscribes to changes. It
18
+ doesn't create a banner or choose preferences for the visitor.
19
+
20
+ ```tsx
21
+ 'use client'
22
+
23
+ import { useEffect } from 'react'
24
+ import {
25
+ registerResonanceConsentAdapter,
26
+ type ResonanceConsentAdapter,
27
+ } from '@sonordev/site-kit/resonance'
28
+
29
+ // Map these methods to your site's maintained consent manager.
30
+ export function ConsentConnection({ adapter }: { adapter: ResonanceConsentAdapter }) {
31
+ useEffect(() => registerResonanceConsentAdapter(adapter), [adapter])
32
+ return null
33
+ }
34
+ ```
35
+
36
+ The adapter supplies `requiredPurposes`, `read()` and `subscribe(onChange)`.
37
+ `read()` may be asynchronous. It returns:
38
+
39
+ ```ts
40
+ {
41
+ valid: true,
42
+ observedAt: '2026-10-24T12:00:00Z',
43
+ source: 'cmp', // or 'user_preference'
44
+ choices: {
45
+ analytics_storage: 'granted',
46
+ ad_storage: 'denied',
47
+ ad_user_data: 'denied',
48
+ ad_personalization: 'denied',
49
+ },
50
+ }
51
+ ```
52
+
53
+ Each purpose can be `unknown`, `granted`, `denied` or `withdrawn`. Return
54
+ `valid: false` when the manager can't establish current preferences. Include
55
+ `analytics_storage` in `requiredPurposes` when your site's policy requires it.
56
+ Notify subscribers as soon as a preference changes. Dispatch stops before an
57
+ asynchronous read completes.
58
+
59
+ The initial config read creates no measurement subject. A valid current
60
+ preference observation can create a new subject with server receipts. Configured
61
+ collection waits for that receipt response before activating. The
62
+ opaque proof stays in memory and never enters a URL or browser storage. Its
63
+ 30-minute renewal doesn't prompt the visitor again or change consent. After
64
+ memory is lost, an actual valid preference observation can establish a new
65
+ subject. Visitor IDs and old receipt IDs can't recover the previous subject.
66
+
67
+ ## What can send?
68
+
69
+ Advertising requires a current server proof and grants for `ad_storage`,
70
+ `ad_user_data` and `ad_personalization`, plus any additional configured purpose.
71
+ Explicit analytics denial stops first-party tracking. Required but unknown
72
+ analytics consent also stops it. Legacy sites without a configured requirement
73
+ keep their first-party analytics behavior, recorded as unknown policy rather
74
+ than a consent grant.
75
+
76
+ The existing analytics provider remains the pageview counter. Resonance
77
+ occurrences supply separate retargeting and experiment evidence. Resource
78
+ interest uses approved resource IDs. It doesn't submit raw query strings,
79
+ form values or DOM text. Accepted forms become conversions on the server.
80
+
81
+ Withdrawal clears pending occurrence retries and prevents delayed work from
82
+ crossing into a later grant. Granting again records the current page with a
83
+ new occurrence ID. It doesn't replay denied page history. Failed occurrence
84
+ requests can retry with the same event ID while their scope and consent remain
85
+ current. Already delivered provider requests can't be retracted.
86
+
87
+ ## Advertising click lineage
88
+
89
+ After the current advertising grants and scoped proof are available, a new
90
+ page-view occurrence can carry one `gclid`, `gbraid` or `wbraid` from the current
91
+ URL. The live pathname must match the navigation being recorded. Duplicate or
92
+ mixed identifiers, whitespace, control characters and values longer than 1024
93
+ characters leave matching data absent. The length is an application transport
94
+ bound. Other occurrence kinds don't carry click identifiers.
95
+
96
+ This path works when analytics consent is denied and the configured advertising
97
+ policy doesn't additionally require it. The runtime doesn't retain a query from
98
+ before consent or recover one that's been removed. Retries use the same event
99
+ within its current consent and scope; withdrawal clears them. An already
100
+ recorded page isn't updated with a later identifier. No click identifier enters
101
+ browser storage or public status output.
102
+
103
+ An observed identifier doesn't prove a paid click. The server owns the link to
104
+ the actual accepted form and checks qualification and current advertising
105
+ consent before export. Deploy its accepting occurrence parser before enabling
106
+ the browser change.
107
+
108
+ ## Same-page Meta cookie observation
109
+
110
+ After the required advertising grants and actual scoped consent proof are
111
+ available, the existing page-view occurrence can include an SDK-reported
112
+ `metaCookieObservation`. The runtime reads only actual `_fbp` and `_fbc`
113
+ cookies from the current page. It doesn't construct `fbc` from a click URL,
114
+ write cookies, retain a cookie jar, or install Meta's browser SDK.
115
+
116
+ Matching requires a unique configured page resource for the current path.
117
+ The occurrence uses that exact native resource reference and the same
118
+ navigation's `pagePath`. Missing or ambiguous mappings leave the base view
119
+ unmatched. Cookie reads don't run before persisted consent, for an unmatched
120
+ page, or after consent/proof/config expiry. The live pathname must match
121
+ before and after reading. Duplicate cookie names are omitted. The shared
122
+ occurrence parser rejects invalid matching values; valid values contain
123
+ 1–1024 Unicode characters without whitespace or controls. Invalid optional
124
+ matching leaves the valid base occurrence intact.
125
+
126
+ This enriches one existing page view. It doesn't add another page-view
127
+ counter, create a business conversion or claim that a person rendered the
128
+ page. Existing content-interest evidence remains separate. Retries retain
129
+ the exact original event ID, navigation, time and captured body without
130
+ reading cookies again. Repeated consent notifications or configuration-cache
131
+ refreshes don't update an already recorded view. Withdrawal clears pending
132
+ work; a later grant can record only the current page with a new event.
133
+
134
+ Raw matching isn't forwarded through the provider event allowlist, public
135
+ status or browser storage. The accepting API must support the occurrence
136
+ shape and verify the actual owned page, current source rules and consent
137
+ before enabling this browser version. An accepted capture doesn't grant a
138
+ feed, prove native audience admission or establish provider delivery. Those
139
+ checks and the original grant/claim/time fences remain server-owned.
140
+
141
+ ## Provider capabilities
142
+
143
+ Google's allowlisted tag loads after the required grants. Automatic pageviews
144
+ are disabled. Browser events use an explicit safe page location, empty
145
+ referrer and approved resource fields. The runtime has no browser conversion
146
+ action. A pre-existing Google tag or tag manager blocks installation until
147
+ compatibility is resolved, preventing a second installation.
148
+
149
+ ## Meta browser pixel
150
+
151
+ The browser pixel exists for one reason: so Meta's own first-party cookies
152
+ (`_fbp`, and `_fbc` when a visitor arrives from a Meta ad click) exist on pages
153
+ you've approved. It sends no browser events. The only Meta event for a visit is
154
+ the server's Conversions API `PageView`, and the runtime exposes no `track`
155
+ capability. It passes no user data to the pixel, reads no form field, page title
156
+ or page metadata, and attaches no click or submit listener. It never writes
157
+ `_fbp` or `_fbc` itself and never builds one from a click URL.
158
+
159
+ **It's switched off in this release.** Site Kit 8.9.0 can't start the pixel.
160
+ This build implements no loader controls revision, so even a capability
161
+ witness from the server can't lift `meta_browser_collection_unverified`, and
162
+ `getResonanceMeasurementStatus()` keeps reporting it. A later release turns the
163
+ loader on. Everything below describes how it will behave then.
164
+
165
+ When it's on, a site's pixel starts only if the server's configuration carries
166
+ a capability witness for that site. The witness names the loader controls
167
+ revision and the policy revision it was issued under, and the runtime refuses a
168
+ revision it doesn't implement, a witness from an older policy, and a witness
169
+ issued more than 48 hours ago, and it withdraws a running pixel if the witness
170
+ lapses mid-session. A site without a witness loads nothing. The lift is per
171
+ site, and a configuration refresh that removes the witness, the destination or
172
+ `enabled` withdraws the pixel. The longest that can take is the configuration's
173
+ own expiry.
174
+
175
+ **What loads, and when.** Nothing exists before consent: no script, no
176
+ `window.fbq`, no cookie, no storage key. After the three advertising grants
177
+ (`ad_storage`, `ad_user_data`, `ad_personalization`) and a current scoped proof,
178
+ and on a page that's eligible and clean, the runtime queues consent revoked,
179
+ automatic configuration off and `init` with only the dataset ID from your
180
+ signed configuration, then inserts
181
+ `https://connect.facebook.net/en_US/fbevents.js` (async, no referrer). Once the
182
+ script has run, and the consent fence still holds, it grants consent. Each step
183
+ rechecks the fence. A grant that's queued ahead of the script doesn't release
184
+ the pixel's own lock, which is why the grant waits.
185
+
186
+ **Which pages.** A page is eligible only when its configured page resource has
187
+ `metaEligible: true`, which a person with owner or admin standing sets in
188
+ Sonor. It defaults to false, an agent can't set it, and the browser never
189
+ decides it. The same flag gates the cookie observation described above. The
190
+ runtime also refuses, with `meta_page_not_eligible`: any frame, a private
191
+ preview, a local host, a Sonor application host, a page carrying
192
+ `data-sk-authenticated`, and these paths and their children: `/admin`,
193
+ `/account`, `/dashboard`, `/login`, `/signin`, `/signup`, `/checkout`, `/cart`,
194
+ `/portal`, `/api` and `/preview`. Put `data-sk-authenticated` on the document in
195
+ any layout that sits behind a login.
196
+
197
+ **Clean URLs only.** The pixel reads the page URL and referrer on its own, so
198
+ the runtime doesn't start it, and pauses it on a single-page navigation, unless
199
+ the query holds only `fbclid`, `sonor_source` or `utm_*` keys with plain
200
+ values, there's no fragment, and the referrer is empty, an origin-only
201
+ cross-site address, or a same-site address whose path isn't on the denied list above and whose query follows the same rule.
202
+ Otherwise the status shows `meta_url_not_clean`. There's no rewriting.
203
+
204
+ **One pixel per page.** A page with its own `fbq`, a Meta script tag, a pixel
205
+ image or `noscript`, or a tag manager gets `meta_duplicate_installation` and no
206
+ second pixel. A tag manager clears only through an approved attestation in the
207
+ signed configuration. A changed dataset ID or scope under a running pixel shows
208
+ `meta_scope_change_requires_reload`, and more than one Meta destination shows
209
+ `meta_multiple_destinations`. A script that's blocked or fails shows
210
+ `meta_load_failed`. It isn't retried and no image or `noscript` fallback is
211
+ added.
212
+
213
+ **Withdrawal.** When consent, the proof or the configuration lapses, the runtime
214
+ sets the pixel's consent to revoked, stops issuing commands and, once the pixel has
215
+ run, expires `_fbp` and `_fbc` on the host and its parent domains, whether or not
216
+ consent was ever granted on that page. Code that has already run can't
217
+ be retracted, so the guarantee is that nothing further is sent. A later grant
218
+ starts fresh and never replays an earlier visit.
219
+
220
+ **For your site.** Your consent manager's vendor list and privacy notice must
221
+ name Meta, and the Conversions API user agent has its own consent wording.
222
+ Sites that ship a Content Security Policy need `script-src` for
223
+ `https://connect.facebook.net`, plus `connect-src` and `img-src` for
224
+ `https://connect.facebook.net` and `https://www.facebook.com`. Site-kit's
225
+ `securityHeaders` emits none of these. First-party receipts alone don't prove
226
+ provider audience admission, conversion matching or attribution.
227
+
228
+ Read `getResonanceMeasurementStatus()` to inspect the current policy and
229
+ provider blockers. `advertisingPermitted` describes consent eligibility. It
230
+ doesn't establish provider delivery or an installed campaign.
231
+
232
+ Managed experiments require the server's current assignment ID, experiment
233
+ revision and site. Without that witness, the existing experiment component
234
+ shows its control content. Its exposure reference records the assignment
235
+ actually rendered. Forms remain usable with measurement denied or unavailable.
236
+
237
+ ## Other layouts and verification
238
+
239
+ A custom layout can mount `<ResonanceRuntime site="example.com" ... />` as a
240
+ childless sibling after publishing the existing browser-safe site credential.
241
+ Use the established server credential component. Don't expose a raw API key.
242
+ Mount one runtime per document.
243
+
244
+ Verify unknown, grant and withdrawal states against your actual consent
245
+ manager before enabling a campaign. Check preview suppression, navigation,
246
+ scope changes and failed requests using intercepted provider URLs. A built or
247
+ packed package isn't proof that a site installed it or that a provider accepted
248
+ an event.
249
+
250
+ ### Current config and public source markers
251
+
252
+ Config freshness renews through a public read. An unchanged revision preserves
253
+ current consent; it doesn't create another subject or prompt. A changed config
254
+ or policy stops the previous scope and reads actual current preferences before
255
+ establishing the new scope. A failed lookup can't turn a configured requirement
256
+ into legacy permission. Advertising stops when proof or config expires.
257
+
258
+ The runtime reads only the bounded `sonor_source` parameter for campaign source
259
+ mapping. It forwards that marker on a current permitted occurrence. The server
260
+ verifies its signature and approved plan/destination scope. Other query fields
261
+ don't become measurement payload. A marker authenticates reviewed source
262
+ mapping, not a paid click or causal result. A visit made before consent isn't
263
+ replayed after the visitor has moved to another page.
264
+
265
+ The actual managed form submit refreshes its optional proof at each attempt.
266
+ Its accepted exposure reference comes from the measurement response. Analytics
267
+ and advertising purposes remain separate, and canonical form conversion stays
268
+ on the server. Compatible Google installations created by this runtime can be
269
+ reused for the same project/site and exact tag set. Changed scope or unknown
270
+ installations expose a blocker instead of initializing another tag.
271
+
272
+
273
+ The controller registry is shared by status observations, rendered experiment exposures and per-attempt form context. These readers use the same current policy and proof; none creates a grant. Deferred transport execution rechecks its current permission fence before sending, including after loading or credential refresh.
@@ -12,7 +12,7 @@ Building a site? You don't need this entry. Forms, analytics, articles and the r
12
12
  | `getClientApiConfig(options?)` | Find the API origin and credential. In the browser that's what `SiteKitLayout` published. During server rendering it's the server's `SONOR_API_URL`, and with `{ serverKey: true }` its `SONOR_API_KEY`. |
13
13
  | `readPublishedApiConfig()` | Exactly what `SiteKitLayout` published, with no fallbacks. For code that must stay quiet on a page without the layout. |
14
14
  | `DEFAULT_SONOR_API_URL` | `https://api.sonor.io`. |
15
- | `readAnalyticsIdentity()` | Get the visitor's analytics ids, `{ sessionId, visitorId }`, so what you send to Sonor ties to the visit analytics recorded. It only reads: either id is `null` during server rendering and before analytics has started a session in the tab. It never throws, including when the browser blocks site storage. |
15
+ | `readAnalyticsIdentity()` | Get the visitor's analytics ids, `{ sessionId, visitorId }`, so what you send to Sonor ties to the visit analytics recorded. It only reads: either id is `null` during server rendering and before analytics has started a session in the tab. It returns null ids when current analytics permission blocks collection. It never throws, including when the browser blocks site storage. |
16
16
 
17
17
  The types `SonorFetchOptions`, `FetchRetryOptions`, `ClientApiConfigOptions` and `AnalyticsIdentity` come with them.
18
18
 
@@ -46,6 +46,8 @@ Pass `apiKey` from `getClientApiConfig()` and `sonorFetch` sets the `x-api-key`
46
46
 
47
47
  `@sonordev/site-kit/client` is stamped `'use client'`. A function imported from a stamped module into a server component becomes a client reference there and can't be called, and `getClientApiConfig` is built to run during server rendering. So `runtime` isn't stamped, imports neither React nor Next, and works the same from a server component, a route handler or a client component.
48
48
 
49
+ Analytics identity reads share the same current consent state as the layout and analytics runtime, including when separate bundles load them. Pending preferences, withdrawal and expired configured policy block reads synchronously. Reading an identity never grants advertising permission or creates an id.
50
+
49
51
  ## Stability
50
52
 
51
53
  This entry is public API under semver. New exports arrive in minor releases; nothing in the list above is removed or changed in a minor or patch release.
@@ -53,3 +55,6 @@ This entry is public API under semver. New exports arrive in minor releases; not
53
55
  ## Shared website utilities (8.3)
54
56
 
55
57
  `@sonordev/site-kit/shared` provides `withSiteParam`, `withSiteBody`, `resolveSiteHost`, `readPublishedSite`, `applyTrailingSlash`, `resolveTrailingSlash` and `safeJsonLd`. These are framework-free functions for kits and sites; the entry is never marked `use client`. Press Kit uses them to keep sub-site scoping, URL shape and JSON-LD escaping consistent without reaching into private Site Kit files. `readPublishedSite()` returns the layout's explicitly published host, or undefined on the server.
58
+
59
+
60
+ `sonorFetch` loads its shared execution path on use and keeps its existing Promise-based API. Optional dispatch checks run again after loading and before each attempt. The same token state, refresh and auth breaker serve every caller; loading failure rejects the Promise rather than using another transport. Synchronous unload telemetry doesn't wait for that execution module.
@@ -113,3 +113,24 @@ interface SignalEvent {
113
113
  experiments: Array<{ id: string; variant: string }>;
114
114
  }
115
115
  ```
116
+
117
+ ## Measurement consent (8.9)
118
+
119
+ Signal follows the shared analytics purpose policy and document reporting gate.
120
+ It initializes tracking identity in an effect after permission, drops denied
121
+ tracking work and closes its stream on withdrawal. Functional page content
122
+ continues to render.
123
+
124
+ Managed experiments also require the current server measurement proof and a
125
+ scoped assignment ID, experiment revision and site. The existing component
126
+ records the assignment actually rendered. It shows control content when the
127
+ managed witness is unavailable and never treats a browser click as a trusted
128
+ accepted-form conversion. Managed assignment reads revalidate with the server
129
+ instead of reusing a legacy visitor cache. See the [consent adapter](../resonance/README.md).
130
+
131
+ The deferred Signal runtime reads its measurement header from the shared wire
132
+ constants, so that import doesn't pull in campaign validation schemas. Consent
133
+ checks, assignment witnesses and the public Signal API stay the same.
134
+
135
+
136
+ One bounded pre-core queue holds events and outcomes before the bridge and its existing core register. Each kind keeps at most 100 pending items. Registration drains current permitted work once; state updates don't replay it. Withdrawal, pending preferences and scope changes drop old queued work. Children and control content stay readable while the childless core loads.
@@ -104,8 +104,17 @@ them and their controls by name:
104
104
 
105
105
  ## Tracking
106
106
 
107
- Each popup's impression (once half of it is on screen) and button presses are
108
- counted in Sonor, against the same visitor ID (`_sk_vid`) analytics uses.
107
+ Popup impressions (once half is on screen) and button presses use the same
108
+ analytics-purpose gate as first-party tracking. Explicit denial or withdrawal,
109
+ required but unknown consent, and unavailable configured policy stop optional
110
+ collection. Current permission enables it without a reload. A genuinely
111
+ unconfigured site keeps its legacy first-party behavior as unknown policy;
112
+ that doesn't grant advertising consent.
113
+
114
+ Current scoped receipts accompany configured telemetry. Withdrawal fences
115
+ pending callbacks and retries, so a later grant doesn't replay denied events.
116
+ Popup rendering, dismissal, navigation and frequency preferences still work
117
+ when optional measurement is unavailable.
109
118
 
110
119
  ## Drawing one popup yourself
111
120
 
@@ -132,3 +141,6 @@ make them again in Website → Popups & Banners. `@sonordev/site-kit/engage`
132
141
  was removed in site-kit 8: `SiteKitLayout` mounts `SitePopups` and the website
133
142
  chat for you, and `npx sonor-setup codemod --write` moves the names that have
134
143
  a home.
144
+
145
+
146
+ Popup rendering, dismissal and navigation remain functional while optional tracking waits for transport execution. Pending tracking callbacks still need current purpose permission and scope at dispatch; a later grant doesn't replay withdrawn work.
@@ -1,13 +0,0 @@
1
- export { AnalyticsProvider, useAnalytics, useAnalyticsOptional, useTrackEvent } from './chunk-GXWM5KNS.js';
2
- import './chunk-LCDVPAMR.js';
3
- import './chunk-IPQKQEWI.js';
4
- import './chunk-L2V5PUFN.js';
5
- import './chunk-GJWI74ZZ.js';
6
- import './chunk-5TM3WPCI.js';
7
- import './chunk-ZQSCMYZO.js';
8
- import './chunk-64XODP7M.js';
9
- import './chunk-FLOJUMFR.js';
10
- import './chunk-7HW4TZB5.js';
11
- import './chunk-W7OPEMGJ.js';
12
- import './chunk-F6WLHVMQ.js';
13
- import './chunk-PKBMQBKP.js';
@@ -1,20 +0,0 @@
1
- export { ChatWidget, EchoChat, isChatEnabled } from './chunk-TP32MRXV.js';
2
- import './chunk-6T6CQVNL.js';
3
- import './chunk-JE4A5S4F.js';
4
- import './chunk-27FISYK4.js';
5
- import './chunk-IWNJCRXW.js';
6
- import './chunk-Q6E4OPGG.js';
7
- import './chunk-5ROTTMBL.js';
8
- import './chunk-C2FZBUSS.js';
9
- import './chunk-TYSIAWC3.js';
10
- import './chunk-HW7B43E5.js';
11
- import './chunk-NJCTQH2P.js';
12
- import './chunk-S22FSH7C.js';
13
- import './chunk-L2V5PUFN.js';
14
- import './chunk-GJWI74ZZ.js';
15
- import './chunk-5TM3WPCI.js';
16
- import './chunk-FLOJUMFR.js';
17
- import './chunk-7HW4TZB5.js';
18
- import './chunk-W7OPEMGJ.js';
19
- import './chunk-F6WLHVMQ.js';
20
- import './chunk-PKBMQBKP.js';
@@ -1,19 +0,0 @@
1
- export { ManagedForm } from './chunk-G7BRCSV6.js';
2
- import './chunk-GQN4BGK6.js';
3
- import './chunk-IWNJCRXW.js';
4
- import './chunk-Q6E4OPGG.js';
5
- import './chunk-5ROTTMBL.js';
6
- import './chunk-C2FZBUSS.js';
7
- import './chunk-DXO6SBMD.js';
8
- import './chunk-CVADNHJ4.js';
9
- import './chunk-TYSIAWC3.js';
10
- import './chunk-HW7B43E5.js';
11
- import './chunk-NJCTQH2P.js';
12
- import './chunk-L2V5PUFN.js';
13
- import './chunk-GJWI74ZZ.js';
14
- import './chunk-5TM3WPCI.js';
15
- import './chunk-FLOJUMFR.js';
16
- import './chunk-7HW4TZB5.js';
17
- import './chunk-W7OPEMGJ.js';
18
- import './chunk-F6WLHVMQ.js';
19
- import './chunk-PKBMQBKP.js';
@@ -1,13 +0,0 @@
1
- export { SitePopups } from './chunk-YEX5RAEU.js';
2
- import './chunk-27FISYK4.js';
3
- import './chunk-5ROTTMBL.js';
4
- import './chunk-IPQKQEWI.js';
5
- import './chunk-GJWI74ZZ.js';
6
- import './chunk-5TM3WPCI.js';
7
- import './chunk-ZQSCMYZO.js';
8
- import './chunk-64XODP7M.js';
9
- import './chunk-FLOJUMFR.js';
10
- import './chunk-7HW4TZB5.js';
11
- import './chunk-W7OPEMGJ.js';
12
- import './chunk-F6WLHVMQ.js';
13
- import './chunk-PKBMQBKP.js';
@@ -1,9 +0,0 @@
1
- export { SitemapSync } from './chunk-OWZWRP7Y.js';
2
- import './chunk-YVKRYQRG.js';
3
- import './chunk-ZQSCMYZO.js';
4
- import './chunk-64XODP7M.js';
5
- import './chunk-FLOJUMFR.js';
6
- import './chunk-7HW4TZB5.js';
7
- import './chunk-W7OPEMGJ.js';
8
- import './chunk-F6WLHVMQ.js';
9
- import './chunk-PKBMQBKP.js';
@@ -1,19 +0,0 @@
1
- import { memoryIdentity, VISITOR_ID_KEY, SESSION_ID_KEY } from './chunk-5TM3WPCI.js';
2
-
3
- // src/shared/identity-reader.ts
4
- function readKey(kind, key) {
5
- try {
6
- return window[kind].getItem(key) || null;
7
- } catch {
8
- return null;
9
- }
10
- }
11
- function readAnalyticsIdentity() {
12
- if (typeof window === "undefined") return { sessionId: null, visitorId: null };
13
- return {
14
- sessionId: readKey("sessionStorage", SESSION_ID_KEY) || memoryIdentity.sessionId || null,
15
- visitorId: readKey("localStorage", VISITOR_ID_KEY) || memoryIdentity.visitorId || null
16
- };
17
- }
18
-
19
- export { readAnalyticsIdentity };
@@ -1,7 +0,0 @@
1
- // src/shared/identity-storage.ts
2
- var VISITOR_ID_KEY = "_sk_vid";
3
- var SESSION_ID_KEY = "_sk_sid";
4
- var SESSION_TIME_KEY = "_sk_stime";
5
- var memoryIdentity = { visitorId: "", sessionId: "" };
6
-
7
- export { SESSION_ID_KEY, SESSION_TIME_KEY, VISITOR_ID_KEY, memoryIdentity };