@sonordev/site-kit 5.3.0 → 5.3.2

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 (257) hide show
  1. package/agent-manifest.json +1 -1
  2. package/dist/AnalyticsProvider-2XK54UZW.mjs +11 -0
  3. package/dist/{AnalyticsProvider-XSPROVHM.mjs.map → AnalyticsProvider-2XK54UZW.mjs.map} +1 -1
  4. package/dist/AnalyticsProvider-PM7SOGOS.js +32 -0
  5. package/dist/{AnalyticsProvider-2YV4ZVZD.js.map → AnalyticsProvider-PM7SOGOS.js.map} +1 -1
  6. package/dist/{BlogViewTracker-BQBJTL5L.js → BlogViewTracker-3BIUF5TI.js} +6 -6
  7. package/dist/{BlogViewTracker-BQBJTL5L.js.map → BlogViewTracker-3BIUF5TI.js.map} +1 -1
  8. package/dist/{BlogViewTracker-FEAXIUEW.mjs → BlogViewTracker-KFUDRDQK.mjs} +5 -5
  9. package/dist/{BlogViewTracker-FEAXIUEW.mjs.map → BlogViewTracker-KFUDRDQK.mjs.map} +1 -1
  10. package/dist/ChatWidget-4PHZHGG5.mjs +11 -0
  11. package/dist/{ChatWidget-B2DI2OWH.mjs.map → ChatWidget-4PHZHGG5.mjs.map} +1 -1
  12. package/dist/ChatWidget-7BYSGNO2.js +20 -0
  13. package/dist/{ChatWidget-GPBFJ4A3.js.map → ChatWidget-7BYSGNO2.js.map} +1 -1
  14. package/dist/EngageWidget-D6M6QWEC.mjs +9 -0
  15. package/dist/{EngageWidget-KF4HU4YA.mjs.map → EngageWidget-D6M6QWEC.mjs.map} +1 -1
  16. package/dist/EngageWidget-Q4ITKTMJ.js +18 -0
  17. package/dist/{EngageWidget-JXJSFONK.js.map → EngageWidget-Q4ITKTMJ.js.map} +1 -1
  18. package/dist/{FileField-WI6SADBA.mjs → FileField-PQQDX4IR.mjs} +5 -5
  19. package/dist/{FileField-WI6SADBA.mjs.map → FileField-PQQDX4IR.mjs.map} +1 -1
  20. package/dist/{FileField-22BB34L3.js → FileField-YBBIJOCK.js} +6 -6
  21. package/dist/{FileField-22BB34L3.js.map → FileField-YBBIJOCK.js.map} +1 -1
  22. package/dist/{FormSpotlight-6FZV6JOA.mjs → FormSpotlight-7TIIWFTP.mjs} +4 -4
  23. package/dist/{FormSpotlight-6FZV6JOA.mjs.map → FormSpotlight-7TIIWFTP.mjs.map} +1 -1
  24. package/dist/{FormSpotlight-QCIN67NB.js → FormSpotlight-WUN24F3P.js} +18 -18
  25. package/dist/{FormSpotlight-QCIN67NB.js.map → FormSpotlight-WUN24F3P.js.map} +1 -1
  26. package/dist/{FormStage-SBQQZDW6.js → FormStage-CM7OVLUT.js} +15 -15
  27. package/dist/{FormStage-SBQQZDW6.js.map → FormStage-CM7OVLUT.js.map} +1 -1
  28. package/dist/{FormStage-P3IIHVCC.mjs → FormStage-TFN2GIBO.mjs} +4 -4
  29. package/dist/{FormStage-P3IIHVCC.mjs.map → FormStage-TFN2GIBO.mjs.map} +1 -1
  30. package/dist/ManagedForm-N63YGVNY.js +23 -0
  31. package/dist/{ManagedForm-6LII4DED.js.map → ManagedForm-N63YGVNY.js.map} +1 -1
  32. package/dist/ManagedForm-ZUXLHEQU.mjs +14 -0
  33. package/dist/{ManagedForm-O3JRRWZ6.mjs.map → ManagedForm-ZUXLHEQU.mjs.map} +1 -1
  34. package/dist/{ManagedNewsletterForm-FFFF5UEX.mjs → ManagedNewsletterForm-4AVKTZ2A.mjs} +7 -7
  35. package/dist/{ManagedNewsletterForm-FFFF5UEX.mjs.map → ManagedNewsletterForm-4AVKTZ2A.mjs.map} +1 -1
  36. package/dist/{ManagedNewsletterForm-Z7NYZPAN.js → ManagedNewsletterForm-PIVJTU5L.js} +8 -8
  37. package/dist/{ManagedNewsletterForm-Z7NYZPAN.js.map → ManagedNewsletterForm-PIVJTU5L.js.map} +1 -1
  38. package/dist/{SignalCore-WL5WKQEI.js → SignalCore-2M5TISM7.js} +11 -11
  39. package/dist/{SignalCore-WL5WKQEI.js.map → SignalCore-2M5TISM7.js.map} +1 -1
  40. package/dist/{SignalCore-IUOSVYUE.mjs → SignalCore-LT4NCPOR.mjs} +5 -5
  41. package/dist/{SignalCore-IUOSVYUE.mjs.map → SignalCore-LT4NCPOR.mjs.map} +1 -1
  42. package/dist/SitemapSync-7OBOJG2L.js +18 -0
  43. package/dist/{SitemapSync-LA67GKKS.js.map → SitemapSync-7OBOJG2L.js.map} +1 -1
  44. package/dist/SitemapSync-G3OLECFI.mjs +9 -0
  45. package/dist/{SitemapSync-2O5UM4GM.mjs.map → SitemapSync-G3OLECFI.mjs.map} +1 -1
  46. package/dist/SitemapSync.d.ts.map +1 -1
  47. package/dist/analytics/AnalyticsProvider.d.ts +11 -1
  48. package/dist/analytics/AnalyticsProvider.d.ts.map +1 -1
  49. package/dist/analytics/WebVitals.d.ts +7 -1
  50. package/dist/analytics/WebVitals.d.ts.map +1 -1
  51. package/dist/analytics/index.d.ts +1 -0
  52. package/dist/analytics/index.d.ts.map +1 -1
  53. package/dist/analytics/index.js +25 -12
  54. package/dist/analytics/index.mjs +6 -5
  55. package/dist/analytics/send-gate.d.ts +119 -0
  56. package/dist/analytics/send-gate.d.ts.map +1 -0
  57. package/dist/analytics/send-gate.test.d.ts +20 -0
  58. package/dist/analytics/send-gate.test.d.ts.map +1 -0
  59. package/dist/blog/index.js +20 -20
  60. package/dist/blog/index.mjs +3 -3
  61. package/dist/blog/server-ui.js +14 -14
  62. package/dist/blog/server-ui.mjs +2 -2
  63. package/dist/blog/types.d.ts +3 -0
  64. package/dist/blog/types.d.ts.map +1 -1
  65. package/dist/{chunk-EDZWNCSE.js → chunk-3EPMDPWI.js} +2 -2
  66. package/dist/{chunk-EDZWNCSE.js.map → chunk-3EPMDPWI.js.map} +1 -1
  67. package/dist/{chunk-BAFGZQWP.mjs → chunk-42F5EK24.mjs} +4 -4
  68. package/dist/{chunk-BAFGZQWP.mjs.map → chunk-42F5EK24.mjs.map} +1 -1
  69. package/dist/{chunk-3DQXXYCS.js → chunk-4DE2KJ7R.js} +10 -10
  70. package/dist/{chunk-3DQXXYCS.js.map → chunk-4DE2KJ7R.js.map} +1 -1
  71. package/dist/{chunk-LFBMFACZ.js → chunk-5BZDHZCN.js} +4 -4
  72. package/dist/{chunk-LFBMFACZ.js.map → chunk-5BZDHZCN.js.map} +1 -1
  73. package/dist/{chunk-YDIINUWD.mjs → chunk-67CHHDBL.mjs} +3 -3
  74. package/dist/{chunk-YDIINUWD.mjs.map → chunk-67CHHDBL.mjs.map} +1 -1
  75. package/dist/{chunk-RMLRZOVE.js → chunk-6AZTRTCG.js} +15 -15
  76. package/dist/{chunk-RMLRZOVE.js.map → chunk-6AZTRTCG.js.map} +1 -1
  77. package/dist/{chunk-X4H2RAIQ.mjs → chunk-6QABCGM6.mjs} +3 -3
  78. package/dist/{chunk-X4H2RAIQ.mjs.map → chunk-6QABCGM6.mjs.map} +1 -1
  79. package/dist/{chunk-MOVMDHGE.mjs → chunk-6VG65AIA.mjs} +3 -3
  80. package/dist/{chunk-MOVMDHGE.mjs.map → chunk-6VG65AIA.mjs.map} +1 -1
  81. package/dist/{chunk-5I7UEXJL.js → chunk-757HXAYX.js} +3 -3
  82. package/dist/{chunk-5I7UEXJL.js.map → chunk-757HXAYX.js.map} +1 -1
  83. package/dist/{chunk-ULGTZ2VU.js → chunk-A3NNUKFA.js} +3 -3
  84. package/dist/{chunk-ULGTZ2VU.js.map → chunk-A3NNUKFA.js.map} +1 -1
  85. package/dist/{chunk-D2D3YKWT.mjs → chunk-AVM4OZHR.mjs} +3 -3
  86. package/dist/{chunk-D2D3YKWT.mjs.map → chunk-AVM4OZHR.mjs.map} +1 -1
  87. package/dist/{chunk-K447AIIB.mjs → chunk-AXAIUCSF.mjs} +9 -8
  88. package/dist/chunk-AXAIUCSF.mjs.map +1 -0
  89. package/dist/{chunk-HHX72A2B.mjs → chunk-CQUA2AUA.mjs} +3 -3
  90. package/dist/{chunk-HHX72A2B.mjs.map → chunk-CQUA2AUA.mjs.map} +1 -1
  91. package/dist/chunk-D37M7MIH.js +8 -0
  92. package/dist/{chunk-BIZT7AYK.js.map → chunk-D37M7MIH.js.map} +1 -1
  93. package/dist/{chunk-7MQR4KDL.mjs → chunk-DVH3JHZ3.mjs} +4 -4
  94. package/dist/{chunk-7MQR4KDL.mjs.map → chunk-DVH3JHZ3.mjs.map} +1 -1
  95. package/dist/{chunk-K6YQ73IX.js → chunk-DYKFC7WY.js} +8 -8
  96. package/dist/{chunk-K6YQ73IX.js.map → chunk-DYKFC7WY.js.map} +1 -1
  97. package/dist/{chunk-O2KN2SC7.mjs → chunk-DZDWBQKA.mjs} +3 -3
  98. package/dist/{chunk-O2KN2SC7.mjs.map → chunk-DZDWBQKA.mjs.map} +1 -1
  99. package/dist/{chunk-OQBDJRVP.js → chunk-E33HJMRP.js} +6 -6
  100. package/dist/{chunk-OQBDJRVP.js.map → chunk-E33HJMRP.js.map} +1 -1
  101. package/dist/{chunk-VTEIXKBA.js → chunk-FDVE56JS.js} +3 -3
  102. package/dist/{chunk-VTEIXKBA.js.map → chunk-FDVE56JS.js.map} +1 -1
  103. package/dist/{chunk-7NMI7M56.js → chunk-FFJVQWKO.js} +4 -4
  104. package/dist/{chunk-7NMI7M56.js.map → chunk-FFJVQWKO.js.map} +1 -1
  105. package/dist/{chunk-2OZ2SMZH.js → chunk-G3YUSRCL.js} +4 -4
  106. package/dist/{chunk-2OZ2SMZH.js.map → chunk-G3YUSRCL.js.map} +1 -1
  107. package/dist/{chunk-JJ6AI6LW.js → chunk-GFNXWS3I.js} +5 -5
  108. package/dist/{chunk-JJ6AI6LW.js.map → chunk-GFNXWS3I.js.map} +1 -1
  109. package/dist/{chunk-X6SAM7CR.js → chunk-GPNBBUEN.js} +3 -3
  110. package/dist/{chunk-X6SAM7CR.js.map → chunk-GPNBBUEN.js.map} +1 -1
  111. package/dist/{chunk-LB7LHVWI.mjs → chunk-H7274TKR.mjs} +9 -3
  112. package/dist/chunk-H7274TKR.mjs.map +1 -0
  113. package/dist/{chunk-DXFZA34N.mjs → chunk-HDQTZAGE.mjs} +3 -3
  114. package/dist/{chunk-DXFZA34N.mjs.map → chunk-HDQTZAGE.mjs.map} +1 -1
  115. package/dist/{chunk-GCY6VPBG.mjs → chunk-HVFXFPUJ.mjs} +3 -3
  116. package/dist/{chunk-GCY6VPBG.mjs.map → chunk-HVFXFPUJ.mjs.map} +1 -1
  117. package/dist/{chunk-2ACKOMAL.js → chunk-IPV2TUAT.js} +9 -3
  118. package/dist/chunk-IPV2TUAT.js.map +1 -0
  119. package/dist/{chunk-7OCQ4646.mjs → chunk-JSLYNYTB.mjs} +3 -3
  120. package/dist/{chunk-7OCQ4646.mjs.map → chunk-JSLYNYTB.mjs.map} +1 -1
  121. package/dist/{chunk-FDLFXHUU.mjs → chunk-JTO3K5B7.mjs} +4 -4
  122. package/dist/{chunk-FDLFXHUU.mjs.map → chunk-JTO3K5B7.mjs.map} +1 -1
  123. package/dist/{chunk-KMNIW4K4.js → chunk-K37JPEQW.js} +15 -15
  124. package/dist/{chunk-KMNIW4K4.js.map → chunk-K37JPEQW.js.map} +1 -1
  125. package/dist/{chunk-KHHMU4UH.mjs → chunk-KOP3DPIR.mjs} +4 -4
  126. package/dist/{chunk-KHHMU4UH.mjs.map → chunk-KOP3DPIR.mjs.map} +1 -1
  127. package/dist/{chunk-PXAALKTP.js → chunk-KP5BFPGT.js} +5 -3
  128. package/dist/chunk-KP5BFPGT.js.map +1 -0
  129. package/dist/{chunk-XYZZJZGS.js → chunk-KPFPSOYS.js} +12 -12
  130. package/dist/{chunk-XYZZJZGS.js.map → chunk-KPFPSOYS.js.map} +1 -1
  131. package/dist/{chunk-4YJFC6FC.js → chunk-M7FWXEXC.js} +126 -188
  132. package/dist/chunk-M7FWXEXC.js.map +1 -0
  133. package/dist/{chunk-GF7CQMBL.js → chunk-MANX6422.js} +7 -7
  134. package/dist/{chunk-GF7CQMBL.js.map → chunk-MANX6422.js.map} +1 -1
  135. package/dist/{chunk-XRONA2QL.mjs → chunk-N3C323NY.mjs} +8 -3
  136. package/dist/chunk-N3C323NY.mjs.map +1 -0
  137. package/dist/{chunk-YUOVAWCL.mjs → chunk-NSLYY62T.mjs} +4 -4
  138. package/dist/{chunk-YUOVAWCL.mjs.map → chunk-NSLYY62T.mjs.map} +1 -1
  139. package/dist/chunk-NVSWTDWU.mjs +25 -0
  140. package/dist/chunk-NVSWTDWU.mjs.map +1 -0
  141. package/dist/{chunk-KC2FCI5V.mjs → chunk-OC6PU7U2.mjs} +3 -3
  142. package/dist/{chunk-KC2FCI5V.mjs.map → chunk-OC6PU7U2.mjs.map} +1 -1
  143. package/dist/{chunk-WZ6QNL2D.js → chunk-OIJ435IZ.js} +23 -23
  144. package/dist/{chunk-WZ6QNL2D.js.map → chunk-OIJ435IZ.js.map} +1 -1
  145. package/dist/chunk-OL2QBWAU.js +29 -0
  146. package/dist/chunk-OL2QBWAU.js.map +1 -0
  147. package/dist/chunk-OUERH2T4.mjs +6 -0
  148. package/dist/{chunk-3PTKHSF7.mjs.map → chunk-OUERH2T4.mjs.map} +1 -1
  149. package/dist/{chunk-NQLE3V3T.js → chunk-PEEQMI7U.js} +12 -11
  150. package/dist/chunk-PEEQMI7U.js.map +1 -0
  151. package/dist/{chunk-RE54UKET.js → chunk-PZXKFHPO.js} +14 -14
  152. package/dist/{chunk-RE54UKET.js.map → chunk-PZXKFHPO.js.map} +1 -1
  153. package/dist/{chunk-W7QMCG2A.mjs → chunk-QZ54OCWD.mjs} +8 -8
  154. package/dist/{chunk-W7QMCG2A.mjs.map → chunk-QZ54OCWD.mjs.map} +1 -1
  155. package/dist/{chunk-B7FHRTBA.js → chunk-R3LYTIVN.js} +10 -5
  156. package/dist/chunk-R3LYTIVN.js.map +1 -0
  157. package/dist/{chunk-5YKMHPJL.mjs → chunk-R5F2JQVX.mjs} +5 -3
  158. package/dist/chunk-R5F2JQVX.mjs.map +1 -0
  159. package/dist/{chunk-26JXNW7B.mjs → chunk-RO55G3OA.mjs} +2 -2
  160. package/dist/{chunk-26JXNW7B.mjs.map → chunk-RO55G3OA.mjs.map} +1 -1
  161. package/dist/{chunk-LCRWCOPI.mjs → chunk-TS3N3LGZ.mjs} +5 -5
  162. package/dist/{chunk-LCRWCOPI.mjs.map → chunk-TS3N3LGZ.mjs.map} +1 -1
  163. package/dist/{chunk-6ABEAO2K.js → chunk-W23TMUKB.js} +9 -9
  164. package/dist/{chunk-6ABEAO2K.js.map → chunk-W23TMUKB.js.map} +1 -1
  165. package/dist/{chunk-PEIWCJXS.js → chunk-XQZTOWS3.js} +14 -14
  166. package/dist/{chunk-PEIWCJXS.js.map → chunk-XQZTOWS3.js.map} +1 -1
  167. package/dist/{chunk-ITV76G3L.mjs → chunk-XW5KNCWJ.mjs} +3 -3
  168. package/dist/{chunk-ITV76G3L.mjs.map → chunk-XW5KNCWJ.mjs.map} +1 -1
  169. package/dist/{chunk-KIGIAA6Q.mjs → chunk-Y7SRO7MJ.mjs} +127 -189
  170. package/dist/chunk-Y7SRO7MJ.mjs.map +1 -0
  171. package/dist/{chunk-XZI6KUB3.js → chunk-Z7K5AMCE.js} +4 -4
  172. package/dist/{chunk-XZI6KUB3.js.map → chunk-Z7K5AMCE.js.map} +1 -1
  173. package/dist/{chunk-F4DZH4E5.mjs → chunk-ZKR5AJV5.mjs} +4 -4
  174. package/dist/{chunk-F4DZH4E5.mjs.map → chunk-ZKR5AJV5.mjs.map} +1 -1
  175. package/dist/{chunk-6RYCAW5B.mjs → chunk-ZOJ3TLO5.mjs} +3 -3
  176. package/dist/{chunk-6RYCAW5B.mjs.map → chunk-ZOJ3TLO5.mjs.map} +1 -1
  177. package/dist/cli/index.js +3 -3
  178. package/dist/cli/index.mjs +1 -1
  179. package/dist/client/index.js +4 -4
  180. package/dist/client/index.mjs +3 -3
  181. package/dist/commerce/index.js +58 -57
  182. package/dist/commerce/index.mjs +7 -6
  183. package/dist/config/index.js +2 -2
  184. package/dist/config/index.mjs +1 -1
  185. package/dist/engage/index.js +10 -10
  186. package/dist/engage/index.mjs +7 -7
  187. package/dist/fleet/index.js +8 -8
  188. package/dist/fleet/index.mjs +4 -4
  189. package/dist/forms/FormField.d.ts +2 -1
  190. package/dist/forms/FormField.d.ts.map +1 -1
  191. package/dist/forms/index.js +18 -18
  192. package/dist/forms/index.mjs +10 -10
  193. package/dist/forms/server.js +11 -11
  194. package/dist/forms/server.mjs +9 -9
  195. package/dist/forms/static.js +8 -8
  196. package/dist/forms/static.mjs +7 -7
  197. package/dist/forms/styles.css +21 -0
  198. package/dist/images/index.js +11 -11
  199. package/dist/images/index.mjs +4 -4
  200. package/dist/index.js +65 -64
  201. package/dist/index.js.map +1 -1
  202. package/dist/index.mjs +11 -10
  203. package/dist/index.mjs.map +1 -1
  204. package/dist/layout/SiteKitClientProviders.d.ts.map +1 -1
  205. package/dist/layout/client.d.ts.map +1 -1
  206. package/dist/layout/client.js +8 -8
  207. package/dist/layout/client.mjs +7 -7
  208. package/dist/layout/index.js +10 -10
  209. package/dist/layout/index.mjs +8 -8
  210. package/dist/layout/types.d.ts +16 -0
  211. package/dist/layout/types.d.ts.map +1 -1
  212. package/dist/maps/index.js +5 -5
  213. package/dist/maps/index.mjs +3 -3
  214. package/dist/proxy/index.js +3 -3
  215. package/dist/proxy/index.mjs +2 -2
  216. package/dist/proxy/securityHeaders.d.ts +21 -6
  217. package/dist/proxy/securityHeaders.d.ts.map +1 -1
  218. package/dist/search/index.js +4 -4
  219. package/dist/search/index.mjs +3 -3
  220. package/dist/seo/client.js +6 -5
  221. package/dist/seo/client.mjs +5 -4
  222. package/dist/seo/index.js +6 -5
  223. package/dist/seo/index.js.map +1 -1
  224. package/dist/seo/index.mjs +5 -4
  225. package/dist/seo/index.mjs.map +1 -1
  226. package/dist/server/index.js +3 -3
  227. package/dist/server/index.mjs +2 -2
  228. package/dist/shared/frame.d.ts +71 -0
  229. package/dist/shared/frame.d.ts.map +1 -0
  230. package/dist/shared/version.d.ts +1 -1
  231. package/dist/signal/index.js +11 -11
  232. package/dist/signal/index.mjs +2 -2
  233. package/dist/sync/index.js +16 -16
  234. package/dist/sync/index.mjs +4 -4
  235. package/package.json +1 -1
  236. package/dist/AnalyticsProvider-2YV4ZVZD.js +0 -31
  237. package/dist/AnalyticsProvider-XSPROVHM.mjs +0 -10
  238. package/dist/ChatWidget-B2DI2OWH.mjs +0 -11
  239. package/dist/ChatWidget-GPBFJ4A3.js +0 -20
  240. package/dist/EngageWidget-JXJSFONK.js +0 -18
  241. package/dist/EngageWidget-KF4HU4YA.mjs +0 -9
  242. package/dist/ManagedForm-6LII4DED.js +0 -23
  243. package/dist/ManagedForm-O3JRRWZ6.mjs +0 -14
  244. package/dist/SitemapSync-2O5UM4GM.mjs +0 -8
  245. package/dist/SitemapSync-LA67GKKS.js +0 -17
  246. package/dist/chunk-2ACKOMAL.js.map +0 -1
  247. package/dist/chunk-3PTKHSF7.mjs +0 -6
  248. package/dist/chunk-4YJFC6FC.js.map +0 -1
  249. package/dist/chunk-5YKMHPJL.mjs.map +0 -1
  250. package/dist/chunk-B7FHRTBA.js.map +0 -1
  251. package/dist/chunk-BIZT7AYK.js +0 -8
  252. package/dist/chunk-K447AIIB.mjs.map +0 -1
  253. package/dist/chunk-KIGIAA6Q.mjs.map +0 -1
  254. package/dist/chunk-LB7LHVWI.mjs.map +0 -1
  255. package/dist/chunk-NQLE3V3T.js.map +0 -1
  256. package/dist/chunk-PXAALKTP.js.map +0 -1
  257. package/dist/chunk-XRONA2QL.mjs.map +0 -1
@@ -0,0 +1,119 @@
1
+ /**
2
+ * @sonordev/site-kit/analytics — the ONE analytics send decision
3
+ *
4
+ * SINGLE SOURCE OF TRUTH for "may this document report analytics, and where
5
+ * to". Every phone-home in the analytics module — page views, journey /
6
+ * session rows, scroll depth, heatmap clicks, web vitals, custom events,
7
+ * conversions, and the sitemap-validation read — resolves through
8
+ * {@link resolveAnalyticsTarget} and sends through {@link analyticsSend} /
9
+ * {@link analyticsBeacon}. Do NOT call sonorFetch/sonorBeacon directly from
10
+ * this module, and do not re-fork the credential resolution below; the
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").
13
+ * `send-gate.test.ts` fails the build if a new direct call appears.
14
+ *
15
+ * It answers two questions, in this order:
16
+ *
17
+ * 1. IS THIS DOCUMENT SOMEONE ELSE'S EMBED? A site loaded in a cross-origin
18
+ * iframe must not report traffic against its own Sonor project. The
19
+ * visitor is not on that site; they are on whatever page framed it, and
20
+ * every metric the frame produces is phantom traffic in the analytics its
21
+ * owner reads (and, for an agency, reports to the client).
22
+ *
23
+ * 2. IS THERE A CREDENTIAL? Unchanged behavior — no key, no send.
24
+ *
25
+ * ─── Why this landed on 2026-09-08, and what was measured ──────────────────
26
+ *
27
+ * Upforge case studies embed each client's whole production site in three
28
+ * eager iframes per study (agency-site-kit `DeviceTrifolio`), and
29
+ * `securityHeaders`' DEFAULT_FRAME_ANCESTORS has allowed https://upforge.io
30
+ * to frame every managed site since it was introduced. DeviceTrifolio's own
31
+ * doc comment reasons that nobody is affected because its cross-origin load
32
+ * detection can never succeed, so the screenshot overlay never fades. That is
33
+ * true of the PIXELS and false of the JAVASCRIPT: the overlay is an opacity
34
+ * layer over a live frame, so the embedded site loads, hydrates and runs its
35
+ * analytics whether or not it is ever revealed.
36
+ *
37
+ * Measured in the Sonor analytics table before this change (2026-09-08), the
38
+ * signature is unmistakable — from `analytics_page_views`, three views of `/`
39
+ * sharing ONE session_id and ONE visitor_id, milliseconds apart, with
40
+ * referrer `https://upforge.io/`:
41
+ *
42
+ * abbeyglenapts.com 20:02:13.852 / .900 / .921 (48ms, 21ms apart)
43
+ * goldenmilenky.com 04:12:23.840 / .868 / 24.624
44
+ * queencityriverboats 22:12:33.609 / .690 / .784
45
+ *
46
+ * Three loads of one page inside 70 milliseconds is not a person; it is the
47
+ * desktop + tablet + mobile frames of one trifolio, sharing storage because
48
+ * they share the embedded site's origin. 23 client sites carried this traffic
49
+ * on the day of the fix, the oldest from 2026-06-11. The widening of
50
+ * frame-ancestors to upforgelabs.com (upforge-nextjs 0c12be5) does not start
51
+ * this problem — it multiplies one that was already live.
52
+ *
53
+ * ─── Same-origin frames are ALLOWED, deliberately ──────────────────────────
54
+ *
55
+ * The block is on CROSS-origin embedding, not on being framed at all. A site
56
+ * embedding itself (a preview pane, a print view, an on-domain booking frame)
57
+ * has a real visitor really on that site and no other tenant to pollute, so
58
+ * it keeps reporting. How that is detected, and why `window.top` rather than
59
+ * `window.parent`, lives with the primitive in `shared/frame.ts` — this file
60
+ * owns the analytics POLICY, that file owns the frame FACT.
61
+ */
62
+ /** Resolved destination for an analytics send. */
63
+ export interface AnalyticsTarget {
64
+ apiUrl: string;
65
+ apiKey: string;
66
+ }
67
+ export interface AnalyticsGateOptions {
68
+ /** `apiUrl` prop, when the caller was given one. Falls back to the window global. */
69
+ apiUrl?: string;
70
+ /** `apiKey` prop, when the caller was given one. Falls back to the window global. */
71
+ apiKey?: string;
72
+ /**
73
+ * Opt back in to reporting from inside a cross-origin frame. For a site
74
+ * deliberately distributed as an embed (a widget, a partner-hosted
75
+ * booking or menu page) the frame IS the product, and its traffic is real.
76
+ * Explicit per-site config only — see AnalyticsConfig.allowInFrame. There
77
+ * is deliberately no window global or env var for this: a silent switch
78
+ * that turns cross-tenant tracking back on is the failure mode, not the
79
+ * feature.
80
+ */
81
+ allowInFrame?: boolean;
82
+ /** Emit the one-time diagnostic when a send is suppressed. */
83
+ debug?: boolean;
84
+ }
85
+ export { isCrossOriginFrame, isFramed, isTopFrameSameOrigin } from '../shared/frame';
86
+ /** Test seam — resets the once-per-document log latch. */
87
+ export declare function __resetSendGate(): void;
88
+ /**
89
+ * Resolve where an analytics call should go, or `null` if it must not happen.
90
+ *
91
+ * Returning `null` is the ONLY "do not send" signal in this module. Callers
92
+ * that set up listeners or scrape the DOM should resolve first and bail on
93
+ * `null`, so a cross-origin frame never even attaches a scroll or click
94
+ * listener — the guard saves the work, not just the request.
95
+ */
96
+ export declare function resolveAnalyticsTarget(options?: AnalyticsGateOptions): AnalyticsTarget | null;
97
+ /**
98
+ * POST an analytics payload. Resolves the gate itself and no-ops when it
99
+ * says no — so a caller that forgets its own early bail still cannot send
100
+ * from a cross-origin frame. That belt-and-braces is the point: this is the
101
+ * choke point, and it does not rely on every call site remembering.
102
+ *
103
+ * `retries: 0` by default — every analytics endpoint here is non-idempotent
104
+ * from the client's side (a retried page view after a lost response
105
+ * double-counts). Never resolves to a rejected promise; tracking must not
106
+ * break a page.
107
+ */
108
+ export declare function analyticsSend(path: string, body: unknown, options?: AnalyticsGateOptions & {
109
+ retries?: number;
110
+ method?: string;
111
+ /** Let the request outlive the page (scroll depth flushed on unmount). */
112
+ keepalive?: boolean;
113
+ }): Promise<Response | null>;
114
+ /**
115
+ * Unload-time twin of {@link analyticsSend}, through the keepalive beacon so
116
+ * the credential stays in a header. Gated identically.
117
+ */
118
+ export declare function analyticsBeacon(path: string, body: unknown, options?: AnalyticsGateOptions): void;
119
+ //# sourceMappingURL=send-gate.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"send-gate.d.ts","sourceRoot":"","sources":["../../src/analytics/send-gate.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA4DG;AAKH,kDAAkD;AAClD,MAAM,WAAW,eAAe;IAC9B,MAAM,EAAE,MAAM,CAAA;IACd,MAAM,EAAE,MAAM,CAAA;CACf;AAED,MAAM,WAAW,oBAAoB;IACnC,qFAAqF;IACrF,MAAM,CAAC,EAAE,MAAM,CAAA;IACf,qFAAqF;IACrF,MAAM,CAAC,EAAE,MAAM,CAAA;IACf;;;;;;;;OAQG;IACH,YAAY,CAAC,EAAE,OAAO,CAAA;IACtB,8DAA8D;IAC9D,KAAK,CAAC,EAAE,OAAO,CAAA;CAChB;AAGD,OAAO,EAAE,kBAAkB,EAAE,QAAQ,EAAE,oBAAoB,EAAE,MAAM,iBAAiB,CAAA;AAuBpF,0DAA0D;AAC1D,wBAAgB,eAAe,IAAI,IAAI,CAEtC;AAED;;;;;;;GAOG;AACH,wBAAgB,sBAAsB,CACpC,OAAO,GAAE,oBAAyB,GACjC,eAAe,GAAG,IAAI,CAmBxB;AAED;;;;;;;;;;GAUG;AACH,wBAAsB,aAAa,CACjC,IAAI,EAAE,MAAM,EACZ,IAAI,EAAE,OAAO,EACb,OAAO,GAAE,oBAAoB,GAAG;IAC9B,OAAO,CAAC,EAAE,MAAM,CAAA;IAChB,MAAM,CAAC,EAAE,MAAM,CAAA;IACf,0EAA0E;IAC1E,SAAS,CAAC,EAAE,OAAO,CAAA;CACf,GACL,OAAO,CAAC,QAAQ,GAAG,IAAI,CAAC,CAkB1B;AAED;;;GAGG;AACH,wBAAgB,eAAe,CAC7B,IAAI,EAAE,MAAM,EACZ,IAAI,EAAE,OAAO,EACb,OAAO,GAAE,oBAAyB,GACjC,IAAI,CAIN"}
@@ -0,0 +1,20 @@
1
+ /**
2
+ * The cross-origin-frame guard.
3
+ *
4
+ * A site loaded inside someone else's page must not report traffic against
5
+ * its own Sonor project. This is not hypothetical: on 2026-09-08,
6
+ * `analytics_page_views` held bursts of three views of `/` sharing one
7
+ * session_id and one visitor_id 21-80ms apart with referrer
8
+ * `https://upforge.io/` — the desktop/tablet/mobile frames of one
9
+ * agency-site-kit DeviceTrifolio, across 23 client sites. See send-gate.ts.
10
+ *
11
+ * These tests pin the four cases the guard has to get right, and then pin the
12
+ * structure: ONE place decides, and no module re-forks it.
13
+ *
14
+ * Every case asserts against the real transport with `fetch` stubbed, rather
15
+ * than against the gate's return value alone — "returns null" is not the
16
+ * promise being made to a client whose analytics this pollutes; "no request
17
+ * leaves the browser" is.
18
+ */
19
+ export {};
20
+ //# sourceMappingURL=send-gate.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"send-gate.test.d.ts","sourceRoot":"","sources":["../../src/analytics/send-gate.test.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;GAiBG"}
@@ -3,7 +3,7 @@
3
3
 
4
4
  var chunkGQF6QAQS_js = require('../chunk-GQF6QAQS.js');
5
5
  var chunkDO6ATNLN_js = require('../chunk-DO6ATNLN.js');
6
- var chunkULGTZ2VU_js = require('../chunk-ULGTZ2VU.js');
6
+ var chunkA3NNUKFA_js = require('../chunk-A3NNUKFA.js');
7
7
  require('../chunk-HX6ZG3PP.js');
8
8
  var chunkTPL2IHFI_js = require('../chunk-TPL2IHFI.js');
9
9
  var chunkJ7QI3GDX_js = require('../chunk-J7QI3GDX.js');
@@ -15,7 +15,7 @@ function _interopDefault (e) { return e && e.__esModule ? e : { default: e }; }
15
15
 
16
16
  var React__default = /*#__PURE__*/_interopDefault(React);
17
17
 
18
- var ManagedNewsletterForm = React__default.default.lazy(() => import('../ManagedNewsletterForm-Z7NYZPAN.js'));
18
+ var ManagedNewsletterForm = React__default.default.lazy(() => import('../ManagedNewsletterForm-PIVJTU5L.js'));
19
19
  function NewsletterWidget({
20
20
  title = "Subscribe to Our Newsletter",
21
21
  description = "Get the latest posts delivered straight to your inbox.",
@@ -206,7 +206,7 @@ function AuthorCard({ author, showBio = true, showSocial = true, showTrustBlock
206
206
  author.company ? ` at ${author.company}` : ""
207
207
  ] }),
208
208
  showBio && author.bio && /* @__PURE__ */ jsxRuntime.jsx("p", { style: { margin: "4px 0", color: "var(--sk-text-secondary)", fontSize: 14 }, children: author.bio }),
209
- showSocial && chunkULGTZ2VU_js.getAuthorSocialLinks(author).length > 0 && /* @__PURE__ */ jsxRuntime.jsx("div", { style: { display: "flex", gap: 12, marginTop: 8 }, children: chunkULGTZ2VU_js.getAuthorSocialLinks(author).map((link) => /* @__PURE__ */ jsxRuntime.jsx("a", { href: link.href, target: "_blank", rel: "noopener noreferrer", children: link.label }, link.label)) })
209
+ showSocial && chunkA3NNUKFA_js.getAuthorSocialLinks(author).length > 0 && /* @__PURE__ */ jsxRuntime.jsx("div", { style: { display: "flex", gap: 12, marginTop: 8 }, children: chunkA3NNUKFA_js.getAuthorSocialLinks(author).map((link) => /* @__PURE__ */ jsxRuntime.jsx("a", { href: link.href, target: "_blank", rel: "noopener noreferrer", children: link.label }, link.label)) })
210
210
  ] })
211
211
  ] }),
212
212
  showTrustBlock && /* @__PURE__ */ jsxRuntime.jsx(TrustBlock, { author })
@@ -267,7 +267,7 @@ function AuthorHero({ author }) {
267
267
  );
268
268
  }
269
269
  function SocialLinks({ author }) {
270
- const links = chunkULGTZ2VU_js.getAuthorSocialLinks(author);
270
+ const links = chunkA3NNUKFA_js.getAuthorSocialLinks(author);
271
271
  if (links.length === 0) return null;
272
272
  return /* @__PURE__ */ jsxRuntime.jsx("div", { style: { display: "flex", gap: 16, marginTop: 16 }, children: links.map((link) => /* @__PURE__ */ jsxRuntime.jsx(
273
273
  "a",
@@ -322,8 +322,8 @@ function PostCard({ post, basePath }) {
322
322
  date && /* @__PURE__ */ jsxRuntime.jsx("time", { style: { fontSize: 12, color: "var(--sk-text-tertiary, #6b7280)", marginBottom: 6 }, children: date }),
323
323
  /* @__PURE__ */ jsxRuntime.jsx("a", { href, style: { textDecoration: "none", color: "inherit" }, children: /* @__PURE__ */ jsxRuntime.jsx("h3", { style: { margin: "0 0 8px", fontSize: 18, fontWeight: 600, lineHeight: 1.3, color: "var(--sk-text-primary, #111827)" }, children: post.title }) }),
324
324
  post.excerpt && /* @__PURE__ */ jsxRuntime.jsx("p", { style: { margin: 0, fontSize: 14, lineHeight: 1.6, color: "var(--sk-text-secondary, #4b5563)", flex: 1 }, children: post.excerpt }),
325
- chunkULGTZ2VU_js.readingTimeMinutes(post) && /* @__PURE__ */ jsxRuntime.jsxs("span", { style: { fontSize: 12, color: "var(--sk-text-tertiary, #6b7280)", marginTop: 12 }, children: [
326
- chunkULGTZ2VU_js.readingTimeMinutes(post),
325
+ chunkA3NNUKFA_js.readingTimeMinutes(post) && /* @__PURE__ */ jsxRuntime.jsxs("span", { style: { fontSize: 12, color: "var(--sk-text-tertiary, #6b7280)", marginTop: 12 }, children: [
326
+ chunkA3NNUKFA_js.readingTimeMinutes(post),
327
327
  " min read"
328
328
  ] })
329
329
  ] })
@@ -455,59 +455,59 @@ Object.defineProperty(exports, "BlogFAQ", {
455
455
  });
456
456
  Object.defineProperty(exports, "BlogLayout", {
457
457
  enumerable: true,
458
- get: function () { return chunkULGTZ2VU_js.BlogLayout; }
458
+ get: function () { return chunkA3NNUKFA_js.BlogLayout; }
459
459
  });
460
460
  Object.defineProperty(exports, "BlogList", {
461
461
  enumerable: true,
462
- get: function () { return chunkULGTZ2VU_js.BlogList; }
462
+ get: function () { return chunkA3NNUKFA_js.BlogList; }
463
463
  });
464
464
  Object.defineProperty(exports, "BlogPage", {
465
465
  enumerable: true,
466
- get: function () { return chunkULGTZ2VU_js.BlogPage; }
466
+ get: function () { return chunkA3NNUKFA_js.BlogPage; }
467
467
  });
468
468
  Object.defineProperty(exports, "BlogPost", {
469
469
  enumerable: true,
470
- get: function () { return chunkULGTZ2VU_js.BlogPost; }
470
+ get: function () { return chunkA3NNUKFA_js.BlogPost; }
471
471
  });
472
472
  Object.defineProperty(exports, "BlogPostPage", {
473
473
  enumerable: true,
474
- get: function () { return chunkULGTZ2VU_js.BlogPostPage; }
474
+ get: function () { return chunkA3NNUKFA_js.BlogPostPage; }
475
475
  });
476
476
  Object.defineProperty(exports, "BlogSidebar", {
477
477
  enumerable: true,
478
- get: function () { return chunkULGTZ2VU_js.BlogSidebar; }
478
+ get: function () { return chunkA3NNUKFA_js.BlogSidebar; }
479
479
  });
480
480
  Object.defineProperty(exports, "CategoryPage", {
481
481
  enumerable: true,
482
- get: function () { return chunkULGTZ2VU_js.CategoryPage; }
482
+ get: function () { return chunkA3NNUKFA_js.CategoryPage; }
483
483
  });
484
484
  Object.defineProperty(exports, "ClusterNavigation", {
485
485
  enumerable: true,
486
- get: function () { return chunkULGTZ2VU_js.ClusterNavigation; }
486
+ get: function () { return chunkA3NNUKFA_js.ClusterNavigation; }
487
487
  });
488
488
  Object.defineProperty(exports, "RelatedPosts", {
489
489
  enumerable: true,
490
- get: function () { return chunkULGTZ2VU_js.RelatedPosts; }
490
+ get: function () { return chunkA3NNUKFA_js.RelatedPosts; }
491
491
  });
492
492
  Object.defineProperty(exports, "ServiceCallout", {
493
493
  enumerable: true,
494
- get: function () { return chunkULGTZ2VU_js.ServiceCallout; }
494
+ get: function () { return chunkA3NNUKFA_js.ServiceCallout; }
495
495
  });
496
496
  Object.defineProperty(exports, "ServiceCallouts", {
497
497
  enumerable: true,
498
- get: function () { return chunkULGTZ2VU_js.ServiceCallouts; }
498
+ get: function () { return chunkA3NNUKFA_js.ServiceCallouts; }
499
499
  });
500
500
  Object.defineProperty(exports, "addExternalLinkTargets", {
501
501
  enumerable: true,
502
- get: function () { return chunkULGTZ2VU_js.addExternalLinkTargets; }
502
+ get: function () { return chunkA3NNUKFA_js.addExternalLinkTargets; }
503
503
  });
504
504
  Object.defineProperty(exports, "normalizeSiteHost", {
505
505
  enumerable: true,
506
- get: function () { return chunkULGTZ2VU_js.normalizeSiteHost; }
506
+ get: function () { return chunkA3NNUKFA_js.normalizeSiteHost; }
507
507
  });
508
508
  Object.defineProperty(exports, "resolveBlogSiteUrl", {
509
509
  enumerable: true,
510
- get: function () { return chunkULGTZ2VU_js.resolveBlogSiteUrl; }
510
+ get: function () { return chunkA3NNUKFA_js.resolveBlogSiteUrl; }
511
511
  });
512
512
  exports.AuthorCard = AuthorCard;
513
513
  exports.AuthorPage = AuthorPage;
@@ -1,8 +1,8 @@
1
1
  'use client';
2
2
  export { BlogFAQ } from '../chunk-O237KKCX.mjs';
3
3
  import { NewsletterShell } from '../chunk-AK6JZ3OE.mjs';
4
- import { getAuthorSocialLinks, readingTimeMinutes } from '../chunk-YDIINUWD.mjs';
5
- export { BlogLayout, BlogList, BlogPage, BlogPost, BlogPostPage, BlogSidebar, CategoryPage, ClusterNavigation, RelatedPosts, ServiceCallout, ServiceCallouts, addExternalLinkTargets, normalizeSiteHost, resolveBlogSiteUrl } from '../chunk-YDIINUWD.mjs';
4
+ import { getAuthorSocialLinks, readingTimeMinutes } from '../chunk-67CHHDBL.mjs';
5
+ export { BlogLayout, BlogList, BlogPage, BlogPost, BlogPostPage, BlogSidebar, CategoryPage, ClusterNavigation, RelatedPosts, ServiceCallout, ServiceCallouts, addExternalLinkTargets, normalizeSiteHost, resolveBlogSiteUrl } from '../chunk-67CHHDBL.mjs';
6
6
  import '../chunk-YFX3Q56O.mjs';
7
7
  import { generateAuthorSchema } from '../chunk-CGCYZJYX.mjs';
8
8
  import { safeJsonLd } from '../chunk-662YHKWW.mjs';
@@ -10,7 +10,7 @@ import '../chunk-BEXTDHO4.mjs';
10
10
  import React, { useState, Suspense, useEffect } from 'react';
11
11
  import { jsx, jsxs } from 'react/jsx-runtime';
12
12
 
13
- var ManagedNewsletterForm = React.lazy(() => import('../ManagedNewsletterForm-FFFF5UEX.mjs'));
13
+ var ManagedNewsletterForm = React.lazy(() => import('../ManagedNewsletterForm-4AVKTZ2A.mjs'));
14
14
  function NewsletterWidget({
15
15
  title = "Subscribe to Our Newsletter",
16
16
  description = "Get the latest posts delivered straight to your inbox.",
@@ -1,6 +1,6 @@
1
1
  'use strict';
2
2
 
3
- var chunkULGTZ2VU_js = require('../chunk-ULGTZ2VU.js');
3
+ var chunkA3NNUKFA_js = require('../chunk-A3NNUKFA.js');
4
4
  require('../chunk-HX6ZG3PP.js');
5
5
  var chunkJBGRXICL_js = require('../chunk-JBGRXICL.js');
6
6
  require('../chunk-TPL2IHFI.js');
@@ -159,8 +159,8 @@ async function ClusterLandingPage({
159
159
  /* @__PURE__ */ jsxRuntime.jsx("h2", { className: unstyled ? "" : "sk-cluster-pillar-title", children: pillar.title }),
160
160
  pillar.excerpt && /* @__PURE__ */ jsxRuntime.jsx("p", { className: unstyled ? "" : "sk-cluster-pillar-excerpt", children: pillar.excerpt }),
161
161
  /* @__PURE__ */ jsxRuntime.jsxs("div", { className: unstyled ? "" : "sk-cluster-pillar-meta", children: [
162
- chunkULGTZ2VU_js.readingTimeMinutes(pillar) && /* @__PURE__ */ jsxRuntime.jsxs("span", { children: [
163
- chunkULGTZ2VU_js.readingTimeMinutes(pillar),
162
+ chunkA3NNUKFA_js.readingTimeMinutes(pillar) && /* @__PURE__ */ jsxRuntime.jsxs("span", { children: [
163
+ chunkA3NNUKFA_js.readingTimeMinutes(pillar),
164
164
  " min read"
165
165
  ] }),
166
166
  pillar.word_count && /* @__PURE__ */ jsxRuntime.jsxs("span", { children: [
@@ -184,8 +184,8 @@ async function ClusterLandingPage({
184
184
  /* @__PURE__ */ jsxRuntime.jsx("h3", { className: unstyled ? "" : "sk-cluster-support-title", children: post.title }),
185
185
  post.excerpt && /* @__PURE__ */ jsxRuntime.jsx("p", { className: unstyled ? "" : "sk-cluster-support-excerpt", children: post.excerpt }),
186
186
  /* @__PURE__ */ jsxRuntime.jsxs("div", { className: unstyled ? "" : "sk-cluster-support-meta", children: [
187
- chunkULGTZ2VU_js.readingTimeMinutes(post) && /* @__PURE__ */ jsxRuntime.jsxs("span", { children: [
188
- chunkULGTZ2VU_js.readingTimeMinutes(post),
187
+ chunkA3NNUKFA_js.readingTimeMinutes(post) && /* @__PURE__ */ jsxRuntime.jsxs("span", { children: [
188
+ chunkA3NNUKFA_js.readingTimeMinutes(post),
189
189
  " min read"
190
190
  ] }),
191
191
  post.relationship_to_pillar && /* @__PURE__ */ jsxRuntime.jsx("span", { children: post.relationship_to_pillar })
@@ -201,39 +201,39 @@ async function ClusterLandingPage({
201
201
 
202
202
  Object.defineProperty(exports, "BlogLayout", {
203
203
  enumerable: true,
204
- get: function () { return chunkULGTZ2VU_js.BlogLayout; }
204
+ get: function () { return chunkA3NNUKFA_js.BlogLayout; }
205
205
  });
206
206
  Object.defineProperty(exports, "BlogList", {
207
207
  enumerable: true,
208
- get: function () { return chunkULGTZ2VU_js.BlogList; }
208
+ get: function () { return chunkA3NNUKFA_js.BlogList; }
209
209
  });
210
210
  Object.defineProperty(exports, "BlogPage", {
211
211
  enumerable: true,
212
- get: function () { return chunkULGTZ2VU_js.BlogPage; }
212
+ get: function () { return chunkA3NNUKFA_js.BlogPage; }
213
213
  });
214
214
  Object.defineProperty(exports, "BlogPost", {
215
215
  enumerable: true,
216
- get: function () { return chunkULGTZ2VU_js.BlogPost; }
216
+ get: function () { return chunkA3NNUKFA_js.BlogPost; }
217
217
  });
218
218
  Object.defineProperty(exports, "BlogPostPage", {
219
219
  enumerable: true,
220
- get: function () { return chunkULGTZ2VU_js.BlogPostPage; }
220
+ get: function () { return chunkA3NNUKFA_js.BlogPostPage; }
221
221
  });
222
222
  Object.defineProperty(exports, "BlogSidebar", {
223
223
  enumerable: true,
224
- get: function () { return chunkULGTZ2VU_js.BlogSidebar; }
224
+ get: function () { return chunkA3NNUKFA_js.BlogSidebar; }
225
225
  });
226
226
  Object.defineProperty(exports, "CategoryPage", {
227
227
  enumerable: true,
228
- get: function () { return chunkULGTZ2VU_js.CategoryPage; }
228
+ get: function () { return chunkA3NNUKFA_js.CategoryPage; }
229
229
  });
230
230
  Object.defineProperty(exports, "ClusterNavigation", {
231
231
  enumerable: true,
232
- get: function () { return chunkULGTZ2VU_js.ClusterNavigation; }
232
+ get: function () { return chunkA3NNUKFA_js.ClusterNavigation; }
233
233
  });
234
234
  Object.defineProperty(exports, "RelatedPosts", {
235
235
  enumerable: true,
236
- get: function () { return chunkULGTZ2VU_js.RelatedPosts; }
236
+ get: function () { return chunkA3NNUKFA_js.RelatedPosts; }
237
237
  });
238
238
  exports.ClusterLandingPage = ClusterLandingPage;
239
239
  //# sourceMappingURL=server-ui.js.map
@@ -1,5 +1,5 @@
1
- import { readingTimeMinutes } from '../chunk-YDIINUWD.mjs';
2
- export { BlogLayout, BlogList, BlogPage, BlogPost, BlogPostPage, BlogSidebar, CategoryPage, ClusterNavigation, RelatedPosts } from '../chunk-YDIINUWD.mjs';
1
+ import { readingTimeMinutes } from '../chunk-67CHHDBL.mjs';
2
+ export { BlogLayout, BlogList, BlogPage, BlogPost, BlogPostPage, BlogSidebar, CategoryPage, ClusterNavigation, RelatedPosts } from '../chunk-67CHHDBL.mjs';
3
3
  import '../chunk-YFX3Q56O.mjs';
4
4
  import { getTopicCluster } from '../chunk-DHXQBTXE.mjs';
5
5
  import '../chunk-CGCYZJYX.mjs';
@@ -15,6 +15,9 @@ export interface BlogPost {
15
15
  /** Featured image */
16
16
  featured_image?: string;
17
17
  featured_image_alt?: string;
18
+ /** Dedicated index frame from Sonor's atmosphere + content-stage renderer. */
19
+ index_image?: string;
20
+ index_image_alt?: string;
18
21
  /** Author - can be string or object depending on API response */
19
22
  author_id?: string;
20
23
  author?: BlogAuthor | string;
@@ -1 +1 @@
1
- {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/blog/types.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/blog/types.ts"],"names":[],"mappings":"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"}
@@ -67,5 +67,5 @@ function ContactTracking({ debug = false }) {
67
67
 
68
68
  exports.ContactTracking = ContactTracking;
69
69
  exports.useContactTracking = useContactTracking;
70
- //# sourceMappingURL=chunk-EDZWNCSE.js.map
71
- //# sourceMappingURL=chunk-EDZWNCSE.js.map
70
+ //# sourceMappingURL=chunk-3EPMDPWI.js.map
71
+ //# sourceMappingURL=chunk-3EPMDPWI.js.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/analytics/useContactTracking.ts"],"names":["useCallback","trackConversion","useEffect"],"mappings":"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","file":"chunk-EDZWNCSE.js","sourcesContent":["/**\n * @sonordev/site-kit/analytics - Contact Tracking Hook\n * \n * Tracks phone calls and email clicks as conversions.\n * Use this hook to automatically track tel: and mailto: links,\n * or manually track contact interactions.\n */\n\n'use client'\n\nimport { useCallback, useEffect } from 'react'\n// Deliberately the standalone dispatch bridge, NOT useAnalytics().\n//\n// SiteKitLayout mounts AnalyticsProvider as a childless deferred SIBLING of\n// the page tree (wrapping children in a dynamic ssr:false provider de-opts the\n// whole route to client rendering - see SiteKitClientProviders). That means no\n// component a site can actually place is ever inside the provider, so the hook\n// form threw \"useAnalytics must be used within an AnalyticsProvider\" and this\n// component could not be used with the documented layout at all.\n//\n// dispatch queues until the deferred provider registers itself, so calls made\n// before analytics is ready still land.\nimport { trackConversion } from './dispatch'\n\nexport interface UseContactTrackingOptions {\n /** Automatically track all tel: and mailto: links (default: true) */\n autoTrack?: boolean\n /** Debug mode - logs events to console */\n debug?: boolean\n}\n\nexport interface ContactTrackingReturn {\n /** Manually track a phone call click */\n trackPhoneClick: (phoneNumber: string, metadata?: Record<string, unknown>) => void\n /** Manually track an email click */\n trackEmailClick: (email: string, metadata?: Record<string, unknown>) => void\n}\n\n/**\n * Hook for tracking phone and email contact interactions as conversions.\n * \n * @example\n * ```tsx\n * // Auto-track all tel: and mailto: links\n * useContactTracking()\n * \n * // Manual tracking\n * const { trackPhoneClick, trackEmailClick } = useContactTracking()\n * trackPhoneClick('513-555-1234')\n * trackEmailClick('hello@example.com')\n * ```\n */\nexport function useContactTracking(options: UseContactTrackingOptions = {}): ContactTrackingReturn {\n const { autoTrack = true, debug = false } = options\n\n const trackPhoneClick = useCallback((phoneNumber: string, metadata?: Record<string, unknown>) => {\n if (debug) console.log('[Analytics] Phone click:', phoneNumber)\n \n trackConversion({\n type: 'phone_call',\n metadata: {\n phoneNumber: phoneNumber.replace(/\\D/g, ''), // Normalize to digits\n rawNumber: phoneNumber,\n ...metadata,\n },\n })\n }, [debug])\n \n const trackEmailClick = useCallback((email: string, metadata?: Record<string, unknown>) => {\n if (debug) console.log('[Analytics] Email click:', email)\n \n trackConversion({\n type: 'email_click',\n metadata: {\n email,\n ...metadata,\n },\n })\n }, [debug])\n \n // Auto-track tel: and mailto: links\n useEffect(() => {\n if (!autoTrack || typeof document === 'undefined') return\n \n const handleClick = (e: MouseEvent) => {\n const target = e.target as HTMLElement\n const anchor = target.closest('a')\n if (!anchor) return\n \n const href = anchor.getAttribute('href')\n if (!href) return\n \n if (href.startsWith('tel:')) {\n const phone = href.replace('tel:', '').trim()\n trackPhoneClick(phone, {\n linkText: anchor.textContent?.trim(),\n source: 'auto',\n })\n } else if (href.startsWith('mailto:')) {\n const email = href.replace('mailto:', '').split('?')[0].trim()\n trackEmailClick(email, {\n linkText: anchor.textContent?.trim(),\n source: 'auto',\n })\n }\n }\n \n document.addEventListener('click', handleClick, { capture: true })\n \n return () => {\n document.removeEventListener('click', handleClick, { capture: true })\n }\n }, [autoTrack, trackPhoneClick, trackEmailClick])\n \n return {\n trackPhoneClick,\n trackEmailClick,\n }\n}\n\n/**\n * Component wrapper for contact tracking\n * Simply include this component to auto-track all tel: and mailto: links\n * \n * @example\n * ```tsx\n * <ContactTracking />\n * ```\n */\nexport function ContactTracking({ debug = false }: { debug?: boolean }) {\n useContactTracking({ autoTrack: true, debug })\n return null\n}\n"]}
1
+ {"version":3,"sources":["../src/analytics/useContactTracking.ts"],"names":["useCallback","trackConversion","useEffect"],"mappings":";;;;;AAoDO,SAAS,kBAAA,CAAmB,OAAA,GAAqC,EAAC,EAA0B;AACjG,EAAA,MAAM,EAAE,SAAA,GAAY,IAAA,EAAM,KAAA,GAAQ,OAAM,GAAI,OAAA;AAE5C,EAAA,MAAM,eAAA,GAAkBA,iBAAA,CAAY,CAAC,WAAA,EAAqB,QAAA,KAAuC;AAC/F,IAAA,IAAI,KAAA,EAAO,OAAA,CAAQ,GAAA,CAAI,0BAAA,EAA4B,WAAW,CAAA;AAE9D,IAAAC,gCAAA,CAAgB;AAAA,MACd,IAAA,EAAM,YAAA;AAAA,MACN,QAAA,EAAU;AAAA,QACR,WAAA,EAAa,WAAA,CAAY,OAAA,CAAQ,KAAA,EAAO,EAAE,CAAA;AAAA;AAAA,QAC1C,SAAA,EAAW,WAAA;AAAA,QACX,GAAG;AAAA;AACL,KACD,CAAA;AAAA,EACH,CAAA,EAAG,CAAC,KAAK,CAAC,CAAA;AAEV,EAAA,MAAM,eAAA,GAAkBD,iBAAA,CAAY,CAAC,KAAA,EAAe,QAAA,KAAuC;AACzF,IAAA,IAAI,KAAA,EAAO,OAAA,CAAQ,GAAA,CAAI,0BAAA,EAA4B,KAAK,CAAA;AAExD,IAAAC,gCAAA,CAAgB;AAAA,MACd,IAAA,EAAM,aAAA;AAAA,MACN,QAAA,EAAU;AAAA,QACR,KAAA;AAAA,QACA,GAAG;AAAA;AACL,KACD,CAAA;AAAA,EACH,CAAA,EAAG,CAAC,KAAK,CAAC,CAAA;AAGV,EAAAC,eAAA,CAAU,MAAM;AACd,IAAA,IAAI,CAAC,SAAA,IAAa,OAAO,QAAA,KAAa,WAAA,EAAa;AAEnD,IAAA,MAAM,WAAA,GAAc,CAAC,CAAA,KAAkB;AACrC,MAAA,MAAM,SAAS,CAAA,CAAE,MAAA;AACjB,MAAA,MAAM,MAAA,GAAS,MAAA,CAAO,OAAA,CAAQ,GAAG,CAAA;AACjC,MAAA,IAAI,CAAC,MAAA,EAAQ;AAEb,MAAA,MAAM,IAAA,GAAO,MAAA,CAAO,YAAA,CAAa,MAAM,CAAA;AACvC,MAAA,IAAI,CAAC,IAAA,EAAM;AAEX,MAAA,IAAI,IAAA,CAAK,UAAA,CAAW,MAAM,CAAA,EAAG;AAC3B,QAAA,MAAM,QAAQ,IAAA,CAAK,OAAA,CAAQ,MAAA,EAAQ,EAAE,EAAE,IAAA,EAAK;AAC5C,QAAA,eAAA,CAAgB,KAAA,EAAO;AAAA,UACrB,QAAA,EAAU,MAAA,CAAO,WAAA,EAAa,IAAA,EAAK;AAAA,UACnC,MAAA,EAAQ;AAAA,SACT,CAAA;AAAA,MACH,CAAA,MAAA,IAAW,IAAA,CAAK,UAAA,CAAW,SAAS,CAAA,EAAG;AACrC,QAAA,MAAM,KAAA,GAAQ,IAAA,CAAK,OAAA,CAAQ,SAAA,EAAW,EAAE,CAAA,CAAE,KAAA,CAAM,GAAG,CAAA,CAAE,CAAC,CAAA,CAAE,IAAA,EAAK;AAC7D,QAAA,eAAA,CAAgB,KAAA,EAAO;AAAA,UACrB,QAAA,EAAU,MAAA,CAAO,WAAA,EAAa,IAAA,EAAK;AAAA,UACnC,MAAA,EAAQ;AAAA,SACT,CAAA;AAAA,MACH;AAAA,IACF,CAAA;AAEA,IAAA,QAAA,CAAS,iBAAiB,OAAA,EAAS,WAAA,EAAa,EAAE,OAAA,EAAS,MAAM,CAAA;AAEjE,IAAA,OAAO,MAAM;AACX,MAAA,QAAA,CAAS,oBAAoB,OAAA,EAAS,WAAA,EAAa,EAAE,OAAA,EAAS,MAAM,CAAA;AAAA,IACtE,CAAA;AAAA,EACF,CAAA,EAAG,CAAC,SAAA,EAAW,eAAA,EAAiB,eAAe,CAAC,CAAA;AAEhD,EAAA,OAAO;AAAA,IACL,eAAA;AAAA,IACA;AAAA,GACF;AACF;AAWO,SAAS,eAAA,CAAgB,EAAE,KAAA,GAAQ,KAAA,EAAM,EAAwB;AACtE,EAAA,kBAAA,CAAmB,EAAE,SAAA,EAAW,IAAA,EAAM,KAAA,EAAO,CAAA;AAC7C,EAAA,OAAO,IAAA;AACT","file":"chunk-3EPMDPWI.js","sourcesContent":["/**\n * @sonordev/site-kit/analytics - Contact Tracking Hook\n * \n * Tracks phone calls and email clicks as conversions.\n * Use this hook to automatically track tel: and mailto: links,\n * or manually track contact interactions.\n */\n\n'use client'\n\nimport { useCallback, useEffect } from 'react'\n// Deliberately the standalone dispatch bridge, NOT useAnalytics().\n//\n// SiteKitLayout mounts AnalyticsProvider as a childless deferred SIBLING of\n// the page tree (wrapping children in a dynamic ssr:false provider de-opts the\n// whole route to client rendering - see SiteKitClientProviders). That means no\n// component a site can actually place is ever inside the provider, so the hook\n// form threw \"useAnalytics must be used within an AnalyticsProvider\" and this\n// component could not be used with the documented layout at all.\n//\n// dispatch queues until the deferred provider registers itself, so calls made\n// before analytics is ready still land.\nimport { trackConversion } from './dispatch'\n\nexport interface UseContactTrackingOptions {\n /** Automatically track all tel: and mailto: links (default: true) */\n autoTrack?: boolean\n /** Debug mode - logs events to console */\n debug?: boolean\n}\n\nexport interface ContactTrackingReturn {\n /** Manually track a phone call click */\n trackPhoneClick: (phoneNumber: string, metadata?: Record<string, unknown>) => void\n /** Manually track an email click */\n trackEmailClick: (email: string, metadata?: Record<string, unknown>) => void\n}\n\n/**\n * Hook for tracking phone and email contact interactions as conversions.\n * \n * @example\n * ```tsx\n * // Auto-track all tel: and mailto: links\n * useContactTracking()\n * \n * // Manual tracking\n * const { trackPhoneClick, trackEmailClick } = useContactTracking()\n * trackPhoneClick('513-555-1234')\n * trackEmailClick('hello@example.com')\n * ```\n */\nexport function useContactTracking(options: UseContactTrackingOptions = {}): ContactTrackingReturn {\n const { autoTrack = true, debug = false } = options\n\n const trackPhoneClick = useCallback((phoneNumber: string, metadata?: Record<string, unknown>) => {\n if (debug) console.log('[Analytics] Phone click:', phoneNumber)\n \n trackConversion({\n type: 'phone_call',\n metadata: {\n phoneNumber: phoneNumber.replace(/\\D/g, ''), // Normalize to digits\n rawNumber: phoneNumber,\n ...metadata,\n },\n })\n }, [debug])\n \n const trackEmailClick = useCallback((email: string, metadata?: Record<string, unknown>) => {\n if (debug) console.log('[Analytics] Email click:', email)\n \n trackConversion({\n type: 'email_click',\n metadata: {\n email,\n ...metadata,\n },\n })\n }, [debug])\n \n // Auto-track tel: and mailto: links\n useEffect(() => {\n if (!autoTrack || typeof document === 'undefined') return\n \n const handleClick = (e: MouseEvent) => {\n const target = e.target as HTMLElement\n const anchor = target.closest('a')\n if (!anchor) return\n \n const href = anchor.getAttribute('href')\n if (!href) return\n \n if (href.startsWith('tel:')) {\n const phone = href.replace('tel:', '').trim()\n trackPhoneClick(phone, {\n linkText: anchor.textContent?.trim(),\n source: 'auto',\n })\n } else if (href.startsWith('mailto:')) {\n const email = href.replace('mailto:', '').split('?')[0].trim()\n trackEmailClick(email, {\n linkText: anchor.textContent?.trim(),\n source: 'auto',\n })\n }\n }\n \n document.addEventListener('click', handleClick, { capture: true })\n \n return () => {\n document.removeEventListener('click', handleClick, { capture: true })\n }\n }, [autoTrack, trackPhoneClick, trackEmailClick])\n \n return {\n trackPhoneClick,\n trackEmailClick,\n }\n}\n\n/**\n * Component wrapper for contact tracking\n * Simply include this component to auto-track all tel: and mailto: links\n * \n * @example\n * ```tsx\n * <ContactTracking />\n * ```\n */\nexport function ContactTracking({ debug = false }: { debug?: boolean }) {\n useContactTracking({ autoTrack: true, debug })\n return null\n}\n"]}
@@ -1,6 +1,6 @@
1
1
  'use client';
2
- import { useForm } from './chunk-KHHMU4UH.mjs';
3
- import { sonorFetch } from './chunk-F4DZH4E5.mjs';
2
+ import { useForm } from './chunk-KOP3DPIR.mjs';
3
+ import { sonorFetch } from './chunk-ZKR5AJV5.mjs';
4
4
  import { useState, useRef, useEffect, useCallback } from 'react';
5
5
  import ReactMarkdown from 'react-markdown';
6
6
  import { jsxs, jsx, Fragment } from 'react/jsx-runtime';
@@ -1605,5 +1605,5 @@ function ChatWidget({ projectId: propProjectId, config, apiUrl: propApiUrl, sign
1605
1605
  }
1606
1606
 
1607
1607
  export { ChatWidget };
1608
- //# sourceMappingURL=chunk-BAFGZQWP.mjs.map
1609
- //# sourceMappingURL=chunk-BAFGZQWP.mjs.map
1608
+ //# sourceMappingURL=chunk-42F5EK24.mjs.map
1609
+ //# sourceMappingURL=chunk-42F5EK24.mjs.map