@sonordev/site-kit 5.7.0 → 5.8.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 (604) hide show
  1. package/README.md +3 -3
  2. package/agent-manifest.json +14 -2
  3. package/dist/AnalyticsProvider-OCXRNIVE.js +33 -0
  4. package/dist/{AnalyticsProvider-GJFG7YXA.js.map → AnalyticsProvider-OCXRNIVE.js.map} +1 -1
  5. package/dist/AnalyticsProvider-ZAUONQCX.mjs +12 -0
  6. package/dist/{AnalyticsProvider-EWF7JN2X.mjs.map → AnalyticsProvider-ZAUONQCX.mjs.map} +1 -1
  7. package/dist/{BlogViewTracker-2D3IJPJK.js → BlogViewTracker-HK5C7PU6.js} +14 -11
  8. package/dist/BlogViewTracker-HK5C7PU6.js.map +1 -0
  9. package/dist/{BlogViewTracker-CKYG6MYU.mjs → BlogViewTracker-KXRZHN3U.mjs} +13 -10
  10. package/dist/BlogViewTracker-KXRZHN3U.mjs.map +1 -0
  11. package/dist/ChatWidget-3OW5LY37.js +24 -0
  12. package/dist/{ChatWidget-AWP6GBVW.js.map → ChatWidget-3OW5LY37.js.map} +1 -1
  13. package/dist/ChatWidget-54GVS27I.mjs +15 -0
  14. package/dist/{ChatWidget-Z5QXDZP3.mjs.map → ChatWidget-54GVS27I.mjs.map} +1 -1
  15. package/dist/EngageWidget-7EUP76WE.mjs +12 -0
  16. package/dist/{EngageWidget-BKEY5TPO.mjs.map → EngageWidget-7EUP76WE.mjs.map} +1 -1
  17. package/dist/EngageWidget-DDP5UFA4.js +21 -0
  18. package/dist/{EngageWidget-VT4DYXVO.js.map → EngageWidget-DDP5UFA4.js.map} +1 -1
  19. package/dist/{FileField-JJN5QKDL.mjs → FileField-IQLN6E3C.mjs} +5 -5
  20. package/dist/{FileField-JJN5QKDL.mjs.map → FileField-IQLN6E3C.mjs.map} +1 -1
  21. package/dist/{FileField-62ZWZMQK.js → FileField-SBPL4JHP.js} +6 -6
  22. package/dist/{FileField-62ZWZMQK.js.map → FileField-SBPL4JHP.js.map} +1 -1
  23. package/dist/{FormSpotlight-OTFB6QM5.mjs → FormSpotlight-E2LKKHGV.mjs} +11 -7
  24. package/dist/FormSpotlight-E2LKKHGV.mjs.map +1 -0
  25. package/dist/{FormSpotlight-URS4XRS7.js → FormSpotlight-YTACNE57.js} +25 -21
  26. package/dist/FormSpotlight-YTACNE57.js.map +1 -0
  27. package/dist/{FormStage-FVKMIV73.js → FormStage-S277U2CP.js} +20 -15
  28. package/dist/FormStage-S277U2CP.js.map +1 -0
  29. package/dist/{FormStage-VPGOCMAV.mjs → FormStage-YSBN5XKL.mjs} +9 -4
  30. package/dist/FormStage-YSBN5XKL.mjs.map +1 -0
  31. package/dist/ManagedForm-I3QVRQ53.mjs +16 -0
  32. package/dist/{ManagedForm-CXVDJMHN.mjs.map → ManagedForm-I3QVRQ53.mjs.map} +1 -1
  33. package/dist/ManagedForm-TSYKQFLJ.js +25 -0
  34. package/dist/{ManagedForm-FGNTDGED.js.map → ManagedForm-TSYKQFLJ.js.map} +1 -1
  35. package/dist/{ManagedNewsletterForm-SQYB4BZU.mjs → ManagedNewsletterForm-T3YRAWKZ.mjs} +9 -7
  36. package/dist/ManagedNewsletterForm-T3YRAWKZ.mjs.map +1 -0
  37. package/dist/{ManagedNewsletterForm-3O5L44AZ.js → ManagedNewsletterForm-YSOPPKS6.js} +10 -8
  38. package/dist/ManagedNewsletterForm-YSOPPKS6.js.map +1 -0
  39. package/dist/{SignalCore-M2PKKIGH.mjs → SignalCore-PPSIQ4BW.mjs} +8 -14
  40. package/dist/SignalCore-PPSIQ4BW.mjs.map +1 -0
  41. package/dist/{SignalCore-RFBOBNLQ.js → SignalCore-SUZH3XWZ.js} +14 -20
  42. package/dist/SignalCore-SUZH3XWZ.js.map +1 -0
  43. package/dist/SitemapSync-HSHCOKCL.mjs +9 -0
  44. package/dist/{SitemapSync-4OVMIIGC.mjs.map → SitemapSync-HSHCOKCL.mjs.map} +1 -1
  45. package/dist/SitemapSync-LH6UVP4P.js +18 -0
  46. package/dist/{SitemapSync-RK3SQ4M2.js.map → SitemapSync-LH6UVP4P.js.map} +1 -1
  47. package/dist/analytics/AnalyticsProvider.d.ts.map +1 -1
  48. package/dist/analytics/index.js +10 -9
  49. package/dist/analytics/index.mjs +5 -4
  50. package/dist/blog/BlogLayout.d.ts +3 -1
  51. package/dist/blog/BlogLayout.d.ts.map +1 -1
  52. package/dist/blog/BlogList.d.ts +7 -1
  53. package/dist/blog/BlogList.d.ts.map +1 -1
  54. package/dist/blog/BlogPost.d.ts +20 -1
  55. package/dist/blog/BlogPost.d.ts.map +1 -1
  56. package/dist/blog/BlogSidebar.d.ts +3 -1
  57. package/dist/blog/BlogSidebar.d.ts.map +1 -1
  58. package/dist/blog/BlogViewTracker.d.ts +8 -2
  59. package/dist/blog/BlogViewTracker.d.ts.map +1 -1
  60. package/dist/blog/ClusterLandingPage.d.ts +3 -1
  61. package/dist/blog/ClusterLandingPage.d.ts.map +1 -1
  62. package/dist/blog/ClusterNavigation.d.ts +5 -2
  63. package/dist/blog/ClusterNavigation.d.ts.map +1 -1
  64. package/dist/blog/RelatedPosts.d.ts +3 -1
  65. package/dist/blog/RelatedPosts.d.ts.map +1 -1
  66. package/dist/blog/index.d.ts +1 -1
  67. package/dist/blog/index.d.ts.map +1 -1
  68. package/dist/blog/index.js +40 -31
  69. package/dist/blog/index.js.map +1 -1
  70. package/dist/blog/index.mjs +11 -6
  71. package/dist/blog/index.mjs.map +1 -1
  72. package/dist/blog/not-found.test.d.ts +2 -0
  73. package/dist/blog/not-found.test.d.ts.map +1 -0
  74. package/dist/blog/processBlogHtml.d.ts +19 -2
  75. package/dist/blog/processBlogHtml.d.ts.map +1 -1
  76. package/dist/blog/public-reads.d.ts +27 -0
  77. package/dist/blog/public-reads.d.ts.map +1 -0
  78. package/dist/blog/server-core.d.ts +76 -10
  79. package/dist/blog/server-core.d.ts.map +1 -1
  80. package/dist/blog/server-ui.js +29 -23
  81. package/dist/blog/server-ui.js.map +1 -1
  82. package/dist/blog/server-ui.mjs +12 -6
  83. package/dist/blog/server-ui.mjs.map +1 -1
  84. package/dist/blog/server.d.ts +76 -10
  85. package/dist/blog/server.d.ts.map +1 -1
  86. package/dist/blog/server.js +54 -47
  87. package/dist/blog/server.mjs +5 -2
  88. package/dist/blog/site-scope.test.d.ts +2 -0
  89. package/dist/blog/site-scope.test.d.ts.map +1 -0
  90. package/dist/brand/extract-brand-profile.d.ts +36 -2
  91. package/dist/brand/extract-brand-profile.d.ts.map +1 -1
  92. package/dist/brand/extract-brand-profile.test.d.ts +2 -0
  93. package/dist/brand/extract-brand-profile.test.d.ts.map +1 -0
  94. package/dist/{chunk-3YQILJKJ.js → chunk-2FQG2AHJ.js} +60 -35
  95. package/dist/chunk-2FQG2AHJ.js.map +1 -0
  96. package/dist/{chunk-D553G64G.js → chunk-2OQWLXDO.js} +13 -13
  97. package/dist/{chunk-D553G64G.js.map → chunk-2OQWLXDO.js.map} +1 -1
  98. package/dist/{chunk-OYOO2OO5.js → chunk-2SCDUVFJ.js} +10 -10
  99. package/dist/{chunk-OYOO2OO5.js.map → chunk-2SCDUVFJ.js.map} +1 -1
  100. package/dist/{chunk-3S5JN6KL.js → chunk-35ERUUH3.js} +6 -6
  101. package/dist/{chunk-3S5JN6KL.js.map → chunk-35ERUUH3.js.map} +1 -1
  102. package/dist/{chunk-57AFHENV.mjs → chunk-3AUFD7KR.mjs} +3 -3
  103. package/dist/{chunk-57AFHENV.mjs.map → chunk-3AUFD7KR.mjs.map} +1 -1
  104. package/dist/{chunk-L7ACQ6PC.js → chunk-3BVCF4ZF.js} +4 -4
  105. package/dist/{chunk-L7ACQ6PC.js.map → chunk-3BVCF4ZF.js.map} +1 -1
  106. package/dist/{chunk-BFJOZ3MU.mjs → chunk-3EY5E35M.mjs} +36 -71
  107. package/dist/chunk-3EY5E35M.mjs.map +1 -0
  108. package/dist/{chunk-BQGEVMIR.mjs → chunk-3SLFT453.mjs} +5 -5
  109. package/dist/{chunk-BQGEVMIR.mjs.map → chunk-3SLFT453.mjs.map} +1 -1
  110. package/dist/{chunk-ILNCUSXW.mjs → chunk-4L7OHRWB.mjs} +12 -9
  111. package/dist/chunk-4L7OHRWB.mjs.map +1 -0
  112. package/dist/chunk-4LYW6PMU.mjs +72 -0
  113. package/dist/chunk-4LYW6PMU.mjs.map +1 -0
  114. package/dist/{chunk-TSZIACRC.js → chunk-4OS6M3V4.js} +6 -12
  115. package/dist/chunk-4OS6M3V4.js.map +1 -0
  116. package/dist/{chunk-YKUEFRZI.js → chunk-4RY7JETY.js} +14 -14
  117. package/dist/{chunk-YKUEFRZI.js.map → chunk-4RY7JETY.js.map} +1 -1
  118. package/dist/chunk-4TLFZ6NR.mjs +16 -0
  119. package/dist/chunk-4TLFZ6NR.mjs.map +1 -0
  120. package/dist/{chunk-4B4S56WJ.mjs → chunk-5B4J3IBX.mjs} +75 -21
  121. package/dist/chunk-5B4J3IBX.mjs.map +1 -0
  122. package/dist/chunk-5O7JSWT6.js +8 -0
  123. package/dist/{chunk-5TXXTYXL.js.map → chunk-5O7JSWT6.js.map} +1 -1
  124. package/dist/chunk-5SANRSX3.mjs +17 -0
  125. package/dist/chunk-5SANRSX3.mjs.map +1 -0
  126. package/dist/{chunk-FBDHKYNF.mjs → chunk-5WGMXSCB.mjs} +3 -3
  127. package/dist/{chunk-FBDHKYNF.mjs.map → chunk-5WGMXSCB.mjs.map} +1 -1
  128. package/dist/chunk-5XFFUP6D.js +100 -0
  129. package/dist/chunk-5XFFUP6D.js.map +1 -0
  130. package/dist/{chunk-7ZX6TO6C.mjs → chunk-6HFFTGFP.mjs} +50 -26
  131. package/dist/chunk-6HFFTGFP.mjs.map +1 -0
  132. package/dist/{chunk-R2SXXFXZ.mjs → chunk-6SBTHS6C.mjs} +3 -3
  133. package/dist/{chunk-R2SXXFXZ.mjs.map → chunk-6SBTHS6C.mjs.map} +1 -1
  134. package/dist/{chunk-FO4KGPGF.js → chunk-7TC3GRXQ.js} +73 -38
  135. package/dist/chunk-7TC3GRXQ.js.map +1 -0
  136. package/dist/{chunk-XLPU3TEE.mjs → chunk-7THZOAUR.mjs} +4 -4
  137. package/dist/{chunk-XLPU3TEE.mjs.map → chunk-7THZOAUR.mjs.map} +1 -1
  138. package/dist/{chunk-MW2M6O7A.mjs → chunk-AOWJP25J.mjs} +4 -4
  139. package/dist/{chunk-MW2M6O7A.mjs.map → chunk-AOWJP25J.mjs.map} +1 -1
  140. package/dist/{chunk-UQ5YULFU.mjs → chunk-B2VFMPVJ.mjs} +4 -4
  141. package/dist/{chunk-UQ5YULFU.mjs.map → chunk-B2VFMPVJ.mjs.map} +1 -1
  142. package/dist/{chunk-JTF4DFUF.mjs → chunk-B35OJ7FR.mjs} +4 -4
  143. package/dist/{chunk-JTF4DFUF.mjs.map → chunk-B35OJ7FR.mjs.map} +1 -1
  144. package/dist/{chunk-2N27LCZH.js → chunk-BER36QXU.js} +9 -9
  145. package/dist/{chunk-2N27LCZH.js.map → chunk-BER36QXU.js.map} +1 -1
  146. package/dist/{chunk-47XQWV4S.mjs → chunk-BFZNLTWK.mjs} +3 -3
  147. package/dist/{chunk-47XQWV4S.mjs.map → chunk-BFZNLTWK.mjs.map} +1 -1
  148. package/dist/chunk-BQP6JIE2.mjs +28 -0
  149. package/dist/chunk-BQP6JIE2.mjs.map +1 -0
  150. package/dist/{chunk-KXGD4E7G.js → chunk-C3WU45JT.js} +7 -7
  151. package/dist/{chunk-KXGD4E7G.js.map → chunk-C3WU45JT.js.map} +1 -1
  152. package/dist/chunk-CUNZAD46.js +53 -0
  153. package/dist/chunk-CUNZAD46.js.map +1 -0
  154. package/dist/chunk-CXAXZFFW.js +157 -0
  155. package/dist/chunk-CXAXZFFW.js.map +1 -0
  156. package/dist/{chunk-H4OBGC43.mjs → chunk-DA7IANFG.mjs} +14 -3
  157. package/dist/chunk-DA7IANFG.mjs.map +1 -0
  158. package/dist/{chunk-NOU3JQJK.js → chunk-EIW6YEPY.js} +8 -8
  159. package/dist/{chunk-NOU3JQJK.js.map → chunk-EIW6YEPY.js.map} +1 -1
  160. package/dist/{chunk-RCSTDJUH.js → chunk-F6SKG34N.js} +8 -13
  161. package/dist/chunk-F6SKG34N.js.map +1 -0
  162. package/dist/{chunk-LC7AM4J5.js → chunk-FHPW7XVH.js} +77 -20
  163. package/dist/chunk-FHPW7XVH.js.map +1 -0
  164. package/dist/{chunk-JNRHTZL4.js → chunk-FVW6FT6L.js} +73 -29
  165. package/dist/chunk-FVW6FT6L.js.map +1 -0
  166. package/dist/{chunk-BFM5PEFV.js → chunk-GNDWTXLU.js} +56 -177
  167. package/dist/chunk-GNDWTXLU.js.map +1 -0
  168. package/dist/{chunk-OZ3FU4BT.js → chunk-H5NBFNND.js} +2 -2
  169. package/dist/chunk-H5NBFNND.js.map +1 -0
  170. package/dist/{chunk-RNAGCAIB.js → chunk-HAKD27AZ.js} +7 -7
  171. package/dist/{chunk-RNAGCAIB.js.map → chunk-HAKD27AZ.js.map} +1 -1
  172. package/dist/chunk-HCN3IKMW.mjs +106 -0
  173. package/dist/chunk-HCN3IKMW.mjs.map +1 -0
  174. package/dist/{chunk-V5THCFPG.mjs → chunk-HCX343AS.mjs} +4 -4
  175. package/dist/{chunk-V5THCFPG.mjs.map → chunk-HCX343AS.mjs.map} +1 -1
  176. package/dist/{chunk-TDJKGN5Q.mjs → chunk-HEOQT5SM.mjs} +216 -103
  177. package/dist/chunk-HEOQT5SM.mjs.map +1 -0
  178. package/dist/{chunk-6FC5Q4KU.mjs → chunk-HOJ4J4X2.mjs} +30 -12
  179. package/dist/chunk-HOJ4J4X2.mjs.map +1 -0
  180. package/dist/{chunk-ELQ4SRRR.js → chunk-HQOHB6QF.js} +15 -15
  181. package/dist/{chunk-ELQ4SRRR.js.map → chunk-HQOHB6QF.js.map} +1 -1
  182. package/dist/chunk-HRMGITUZ.mjs +6 -0
  183. package/dist/{chunk-QRBPT6Z6.mjs.map → chunk-HRMGITUZ.mjs.map} +1 -1
  184. package/dist/{chunk-JQ7M6CVL.mjs → chunk-HYVEIP2N.mjs} +3 -3
  185. package/dist/{chunk-JQ7M6CVL.mjs.map → chunk-HYVEIP2N.mjs.map} +1 -1
  186. package/dist/{chunk-H6YVT3BL.js → chunk-I3ND4XYW.js} +12 -9
  187. package/dist/chunk-I3ND4XYW.js.map +1 -0
  188. package/dist/{chunk-4UVM7E2W.js → chunk-JDTU2RWC.js} +3 -3
  189. package/dist/{chunk-4UVM7E2W.js.map → chunk-JDTU2RWC.js.map} +1 -1
  190. package/dist/{chunk-GZJE23Y5.mjs → chunk-JLVCWC6A.mjs} +2 -2
  191. package/dist/chunk-JLVCWC6A.mjs.map +1 -0
  192. package/dist/chunk-K4TCEAUX.js +52 -0
  193. package/dist/chunk-K4TCEAUX.js.map +1 -0
  194. package/dist/chunk-KV7XXLJV.mjs +30 -0
  195. package/dist/chunk-KV7XXLJV.mjs.map +1 -0
  196. package/dist/{chunk-C563AHZZ.mjs → chunk-L24RDT6Q.mjs} +3 -3
  197. package/dist/{chunk-C563AHZZ.mjs.map → chunk-L24RDT6Q.mjs.map} +1 -1
  198. package/dist/{chunk-FEWWGEQF.js → chunk-LBZGYF3B.js} +4 -4
  199. package/dist/{chunk-FEWWGEQF.js.map → chunk-LBZGYF3B.js.map} +1 -1
  200. package/dist/{chunk-CPY74A4F.js → chunk-LMEUYRRR.js} +72 -106
  201. package/dist/chunk-LMEUYRRR.js.map +1 -0
  202. package/dist/chunk-LVGSOW2F.js +32 -0
  203. package/dist/chunk-LVGSOW2F.js.map +1 -0
  204. package/dist/{chunk-DOB37PV4.js → chunk-M45AL7EA.js} +37 -19
  205. package/dist/chunk-M45AL7EA.js.map +1 -0
  206. package/dist/{chunk-YYDZ2TYR.js → chunk-MHX6TOAS.js} +3 -3
  207. package/dist/{chunk-YYDZ2TYR.js.map → chunk-MHX6TOAS.js.map} +1 -1
  208. package/dist/chunk-MLVHVKFT.mjs +148 -0
  209. package/dist/chunk-MLVHVKFT.mjs.map +1 -0
  210. package/dist/{chunk-M5GY2AI3.mjs → chunk-N2NZBPQ5.mjs} +4 -10
  211. package/dist/chunk-N2NZBPQ5.mjs.map +1 -0
  212. package/dist/chunk-NRBITVDK.js +114 -0
  213. package/dist/chunk-NRBITVDK.js.map +1 -0
  214. package/dist/{chunk-O2VJZOR2.mjs → chunk-O4YBWJHP.mjs} +6 -11
  215. package/dist/chunk-O4YBWJHP.mjs.map +1 -0
  216. package/dist/{chunk-BUJWXSYZ.mjs → chunk-O5ZSGBQD.mjs} +4 -4
  217. package/dist/{chunk-BUJWXSYZ.mjs.map → chunk-O5ZSGBQD.mjs.map} +1 -1
  218. package/dist/{chunk-TP7H6BSK.mjs → chunk-OE7CTIOU.mjs} +73 -30
  219. package/dist/chunk-OE7CTIOU.mjs.map +1 -0
  220. package/dist/{chunk-UJ6CHZAI.mjs → chunk-OEW2LFOV.js} +169 -25
  221. package/dist/chunk-OEW2LFOV.js.map +1 -0
  222. package/dist/chunk-P4Y75QSU.js +19 -0
  223. package/dist/chunk-P4Y75QSU.js.map +1 -0
  224. package/dist/{chunk-Q7347KP6.mjs → chunk-PK2OTGW5.mjs} +6 -12
  225. package/dist/chunk-PK2OTGW5.mjs.map +1 -0
  226. package/dist/{chunk-H65OX263.js → chunk-PRTXAIIC.js} +15 -15
  227. package/dist/{chunk-H65OX263.js.map → chunk-PRTXAIIC.js.map} +1 -1
  228. package/dist/{chunk-ABZGEHTC.mjs → chunk-PUAXHYBL.mjs} +3 -3
  229. package/dist/{chunk-ABZGEHTC.mjs.map → chunk-PUAXHYBL.mjs.map} +1 -1
  230. package/dist/chunk-QRHVMTHF.mjs +94 -0
  231. package/dist/chunk-QRHVMTHF.mjs.map +1 -0
  232. package/dist/{chunk-JTCQJKJE.js → chunk-QTJTDQYR.js} +76 -111
  233. package/dist/chunk-QTJTDQYR.js.map +1 -0
  234. package/dist/{chunk-HBN4A2N4.mjs → chunk-QVHVL7EX.mjs} +3 -3
  235. package/dist/{chunk-HBN4A2N4.mjs.map → chunk-QVHVL7EX.mjs.map} +1 -1
  236. package/dist/chunk-R7GHP3FY.js +81 -0
  237. package/dist/chunk-R7GHP3FY.js.map +1 -0
  238. package/dist/{chunk-P4TB4ROG.js → chunk-SEP5D4MI.js} +8 -2
  239. package/dist/chunk-SEP5D4MI.js.map +1 -0
  240. package/dist/{chunk-3CLP35TT.mjs → chunk-TXMVU4EY.mjs} +62 -97
  241. package/dist/chunk-TXMVU4EY.mjs.map +1 -0
  242. package/dist/{chunk-L4V6TKMJ.mjs → chunk-U2V542EO.mjs} +7 -3
  243. package/dist/chunk-U2V542EO.mjs.map +1 -0
  244. package/dist/{chunk-4WBTM6YE.js → chunk-UWHCHYCX.js} +4 -4
  245. package/dist/{chunk-4WBTM6YE.js.map → chunk-UWHCHYCX.js.map} +1 -1
  246. package/dist/{chunk-JNAXDFC4.mjs → chunk-VJ74275U.mjs} +38 -156
  247. package/dist/chunk-VJ74275U.mjs.map +1 -0
  248. package/dist/{chunk-H7274TKR.mjs → chunk-VJV7WUR2.mjs} +12 -4
  249. package/dist/chunk-VJV7WUR2.mjs.map +1 -0
  250. package/dist/{chunk-4A5V73SR.mjs → chunk-VYL6IHJA.mjs} +9 -9
  251. package/dist/{chunk-4A5V73SR.mjs.map → chunk-VYL6IHJA.mjs.map} +1 -1
  252. package/dist/{chunk-5B4FABFK.js → chunk-WS7MH3GD.js} +14 -2
  253. package/dist/chunk-WS7MH3GD.js.map +1 -0
  254. package/dist/{chunk-IPV2TUAT.js → chunk-XA2GJFVM.js} +12 -4
  255. package/dist/chunk-XA2GJFVM.js.map +1 -0
  256. package/dist/chunk-XBX2K3GA.js +33 -0
  257. package/dist/chunk-XBX2K3GA.js.map +1 -0
  258. package/dist/{chunk-F3AKYZOH.js → chunk-XCYKM2SA.js} +6 -13
  259. package/dist/chunk-XCYKM2SA.js.map +1 -0
  260. package/dist/{chunk-6CJP7BFM.js → chunk-XZO5I4RS.mjs} +147 -20
  261. package/dist/chunk-XZO5I4RS.mjs.map +1 -0
  262. package/dist/chunk-Y5QZPUL3.mjs +47 -0
  263. package/dist/chunk-Y5QZPUL3.mjs.map +1 -0
  264. package/dist/{chunk-C4PZ2R3B.js → chunk-YECDJDDD.js} +10 -10
  265. package/dist/{chunk-C4PZ2R3B.js.map → chunk-YECDJDDD.js.map} +1 -1
  266. package/dist/chunk-YN7QHLWF.js +19 -0
  267. package/dist/chunk-YN7QHLWF.js.map +1 -0
  268. package/dist/chunk-YU7QZ3PP.mjs +45 -0
  269. package/dist/chunk-YU7QZ3PP.mjs.map +1 -0
  270. package/dist/{chunk-VFGEY6FJ.js → chunk-ZEOC26LZ.js} +223 -110
  271. package/dist/chunk-ZEOC26LZ.js.map +1 -0
  272. package/dist/{chunk-RVRN5U7W.mjs → chunk-ZVI7MBVF.mjs} +73 -38
  273. package/dist/chunk-ZVI7MBVF.mjs.map +1 -0
  274. package/dist/cli/agent/checks.d.ts +15 -1
  275. package/dist/cli/agent/checks.d.ts.map +1 -1
  276. package/dist/cli/agent/sitemap-trailing-slash.test.d.ts +2 -0
  277. package/dist/cli/agent/sitemap-trailing-slash.test.d.ts.map +1 -0
  278. package/dist/cli/commands/doctor.d.ts.map +1 -1
  279. package/dist/cli/commands/og.d.ts +26 -8
  280. package/dist/cli/commands/og.d.ts.map +1 -1
  281. package/dist/cli/index.js +683 -322
  282. package/dist/cli/index.js.map +1 -1
  283. package/dist/cli/index.mjs +604 -243
  284. package/dist/cli/index.mjs.map +1 -1
  285. package/dist/client/index.js +6 -6
  286. package/dist/client/index.mjs +5 -5
  287. package/dist/commerce/CheckoutForm.d.ts.map +1 -1
  288. package/dist/commerce/ProductDetail.d.ts.map +1 -1
  289. package/dist/commerce/api.d.ts +14 -0
  290. package/dist/commerce/api.d.ts.map +1 -1
  291. package/dist/commerce/discount-checkout.test.d.ts +2 -0
  292. package/dist/commerce/discount-checkout.test.d.ts.map +1 -0
  293. package/dist/commerce/index.d.ts +1 -1
  294. package/dist/commerce/index.d.ts.map +1 -1
  295. package/dist/commerce/index.js +61 -56
  296. package/dist/commerce/index.mjs +6 -5
  297. package/dist/config/index.js +3 -3
  298. package/dist/config/index.mjs +1 -1
  299. package/dist/discover-CYXYKHZ2.mjs +4 -0
  300. package/dist/{discover-FGTKWOL3.mjs.map → discover-CYXYKHZ2.mjs.map} +1 -1
  301. package/dist/discover-NGEPXZOD.js +21 -0
  302. package/dist/{discover-NJZPWTDL.js.map → discover-NGEPXZOD.js.map} +1 -1
  303. package/dist/engage/index.js +12 -10
  304. package/dist/engage/index.js.map +1 -1
  305. package/dist/engage/index.mjs +9 -7
  306. package/dist/engage/index.mjs.map +1 -1
  307. package/dist/fleet/index.js +8 -8
  308. package/dist/fleet/index.mjs +4 -4
  309. package/dist/forms/FormClient.d.ts.map +1 -1
  310. package/dist/forms/FormField.d.ts +7 -1
  311. package/dist/forms/FormField.d.ts.map +1 -1
  312. package/dist/forms/FormSpotlight.d.ts +1 -1
  313. package/dist/forms/FormSpotlight.d.ts.map +1 -1
  314. package/dist/forms/FormStage.d.ts +1 -1
  315. package/dist/forms/FormStage.d.ts.map +1 -1
  316. package/dist/forms/experience-plan.d.ts +0 -1
  317. package/dist/forms/experience-plan.d.ts.map +1 -1
  318. package/dist/forms/field-interactions.d.ts +63 -0
  319. package/dist/forms/field-interactions.d.ts.map +1 -0
  320. package/dist/forms/field-interactions.test.d.ts +8 -0
  321. package/dist/forms/field-interactions.test.d.ts.map +1 -0
  322. package/dist/forms/field-rules.d.ts +41 -0
  323. package/dist/forms/field-rules.d.ts.map +1 -0
  324. package/dist/forms/field-rules.test.d.ts +8 -0
  325. package/dist/forms/field-rules.test.d.ts.map +1 -0
  326. package/dist/forms/form-field-focus.test.d.ts +8 -0
  327. package/dist/forms/form-field-focus.test.d.ts.map +1 -0
  328. package/dist/forms/index.js +25 -23
  329. package/dist/forms/index.js.map +1 -1
  330. package/dist/forms/index.mjs +13 -11
  331. package/dist/forms/index.mjs.map +1 -1
  332. package/dist/forms/server.js +11 -11
  333. package/dist/forms/server.mjs +9 -9
  334. package/dist/forms/static.js +8 -8
  335. package/dist/forms/static.mjs +7 -7
  336. package/dist/forms/tracking-session.d.ts +48 -3
  337. package/dist/forms/tracking-session.d.ts.map +1 -1
  338. package/dist/forms/types.d.ts +11 -0
  339. package/dist/forms/types.d.ts.map +1 -1
  340. package/dist/forms/useForm.d.ts +8 -0
  341. package/dist/forms/useForm.d.ts.map +1 -1
  342. package/dist/forms/useFormTracking.d.ts +29 -4
  343. package/dist/forms/useFormTracking.d.ts.map +1 -1
  344. package/dist/images/index.js +11 -11
  345. package/dist/images/index.mjs +4 -4
  346. package/dist/index.js +72 -68
  347. package/dist/index.js.map +1 -1
  348. package/dist/index.mjs +14 -10
  349. package/dist/index.mjs.map +1 -1
  350. package/dist/layout/client.js +10 -10
  351. package/dist/layout/client.mjs +9 -9
  352. package/dist/layout/index.js +13 -12
  353. package/dist/layout/index.js.map +1 -1
  354. package/dist/layout/index.mjs +11 -10
  355. package/dist/layout/index.mjs.map +1 -1
  356. package/dist/llms/aiRobots.d.ts +20 -4
  357. package/dist/llms/aiRobots.d.ts.map +1 -1
  358. package/dist/llms/api.d.ts +8 -3
  359. package/dist/llms/api.d.ts.map +1 -1
  360. package/dist/llms/discovery-headers.d.ts +24 -0
  361. package/dist/llms/discovery-headers.d.ts.map +1 -1
  362. package/dist/llms/generateLLMsTxt.d.ts.map +1 -1
  363. package/dist/llms/index.d.ts +2 -2
  364. package/dist/llms/index.d.ts.map +1 -1
  365. package/dist/llms/index.js +45 -96
  366. package/dist/llms/index.js.map +1 -1
  367. package/dist/llms/index.mjs +11 -81
  368. package/dist/llms/index.mjs.map +1 -1
  369. package/dist/llms/links.d.ts +26 -0
  370. package/dist/llms/links.d.ts.map +1 -0
  371. package/dist/llms/links.test.d.ts +2 -0
  372. package/dist/llms/links.test.d.ts.map +1 -0
  373. package/dist/llms/types.d.ts +15 -0
  374. package/dist/llms/types.d.ts.map +1 -1
  375. package/dist/llms/wiring.d.ts +22 -0
  376. package/dist/llms/wiring.d.ts.map +1 -1
  377. package/dist/llms/writeLLMsTxt.d.ts +9 -0
  378. package/dist/llms/writeLLMsTxt.d.ts.map +1 -1
  379. package/dist/maps/index.js +5 -5
  380. package/dist/maps/index.mjs +3 -3
  381. package/dist/motion/gsap.d.ts +54 -0
  382. package/dist/motion/gsap.d.ts.map +1 -1
  383. package/dist/motion/gsap.js +34 -4
  384. package/dist/motion/gsap.js.map +1 -1
  385. package/dist/motion/gsap.mjs +33 -5
  386. package/dist/motion/gsap.mjs.map +1 -1
  387. package/dist/motion/gsap.test.d.ts +2 -0
  388. package/dist/motion/gsap.test.d.ts.map +1 -0
  389. package/dist/og/config.d.ts +6 -0
  390. package/dist/og/config.d.ts.map +1 -1
  391. package/dist/og/contrast.d.ts +33 -0
  392. package/dist/og/contrast.d.ts.map +1 -0
  393. package/dist/og/index.d.ts +2 -0
  394. package/dist/og/index.d.ts.map +1 -1
  395. package/dist/og/index.js +26 -8
  396. package/dist/og/index.mjs +3 -1
  397. package/dist/og/pages.d.ts +101 -0
  398. package/dist/og/pages.d.ts.map +1 -1
  399. package/dist/og/route-copy.d.ts +34 -0
  400. package/dist/og/route-copy.d.ts.map +1 -0
  401. package/dist/og/route-fit.d.ts +77 -0
  402. package/dist/og/route-fit.d.ts.map +1 -0
  403. package/dist/og/route.d.ts +80 -20
  404. package/dist/og/route.d.ts.map +1 -1
  405. package/dist/og/route.js +195 -25
  406. package/dist/og/route.js.map +1 -1
  407. package/dist/og/route.mjs +193 -26
  408. package/dist/og/route.mjs.map +1 -1
  409. package/dist/og/route.test.d.ts +2 -0
  410. package/dist/og/route.test.d.ts.map +1 -0
  411. package/dist/og/template.d.ts.map +1 -1
  412. package/dist/og/wiring.d.ts +43 -3
  413. package/dist/og/wiring.d.ts.map +1 -1
  414. package/dist/proxy/index.d.ts.map +1 -1
  415. package/dist/proxy/index.js +15 -10
  416. package/dist/proxy/index.js.map +1 -1
  417. package/dist/proxy/index.mjs +12 -7
  418. package/dist/proxy/index.mjs.map +1 -1
  419. package/dist/proxy/llms-discovery.test.d.ts +2 -0
  420. package/dist/proxy/llms-discovery.test.d.ts.map +1 -0
  421. package/dist/redirects/index.d.ts +24 -0
  422. package/dist/redirects/index.d.ts.map +1 -1
  423. package/dist/redirects/index.js +11 -8
  424. package/dist/redirects/index.mjs +4 -1
  425. package/dist/redirects/index.test.d.ts +2 -0
  426. package/dist/redirects/index.test.d.ts.map +1 -0
  427. package/dist/redirects/not-found.js +8 -5
  428. package/dist/redirects/not-found.js.map +1 -1
  429. package/dist/redirects/not-found.mjs +4 -1
  430. package/dist/redirects/not-found.mjs.map +1 -1
  431. package/dist/robots/index.d.ts +2 -0
  432. package/dist/robots/index.d.ts.map +1 -1
  433. package/dist/robots/index.js +23 -3
  434. package/dist/robots/index.js.map +1 -1
  435. package/dist/robots/index.mjs +2 -2
  436. package/dist/robots/index.mjs.map +1 -1
  437. package/dist/search/index.js +4 -4
  438. package/dist/search/index.mjs +3 -3
  439. package/dist/seo/ManagedContent.d.ts +4 -2
  440. package/dist/seo/ManagedContent.d.ts.map +1 -1
  441. package/dist/seo/ManagedFAQ.d.ts.map +1 -1
  442. package/dist/seo/ManagedInternalLinks.d.ts.map +1 -1
  443. package/dist/seo/ManagedSchema.d.ts.map +1 -1
  444. package/dist/seo/client.js +6 -6
  445. package/dist/seo/client.mjs +5 -5
  446. package/dist/seo/getManagedMetadata.d.ts.map +1 -1
  447. package/dist/seo/getManagedMetadata.test.d.ts +2 -0
  448. package/dist/seo/getManagedMetadata.test.d.ts.map +1 -0
  449. package/dist/seo/index.js +59 -49
  450. package/dist/seo/index.js.map +1 -1
  451. package/dist/seo/index.mjs +29 -19
  452. package/dist/seo/index.mjs.map +1 -1
  453. package/dist/seo/managed-schema-filter.test.d.ts +2 -0
  454. package/dist/seo/managed-schema-filter.test.d.ts.map +1 -0
  455. package/dist/seo/register-sitemap-cli-impl.d.ts +32 -0
  456. package/dist/seo/register-sitemap-cli-impl.d.ts.map +1 -1
  457. package/dist/seo/register-sitemap-cli.d.ts +7 -0
  458. package/dist/seo/register-sitemap-cli.d.ts.map +1 -1
  459. package/dist/seo/register-sitemap-cli.js +273 -56
  460. package/dist/seo/register-sitemap-cli.js.map +1 -1
  461. package/dist/seo/register-sitemap-cli.mjs +269 -52
  462. package/dist/seo/register-sitemap-cli.mjs.map +1 -1
  463. package/dist/seo/register-sitemap-request.d.ts +36 -0
  464. package/dist/seo/register-sitemap-request.d.ts.map +1 -0
  465. package/dist/seo/register-sitemap-request.test.d.ts +2 -0
  466. package/dist/seo/register-sitemap-request.test.d.ts.map +1 -0
  467. package/dist/seo/routing.d.ts +2 -0
  468. package/dist/seo/routing.d.ts.map +1 -1
  469. package/dist/seo/schema-filter.d.ts +43 -0
  470. package/dist/seo/schema-filter.d.ts.map +1 -0
  471. package/dist/seo/schema-filter.test.d.ts +2 -0
  472. package/dist/seo/schema-filter.test.d.ts.map +1 -0
  473. package/dist/seo/server-api.d.ts +15 -2
  474. package/dist/seo/server-api.d.ts.map +1 -1
  475. package/dist/seo/server.js +23 -18
  476. package/dist/seo/server.mjs +7 -2
  477. package/dist/seo/site-scope.test.d.ts +2 -0
  478. package/dist/seo/site-scope.test.d.ts.map +1 -0
  479. package/dist/seo/types.d.ts +30 -0
  480. package/dist/seo/types.d.ts.map +1 -1
  481. package/dist/seo-meta/contract.d.ts +60 -0
  482. package/dist/seo-meta/contract.d.ts.map +1 -0
  483. package/dist/seo-meta/contract.js +41 -0
  484. package/dist/seo-meta/contract.js.map +1 -0
  485. package/dist/seo-meta/contract.mjs +4 -0
  486. package/dist/seo-meta/contract.mjs.map +1 -0
  487. package/dist/seo-meta/contract.test.d.ts +2 -0
  488. package/dist/seo-meta/contract.test.d.ts.map +1 -0
  489. package/dist/server/index.js +4 -3
  490. package/dist/server/index.mjs +3 -2
  491. package/dist/server/mint-site-token.d.ts +2 -32
  492. package/dist/server/mint-site-token.d.ts.map +1 -1
  493. package/dist/{server-api-RG3ZL3DV.mjs → server-api-A2EFCTZX.mjs} +7 -3
  494. package/dist/{server-api-RG3ZL3DV.mjs.map → server-api-A2EFCTZX.mjs.map} +1 -1
  495. package/dist/{server-api-RYJQAUGO.js → server-api-IWTZ7C3O.js} +25 -21
  496. package/dist/{server-api-RYJQAUGO.js.map → server-api-IWTZ7C3O.js.map} +1 -1
  497. package/dist/shared/build-entries.d.ts +2 -0
  498. package/dist/shared/build-entries.d.ts.map +1 -1
  499. package/dist/shared/fresh-fetch.d.ts +64 -0
  500. package/dist/shared/fresh-fetch.d.ts.map +1 -0
  501. package/dist/shared/fresh-fetch.test.d.ts +2 -0
  502. package/dist/shared/fresh-fetch.test.d.ts.map +1 -0
  503. package/dist/shared/next-files.d.ts +7 -0
  504. package/dist/shared/next-files.d.ts.map +1 -1
  505. package/dist/shared/page-leave.d.ts +27 -0
  506. package/dist/shared/page-leave.d.ts.map +1 -0
  507. package/dist/shared/page-leave.test.d.ts +2 -0
  508. package/dist/shared/page-leave.test.d.ts.map +1 -0
  509. package/dist/shared/source-graph.d.ts +63 -0
  510. package/dist/shared/source-graph.d.ts.map +1 -0
  511. package/dist/shared/source-graph.test.d.ts +2 -0
  512. package/dist/shared/source-graph.test.d.ts.map +1 -0
  513. package/dist/shared/version.d.ts +1 -1
  514. package/dist/signal/SignalCore.d.ts.map +1 -1
  515. package/dist/signal/index.js +11 -11
  516. package/dist/signal/index.mjs +2 -2
  517. package/dist/sitemap/index.d.ts +19 -4
  518. package/dist/sitemap/index.d.ts.map +1 -1
  519. package/dist/sitemap/index.js +53 -43
  520. package/dist/sitemap/index.js.map +1 -1
  521. package/dist/sitemap/index.mjs +37 -27
  522. package/dist/sitemap/index.mjs.map +1 -1
  523. package/dist/sitemap/shared.d.ts +65 -0
  524. package/dist/sitemap/shared.d.ts.map +1 -1
  525. package/dist/sitemap/trailing-slash.test.d.ts +2 -0
  526. package/dist/sitemap/trailing-slash.test.d.ts.map +1 -0
  527. package/dist/sites/resolve.d.ts.map +1 -1
  528. package/dist/sites/site-param.d.ts +16 -0
  529. package/dist/sites/site-param.d.ts.map +1 -0
  530. package/dist/sync/index.js +17 -17
  531. package/dist/sync/index.mjs +4 -4
  532. package/dist/writeLLMsTxt-CQ7A4AAL.js +20 -0
  533. package/dist/writeLLMsTxt-CQ7A4AAL.js.map +1 -0
  534. package/dist/writeLLMsTxt-NX5MSPYX.mjs +11 -0
  535. package/dist/writeLLMsTxt-NX5MSPYX.mjs.map +1 -0
  536. package/package.json +8 -3
  537. package/dist/AnalyticsProvider-EWF7JN2X.mjs +0 -11
  538. package/dist/AnalyticsProvider-GJFG7YXA.js +0 -32
  539. package/dist/BlogViewTracker-2D3IJPJK.js.map +0 -1
  540. package/dist/BlogViewTracker-CKYG6MYU.mjs.map +0 -1
  541. package/dist/ChatWidget-AWP6GBVW.js +0 -22
  542. package/dist/ChatWidget-Z5QXDZP3.mjs +0 -13
  543. package/dist/EngageWidget-BKEY5TPO.mjs +0 -12
  544. package/dist/EngageWidget-VT4DYXVO.js +0 -21
  545. package/dist/FormSpotlight-OTFB6QM5.mjs.map +0 -1
  546. package/dist/FormSpotlight-URS4XRS7.js.map +0 -1
  547. package/dist/FormStage-FVKMIV73.js.map +0 -1
  548. package/dist/FormStage-VPGOCMAV.mjs.map +0 -1
  549. package/dist/ManagedForm-CXVDJMHN.mjs +0 -14
  550. package/dist/ManagedForm-FGNTDGED.js +0 -23
  551. package/dist/ManagedNewsletterForm-3O5L44AZ.js.map +0 -1
  552. package/dist/ManagedNewsletterForm-SQYB4BZU.mjs.map +0 -1
  553. package/dist/SignalCore-M2PKKIGH.mjs.map +0 -1
  554. package/dist/SignalCore-RFBOBNLQ.js.map +0 -1
  555. package/dist/SitemapSync-4OVMIIGC.mjs +0 -9
  556. package/dist/SitemapSync-RK3SQ4M2.js +0 -18
  557. package/dist/chunk-3CLP35TT.mjs.map +0 -1
  558. package/dist/chunk-3UC6JETG.js +0 -32
  559. package/dist/chunk-3UC6JETG.js.map +0 -1
  560. package/dist/chunk-3YQILJKJ.js.map +0 -1
  561. package/dist/chunk-4B4S56WJ.mjs.map +0 -1
  562. package/dist/chunk-5B4FABFK.js.map +0 -1
  563. package/dist/chunk-5TXXTYXL.js +0 -8
  564. package/dist/chunk-6CJP7BFM.js.map +0 -1
  565. package/dist/chunk-6FC5Q4KU.mjs.map +0 -1
  566. package/dist/chunk-7ZX6TO6C.mjs.map +0 -1
  567. package/dist/chunk-AWK57R5S.mjs +0 -29
  568. package/dist/chunk-AWK57R5S.mjs.map +0 -1
  569. package/dist/chunk-BFJOZ3MU.mjs.map +0 -1
  570. package/dist/chunk-BFM5PEFV.js.map +0 -1
  571. package/dist/chunk-CPY74A4F.js.map +0 -1
  572. package/dist/chunk-DOB37PV4.js.map +0 -1
  573. package/dist/chunk-F3AKYZOH.js.map +0 -1
  574. package/dist/chunk-FO4KGPGF.js.map +0 -1
  575. package/dist/chunk-GZJE23Y5.mjs.map +0 -1
  576. package/dist/chunk-H4OBGC43.mjs.map +0 -1
  577. package/dist/chunk-H6YVT3BL.js.map +0 -1
  578. package/dist/chunk-H7274TKR.mjs.map +0 -1
  579. package/dist/chunk-ILNCUSXW.mjs.map +0 -1
  580. package/dist/chunk-IPV2TUAT.js.map +0 -1
  581. package/dist/chunk-JEOKDUPQ.js +0 -45
  582. package/dist/chunk-JEOKDUPQ.js.map +0 -1
  583. package/dist/chunk-JNAXDFC4.mjs.map +0 -1
  584. package/dist/chunk-JNRHTZL4.js.map +0 -1
  585. package/dist/chunk-JTCQJKJE.js.map +0 -1
  586. package/dist/chunk-L4V6TKMJ.mjs.map +0 -1
  587. package/dist/chunk-LC7AM4J5.js.map +0 -1
  588. package/dist/chunk-M5GY2AI3.mjs.map +0 -1
  589. package/dist/chunk-O2VJZOR2.mjs.map +0 -1
  590. package/dist/chunk-OZ3FU4BT.js.map +0 -1
  591. package/dist/chunk-P4TB4ROG.js.map +0 -1
  592. package/dist/chunk-Q7347KP6.mjs.map +0 -1
  593. package/dist/chunk-QJU6HBSK.mjs +0 -39
  594. package/dist/chunk-QJU6HBSK.mjs.map +0 -1
  595. package/dist/chunk-QRBPT6Z6.mjs +0 -6
  596. package/dist/chunk-RCSTDJUH.js.map +0 -1
  597. package/dist/chunk-RVRN5U7W.mjs.map +0 -1
  598. package/dist/chunk-TDJKGN5Q.mjs.map +0 -1
  599. package/dist/chunk-TP7H6BSK.mjs.map +0 -1
  600. package/dist/chunk-TSZIACRC.js.map +0 -1
  601. package/dist/chunk-UJ6CHZAI.mjs.map +0 -1
  602. package/dist/chunk-VFGEY6FJ.js.map +0 -1
  603. package/dist/discover-FGTKWOL3.mjs +0 -4
  604. package/dist/discover-NJZPWTDL.js +0 -21
@@ -0,0 +1,157 @@
1
+ 'use strict';
2
+
3
+ // src/seo-meta/contract.ts
4
+ var SEO_META_CONTRACT_VERSION = 1;
5
+ var TITLE_SEPARATOR = " | ";
6
+ var DANGLING_TAIL = /[|,\-–—:;·•]\s*$/;
7
+ var TRAILING_FUNCTION_WORD = /\s(?:for|of|and|or|in|on|at|to|with|from|by|a|an|the|your|our|that|&)$/i;
8
+ var MIN_HOST_FRAGMENT = 8;
9
+ var MIN_NAME_LETTERS = 6;
10
+ var lettersOf = (s) => s.toLowerCase().replace(/[^a-z0-9]+/g, "");
11
+ var wordsOf = (s) => ` ${s.toLowerCase().replace(/[^a-z0-9]+/g, " ").trim()} `;
12
+ function metaHost(value) {
13
+ if (!value || typeof value !== "string" || /\s/.test(value.trim())) return null;
14
+ const s = value.trim().toLowerCase().replace(/^[a-z][a-z0-9+.-]*:\/\//, "").split(/[/?#]/)[0].split(":")[0].replace(/\.+$/, "").replace(/^www\./, "");
15
+ return s.includes(".") ? s : null;
16
+ }
17
+ function hostsOf(id) {
18
+ const out = /* @__PURE__ */ new Set();
19
+ for (const h of id.hosts ?? []) {
20
+ const host = metaHost(h);
21
+ if (host) out.add(host);
22
+ }
23
+ return [...out];
24
+ }
25
+ function labelsOf(id) {
26
+ return hostsOf(id).map((h) => lettersOf(h.split(".")[0])).filter((l) => l.length >= MIN_NAME_LETTERS);
27
+ }
28
+ function brandCore(name) {
29
+ let s = name.replace(/^the\s+/i, "").trim();
30
+ let prev;
31
+ do {
32
+ prev = s;
33
+ s = s.replace(/[\s,]+(?:apartments|apts|llc|inc|co|corp|ltd|company)\.?$/i, "").trim();
34
+ } while (s !== prev);
35
+ return s;
36
+ }
37
+ function brandVariants(id) {
38
+ const out = [];
39
+ for (const raw of [id.brand, ...id.brandAliases ?? []]) {
40
+ const name = typeof raw === "string" ? raw.replace(/\s+/g, " ").trim() : "";
41
+ if (!name) continue;
42
+ out.push(name);
43
+ const core = brandCore(name);
44
+ if (core && core !== name) out.push(core);
45
+ }
46
+ return out;
47
+ }
48
+ function nameVariants(id) {
49
+ return brandVariants(id).filter((v) => metaHost(v) === null);
50
+ }
51
+ function namesBrand(text, id) {
52
+ const words = wordsOf(text);
53
+ return brandVariants(id).some((v) => wordsOf(v).trim() !== "" && words.includes(wordsOf(v)));
54
+ }
55
+ function titleSuffix(title) {
56
+ const t = title.trim();
57
+ const i = t.lastIndexOf(TITLE_SEPARATOR);
58
+ return i > 0 ? t.slice(i + TITLE_SEPARATOR.length).trim() : null;
59
+ }
60
+ function stripTitleSuffix(title) {
61
+ const t = title.trim();
62
+ const i = t.lastIndexOf(TITLE_SEPARATOR);
63
+ return i > 0 ? t.slice(0, i).trim() : t;
64
+ }
65
+ function namesHost(text, id) {
66
+ const lower = text.toLowerCase();
67
+ const brands = brandVariants(id).map((b) => b.toLowerCase());
68
+ return hostsOf(id).some((host) => lower.includes(host) && !brands.some((b) => b.includes(host)));
69
+ }
70
+ function endsOnTruncatedHost(text, id) {
71
+ const tokens = text.trim().split(/[\s|,()[\]]+/);
72
+ const last = (tokens[tokens.length - 1] ?? "").replace(/^[^a-z0-9]+/i, "");
73
+ if (!last || last !== last.toLowerCase()) return false;
74
+ const stem = lettersOf(last.split(".")[0]);
75
+ return stem.length >= MIN_HOST_FRAGMENT && labelsOf(id).some((l) => l.startsWith(stem));
76
+ }
77
+ function occurrences(hay, needle, step = needle.length) {
78
+ let n = 0;
79
+ for (let i = hay.indexOf(needle); i !== -1; i = hay.indexOf(needle, i + step)) n++;
80
+ return n;
81
+ }
82
+ function respellsBrand(text, id) {
83
+ const letters = lettersOf(text);
84
+ const words = wordsOf(text);
85
+ return nameVariants(id).some((v) => {
86
+ const vl = lettersOf(v);
87
+ if (vl.length < MIN_NAME_LETTERS) return false;
88
+ const vw = wordsOf(v);
89
+ return occurrences(letters, vl) > occurrences(words, vw, vw.length - 1);
90
+ });
91
+ }
92
+ function gluesHostLabel(text, id) {
93
+ const variants = nameVariants(id);
94
+ if (!variants.length) return false;
95
+ const labels = labelsOf(id);
96
+ return text.split(/[\s|,()[\]:;]+/).some((token) => {
97
+ const tl = lettersOf(token);
98
+ return tl.length >= MIN_NAME_LETTERS && labels.includes(tl) && !variants.some((v) => wordsOf(v).includes(wordsOf(token)));
99
+ });
100
+ }
101
+ function suffixProblem(suffix, id) {
102
+ const s = suffix.trim();
103
+ if (!s) return null;
104
+ if (namesHost(s, id) || endsOnTruncatedHost(s, id)) return "hostname";
105
+ const variants = nameVariants(id);
106
+ if (!variants.length) return null;
107
+ if (respellsBrand(s, id) || gluesHostLabel(s, id)) return "mangled-brand";
108
+ if (/\s/.test(s)) return null;
109
+ const sl = lettersOf(s);
110
+ const fromLabel = sl.length >= MIN_NAME_LETTERS && labelsOf(id).some((l) => l.startsWith(sl));
111
+ const sw = wordsOf(brandCore(s));
112
+ const isBrand = variants.some((v) => {
113
+ const vw = wordsOf(brandCore(v));
114
+ return vw.startsWith(sw) || sw.startsWith(vw);
115
+ });
116
+ return fromLabel && !isBrand ? "mangled-brand" : null;
117
+ }
118
+ function isPlaceholder(title, path) {
119
+ const t = title.trim();
120
+ if (!path) return false;
121
+ const strip = (s) => s.replace(/\/+$/, "") || "/";
122
+ if (t.startsWith("/") && strip(t.toLowerCase()) === strip(path.trim().toLowerCase())) return true;
123
+ return strip(path.trim()) === "/" && /^(home|index|untitled)$/i.test(t);
124
+ }
125
+ function titleProblem(title, id, opts = {}) {
126
+ const t = (title ?? "").trim();
127
+ if (!t) return "empty";
128
+ if (isPlaceholder(t, opts.path)) return "placeholder";
129
+ if (DANGLING_TAIL.test(t)) return "dangling-separator";
130
+ if (namesHost(t, id) || endsOnTruncatedHost(t, id)) return "hostname";
131
+ const suffix = titleSuffix(t);
132
+ if (suffix !== null) {
133
+ const problem = suffixProblem(suffix, id);
134
+ if (problem) return problem;
135
+ }
136
+ if (respellsBrand(t, id) || gluesHostLabel(t, id)) return "mangled-brand";
137
+ return null;
138
+ }
139
+ function descriptionProblem(description, id) {
140
+ const d = (description ?? "").trim();
141
+ if (!d) return "empty";
142
+ if (namesHost(d, id)) return "hostname";
143
+ if (respellsBrand(d, id) || gluesHostLabel(d, id)) return "mangled-brand";
144
+ if (DANGLING_TAIL.test(d) || TRAILING_FUNCTION_WORD.test(d)) return "truncated";
145
+ return null;
146
+ }
147
+
148
+ exports.SEO_META_CONTRACT_VERSION = SEO_META_CONTRACT_VERSION;
149
+ exports.descriptionProblem = descriptionProblem;
150
+ exports.metaHost = metaHost;
151
+ exports.namesBrand = namesBrand;
152
+ exports.stripTitleSuffix = stripTitleSuffix;
153
+ exports.suffixProblem = suffixProblem;
154
+ exports.titleProblem = titleProblem;
155
+ exports.titleSuffix = titleSuffix;
156
+ //# sourceMappingURL=chunk-CXAXZFFW.js.map
157
+ //# sourceMappingURL=chunk-CXAXZFFW.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/seo-meta/contract.ts"],"names":[],"mappings":"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","file":"chunk-CXAXZFFW.js","sourcesContent":["/**\n * @sonordev/site-kit/seo-meta/contract — generated title/description quality contract (v1)\n *\n * Single source of truth for \"is this machine-generated seo_pages.managed_title\n * / managed_meta_description fit to ship?\". Same pattern as the other site-kit\n * contracts: site-kit owns the canonical logic and applies it at render time\n * (getManagedMetadata falls back to the page's own title/description), and\n * signal-api keeps a byte-identical inline mirror\n * (`src/shared/utils/seo-meta-quality.util.ts`) that gates every generated\n * title before it is written. The shared drift vectors in `contract.test.ts`\n * and the mirror's spec fail on divergence.\n *\n * Why it exists (2026-09-15): Signal's meta generator used the raw domain as\n * the brand whenever it could not resolve one, so ~500 managed titles across\n * 20+ projects shipped as \"Apartments for Rent | abbeyglenapts.com\", were\n * hard-cut at 60 chars (\"… | reinhartheatingandcooli\"), lost the suffix to a\n * word-boundary cut (\"Contact Reinhart Heating and Cooling |\"), or had the\n * model rebuild a brand out of the domain (\"About SSO Shkosh Apartments | SSO\n * Shkosh\" for ssoshkoshapts.com — the brand is SS Oshkosh Apartments). Sites\n * rendered them verbatim.\n *\n * Every rule derives from the site's own identity (its hosts and brand), so\n * there is no list of bad strings to maintain. Pure string logic — no I/O, no\n * Node built-ins.\n */\n\n/** Bump on breaking changes to what counts as a problem. */\nexport const SEO_META_CONTRACT_VERSION = 1 as const\n\n/** Who the site is. Hosts come from the project/site config, the brand from the resolved business name — never from the domain. */\nexport interface MetaIdentity {\n /** The site's brand, e.g. \"SS Oshkosh Apartments\". */\n brand?: string | null\n /** Other correct spellings of the brand. */\n brandAliases?: Array<string | null | undefined>\n /** Hosts the site answers on, in any spelling (URL, www, port). */\n hosts?: Array<string | null | undefined>\n}\n\nexport type TitleProblem = 'empty' | 'placeholder' | 'dangling-separator' | 'hostname' | 'mangled-brand'\nexport type DescriptionProblem = 'empty' | 'hostname' | 'mangled-brand' | 'truncated'\nexport type SuffixProblem = 'hostname' | 'mangled-brand'\n\nconst TITLE_SEPARATOR = ' | '\n/** A title or description must never end on a separator. */\nconst DANGLING_TAIL = /[|,\\-–—:;·•]\\s*$/\n/** A description ending on one of these was cut mid-sentence (\"…Tall Pines, Westbrooke, and\"). */\nconst TRAILING_FUNCTION_WORD = /\\s(?:for|of|and|or|in|on|at|to|with|from|by|a|an|the|your|our|that|&)$/i\n/** A leaked-host fragment shorter than this is too likely to be an ordinary word. */\nconst MIN_HOST_FRAGMENT = 8\n/** Names shorter than this (letters only) can't be told apart from ordinary words. */\nconst MIN_NAME_LETTERS = 6\n\nconst lettersOf = (s: string) => s.toLowerCase().replace(/[^a-z0-9]+/g, '')\nconst wordsOf = (s: string) => ` ${s.toLowerCase().replace(/[^a-z0-9]+/g, ' ').trim()} `\n\n/** \"https://www.AbbeyGlenApts.com:443/x\" → \"abbeyglenapts.com\". Null for anything that isn't a host (no dot, or words). */\nexport function metaHost(value: string | null | undefined): string | null {\n if (!value || typeof value !== 'string' || /\\s/.test(value.trim())) return null\n const s = value\n .trim()\n .toLowerCase()\n .replace(/^[a-z][a-z0-9+.-]*:\\/\\//, '')\n .split(/[/?#]/)[0]\n .split(':')[0]\n .replace(/\\.+$/, '')\n .replace(/^www\\./, '')\n return s.includes('.') ? s : null\n}\n\nfunction hostsOf(id: MetaIdentity): string[] {\n const out = new Set<string>()\n for (const h of id.hosts ?? []) {\n const host = metaHost(h)\n if (host) out.add(host)\n }\n return [...out]\n}\n\n/** First DNS label with punctuation removed: \"reinhartheatingandcooling.com\" → \"reinhartheatingandcooling\". */\nfunction labelsOf(id: MetaIdentity): string[] {\n return hostsOf(id)\n .map((h) => lettersOf(h.split('.')[0]))\n .filter((l) => l.length >= MIN_NAME_LETTERS)\n}\n\n/** \"The Gateway Flats\" → \"Gateway Flats\", \"Moore Canine Co., LLC\" → \"Moore Canine\". */\nfunction brandCore(name: string): string {\n let s = name.replace(/^the\\s+/i, '').trim()\n let prev: string\n do {\n prev = s\n s = s.replace(/[\\s,]+(?:apartments|apts|llc|inc|co|corp|ltd|company)\\.?$/i, '').trim()\n } while (s !== prev)\n return s\n}\n\n/** The brand, its aliases, and the core of each — every spelling a title may legitimately use. */\nfunction brandVariants(id: MetaIdentity): string[] {\n const out: string[] = []\n for (const raw of [id.brand, ...(id.brandAliases ?? [])]) {\n const name = typeof raw === 'string' ? raw.replace(/\\s+/g, ' ').trim() : ''\n if (!name) continue\n out.push(name)\n const core = brandCore(name)\n if (core && core !== name) out.push(core)\n }\n return out\n}\n\n/**\n * Brand spellings that are names, not domains. A project titled with its\n * domain (\"proinnovationsllc.com\") still vouches for that domain appearing in a\n * title, but it can't say how the brand is spelled, so \"| Pro Innovations\" is\n * not a respelling of it.\n */\nfunction nameVariants(id: MetaIdentity): string[] {\n return brandVariants(id).filter((v) => metaHost(v) === null)\n}\n\n/** True when the text names the brand (an alias, or either one's core) word for word. */\nexport function namesBrand(text: string, id: MetaIdentity): boolean {\n const words = wordsOf(text)\n return brandVariants(id).some((v) => wordsOf(v).trim() !== '' && words.includes(wordsOf(v)))\n}\n\n/** Everything after the last \" | \", or null when the title has no suffix. */\nexport function titleSuffix(title: string): string | null {\n const t = title.trim()\n const i = t.lastIndexOf(TITLE_SEPARATOR)\n return i > 0 ? t.slice(i + TITLE_SEPARATOR.length).trim() : null\n}\n\n/** Everything before the last \" | \". */\nexport function stripTitleSuffix(title: string): string {\n const t = title.trim()\n const i = t.lastIndexOf(TITLE_SEPARATOR)\n return i > 0 ? t.slice(0, i).trim() : t\n}\n\n/** The site's full host appears (\"… | abbeyglenapts.com\"). A brand that IS a domain (\"RamseyDeal.com\") may name it. */\nfunction namesHost(text: string, id: MetaIdentity): boolean {\n const lower = text.toLowerCase()\n const brands = brandVariants(id).map((b) => b.toLowerCase())\n return hostsOf(id).some((host) => lower.includes(host) && !brands.some((b) => b.includes(host)))\n}\n\n/**\n * The text ends on a hard-cut host: \"… | reinhartheatingandcooli\",\n * \"… | greenbayapartmentrentals.c\". Only the last token, and only when it is\n * written in lowercase like a host — \"… | Celebrity\" is a word, not a host.\n */\nfunction endsOnTruncatedHost(text: string, id: MetaIdentity): boolean {\n const tokens = text.trim().split(/[\\s|,()[\\]]+/)\n const last = (tokens[tokens.length - 1] ?? '').replace(/^[^a-z0-9]+/i, '')\n if (!last || last !== last.toLowerCase()) return false\n const stem = lettersOf(last.split('.')[0])\n return stem.length >= MIN_HOST_FRAGMENT && labelsOf(id).some((l) => l.startsWith(stem))\n}\n\n/** Occurrences of `needle` in `hay`, resuming `step` chars after each match (default: no overlap). */\nfunction occurrences(hay: string, needle: string, step = needle.length): number {\n let n = 0\n for (let i = hay.indexOf(needle); i !== -1; i = hay.indexOf(needle, i + step)) n++\n return n\n}\n\n/**\n * The brand's letters appear more often than its words: \"SSO Shkosh\" for \"SS\n * Oshkosh\", \"Moore Canine Collc\". Counted, not just tested, so a correctly\n * spelled suffix can't vouch for a respelled lead (\"About SSO Shkosh\n * Apartments | SS Oshkosh Apartments\").\n */\nfunction respellsBrand(text: string, id: MetaIdentity): boolean {\n const letters = lettersOf(text)\n const words = wordsOf(text)\n return nameVariants(id).some((v) => {\n const vl = lettersOf(v)\n if (vl.length < MIN_NAME_LETTERS) return false\n // Word matches are space-padded; resume on the trailing space so two\n // adjacent occurrences can share it.\n const vw = wordsOf(v)\n return occurrences(letters, vl) > occurrences(words, vw, vw.length - 1)\n })\n}\n\n/** A word glued from the host label that isn't how the brand is written: \"TallPinesGB\", \"Westbrookegb\". */\nfunction gluesHostLabel(text: string, id: MetaIdentity): boolean {\n const variants = nameVariants(id)\n if (!variants.length) return false\n const labels = labelsOf(id)\n return text.split(/[\\s|,()[\\]:;]+/).some((token) => {\n const tl = lettersOf(token)\n return (\n tl.length >= MIN_NAME_LETTERS &&\n labels.includes(tl) &&\n !variants.some((v) => wordsOf(v).includes(wordsOf(token)))\n )\n })\n}\n\n/**\n * Why a title's brand suffix (the part after the last \" | \") can't ship, or\n * null when it can. Exposed so a generator can replace a bad suffix with the\n * real brand instead of discarding the whole title.\n */\nexport function suffixProblem(suffix: string, id: MetaIdentity): SuffixProblem | null {\n const s = suffix.trim()\n if (!s) return null\n if (namesHost(s, id) || endsOnTruncatedHost(s, id)) return 'hostname'\n const variants = nameVariants(id)\n if (!variants.length) return null\n if (respellsBrand(s, id) || gluesHostLabel(s, id)) return 'mangled-brand'\n // One glued token spelled from the host label rather than the brand:\n // \"TruePower\" for True Power Systems (truepowersystems.com). Spaced words\n // that read the label (\"Legacy Clay Classic\" for legacyclayclassic.org) are\n // a name, and a whole-word shortening of the brand (\"Celebrity\" for\n // Celebrity Closet Guys, \"The Gateway Flats\" for Gateway Flats) is the brand.\n if (/\\s/.test(s)) return null\n const sl = lettersOf(s)\n const fromLabel = sl.length >= MIN_NAME_LETTERS && labelsOf(id).some((l) => l.startsWith(sl))\n const sw = wordsOf(brandCore(s))\n const isBrand = variants.some((v) => {\n const vw = wordsOf(brandCore(v))\n return vw.startsWith(sw) || sw.startsWith(vw)\n })\n return fromLabel && !isBrand ? 'mangled-brand' : null\n}\n\nfunction isPlaceholder(title: string, path?: string | null): boolean {\n const t = title.trim()\n if (!path) return false\n const strip = (s: string) => s.replace(/\\/+$/, '') || '/'\n if (t.startsWith('/') && strip(t.toLowerCase()) === strip(path.trim().toLowerCase())) return true\n return strip(path.trim()) === '/' && /^(home|index|untitled)$/i.test(t)\n}\n\n/** Why a managed title can't ship, or null when it can. */\nexport function titleProblem(\n title: string | null | undefined,\n id: MetaIdentity,\n opts: { path?: string | null } = {},\n): TitleProblem | null {\n const t = (title ?? '').trim()\n if (!t) return 'empty'\n if (isPlaceholder(t, opts.path)) return 'placeholder'\n if (DANGLING_TAIL.test(t)) return 'dangling-separator'\n if (namesHost(t, id) || endsOnTruncatedHost(t, id)) return 'hostname'\n const suffix = titleSuffix(t)\n if (suffix !== null) {\n const problem = suffixProblem(suffix, id)\n if (problem) return problem\n }\n if (respellsBrand(t, id) || gluesHostLabel(t, id)) return 'mangled-brand'\n return null\n}\n\n/** Why a managed meta description can't ship, or null when it can. */\nexport function descriptionProblem(\n description: string | null | undefined,\n id: MetaIdentity,\n): DescriptionProblem | null {\n const d = (description ?? '').trim()\n if (!d) return 'empty'\n if (namesHost(d, id)) return 'hostname'\n if (respellsBrand(d, id) || gluesHostLabel(d, id)) return 'mangled-brand'\n if (DANGLING_TAIL.test(d) || TRAILING_FUNCTION_WORD.test(d)) return 'truncated'\n return null\n}\n"]}
@@ -20,7 +20,18 @@ function buildAiDiscoveryHeaders(options) {
20
20
  Link: segments.join(", ")
21
21
  };
22
22
  }
23
+ function wantsLlmsDiscoveryLink(req) {
24
+ const method = req.method.toUpperCase();
25
+ if (method !== "GET" && method !== "HEAD") return false;
26
+ if (req.rsc) return false;
27
+ if (req.pathname === "/api" || req.pathname.startsWith("/api/")) return false;
28
+ const last = req.pathname.slice(req.pathname.lastIndexOf("/") + 1);
29
+ if (last.includes(".") && !/\.html?$/i.test(last)) return false;
30
+ const accept = req.accept?.trim();
31
+ if (!accept) return true;
32
+ return /text\/html|application\/xhtml\+xml|\*\/\*/i.test(accept);
33
+ }
23
34
 
24
- export { buildAiDiscoveryHeaders };
25
- //# sourceMappingURL=chunk-H4OBGC43.mjs.map
26
- //# sourceMappingURL=chunk-H4OBGC43.mjs.map
35
+ export { buildAiDiscoveryHeaders, wantsLlmsDiscoveryLink };
36
+ //# sourceMappingURL=chunk-DA7IANFG.mjs.map
37
+ //# sourceMappingURL=chunk-DA7IANFG.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/llms/discovery-headers.ts"],"names":[],"mappings":";AAKA,IAAM,aAAA,GAAgB,wBAAA;AAGtB,SAAS,aAAa,GAAA,EAA4B;AAChD,EAAA,IAAI,CAAC,UAAA,CAAW,IAAA,CAAK,GAAG,GAAG,OAAO,IAAA;AAClC,EAAA,OAAO,GAAA;AACT;AA2BO,SAAS,wBAAwB,OAAA,EAA4D;AAClG,EAAA,MAAM,IAAA,GAAO,OAAA,CAAQ,OAAA,CAAQ,OAAA,CAAQ,OAAO,EAAE,CAAA;AAC9C,EAAA,MAAM,IAAA,GAAO,QAAQ,QAAA,IAAY,WAAA;AACjC,EAAA,MAAM,eAAe,IAAA,CAAK,UAAA,CAAW,GAAG,CAAA,GAAI,IAAA,GAAO,IAAI,IAAI,CAAA,CAAA;AAC3D,EAAA,MAAM,OAAA,GAAU,CAAA,EAAG,IAAI,CAAA,EAAG,YAAY,CAAA,CAAA;AACtC,EAAA,MAAM,IAAA,GAAO,OAAA,CAAQ,oBAAA,KAAyB,KAAA,GAAQ,EAAA,GAAK,aAAA;AAE3D,EAAA,MAAM,WAAqB,CAAC,CAAA,CAAA,EAAI,OAAO,CAAA,oBAAA,EAAuB,IAAI,CAAA,CAAE,CAAA;AAEpE,EAAA,KAAA,MAAW,GAAA,IAAO,OAAA,CAAQ,kBAAA,IAAsB,EAAC,EAAG;AAClD,IAAA,MAAM,EAAA,GAAK,YAAA,CAAa,GAAA,CAAI,QAAQ,CAAA;AACpC,IAAA,IAAI,CAAC,EAAA,IAAM,CAAC,GAAA,CAAI,IAAA,EAAM;AACtB,IAAA,QAAA,CAAS,IAAA,CAAK,IAAI,GAAA,CAAI,IAAI,iCAAiC,EAAE,CAAA,CAAA,EAAI,IAAI,CAAA,CAAE,CAAA;AAAA,EACzE;AAEA,EAAA,OAAO;AAAA,IACL,IAAA,EAAM,QAAA,CAAS,IAAA,CAAK,IAAI;AAAA,GAC1B;AACF;AA0BO,SAAS,uBAAuB,GAAA,EAAgC;AACrE,EAAA,MAAM,MAAA,GAAS,GAAA,CAAI,MAAA,CAAO,WAAA,EAAY;AACtC,EAAA,IAAI,MAAA,KAAW,KAAA,IAAS,MAAA,KAAW,MAAA,EAAQ,OAAO,KAAA;AAClD,EAAA,IAAI,GAAA,CAAI,KAAK,OAAO,KAAA;AACpB,EAAA,IAAI,GAAA,CAAI,aAAa,MAAA,IAAU,GAAA,CAAI,SAAS,UAAA,CAAW,OAAO,GAAG,OAAO,KAAA;AACxE,EAAA,MAAM,IAAA,GAAO,IAAI,QAAA,CAAS,KAAA,CAAM,IAAI,QAAA,CAAS,WAAA,CAAY,GAAG,CAAA,GAAI,CAAC,CAAA;AACjE,EAAA,IAAI,IAAA,CAAK,SAAS,GAAG,CAAA,IAAK,CAAC,WAAA,CAAY,IAAA,CAAK,IAAI,CAAA,EAAG,OAAO,KAAA;AAC1D,EAAA,MAAM,MAAA,GAAS,GAAA,CAAI,MAAA,EAAQ,IAAA,EAAK;AAChC,EAAA,IAAI,CAAC,QAAQ,OAAO,IAAA;AACpB,EAAA,OAAO,4CAAA,CAA6C,KAAK,MAAM,CAAA;AACjE","file":"chunk-DA7IANFG.mjs","sourcesContent":["/**\n * Opt-in HTTP headers linking HTML documents to /llms.txt for crawler discovery.\n * `rel=\"describedby\"` is IANA-registered (RFC 8288).\n */\n\nconst TYPE_MARKDOWN = '; type=\"text/markdown\"'\n\n/** Safe subset for `hreflang` (BCP 47 tags, no quotes/semicolons). */\nfunction safeHreflang(tag: string): string | null {\n if (!/^[\\w-]+$/.test(tag)) return null\n return tag\n}\n\nexport interface LlmsLanguageAlternate {\n /** BCP 47 tag, e.g. `fr` or `en-US` */\n hreflang: string\n /** Absolute URL to that locale’s llms.txt (or equivalent) */\n href: string\n}\n\nexport interface AiDiscoveryHeadersOptions {\n /** Canonical site origin, e.g. https://example.com (no trailing slash) */\n siteUrl: string\n /** Path to llms.txt (default `/llms.txt`) */\n llmsPath?: string\n /**\n * When true (default), append `type=\"text/markdown\"` on Link targets so crawlers\n * can treat the resource as markdown text.\n */\n includeTypeParameter?: boolean\n /** Optional `rel=\"alternate\"` links for multilingual llms.txt (or per-locale equivalents). */\n languageAlternates?: LlmsLanguageAlternate[]\n}\n\n/**\n * Returns header map suitable for Next.js `headers()` merge.\n * Prefer this over visible footer links for machine-facing discovery.\n */\nexport function buildAiDiscoveryHeaders(options: AiDiscoveryHeadersOptions): Record<string, string> {\n const base = options.siteUrl.replace(/\\/$/, '')\n const path = options.llmsPath || '/llms.txt'\n const resolvedPath = path.startsWith('/') ? path : `/${path}`\n const llmsUrl = `${base}${resolvedPath}`\n const type = options.includeTypeParameter === false ? '' : TYPE_MARKDOWN\n\n const segments: string[] = [`<${llmsUrl}>; rel=\"describedby\"${type}`]\n\n for (const alt of options.languageAlternates ?? []) {\n const hl = safeHreflang(alt.hreflang)\n if (!hl || !alt.href) continue\n segments.push(`<${alt.href}>; rel=\"alternate\"; hreflang=\"${hl}\"${type}`)\n }\n\n return {\n Link: segments.join(', '),\n }\n}\n\nexport interface DiscoveryRequest {\n method: string\n pathname: string\n /** The Accept header, or null when the request sent none. */\n accept: string | null\n /** Next's `RSC` request header: a client-side navigation payload, not a page. */\n rsc?: string | null\n}\n\n/**\n * Does this request get the `Link: rel=\"describedby\"` discovery header?\n *\n * Any request that could be for an HTML page. It used to take only requests\n * whose Accept header named text/html or `*` + `/*`, which skipped every\n * request that sends no Accept header at all: curl, link checkers, and a good\n * share of crawlers and AI fetchers, which are exactly who the header is for.\n * A missing Accept header means \"anything\", so it counts (RFC 9110 §12.5.1).\n *\n * Skipped: methods other than GET and HEAD; an Accept header that names\n * types but no HTML (`application/json`, `image/*`); file-like paths\n * (`/llms.txt`, `/sitemap.xml`, `/feed.xml`: a `.` in the last segment,\n * except `.html`); `/api/` routes; and Next's RSC navigation requests.\n * Static assets never reach the proxy (its matcher excludes them).\n */\nexport function wantsLlmsDiscoveryLink(req: DiscoveryRequest): boolean {\n const method = req.method.toUpperCase()\n if (method !== 'GET' && method !== 'HEAD') return false\n if (req.rsc) return false\n if (req.pathname === '/api' || req.pathname.startsWith('/api/')) return false\n const last = req.pathname.slice(req.pathname.lastIndexOf('/') + 1)\n if (last.includes('.') && !/\\.html?$/i.test(last)) return false\n const accept = req.accept?.trim()\n if (!accept) return true\n return /text\\/html|application\\/xhtml\\+xml|\\*\\/\\*/i.test(accept)\n}\n"]}
@@ -1,7 +1,7 @@
1
1
  'use client';
2
2
  'use strict';
3
3
 
4
- var chunkYYDZ2TYR_js = require('./chunk-YYDZ2TYR.js');
4
+ var chunkMHX6TOAS_js = require('./chunk-MHX6TOAS.js');
5
5
  var React = require('react');
6
6
  var jsxRuntime = require('react/jsx-runtime');
7
7
 
@@ -16,8 +16,8 @@ function SignalExperiment({
16
16
  trackImpression = true,
17
17
  children
18
18
  }) {
19
- const { assignment, variant, isControl } = chunkYYDZ2TYR_js.useSignalExperiment(experimentId);
20
- const trackEvent = chunkYYDZ2TYR_js.useSignalEvent();
19
+ const { assignment, variant, isControl } = chunkMHX6TOAS_js.useSignalExperiment(experimentId);
20
+ const trackEvent = chunkMHX6TOAS_js.useSignalEvent();
21
21
  React.useEffect(() => {
22
22
  if (trackImpression && variant) {
23
23
  trackEvent({
@@ -44,7 +44,7 @@ function SignalExperiment({
44
44
  return /* @__PURE__ */ jsxRuntime.jsx(jsxRuntime.Fragment, { children: variants.control || null });
45
45
  }
46
46
  function useExperimentVariant(experimentId) {
47
- return chunkYYDZ2TYR_js.useSignalExperiment(experimentId);
47
+ return chunkMHX6TOAS_js.useSignalExperiment(experimentId);
48
48
  }
49
49
  function ExperimentConversion({
50
50
  experimentId,
@@ -52,8 +52,8 @@ function ExperimentConversion({
52
52
  value,
53
53
  children
54
54
  }) {
55
- const trackEvent = chunkYYDZ2TYR_js.useSignalEvent();
56
- const { variant } = chunkYYDZ2TYR_js.useSignalExperiment(experimentId);
55
+ const trackEvent = chunkMHX6TOAS_js.useSignalEvent();
56
+ const { variant } = chunkMHX6TOAS_js.useSignalExperiment(experimentId);
57
57
  const handleInteraction = () => {
58
58
  trackEvent({
59
59
  event_type: "experiment",
@@ -79,5 +79,5 @@ function ExperimentConversion({
79
79
  exports.ExperimentConversion = ExperimentConversion;
80
80
  exports.SignalExperiment = SignalExperiment;
81
81
  exports.useExperimentVariant = useExperimentVariant;
82
- //# sourceMappingURL=chunk-NOU3JQJK.js.map
83
- //# sourceMappingURL=chunk-NOU3JQJK.js.map
82
+ //# sourceMappingURL=chunk-EIW6YEPY.js.map
83
+ //# sourceMappingURL=chunk-EIW6YEPY.js.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/signal/SignalExperiment.tsx"],"names":["useSignalExperiment","useSignalEvent","useEffect","jsx","Fragment","React"],"mappings":";;;;;;;;;;AAgDO,SAAS,gBAAA,CAAiB;AAAA,EAC/B,YAAA;AAAA,EACA,QAAA;AAAA,EACA,QAAA;AAAA,EACA,eAAA,GAAkB,IAAA;AAAA,EAClB;AACF,CAAA,EAA0B;AACxB,EAAA,MAAM,EAAE,UAAA,EAAY,OAAA,EAAS,SAAA,EAAU,GAAIA,qCAAoB,YAAY,CAAA;AAC3E,EAAA,MAAM,aAAaC,+BAAA,EAAe;AAGlC,EAAAC,eAAA,CAAU,MAAM;AACd,IAAA,IAAI,mBAAmB,OAAA,EAAS;AAC9B,MAAA,UAAA,CAAW;AAAA,QACT,UAAA,EAAY,YAAA;AAAA,QACZ,UAAA,EAAY,YAAA;AAAA,QACZ,UAAA,EAAY;AAAA,UACV,aAAA,EAAe,YAAA;AAAA,UACf,WAAA,EAAa;AAAA;AACf,OACD,CAAA;AAAA,IACH;AAAA,EACF,GAAG,CAAC,YAAA,EAAc,OAAA,EAAS,eAAA,EAAiB,UAAU,CAAC,CAAA;AAGvD,EAAA,IAAI,QAAA,EAAU;AACZ,IAAA,uBAAOC,cAAA,CAAAC,mBAAA,EAAA,EAAG,mBAAS,EAAE,OAAA,EAAS,WAAW,SAAA,EAAW,SAAA,EAAW,CAAA,EAAE,CAAA;AAAA,EACnE;AAGA,EAAA,MAAM,kBAAkB,OAAA,IAAW,SAAA;AACnC,EAAA,MAAM,OAAA,GAAU,SAAS,eAAe,CAAA;AAExC,EAAA,IAAI,YAAY,MAAA,EAAW;AACzB,IAAA,6DAAU,QAAA,EAAA,OAAA,EAAQ,CAAA;AAAA,EACpB;AAGA,EAAA,IAAI,QAAA,EAAU;AACZ,IAAA,6DAAU,QAAA,EAAA,QAAA,EAAS,CAAA;AAAA,EACrB;AAEA,EAAA,uBAAOD,cAAA,CAAAC,mBAAA,EAAA,EAAG,QAAA,EAAA,QAAA,CAAS,OAAA,IAAW,IAAA,EAAK,CAAA;AACrC;AAYO,SAAS,qBAAqB,YAAA,EAAsB;AACzD,EAAA,OAAOJ,qCAAoB,YAAY,CAAA;AACzC;AAoBO,SAAS,oBAAA,CAAqB;AAAA,EACnC,YAAA;AAAA,EACA,WAAA,GAAc,OAAA;AAAA,EACd,KAAA;AAAA,EACA;AACF,CAAA,EAKG;AACD,EAAA,MAAM,aAAaC,+BAAA,EAAe;AAClC,EAAA,MAAM,EAAE,OAAA,EAAQ,GAAID,oCAAA,CAAoB,YAAY,CAAA;AAEpD,EAAA,MAAM,oBAAoB,MAAM;AAC9B,IAAA,UAAA,CAAW;AAAA,MACT,UAAA,EAAY,YAAA;AAAA,MACZ,UAAA,EAAY,YAAA;AAAA,MACZ,UAAA,EAAY;AAAA,QACV,aAAA,EAAe,YAAA;AAAA,QACf,WAAA,EAAa,OAAA;AAAA,QACb,YAAA,EAAc,WAAA;AAAA,QACd;AAAA;AACF,KACD,CAAA;AAAA,EACH,CAAA;AAEA,EAAA,OAAOK,sBAAA,CAAM,aAAa,QAAA,EAAU;AAAA,IAClC,OAAA,EAAS,CAAC,CAAA,KAAwB;AAChC,MAAA,iBAAA,EAAkB;AAElB,MAAA,IAAK,QAAA,CAAS,MAAsD,OAAA,EAAS;AAC3E,QAAC,QAAA,CAAS,KAAA,CAAsD,OAAA,CAAS,CAAC,CAAA;AAAA,MAC5E;AAAA,IACF;AAAA,GACD,CAAA;AACH","file":"chunk-NOU3JQJK.js","sourcesContent":["/**\n * @sonordev/site-kit/signal - SignalExperiment\n * \n * A/B test component that renders different variants based on Signal assignment.\n * Uses Thompson Sampling (Bayesian bandit) for optimization.\n */\n\n'use client'\n\nimport React, { useMemo, useEffect } from 'react'\nimport { useSignalExperiment, useSignalEvent } from './SignalBridge'\n\ninterface SignalExperimentProps {\n /** Unique experiment ID */\n experimentId: string\n \n /** Variants to test - keys are variant names, values are React nodes */\n variants: Record<string, React.ReactNode>\n \n /** Fallback content if no assignment (defaults to 'control' variant) */\n fallback?: React.ReactNode\n \n /** Track impression automatically */\n trackImpression?: boolean\n \n /** Children function for more control */\n children?: (props: { variant: string; isControl: boolean }) => React.ReactNode\n}\n\n/**\n * Renders different content variants based on Signal's A/B assignment.\n * \n * @example\n * // Simple variant switching\n * <SignalExperiment experimentId=\"hero-cta\" variants={{\n * control: <Button>Get Started</Button>,\n * variant_a: <Button variant=\"primary\">Start Free Trial</Button>,\n * variant_b: <Button variant=\"secondary\">Book a Demo</Button>,\n * }} />\n * \n * @example\n * // With render prop for more control\n * <SignalExperiment experimentId=\"pricing-layout\">\n * {({ variant, isControl }) => (\n * <PricingSection layout={isControl ? 'cards' : 'table'} />\n * )}\n * </SignalExperiment>\n */\nexport function SignalExperiment({\n experimentId,\n variants,\n fallback,\n trackImpression = true,\n children,\n}: SignalExperimentProps) {\n const { assignment, variant, isControl } = useSignalExperiment(experimentId)\n const trackEvent = useSignalEvent()\n \n // Track impression when variant is rendered\n useEffect(() => {\n if (trackImpression && variant) {\n trackEvent({\n event_type: 'experiment',\n event_name: 'impression',\n event_data: {\n experiment_id: experimentId,\n variant_key: variant,\n },\n })\n }\n }, [experimentId, variant, trackImpression, trackEvent])\n \n // If using render prop\n if (children) {\n return <>{children({ variant: variant || 'control', isControl })}</>\n }\n \n // Determine what to render\n const selectedVariant = variant || 'control'\n const content = variants[selectedVariant]\n \n if (content !== undefined) {\n return <>{content}</>\n }\n \n // Fallback to provided fallback or control\n if (fallback) {\n return <>{fallback}</>\n }\n \n return <>{variants.control || null}</>\n}\n\n/**\n * Hook for conditional experiment logic\n * \n * @example\n * const { variant, isControl } = useExperimentVariant('pricing-test')\n * \n * return isControl \n * ? <OldPricing />\n * : <NewPricing showAnnual={variant === 'annual_first'} />\n */\nexport function useExperimentVariant(experimentId: string) {\n return useSignalExperiment(experimentId)\n}\n\n/**\n * Component for tracking experiment conversions\n * Wraps interactive elements to track when they convert\n * \n * @example\n * <SignalExperiment experimentId=\"signup-button\" variants={{\n * control: (\n * <ExperimentConversion experimentId=\"signup-button\" outcomeType=\"click\">\n * <Button>Sign Up</Button>\n * </ExperimentConversion>\n * ),\n * variant_a: (\n * <ExperimentConversion experimentId=\"signup-button\" outcomeType=\"click\">\n * <Button variant=\"large\">Join Now - It's Free!</Button>\n * </ExperimentConversion>\n * ),\n * }} />\n */\nexport function ExperimentConversion({\n experimentId,\n outcomeType = 'click',\n value,\n children,\n}: {\n experimentId: string\n outcomeType?: string\n value?: number\n children: React.ReactElement<{ onClick?: (e: React.MouseEvent) => void }>\n}) {\n const trackEvent = useSignalEvent()\n const { variant } = useSignalExperiment(experimentId)\n\n const handleInteraction = () => {\n trackEvent({\n event_type: 'experiment',\n event_name: 'conversion',\n event_data: {\n experiment_id: experimentId,\n variant_key: variant,\n outcome_type: outcomeType,\n value,\n },\n })\n }\n\n return React.cloneElement(children, {\n onClick: (e: React.MouseEvent) => {\n handleInteraction()\n // Call original onClick if exists\n if ((children.props as { onClick?: (e: React.MouseEvent) => void }).onClick) {\n (children.props as { onClick?: (e: React.MouseEvent) => void }).onClick!(e)\n }\n },\n })\n}\n"]}
1
+ {"version":3,"sources":["../src/signal/SignalExperiment.tsx"],"names":["useSignalExperiment","useSignalEvent","useEffect","jsx","Fragment","React"],"mappings":";;;;;;;;;;AAgDO,SAAS,gBAAA,CAAiB;AAAA,EAC/B,YAAA;AAAA,EACA,QAAA;AAAA,EACA,QAAA;AAAA,EACA,eAAA,GAAkB,IAAA;AAAA,EAClB;AACF,CAAA,EAA0B;AACxB,EAAA,MAAM,EAAE,UAAA,EAAY,OAAA,EAAS,SAAA,EAAU,GAAIA,qCAAoB,YAAY,CAAA;AAC3E,EAAA,MAAM,aAAaC,+BAAA,EAAe;AAGlC,EAAAC,eAAA,CAAU,MAAM;AACd,IAAA,IAAI,mBAAmB,OAAA,EAAS;AAC9B,MAAA,UAAA,CAAW;AAAA,QACT,UAAA,EAAY,YAAA;AAAA,QACZ,UAAA,EAAY,YAAA;AAAA,QACZ,UAAA,EAAY;AAAA,UACV,aAAA,EAAe,YAAA;AAAA,UACf,WAAA,EAAa;AAAA;AACf,OACD,CAAA;AAAA,IACH;AAAA,EACF,GAAG,CAAC,YAAA,EAAc,OAAA,EAAS,eAAA,EAAiB,UAAU,CAAC,CAAA;AAGvD,EAAA,IAAI,QAAA,EAAU;AACZ,IAAA,uBAAOC,cAAA,CAAAC,mBAAA,EAAA,EAAG,mBAAS,EAAE,OAAA,EAAS,WAAW,SAAA,EAAW,SAAA,EAAW,CAAA,EAAE,CAAA;AAAA,EACnE;AAGA,EAAA,MAAM,kBAAkB,OAAA,IAAW,SAAA;AACnC,EAAA,MAAM,OAAA,GAAU,SAAS,eAAe,CAAA;AAExC,EAAA,IAAI,YAAY,MAAA,EAAW;AACzB,IAAA,6DAAU,QAAA,EAAA,OAAA,EAAQ,CAAA;AAAA,EACpB;AAGA,EAAA,IAAI,QAAA,EAAU;AACZ,IAAA,6DAAU,QAAA,EAAA,QAAA,EAAS,CAAA;AAAA,EACrB;AAEA,EAAA,uBAAOD,cAAA,CAAAC,mBAAA,EAAA,EAAG,QAAA,EAAA,QAAA,CAAS,OAAA,IAAW,IAAA,EAAK,CAAA;AACrC;AAYO,SAAS,qBAAqB,YAAA,EAAsB;AACzD,EAAA,OAAOJ,qCAAoB,YAAY,CAAA;AACzC;AAoBO,SAAS,oBAAA,CAAqB;AAAA,EACnC,YAAA;AAAA,EACA,WAAA,GAAc,OAAA;AAAA,EACd,KAAA;AAAA,EACA;AACF,CAAA,EAKG;AACD,EAAA,MAAM,aAAaC,+BAAA,EAAe;AAClC,EAAA,MAAM,EAAE,OAAA,EAAQ,GAAID,oCAAA,CAAoB,YAAY,CAAA;AAEpD,EAAA,MAAM,oBAAoB,MAAM;AAC9B,IAAA,UAAA,CAAW;AAAA,MACT,UAAA,EAAY,YAAA;AAAA,MACZ,UAAA,EAAY,YAAA;AAAA,MACZ,UAAA,EAAY;AAAA,QACV,aAAA,EAAe,YAAA;AAAA,QACf,WAAA,EAAa,OAAA;AAAA,QACb,YAAA,EAAc,WAAA;AAAA,QACd;AAAA;AACF,KACD,CAAA;AAAA,EACH,CAAA;AAEA,EAAA,OAAOK,sBAAA,CAAM,aAAa,QAAA,EAAU;AAAA,IAClC,OAAA,EAAS,CAAC,CAAA,KAAwB;AAChC,MAAA,iBAAA,EAAkB;AAElB,MAAA,IAAK,QAAA,CAAS,MAAsD,OAAA,EAAS;AAC3E,QAAC,QAAA,CAAS,KAAA,CAAsD,OAAA,CAAS,CAAC,CAAA;AAAA,MAC5E;AAAA,IACF;AAAA,GACD,CAAA;AACH","file":"chunk-EIW6YEPY.js","sourcesContent":["/**\n * @sonordev/site-kit/signal - SignalExperiment\n * \n * A/B test component that renders different variants based on Signal assignment.\n * Uses Thompson Sampling (Bayesian bandit) for optimization.\n */\n\n'use client'\n\nimport React, { useMemo, useEffect } from 'react'\nimport { useSignalExperiment, useSignalEvent } from './SignalBridge'\n\ninterface SignalExperimentProps {\n /** Unique experiment ID */\n experimentId: string\n \n /** Variants to test - keys are variant names, values are React nodes */\n variants: Record<string, React.ReactNode>\n \n /** Fallback content if no assignment (defaults to 'control' variant) */\n fallback?: React.ReactNode\n \n /** Track impression automatically */\n trackImpression?: boolean\n \n /** Children function for more control */\n children?: (props: { variant: string; isControl: boolean }) => React.ReactNode\n}\n\n/**\n * Renders different content variants based on Signal's A/B assignment.\n * \n * @example\n * // Simple variant switching\n * <SignalExperiment experimentId=\"hero-cta\" variants={{\n * control: <Button>Get Started</Button>,\n * variant_a: <Button variant=\"primary\">Start Free Trial</Button>,\n * variant_b: <Button variant=\"secondary\">Book a Demo</Button>,\n * }} />\n * \n * @example\n * // With render prop for more control\n * <SignalExperiment experimentId=\"pricing-layout\">\n * {({ variant, isControl }) => (\n * <PricingSection layout={isControl ? 'cards' : 'table'} />\n * )}\n * </SignalExperiment>\n */\nexport function SignalExperiment({\n experimentId,\n variants,\n fallback,\n trackImpression = true,\n children,\n}: SignalExperimentProps) {\n const { assignment, variant, isControl } = useSignalExperiment(experimentId)\n const trackEvent = useSignalEvent()\n \n // Track impression when variant is rendered\n useEffect(() => {\n if (trackImpression && variant) {\n trackEvent({\n event_type: 'experiment',\n event_name: 'impression',\n event_data: {\n experiment_id: experimentId,\n variant_key: variant,\n },\n })\n }\n }, [experimentId, variant, trackImpression, trackEvent])\n \n // If using render prop\n if (children) {\n return <>{children({ variant: variant || 'control', isControl })}</>\n }\n \n // Determine what to render\n const selectedVariant = variant || 'control'\n const content = variants[selectedVariant]\n \n if (content !== undefined) {\n return <>{content}</>\n }\n \n // Fallback to provided fallback or control\n if (fallback) {\n return <>{fallback}</>\n }\n \n return <>{variants.control || null}</>\n}\n\n/**\n * Hook for conditional experiment logic\n * \n * @example\n * const { variant, isControl } = useExperimentVariant('pricing-test')\n * \n * return isControl \n * ? <OldPricing />\n * : <NewPricing showAnnual={variant === 'annual_first'} />\n */\nexport function useExperimentVariant(experimentId: string) {\n return useSignalExperiment(experimentId)\n}\n\n/**\n * Component for tracking experiment conversions\n * Wraps interactive elements to track when they convert\n * \n * @example\n * <SignalExperiment experimentId=\"signup-button\" variants={{\n * control: (\n * <ExperimentConversion experimentId=\"signup-button\" outcomeType=\"click\">\n * <Button>Sign Up</Button>\n * </ExperimentConversion>\n * ),\n * variant_a: (\n * <ExperimentConversion experimentId=\"signup-button\" outcomeType=\"click\">\n * <Button variant=\"large\">Join Now - It's Free!</Button>\n * </ExperimentConversion>\n * ),\n * }} />\n */\nexport function ExperimentConversion({\n experimentId,\n outcomeType = 'click',\n value,\n children,\n}: {\n experimentId: string\n outcomeType?: string\n value?: number\n children: React.ReactElement<{ onClick?: (e: React.MouseEvent) => void }>\n}) {\n const trackEvent = useSignalEvent()\n const { variant } = useSignalExperiment(experimentId)\n\n const handleInteraction = () => {\n trackEvent({\n event_type: 'experiment',\n event_name: 'conversion',\n event_data: {\n experiment_id: experimentId,\n variant_key: variant,\n outcome_type: outcomeType,\n value,\n },\n })\n }\n\n return React.cloneElement(children, {\n onClick: (e: React.MouseEvent) => {\n handleInteraction()\n // Call original onClick if exists\n if ((children.props as { onClick?: (e: React.MouseEvent) => void }).onClick) {\n (children.props as { onClick?: (e: React.MouseEvent) => void }).onClick!(e)\n }\n },\n })\n}\n"]}
@@ -3,8 +3,9 @@
3
3
 
4
4
  var chunk3DWIYCQX_js = require('./chunk-3DWIYCQX.js');
5
5
  var chunkRC4WWQXR_js = require('./chunk-RC4WWQXR.js');
6
+ var chunkP4Y75QSU_js = require('./chunk-P4Y75QSU.js');
6
7
  var chunk5RNAUYWE_js = require('./chunk-5RNAUYWE.js');
7
- var chunkH65OX263_js = require('./chunk-H65OX263.js');
8
+ var chunkPRTXAIIC_js = require('./chunk-PRTXAIIC.js');
8
9
  var react = require('react');
9
10
  var navigation = require('next/navigation');
10
11
  var jsxRuntime = require('react/jsx-runtime');
@@ -14,7 +15,7 @@ async function analyticsSend(path, body, options = {}) {
14
15
  const target = chunk5RNAUYWE_js.resolveAnalyticsTarget(options);
15
16
  if (!target) return null;
16
17
  try {
17
- return await chunkH65OX263_js.sonorFetch(
18
+ return await chunkPRTXAIIC_js.sonorFetch(
18
19
  `${target.apiUrl}${path}`,
19
20
  {
20
21
  method: options.method || "POST",
@@ -31,7 +32,7 @@ async function analyticsSend(path, body, options = {}) {
31
32
  function analyticsBeacon(path, body, options = {}) {
32
33
  const target = chunk5RNAUYWE_js.resolveAnalyticsTarget(options);
33
34
  if (!target) return;
34
- chunkH65OX263_js.sonorBeacon(`${target.apiUrl}${path}`, body, target.apiKey);
35
+ chunkPRTXAIIC_js.sonorBeacon(`${target.apiUrl}${path}`, body, target.apiKey);
35
36
  }
36
37
 
37
38
  // src/analytics/WebVitals.tsx
@@ -875,16 +876,10 @@ function AnalyticsProvider({
875
876
  hasTracked = false;
876
877
  window.addEventListener("scroll", handleScroll, { passive: true });
877
878
  handleScroll();
878
- const handlePageHide = () => sendScrollData(true);
879
- const handleVisibilityChange = () => {
880
- if (document.visibilityState === "hidden") sendScrollData(true);
881
- };
882
- window.addEventListener("pagehide", handlePageHide);
883
- document.addEventListener("visibilitychange", handleVisibilityChange);
879
+ const stopLeaveListener = chunkP4Y75QSU_js.onPageLeave(() => sendScrollData(true));
884
880
  return () => {
885
881
  window.removeEventListener("scroll", handleScroll);
886
- window.removeEventListener("pagehide", handlePageHide);
887
- document.removeEventListener("visibilitychange", handleVisibilityChange);
882
+ stopLeaveListener();
888
883
  sendScrollData(false);
889
884
  };
890
885
  }, [pathname, gate, trackScrollDepth, debug]);
@@ -1023,5 +1018,5 @@ exports.WebVitals = WebVitals;
1023
1018
  exports.useAnalytics = useAnalytics;
1024
1019
  exports.useAnalyticsOptional = useAnalyticsOptional;
1025
1020
  exports.useTrackEvent = useTrackEvent;
1026
- //# sourceMappingURL=chunk-RCSTDJUH.js.map
1027
- //# sourceMappingURL=chunk-RCSTDJUH.js.map
1021
+ //# sourceMappingURL=chunk-F6SKG34N.js.map
1022
+ //# sourceMappingURL=chunk-F6SKG34N.js.map