@sonordev/site-kit 4.3.2 → 5.1.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 (296) hide show
  1. package/agent-manifest.json +8 -5
  2. package/dist/AnalyticsProvider-2LCSA6G3.mjs +10 -0
  3. package/dist/{AnalyticsProvider-TWRQHKPZ.mjs.map → AnalyticsProvider-2LCSA6G3.mjs.map} +1 -1
  4. package/dist/AnalyticsProvider-V2U3TQMH.js +31 -0
  5. package/dist/{AnalyticsProvider-DNMYYBKX.js.map → AnalyticsProvider-V2U3TQMH.js.map} +1 -1
  6. package/dist/BlogViewTracker-COTPD7WL.js +51 -0
  7. package/dist/BlogViewTracker-COTPD7WL.js.map +1 -0
  8. package/dist/BlogViewTracker-HG25ONRP.mjs +48 -0
  9. package/dist/BlogViewTracker-HG25ONRP.mjs.map +1 -0
  10. package/dist/ChatWidget-4QUJYFXU.js +20 -0
  11. package/dist/{ChatWidget-MDWEXISQ.js.map → ChatWidget-4QUJYFXU.js.map} +1 -1
  12. package/dist/ChatWidget-RWO7R7EJ.mjs +11 -0
  13. package/dist/{ChatWidget-UQMEJAHY.mjs.map → ChatWidget-RWO7R7EJ.mjs.map} +1 -1
  14. package/dist/EngageWidget-LF4AC4QN.mjs +9 -0
  15. package/dist/{EngageWidget-UIIN43ZU.mjs.map → EngageWidget-LF4AC4QN.mjs.map} +1 -1
  16. package/dist/EngageWidget-RSOXB3YM.js +18 -0
  17. package/dist/{EngageWidget-VRC7NUG6.js.map → EngageWidget-RSOXB3YM.js.map} +1 -1
  18. package/dist/{FileField-W4VXQ3CM.js → FileField-S2GUM3QB.js} +6 -6
  19. package/dist/{FileField-W4VXQ3CM.js.map → FileField-S2GUM3QB.js.map} +1 -1
  20. package/dist/{FileField-LVF3SCDC.mjs → FileField-YJ7DZXC3.mjs} +5 -5
  21. package/dist/{FileField-LVF3SCDC.mjs.map → FileField-YJ7DZXC3.mjs.map} +1 -1
  22. package/dist/{FormSpotlight-CRLFAPNI.js → FormSpotlight-7WAXLXZA.js} +15 -15
  23. package/dist/{FormSpotlight-CRLFAPNI.js.map → FormSpotlight-7WAXLXZA.js.map} +1 -1
  24. package/dist/{FormSpotlight-ZPISKGIX.mjs → FormSpotlight-HLH5LQKI.mjs} +3 -3
  25. package/dist/{FormSpotlight-ZPISKGIX.mjs.map → FormSpotlight-HLH5LQKI.mjs.map} +1 -1
  26. package/dist/{FormStage-QMRPAROJ.js → FormStage-LEZYERJB.js} +13 -13
  27. package/dist/{FormStage-QMRPAROJ.js.map → FormStage-LEZYERJB.js.map} +1 -1
  28. package/dist/{FormStage-WQOAP7CR.mjs → FormStage-Q5JW75AF.mjs} +3 -3
  29. package/dist/{FormStage-WQOAP7CR.mjs.map → FormStage-Q5JW75AF.mjs.map} +1 -1
  30. package/dist/ManagedForm-H4SEFSAF.js +23 -0
  31. package/dist/{ManagedForm-7L2W5BBZ.js.map → ManagedForm-H4SEFSAF.js.map} +1 -1
  32. package/dist/ManagedForm-U3NFIVEC.mjs +14 -0
  33. package/dist/{ManagedForm-D7CFOIXH.mjs.map → ManagedForm-U3NFIVEC.mjs.map} +1 -1
  34. package/dist/ManagedNewsletterForm-KT2NGUNW.js +64 -0
  35. package/dist/ManagedNewsletterForm-KT2NGUNW.js.map +1 -0
  36. package/dist/ManagedNewsletterForm-YKYW7B6P.mjs +62 -0
  37. package/dist/ManagedNewsletterForm-YKYW7B6P.mjs.map +1 -0
  38. package/dist/{SignalCore-JQLRWMPJ.mjs → SignalCore-2BH5PUGS.mjs} +5 -5
  39. package/dist/{SignalCore-JQLRWMPJ.mjs.map → SignalCore-2BH5PUGS.mjs.map} +1 -1
  40. package/dist/{SignalCore-DNXKQKRO.js → SignalCore-JM4ODFL2.js} +11 -11
  41. package/dist/{SignalCore-DNXKQKRO.js.map → SignalCore-JM4ODFL2.js.map} +1 -1
  42. package/dist/SitemapSync-5CXS2JGB.mjs +8 -0
  43. package/dist/{SitemapSync-RFY6PUG7.mjs.map → SitemapSync-5CXS2JGB.mjs.map} +1 -1
  44. package/dist/SitemapSync-J4UMJRTO.js +17 -0
  45. package/dist/{SitemapSync-SR6OJRIA.js.map → SitemapSync-J4UMJRTO.js.map} +1 -1
  46. package/dist/analytics/index.js +9 -9
  47. package/dist/analytics/index.mjs +4 -4
  48. package/dist/blog/AuthorCard.d.ts.map +1 -1
  49. package/dist/blog/AuthorPage.d.ts.map +1 -1
  50. package/dist/blog/BlogList.d.ts +7 -1
  51. package/dist/blog/BlogList.d.ts.map +1 -1
  52. package/dist/blog/BlogPost.d.ts +1 -1
  53. package/dist/blog/BlogPost.d.ts.map +1 -1
  54. package/dist/blog/BlogSidebar.d.ts +0 -7
  55. package/dist/blog/BlogSidebar.d.ts.map +1 -1
  56. package/dist/blog/BlogViewTracker.d.ts +10 -0
  57. package/dist/blog/BlogViewTracker.d.ts.map +1 -0
  58. package/dist/blog/ClusterLandingPage.d.ts.map +1 -1
  59. package/dist/blog/ManagedNewsletterForm.d.ts +13 -0
  60. package/dist/blog/ManagedNewsletterForm.d.ts.map +1 -0
  61. package/dist/blog/NewsletterShell.d.ts +18 -0
  62. package/dist/blog/NewsletterShell.d.ts.map +1 -0
  63. package/dist/blog/NewsletterWidget.d.ts +31 -0
  64. package/dist/blog/NewsletterWidget.d.ts.map +1 -0
  65. package/dist/blog/RelatedPosts.d.ts.map +1 -1
  66. package/dist/blog/author-social.d.ts +15 -0
  67. package/dist/blog/author-social.d.ts.map +1 -0
  68. package/dist/blog/author-social.test.d.ts +2 -0
  69. package/dist/blog/author-social.test.d.ts.map +1 -0
  70. package/dist/blog/blog-view-tracker.test.d.ts +2 -0
  71. package/dist/blog/blog-view-tracker.test.d.ts.map +1 -0
  72. package/dist/blog/category-metadata.test.d.ts +2 -0
  73. package/dist/blog/category-metadata.test.d.ts.map +1 -0
  74. package/dist/blog/index.d.ts +13 -7
  75. package/dist/blog/index.d.ts.map +1 -1
  76. package/dist/blog/index.js +94 -505
  77. package/dist/blog/index.js.map +1 -1
  78. package/dist/blog/index.mjs +59 -491
  79. package/dist/blog/index.mjs.map +1 -1
  80. package/dist/blog/newsletter-widget.test.d.ts +2 -0
  81. package/dist/blog/newsletter-widget.test.d.ts.map +1 -0
  82. package/dist/blog/reading-time.d.ts +10 -0
  83. package/dist/blog/reading-time.d.ts.map +1 -0
  84. package/dist/blog/reading-time.test.d.ts +2 -0
  85. package/dist/blog/reading-time.test.d.ts.map +1 -0
  86. package/dist/blog/server-core-contract.test.d.ts +2 -0
  87. package/dist/blog/server-core-contract.test.d.ts.map +1 -0
  88. package/dist/blog/server-core.d.ts +16 -4
  89. package/dist/blog/server-core.d.ts.map +1 -1
  90. package/dist/blog/server-ui.d.ts +5 -0
  91. package/dist/blog/server-ui.d.ts.map +1 -1
  92. package/dist/blog/server-ui.js +35 -10
  93. package/dist/blog/server-ui.js.map +1 -1
  94. package/dist/blog/server-ui.mjs +8 -6
  95. package/dist/blog/server-ui.mjs.map +1 -1
  96. package/dist/blog/server.d.ts +16 -4
  97. package/dist/blog/server.d.ts.map +1 -1
  98. package/dist/blog/server.js +40 -40
  99. package/dist/blog/server.mjs +1 -1
  100. package/dist/blog/tag-links.test.d.ts +2 -0
  101. package/dist/blog/tag-links.test.d.ts.map +1 -0
  102. package/dist/blog/types-wire-shape.test.d.ts +2 -0
  103. package/dist/blog/types-wire-shape.test.d.ts.map +1 -0
  104. package/dist/blog/types.d.ts +25 -19
  105. package/dist/blog/types.d.ts.map +1 -1
  106. package/dist/blog/widget-styles.d.ts +9 -0
  107. package/dist/blog/widget-styles.d.ts.map +1 -0
  108. package/dist/{chunk-I2IA3JXD.js → chunk-2EJX56YJ.js} +8 -8
  109. package/dist/{chunk-I2IA3JXD.js.map → chunk-2EJX56YJ.js.map} +1 -1
  110. package/dist/{chunk-NJ4YX3CI.mjs → chunk-2XHEUWHV.mjs} +4 -4
  111. package/dist/{chunk-NJ4YX3CI.mjs.map → chunk-2XHEUWHV.mjs.map} +1 -1
  112. package/dist/{chunk-RUOEUMAW.js → chunk-44ZTBQH4.js} +3 -3
  113. package/dist/{chunk-RUOEUMAW.js.map → chunk-44ZTBQH4.js.map} +1 -1
  114. package/dist/chunk-4SQ6PROR.mjs +6 -0
  115. package/dist/{chunk-NQNSATTA.mjs.map → chunk-4SQ6PROR.mjs.map} +1 -1
  116. package/dist/{chunk-D4KHH44S.mjs → chunk-4TU246Q4.mjs} +10 -3
  117. package/dist/chunk-4TU246Q4.mjs.map +1 -0
  118. package/dist/{chunk-BUF6IZUE.mjs → chunk-5G2ZRQMO.mjs} +3 -3
  119. package/dist/{chunk-BUF6IZUE.mjs.map → chunk-5G2ZRQMO.mjs.map} +1 -1
  120. package/dist/{chunk-A7OO6OPW.mjs → chunk-5W56B52Z.mjs} +3 -3
  121. package/dist/{chunk-A7OO6OPW.mjs.map → chunk-5W56B52Z.mjs.map} +1 -1
  122. package/dist/{chunk-LVM63JSA.mjs → chunk-6YKNDQYJ.mjs} +3 -3
  123. package/dist/{chunk-LVM63JSA.mjs.map → chunk-6YKNDQYJ.mjs.map} +1 -1
  124. package/dist/{chunk-JJS63TDR.mjs → chunk-A3VGZAZQ.mjs} +483 -21
  125. package/dist/chunk-A3VGZAZQ.mjs.map +1 -0
  126. package/dist/{chunk-YWBXKEAF.js → chunk-ACLBRIYD.js} +3 -3
  127. package/dist/{chunk-YWBXKEAF.js.map → chunk-ACLBRIYD.js.map} +1 -1
  128. package/dist/{chunk-OQTP5M5Y.js → chunk-ACWGG4VW.js} +9 -9
  129. package/dist/{chunk-OQTP5M5Y.js.map → chunk-ACWGG4VW.js.map} +1 -1
  130. package/dist/{chunk-NQEUFRMX.mjs → chunk-ADBLBGCQ.mjs} +3 -3
  131. package/dist/{chunk-NQEUFRMX.mjs.map → chunk-ADBLBGCQ.mjs.map} +1 -1
  132. package/dist/{chunk-45VPULF2.mjs → chunk-ADOGOLYO.mjs} +4 -4
  133. package/dist/{chunk-45VPULF2.mjs.map → chunk-ADOGOLYO.mjs.map} +1 -1
  134. package/dist/chunk-AK6JZ3OE.mjs +65 -0
  135. package/dist/chunk-AK6JZ3OE.mjs.map +1 -0
  136. package/dist/{chunk-UR4HKLHW.js → chunk-BGBJSMXT.js} +6 -6
  137. package/dist/{chunk-UR4HKLHW.js.map → chunk-BGBJSMXT.js.map} +1 -1
  138. package/dist/{chunk-INR6AQ54.mjs → chunk-BUDV7QHH.mjs} +4 -4
  139. package/dist/{chunk-INR6AQ54.mjs.map → chunk-BUDV7QHH.mjs.map} +1 -1
  140. package/dist/{chunk-C22WW7G2.mjs → chunk-BVLGJ2CZ.mjs} +3 -3
  141. package/dist/{chunk-C22WW7G2.mjs.map → chunk-BVLGJ2CZ.mjs.map} +1 -1
  142. package/dist/{chunk-6WJDTGM6.js → chunk-CBMHJPR7.js} +5 -5
  143. package/dist/{chunk-6WJDTGM6.js.map → chunk-CBMHJPR7.js.map} +1 -1
  144. package/dist/{chunk-H3F4GV2S.js → chunk-CGQO7MFO.js} +14 -14
  145. package/dist/{chunk-H3F4GV2S.js.map → chunk-CGQO7MFO.js.map} +1 -1
  146. package/dist/{chunk-ZXRORNAW.js → chunk-CKPFETIO.js} +4 -4
  147. package/dist/{chunk-ZXRORNAW.js.map → chunk-CKPFETIO.js.map} +1 -1
  148. package/dist/{chunk-EQZ42LAK.mjs → chunk-CYQB5GLU.mjs} +4 -4
  149. package/dist/{chunk-EQZ42LAK.mjs.map → chunk-CYQB5GLU.mjs.map} +1 -1
  150. package/dist/{chunk-6VHVIBLQ.mjs → chunk-DHXQBTXE.mjs} +62 -41
  151. package/dist/chunk-DHXQBTXE.mjs.map +1 -0
  152. package/dist/{chunk-5EFSD7VM.js → chunk-DKRXPXOR.js} +490 -20
  153. package/dist/chunk-DKRXPXOR.js.map +1 -0
  154. package/dist/chunk-DO6ATNLN.js +67 -0
  155. package/dist/chunk-DO6ATNLN.js.map +1 -0
  156. package/dist/{chunk-R6XBPA6C.mjs → chunk-DTNNZJYM.mjs} +4 -4
  157. package/dist/{chunk-R6XBPA6C.mjs.map → chunk-DTNNZJYM.mjs.map} +1 -1
  158. package/dist/{chunk-4OSZ2JD3.js → chunk-E3GHVAMK.js} +18 -18
  159. package/dist/{chunk-4OSZ2JD3.js.map → chunk-E3GHVAMK.js.map} +1 -1
  160. package/dist/{chunk-I6XKZNFT.mjs → chunk-EKTMXHBI.mjs} +3 -3
  161. package/dist/{chunk-I6XKZNFT.mjs.map → chunk-EKTMXHBI.mjs.map} +1 -1
  162. package/dist/{chunk-M52FYLV4.js → chunk-EZLK2OQL.js} +7 -7
  163. package/dist/{chunk-M52FYLV4.js.map → chunk-EZLK2OQL.js.map} +1 -1
  164. package/dist/{chunk-VLHHBJSV.js → chunk-FMOOQKZU.js} +8 -8
  165. package/dist/{chunk-VLHHBJSV.js.map → chunk-FMOOQKZU.js.map} +1 -1
  166. package/dist/{chunk-LQENHKD3.mjs → chunk-FZISCIJV.mjs} +4 -4
  167. package/dist/{chunk-LQENHKD3.mjs.map → chunk-FZISCIJV.mjs.map} +1 -1
  168. package/dist/{chunk-CQWG5ICB.js → chunk-GYAH4KFC.js} +4 -4
  169. package/dist/{chunk-CQWG5ICB.js.map → chunk-GYAH4KFC.js.map} +1 -1
  170. package/dist/{chunk-FIA3WNEM.js → chunk-GZVSGQKT.js} +3 -3
  171. package/dist/{chunk-FIA3WNEM.js.map → chunk-GZVSGQKT.js.map} +1 -1
  172. package/dist/{chunk-EUAOOOIE.js → chunk-HPIY7AR3.js} +14 -14
  173. package/dist/{chunk-EUAOOOIE.js.map → chunk-HPIY7AR3.js.map} +1 -1
  174. package/dist/chunk-HX6ZG3PP.js +19 -0
  175. package/dist/chunk-HX6ZG3PP.js.map +1 -0
  176. package/dist/{chunk-H27UCW6K.js → chunk-IQLYFQKZ.js} +15 -15
  177. package/dist/{chunk-H27UCW6K.js.map → chunk-IQLYFQKZ.js.map} +1 -1
  178. package/dist/{chunk-FBI6LYTM.js → chunk-JBGRXICL.js} +62 -41
  179. package/dist/chunk-JBGRXICL.js.map +1 -0
  180. package/dist/{chunk-E242GZNE.js → chunk-JEI3CSY4.js} +4 -4
  181. package/dist/{chunk-E242GZNE.js.map → chunk-JEI3CSY4.js.map} +1 -1
  182. package/dist/{chunk-6ABCPVJL.js → chunk-MCXHQHIX.js} +4 -4
  183. package/dist/{chunk-6ABCPVJL.js.map → chunk-MCXHQHIX.js.map} +1 -1
  184. package/dist/{chunk-JNKQKGYH.mjs → chunk-NIJVVW4G.mjs} +3 -3
  185. package/dist/{chunk-JNKQKGYH.mjs.map → chunk-NIJVVW4G.mjs.map} +1 -1
  186. package/dist/{chunk-TY3BPHTE.mjs → chunk-NSTY7ZZA.mjs} +7 -7
  187. package/dist/{chunk-TY3BPHTE.mjs.map → chunk-NSTY7ZZA.mjs.map} +1 -1
  188. package/dist/{chunk-3BXYZC3V.mjs → chunk-OAJVITNO.mjs} +3 -3
  189. package/dist/{chunk-3BXYZC3V.mjs.map → chunk-OAJVITNO.mjs.map} +1 -1
  190. package/dist/{chunk-36E6QKGL.mjs → chunk-OTHKWMDB.mjs} +3 -3
  191. package/dist/{chunk-36E6QKGL.mjs.map → chunk-OTHKWMDB.mjs.map} +1 -1
  192. package/dist/{chunk-ZWMAQ52D.mjs → chunk-ROJ25QM3.mjs} +3 -3
  193. package/dist/{chunk-ZWMAQ52D.mjs.map → chunk-ROJ25QM3.mjs.map} +1 -1
  194. package/dist/{chunk-NDS6MXIP.mjs → chunk-SXNKLHOX.mjs} +3 -3
  195. package/dist/{chunk-NDS6MXIP.mjs.map → chunk-SXNKLHOX.mjs.map} +1 -1
  196. package/dist/{chunk-VYNOQCEK.js → chunk-TAM2D54C.js} +14 -14
  197. package/dist/{chunk-VYNOQCEK.js.map → chunk-TAM2D54C.js.map} +1 -1
  198. package/dist/{chunk-VU45CH5R.mjs → chunk-TECD4AP7.mjs} +3 -3
  199. package/dist/{chunk-VU45CH5R.mjs.map → chunk-TECD4AP7.mjs.map} +1 -1
  200. package/dist/{chunk-MWKYLWCH.mjs → chunk-UMWVTIIZ.mjs} +8 -8
  201. package/dist/{chunk-MWKYLWCH.mjs.map → chunk-UMWVTIIZ.mjs.map} +1 -1
  202. package/dist/{chunk-ULP6BTN2.js → chunk-VCNPTLK2.js} +12 -12
  203. package/dist/{chunk-ULP6BTN2.js.map → chunk-VCNPTLK2.js.map} +1 -1
  204. package/dist/{chunk-FPWPRFTP.js → chunk-VIIGOCX4.js} +15 -15
  205. package/dist/{chunk-FPWPRFTP.js.map → chunk-VIIGOCX4.js.map} +1 -1
  206. package/dist/{chunk-PSBAUXUH.mjs → chunk-VWVUYL5J.mjs} +4 -4
  207. package/dist/{chunk-PSBAUXUH.mjs.map → chunk-VWVUYL5J.mjs.map} +1 -1
  208. package/dist/{chunk-67MTTPJV.js → chunk-WMNRTCYY.js} +11 -11
  209. package/dist/{chunk-67MTTPJV.js.map → chunk-WMNRTCYY.js.map} +1 -1
  210. package/dist/{chunk-C3M5E4YI.js → chunk-WZMM57R2.js} +5 -5
  211. package/dist/{chunk-C3M5E4YI.js.map → chunk-WZMM57R2.js.map} +1 -1
  212. package/dist/chunk-YFX3Q56O.mjs +16 -0
  213. package/dist/chunk-YFX3Q56O.mjs.map +1 -0
  214. package/dist/chunk-YPEX4RDE.js +8 -0
  215. package/dist/{chunk-UXIUJYFK.js.map → chunk-YPEX4RDE.js.map} +1 -1
  216. package/dist/{chunk-R7V7HNJJ.js → chunk-Z33JXJTJ.js} +10 -3
  217. package/dist/chunk-Z33JXJTJ.js.map +1 -0
  218. package/dist/{chunk-X2PAODFM.mjs → chunk-ZFZMN4LT.mjs} +3 -3
  219. package/dist/{chunk-X2PAODFM.mjs.map → chunk-ZFZMN4LT.mjs.map} +1 -1
  220. package/dist/cli/index.js +7 -27
  221. package/dist/cli/index.js.map +1 -1
  222. package/dist/cli/index.mjs +5 -25
  223. package/dist/cli/index.mjs.map +1 -1
  224. package/dist/client/index.js +4 -4
  225. package/dist/client/index.mjs +3 -3
  226. package/dist/commerce/index.js +56 -56
  227. package/dist/commerce/index.mjs +5 -5
  228. package/dist/commerce/server-result.test.d.ts +2 -0
  229. package/dist/commerce/server-result.test.d.ts.map +1 -0
  230. package/dist/commerce/server.d.ts +51 -0
  231. package/dist/commerce/server.d.ts.map +1 -1
  232. package/dist/commerce/server.js +57 -24
  233. package/dist/commerce/server.js.map +1 -1
  234. package/dist/commerce/server.mjs +54 -25
  235. package/dist/commerce/server.mjs.map +1 -1
  236. package/dist/engage/index.js +10 -10
  237. package/dist/engage/index.mjs +7 -7
  238. package/dist/fleet/index.js +8 -8
  239. package/dist/fleet/index.mjs +4 -4
  240. package/dist/forms/index.js +16 -16
  241. package/dist/forms/index.mjs +9 -9
  242. package/dist/forms/server.js +10 -10
  243. package/dist/forms/server.mjs +8 -8
  244. package/dist/forms/static.js +7 -7
  245. package/dist/forms/static.mjs +6 -6
  246. package/dist/images/index.js +11 -11
  247. package/dist/images/index.mjs +4 -4
  248. package/dist/index.js +63 -63
  249. package/dist/index.mjs +9 -9
  250. package/dist/layout/client.js +8 -8
  251. package/dist/layout/client.mjs +7 -7
  252. package/dist/layout/index.js +10 -10
  253. package/dist/layout/index.mjs +8 -8
  254. package/dist/llms/generateLLMsTxt.d.ts.map +1 -1
  255. package/dist/llms/humanize-industry.d.ts +9 -0
  256. package/dist/llms/humanize-industry.d.ts.map +1 -0
  257. package/dist/llms/humanize-industry.test.d.ts +2 -0
  258. package/dist/llms/humanize-industry.test.d.ts.map +1 -0
  259. package/dist/llms/index.js +12 -12
  260. package/dist/llms/index.mjs +2 -2
  261. package/dist/maps/index.js +5 -5
  262. package/dist/maps/index.mjs +3 -3
  263. package/dist/search/index.js +4 -4
  264. package/dist/search/index.mjs +3 -3
  265. package/dist/seo/client.js +5 -5
  266. package/dist/seo/client.mjs +4 -4
  267. package/dist/seo/index.js +5 -5
  268. package/dist/seo/index.mjs +4 -4
  269. package/dist/server/index.js +3 -3
  270. package/dist/server/index.mjs +2 -2
  271. package/dist/shared/version.d.ts +1 -1
  272. package/dist/signal/index.js +11 -11
  273. package/dist/signal/index.mjs +2 -2
  274. package/dist/sitemap/index.js +2 -2
  275. package/dist/sitemap/index.mjs +1 -1
  276. package/dist/sync/index.js +16 -16
  277. package/dist/sync/index.mjs +4 -4
  278. package/package.json +1 -1
  279. package/dist/AnalyticsProvider-DNMYYBKX.js +0 -31
  280. package/dist/AnalyticsProvider-TWRQHKPZ.mjs +0 -10
  281. package/dist/ChatWidget-MDWEXISQ.js +0 -20
  282. package/dist/ChatWidget-UQMEJAHY.mjs +0 -11
  283. package/dist/EngageWidget-UIIN43ZU.mjs +0 -9
  284. package/dist/EngageWidget-VRC7NUG6.js +0 -18
  285. package/dist/ManagedForm-7L2W5BBZ.js +0 -23
  286. package/dist/ManagedForm-D7CFOIXH.mjs +0 -14
  287. package/dist/SitemapSync-RFY6PUG7.mjs +0 -8
  288. package/dist/SitemapSync-SR6OJRIA.js +0 -17
  289. package/dist/chunk-5EFSD7VM.js.map +0 -1
  290. package/dist/chunk-6VHVIBLQ.mjs.map +0 -1
  291. package/dist/chunk-D4KHH44S.mjs.map +0 -1
  292. package/dist/chunk-FBI6LYTM.js.map +0 -1
  293. package/dist/chunk-JJS63TDR.mjs.map +0 -1
  294. package/dist/chunk-NQNSATTA.mjs +0 -6
  295. package/dist/chunk-R7V7HNJJ.js.map +0 -1
  296. package/dist/chunk-UXIUJYFK.js +0 -8
@@ -1,5 +1,5 @@
1
1
  import { resolveSiteHost } from './chunk-GZJE23Y5.mjs';
2
- import { configureSiteCredential, currentCredential } from './chunk-NDS6MXIP.mjs';
2
+ import { configureSiteCredential, currentCredential } from './chunk-SXNKLHOX.mjs';
3
3
 
4
4
  // src/shared/publishCredential.ts
5
5
  function publishSiteCredential({
@@ -19,5 +19,5 @@ function publishSiteCredential({
19
19
  }
20
20
 
21
21
  export { publishSiteCredential };
22
- //# sourceMappingURL=chunk-ZWMAQ52D.mjs.map
23
- //# sourceMappingURL=chunk-ZWMAQ52D.mjs.map
22
+ //# sourceMappingURL=chunk-ROJ25QM3.mjs.map
23
+ //# sourceMappingURL=chunk-ROJ25QM3.mjs.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/shared/publishCredential.ts"],"names":[],"mappings":";;;;AAkEO,SAAS,qBAAA,CAAsB;AAAA,EACpC,MAAA;AAAA,EACA,MAAA,GAAS,sBAAA;AAAA,EACT,IAAA;AAAA,EACA,KAAA,GAAQ,KAAA;AAAA,EACR;AACF,CAAA,EAAuC;AACrC,EAAA,IAAI,OAAO,WAAW,WAAA,EAAa;AAKnC,EAAA,uBAAA,CAAwB,EAAE,UAAA,EAAY,MAAA,EAAQ,MAAA,EAAQ,CAAA;AACrD,EAAC,OAAe,oBAAA,GAAuB,MAAA;AACvC,EAAC,MAAA,CAAe,oBAAA,GAAuB,iBAAA,CAAkB,MAAM,CAAA;AAC/D,EAAC,OAAe,kBAAA,GAAqB,KAAA;AACrC,EAAC,MAAA,CAAe,iBAAA,GAAoB,IAAA,IAAQ,eAAA,EAAgB;AAG7D,EAAA,IAAI,cAAA,EAAiB,MAAA,CAAe,uBAAA,GAA0B,cAAA;AAChE","file":"chunk-ZWMAQ52D.mjs","sourcesContent":["/**\n * @sonordev/site-kit shared — Client credential + window-global publishing\n *\n * SINGLE SOURCE OF TRUTH for seeding the browser-side token manager and the\n * `window.__SITE_KIT_*` globals that every client module reads. Used by:\n *\n * - `SiteKitClientProviders` (core `SiteKitLayout`)\n * - `SiteKitCredential` (`@sonordev/site-kit/client`) — the public component\n * for layouts that are NOT core `SiteKitLayout`, e.g.\n * `@sonordev/agency-site-kit`'s `AgencySiteKitLayout`.\n *\n * Do not re-fork this. Before it existed, agency sites hand-rolled their own\n * \"set the globals on mount\" component (upforge's `UptradeSiteKitInit`), and\n * because those copies had no access to the token manager they published the\n * RAW `sonor_` key into the client bundle — the exact exposure the mint exists\n * to prevent. Any layout that puts a credential on `window` goes through here.\n *\n * Client-safe: no `server-only` guard, SSR-safe (every write is window-gated).\n * The minting half is server-only and lives in `../server/mint-site-token`.\n */\n// Leaf modules, NOT '../sites/contract' — see sites/normalize.ts. Importing the\n// full contract here shipped its JSON schema to every browser that loads a\n// credential-publishing entry.\nimport { resolveSiteHost } from '../sites/resolve'\nimport { configureSiteCredential, currentCredential } from './siteToken'\n\n/**\n * Re-exported so the client-side callers below and every existing importer keep\n * a single name for this. The implementation lives in `../sites/resolve` — the\n * ONE resolver shared by the browser (this file) and the build-time sitemap /\n * llms.txt path, so both tag the same host.\n */\nexport { resolveSiteHost }\n\nexport interface PublishSiteCredentialOptions {\n /**\n * The credential the layout minted server-side. In 3.2+ this is a short-lived\n * `st1.` token that `sonorFetch` refreshes transparently. A raw `sonor_` key\n * still works (2.x kit, or the mint-failed fallback) but should never be\n * routed here from a client component — it would ship the secret to the\n * browser.\n */\n apiKey?: string\n apiUrl?: string\n /** Pre-resolved sub-site host. Omit to resolve via `resolveSiteHost`. */\n site?: string\n debug?: boolean\n /**\n * Referrer-restricted Google Maps BROWSER key for client map components.\n * Resolved server-side by SiteKitLayout (NEXT_PUBLIC_GOOGLE_MAPS_API_KEY /\n * GOOGLE_MAPS_BROWSER_KEY) because maps/api.ts runs client-side, where a bare\n * process.env read is dead code unless the app's bundler happens to inline it.\n * Never route a server secret here.\n */\n mapsBrowserKey?: string\n}\n\n/**\n * Seed the token manager and publish the `window.__SITE_KIT_*` globals.\n *\n * Called during RENDER, not in an effect: client modules read these globals in\n * their own mount effects, and effects run child-first, so an effect-based\n * publish would land after the modules that need it.\n *\n * No-op on the server.\n */\nexport function publishSiteCredential({\n apiKey,\n apiUrl = 'https://api.sonor.io',\n site,\n debug = false,\n mapsBrowserKey,\n}: PublishSiteCredentialOptions): void {\n if (typeof window === 'undefined') return\n\n // Seed the client token manager. The window global is set to the freshest\n // token held — a prior page this session may already have refreshed past the\n // seed the layout injected. In raw-key mode this is a passthrough.\n configureSiteCredential({ credential: apiKey, apiUrl })\n ;(window as any).__SITE_KIT_API_URL__ = apiUrl\n ;(window as any).__SITE_KIT_API_KEY__ = currentCredential(apiKey)\n ;(window as any).__SITE_KIT_DEBUG__ = debug\n ;(window as any).__SITE_KIT_SITE__ = site ?? resolveSiteHost()\n // maps/api.ts falls back to this global when the Sonor platform hasn't\n // provisioned a browser key. Don't clobber a value another layout already set.\n if (mapsBrowserKey) (window as any).__GOOGLE_MAPS_API_KEY__ = mapsBrowserKey\n}\n"]}
1
+ {"version":3,"sources":["../src/shared/publishCredential.ts"],"names":[],"mappings":";;;;AAkEO,SAAS,qBAAA,CAAsB;AAAA,EACpC,MAAA;AAAA,EACA,MAAA,GAAS,sBAAA;AAAA,EACT,IAAA;AAAA,EACA,KAAA,GAAQ,KAAA;AAAA,EACR;AACF,CAAA,EAAuC;AACrC,EAAA,IAAI,OAAO,WAAW,WAAA,EAAa;AAKnC,EAAA,uBAAA,CAAwB,EAAE,UAAA,EAAY,MAAA,EAAQ,MAAA,EAAQ,CAAA;AACrD,EAAC,OAAe,oBAAA,GAAuB,MAAA;AACvC,EAAC,MAAA,CAAe,oBAAA,GAAuB,iBAAA,CAAkB,MAAM,CAAA;AAC/D,EAAC,OAAe,kBAAA,GAAqB,KAAA;AACrC,EAAC,MAAA,CAAe,iBAAA,GAAoB,IAAA,IAAQ,eAAA,EAAgB;AAG7D,EAAA,IAAI,cAAA,EAAiB,MAAA,CAAe,uBAAA,GAA0B,cAAA;AAChE","file":"chunk-ROJ25QM3.mjs","sourcesContent":["/**\n * @sonordev/site-kit shared — Client credential + window-global publishing\n *\n * SINGLE SOURCE OF TRUTH for seeding the browser-side token manager and the\n * `window.__SITE_KIT_*` globals that every client module reads. Used by:\n *\n * - `SiteKitClientProviders` (core `SiteKitLayout`)\n * - `SiteKitCredential` (`@sonordev/site-kit/client`) — the public component\n * for layouts that are NOT core `SiteKitLayout`, e.g.\n * `@sonordev/agency-site-kit`'s `AgencySiteKitLayout`.\n *\n * Do not re-fork this. Before it existed, agency sites hand-rolled their own\n * \"set the globals on mount\" component (upforge's `UptradeSiteKitInit`), and\n * because those copies had no access to the token manager they published the\n * RAW `sonor_` key into the client bundle — the exact exposure the mint exists\n * to prevent. Any layout that puts a credential on `window` goes through here.\n *\n * Client-safe: no `server-only` guard, SSR-safe (every write is window-gated).\n * The minting half is server-only and lives in `../server/mint-site-token`.\n */\n// Leaf modules, NOT '../sites/contract' — see sites/normalize.ts. Importing the\n// full contract here shipped its JSON schema to every browser that loads a\n// credential-publishing entry.\nimport { resolveSiteHost } from '../sites/resolve'\nimport { configureSiteCredential, currentCredential } from './siteToken'\n\n/**\n * Re-exported so the client-side callers below and every existing importer keep\n * a single name for this. The implementation lives in `../sites/resolve` — the\n * ONE resolver shared by the browser (this file) and the build-time sitemap /\n * llms.txt path, so both tag the same host.\n */\nexport { resolveSiteHost }\n\nexport interface PublishSiteCredentialOptions {\n /**\n * The credential the layout minted server-side. In 3.2+ this is a short-lived\n * `st1.` token that `sonorFetch` refreshes transparently. A raw `sonor_` key\n * still works (2.x kit, or the mint-failed fallback) but should never be\n * routed here from a client component — it would ship the secret to the\n * browser.\n */\n apiKey?: string\n apiUrl?: string\n /** Pre-resolved sub-site host. Omit to resolve via `resolveSiteHost`. */\n site?: string\n debug?: boolean\n /**\n * Referrer-restricted Google Maps BROWSER key for client map components.\n * Resolved server-side by SiteKitLayout (NEXT_PUBLIC_GOOGLE_MAPS_API_KEY /\n * GOOGLE_MAPS_BROWSER_KEY) because maps/api.ts runs client-side, where a bare\n * process.env read is dead code unless the app's bundler happens to inline it.\n * Never route a server secret here.\n */\n mapsBrowserKey?: string\n}\n\n/**\n * Seed the token manager and publish the `window.__SITE_KIT_*` globals.\n *\n * Called during RENDER, not in an effect: client modules read these globals in\n * their own mount effects, and effects run child-first, so an effect-based\n * publish would land after the modules that need it.\n *\n * No-op on the server.\n */\nexport function publishSiteCredential({\n apiKey,\n apiUrl = 'https://api.sonor.io',\n site,\n debug = false,\n mapsBrowserKey,\n}: PublishSiteCredentialOptions): void {\n if (typeof window === 'undefined') return\n\n // Seed the client token manager. The window global is set to the freshest\n // token held — a prior page this session may already have refreshed past the\n // seed the layout injected. In raw-key mode this is a passthrough.\n configureSiteCredential({ credential: apiKey, apiUrl })\n ;(window as any).__SITE_KIT_API_URL__ = apiUrl\n ;(window as any).__SITE_KIT_API_KEY__ = currentCredential(apiKey)\n ;(window as any).__SITE_KIT_DEBUG__ = debug\n ;(window as any).__SITE_KIT_SITE__ = site ?? resolveSiteHost()\n // maps/api.ts falls back to this global when the Sonor platform hasn't\n // provisioned a browser key. Don't clobber a value another layout already set.\n if (mapsBrowserKey) (window as any).__GOOGLE_MAPS_API_KEY__ = mapsBrowserKey\n}\n"]}
@@ -1,4 +1,4 @@
1
- import { SITE_KIT_VERSION } from './chunk-NQNSATTA.mjs';
1
+ import { SITE_KIT_VERSION } from './chunk-4SQ6PROR.mjs';
2
2
 
3
3
  // src/shared/siteToken.ts
4
4
  var SITE_TOKEN_PREFIX = "st1.";
@@ -146,5 +146,5 @@ function currentCredential(seed) {
146
146
  }
147
147
 
148
148
  export { configureSiteCredential, credentialBreakerId, currentCredential, getFreshCredential, isSiteToken, isTokenMode, refreshSiteToken };
149
- //# sourceMappingURL=chunk-NDS6MXIP.mjs.map
150
- //# sourceMappingURL=chunk-NDS6MXIP.mjs.map
149
+ //# sourceMappingURL=chunk-SXNKLHOX.mjs.map
150
+ //# sourceMappingURL=chunk-SXNKLHOX.mjs.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/shared/siteToken.ts"],"names":[],"mappings":";;;AAuBO,IAAM,iBAAA,GAAoB,MAAA;AAGjC,IAAM,kBAAkB,CAAA,GAAI,GAAA;AAC5B,IAAM,kBAAA,GAAqB,GAAA;AAC3B,IAAM,WAAA,GAAc,sBAAA;AAEb,SAAS,YAAY,UAAA,EAAqC;AAC/D,EAAA,OAAO,OAAO,UAAA,KAAe,QAAA,IAAY,UAAA,CAAW,WAAW,iBAAiB,CAAA;AAClF;AASO,SAAS,sBAAsB,KAAA,EAA6C;AACjF,EAAA,IAAI,CAAC,WAAA,CAAY,KAAK,CAAA,EAAG,OAAO,IAAA;AAChC,EAAA,MAAM,GAAA,GAAO,KAAA,CAAiB,KAAA,CAAM,GAAG,EAAE,CAAC,CAAA;AAC1C,EAAA,IAAI,CAAC,KAAK,OAAO,IAAA;AACjB,EAAA,IAAI;AAEF,IAAA,MAAM,GAAA,GAAM,IAAI,OAAA,CAAQ,IAAA,EAAM,GAAG,CAAA,CAAE,OAAA,CAAQ,MAAM,GAAG,CAAA;AACpD,IAAA,MAAM,IAAA,GACJ,OAAO,IAAA,KAAS,UAAA,GACZ,IAAA,CAAK,GAAG,CAAA,GACR,MAAA,CAAO,IAAA,CAAK,GAAA,EAAK,WAAW,CAAA,CAAE,SAAS,MAAM,CAAA;AACnD,IAAA,MAAM,MAAA,GAAS,IAAA,CAAK,KAAA,CAAM,IAAI,CAAA;AAC9B,IAAA,OAAO,OAAO,MAAA,KAAW,QAAA,IAAY,MAAA,GAAS,MAAA,GAAS,IAAA;AAAA,EACzD,CAAA,CAAA,MAAQ;AACN,IAAA,OAAO,IAAA;AAAA,EACT;AACF;AAOO,SAAS,oBAAoB,UAAA,EAAoC;AACtE,EAAA,IAAI,CAAC,YAAY,OAAO,aAAA;AACxB,EAAA,MAAM,MAAA,GAAS,sBAAsB,UAAU,CAAA;AAC/C,EAAA,IAAI,MAAA,EAAQ,GAAA,EAAK,OAAO,CAAA,IAAA,EAAO,OAAO,GAAG,CAAA,CAAA;AACzC,EAAA,OAAO,UAAA,CAAW,KAAA,CAAM,CAAA,EAAG,EAAE,CAAA;AAC/B;AAeA,SAAS,iBAAA,GAAgC;AACvC,EAAA,OAAO;AAAA,IACL,IAAA,EAAM,MAAA;AAAA,IACN,OAAA,EAAS,KAAA;AAAA,IACT,MAAA,EAAQ,sBAAA;AAAA,IACR,KAAA,EAAO,IAAA;AAAA,IACP,UAAA,EAAY;AAAA,GACd;AACF;AAcA,IAAM,eAAA,GAAkB,4BAAA;AAExB,IAAM,SAAqB,MAAM;AAC/B,EAAA,IAAI,OAAO,MAAA,KAAW,WAAA,EAAa,OAAO,iBAAA,EAAkB;AAC5D,EAAA,MAAM,CAAA,GAAI,MAAA;AACV,EAAA,OAAQ,4CAAuB,iBAAA,EAAkB,CAAA;AACnD,CAAA,GAAG;AAEH,SAAS,eAAA,GAAiC;AACxC,EAAA,IAAI,OAAO,MAAA,KAAW,WAAA,EAAa,OAAO,IAAA;AAC1C,EAAA,IAAI;AACF,IAAA,MAAM,GAAA,GAAM,MAAA,CAAO,cAAA,CAAe,OAAA,CAAQ,WAAW,CAAA;AACrD,IAAA,IAAI,CAAC,KAAK,OAAO,IAAA;AACjB,IAAA,MAAM,MAAA,GAAS,IAAA,CAAK,KAAA,CAAM,GAAG,CAAA;AAC7B,IAAA,OAAO,OAAO,MAAA,EAAQ,KAAA,KAAU,QAAA,GAAW,OAAO,KAAA,GAAQ,IAAA;AAAA,EAC5D,CAAA,CAAA,MAAQ;AACN,IAAA,OAAO,IAAA;AAAA,EACT;AACF;AAEA,SAAS,WAAW,KAAA,EAAqB;AACvC,EAAA,IAAI,OAAO,WAAW,WAAA,EAAa;AACnC,EAAA,IAAI;AACF,IAAA,MAAA,CAAO,cAAA,CAAe,QAAQ,WAAA,EAAa,IAAA,CAAK,UAAU,EAAE,KAAA,EAAO,CAAC,CAAA;AAAA,EACtE,CAAA,CAAA,MAAQ;AAAA,EAER;AACA,EAAA,IAAI;AACF,IAAA;AAAC,IAAC,OAAe,oBAAA,GAAuB,KAAA;AAAA,EAC1C,CAAA,CAAA,MAAQ;AAAA,EAER;AACF;AAEA,SAAS,SAAS,KAAA,EAA8B;AAC9C,EAAA,MAAM,MAAA,GAAS,sBAAsB,KAAK,CAAA;AAC1C,EAAA,OAAO,OAAO,MAAA,EAAQ,GAAA,KAAQ,QAAA,GAAW,MAAA,CAAO,MAAM,GAAA,GAAO,CAAA;AAC/D;AAMO,SAAS,wBAAwB,IAAA,EAG/B;AACP,EAAA,KAAA,CAAM,OAAO,IAAA,CAAK,UAAA;AAClB,EAAA,KAAA,CAAM,OAAA,GAAU,WAAA,CAAY,IAAA,CAAK,UAAU,CAAA;AAC3C,EAAA,IAAI,IAAA,CAAK,QAAQ,KAAA,CAAM,MAAA,GAAS,KAAK,MAAA,CAAO,OAAA,CAAQ,QAAQ,EAAE,CAAA;AAE9D,EAAA,IAAI,CAAC,MAAM,OAAA,EAAS;AAClB,IAAA,KAAA,CAAM,KAAA,GAAQ,IAAA;AACd,IAAA;AAAA,EACF;AAKA,EAAA,MAAM,QAAQ,KAAA,CAAM,KAAA;AACpB,EAAA,IAAI,IAAA,GAAO,KAAK,UAAA,IAAc,IAAA;AAC9B,EAAA,MAAM,SAAS,eAAA,EAAgB;AAC/B,EAAA,IAAI,UAAU,QAAA,CAAS,MAAM,IAAI,QAAA,CAAS,IAAI,GAAG,IAAA,GAAO,MAAA;AACxD,EAAA,IAAI,SAAS,QAAA,CAAS,KAAK,IAAI,QAAA,CAAS,IAAI,GAAG,IAAA,GAAO,KAAA;AACtD,EAAA,KAAA,CAAM,KAAA,GAAQ,IAAA;AAChB;AAEA,SAAS,YAAA,GAAwB;AAC/B,EAAA,IAAI,CAAC,KAAA,CAAM,OAAA,EAAS,OAAO,KAAA;AAC3B,EAAA,IAAI,CAAC,KAAA,CAAM,KAAA,EAAO,OAAO,IAAA;AACzB,EAAA,OAAO,KAAK,GAAA,EAAI,IAAK,QAAA,CAAS,KAAA,CAAM,KAAK,CAAA,GAAI,eAAA;AAC/C;AAEA,eAAe,SAAA,GAAoC;AACjD,EAAA,MAAM,UAAU,KAAA,CAAM,KAAA;AACtB,EAAA,IAAI,CAAC,SAAS,OAAO,IAAA;AACrB,EAAA,IAAI;AACF,IAAA,MAAM,MAAM,MAAM,KAAA,CAAM,CAAA,EAAG,KAAA,CAAM,MAAM,CAAA,8BAAA,CAAA,EAAkC;AAAA,MACvE,MAAA,EAAQ,MAAA;AAAA,MACR,OAAA,EAAS;AAAA,QACP,cAAA,EAAgB,kBAAA;AAAA,QAChB,mBAAA,EAAqB,gBAAA;AAAA;AAAA;AAAA,QAGrB,WAAA,EAAa;AAAA,OACf;AAAA,MACA,MAAM,IAAA,CAAK,SAAA,CAAU,EAAE,KAAA,EAAO,SAAS,CAAA;AAAA,MACvC,MAAA,EACE,OAAO,WAAA,KAAgB,WAAA,IAAe,YAAY,OAAA,GAC9C,WAAA,CAAY,OAAA,CAAQ,kBAAkB,CAAA,GACtC,KAAA;AAAA,KACP,CAAA;AACD,IAAA,IAAI,CAAC,GAAA,CAAI,EAAA,EAAI,OAAO,IAAA;AACpB,IAAA,MAAM,OAAO,MAAM,GAAA,CAAI,MAAK,CAAE,KAAA,CAAM,MAAM,IAAI,CAAA;AAC9C,IAAA,MAAM,OAAO,IAAA,EAAM,KAAA;AACnB,IAAA,IAAI,OAAO,IAAA,KAAS,QAAA,IAAY,WAAA,CAAY,IAAI,CAAA,EAAG;AACjD,MAAA,KAAA,CAAM,KAAA,GAAQ,IAAA;AACd,MAAA,UAAA,CAAW,IAAI,CAAA;AACf,MAAA,OAAO,IAAA;AAAA,IACT;AACA,IAAA,OAAO,IAAA;AAAA,EACT,CAAA,CAAA,MAAQ;AACN,IAAA,OAAO,IAAA;AAAA,EACT;AACF;AAGO,SAAS,gBAAA,GAA2C;AACzD,EAAA,IAAI,CAAC,KAAA,CAAM,OAAA,EAAS,OAAO,OAAA,CAAQ,QAAQ,IAAI,CAAA;AAC/C,EAAA,IAAI,KAAA,CAAM,UAAA,EAAY,OAAO,KAAA,CAAM,UAAA;AACnC,EAAA,KAAA,CAAM,UAAA,GAAa,SAAA,EAAU,CAAE,OAAA,CAAQ,MAAM;AAC3C,IAAA,KAAA,CAAM,UAAA,GAAa,IAAA;AAAA,EACrB,CAAC,CAAA;AACD,EAAA,OAAO,KAAA,CAAM,UAAA;AACf;AAMA,eAAsB,mBACpB,IAAA,EAC6B;AAI7B,EAAA,IAAI,CAAC,KAAA,CAAM,OAAA,IAAW,WAAA,CAAY,IAAI,CAAA,EAAG;AACvC,IAAA,uBAAA,CAAwB,EAAE,UAAA,EAAY,IAAA,EAAM,CAAA;AAAA,EAC9C;AAEA,EAAA,IAAI,CAAC,KAAA,CAAM,OAAA,EAAS,OAAO,QAAQ,KAAA,CAAM,IAAA;AACzC,EAAA,IAAI,cAAa,EAAG;AAClB,IAAA,MAAM,SAAA,GAAY,MAAM,gBAAA,EAAiB;AACzC,IAAA,IAAI,WAAW,OAAO,SAAA;AAAA,EAGxB;AACA,EAAA,OAAO,KAAA,CAAM,KAAA,IAAS,IAAA,IAAQ,KAAA,CAAM,IAAA;AACtC;AAGO,SAAS,WAAA,GAAuB;AACrC,EAAA,OAAO,KAAA,CAAM,OAAA;AACf;AAOO,SAAS,kBAAkB,IAAA,EAAmC;AACnE,EAAA,IAAI,CAAC,KAAA,CAAM,OAAA,EAAS,OAAO,QAAQ,KAAA,CAAM,IAAA;AACzC,EAAA,OAAO,KAAA,CAAM,KAAA,IAAS,IAAA,IAAQ,KAAA,CAAM,IAAA;AACtC","file":"chunk-NDS6MXIP.mjs","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":[],"mappings":"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","file":"chunk-SXNKLHOX.mjs","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,8 +1,8 @@
1
1
  'use client';
2
2
  'use strict';
3
3
 
4
- var chunkEUAOOOIE_js = require('./chunk-EUAOOOIE.js');
5
- var chunkFPWPRFTP_js = require('./chunk-FPWPRFTP.js');
4
+ var chunkHPIY7AR3_js = require('./chunk-HPIY7AR3.js');
5
+ var chunkVIIGOCX4_js = require('./chunk-VIIGOCX4.js');
6
6
  var jsxRuntime = require('react/jsx-runtime');
7
7
  var React5 = require('react');
8
8
 
@@ -112,7 +112,7 @@ async function apiPost(endpoint, body = {}) {
112
112
  return null;
113
113
  }
114
114
  try {
115
- const response = await chunkFPWPRFTP_js.sonorFetch(`${apiUrl}${endpoint}`, {
115
+ const response = await chunkVIIGOCX4_js.sonorFetch(`${apiUrl}${endpoint}`, {
116
116
  method: "POST",
117
117
  headers: { "Content-Type": "application/json" },
118
118
  body: JSON.stringify(body)
@@ -270,7 +270,7 @@ async function fetchActiveProcessor() {
270
270
  const { apiUrl, apiKey } = getApiConfig();
271
271
  if (!apiKey) return null;
272
272
  try {
273
- const response = await chunkFPWPRFTP_js.sonorFetch(`${apiUrl}/api/public/commerce/processor`, {
273
+ const response = await chunkVIIGOCX4_js.sonorFetch(`${apiUrl}/api/public/commerce/processor`, {
274
274
  method: "POST",
275
275
  headers: { "Content-Type": "application/json" },
276
276
  body: JSON.stringify({})
@@ -286,7 +286,7 @@ async function registerForEvent(eventId, scheduleId, customer) {
286
286
  const { apiUrl, apiKey } = getApiConfig();
287
287
  const analyticsSessionId = typeof sessionStorage !== "undefined" ? sessionStorage.getItem("_sk_sid") : null;
288
288
  try {
289
- const response = await chunkFPWPRFTP_js.sonorFetch(`${apiUrl}/api/public/commerce/register`, {
289
+ const response = await chunkVIIGOCX4_js.sonorFetch(`${apiUrl}/api/public/commerce/register`, {
290
290
  method: "POST",
291
291
  headers: { "Content-Type": "application/json" },
292
292
  body: JSON.stringify({
@@ -314,7 +314,7 @@ async function registerForEvent(eventId, scheduleId, customer) {
314
314
  async function validateDiscountCode(code, subtotal, offeringIds = []) {
315
315
  const { apiUrl, apiKey } = getApiConfig();
316
316
  try {
317
- const response = await chunkFPWPRFTP_js.sonorFetch(`${apiUrl}/api/public/commerce/discount/validate`, {
317
+ const response = await chunkVIIGOCX4_js.sonorFetch(`${apiUrl}/api/public/commerce/discount/validate`, {
318
318
  method: "POST",
319
319
  headers: { "Content-Type": "application/json" },
320
320
  body: JSON.stringify({ code, subtotal, offeringIds })
@@ -332,7 +332,7 @@ async function fetchProcessorConfig() {
332
332
  const { apiUrl, apiKey } = getApiConfig();
333
333
  if (!apiKey) return null;
334
334
  try {
335
- const response = await chunkFPWPRFTP_js.sonorFetch(`${apiUrl}/api/public/commerce/processor-config`, {
335
+ const response = await chunkVIIGOCX4_js.sonorFetch(`${apiUrl}/api/public/commerce/processor-config`, {
336
336
  method: "POST",
337
337
  headers: { "Content-Type": "application/json" },
338
338
  body: JSON.stringify({})
@@ -348,7 +348,7 @@ async function createPaymentIntent(options) {
348
348
  const apiKey = getApiKey();
349
349
  const sessionId = typeof sessionStorage !== "undefined" ? sessionStorage.getItem("_sk_sid") : null;
350
350
  try {
351
- const response = await chunkFPWPRFTP_js.sonorFetch(`${apiUrl}/api/public/commerce/create-payment-intent`, {
351
+ const response = await chunkVIIGOCX4_js.sonorFetch(`${apiUrl}/api/public/commerce/create-payment-intent`, {
352
352
  method: "POST",
353
353
  headers: { "Content-Type": "application/json" },
354
354
  body: JSON.stringify({
@@ -368,7 +368,7 @@ async function createCheckoutSession(optionsOrOfferingId, legacyOptions) {
368
368
  const options = typeof optionsOrOfferingId === "string" ? { offeringId: optionsOrOfferingId, ...legacyOptions } : optionsOrOfferingId;
369
369
  const analyticsSessionId = typeof sessionStorage !== "undefined" ? sessionStorage.getItem("_sk_sid") : null;
370
370
  try {
371
- const response = await chunkFPWPRFTP_js.sonorFetch(`${apiUrl}/api/public/commerce/checkout`, {
371
+ const response = await chunkVIIGOCX4_js.sonorFetch(`${apiUrl}/api/public/commerce/checkout`, {
372
372
  method: "POST",
373
373
  headers: { "Content-Type": "application/json" },
374
374
  body: JSON.stringify({
@@ -3097,7 +3097,7 @@ function ProductDetail({
3097
3097
  const [checkoutError, setCheckoutError] = React5.useState(null);
3098
3098
  const [showStickyBar, setShowStickyBar] = React5.useState(false);
3099
3099
  const buyButtonRef = React5.useRef(null);
3100
- const analytics = chunkEUAOOOIE_js.useAnalyticsOptional();
3100
+ const analytics = chunkHPIY7AR3_js.useAnalyticsOptional();
3101
3101
  React5.useEffect(() => {
3102
3102
  if (propProduct) {
3103
3103
  setProduct(propProduct);
@@ -4468,7 +4468,7 @@ function CheckoutForm({
4468
4468
  const [discountResult, setDiscountResult] = React5.useState(null);
4469
4469
  const [applyingDiscount, setApplyingDiscount] = React5.useState(false);
4470
4470
  const isProduct = offering.type === "product";
4471
- const analytics = chunkEUAOOOIE_js.useAnalyticsOptional();
4471
+ const analytics = chunkHPIY7AR3_js.useAnalyticsOptional();
4472
4472
  React5.useEffect(() => {
4473
4473
  fetchProcessorConfig().then((config) => {
4474
4474
  if (config?.processor) setProcessor(config.processor);
@@ -7246,7 +7246,7 @@ function EventsWidget({
7246
7246
  setLoading(true);
7247
7247
  setError(null);
7248
7248
  try {
7249
- const response = await chunkFPWPRFTP_js.sonorFetch(`${apiUrl}/api/public/commerce/events`, {
7249
+ const response = await chunkVIIGOCX4_js.sonorFetch(`${apiUrl}/api/public/commerce/events`, {
7250
7250
  method: "POST",
7251
7251
  headers: { "Content-Type": "application/json" },
7252
7252
  body: JSON.stringify({
@@ -8042,5 +8042,5 @@ exports.registerForEvent = registerForEvent;
8042
8042
  exports.useEventModal = useEventModal;
8043
8043
  exports.validateAddress = validateAddress;
8044
8044
  exports.validateDiscountCode = validateDiscountCode;
8045
- //# sourceMappingURL=chunk-VYNOQCEK.js.map
8046
- //# sourceMappingURL=chunk-VYNOQCEK.js.map
8045
+ //# sourceMappingURL=chunk-TAM2D54C.js.map
8046
+ //# sourceMappingURL=chunk-TAM2D54C.js.map