@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
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/shared/siteToken.ts"],"names":["SITE_KIT_VERSION"],"mappings":"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","file":"chunk-4WBTM6YE.js","sourcesContent":["/**\n * @sonordev/site-kit shared — Client token manager\n *\n * SiteKitLayout (a server component) no longer ships the raw `sonor_` API key to\n * the browser. Instead it mints a short-lived, project-scoped token server-side\n * and injects THAT. This module is the browser-side lifecycle for that token:\n *\n * - holds the current token (seeded from the injected value)\n * - a static page's seed can be days old and already expired on first view, so\n * it transparently REFRESHES via the public endpoint before first use\n * - dedupes concurrent refreshes (one in-flight request, awaited by all)\n * - persists the freshest token in sessionStorage so navigations within a\n * session don't each re-refresh\n *\n * Everything here is a no-op passthrough when the injected credential is a raw\n * key (a 2.x kit, or the mint-failed fallback) — legacy behavior is unchanged.\n * Fully SSR-safe: on the server there is no refresh, just the seed.\n *\n * The token payload is NOT secret (only its HMAC is unforgeable), so decoding it\n * client-side to read `exp`/`pid` is fine and needs no crypto.\n */\nimport { SITE_KIT_VERSION } from './version'\n\nexport const SITE_TOKEN_PREFIX = 'st1.'\n\n/** Refresh this many ms before expiry, so a request never races the deadline. */\nconst REFRESH_SKEW_MS = 5 * 60_000\nconst REFRESH_TIMEOUT_MS = 6_000\nconst STORAGE_KEY = '__sonor_site_token__'\n\nexport function isSiteToken(credential?: string | null): boolean {\n return typeof credential === 'string' && credential.startsWith(SITE_TOKEN_PREFIX)\n}\n\ninterface DecodedClaims {\n pid?: string\n iat?: number\n exp?: number\n}\n\n/** Decode the (non-secret) token payload. Returns null if not a token / malformed. */\nexport function decodeSiteTokenClaims(token?: string | null): DecodedClaims | null {\n if (!isSiteToken(token)) return null\n const seg = (token as string).split('.')[1]\n if (!seg) return null\n try {\n // base64url → JSON. atob handles standard base64; restore url-safe chars.\n const b64 = seg.replace(/-/g, '+').replace(/_/g, '/')\n const json =\n typeof atob === 'function'\n ? atob(b64)\n : Buffer.from(seg, 'base64url').toString('utf8')\n const claims = JSON.parse(json)\n return typeof claims === 'object' && claims ? claims : null\n } catch {\n return null\n }\n}\n\n/**\n * Stable id for the auth circuit breaker. Tokens rotate, so keying the breaker\n * by the raw value would reset it every refresh — key by the project id encoded\n * in the token instead. Raw keys use a safe prefix.\n */\nexport function credentialBreakerId(credential?: string | null): string {\n if (!credential) return '(anonymous)'\n const claims = decodeSiteTokenClaims(credential)\n if (claims?.pid) return `pid:${claims.pid}`\n return credential.slice(0, 16)\n}\n\ninterface TokenState {\n /** The credential injected by the layout (token or raw key). */\n seed: string | undefined\n /** Whether we're in token mode (seed is a token). */\n isToken: boolean\n /** Base API URL for the refresh endpoint. */\n apiUrl: string\n /** The freshest known token (>= seed). Null in raw-key mode. */\n token: string | null\n /** In-flight refresh, deduped. */\n refreshing: Promise<string | null> | null\n}\n\nfunction initialTokenState(): TokenState {\n return {\n seed: undefined,\n isToken: false,\n apiUrl: 'https://api.sonor.io',\n token: null,\n refreshing: null,\n }\n}\n\n/**\n * Page-wide singleton, keyed on window. Bundlers can (and in the field, do)\n * inline more than one copy of this module into a page — e.g. an app importing\n * site-kit directly while a transpiled component library bundles its own copy.\n * Module-scoped state then splits into per-copy brains: one copy gets\n * configured and refreshes fine while the other keeps sending the stale\n * prerendered seed, 401s, and trips its breaker (\"sonor-auth-paused\" with a\n * working network). Sharing the state object on window gives every copy the\n * same token, the same deduped refresh, and the same breaker. On the server\n * (no window) each module instance keeps private state — there's no refresh\n * lifecycle there anyway.\n */\nconst TOKEN_STATE_KEY = '__SONOR_SITE_TOKEN_STATE__'\n\nconst state: TokenState = (() => {\n if (typeof window === 'undefined') return initialTokenState()\n const w = window as unknown as Record<string, TokenState | undefined>\n return (w[TOKEN_STATE_KEY] ??= initialTokenState())\n})()\n\nfunction readStoredToken(): string | null {\n if (typeof window === 'undefined') return null\n try {\n const raw = window.sessionStorage.getItem(STORAGE_KEY)\n if (!raw) return null\n const parsed = JSON.parse(raw)\n return typeof parsed?.token === 'string' ? parsed.token : null\n } catch {\n return null\n }\n}\n\nfunction storeToken(token: string): void {\n if (typeof window === 'undefined') return\n try {\n window.sessionStorage.setItem(STORAGE_KEY, JSON.stringify({ token }))\n } catch {\n /* private mode / disabled storage — memory-only is fine */\n }\n try {\n ;(window as any).__SITE_KIT_API_KEY__ = token\n } catch {\n /* ignore */\n }\n}\n\nfunction tokenExp(token: string | null): number {\n const claims = decodeSiteTokenClaims(token)\n return typeof claims?.exp === 'number' ? claims.exp * 1000 : 0\n}\n\n/**\n * Configure the manager from the layout-injected values. Adopts a fresher token\n * from sessionStorage if a prior page in this session already refreshed.\n */\nexport function configureSiteCredential(opts: {\n credential?: string\n apiUrl?: string\n}): void {\n state.seed = opts.credential\n state.isToken = isSiteToken(opts.credential)\n if (opts.apiUrl) state.apiUrl = opts.apiUrl.replace(/\\/+$/, '')\n\n if (!state.isToken) {\n state.token = null\n return\n }\n\n // configure runs on every render — never downgrade. Keep the freshest of the\n // injected seed, a token stored by an earlier page this session, and whatever\n // an in-flight/prior refresh already put in memory.\n const prior = state.token\n let best = opts.credential ?? null\n const stored = readStoredToken()\n if (stored && tokenExp(stored) > tokenExp(best)) best = stored\n if (prior && tokenExp(prior) > tokenExp(best)) best = prior\n state.token = best\n}\n\nfunction needsRefresh(): boolean {\n if (!state.isToken) return false\n if (!state.token) return true\n return Date.now() >= tokenExp(state.token) - REFRESH_SKEW_MS\n}\n\nasync function doRefresh(): Promise<string | null> {\n const current = state.token\n if (!current) return null\n try {\n const res = await fetch(`${state.apiUrl}/api/public/site-token/refresh`, {\n method: 'POST',\n headers: {\n 'content-type': 'application/json',\n 'x-sitekit-version': SITE_KIT_VERSION,\n // Send the current token as x-api-key too, so the server's key-scoped\n // throttler buckets refreshes by token rather than by shared CDN IP.\n 'x-api-key': current,\n },\n body: JSON.stringify({ token: current }),\n signal:\n typeof AbortSignal !== 'undefined' && AbortSignal.timeout\n ? AbortSignal.timeout(REFRESH_TIMEOUT_MS)\n : undefined,\n })\n if (!res.ok) return null\n const data = await res.json().catch(() => null)\n const next = data?.token\n if (typeof next === 'string' && isSiteToken(next)) {\n state.token = next\n storeToken(next)\n return next\n }\n return null\n } catch {\n return null\n }\n}\n\n/** Refresh now (deduped). Returns the new token, or null on failure. */\nexport function refreshSiteToken(): Promise<string | null> {\n if (!state.isToken) return Promise.resolve(null)\n if (state.refreshing) return state.refreshing\n state.refreshing = doRefresh().finally(() => {\n state.refreshing = null\n })\n return state.refreshing\n}\n\n/**\n * The credential to put on the next request. In token mode, refreshes a stale\n * seed first. In raw-key mode, returns the seed unchanged (legacy passthrough).\n */\nexport async function getFreshCredential(\n seed?: string,\n): Promise<string | undefined> {\n // Unconfigured but handed a token (a component received the prerendered seed\n // as a prop before any provider configured the manager): adopt it so the\n // refresh machinery works instead of replaying a possibly-expired seed.\n if (!state.isToken && isSiteToken(seed)) {\n configureSiteCredential({ credential: seed })\n }\n // A raw key (or nothing configured) — no token machinery.\n if (!state.isToken) return seed ?? state.seed\n if (needsRefresh()) {\n const refreshed = await refreshSiteToken()\n if (refreshed) return refreshed\n // Refresh failed — fall through to whatever we have; the request may 401 and\n // trip the breaker with friendly copy.\n }\n return state.token ?? seed ?? state.seed\n}\n\n/** Whether the given credential is being managed as a token. */\nexport function isTokenMode(): boolean {\n return state.isToken\n}\n\n/**\n * Best-known credential WITHOUT refreshing — for synchronous unload paths\n * (sonorBeacon) that can't await. In token mode returns the freshest token held;\n * in raw-key mode returns the seed.\n */\nexport function currentCredential(seed?: string): string | undefined {\n if (!state.isToken) return seed ?? state.seed\n return state.token ?? seed ?? state.seed\n}\n"]}
1
+ {"version":3,"sources":["../src/shared/siteToken.ts"],"names":["SITE_KIT_VERSION"],"mappings":"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","file":"chunk-UWHCHYCX.js","sourcesContent":["/**\n * @sonordev/site-kit shared — Client token manager\n *\n * SiteKitLayout (a server component) no longer ships the raw `sonor_` API key to\n * the browser. Instead it mints a short-lived, project-scoped token server-side\n * and injects THAT. This module is the browser-side lifecycle for that token:\n *\n * - holds the current token (seeded from the injected value)\n * - a static page's seed can be days old and already expired on first view, so\n * it transparently REFRESHES via the public endpoint before first use\n * - dedupes concurrent refreshes (one in-flight request, awaited by all)\n * - persists the freshest token in sessionStorage so navigations within a\n * session don't each re-refresh\n *\n * Everything here is a no-op passthrough when the injected credential is a raw\n * key (a 2.x kit, or the mint-failed fallback) — legacy behavior is unchanged.\n * Fully SSR-safe: on the server there is no refresh, just the seed.\n *\n * The token payload is NOT secret (only its HMAC is unforgeable), so decoding it\n * client-side to read `exp`/`pid` is fine and needs no crypto.\n */\nimport { SITE_KIT_VERSION } from './version'\n\nexport const SITE_TOKEN_PREFIX = 'st1.'\n\n/** Refresh this many ms before expiry, so a request never races the deadline. */\nconst REFRESH_SKEW_MS = 5 * 60_000\nconst REFRESH_TIMEOUT_MS = 6_000\nconst STORAGE_KEY = '__sonor_site_token__'\n\nexport function isSiteToken(credential?: string | null): boolean {\n return typeof credential === 'string' && credential.startsWith(SITE_TOKEN_PREFIX)\n}\n\ninterface DecodedClaims {\n pid?: string\n iat?: number\n exp?: number\n}\n\n/** Decode the (non-secret) token payload. Returns null if not a token / malformed. */\nexport function decodeSiteTokenClaims(token?: string | null): DecodedClaims | null {\n if (!isSiteToken(token)) return null\n const seg = (token as string).split('.')[1]\n if (!seg) return null\n try {\n // base64url → JSON. atob handles standard base64; restore url-safe chars.\n const b64 = seg.replace(/-/g, '+').replace(/_/g, '/')\n const json =\n typeof atob === 'function'\n ? atob(b64)\n : Buffer.from(seg, 'base64url').toString('utf8')\n const claims = JSON.parse(json)\n return typeof claims === 'object' && claims ? claims : null\n } catch {\n return null\n }\n}\n\n/**\n * Stable id for the auth circuit breaker. Tokens rotate, so keying the breaker\n * by the raw value would reset it every refresh — key by the project id encoded\n * in the token instead. Raw keys use a safe prefix.\n */\nexport function credentialBreakerId(credential?: string | null): string {\n if (!credential) return '(anonymous)'\n const claims = decodeSiteTokenClaims(credential)\n if (claims?.pid) return `pid:${claims.pid}`\n return credential.slice(0, 16)\n}\n\ninterface TokenState {\n /** The credential injected by the layout (token or raw key). */\n seed: string | undefined\n /** Whether we're in token mode (seed is a token). */\n isToken: boolean\n /** Base API URL for the refresh endpoint. */\n apiUrl: string\n /** The freshest known token (>= seed). Null in raw-key mode. */\n token: string | null\n /** In-flight refresh, deduped. */\n refreshing: Promise<string | null> | null\n}\n\nfunction initialTokenState(): TokenState {\n return {\n seed: undefined,\n isToken: false,\n apiUrl: 'https://api.sonor.io',\n token: null,\n refreshing: null,\n }\n}\n\n/**\n * Page-wide singleton, keyed on window. Bundlers can (and in the field, do)\n * inline more than one copy of this module into a page — e.g. an app importing\n * site-kit directly while a transpiled component library bundles its own copy.\n * Module-scoped state then splits into per-copy brains: one copy gets\n * configured and refreshes fine while the other keeps sending the stale\n * prerendered seed, 401s, and trips its breaker (\"sonor-auth-paused\" with a\n * working network). Sharing the state object on window gives every copy the\n * same token, the same deduped refresh, and the same breaker. On the server\n * (no window) each module instance keeps private state — there's no refresh\n * lifecycle there anyway.\n */\nconst TOKEN_STATE_KEY = '__SONOR_SITE_TOKEN_STATE__'\n\nconst state: TokenState = (() => {\n if (typeof window === 'undefined') return initialTokenState()\n const w = window as unknown as Record<string, TokenState | undefined>\n return (w[TOKEN_STATE_KEY] ??= initialTokenState())\n})()\n\nfunction readStoredToken(): string | null {\n if (typeof window === 'undefined') return null\n try {\n const raw = window.sessionStorage.getItem(STORAGE_KEY)\n if (!raw) return null\n const parsed = JSON.parse(raw)\n return typeof parsed?.token === 'string' ? parsed.token : null\n } catch {\n return null\n }\n}\n\nfunction storeToken(token: string): void {\n if (typeof window === 'undefined') return\n try {\n window.sessionStorage.setItem(STORAGE_KEY, JSON.stringify({ token }))\n } catch {\n /* private mode / disabled storage — memory-only is fine */\n }\n try {\n ;(window as any).__SITE_KIT_API_KEY__ = token\n } catch {\n /* ignore */\n }\n}\n\nfunction tokenExp(token: string | null): number {\n const claims = decodeSiteTokenClaims(token)\n return typeof claims?.exp === 'number' ? claims.exp * 1000 : 0\n}\n\n/**\n * Configure the manager from the layout-injected values. Adopts a fresher token\n * from sessionStorage if a prior page in this session already refreshed.\n */\nexport function configureSiteCredential(opts: {\n credential?: string\n apiUrl?: string\n}): void {\n state.seed = opts.credential\n state.isToken = isSiteToken(opts.credential)\n if (opts.apiUrl) state.apiUrl = opts.apiUrl.replace(/\\/+$/, '')\n\n if (!state.isToken) {\n state.token = null\n return\n }\n\n // configure runs on every render — never downgrade. Keep the freshest of the\n // injected seed, a token stored by an earlier page this session, and whatever\n // an in-flight/prior refresh already put in memory.\n const prior = state.token\n let best = opts.credential ?? null\n const stored = readStoredToken()\n if (stored && tokenExp(stored) > tokenExp(best)) best = stored\n if (prior && tokenExp(prior) > tokenExp(best)) best = prior\n state.token = best\n}\n\nfunction needsRefresh(): boolean {\n if (!state.isToken) return false\n if (!state.token) return true\n return Date.now() >= tokenExp(state.token) - REFRESH_SKEW_MS\n}\n\nasync function doRefresh(): Promise<string | null> {\n const current = state.token\n if (!current) return null\n try {\n const res = await fetch(`${state.apiUrl}/api/public/site-token/refresh`, {\n method: 'POST',\n headers: {\n 'content-type': 'application/json',\n 'x-sitekit-version': SITE_KIT_VERSION,\n // Send the current token as x-api-key too, so the server's key-scoped\n // throttler buckets refreshes by token rather than by shared CDN IP.\n 'x-api-key': current,\n },\n body: JSON.stringify({ token: current }),\n signal:\n typeof AbortSignal !== 'undefined' && AbortSignal.timeout\n ? AbortSignal.timeout(REFRESH_TIMEOUT_MS)\n : undefined,\n })\n if (!res.ok) return null\n const data = await res.json().catch(() => null)\n const next = data?.token\n if (typeof next === 'string' && isSiteToken(next)) {\n state.token = next\n storeToken(next)\n return next\n }\n return null\n } catch {\n return null\n }\n}\n\n/** Refresh now (deduped). Returns the new token, or null on failure. */\nexport function refreshSiteToken(): Promise<string | null> {\n if (!state.isToken) return Promise.resolve(null)\n if (state.refreshing) return state.refreshing\n state.refreshing = doRefresh().finally(() => {\n state.refreshing = null\n })\n return state.refreshing\n}\n\n/**\n * The credential to put on the next request. In token mode, refreshes a stale\n * seed first. In raw-key mode, returns the seed unchanged (legacy passthrough).\n */\nexport async function getFreshCredential(\n seed?: string,\n): Promise<string | undefined> {\n // Unconfigured but handed a token (a component received the prerendered seed\n // as a prop before any provider configured the manager): adopt it so the\n // refresh machinery works instead of replaying a possibly-expired seed.\n if (!state.isToken && isSiteToken(seed)) {\n configureSiteCredential({ credential: seed })\n }\n // A raw key (or nothing configured) — no token machinery.\n if (!state.isToken) return seed ?? state.seed\n if (needsRefresh()) {\n const refreshed = await refreshSiteToken()\n if (refreshed) return refreshed\n // Refresh failed — fall through to whatever we have; the request may 401 and\n // trip the breaker with friendly copy.\n }\n return state.token ?? seed ?? state.seed\n}\n\n/** Whether the given credential is being managed as a token. */\nexport function isTokenMode(): boolean {\n return state.isToken\n}\n\n/**\n * Best-known credential WITHOUT refreshing — for synchronous unload paths\n * (sonorBeacon) that can't await. In token mode returns the freshest token held;\n * in raw-key mode returns the seed.\n */\nexport function currentCredential(seed?: string): string | undefined {\n if (!state.isToken) return seed ?? state.seed\n return state.token ?? seed ?? state.seed\n}\n"]}
@@ -1,7 +1,11 @@
1
1
  import { widgetStyle, widgetTitleStyle } from './chunk-YFX3Q56O.mjs';
2
- import { createBlogRoutes, resolveBlogArtwork, blogCategorySlug, blogArtworkImageStyle } from './chunk-4B4S56WJ.mjs';
2
+ import { resolveBlogSiteUrl, addExternalLinkTargets } from './chunk-Y5QZPUL3.mjs';
3
+ import { createBlogRoutes, fetchBlogPostBySlug, resolveBlogArtwork, fetchRelatedBlogPosts, blogCategorySlug, blogArtworkImageStyle, fetchBlogCategories } from './chunk-5B4J3IBX.mjs';
4
+ import { withSiteParam } from './chunk-4TLFZ6NR.mjs';
5
+ import { resolveTrailingSlash, applyTrailingSlash } from './chunk-4LYW6PMU.mjs';
3
6
  import { jsxs, jsx, Fragment } from 'react/jsx-runtime';
4
7
  import { marked } from 'marked';
8
+ import { notFound } from 'next/navigation';
5
9
  import React from 'react';
6
10
 
7
11
  var defaults = {
@@ -291,7 +295,7 @@ function ClusterNavigation({
291
295
  basePath,
292
296
  routing,
293
297
  category,
294
- trailingSlash = false,
298
+ trailingSlash: trailingSlashProp,
295
299
  unstyled = false,
296
300
  className
297
301
  }) {
@@ -302,9 +306,10 @@ function ClusterNavigation({
302
306
  const hasPillarLink = !navigation.is_pillar && navigation.pillar;
303
307
  const hasSiblings = siblings.length > 0;
304
308
  if (!hasPillarLink && !hasSiblings) return null;
309
+ const trailingSlash = resolveTrailingSlash(trailingSlashProp);
305
310
  const articleUrl = (article) => {
306
311
  const path = createBlogRoutes({ basePath, category, includeCategoryInPath: !routing, ...routing }).post(article);
307
- return trailingSlash ? path.replace(/\/?([?#]|$)/, "/$1") : path;
312
+ return trailingSlash ? applyTrailingSlash(path, true) : path;
308
313
  };
309
314
  return /* @__PURE__ */ jsxs(Fragment, { children: [
310
315
  !unstyled && /* @__PURE__ */ jsx("style", { dangerouslySetInnerHTML: { __html: clusterNavCss } }),
@@ -324,49 +329,6 @@ function ClusterNavigation({
324
329
  ] });
325
330
  }
326
331
 
327
- // src/blog/processBlogHtml.ts
328
- function normalizeSiteHost(siteUrl) {
329
- try {
330
- const base = siteUrl.startsWith("http") ? siteUrl : `https://${siteUrl}`;
331
- const u = new URL(base);
332
- return u.hostname.replace(/^www\./i, "").toLowerCase();
333
- } catch {
334
- return "";
335
- }
336
- }
337
- function resolveBlogSiteUrl(explicit) {
338
- const fromProp = explicit?.trim();
339
- if (fromProp) return fromProp;
340
- const next = process.env.NEXT_PUBLIC_SITE_URL?.trim();
341
- if (next) return next;
342
- const site = process.env.SITE_URL?.trim();
343
- if (site) return site;
344
- const vercel = process.env.VERCEL_URL?.trim();
345
- if (vercel) return vercel.startsWith("http") ? vercel : `https://${vercel}`;
346
- return "";
347
- }
348
- function addExternalLinkTargets(html, siteUrl) {
349
- if (!html || !siteUrl) return html;
350
- const siteHost = normalizeSiteHost(siteUrl);
351
- if (!siteHost) return html;
352
- return html.replace(/<a\b([^>]*)>/gi, (_full, attrs) => {
353
- const hrefMatch = attrs.match(/\bhref\s*=\s*(["'])([^"']*)\1/i);
354
- if (!hrefMatch) return `<a${attrs}>`;
355
- const href = hrefMatch[2].trim();
356
- if (!/^https?:\/\//i.test(href)) return `<a${attrs}>`;
357
- try {
358
- const url = new URL(href);
359
- const linkHost = url.hostname.replace(/^www\./i, "").toLowerCase();
360
- if (linkHost === siteHost) return `<a${attrs}>`;
361
- if (/\btarget\s*=/i.test(attrs)) return `<a${attrs}>`;
362
- const trimmed = attrs.trim();
363
- return `<a ${trimmed} target="_blank" rel="noopener noreferrer">`;
364
- } catch {
365
- return `<a${attrs}>`;
366
- }
367
- });
368
- }
369
-
370
332
  // src/blog/reading-time.ts
371
333
  function readingTimeMinutes(post) {
372
334
  const value = post.reading_time_minutes ?? post.reading_time;
@@ -429,40 +391,6 @@ function injectHeadingIds(html) {
429
391
  return `<h${level}${attrs} id="${id}">${inner}</h${level}>`;
430
392
  });
431
393
  }
432
- async function fetchBlogPost(apiUrl, apiKey, slug) {
433
- try {
434
- const response = await fetch(`${apiUrl}/public/blog/posts/${slug}`, {
435
- headers: { "x-api-key": apiKey },
436
- next: { revalidate: 60 }
437
- });
438
- if (!response.ok) {
439
- if (response.status === 404) return null;
440
- console.error("[Blog] Failed to fetch post:", response.statusText);
441
- return null;
442
- }
443
- const data = await response.json();
444
- return data.post;
445
- } catch (error) {
446
- console.error("[Blog] Error fetching post:", error);
447
- return null;
448
- }
449
- }
450
- async function fetchRelatedPosts(apiUrl, apiKey, postId, limit = 3) {
451
- try {
452
- const response = await fetch(`${apiUrl}/public/blog/related`, {
453
- method: "POST",
454
- headers: { "Content-Type": "application/json", "x-api-key": apiKey },
455
- body: JSON.stringify({ current_post_id: postId, limit }),
456
- next: { revalidate: 300 }
457
- });
458
- if (!response.ok) return [];
459
- const data = await response.json();
460
- return data.posts || [];
461
- } catch (error) {
462
- console.error("[Blog] Error fetching related posts:", error);
463
- return [];
464
- }
465
- }
466
394
  function generateTableOfContents(html) {
467
395
  const headingRegex = /<h([2-4])[^>]*(?:id="([^"]*)")?[^>]*>(.*?)<\/h[2-4]>/gi;
468
396
  const items = [];
@@ -495,6 +423,8 @@ async function BlogPost({
495
423
  styles = {},
496
424
  unstyled = false,
497
425
  siteUrl,
426
+ site,
427
+ notFound: notFound$1 = true,
498
428
  children
499
429
  }) {
500
430
  const routes = createBlogRoutes({ basePath, ...routing });
@@ -503,11 +433,12 @@ async function BlogPost({
503
433
  return null;
504
434
  }
505
435
  const [post, { blogPostCss }, { wrapBlogTables }] = await Promise.all([
506
- fetchBlogPost(apiUrl, apiKey, slug),
436
+ fetchBlogPostBySlug({ apiUrl, apiKey, site }, slug),
507
437
  unstyled ? Promise.resolve({ blogPostCss: "" }) : import('./blog-styles-7AKRUMV7.mjs'),
508
438
  import('./blog-tables-QGIHOESZ.mjs')
509
439
  ]);
510
440
  if (!post) {
441
+ if (notFound$1) notFound();
511
442
  return /* @__PURE__ */ jsxs(Fragment, { children: [
512
443
  !unstyled && /* @__PURE__ */ jsx("style", { dangerouslySetInnerHTML: { __html: blogPostCss } }),
513
444
  /* @__PURE__ */ jsxs("div", { className: cls(unstyled, styles, "notFound", "sk-blog-not-found", className), children: [
@@ -523,16 +454,16 @@ async function BlogPost({
523
454
  const contentWithExternalTargets = wrapBlogTables(addExternalLinkTargets(content, siteUrlResolved));
524
455
  const artwork = resolveBlogArtwork(post, "article");
525
456
  const tableOfContents = showToc ? generateTableOfContents(content) : [];
526
- const relatedPosts = showRelated ? await fetchRelatedPosts(apiUrl, apiKey, post.id, relatedCount) : [];
457
+ const relatedPosts = showRelated ? await fetchRelatedBlogPosts({ apiUrl, apiKey, site }, post.id, relatedCount, { revalidate: 300 }) : [];
527
458
  const faqRaw = post.faq_items ?? post.faqItems;
528
459
  const faqItemsProcessed = faqRaw?.map((item) => ({
529
460
  ...item,
530
461
  answer: addExternalLinkTargets(item.answer || "", siteUrlResolved)
531
462
  })) ?? faqRaw;
532
- const { BlogViewTracker } = await import('./BlogViewTracker-CKYG6MYU.mjs');
463
+ const { BlogViewTracker } = await import('./BlogViewTracker-KXRZHN3U.mjs');
533
464
  if (children) {
534
465
  return /* @__PURE__ */ jsxs(Fragment, { children: [
535
- /* @__PURE__ */ jsx(BlogViewTracker, { slug: post.slug }),
466
+ /* @__PURE__ */ jsx(BlogViewTracker, { slug: post.slug, site }),
536
467
  children({ post, tableOfContents, relatedPosts })
537
468
  ] });
538
469
  }
@@ -541,7 +472,7 @@ async function BlogPost({
541
472
  const hasToc = showToc && tableOfContents.length > 0;
542
473
  return /* @__PURE__ */ jsxs(Fragment, { children: [
543
474
  !unstyled && /* @__PURE__ */ jsx("style", { dangerouslySetInnerHTML: { __html: blogPostCss } }),
544
- /* @__PURE__ */ jsx(BlogViewTracker, { slug: post.slug }),
475
+ /* @__PURE__ */ jsx(BlogViewTracker, { slug: post.slug, site }),
545
476
  /* @__PURE__ */ jsxs("article", { className: cls(unstyled, styles, "article", "sk-blog-article", className), children: [
546
477
  /* @__PURE__ */ jsxs("header", { className: cls(unstyled, styles, "header", "sk-blog-header"), children: [
547
478
  /* @__PURE__ */ jsxs("nav", { className: cls(unstyled, styles, "breadcrumb", "sk-blog-breadcrumb"), children: [
@@ -723,7 +654,8 @@ async function fetchBlogList(params) {
723
654
  page = 1,
724
655
  perPage = 12,
725
656
  orderBy = "published_at",
726
- order = "desc"
657
+ order = "desc",
658
+ site
727
659
  } = params;
728
660
  const queryParams = new URLSearchParams();
729
661
  if (category) queryParams.set("category", category);
@@ -737,7 +669,7 @@ async function fetchBlogList(params) {
737
669
  queryParams.set("order_by", orderBy);
738
670
  queryParams.set("order", order);
739
671
  try {
740
- const response = await fetch(`${apiUrl}/public/blog/posts?${queryParams}`, {
672
+ const response = await fetch(withSiteParam(`${apiUrl}/public/blog/posts?${queryParams}`, site), {
741
673
  headers: { "x-api-key": apiKey },
742
674
  next: { revalidate: 60 }
743
675
  });
@@ -765,20 +697,6 @@ async function fetchBlogList(params) {
765
697
  function emptyResult() {
766
698
  return { posts: [], pagination: { page: 1, perPage: 12, total: 0, totalPages: 0, hasNext: false, hasPrev: false } };
767
699
  }
768
- async function fetchCategories(apiUrl, apiKey) {
769
- try {
770
- const response = await fetch(`${apiUrl}/public/blog/categories`, {
771
- headers: { "x-api-key": apiKey },
772
- next: { revalidate: 300 }
773
- });
774
- if (!response.ok) return [];
775
- const data = await response.json();
776
- return data.categories || [];
777
- } catch (error) {
778
- console.error("[Blog] Error fetching categories:", error);
779
- return [];
780
- }
781
- }
782
700
  function cls2(unstyled, styles, key, defaultClass, extra) {
783
701
  if (unstyled) return styles[key] || void 0;
784
702
  const base = styles[key] || defaultClass;
@@ -797,6 +715,7 @@ async function BlogList({
797
715
  perPage = 12,
798
716
  orderBy = "published_at",
799
717
  order = "desc",
718
+ site,
800
719
  showCategoryFilter = false,
801
720
  showPagination = true,
802
721
  className,
@@ -813,8 +732,8 @@ async function BlogList({
813
732
  return null;
814
733
  }
815
734
  const [blogData, categories, { blogListCss }] = await Promise.all([
816
- fetchBlogList({ apiUrl, apiKey, category, tag, author, featured, search, cluster, page, perPage, orderBy, order }),
817
- showCategoryFilter ? fetchCategories(apiUrl, apiKey) : Promise.resolve([]),
735
+ fetchBlogList({ apiUrl, apiKey, category, tag, author, featured, search, cluster, page, perPage, orderBy, order, site }),
736
+ showCategoryFilter ? fetchBlogCategories({ apiUrl, apiKey, site }) : Promise.resolve([]),
818
737
  unstyled || children ? Promise.resolve({ blogListCss: "" }) : import('./blog-styles-7AKRUMV7.mjs')
819
738
  ]);
820
739
  if (children) {
@@ -922,9 +841,9 @@ function buildPaginationUrl(basePath, page, category) {
922
841
  if (category) params.set("category", category);
923
842
  return `${basePath}?${params}`;
924
843
  }
925
- async function fetchRecentPosts(apiUrl, apiKey, limit = 5) {
844
+ async function fetchRecentPosts(apiUrl, apiKey, limit = 5, site) {
926
845
  try {
927
- const response = await fetch(`${apiUrl}/public/blog/recent?limit=${limit}`, {
846
+ const response = await fetch(withSiteParam(`${apiUrl}/public/blog/recent?limit=${limit}`, site), {
928
847
  headers: { "x-api-key": apiKey },
929
848
  next: { revalidate: 300 }
930
849
  });
@@ -936,23 +855,9 @@ async function fetchRecentPosts(apiUrl, apiKey, limit = 5) {
936
855
  return [];
937
856
  }
938
857
  }
939
- async function fetchCategories2(apiUrl, apiKey) {
940
- try {
941
- const response = await fetch(`${apiUrl}/public/blog/categories`, {
942
- headers: { "x-api-key": apiKey },
943
- next: { revalidate: 300 }
944
- });
945
- if (!response.ok) return [];
946
- const data = await response.json();
947
- return data.categories || [];
948
- } catch (error) {
949
- console.error("[Blog] Error fetching categories:", error);
950
- return [];
951
- }
952
- }
953
- async function fetchTags(apiUrl, apiKey) {
858
+ async function fetchTags(apiUrl, apiKey, site) {
954
859
  try {
955
- const response = await fetch(`${apiUrl}/public/blog/tags`, {
860
+ const response = await fetch(withSiteParam(`${apiUrl}/public/blog/tags`, site), {
956
861
  headers: { "x-api-key": apiKey },
957
862
  next: { revalidate: 300 }
958
863
  });
@@ -967,6 +872,7 @@ async function fetchTags(apiUrl, apiKey) {
967
872
  async function BlogSidebar({
968
873
  apiUrl = process.env.SONOR_API_URL || "https://api.sonor.io",
969
874
  apiKey = process.env.SONOR_API_KEY || "",
875
+ site,
970
876
  showCategories = true,
971
877
  showRecentPosts = true,
972
878
  recentPostsCount = 5,
@@ -984,9 +890,9 @@ async function BlogSidebar({
984
890
  return null;
985
891
  }
986
892
  const [categories, recentPosts, tags] = await Promise.all([
987
- showCategories ? fetchCategories2(apiUrl, apiKey) : Promise.resolve([]),
988
- showRecentPosts ? fetchRecentPosts(apiUrl, apiKey, recentPostsCount) : Promise.resolve([]),
989
- showTags ? fetchTags(apiUrl, apiKey) : Promise.resolve([])
893
+ showCategories ? fetchBlogCategories({ apiUrl, apiKey, site }) : Promise.resolve([]),
894
+ showRecentPosts ? fetchRecentPosts(apiUrl, apiKey, recentPostsCount, site) : Promise.resolve([]),
895
+ showTags ? fetchTags(apiUrl, apiKey, site) : Promise.resolve([])
990
896
  ]);
991
897
  return /* @__PURE__ */ jsxs("aside", { className, style: { display: "flex", flexDirection: "column", gap: 32 }, children: [
992
898
  showSearch && /* @__PURE__ */ jsx(SearchWidget, { basePath: routes.index }),
@@ -1165,6 +1071,7 @@ var categoryLinkStyle = {
1165
1071
  async function BlogLayout({
1166
1072
  apiUrl = process.env.SONOR_API_URL || "https://api.sonor.io",
1167
1073
  apiKey = process.env.SONOR_API_KEY || "",
1074
+ site,
1168
1075
  layout = "sidebar-right",
1169
1076
  showSidebar = true,
1170
1077
  sidebarProps = {},
@@ -1239,6 +1146,7 @@ async function BlogLayout({
1239
1146
  {
1240
1147
  apiUrl,
1241
1148
  apiKey,
1149
+ site,
1242
1150
  basePath,
1243
1151
  routing,
1244
1152
  currentCategory,
@@ -1251,6 +1159,7 @@ async function BlogLayout({
1251
1159
  {
1252
1160
  apiUrl,
1253
1161
  apiKey,
1162
+ site,
1254
1163
  basePath,
1255
1164
  routing,
1256
1165
  currentCategory,
@@ -1284,39 +1193,12 @@ async function CategoryPage({
1284
1193
  };
1285
1194
  return /* @__PURE__ */ jsx(BlogLayout, { ...layoutProps, hero: categoryHero, currentCategory: category, children: listComponent });
1286
1195
  }
1287
- async function fetchRelatedPosts2(apiUrl, apiKey, currentPostId, limit) {
1288
- try {
1289
- const response = await fetch(`${apiUrl}/public/blog/related`, {
1290
- method: "POST",
1291
- headers: {
1292
- "Content-Type": "application/json",
1293
- "x-api-key": apiKey
1294
- },
1295
- // The controller reads snake_case `current_post_id` and looks the post
1296
- // up by id. camelCase here meant the id arrived as undefined, the
1297
- // lookup matched nothing, and this rendered "no related posts" as a
1298
- // clean 200 — the silent sibling of the 404 path bug fixed above.
1299
- body: JSON.stringify({
1300
- current_post_id: currentPostId,
1301
- limit
1302
- })
1303
- });
1304
- if (!response.ok) {
1305
- console.error("Failed to fetch related posts:", response.statusText);
1306
- return [];
1307
- }
1308
- const data = await response.json();
1309
- return data.posts || [];
1310
- } catch (error) {
1311
- console.error("Failed to fetch related posts:", error);
1312
- return [];
1313
- }
1314
- }
1315
1196
  async function RelatedPosts({
1316
1197
  apiUrl = process.env.SONOR_API_URL || "https://api.sonor.io",
1317
1198
  apiKey = process.env.SONOR_API_KEY || "",
1318
1199
  currentPostId,
1319
1200
  limit = 3,
1201
+ site,
1320
1202
  className,
1321
1203
  basePath,
1322
1204
  routing,
@@ -1327,7 +1209,7 @@ async function RelatedPosts({
1327
1209
  console.warn("[Blog] No API key configured for RelatedPosts");
1328
1210
  return null;
1329
1211
  }
1330
- const posts = await fetchRelatedPosts2(apiUrl, apiKey, currentPostId, limit);
1212
+ const posts = await fetchRelatedBlogPosts({ apiUrl, apiKey, site }, currentPostId, limit);
1331
1213
  if (posts.length === 0) return null;
1332
1214
  return /* @__PURE__ */ jsxs("section", { className, children: [
1333
1215
  /* @__PURE__ */ jsx("h3", { style: { marginBottom: 16 }, children: "Related Posts" }),
@@ -1357,6 +1239,6 @@ async function RelatedPosts({
1357
1239
  ] });
1358
1240
  }
1359
1241
 
1360
- export { BlogLayout, BlogList, BlogPage, BlogPost, BlogPostPage, BlogSidebar, CategoryPage, ClusterNavigation, RelatedPosts, ServiceCallout, ServiceCallouts, addExternalLinkTargets, getAuthorSocialLinks, normalizeSiteHost, readingTimeMinutes, resolveBlogSiteUrl };
1361
- //# sourceMappingURL=chunk-JNAXDFC4.mjs.map
1362
- //# sourceMappingURL=chunk-JNAXDFC4.mjs.map
1242
+ export { BlogLayout, BlogList, BlogPage, BlogPost, BlogPostPage, BlogSidebar, CategoryPage, ClusterNavigation, RelatedPosts, ServiceCallout, ServiceCallouts, getAuthorSocialLinks, readingTimeMinutes };
1243
+ //# sourceMappingURL=chunk-VJ74275U.mjs.map
1244
+ //# sourceMappingURL=chunk-VJ74275U.mjs.map