@sonordev/site-kit 7.1.1 → 7.2.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 (282) hide show
  1. package/AGENTS.md +3 -3
  2. package/CHANGELOG.md +68 -3426
  3. package/README.md +9 -8
  4. package/agent-manifest.json +12 -4
  5. package/dist/{AnalyticsProvider-3MI5RCTL.js → AnalyticsProvider-SLFFBRPE.js} +4 -4
  6. package/dist/{ArticleViewTracker-CMBSJR3N.js → ArticleViewTracker-TM5AMGN2.js} +3 -3
  7. package/dist/{BlocksPopup-X3OAAK2L.js → BlocksPopup-YJNJIVPO.js} +5 -5
  8. package/dist/ChatWidget-XKOSH66S.js +17 -0
  9. package/dist/{FileField-QRSEGO6D.js → FileField-CI4UL5SH.js} +3 -3
  10. package/dist/{FormSpotlight-XKV7VTN4.js → FormSpotlight-F2AAEGBN.js} +20 -6
  11. package/dist/{FormStage-C3YGYAUZ.js → FormStage-BI5R5CNC.js} +27 -7
  12. package/dist/ManagedForm-G6COGHXL.js +16 -0
  13. package/dist/{ManagedNewsletterForm-LPIKGJF4.js → ManagedNewsletterForm-BO3WCGXX.js} +7 -5
  14. package/dist/{SignalCore-ICXXZBYI.js → SignalCore-ZA6WHKBR.js} +3 -3
  15. package/dist/SiteChat-YJADDTKG.js +5 -0
  16. package/dist/{SiteDesignReporter-A7MS2CIP.js → SiteDesignReporter-5YAW36AQ.js} +5 -5
  17. package/dist/SitePopups-ST5PMKZE.js +10 -0
  18. package/dist/SitemapSync-RJTEBINX.js +8 -0
  19. package/dist/SitemapSync.d.ts +1 -1
  20. package/dist/_client/booking-widget.js +5 -5
  21. package/dist/_client/testimonial-section.d.ts +1 -1
  22. package/dist/affiliates/api.d.ts +1 -1
  23. package/dist/affiliates/index.js +3 -3
  24. package/dist/analytics/AnalyticsProvider.d.ts +1 -1
  25. package/dist/analytics/index.js +4 -4
  26. package/dist/analytics/send-gate.d.ts +13 -26
  27. package/dist/articles/Article.d.ts +1 -1
  28. package/dist/articles/ArticleList.d.ts +1 -1
  29. package/dist/articles/ClusterLandingPage.d.ts +2 -2
  30. package/dist/articles/PublicationLayout.d.ts +1 -1
  31. package/dist/articles/PublicationSidebar.d.ts +1 -1
  32. package/dist/articles/RelatedPosts.d.ts +1 -1
  33. package/dist/articles/author-schema.d.ts +1 -1
  34. package/dist/articles/excerpt.d.ts +3 -4
  35. package/dist/articles/index.d.ts +2 -2
  36. package/dist/articles/index.js +2 -2
  37. package/dist/articles/news-sitemap.d.ts +1 -1
  38. package/dist/articles/processArticleHtml.d.ts +1 -1
  39. package/dist/articles/server-core.d.ts +4 -4
  40. package/dist/articles/server-ui.js +3 -2
  41. package/dist/articles/server.d.ts +4 -4
  42. package/dist/articles/server.js +2 -1
  43. package/dist/articles/types.d.ts +1 -1
  44. package/dist/{engage → chat}/ChatWidget.d.ts +8 -7
  45. package/dist/{engage → chat}/EchoUiActions.d.ts +4 -4
  46. package/dist/chat/SiteChat.d.ts +25 -0
  47. package/dist/{engage → chat}/brand-color.d.ts +2 -2
  48. package/dist/{engage → chat}/chat-messages.d.ts +1 -1
  49. package/dist/{engage → chat}/echo-config.d.ts +1 -1
  50. package/dist/chat/index.d.ts +10 -6
  51. package/dist/chat/index.js +14 -8
  52. package/dist/{engage → chat}/launcher-placement.d.ts +1 -7
  53. package/dist/{engage → chat}/socket-loader.d.ts +2 -2
  54. package/dist/chat/types.d.ts +136 -0
  55. package/dist/chunk-27FISYK4.js +4 -0
  56. package/dist/{chunk-QPEEKFCA.js → chunk-4NTBQNHA.js} +249 -80
  57. package/dist/{chunk-RK7GF7PQ.js → chunk-5V2V5C3Y.js} +2 -4
  58. package/dist/{chunk-ICFRH2ED.js → chunk-5YCEMV2L.js} +1 -1
  59. package/dist/{chunk-V4HUSHZO.js → chunk-64DKGVEI.js} +41 -7
  60. package/dist/{chunk-GLHQ3LRO.js → chunk-6U3VLV2C.js} +1 -1
  61. package/dist/{chunk-ZETJTCMV.js → chunk-BC4Y3S3D.js} +1 -1
  62. package/dist/{chunk-JSZN6LDZ.js → chunk-BF7TZYC3.js} +38 -31
  63. package/dist/{chunk-EFPS56JA.js → chunk-BKY2ZNM7.js} +1 -1
  64. package/dist/{chunk-AQSNPZY4.js → chunk-C2FZBUSS.js} +80 -1
  65. package/dist/{chunk-H42PZKVC.js → chunk-CF5QNFYU.js} +2 -2
  66. package/dist/{chunk-JC7KXNNM.js → chunk-D5DCBD4Y.js} +2 -2
  67. package/dist/{chunk-PXZ7LAOY.js → chunk-D6ZC7XKZ.js} +2 -2
  68. package/dist/chunk-EJVQJCG5.js +370 -0
  69. package/dist/{chunk-6OL23QYD.js → chunk-F24FNCTK.js} +1 -1
  70. package/dist/{chunk-NEKEH4CK.js → chunk-FR6BYFPC.js} +53 -21
  71. package/dist/{chunk-KOPVJQ2P.js → chunk-GEXT7BTE.js} +1 -1
  72. package/dist/{chunk-ZAWANWUS.js → chunk-GGORNBSC.js} +18 -6
  73. package/dist/{chunk-DUQMSNF2.js → chunk-HGFAEDG3.js} +1 -1
  74. package/dist/chunk-HODO5BX5.js +28 -0
  75. package/dist/chunk-HW7B43E5.js +14 -0
  76. package/dist/{chunk-EQBZ24VH.js → chunk-IAM3D3RL.js} +43 -24
  77. package/dist/{chunk-ODADQM6Z.js → chunk-JJ3DELUL.js} +2 -2
  78. package/dist/{chunk-542MIHNP.js → chunk-JMLK6MH7.js} +1 -1
  79. package/dist/{chunk-7FWA3I6A.js → chunk-JWTQS5F5.js} +1 -1
  80. package/dist/{chunk-OUNRFXDC.js → chunk-K4ZHAURD.js} +1 -1
  81. package/dist/chunk-NV72HZ4W.js +45 -0
  82. package/dist/{chunk-4Y5FWDPM.js → chunk-NZ4RXN3G.js} +55 -7
  83. package/dist/chunk-OWZ7ATLZ.js +187 -0
  84. package/dist/{chunk-TXBAOEKG.js → chunk-PKGN32AU.js} +5 -4
  85. package/dist/chunk-Q6E4OPGG.js +40 -0
  86. package/dist/{chunk-J4D6ZXRW.js → chunk-QL6XNPSD.js} +3 -3
  87. package/dist/{chunk-HAG4YIZY.js → chunk-R46IQIGK.js} +6 -6
  88. package/dist/{chunk-R3VKF43H.js → chunk-RPZ7OQGD.js} +1 -1
  89. package/dist/{chunk-Q3S26EQA.js → chunk-S54ECQGY.js} +1 -1
  90. package/dist/{chunk-JIL5VY2R.js → chunk-VHKEF5ZB.js} +1 -1
  91. package/dist/{chunk-ILAW3XKD.js → chunk-VO3JYRT5.js} +43 -29
  92. package/dist/chunk-VWWITFWM.js +300 -0
  93. package/dist/{chunk-OPRBF7VE.js → chunk-ZTLMPUO6.js} +3 -2
  94. package/dist/client/index.js +3 -3
  95. package/dist/cms/CmsPreview.d.ts +2 -2
  96. package/dist/cms/index.d.ts +3 -3
  97. package/dist/cms/server-api.d.ts +1 -1
  98. package/dist/cms/types.d.ts +1 -1
  99. package/dist/commerce/EventCheckout.d.ts +1 -1
  100. package/dist/commerce/EventsAgenda.d.ts +3 -3
  101. package/dist/commerce/api.d.ts +1 -1
  102. package/dist/commerce/index.js +4 -4
  103. package/dist/commerce/server.d.ts +3 -4
  104. package/dist/contracts/color.d.ts +1 -1
  105. package/dist/contracts/entries.d.ts +1 -1
  106. package/dist/contracts/error-page.d.ts +183 -0
  107. package/dist/contracts/fleet.d.ts +9 -9
  108. package/dist/contracts/forms.d.ts +4 -10
  109. package/dist/contracts/llms.d.ts +2 -1
  110. package/dist/contracts/portfolio.d.ts +11 -15
  111. package/dist/contracts/proposal-sitemap.d.ts +130 -0
  112. package/dist/contracts/schema-placeholders.d.ts +87 -0
  113. package/dist/contracts/seo-meta.d.ts +11 -12
  114. package/dist/contracts/seo-pages.d.ts +12 -18
  115. package/dist/contracts/site-cache.d.ts +4 -4
  116. package/dist/contracts/sites-normalize.d.ts +2 -4
  117. package/dist/contracts/sites.d.ts +3 -5
  118. package/dist/contracts/slot-content.d.ts +2 -2
  119. package/dist/contracts/slots.d.ts +6 -6
  120. package/dist/contracts/voice.d.ts +56 -0
  121. package/dist/contracts/website.d.ts +2 -2
  122. package/dist/engage/EngageWidget.d.ts +13 -12
  123. package/dist/engage/index.d.ts +10 -9
  124. package/dist/engage/index.js +31 -35
  125. package/dist/engage/types.d.ts +19 -244
  126. package/dist/fleet/FleetHeartbeat.d.ts +2 -2
  127. package/dist/fleet/index.js +4 -4
  128. package/dist/forms/FormEnhancer.d.ts +25 -12
  129. package/dist/forms/FormSpotlight.d.ts +2 -2
  130. package/dist/forms/ManagedForm.d.ts +1 -1
  131. package/dist/forms/ServerForm.d.ts +11 -10
  132. package/dist/forms/StaticForm.d.ts +4 -2
  133. package/dist/forms/field-autocomplete.d.ts +28 -0
  134. package/dist/forms/field-interactions.d.ts +2 -2
  135. package/dist/forms/form-dom-values.d.ts +42 -0
  136. package/dist/forms/form-loaded-at.d.ts +2 -2
  137. package/dist/forms/formsApi.d.ts +2 -2
  138. package/dist/forms/index.d.ts +1 -1
  139. package/dist/forms/index.js +11 -9
  140. package/dist/forms/server.d.ts +1 -1
  141. package/dist/forms/server.js +6 -4
  142. package/dist/forms/static.js +3 -2
  143. package/dist/forms/submitForm.d.ts +9 -2
  144. package/dist/forms/types.d.ts +44 -5
  145. package/dist/forms/useForm.d.ts +21 -4
  146. package/dist/forms/webmcp.d.ts +38 -0
  147. package/dist/images/ManagedFavicon.d.ts +1 -1
  148. package/dist/images/ManagedImage.d.ts +4 -4
  149. package/dist/images/api.d.ts +1 -1
  150. package/dist/images/index.d.ts +2 -2
  151. package/dist/images/index.js +4 -4
  152. package/dist/index.d.ts +4 -1
  153. package/dist/index.js +1 -1
  154. package/dist/landing/contract.d.ts +3 -4
  155. package/dist/layout/SiteKitClientProviders.d.ts +4 -4
  156. package/dist/layout/SiteKitLayout.d.ts +11 -11
  157. package/dist/layout/client.d.ts +4 -4
  158. package/dist/layout/client.js +7 -7
  159. package/dist/layout/index.js +8 -8
  160. package/dist/layout/types.d.ts +7 -6
  161. package/dist/llms/SpeakableSchema.d.ts +2 -2
  162. package/dist/llms/agent-access.d.ts +2 -2
  163. package/dist/llms/aiRobots.d.ts +4 -4
  164. package/dist/llms/api.d.ts +2 -2
  165. package/dist/llms/contract.js +1 -1
  166. package/dist/llms/generateLLMsTxt.d.ts +1 -1
  167. package/dist/llms/index.js +6 -6
  168. package/dist/llms/links.d.ts +1 -1
  169. package/dist/llms/revalidate.d.ts +1 -1
  170. package/dist/llms/seo-revalidate.d.ts +2 -3
  171. package/dist/llms/types.d.ts +6 -6
  172. package/dist/llms/writeLLMsTxt.d.ts +10 -10
  173. package/dist/manifest/index.d.ts +8 -8
  174. package/dist/maps/index.js +3 -3
  175. package/dist/mcp/WebMcpTools.d.ts +1 -1
  176. package/dist/mcp/index.js +2 -14
  177. package/dist/mcp/report.d.ts +2 -2
  178. package/dist/mcp/serverCard.d.ts +1 -1
  179. package/dist/mcp/sonor.d.ts +5 -6
  180. package/dist/mcp/sonor.js +14 -11
  181. package/dist/mcp/transport.d.ts +1 -2
  182. package/dist/mcp/types.d.ts +4 -5
  183. package/dist/motion/engine.d.ts +2 -3
  184. package/dist/motion/failsafe.d.ts +1 -2
  185. package/dist/motion/gsap.d.ts +2 -2
  186. package/dist/motion/three.d.ts +1 -1
  187. package/dist/og/config.d.ts +4 -4
  188. package/dist/og/contrast.d.ts +2 -2
  189. package/dist/og/pages.d.ts +5 -5
  190. package/dist/og/route-fit.d.ts +2 -2
  191. package/dist/og/route.d.ts +1 -2
  192. package/dist/og/template.d.ts +1 -1
  193. package/dist/proxy/index.d.ts +2 -2
  194. package/dist/proxy/securityHeaders.d.ts +10 -12
  195. package/dist/redirects/index.d.ts +7 -7
  196. package/dist/reputation/TestimonialSection.d.ts +1 -1
  197. package/dist/reputation/api.d.ts +1 -1
  198. package/dist/revalidate/index.js +2 -2
  199. package/dist/robots/index.d.ts +5 -5
  200. package/dist/robots/indexnow.d.ts +2 -3
  201. package/dist/seo/ManagedScripts.d.ts +2 -2
  202. package/dist/seo/client.js +4 -4
  203. package/dist/seo/getManagedMetadata.d.ts +1 -1
  204. package/dist/seo/groundingSchema.d.ts +2 -2
  205. package/dist/seo/index.js +15 -8
  206. package/dist/seo/llms/contract.js +1 -1
  207. package/dist/seo/llms.js +6 -6
  208. package/dist/seo/register-sitemap-cli-impl.d.ts +1 -1
  209. package/dist/seo/register-sitemap-cli.d.ts +1 -1
  210. package/dist/seo/register-sitemap-cli.js +2 -2
  211. package/dist/seo/schema-filter.d.ts +5 -6
  212. package/dist/seo/server-api.d.ts +1 -1
  213. package/dist/seo/sitemap.js +4 -4
  214. package/dist/seo/types.d.ts +4 -4
  215. package/dist/seo/withManagedMetadata.d.ts +4 -4
  216. package/dist/server/index.js +2 -2
  217. package/dist/server/mint-site-token.d.ts +1 -2
  218. package/dist/server/server-fetch.d.ts +5 -5
  219. package/dist/shared/build-entries.d.ts +4 -4
  220. package/dist/shared/dialog.d.ts +27 -0
  221. package/dist/shared/frame.d.ts +8 -9
  222. package/dist/shared/fresh-fetch.d.ts +1 -2
  223. package/dist/shared/identity.d.ts +1 -1
  224. package/dist/shared/layers.d.ts +7 -0
  225. package/dist/shared/mid-form.d.ts +53 -0
  226. package/dist/shared/next-files.d.ts +1 -1
  227. package/dist/shared/publishCredential.d.ts +1 -1
  228. package/dist/shared/reporting-gate.d.ts +1 -1
  229. package/dist/shared/uuid.d.ts +1 -2
  230. package/dist/shared/version.d.ts +1 -1
  231. package/dist/shared/visual-viewport-gap.d.ts +3 -3
  232. package/dist/signal/index.js +2 -2
  233. package/dist/signal/types.d.ts +1 -1
  234. package/dist/site-config/index.d.ts +2 -2
  235. package/dist/sitemap/index.d.ts +13 -13
  236. package/dist/sitemap/index.js +4 -4
  237. package/dist/sitemap/shared.d.ts +3 -3
  238. package/dist/sites/site-param.d.ts +2 -2
  239. package/dist/slots/ManagedRichText.d.ts +1 -1
  240. package/dist/slots/ManagedSlot.d.ts +1 -1
  241. package/dist/slots/index.d.ts +1 -3
  242. package/dist/{socket-loader-R24ZSRSQ.js → socket-loader-CGIPEG74.js} +1 -1
  243. package/dist/sync/index.js +5 -5
  244. package/dist/types.d.ts +4 -2
  245. package/dist/website/BlocksPopup.d.ts +1 -1
  246. package/dist/website/PopupBlocks.d.ts +8 -6
  247. package/dist/website/SitePopups.d.ts +25 -0
  248. package/dist/website/images.js +4 -4
  249. package/dist/website/index.js +6 -6
  250. package/dist/website/popup-rules.d.ts +46 -0
  251. package/dist/website/popup-types.d.ts +113 -0
  252. package/dist/website/popups.d.ts +2 -6
  253. package/dist/website/popups.js +6 -14
  254. package/dist/{writeLLMsTxt-QR23OQUE.js → writeLLMsTxt-OV24LQVL.js} +3 -3
  255. package/docs/MIGRATING-TO-7.md +50 -22
  256. package/docs.json +2 -1
  257. package/package.json +2 -2
  258. package/src/admin-auth/README.md +3 -3
  259. package/src/analytics/README.md +9 -11
  260. package/src/articles/README.md +10 -7
  261. package/src/{engage → chat}/README.md +63 -62
  262. package/src/cta-bar/README.md +11 -11
  263. package/src/forms/README.md +60 -12
  264. package/src/layout/README.md +8 -5
  265. package/src/llms/README.md +3 -3
  266. package/src/mcp/README.md +7 -7
  267. package/src/motion/README.md +1 -1
  268. package/src/og/README.md +26 -27
  269. package/src/proxy/README.md +14 -14
  270. package/src/seo/README.md +4 -2
  271. package/src/slots/README.md +1 -1
  272. package/src/sync/README.md +10 -0
  273. package/src/website/README.md +133 -0
  274. package/dist/ChatWidget-JMFBXJ75.js +0 -15
  275. package/dist/EngageWidget-A3QKZ3SU.js +0 -11
  276. package/dist/ManagedForm-2GSSDJPP.js +0 -14
  277. package/dist/SitemapSync-4U654SEA.js +0 -8
  278. package/dist/chunk-B73QPZPH.js +0 -837
  279. package/dist/chunk-NDF4A5JM.js +0 -37
  280. package/dist/chunk-RTMMHTEQ.js +0 -100
  281. package/dist/engage/DesignRenderer.d.ts +0 -57
  282. package/dist/engage/element-rules.d.ts +0 -38
package/README.md CHANGED
@@ -1,6 +1,6 @@
1
1
  # @sonordev/site-kit
2
2
 
3
- All-in-one integration kit for [Sonor](https://sonor.io)-powered Next.js sites. One package, one env var, every module: SEO, Analytics, Forms, Articles, Commerce, Engage, GEO/AEO, Booking, Reputation, A/B Testing, and more — all managed from the Sonor dashboard at [app.sonor.io](https://app.sonor.io).
3
+ All-in-one integration kit for [Sonor](https://sonor.io)-powered Next.js sites. One package, one env var, every module: SEO, Analytics, Forms, Articles, Commerce, Website chat, Popups, GEO/AEO, Booking, Reputation, A/B Testing, and more — all managed from the Sonor dashboard at [app.sonor.io](https://app.sonor.io).
4
4
 
5
5
  ## Install
6
6
 
@@ -53,7 +53,7 @@ export default function RootLayout({ children }: { children: React.ReactNode })
53
53
  }
54
54
  ```
55
55
 
56
- `SiteKitLayout` is an RSC-compatible async Server Component that auto-composes: analytics tracking, Engage widgets, favicons, and managed scripts. No client-side provider wrapping needed: client modules mount as deferred siblings after `{children}`, so the page stays server-rendered. Props and module options: [src/layout/README.md](src/layout/README.md).
56
+ `SiteKitLayout` is an RSC-compatible async Server Component that auto-composes: analytics tracking, website chat, popups, favicons, and managed scripts. No client-side provider wrapping needed: client modules mount as deferred siblings after `{children}`, so the page stays server-rendered. Props and module options: [src/layout/README.md](src/layout/README.md).
57
57
 
58
58
  **Proxy (optional but recommended):**
59
59
 
@@ -112,8 +112,8 @@ Every module has its own README in `src/<module>/README.md` with full API docs,
112
112
 
113
113
  | Module | Import | Purpose | Docs |
114
114
  |--------|--------|---------|------|
115
- | **Website chat** | `@sonordev/site-kit/chat` | The chat launcher and Echo (Sonor → Messages) | [README](src/engage/README.md) |
116
- | **Popups & Banners** | `@sonordev/site-kit/website/popups` | Popups, banners and toasts from Sonor → Website, drawn in the site's own design | [contract](src/website/contract.ts) |
115
+ | **Website chat** | `@sonordev/site-kit/chat` | The chat launcher and Echo (Sonor → Messages) | [README](src/chat/README.md) |
116
+ | **Popups & Banners** | `@sonordev/site-kit/website/popups` | Popups, banners and toasts from Sonor → Website, drawn in the site's own design | [README](src/website/README.md) |
117
117
  | **Forms** | `@sonordev/site-kit/forms` | Managed forms with CRM routing, multi-step, validation | [README](src/forms/README.md) |
118
118
  | **Signal** | `@sonordev/site-kit/signal` | A/B experiments, behavior tracking, real-time config | [README](src/signal/README.md) |
119
119
 
@@ -149,7 +149,7 @@ Three tiers as three subpaths — a site only installs and ships what it imports
149
149
  |--------|--------|---------|------|
150
150
  | **CTA bar** | `@sonordev/site-kit/website/cta-bar` | `<CtaBar>` + `<CtaBarAction>`: the floating glass mobile CTA bar. Hides over its form and while typing, compacts on scroll, lifts the Echo launcher, emits `cta_click`. Server component. | [README](src/cta-bar/README.md) |
151
151
 
152
- Echo's launcher and chat window use the same glass recipe; see [Engage](src/engage/README.md#liquid-glass-610).
152
+ Echo's launcher and chat window use the same glass recipe; see [Website chat](src/chat/README.md#liquid-glass-610).
153
153
 
154
154
  ---
155
155
 
@@ -167,7 +167,8 @@ SiteKitLayout (RSC server component)
167
167
  │
168
168
  ├── Client-side (childless siblings after {children}, deferred to idle):
169
169
  │ ├── AnalyticsProvider (page views, scroll depth, Web Vitals)
170
- │ ├── EngageWidget (popups, nudges, chat)
170
+ │ ├── SitePopups (popups, banners, toasts)
171
+ │ ├── SiteChat (website chat: Echo)
171
172
  │ ├── SignalBridge (A/B experiments, opt-in, not deferred)
172
173
  │ ├── SitemapSync (browser sitemap fallback, opt-in)
173
174
  │ └── FleetHeartbeat (kit version + modules, once per session)
@@ -209,7 +210,7 @@ import { OfferingCard, ProductPage, EventCalendar } from '@sonordev/site-kit/com
209
210
  import { BookingWidget } from '@sonordev/site-kit/sync'
210
211
 
211
212
  // Website chat, and popups (SiteKitLayout mounts both; its `chat` and `popups` props turn them off)
212
- import { ChatWidget } from '@sonordev/site-kit/chat'
213
+ import { SiteChat, ChatWidget } from '@sonordev/site-kit/chat'
213
214
  import { SitePopups, PopupBlocks } from '@sonordev/site-kit/website/popups'
214
215
 
215
216
  // Signal (A/B)
@@ -322,7 +323,7 @@ import type { SiteKitLayoutProps } from '@sonordev/site-kit/layout'
322
323
  `@sonordev/site-kit` is the client bridge between Next.js marketing sites and the Sonor platform. All persistent data (forms, articles, SEO config, analytics) lives in Sonor — site-kit fetches, renders, and tracks.
323
324
 
324
325
  - **Server components** (SEO, Articles, Images): Import directly, RSC-compatible, no provider needed
325
- - **Client modules** (Analytics, Engage, Signal): Lazy-loaded via `SiteKitLayout`, tree-shaken
326
+ - **Client modules** (Analytics, chat, popups, Signal): Lazy-loaded via `SiteKitLayout`, tree-shaken
326
327
  - **Build-time** (Sitemap, llms.txt): Run during `next build`, sync to Sonor
327
328
  - **Middleware** (Redirects, Security, AI Discovery): Runs on every request edge
328
329
 
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "schemaVersion": 1,
3
3
  "package": "@sonordev/site-kit",
4
- "version": "7.1.1",
4
+ "version": "7.2.0",
5
5
  "description": "Machine-readable manifest for coding agents integrating a site with Sonor. See AGENTS.md (shipped) and docs/SITE-KIT-AGENT-NATIVE.md.",
6
6
  "env": {
7
7
  "required": [
@@ -139,7 +139,8 @@
139
139
  "name": "engage",
140
140
  "import": "@sonordev/site-kit/engage",
141
141
  "side": "client",
142
- "purpose": "Popups, nudges, banners, chat widget configured in Sonor.",
142
+ "purpose": "Deprecated alias, kept through 7.x: Engage was retired in Sonor. Re-exports ./chat (ChatWidget, chat types) and ./website/popups under the old names; EngageWidget draws SiteChat and SitePopups.",
143
+ "caution": "Import ./chat or ./website/popups instead, or let SiteKitLayout mount both (its chat and popups props). DesignRenderer (Engage Studio) is gone; popups render from blocks.",
143
144
  "stability": "deprecated",
144
145
  "movedTo": [
145
146
  "@sonordev/site-kit/chat",
@@ -387,13 +388,13 @@
387
388
  "name": "chat",
388
389
  "import": "@sonordev/site-kit/chat",
389
390
  "side": "client",
390
- "purpose": "Website chat (Sonor → Messages): ChatWidget, the launcher and Echo. SiteKitLayout mounts it (its `chat` prop); import it to place it yourself."
391
+ "purpose": "Website chat (Sonor → Messages): SiteChat (idle-deferred launcher, gated like analytics), ChatWidget and Echo. SiteKitLayout mounts it (its `chat` prop); import it to place it yourself."
391
392
  },
392
393
  {
393
394
  "name": "website/popups",
394
395
  "import": "@sonordev/site-kit/website/popups",
395
396
  "side": "client",
396
- "purpose": "Website → Popups & Banners: SitePopups shows the popups published for this site, drawn in its own design; PopupBlocks renders one from its blocks. SiteKitLayout mounts it (its `popups` prop)."
397
+ "purpose": "Website → Popups & Banners: SitePopups shows the popups, banners and toasts published for the site (only those with blocks), waiting while a visitor is mid-form; PopupBlocks draws one. SiteKitLayout mounts it (its `popups` prop)."
397
398
  },
398
399
  {
399
400
  "name": "website/images",
@@ -732,6 +733,13 @@
732
733
  "fix": "Remove the runtime export, then `npx sonor-setup codemod --write` moves the file to proxy.ts.",
733
734
  "check": "middleware.netlify"
734
735
  },
736
+ {
737
+ "id": "proxy.misplaced",
738
+ "symptom": "The build passes, but the site sends no security headers and runs no Sonor-managed redirects.",
739
+ "cause": "The proxy file sits where Next never reads it. Next reads proxy.ts (and the deprecated middleware.ts) only from the directory that holds the app: the project root, or src/ when the app is src/app. A proxy.ts at the root of a src/app site is ignored without a warning. sonor-setup 7.1.1's codemod renamed middleware.ts in place, which left it at the root on src/app sites.",
740
+ "fix": "Run `npx sonor-setup codemod --write` (7.1.2 or later): it moves the proxy beside the app and fixes its relative imports. It never overwrites, so when a proxy exists in both places it reports both and you keep the right one by hand. Rebuild and re-run doctor.",
741
+ "check": "middleware.netlify"
742
+ },
735
743
  {
736
744
  "id": "sitemap.trailing-slash",
737
745
  "symptom": "Every sitemap URL except / 308-redirects to the same path with a trailing slash; the sitemap disagrees with the canonicals.",
@@ -1,11 +1,11 @@
1
- export { AnalyticsProvider, useAnalytics, useAnalyticsOptional, useTrackEvent } from './chunk-7FWA3I6A.js';
1
+ export { AnalyticsProvider, useAnalytics, useAnalyticsOptional, useTrackEvent } from './chunk-JWTQS5F5.js';
2
2
  import './chunk-LCDVPAMR.js';
3
3
  import './chunk-24QZEO3Q.js';
4
4
  import './chunk-L2V5PUFN.js';
5
5
  import './chunk-GJWI74ZZ.js';
6
6
  import './chunk-43OCZ3JA.js';
7
7
  import './chunk-EKBEOXTH.js';
8
- import './chunk-PXZ7LAOY.js';
9
- import './chunk-OUNRFXDC.js';
10
- import './chunk-6OL23QYD.js';
8
+ import './chunk-D6ZC7XKZ.js';
9
+ import './chunk-K4ZHAURD.js';
10
+ import './chunk-F24FNCTK.js';
11
11
  import './chunk-PKBMQBKP.js';
@@ -3,9 +3,9 @@ import { useDeferredActivation } from './chunk-YC7ELZS3.js';
3
3
  import { withSiteBody } from './chunk-MJP63SSS.js';
4
4
  import './chunk-FESKKJAS.js';
5
5
  import './chunk-A4CC4ZG3.js';
6
- import { sonorFetch } from './chunk-PXZ7LAOY.js';
7
- import './chunk-OUNRFXDC.js';
8
- import './chunk-6OL23QYD.js';
6
+ import { sonorFetch } from './chunk-D6ZC7XKZ.js';
7
+ import './chunk-K4ZHAURD.js';
8
+ import './chunk-F24FNCTK.js';
9
9
  import './chunk-PKBMQBKP.js';
10
10
  import { useEffect } from 'react';
11
11
 
@@ -1,13 +1,13 @@
1
1
  'use client';
2
- import { getSiteDesignTokens } from './chunk-ODADQM6Z.js';
3
- import { DEFAULT_POPUP_TOKENS, PopupBlocks } from './chunk-JSZN6LDZ.js';
2
+ import { getSiteDesignTokens } from './chunk-JJ3DELUL.js';
3
+ import { DEFAULT_POPUP_TOKENS, PopupBlocks } from './chunk-BF7TZYC3.js';
4
4
  import { normalizePopupBlocks, toHexColor, readableOn } from './chunk-IHG36STL.js';
5
5
  import './chunk-S22FSH7C.js';
6
6
  import './chunk-43OCZ3JA.js';
7
7
  import './chunk-EKBEOXTH.js';
8
- import './chunk-PXZ7LAOY.js';
9
- import './chunk-OUNRFXDC.js';
10
- import './chunk-6OL23QYD.js';
8
+ import './chunk-D6ZC7XKZ.js';
9
+ import './chunk-K4ZHAURD.js';
10
+ import './chunk-F24FNCTK.js';
11
11
  import './chunk-PKBMQBKP.js';
12
12
  import { useState } from 'react';
13
13
  import { jsx } from 'react/jsx-runtime';
@@ -0,0 +1,17 @@
1
+ export { ChatWidget, EchoChat, isChatEnabled } from './chunk-64DKGVEI.js';
2
+ import './chunk-6T6CQVNL.js';
3
+ import './chunk-JE4A5S4F.js';
4
+ import './chunk-27FISYK4.js';
5
+ import './chunk-FR6BYFPC.js';
6
+ import './chunk-Q6E4OPGG.js';
7
+ import './chunk-C2FZBUSS.js';
8
+ import './chunk-5SQK3D53.js';
9
+ import './chunk-HW7B43E5.js';
10
+ import './chunk-NJCTQH2P.js';
11
+ import './chunk-S22FSH7C.js';
12
+ import './chunk-L2V5PUFN.js';
13
+ import './chunk-GJWI74ZZ.js';
14
+ import './chunk-D6ZC7XKZ.js';
15
+ import './chunk-K4ZHAURD.js';
16
+ import './chunk-F24FNCTK.js';
17
+ import './chunk-PKBMQBKP.js';
@@ -1,7 +1,7 @@
1
1
  'use client';
2
- import { sonorFetch } from './chunk-PXZ7LAOY.js';
3
- import './chunk-OUNRFXDC.js';
4
- import './chunk-6OL23QYD.js';
2
+ import { sonorFetch } from './chunk-D6ZC7XKZ.js';
3
+ import './chunk-K4ZHAURD.js';
4
+ import './chunk-F24FNCTK.js';
5
5
  import './chunk-PKBMQBKP.js';
6
6
  import React from 'react';
7
7
  import { jsxs, Fragment, jsx } from 'react/jsx-runtime';
@@ -1,8 +1,11 @@
1
1
  'use client';
2
2
  import { StageStyles, SummaryTick } from './chunk-J4FSB4OG.js';
3
- import { stageFirstName, useFieldControls, stageViews, stageEstimate, AUTO_ADVANCE_TYPES } from './chunk-JC7KXNNM.js';
4
- import { FormField } from './chunk-QPEEKFCA.js';
5
- import { isEmptyValue, isDisplayOnly } from './chunk-AQSNPZY4.js';
3
+ import { stageFirstName, useFieldControls, stageViews, stageEstimate, AUTO_ADVANCE_TYPES } from './chunk-D5DCBD4Y.js';
4
+ import { FormField } from './chunk-4NTBQNHA.js';
5
+ import { readAgentSubmit, formToolAttributes } from './chunk-Q6E4OPGG.js';
6
+ import { isEmptyValue, unseenControlValues, isDisplayOnly } from './chunk-C2FZBUSS.js';
7
+ import './chunk-HW7B43E5.js';
8
+ import { DEFAULT_HONEYPOT_FIELD } from './chunk-NJCTQH2P.js';
6
9
  import './chunk-PKBMQBKP.js';
7
10
  import { useMemo, useCallback, useState, useRef, useEffect } from 'react';
8
11
  import { jsx, jsxs } from 'react/jsx-runtime';
@@ -527,11 +530,21 @@ function FormSpotlight({
527
530
  const handleSubmit = useCallback(
528
531
  (e) => {
529
532
  e.preventDefault();
530
- if (isSubmitting) return;
533
+ const agent = readAgentSubmit(e.nativeEvent);
534
+ if (isSubmitting) {
535
+ agent.respond(Promise.resolve({ status: "busy" }));
536
+ return;
537
+ }
531
538
  clearAutoTimer();
532
- void submit();
539
+ const domFills = unseenControlValues(
540
+ e.currentTarget,
541
+ config.fields,
542
+ config.honeypot_field || DEFAULT_HONEYPOT_FIELD,
543
+ values
544
+ );
545
+ agent.respond(submit({ agentInvoked: agent.invoked, domFills }));
533
546
  },
534
- [isSubmitting, submit, clearAutoTimer]
547
+ [isSubmitting, submit, clearAutoTimer, config, values]
535
548
  );
536
549
  useEffect(() => {
537
550
  const offender = questions.find((q) => errors[q.slug]);
@@ -560,6 +573,7 @@ function FormSpotlight({
560
573
  ref: formRef,
561
574
  className: `sk-form sk-spot ${live ? "sk-spot--live " : ""}${className || ""}`,
562
575
  "data-sk-part": "spotlight",
576
+ ...formToolAttributes(config),
563
577
  "data-sk-state": isSubmitting ? "submitting" : "idle",
564
578
  "data-sk-ready": ready && momentum.total > 0 ? "true" : void 0,
565
579
  onSubmit: handleSubmit,
@@ -1,8 +1,11 @@
1
1
  'use client';
2
2
  import { StageStyles, SummaryTick } from './chunk-J4FSB4OG.js';
3
- import { useFieldControls, stageViews, stageFirstName, stageEstimate, formatAnswer, AUTO_ADVANCE_TYPES } from './chunk-JC7KXNNM.js';
4
- import { FormField } from './chunk-QPEEKFCA.js';
5
- import { isEmptyValue } from './chunk-AQSNPZY4.js';
3
+ import { useFieldControls, stageViews, stageFirstName, stageEstimate, formatAnswer, AUTO_ADVANCE_TYPES } from './chunk-D5DCBD4Y.js';
4
+ import { FormField } from './chunk-4NTBQNHA.js';
5
+ import { readAgentSubmit, formToolAttributes } from './chunk-Q6E4OPGG.js';
6
+ import { isEmptyValue, unseenControlValues } from './chunk-C2FZBUSS.js';
7
+ import './chunk-HW7B43E5.js';
8
+ import { DEFAULT_HONEYPOT_FIELD } from './chunk-NJCTQH2P.js';
6
9
  import './chunk-PKBMQBKP.js';
7
10
  import { useState, useRef, useMemo, useEffect, useCallback } from 'react';
8
11
  import { jsxs, jsx, Fragment } from 'react/jsx-runtime';
@@ -205,11 +208,27 @@ function FormStage({
205
208
  const handleSubmit = useCallback(
206
209
  (e) => {
207
210
  e.preventDefault();
208
- if (isSubmitting) return;
209
- if (activeIndex !== REST) advance();
210
- else void submit();
211
+ const agent = readAgentSubmit(e.nativeEvent);
212
+ if (isSubmitting) {
213
+ agent.respond(Promise.resolve({ status: "busy" }));
214
+ return;
215
+ }
216
+ if (activeIndex !== REST) {
217
+ advance();
218
+ agent.respond(
219
+ Promise.resolve({ status: "next_step", step: activeIndex + 2, totalSteps: views.length })
220
+ );
221
+ return;
222
+ }
223
+ const domFills = unseenControlValues(
224
+ e.currentTarget,
225
+ config.fields,
226
+ config.honeypot_field || DEFAULT_HONEYPOT_FIELD,
227
+ values
228
+ );
229
+ agent.respond(submit({ agentInvoked: agent.invoked, domFills }));
211
230
  },
212
- [activeIndex, isSubmitting, advance, submit]
231
+ [activeIndex, isSubmitting, advance, submit, config, values, views.length]
213
232
  );
214
233
  const handleFinaleSubmit = useCallback(() => {
215
234
  hasInteractedRef.current = true;
@@ -230,6 +249,7 @@ function FormStage({
230
249
  ref: formRef,
231
250
  className: `sk-form sk-stage ${className || ""}`,
232
251
  "data-sk-part": "stage",
252
+ ...formToolAttributes(config),
233
253
  "data-sk-state": isSubmitting ? "submitting" : "idle",
234
254
  "data-sk-ready": activeIndex === REST && ready && total > 0 ? "true" : void 0,
235
255
  onSubmit: handleSubmit,
@@ -0,0 +1,16 @@
1
+ export { ManagedForm } from './chunk-IAM3D3RL.js';
2
+ import './chunk-D5DCBD4Y.js';
3
+ import './chunk-DXO6SBMD.js';
4
+ import './chunk-4NTBQNHA.js';
5
+ import './chunk-FR6BYFPC.js';
6
+ import './chunk-Q6E4OPGG.js';
7
+ import './chunk-C2FZBUSS.js';
8
+ import './chunk-5SQK3D53.js';
9
+ import './chunk-HW7B43E5.js';
10
+ import './chunk-NJCTQH2P.js';
11
+ import './chunk-L2V5PUFN.js';
12
+ import './chunk-GJWI74ZZ.js';
13
+ import './chunk-D6ZC7XKZ.js';
14
+ import './chunk-K4ZHAURD.js';
15
+ import './chunk-F24FNCTK.js';
16
+ import './chunk-PKBMQBKP.js';
@@ -1,14 +1,16 @@
1
1
  import { NewsletterShell } from './chunk-SC4MZGWZ.js';
2
2
  import './chunk-GYF2ULVO.js';
3
- import { useForm } from './chunk-NEKEH4CK.js';
4
- import './chunk-AQSNPZY4.js';
3
+ import { useForm } from './chunk-FR6BYFPC.js';
4
+ import './chunk-Q6E4OPGG.js';
5
+ import './chunk-C2FZBUSS.js';
5
6
  import './chunk-5SQK3D53.js';
7
+ import './chunk-HW7B43E5.js';
6
8
  import './chunk-NJCTQH2P.js';
7
9
  import './chunk-L2V5PUFN.js';
8
10
  import './chunk-GJWI74ZZ.js';
9
- import './chunk-PXZ7LAOY.js';
10
- import './chunk-OUNRFXDC.js';
11
- import './chunk-6OL23QYD.js';
11
+ import './chunk-D6ZC7XKZ.js';
12
+ import './chunk-K4ZHAURD.js';
13
+ import './chunk-F24FNCTK.js';
12
14
  import './chunk-PKBMQBKP.js';
13
15
  import { jsx } from 'react/jsx-runtime';
14
16
 
@@ -2,9 +2,9 @@
2
2
  import { getOrCreateVisitorId, getOrCreateSessionId } from './chunk-24QZEO3Q.js';
3
3
  import { onPageLeave } from './chunk-L2V5PUFN.js';
4
4
  import './chunk-GJWI74ZZ.js';
5
- import { sonorFetch } from './chunk-PXZ7LAOY.js';
6
- import { getFreshCredential, isSiteToken } from './chunk-OUNRFXDC.js';
7
- import './chunk-6OL23QYD.js';
5
+ import { sonorFetch } from './chunk-D6ZC7XKZ.js';
6
+ import { getFreshCredential, isSiteToken } from './chunk-K4ZHAURD.js';
7
+ import './chunk-F24FNCTK.js';
8
8
  import './chunk-PKBMQBKP.js';
9
9
  import { useState, useRef, useEffect, useCallback } from 'react';
10
10
 
@@ -0,0 +1,5 @@
1
+ export { SiteChat } from './chunk-NV72HZ4W.js';
2
+ import './chunk-27FISYK4.js';
3
+ import './chunk-43OCZ3JA.js';
4
+ import './chunk-EKBEOXTH.js';
5
+ import './chunk-PKBMQBKP.js';
@@ -1,11 +1,11 @@
1
- export { SiteDesignReporter } from './chunk-ICFRH2ED.js';
2
- import './chunk-ODADQM6Z.js';
1
+ export { SiteDesignReporter } from './chunk-5YCEMV2L.js';
2
+ import './chunk-JJ3DELUL.js';
3
3
  import './chunk-IHG36STL.js';
4
4
  import './chunk-YC7ELZS3.js';
5
5
  import './chunk-S22FSH7C.js';
6
6
  import './chunk-43OCZ3JA.js';
7
7
  import './chunk-EKBEOXTH.js';
8
- import './chunk-PXZ7LAOY.js';
9
- import './chunk-OUNRFXDC.js';
10
- import './chunk-6OL23QYD.js';
8
+ import './chunk-D6ZC7XKZ.js';
9
+ import './chunk-K4ZHAURD.js';
10
+ import './chunk-F24FNCTK.js';
11
11
  import './chunk-PKBMQBKP.js';
@@ -0,0 +1,10 @@
1
+ export { SitePopups } from './chunk-EJVQJCG5.js';
2
+ import './chunk-27FISYK4.js';
3
+ import './chunk-24QZEO3Q.js';
4
+ import './chunk-GJWI74ZZ.js';
5
+ import './chunk-43OCZ3JA.js';
6
+ import './chunk-EKBEOXTH.js';
7
+ import './chunk-D6ZC7XKZ.js';
8
+ import './chunk-K4ZHAURD.js';
9
+ import './chunk-F24FNCTK.js';
10
+ import './chunk-PKBMQBKP.js';
@@ -0,0 +1,8 @@
1
+ export { SitemapSync } from './chunk-GEXT7BTE.js';
2
+ import './chunk-YVKRYQRG.js';
3
+ import './chunk-43OCZ3JA.js';
4
+ import './chunk-EKBEOXTH.js';
5
+ import './chunk-D6ZC7XKZ.js';
6
+ import './chunk-K4ZHAURD.js';
7
+ import './chunk-F24FNCTK.js';
8
+ import './chunk-PKBMQBKP.js';
@@ -1,5 +1,5 @@
1
1
  /**
2
- * SitemapSync - Automatically sync sitemap.xml to Portal API
2
+ * SitemapSync - Automatically sync sitemap.xml to Sonor API
3
3
  *
4
4
  * Client-only component. Lives at package root so the main entry does not
5
5
  * pull in seo/ (and server-only code). For use in SiteKitLayout and
@@ -1,7 +1,7 @@
1
1
  'use client';
2
- export { BookingWidget, BookingWidget_default as default } from '../chunk-ZAWANWUS.js';
3
- import '../chunk-EFPS56JA.js';
4
- import '../chunk-PXZ7LAOY.js';
5
- import '../chunk-OUNRFXDC.js';
6
- import '../chunk-6OL23QYD.js';
2
+ export { BookingWidget, BookingWidget_default as default } from '../chunk-GGORNBSC.js';
3
+ import '../chunk-BKY2ZNM7.js';
4
+ import '../chunk-D6ZC7XKZ.js';
5
+ import '../chunk-K4ZHAURD.js';
6
+ import '../chunk-F24FNCTK.js';
7
7
  import '../chunk-PKBMQBKP.js';
@@ -2,7 +2,7 @@
2
2
  * @sonordev/site-kit/reputation - Testimonial Section
3
3
  *
4
4
  * Displays client reviews in a rotating carousel
5
- * Fetches published reviews from Portal API public endpoint
5
+ * Fetches published reviews from Sonor API public endpoint
6
6
  *
7
7
  * Minimal styling - let site CSS control appearance
8
8
  */
@@ -2,7 +2,7 @@
2
2
  * @sonordev/site-kit/affiliates - Affiliates API
3
3
  *
4
4
  * API functions for fetching affiliate data for client sites.
5
- * All data goes through Portal API with API key auth - never Supabase directly.
5
+ * All data goes through Sonor API with API key auth - never Supabase directly.
6
6
  */
7
7
  import type { AffiliateWithOffers, FetchAffiliatesOptions } from './types';
8
8
  /**
@@ -1,7 +1,7 @@
1
1
  'use client';
2
- import { sonorFetch } from '../chunk-PXZ7LAOY.js';
3
- import '../chunk-OUNRFXDC.js';
4
- import '../chunk-6OL23QYD.js';
2
+ import { sonorFetch } from '../chunk-D6ZC7XKZ.js';
3
+ import '../chunk-K4ZHAURD.js';
4
+ import '../chunk-F24FNCTK.js';
5
5
  import '../chunk-PKBMQBKP.js';
6
6
  import { useState, useEffect } from 'react';
7
7
  import { jsx, jsxs } from 'react/jsx-runtime';
@@ -27,7 +27,7 @@ interface AnalyticsProviderProps {
27
27
  /** Callback invoked with page metadata after each page view (used by Signal bridge) */
28
28
  onPageMetadata?: (metadata: Record<string, unknown>) => void;
29
29
  /**
30
- * Sub-site identifier (e.g. `ohiopowerstudies.com`). Every event tagged with
30
+ * Sub-site identifier (e.g. `ohio.example.com`). Every event tagged with
31
31
  * this string so a single Sonor project can host many sites and the
32
32
  * dashboard can filter / roll up per site. Normally passed in by
33
33
  * SiteKitClientProviders; if omitted, falls back to
@@ -1,13 +1,13 @@
1
1
  'use client';
2
2
  export { ContactTracking, useContactTracking } from '../chunk-P5GB6NEO.js';
3
- export { AnalyticsProvider, WebVitals, useAnalytics, useAnalyticsOptional, useTrackEvent } from '../chunk-7FWA3I6A.js';
3
+ export { AnalyticsProvider, WebVitals, useAnalytics, useAnalyticsOptional, useTrackEvent } from '../chunk-JWTQS5F5.js';
4
4
  export { trackConversion, trackEvent } from '../chunk-LCDVPAMR.js';
5
5
  import '../chunk-24QZEO3Q.js';
6
6
  import '../chunk-L2V5PUFN.js';
7
7
  import '../chunk-GJWI74ZZ.js';
8
8
  export { isCrossOriginFrame, isFramed, isTopFrameSameOrigin } from '../chunk-43OCZ3JA.js';
9
9
  import '../chunk-EKBEOXTH.js';
10
- import '../chunk-PXZ7LAOY.js';
11
- import '../chunk-OUNRFXDC.js';
12
- import '../chunk-6OL23QYD.js';
10
+ import '../chunk-D6ZC7XKZ.js';
11
+ import '../chunk-K4ZHAURD.js';
12
+ import '../chunk-F24FNCTK.js';
13
13
  import '../chunk-PKBMQBKP.js';
@@ -9,10 +9,10 @@
9
9
  * {@link analyticsBeacon}. Do NOT call sonorFetch/sonorBeacon directly from
10
10
  * this module, and do not re-fork the credential resolution below; the
11
11
  * eight hand-rolled copies this replaced are exactly how a rule gets fixed
12
- * in one place and left broken in seven (see CLAUDE.md, "Code Hygiene").
12
+ * in one place and left broken in seven.
13
13
  * `send-gate.test.ts` fails the build if a new direct call appears.
14
14
  *
15
- * Fleet, client SitemapSync and Engage also consult this gate. Local browser
15
+ * Fleet, client SitemapSync, chat and popups also consult this gate. Local browser
16
16
  * hosts are blocked regardless of configured production site identity. Node
17
17
  * build callers retain their existing behavior.
18
18
  *
@@ -26,33 +26,20 @@
26
26
  *
27
27
  * 2. IS THERE A CREDENTIAL? Unchanged behavior — no key, no send.
28
28
  *
29
- * ─── Why this landed on 2026-09-08, and what was measured ──────────────────
29
+ * ─── Why ─────────────────────────────────────────────────────────────────
30
30
  *
31
- * Upforge case studies embed each client's whole production site in three
32
- * eager iframes per study (agency-site-kit `DeviceTrifolio`), and
33
- * `securityHeaders`' DEFAULT_FRAME_ANCESTORS has allowed https://upforge.io
34
- * to frame every managed site since it was introduced. DeviceTrifolio's own
35
- * doc comment reasons that nobody is affected because its cross-origin load
36
- * detection can never succeed, so the screenshot overlay never fades. That is
37
- * true of the PIXELS and false of the JAVASCRIPT: the overlay is an opacity
38
- * layer over a live frame, so the embedded site loads, hydrates and runs its
39
- * analytics whether or not it is ever revealed.
40
- *
41
- * Measured in the Sonor analytics table before this change (2026-09-08), the
42
- * signature is unmistakable — from `analytics_page_views`, three views of `/`
43
- * sharing ONE session_id and ONE visitor_id, milliseconds apart, with
44
- * referrer `https://upforge.io/`:
45
- *
46
- * abbeyglenapts.com 20:02:13.852 / .900 / .921 (48ms, 21ms apart)
47
- * goldenmilenky.com 04:12:23.840 / .868 / 24.624
48
- * queencityriverboats 22:12:33.609 / .690 / .784
31
+ * Agency case studies embed a client's whole production site in desktop,
32
+ * tablet and mobile iframes, and `securityHeaders`' DEFAULT_FRAME_ANCESTORS
33
+ * lets them. A screenshot overlay on those frames hides the PIXELS, not the
34
+ * JAVASCRIPT: the overlay is an opacity layer over a live frame, so the
35
+ * embedded site loads, hydrates and runs its analytics whether or not it is
36
+ * ever revealed.
49
37
  *
38
+ * The signature is unmistakable: three views of `/` sharing ONE session_id
39
+ * and ONE visitor_id, milliseconds apart, with the portfolio as referrer.
50
40
  * Three loads of one page inside 70 milliseconds is not a person; it is the
51
- * desktop + tablet + mobile frames of one trifolio, sharing storage because
52
- * they share the embedded site's origin. 23 client sites carried this traffic
53
- * on the day of the fix, the oldest from 2026-06-11. The widening of
54
- * frame-ancestors to upforgelabs.com (upforge-nextjs 0c12be5) does not start
55
- * this problem — it multiplies one that was already live.
41
+ * three frames of one case study, sharing storage because they share the
42
+ * embedded site's origin.
56
43
  *
57
44
  * ─── Same-origin frames are ALLOWED, deliberately ──────────────────────────
58
45
  *
@@ -62,7 +62,7 @@ export interface ArticleServerProps {
62
62
  unstyled?: boolean;
63
63
  siteUrl?: string;
64
64
  /**
65
- * Sub-site host for multi-site projects (e.g. `bd-charlotte.com`). Scopes
65
+ * Sub-site host for multi-site projects (e.g. `charlotte.example.com`). Scopes
66
66
  * the post, related-posts and view-count calls to that host. Omit to resolve
67
67
  * from NEXT_PUBLIC_SITE_URL. Separate from `siteUrl`, which only decides
68
68
  * which links in the body open in a new tab.
@@ -57,7 +57,7 @@ export interface ArticleListServerProps {
57
57
  orderBy?: 'published_at' | 'title' | 'view_count';
58
58
  order?: 'asc' | 'desc';
59
59
  /**
60
- * Sub-site host for multi-site projects (e.g. `bd-charlotte.com`): the list
60
+ * Sub-site host for multi-site projects (e.g. `charlotte.example.com`): the list
61
61
  * shows that host's posts plus project-wide ones. Omit to resolve from
62
62
  * NEXT_PUBLIC_SITE_URL.
63
63
  */
@@ -7,7 +7,7 @@
7
7
  * - Pillar article (featured, large card)
8
8
  * - Support articles (grid, categorized by article_type or funnel_stage)
9
9
  *
10
- * Server component — fetches cluster data from Portal API.
10
+ * Server component — fetches cluster data from Sonor API.
11
11
  * Ships with `.sk-cluster-landing-*` scoped styles.
12
12
  */
13
13
  import React from 'react';
@@ -24,7 +24,7 @@ export interface ClusterLandingPageProps {
24
24
  /**
25
25
  * Include each article's own category segment in its URL:
26
26
  * {basePath}/{category}/{slug}. Enable on sites whose article routes are
27
- * category-segmented (e.g. upforge.io /insights/{category}/{slug}) —
27
+ * category-segmented (e.g. /insights/{category}/{slug}) —
28
28
  * without it, links point at {basePath}/{slug} and 404 on such sites.
29
29
  */
30
30
  categoryInPath?: boolean;
@@ -8,7 +8,7 @@ import React from 'react';
8
8
  import { PublicationSidebarProps } from './PublicationSidebar';
9
9
  import type { PublicationRoutingOptions } from './routes';
10
10
  export interface PublicationLayoutProps {
11
- /** Portal API URL */
11
+ /** Sonor API URL */
12
12
  apiUrl?: string;
13
13
  /** Project API key */
14
14
  apiKey?: string;
@@ -7,7 +7,7 @@
7
7
  import React from 'react';
8
8
  import { type PublicationRoutingOptions } from './routes';
9
9
  export interface PublicationSidebarProps {
10
- /** Portal API URL */
10
+ /** Sonor API URL */
11
11
  apiUrl?: string;
12
12
  /** Project API key */
13
13
  apiKey?: string;
@@ -1,7 +1,7 @@
1
1
  /**
2
2
  * @sonordev/site-kit/articles - Related articles component
3
3
  *
4
- * Fetches and displays related articles via Portal API
4
+ * Fetches and displays related articles via Sonor API
5
5
  */
6
6
  import React from 'react';
7
7
  import type { Article } from './types';
@@ -20,7 +20,7 @@
20
20
  * (Google's profile-page markup for author pages).
21
21
  * - The `Person` carries one `@id` everywhere it appears (`authorEntityId`):
22
22
  * the row's `entity_id` when the person has a cross-site identity (e.g.
23
- * https://ramseydeal.com/#person), else `<author profile URL>#person`.
23
+ * https://example.com/#person), else `<author profile URL>#person`.
24
24
  * - Article bylines (`generateArticleAuthorNode`) reference that same `@id`,
25
25
  * so an article, its author page and the person's own site describe one
26
26
  * person, which is what a Knowledge Panel is built from.