@sonordev/site-kit 6.3.0 → 6.3.1

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 (198) hide show
  1. package/agent-manifest.json +1 -1
  2. package/dist/{AnalyticsProvider-JKWJGIH2.js → AnalyticsProvider-G46LCH3V.js} +10 -10
  3. package/dist/{AnalyticsProvider-JKWJGIH2.js.map → AnalyticsProvider-G46LCH3V.js.map} +1 -1
  4. package/dist/{AnalyticsProvider-T4UBUUV4.mjs → AnalyticsProvider-IYGKHMVM.mjs} +6 -6
  5. package/dist/{AnalyticsProvider-T4UBUUV4.mjs.map → AnalyticsProvider-IYGKHMVM.mjs.map} +1 -1
  6. package/dist/{ArticleViewTracker-F5IP734Z.js → ArticleViewTracker-3USIHB4O.js} +6 -6
  7. package/dist/{ArticleViewTracker-F5IP734Z.js.map → ArticleViewTracker-3USIHB4O.js.map} +1 -1
  8. package/dist/{ArticleViewTracker-AYYSXNJS.mjs → ArticleViewTracker-7GEI37VK.mjs} +5 -5
  9. package/dist/{ArticleViewTracker-AYYSXNJS.mjs.map → ArticleViewTracker-7GEI37VK.mjs.map} +1 -1
  10. package/dist/ChatWidget-36IDUB53.mjs +17 -0
  11. package/dist/{ChatWidget-3RVBHZCS.mjs.map → ChatWidget-36IDUB53.mjs.map} +1 -1
  12. package/dist/{ChatWidget-RFSI2XNU.js → ChatWidget-VP3QQJA6.js} +11 -11
  13. package/dist/{ChatWidget-RFSI2XNU.js.map → ChatWidget-VP3QQJA6.js.map} +1 -1
  14. package/dist/EngageWidget-ILRTLGBB.mjs +12 -0
  15. package/dist/{EngageWidget-TE6S5KYT.mjs.map → EngageWidget-ILRTLGBB.mjs.map} +1 -1
  16. package/dist/EngageWidget-YHMSB4YE.js +21 -0
  17. package/dist/{EngageWidget-QO5S6YV5.js.map → EngageWidget-YHMSB4YE.js.map} +1 -1
  18. package/dist/{FileField-OXZXB3UW.mjs → FileField-DXGPA4OB.mjs} +5 -5
  19. package/dist/{FileField-OXZXB3UW.mjs.map → FileField-DXGPA4OB.mjs.map} +1 -1
  20. package/dist/{FileField-JQSRKWXW.js → FileField-LMSLNNRX.js} +6 -6
  21. package/dist/{FileField-JQSRKWXW.js.map → FileField-LMSLNNRX.js.map} +1 -1
  22. package/dist/{FormSpotlight-H2A3JIFI.js → FormSpotlight-5BQCAXIO.js} +9 -9
  23. package/dist/{FormSpotlight-H2A3JIFI.js.map → FormSpotlight-5BQCAXIO.js.map} +1 -1
  24. package/dist/{FormSpotlight-PZ5RLZRV.mjs → FormSpotlight-SEJ4NJHG.mjs} +3 -3
  25. package/dist/{FormSpotlight-PZ5RLZRV.mjs.map → FormSpotlight-SEJ4NJHG.mjs.map} +1 -1
  26. package/dist/{FormStage-CIHL7OBA.mjs → FormStage-6OLDPLYU.mjs} +3 -3
  27. package/dist/{FormStage-CIHL7OBA.mjs.map → FormStage-6OLDPLYU.mjs.map} +1 -1
  28. package/dist/{FormStage-ZA2FABYQ.js → FormStage-ZRXENSYN.js} +9 -9
  29. package/dist/{FormStage-ZA2FABYQ.js.map → FormStage-ZRXENSYN.js.map} +1 -1
  30. package/dist/ManagedForm-AIPXF5QY.mjs +16 -0
  31. package/dist/{ManagedForm-PTCWSTC5.mjs.map → ManagedForm-AIPXF5QY.mjs.map} +1 -1
  32. package/dist/ManagedForm-T464AA5B.js +25 -0
  33. package/dist/{ManagedForm-BVLS2QZR.js.map → ManagedForm-T464AA5B.js.map} +1 -1
  34. package/dist/{ManagedNewsletterForm-IB5VD43M.js → ManagedNewsletterForm-HKNXIKDV.js} +8 -8
  35. package/dist/{ManagedNewsletterForm-IB5VD43M.js.map → ManagedNewsletterForm-HKNXIKDV.js.map} +1 -1
  36. package/dist/{ManagedNewsletterForm-WMCRFDL7.mjs → ManagedNewsletterForm-UGDUBYR3.mjs} +7 -7
  37. package/dist/{ManagedNewsletterForm-WMCRFDL7.mjs.map → ManagedNewsletterForm-UGDUBYR3.mjs.map} +1 -1
  38. package/dist/{SignalCore-R44AWPYN.mjs → SignalCore-O3GEJZCN.mjs} +5 -5
  39. package/dist/{SignalCore-R44AWPYN.mjs.map → SignalCore-O3GEJZCN.mjs.map} +1 -1
  40. package/dist/{SignalCore-Q57NY7EG.js → SignalCore-OOQHKIUZ.js} +11 -11
  41. package/dist/{SignalCore-Q57NY7EG.js.map → SignalCore-OOQHKIUZ.js.map} +1 -1
  42. package/dist/SitemapSync-MT3I4W3B.js +18 -0
  43. package/dist/{SitemapSync-ZP4PKZZ3.js.map → SitemapSync-MT3I4W3B.js.map} +1 -1
  44. package/dist/SitemapSync-RG554AJR.mjs +9 -0
  45. package/dist/{SitemapSync-NICUUMQF.mjs.map → SitemapSync-RG554AJR.mjs.map} +1 -1
  46. package/dist/admin-auth/index.d.ts +8 -0
  47. package/dist/admin-auth/index.d.ts.map +1 -1
  48. package/dist/admin-auth/index.js +0 -0
  49. package/dist/admin-auth/index.js.map +1 -1
  50. package/dist/admin-auth/index.mjs +0 -0
  51. package/dist/admin-auth/index.mjs.map +1 -1
  52. package/dist/analytics/index.js +9 -9
  53. package/dist/analytics/index.mjs +4 -4
  54. package/dist/articles/index.js +1 -1
  55. package/dist/articles/index.mjs +1 -1
  56. package/dist/articles/server-ui.js +1 -1
  57. package/dist/articles/server-ui.mjs +1 -1
  58. package/dist/{chunk-72WO3AE5.js → chunk-2LX7LHAO.js} +5 -5
  59. package/dist/{chunk-72WO3AE5.js.map → chunk-2LX7LHAO.js.map} +1 -1
  60. package/dist/{chunk-YZCRYK5M.mjs → chunk-3EOUKWHB.mjs} +3 -3
  61. package/dist/{chunk-YZCRYK5M.mjs.map → chunk-3EOUKWHB.mjs.map} +1 -1
  62. package/dist/{chunk-IHG7W5JH.mjs → chunk-4EXBEFIV.mjs} +4 -4
  63. package/dist/{chunk-IHG7W5JH.mjs.map → chunk-4EXBEFIV.mjs.map} +1 -1
  64. package/dist/{chunk-6SH6HLWS.mjs → chunk-4HSZPHF7.mjs} +3 -3
  65. package/dist/{chunk-6SH6HLWS.mjs.map → chunk-4HSZPHF7.mjs.map} +1 -1
  66. package/dist/{chunk-I5XK32OJ.js → chunk-4KSE642V.js} +18 -18
  67. package/dist/{chunk-I5XK32OJ.js.map → chunk-4KSE642V.js.map} +1 -1
  68. package/dist/{chunk-F4DZDIR4.js → chunk-6FASIYCV.js} +4 -4
  69. package/dist/{chunk-F4DZDIR4.js.map → chunk-6FASIYCV.js.map} +1 -1
  70. package/dist/{chunk-4BQQGOHC.js → chunk-6TSYWYYR.js} +4 -4
  71. package/dist/{chunk-4BQQGOHC.js.map → chunk-6TSYWYYR.js.map} +1 -1
  72. package/dist/{chunk-OZLYJSFE.js → chunk-6WWGH6E3.js} +14 -14
  73. package/dist/{chunk-OZLYJSFE.js.map → chunk-6WWGH6E3.js.map} +1 -1
  74. package/dist/{chunk-BSTV3T6P.mjs → chunk-7YFUX2CL.mjs} +3 -3
  75. package/dist/{chunk-BSTV3T6P.mjs.map → chunk-7YFUX2CL.mjs.map} +1 -1
  76. package/dist/{chunk-6AIXHYFO.js → chunk-A3QAZJXC.js} +5 -5
  77. package/dist/{chunk-6AIXHYFO.js.map → chunk-A3QAZJXC.js.map} +1 -1
  78. package/dist/{chunk-2JZFTPPE.js → chunk-A4WYSHIX.js} +3 -3
  79. package/dist/{chunk-2JZFTPPE.js.map → chunk-A4WYSHIX.js.map} +1 -1
  80. package/dist/{chunk-REGHZJQF.mjs → chunk-A5R62CXI.mjs} +3 -3
  81. package/dist/{chunk-REGHZJQF.mjs.map → chunk-A5R62CXI.mjs.map} +1 -1
  82. package/dist/chunk-C654VCWV.mjs +6 -0
  83. package/dist/{chunk-COCYQHK3.mjs.map → chunk-C654VCWV.mjs.map} +1 -1
  84. package/dist/{chunk-KLKUI3US.mjs → chunk-DUFU27R2.mjs} +3 -3
  85. package/dist/{chunk-KLKUI3US.mjs.map → chunk-DUFU27R2.mjs.map} +1 -1
  86. package/dist/{chunk-ZKM6ELMZ.js → chunk-FVATDBFX.js} +10 -10
  87. package/dist/{chunk-ZKM6ELMZ.js.map → chunk-FVATDBFX.js.map} +1 -1
  88. package/dist/{chunk-FFE6P6PQ.js → chunk-GE3CGR2T.js} +14 -14
  89. package/dist/{chunk-FFE6P6PQ.js.map → chunk-GE3CGR2T.js.map} +1 -1
  90. package/dist/{chunk-QUMXVJ2C.mjs → chunk-HIG7COWF.mjs} +3 -3
  91. package/dist/{chunk-QUMXVJ2C.mjs.map → chunk-HIG7COWF.mjs.map} +1 -1
  92. package/dist/{chunk-OMYR2ORG.js → chunk-HY6EXWLZ.js} +8 -8
  93. package/dist/{chunk-OMYR2ORG.js.map → chunk-HY6EXWLZ.js.map} +1 -1
  94. package/dist/{chunk-NCURAYKL.mjs → chunk-IDBA3YZ6.mjs} +4 -4
  95. package/dist/{chunk-NCURAYKL.mjs.map → chunk-IDBA3YZ6.mjs.map} +1 -1
  96. package/dist/{chunk-C3MRX7NL.js → chunk-JPXT5LY2.js} +12 -12
  97. package/dist/{chunk-C3MRX7NL.js.map → chunk-JPXT5LY2.js.map} +1 -1
  98. package/dist/{chunk-P2VWGMQU.mjs → chunk-JS265UKZ.mjs} +3 -3
  99. package/dist/{chunk-P2VWGMQU.mjs.map → chunk-JS265UKZ.mjs.map} +1 -1
  100. package/dist/{chunk-DFAW62AX.mjs → chunk-KAJT3MOM.mjs} +4 -4
  101. package/dist/{chunk-DFAW62AX.mjs.map → chunk-KAJT3MOM.mjs.map} +1 -1
  102. package/dist/{chunk-22MXW53O.mjs → chunk-KUDSEKV7.mjs} +4 -4
  103. package/dist/{chunk-22MXW53O.mjs.map → chunk-KUDSEKV7.mjs.map} +1 -1
  104. package/dist/{chunk-DN6BLVU7.mjs → chunk-MWIIHMYS.mjs} +3 -3
  105. package/dist/{chunk-DN6BLVU7.mjs.map → chunk-MWIIHMYS.mjs.map} +1 -1
  106. package/dist/{chunk-PXN7LIYZ.js → chunk-NKBPEZCX.js} +15 -15
  107. package/dist/{chunk-PXN7LIYZ.js.map → chunk-NKBPEZCX.js.map} +1 -1
  108. package/dist/{chunk-HQCWWQAI.mjs → chunk-NO4JQ2G3.mjs} +7 -7
  109. package/dist/{chunk-HQCWWQAI.mjs.map → chunk-NO4JQ2G3.mjs.map} +1 -1
  110. package/dist/{chunk-QSCE66KQ.mjs → chunk-OUM77VZ4.mjs} +3 -3
  111. package/dist/{chunk-QSCE66KQ.mjs.map → chunk-OUM77VZ4.mjs.map} +1 -1
  112. package/dist/{chunk-GBOSAWBR.js → chunk-QRL3QDUE.js} +4 -4
  113. package/dist/{chunk-GBOSAWBR.js.map → chunk-QRL3QDUE.js.map} +1 -1
  114. package/dist/{chunk-LIWPIG7U.js → chunk-QRN6HQOX.js} +15 -15
  115. package/dist/{chunk-LIWPIG7U.js.map → chunk-QRN6HQOX.js.map} +1 -1
  116. package/dist/{chunk-M436JMD4.mjs → chunk-RH46WZRN.mjs} +3 -3
  117. package/dist/{chunk-M436JMD4.mjs.map → chunk-RH46WZRN.mjs.map} +1 -1
  118. package/dist/{chunk-P35JIP3J.js → chunk-RZUUPX2H.js} +6 -6
  119. package/dist/{chunk-P35JIP3J.js.map → chunk-RZUUPX2H.js.map} +1 -1
  120. package/dist/{chunk-XRUKYQ43.js → chunk-S4DTX5E7.js} +4 -4
  121. package/dist/{chunk-XRUKYQ43.js.map → chunk-S4DTX5E7.js.map} +1 -1
  122. package/dist/{chunk-RDKICSVU.js → chunk-S7S6ZZ3R.js} +7 -7
  123. package/dist/{chunk-RDKICSVU.js.map → chunk-S7S6ZZ3R.js.map} +1 -1
  124. package/dist/{chunk-5XLPWHQC.mjs → chunk-TDJZFBHI.mjs} +4 -4
  125. package/dist/{chunk-5XLPWHQC.mjs.map → chunk-TDJZFBHI.mjs.map} +1 -1
  126. package/dist/{chunk-6AAT724D.js → chunk-U274XAMD.js} +11 -11
  127. package/dist/{chunk-6AAT724D.js.map → chunk-U274XAMD.js.map} +1 -1
  128. package/dist/{chunk-UJFRMHUN.js → chunk-UFG2TUBG.js} +3 -3
  129. package/dist/{chunk-UJFRMHUN.js.map → chunk-UFG2TUBG.js.map} +1 -1
  130. package/dist/{chunk-RNEPZD2I.js → chunk-W4NTPOBD.js} +5 -5
  131. package/dist/{chunk-RNEPZD2I.js.map → chunk-W4NTPOBD.js.map} +1 -1
  132. package/dist/{chunk-CBZJNMYS.mjs → chunk-W5MHX6SO.mjs} +3 -3
  133. package/dist/{chunk-CBZJNMYS.mjs.map → chunk-W5MHX6SO.mjs.map} +1 -1
  134. package/dist/{chunk-X5WJ5XPZ.mjs → chunk-WIRGZMM5.mjs} +3 -3
  135. package/dist/{chunk-X5WJ5XPZ.mjs.map → chunk-WIRGZMM5.mjs.map} +1 -1
  136. package/dist/{chunk-RSP6RDR2.mjs → chunk-XNZ2WFXR.mjs} +4 -4
  137. package/dist/{chunk-RSP6RDR2.mjs.map → chunk-XNZ2WFXR.mjs.map} +1 -1
  138. package/dist/{chunk-W7HSYABM.mjs → chunk-XV2FFSJU.mjs} +8 -8
  139. package/dist/{chunk-W7HSYABM.mjs.map → chunk-XV2FFSJU.mjs.map} +1 -1
  140. package/dist/{chunk-L6XXUNJB.js → chunk-YCE6HRWW.js} +8 -8
  141. package/dist/{chunk-L6XXUNJB.js.map → chunk-YCE6HRWW.js.map} +1 -1
  142. package/dist/{chunk-ED5GOAF6.mjs → chunk-YOS4A3QE.mjs} +3 -3
  143. package/dist/{chunk-ED5GOAF6.mjs.map → chunk-YOS4A3QE.mjs.map} +1 -1
  144. package/dist/{chunk-RB53MKRX.mjs → chunk-YUCKBIRE.mjs} +4 -4
  145. package/dist/{chunk-RB53MKRX.mjs.map → chunk-YUCKBIRE.mjs.map} +1 -1
  146. package/dist/{chunk-JCBENABK.js → chunk-YYOGUTLV.js} +3 -3
  147. package/dist/{chunk-JCBENABK.js.map → chunk-YYOGUTLV.js.map} +1 -1
  148. package/dist/chunk-ZKOQCKOR.js +8 -0
  149. package/dist/{chunk-JLIL5EFG.js.map → chunk-ZKOQCKOR.js.map} +1 -1
  150. package/dist/cli/index.js +3 -3
  151. package/dist/cli/index.mjs +1 -1
  152. package/dist/client/index.js +4 -4
  153. package/dist/client/index.mjs +3 -3
  154. package/dist/commerce/index.js +57 -57
  155. package/dist/commerce/index.mjs +5 -5
  156. package/dist/engage/index.js +10 -10
  157. package/dist/engage/index.mjs +7 -7
  158. package/dist/fleet/index.js +8 -8
  159. package/dist/fleet/index.mjs +4 -4
  160. package/dist/forms/index.js +16 -16
  161. package/dist/forms/index.mjs +9 -9
  162. package/dist/forms/server.js +10 -10
  163. package/dist/forms/server.mjs +8 -8
  164. package/dist/forms/static.js +7 -7
  165. package/dist/forms/static.mjs +6 -6
  166. package/dist/images/index.js +11 -11
  167. package/dist/images/index.mjs +4 -4
  168. package/dist/index.js +63 -63
  169. package/dist/index.mjs +9 -9
  170. package/dist/layout/client.js +8 -8
  171. package/dist/layout/client.mjs +7 -7
  172. package/dist/layout/index.js +10 -10
  173. package/dist/layout/index.mjs +8 -8
  174. package/dist/maps/index.js +5 -5
  175. package/dist/maps/index.mjs +3 -3
  176. package/dist/search/index.js +4 -4
  177. package/dist/search/index.mjs +3 -3
  178. package/dist/seo/client.js +5 -5
  179. package/dist/seo/client.mjs +4 -4
  180. package/dist/seo/index.js +5 -5
  181. package/dist/seo/index.mjs +4 -4
  182. package/dist/server/index.js +3 -3
  183. package/dist/server/index.mjs +2 -2
  184. package/dist/shared/version.d.ts +1 -1
  185. package/dist/signal/index.js +11 -11
  186. package/dist/signal/index.mjs +2 -2
  187. package/dist/sync/index.js +17 -17
  188. package/dist/sync/index.mjs +4 -4
  189. package/package.json +1 -1
  190. package/dist/ChatWidget-3RVBHZCS.mjs +0 -17
  191. package/dist/EngageWidget-QO5S6YV5.js +0 -21
  192. package/dist/EngageWidget-TE6S5KYT.mjs +0 -12
  193. package/dist/ManagedForm-BVLS2QZR.js +0 -25
  194. package/dist/ManagedForm-PTCWSTC5.mjs +0 -16
  195. package/dist/SitemapSync-NICUUMQF.mjs +0 -9
  196. package/dist/SitemapSync-ZP4PKZZ3.js +0 -18
  197. package/dist/chunk-COCYQHK3.mjs +0 -6
  198. package/dist/chunk-JLIL5EFG.js +0 -8
@@ -2,15 +2,15 @@
2
2
  'use strict';
3
3
 
4
4
  var chunk3SDMJMN2_js = require('../chunk-3SDMJMN2.js');
5
- var chunkRNEPZD2I_js = require('../chunk-RNEPZD2I.js');
5
+ var chunkW4NTPOBD_js = require('../chunk-W4NTPOBD.js');
6
6
  var chunk3DWIYCQX_js = require('../chunk-3DWIYCQX.js');
7
7
  require('../chunk-RC4WWQXR.js');
8
8
  require('../chunk-P4Y75QSU.js');
9
9
  require('../chunk-VJMPIRSD.js');
10
10
  var chunk5RNAUYWE_js = require('../chunk-5RNAUYWE.js');
11
- require('../chunk-PXN7LIYZ.js');
12
- require('../chunk-4BQQGOHC.js');
13
- require('../chunk-JLIL5EFG.js');
11
+ require('../chunk-NKBPEZCX.js');
12
+ require('../chunk-6TSYWYYR.js');
13
+ require('../chunk-ZKOQCKOR.js');
14
14
  require('../chunk-SNAQBZPT.js');
15
15
 
16
16
 
@@ -25,23 +25,23 @@ Object.defineProperty(exports, "useContactTracking", {
25
25
  });
26
26
  Object.defineProperty(exports, "AnalyticsProvider", {
27
27
  enumerable: true,
28
- get: function () { return chunkRNEPZD2I_js.AnalyticsProvider; }
28
+ get: function () { return chunkW4NTPOBD_js.AnalyticsProvider; }
29
29
  });
30
30
  Object.defineProperty(exports, "WebVitals", {
31
31
  enumerable: true,
32
- get: function () { return chunkRNEPZD2I_js.WebVitals; }
32
+ get: function () { return chunkW4NTPOBD_js.WebVitals; }
33
33
  });
34
34
  Object.defineProperty(exports, "useAnalytics", {
35
35
  enumerable: true,
36
- get: function () { return chunkRNEPZD2I_js.useAnalytics; }
36
+ get: function () { return chunkW4NTPOBD_js.useAnalytics; }
37
37
  });
38
38
  Object.defineProperty(exports, "useAnalyticsOptional", {
39
39
  enumerable: true,
40
- get: function () { return chunkRNEPZD2I_js.useAnalyticsOptional; }
40
+ get: function () { return chunkW4NTPOBD_js.useAnalyticsOptional; }
41
41
  });
42
42
  Object.defineProperty(exports, "useTrackEvent", {
43
43
  enumerable: true,
44
- get: function () { return chunkRNEPZD2I_js.useTrackEvent; }
44
+ get: function () { return chunkW4NTPOBD_js.useTrackEvent; }
45
45
  });
46
46
  Object.defineProperty(exports, "trackConversion", {
47
47
  enumerable: true,
@@ -1,14 +1,14 @@
1
1
  'use client';
2
2
  export { ContactTracking, useContactTracking } from '../chunk-64BOVMXG.mjs';
3
- export { AnalyticsProvider, WebVitals, useAnalytics, useAnalyticsOptional, useTrackEvent } from '../chunk-DN6BLVU7.mjs';
3
+ export { AnalyticsProvider, WebVitals, useAnalytics, useAnalyticsOptional, useTrackEvent } from '../chunk-MWIIHMYS.mjs';
4
4
  export { trackConversion, trackEvent } from '../chunk-SHLWA6JY.mjs';
5
5
  import '../chunk-ZZQAGCSI.mjs';
6
6
  import '../chunk-5SANRSX3.mjs';
7
7
  import '../chunk-6EDVCUAG.mjs';
8
8
  export { isCrossOriginFrame, isFramed, isTopFrameSameOrigin } from '../chunk-A6UYV475.mjs';
9
- import '../chunk-RSP6RDR2.mjs';
10
- import '../chunk-QSCE66KQ.mjs';
11
- import '../chunk-COCYQHK3.mjs';
9
+ import '../chunk-XNZ2WFXR.mjs';
10
+ import '../chunk-OUM77VZ4.mjs';
11
+ import '../chunk-C654VCWV.mjs';
12
12
  import '../chunk-BEXTDHO4.mjs';
13
13
  //# sourceMappingURL=index.mjs.map
14
14
  //# sourceMappingURL=index.mjs.map
@@ -18,7 +18,7 @@ function _interopDefault (e) { return e && e.__esModule ? e : { default: e }; }
18
18
 
19
19
  var React__default = /*#__PURE__*/_interopDefault(React);
20
20
 
21
- var ManagedNewsletterForm = React__default.default.lazy(() => import('../ManagedNewsletterForm-IB5VD43M.js'));
21
+ var ManagedNewsletterForm = React__default.default.lazy(() => import('../ManagedNewsletterForm-HKNXIKDV.js'));
22
22
  function NewsletterWidget({
23
23
  title = "Subscribe to Our Newsletter",
24
24
  description = "Get the latest posts delivered straight to your inbox.",
@@ -15,7 +15,7 @@ import '../chunk-BEXTDHO4.mjs';
15
15
  import React, { useState, Suspense, useEffect } from 'react';
16
16
  import { jsx, jsxs } from 'react/jsx-runtime';
17
17
 
18
- var ManagedNewsletterForm = React.lazy(() => import('../ManagedNewsletterForm-WMCRFDL7.mjs'));
18
+ var ManagedNewsletterForm = React.lazy(() => import('../ManagedNewsletterForm-UGDUBYR3.mjs'));
19
19
  function NewsletterWidget({
20
20
  title = "Subscribe to Our Newsletter",
21
21
  description = "Get the latest posts delivered straight to your inbox.",
@@ -134,7 +134,7 @@ async function Article({
134
134
  ...item,
135
135
  answer: chunkKR7ATPAN_js.addExternalLinkTargets(item.answer || "", siteUrlResolved)
136
136
  })) ?? faqRaw;
137
- const { ArticleViewTracker } = await import('../ArticleViewTracker-F5IP734Z.js');
137
+ const { ArticleViewTracker } = await import('../ArticleViewTracker-3USIHB4O.js');
138
138
  if (children) {
139
139
  return /* @__PURE__ */ jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [
140
140
  /* @__PURE__ */ jsxRuntime.jsx(ArticleViewTracker, { slug: post.slug, site }),
@@ -131,7 +131,7 @@ async function Article({
131
131
  ...item,
132
132
  answer: addExternalLinkTargets(item.answer || "", siteUrlResolved)
133
133
  })) ?? faqRaw;
134
- const { ArticleViewTracker } = await import('../ArticleViewTracker-AYYSXNJS.mjs');
134
+ const { ArticleViewTracker } = await import('../ArticleViewTracker-7GEI37VK.mjs');
135
135
  if (children) {
136
136
  return /* @__PURE__ */ jsxs(Fragment, { children: [
137
137
  /* @__PURE__ */ jsx(ArticleViewTracker, { slug: post.slug, site }),
@@ -3,7 +3,7 @@
3
3
 
4
4
  var chunkJONWE26J_js = require('./chunk-JONWE26J.js');
5
5
  var chunk5RNAUYWE_js = require('./chunk-5RNAUYWE.js');
6
- var chunkPXN7LIYZ_js = require('./chunk-PXN7LIYZ.js');
6
+ var chunkNKBPEZCX_js = require('./chunk-NKBPEZCX.js');
7
7
  var react = require('react');
8
8
 
9
9
  var SYNC_STAMP_KEY = "_sk_sitemap_synced_at";
@@ -47,7 +47,7 @@ function storeSyncedHash(hash) {
47
47
  }
48
48
  async function parseSitemap(sitemapUrl, debug) {
49
49
  try {
50
- const response = await chunkPXN7LIYZ_js.sonorFetch(sitemapUrl);
50
+ const response = await chunkNKBPEZCX_js.sonorFetch(sitemapUrl);
51
51
  if (!response.ok) {
52
52
  if (debug) console.warn("[SitemapSync] Failed to fetch sitemap:", response.status);
53
53
  return [];
@@ -97,7 +97,7 @@ async function syncToPortal(entries, apiUrl, apiKey, site, debug, mode = "additi
97
97
  try {
98
98
  const target = chunk5RNAUYWE_js.resolveAnalyticsTarget({ ...gate, apiUrl, apiKey });
99
99
  if (!target) return { success: false, created: 0, updated: 0 };
100
- const response = await chunkPXN7LIYZ_js.sonorFetch(`${target.apiUrl}/api/public/seo/register-sitemap`, {
100
+ const response = await chunkNKBPEZCX_js.sonorFetch(`${target.apiUrl}/api/public/seo/register-sitemap`, {
101
101
  method: "POST",
102
102
  headers: { "Content-Type": "application/json" },
103
103
  body: JSON.stringify({
@@ -191,5 +191,5 @@ function SitemapSync({
191
191
  }
192
192
 
193
193
  exports.SitemapSync = SitemapSync;
194
- //# sourceMappingURL=chunk-72WO3AE5.js.map
195
- //# sourceMappingURL=chunk-72WO3AE5.js.map
194
+ //# sourceMappingURL=chunk-2LX7LHAO.js.map
195
+ //# sourceMappingURL=chunk-2LX7LHAO.js.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/SitemapSync.tsx"],"names":["sonorFetch","locToPath","isMalformedSitemapPath","resolveAnalyticsTarget","inferPageType","useRef","useEffect"],"mappings":"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","file":"chunk-72WO3AE5.js","sourcesContent":["/**\n * SitemapSync - Automatically sync sitemap.xml to Portal API\n *\n * Client-only component. Lives at package root so the main entry does not\n * pull in seo/ (and server-only code). For use in SiteKitLayout and\n * from @sonordev/site-kit/seo.\n *\n * @example\n * ```tsx\n * import { SitemapSync } from '@sonordev/site-kit'\n * // or\n * import { SitemapSync } from '@sonordev/site-kit/seo'\n * ```\n */\n\n'use client'\n\nimport { useEffect, useRef } from 'react'\nimport { sonorFetch } from './shared/sonorFetch'\nimport { resolveAnalyticsTarget, type AnalyticsGateOptions } from './shared/reporting-gate'\n// Single source of truth for page-type inference + path normalization, shared\n// with createSitemap (build) and the register-sitemap CLI. Pure string logic,\n// safe in the browser.\nimport { inferPageType, locToPath, isMalformedSitemapPath } from './sitemap/shared'\n\ninterface SitemapSyncProps extends AnalyticsGateOptions {\n /** Custom sitemap URL (defaults to /sitemap.xml) */\n sitemapUrl?: string\n /** How often to re-sync in minutes (0 = only on mount, default: 60) */\n syncInterval?: number\n /** Enable debug logging */\n debug?: boolean\n /**\n * Sync mode:\n * - 'additive' (default for runtime): adds/updates pages but never deletes existing ones\n * - 'full-replace': replaces the entire page set (use only for build-time sync via createSitemap)\n */\n mode?: 'additive' | 'full-replace'\n}\n\ninterface SitemapEntry {\n path: string\n lastmod?: string\n changefreq?: string\n priority?: number\n pageType?: string\n}\n\n/**\n * Per-browser-session sync throttle. Build-time sync (createSitemap) is the\n * canonical source of truth; runtime SitemapSync is only a safety net — so\n * re-registering the sitemap on every full page load of every visitor is pure\n * waste (fetch + DOMParser on the visitor's main thread, plus a write per\n * pageview against the API). Stamp the last successful sync in sessionStorage\n * and skip while inside the throttle window.\n */\nconst SYNC_STAMP_KEY = '_sk_sitemap_synced_at'\nconst SYNC_HASH_KEY = '_sk_sitemap_hash'\n\nfunction isRecentlySynced(throttleMinutes: number): boolean {\n try {\n const stamp = sessionStorage.getItem(SYNC_STAMP_KEY)\n if (!stamp) return false\n const elapsed = Date.now() - parseInt(stamp, 10)\n return elapsed >= 0 && elapsed < throttleMinutes * 60 * 1000\n } catch {\n return false // storage unavailable (private mode) — sync as before\n }\n}\n\nfunction stampSynced(): void {\n try {\n sessionStorage.setItem(SYNC_STAMP_KEY, Date.now().toString())\n } catch {\n /* storage unavailable — throttle simply won't apply */\n }\n}\n\n/**\n * Content-hash guard (localStorage, so it survives across sessions): the\n * sitemap of a static site only changes at deploy, so once ONE sync of a given\n * sitemap succeeded from this browser, re-POSTing the identical entry set is\n * pure API load. Hash the parsed entries; skip the POST when unchanged.\n * Keyed by sitemap URL so multiple SitemapSync instances don't collide.\n */\nfunction hashEntries(sitemapUrl: string, entries: SitemapEntry[]): string {\n const text = entries\n .map(e => `${e.path}|${e.lastmod ?? ''}|${e.changefreq ?? ''}|${e.priority ?? ''}`)\n .join('\\n')\n let hash = 0\n for (let i = 0; i < text.length; i++) {\n hash = ((hash << 5) - hash + text.charCodeAt(i)) | 0\n }\n return `${sitemapUrl}:${entries.length}:${hash.toString(16)}`\n}\n\nfunction isAlreadySyncedHash(hash: string): boolean {\n try {\n return localStorage.getItem(SYNC_HASH_KEY) === hash\n } catch {\n return false\n }\n}\n\nfunction storeSyncedHash(hash: string): void {\n try {\n localStorage.setItem(SYNC_HASH_KEY, hash)\n } catch {\n /* storage unavailable — guard simply won't apply */\n }\n}\n\nasync function parseSitemap(sitemapUrl: string, debug: boolean): Promise<SitemapEntry[]> {\n try {\n const response = await sonorFetch(sitemapUrl)\n if (!response.ok) {\n if (debug) console.warn('[SitemapSync] Failed to fetch sitemap:', response.status)\n return []\n }\n\n const text = await response.text()\n const parser = new DOMParser()\n const doc = parser.parseFromString(text, 'application/xml')\n\n const parseError = doc.querySelector('parsererror')\n if (parseError) {\n if (debug) console.warn('[SitemapSync] Sitemap parse error:', parseError.textContent)\n return []\n }\n\n const urls = doc.querySelectorAll('url')\n const entries: SitemapEntry[] = []\n\n urls.forEach(url => {\n const loc = url.querySelector('loc')?.textContent?.trim()\n if (!loc) return\n\n const path = locToPath(loc)\n\n // Reject malformed paths (embedded domains, double protocols, etc.)\n if (isMalformedSitemapPath(path)) {\n if (debug) console.warn(`[SitemapSync] Skipping malformed path: ${path}`)\n return\n }\n\n const lastmod = url.querySelector('lastmod')?.textContent || undefined\n const changefreq = url.querySelector('changefreq')?.textContent || undefined\n const priorityStr = url.querySelector('priority')?.textContent\n const priority = priorityStr ? parseFloat(priorityStr) : undefined\n\n entries.push({ path, lastmod, changefreq, priority })\n })\n\n if (debug) {\n console.log(`[SitemapSync] Parsed ${entries.length} entries from sitemap`)\n }\n\n return entries\n } catch (error) {\n if (debug) console.error('[SitemapSync] Error parsing sitemap:', error)\n return []\n }\n}\n\nasync function syncToPortal(\n entries: SitemapEntry[],\n apiUrl: string,\n apiKey: string,\n site: string,\n debug: boolean,\n mode: 'additive' | 'full-replace' = 'additive',\n gate: AnalyticsGateOptions = {},\n): Promise<{ success: boolean; created: number; updated: number }> {\n if (!apiKey) {\n if (debug) console.warn('[SitemapSync] No API key configured')\n return { success: false, created: 0, updated: 0 }\n }\n\n if (entries.length === 0) {\n if (debug) console.log('[SitemapSync] No entries to sync')\n return { success: true, created: 0, updated: 0 }\n }\n\n try {\n // Registration is idempotent in both modes (same payload → same final\n // state), so retrying a timed-out attempt is safe.\n const target = resolveAnalyticsTarget({ ...gate, apiUrl, apiKey })\n if (!target) return { success: false, created: 0, updated: 0 }\n const response = await sonorFetch(`${target.apiUrl}/api/public/seo/register-sitemap`, {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify({\n entries: entries.map(e => ({\n path: e.path,\n priority: e.priority,\n changefreq: e.changefreq,\n pageType: inferPageType(e.path),\n })),\n mode,\n // Sub-site host — tagged on every seo_pages row so the dashboard\n // can scope the page tree to one microsite. Resolved by\n // SiteKitClientProviders (see __SITE_KIT_SITE__).\n ...(site ? { site } : {}),\n }),\n }, { apiKey: target.apiKey, retries: 2 })\n\n if (!response?.ok) {\n if (debug) console.error('[SitemapSync] API error:', response?.status, response?.statusText)\n return { success: false, created: 0, updated: 0 }\n }\n\n const result = await response.json()\n\n if (debug) {\n console.log(`[SitemapSync] Synced: ${result.created} created, ${result.updated} updated`)\n }\n\n return {\n success: true,\n created: result.created || 0,\n updated: result.updated || 0,\n }\n } catch (error) {\n if (debug) console.error('[SitemapSync] Sync error:', error)\n return { success: false, created: 0, updated: 0 }\n }\n}\n\nexport function SitemapSync({\n sitemapUrl = '/sitemap.xml',\n syncInterval = 60,\n debug = false,\n mode = 'additive',\n apiUrl: propApiUrl,\n apiKey: propApiKey,\n allowInFrame = false,\n allowLocalhost = false,\n}: SitemapSyncProps) {\n const hasSyncedRef = useRef(false)\n const intervalRef = useRef<ReturnType<typeof setInterval> | null>(null)\n\n useEffect(() => {\n // Build-time sync via createSitemap is the canonical source of truth, but\n // it can fail during ISR revalidation (app/ dir unavailable on serverless).\n // Runtime SitemapSync in additive mode is a safe fallback — it adds/updates\n // pages that may be missing without ever deleting existing ones.\n // Full-replace is never safe at runtime — always force additive.\n const effectiveMode: 'additive' | 'full-replace' = 'additive'\n\n // Throttle window: reuse syncInterval when periodic syncing is on,\n // otherwise default to 60 minutes for the on-mount sync.\n const throttleMinutes = syncInterval > 0 ? syncInterval : 60\n\n const doSync = async () => {\n const gate = { apiUrl: propApiUrl, apiKey: propApiKey, allowInFrame, allowLocalhost, debug }\n const target = resolveAnalyticsTarget(gate)\n if (!target) return\n const { apiUrl, apiKey } = target\n const site = (window as any).__SITE_KIT_SITE__ || window.location.host || ''\n\n if (isRecentlySynced(throttleMinutes)) {\n if (debug) console.log('[SitemapSync] Skipped — synced within the last', throttleMinutes, 'min this session')\n return\n }\n\n if (debug) console.log('[SitemapSync] Starting sitemap sync...', site ? `(site: ${site})` : '')\n\n const entries = await parseSitemap(sitemapUrl, debug)\n\n if (entries.length > 0) {\n const hash = hashEntries(sitemapUrl, entries)\n if (isAlreadySyncedHash(hash)) {\n // This exact sitemap already synced from this browser — the server\n // state can't be improved by re-POSTing it. Stamp the session so we\n // don't even re-fetch/parse for the rest of the throttle window.\n stampSynced()\n if (debug) console.log('[SitemapSync] Skipped POST — sitemap unchanged since last successful sync')\n return\n }\n const result = await syncToPortal(entries, apiUrl, apiKey, site, debug, effectiveMode, gate)\n if (result.success) {\n stampSynced()\n storeSyncedHash(hash)\n }\n }\n }\n\n if (!resolveAnalyticsTarget({ apiUrl: propApiUrl, apiKey: propApiKey, allowInFrame, allowLocalhost, debug })) return\n\n if (!hasSyncedRef.current) {\n hasSyncedRef.current = true\n doSync()\n }\n\n if (syncInterval > 0) {\n intervalRef.current = setInterval(doSync, syncInterval * 60 * 1000)\n }\n\n return () => {\n if (intervalRef.current) {\n clearInterval(intervalRef.current)\n }\n }\n }, [sitemapUrl, syncInterval, debug, mode, propApiUrl, propApiKey, allowInFrame, allowLocalhost])\n\n return null\n}\n"]}
1
+ {"version":3,"sources":["../src/SitemapSync.tsx"],"names":["sonorFetch","locToPath","isMalformedSitemapPath","resolveAnalyticsTarget","inferPageType","useRef","useEffect"],"mappings":"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","file":"chunk-2LX7LHAO.js","sourcesContent":["/**\n * SitemapSync - Automatically sync sitemap.xml to Portal API\n *\n * Client-only component. Lives at package root so the main entry does not\n * pull in seo/ (and server-only code). For use in SiteKitLayout and\n * from @sonordev/site-kit/seo.\n *\n * @example\n * ```tsx\n * import { SitemapSync } from '@sonordev/site-kit'\n * // or\n * import { SitemapSync } from '@sonordev/site-kit/seo'\n * ```\n */\n\n'use client'\n\nimport { useEffect, useRef } from 'react'\nimport { sonorFetch } from './shared/sonorFetch'\nimport { resolveAnalyticsTarget, type AnalyticsGateOptions } from './shared/reporting-gate'\n// Single source of truth for page-type inference + path normalization, shared\n// with createSitemap (build) and the register-sitemap CLI. Pure string logic,\n// safe in the browser.\nimport { inferPageType, locToPath, isMalformedSitemapPath } from './sitemap/shared'\n\ninterface SitemapSyncProps extends AnalyticsGateOptions {\n /** Custom sitemap URL (defaults to /sitemap.xml) */\n sitemapUrl?: string\n /** How often to re-sync in minutes (0 = only on mount, default: 60) */\n syncInterval?: number\n /** Enable debug logging */\n debug?: boolean\n /**\n * Sync mode:\n * - 'additive' (default for runtime): adds/updates pages but never deletes existing ones\n * - 'full-replace': replaces the entire page set (use only for build-time sync via createSitemap)\n */\n mode?: 'additive' | 'full-replace'\n}\n\ninterface SitemapEntry {\n path: string\n lastmod?: string\n changefreq?: string\n priority?: number\n pageType?: string\n}\n\n/**\n * Per-browser-session sync throttle. Build-time sync (createSitemap) is the\n * canonical source of truth; runtime SitemapSync is only a safety net — so\n * re-registering the sitemap on every full page load of every visitor is pure\n * waste (fetch + DOMParser on the visitor's main thread, plus a write per\n * pageview against the API). Stamp the last successful sync in sessionStorage\n * and skip while inside the throttle window.\n */\nconst SYNC_STAMP_KEY = '_sk_sitemap_synced_at'\nconst SYNC_HASH_KEY = '_sk_sitemap_hash'\n\nfunction isRecentlySynced(throttleMinutes: number): boolean {\n try {\n const stamp = sessionStorage.getItem(SYNC_STAMP_KEY)\n if (!stamp) return false\n const elapsed = Date.now() - parseInt(stamp, 10)\n return elapsed >= 0 && elapsed < throttleMinutes * 60 * 1000\n } catch {\n return false // storage unavailable (private mode) — sync as before\n }\n}\n\nfunction stampSynced(): void {\n try {\n sessionStorage.setItem(SYNC_STAMP_KEY, Date.now().toString())\n } catch {\n /* storage unavailable — throttle simply won't apply */\n }\n}\n\n/**\n * Content-hash guard (localStorage, so it survives across sessions): the\n * sitemap of a static site only changes at deploy, so once ONE sync of a given\n * sitemap succeeded from this browser, re-POSTing the identical entry set is\n * pure API load. Hash the parsed entries; skip the POST when unchanged.\n * Keyed by sitemap URL so multiple SitemapSync instances don't collide.\n */\nfunction hashEntries(sitemapUrl: string, entries: SitemapEntry[]): string {\n const text = entries\n .map(e => `${e.path}|${e.lastmod ?? ''}|${e.changefreq ?? ''}|${e.priority ?? ''}`)\n .join('\\n')\n let hash = 0\n for (let i = 0; i < text.length; i++) {\n hash = ((hash << 5) - hash + text.charCodeAt(i)) | 0\n }\n return `${sitemapUrl}:${entries.length}:${hash.toString(16)}`\n}\n\nfunction isAlreadySyncedHash(hash: string): boolean {\n try {\n return localStorage.getItem(SYNC_HASH_KEY) === hash\n } catch {\n return false\n }\n}\n\nfunction storeSyncedHash(hash: string): void {\n try {\n localStorage.setItem(SYNC_HASH_KEY, hash)\n } catch {\n /* storage unavailable — guard simply won't apply */\n }\n}\n\nasync function parseSitemap(sitemapUrl: string, debug: boolean): Promise<SitemapEntry[]> {\n try {\n const response = await sonorFetch(sitemapUrl)\n if (!response.ok) {\n if (debug) console.warn('[SitemapSync] Failed to fetch sitemap:', response.status)\n return []\n }\n\n const text = await response.text()\n const parser = new DOMParser()\n const doc = parser.parseFromString(text, 'application/xml')\n\n const parseError = doc.querySelector('parsererror')\n if (parseError) {\n if (debug) console.warn('[SitemapSync] Sitemap parse error:', parseError.textContent)\n return []\n }\n\n const urls = doc.querySelectorAll('url')\n const entries: SitemapEntry[] = []\n\n urls.forEach(url => {\n const loc = url.querySelector('loc')?.textContent?.trim()\n if (!loc) return\n\n const path = locToPath(loc)\n\n // Reject malformed paths (embedded domains, double protocols, etc.)\n if (isMalformedSitemapPath(path)) {\n if (debug) console.warn(`[SitemapSync] Skipping malformed path: ${path}`)\n return\n }\n\n const lastmod = url.querySelector('lastmod')?.textContent || undefined\n const changefreq = url.querySelector('changefreq')?.textContent || undefined\n const priorityStr = url.querySelector('priority')?.textContent\n const priority = priorityStr ? parseFloat(priorityStr) : undefined\n\n entries.push({ path, lastmod, changefreq, priority })\n })\n\n if (debug) {\n console.log(`[SitemapSync] Parsed ${entries.length} entries from sitemap`)\n }\n\n return entries\n } catch (error) {\n if (debug) console.error('[SitemapSync] Error parsing sitemap:', error)\n return []\n }\n}\n\nasync function syncToPortal(\n entries: SitemapEntry[],\n apiUrl: string,\n apiKey: string,\n site: string,\n debug: boolean,\n mode: 'additive' | 'full-replace' = 'additive',\n gate: AnalyticsGateOptions = {},\n): Promise<{ success: boolean; created: number; updated: number }> {\n if (!apiKey) {\n if (debug) console.warn('[SitemapSync] No API key configured')\n return { success: false, created: 0, updated: 0 }\n }\n\n if (entries.length === 0) {\n if (debug) console.log('[SitemapSync] No entries to sync')\n return { success: true, created: 0, updated: 0 }\n }\n\n try {\n // Registration is idempotent in both modes (same payload → same final\n // state), so retrying a timed-out attempt is safe.\n const target = resolveAnalyticsTarget({ ...gate, apiUrl, apiKey })\n if (!target) return { success: false, created: 0, updated: 0 }\n const response = await sonorFetch(`${target.apiUrl}/api/public/seo/register-sitemap`, {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify({\n entries: entries.map(e => ({\n path: e.path,\n priority: e.priority,\n changefreq: e.changefreq,\n pageType: inferPageType(e.path),\n })),\n mode,\n // Sub-site host — tagged on every seo_pages row so the dashboard\n // can scope the page tree to one microsite. Resolved by\n // SiteKitClientProviders (see __SITE_KIT_SITE__).\n ...(site ? { site } : {}),\n }),\n }, { apiKey: target.apiKey, retries: 2 })\n\n if (!response?.ok) {\n if (debug) console.error('[SitemapSync] API error:', response?.status, response?.statusText)\n return { success: false, created: 0, updated: 0 }\n }\n\n const result = await response.json()\n\n if (debug) {\n console.log(`[SitemapSync] Synced: ${result.created} created, ${result.updated} updated`)\n }\n\n return {\n success: true,\n created: result.created || 0,\n updated: result.updated || 0,\n }\n } catch (error) {\n if (debug) console.error('[SitemapSync] Sync error:', error)\n return { success: false, created: 0, updated: 0 }\n }\n}\n\nexport function SitemapSync({\n sitemapUrl = '/sitemap.xml',\n syncInterval = 60,\n debug = false,\n mode = 'additive',\n apiUrl: propApiUrl,\n apiKey: propApiKey,\n allowInFrame = false,\n allowLocalhost = false,\n}: SitemapSyncProps) {\n const hasSyncedRef = useRef(false)\n const intervalRef = useRef<ReturnType<typeof setInterval> | null>(null)\n\n useEffect(() => {\n // Build-time sync via createSitemap is the canonical source of truth, but\n // it can fail during ISR revalidation (app/ dir unavailable on serverless).\n // Runtime SitemapSync in additive mode is a safe fallback — it adds/updates\n // pages that may be missing without ever deleting existing ones.\n // Full-replace is never safe at runtime — always force additive.\n const effectiveMode: 'additive' | 'full-replace' = 'additive'\n\n // Throttle window: reuse syncInterval when periodic syncing is on,\n // otherwise default to 60 minutes for the on-mount sync.\n const throttleMinutes = syncInterval > 0 ? syncInterval : 60\n\n const doSync = async () => {\n const gate = { apiUrl: propApiUrl, apiKey: propApiKey, allowInFrame, allowLocalhost, debug }\n const target = resolveAnalyticsTarget(gate)\n if (!target) return\n const { apiUrl, apiKey } = target\n const site = (window as any).__SITE_KIT_SITE__ || window.location.host || ''\n\n if (isRecentlySynced(throttleMinutes)) {\n if (debug) console.log('[SitemapSync] Skipped — synced within the last', throttleMinutes, 'min this session')\n return\n }\n\n if (debug) console.log('[SitemapSync] Starting sitemap sync...', site ? `(site: ${site})` : '')\n\n const entries = await parseSitemap(sitemapUrl, debug)\n\n if (entries.length > 0) {\n const hash = hashEntries(sitemapUrl, entries)\n if (isAlreadySyncedHash(hash)) {\n // This exact sitemap already synced from this browser — the server\n // state can't be improved by re-POSTing it. Stamp the session so we\n // don't even re-fetch/parse for the rest of the throttle window.\n stampSynced()\n if (debug) console.log('[SitemapSync] Skipped POST — sitemap unchanged since last successful sync')\n return\n }\n const result = await syncToPortal(entries, apiUrl, apiKey, site, debug, effectiveMode, gate)\n if (result.success) {\n stampSynced()\n storeSyncedHash(hash)\n }\n }\n }\n\n if (!resolveAnalyticsTarget({ apiUrl: propApiUrl, apiKey: propApiKey, allowInFrame, allowLocalhost, debug })) return\n\n if (!hasSyncedRef.current) {\n hasSyncedRef.current = true\n doSync()\n }\n\n if (syncInterval > 0) {\n intervalRef.current = setInterval(doSync, syncInterval * 60 * 1000)\n }\n\n return () => {\n if (intervalRef.current) {\n clearInterval(intervalRef.current)\n }\n }\n }, [sitemapUrl, syncInterval, debug, mode, propApiUrl, propApiKey, allowInFrame, allowLocalhost])\n\n return null\n}\n"]}
@@ -1,5 +1,5 @@
1
1
  'use client';
2
- import { sonorFetch } from './chunk-RSP6RDR2.mjs';
2
+ import { sonorFetch } from './chunk-XNZ2WFXR.mjs';
3
3
  import { useState, useRef, useMemo, useCallback, useEffect, useId } from 'react';
4
4
  import { jsxs, jsx, Fragment } from 'react/jsx-runtime';
5
5
 
@@ -1412,5 +1412,5 @@ var WIDGET_CSS = `
1412
1412
  `;
1413
1413
 
1414
1414
  export { BookingWidget, createBooking, createSlotHold, detectTimezone, fetchAvailability, fetchAvailableDates, fetchBookingTypeDetails, fetchBookingTypes, formatDate, formatDuration, formatTime, prepareMeeting, releaseSlotHold };
1415
- //# sourceMappingURL=chunk-YZCRYK5M.mjs.map
1416
- //# sourceMappingURL=chunk-YZCRYK5M.mjs.map
1415
+ //# sourceMappingURL=chunk-3EOUKWHB.mjs.map
1416
+ //# sourceMappingURL=chunk-3EOUKWHB.mjs.map