@sonordev/site-kit 4.2.0 → 4.2.3

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 (238) hide show
  1. package/agent-manifest.json +1 -1
  2. package/dist/AnalyticsProvider-NW3UZYL5.mjs +10 -0
  3. package/dist/{AnalyticsProvider-QD7H2FER.mjs.map → AnalyticsProvider-NW3UZYL5.mjs.map} +1 -1
  4. package/dist/AnalyticsProvider-VSTTYP4W.js +31 -0
  5. package/dist/{AnalyticsProvider-JTAJ27EC.js.map → AnalyticsProvider-VSTTYP4W.js.map} +1 -1
  6. package/dist/ChatWidget-BJOE2OSI.js +20 -0
  7. package/dist/{ChatWidget-7UV4LXJR.js.map → ChatWidget-BJOE2OSI.js.map} +1 -1
  8. package/dist/ChatWidget-EWQ7LRD4.mjs +11 -0
  9. package/dist/{ChatWidget-BS6STWYV.mjs.map → ChatWidget-EWQ7LRD4.mjs.map} +1 -1
  10. package/dist/EngageWidget-CZMNLFWI.js +18 -0
  11. package/dist/{EngageWidget-AQOTCO46.js.map → EngageWidget-CZMNLFWI.js.map} +1 -1
  12. package/dist/EngageWidget-F427CI6Y.mjs +9 -0
  13. package/dist/{EngageWidget-M7MZXPC4.mjs.map → EngageWidget-F427CI6Y.mjs.map} +1 -1
  14. package/dist/{FileField-VIYBV4GM.mjs → FileField-5RVBU3Z4.mjs} +5 -5
  15. package/dist/{FileField-VIYBV4GM.mjs.map → FileField-5RVBU3Z4.mjs.map} +1 -1
  16. package/dist/{FileField-JIWKVY73.js → FileField-Y4ZA7DST.js} +6 -6
  17. package/dist/{FileField-JIWKVY73.js.map → FileField-Y4ZA7DST.js.map} +1 -1
  18. package/dist/{FormSpotlight-7P3JV3XK.mjs → FormSpotlight-CJPI2MRJ.mjs} +3 -3
  19. package/dist/{FormSpotlight-7P3JV3XK.mjs.map → FormSpotlight-CJPI2MRJ.mjs.map} +1 -1
  20. package/dist/{FormSpotlight-MSBWEM3F.js → FormSpotlight-MAEV6SZK.js} +15 -15
  21. package/dist/{FormSpotlight-MSBWEM3F.js.map → FormSpotlight-MAEV6SZK.js.map} +1 -1
  22. package/dist/{FormStage-FME3O3N2.js → FormStage-D42NAHSN.js} +13 -13
  23. package/dist/{FormStage-FME3O3N2.js.map → FormStage-D42NAHSN.js.map} +1 -1
  24. package/dist/{FormStage-327WGVBM.mjs → FormStage-Z7WW3DNA.mjs} +3 -3
  25. package/dist/{FormStage-327WGVBM.mjs.map → FormStage-Z7WW3DNA.mjs.map} +1 -1
  26. package/dist/ManagedForm-A7BROQIN.mjs +14 -0
  27. package/dist/{ManagedForm-BFZWPWGY.mjs.map → ManagedForm-A7BROQIN.mjs.map} +1 -1
  28. package/dist/ManagedForm-Z3Z5Z6OL.js +23 -0
  29. package/dist/{ManagedForm-5BXS3XKX.js.map → ManagedForm-Z3Z5Z6OL.js.map} +1 -1
  30. package/dist/{SignalCore-EE2RAGZ2.mjs → SignalCore-77UH6PZ4.mjs} +5 -5
  31. package/dist/{SignalCore-EE2RAGZ2.mjs.map → SignalCore-77UH6PZ4.mjs.map} +1 -1
  32. package/dist/{SignalCore-IPLGFFC3.js → SignalCore-NA6TJFVE.js} +11 -11
  33. package/dist/{SignalCore-IPLGFFC3.js.map → SignalCore-NA6TJFVE.js.map} +1 -1
  34. package/dist/SitemapSync-62F6HVAW.js +17 -0
  35. package/dist/{SitemapSync-XBYRZ7WH.js.map → SitemapSync-62F6HVAW.js.map} +1 -1
  36. package/dist/SitemapSync-EY33A6P4.mjs +8 -0
  37. package/dist/{SitemapSync-2X6NM3TX.mjs.map → SitemapSync-EY33A6P4.mjs.map} +1 -1
  38. package/dist/analytics/index.js +9 -9
  39. package/dist/analytics/index.mjs +4 -4
  40. package/dist/api-N5OLQXYN.js +202 -0
  41. package/dist/api-N5OLQXYN.js.map +1 -0
  42. package/dist/api-NTHZ6PAW.mjs +184 -0
  43. package/dist/api-NTHZ6PAW.mjs.map +1 -0
  44. package/dist/{chunk-NDASB3X3.js → chunk-2XRGCDDG.js} +9 -9
  45. package/dist/{chunk-NDASB3X3.js.map → chunk-2XRGCDDG.js.map} +1 -1
  46. package/dist/{chunk-GXABJJ4F.js → chunk-3DSGMX7P.js} +3 -3
  47. package/dist/{chunk-GXABJJ4F.js.map → chunk-3DSGMX7P.js.map} +1 -1
  48. package/dist/{chunk-57IFVXCB.mjs → chunk-3P4HJAZA.mjs} +4 -4
  49. package/dist/{chunk-57IFVXCB.mjs.map → chunk-3P4HJAZA.mjs.map} +1 -1
  50. package/dist/{chunk-4HNFMOYE.mjs → chunk-535HXGDU.mjs} +3 -3
  51. package/dist/{chunk-4HNFMOYE.mjs.map → chunk-535HXGDU.mjs.map} +1 -1
  52. package/dist/{chunk-OO4T5X4Z.mjs → chunk-6D3HZKTZ.mjs} +3 -3
  53. package/dist/{chunk-OO4T5X4Z.mjs.map → chunk-6D3HZKTZ.mjs.map} +1 -1
  54. package/dist/{chunk-XOSAVYAI.js → chunk-7BVZLSUJ.js} +8 -8
  55. package/dist/{chunk-XOSAVYAI.js.map → chunk-7BVZLSUJ.js.map} +1 -1
  56. package/dist/{chunk-4PP4D3TF.js → chunk-BN4AL7XB.js} +4 -4
  57. package/dist/{chunk-4PP4D3TF.js.map → chunk-BN4AL7XB.js.map} +1 -1
  58. package/dist/{chunk-XZCZCND2.mjs → chunk-DZUOLOYS.mjs} +3 -3
  59. package/dist/{chunk-XZCZCND2.mjs.map → chunk-DZUOLOYS.mjs.map} +1 -1
  60. package/dist/{chunk-MTXQG3TX.mjs → chunk-EHNUPEFY.mjs} +18 -8
  61. package/dist/chunk-EHNUPEFY.mjs.map +1 -0
  62. package/dist/{chunk-CMIFYDKA.mjs → chunk-FZAAQE4Y.mjs} +4 -4
  63. package/dist/{chunk-CMIFYDKA.mjs.map → chunk-FZAAQE4Y.mjs.map} +1 -1
  64. package/dist/{chunk-S2C3QU4E.js → chunk-GDMOAGVS.js} +29 -19
  65. package/dist/chunk-GDMOAGVS.js.map +1 -0
  66. package/dist/{chunk-WLVS4QBK.js → chunk-GJKO2TZN.js} +4 -4
  67. package/dist/{chunk-WLVS4QBK.js.map → chunk-GJKO2TZN.js.map} +1 -1
  68. package/dist/{chunk-DQO4UKFE.mjs → chunk-HTLWSCUQ.mjs} +76 -4
  69. package/dist/chunk-HTLWSCUQ.mjs.map +1 -0
  70. package/dist/{chunk-VTFDE7H2.js → chunk-HVDKAR77.js} +7 -7
  71. package/dist/{chunk-VTFDE7H2.js.map → chunk-HVDKAR77.js.map} +1 -1
  72. package/dist/{chunk-UKFBG6FV.mjs → chunk-I7ORAWYT.mjs} +3 -3
  73. package/dist/{chunk-UKFBG6FV.mjs.map → chunk-I7ORAWYT.mjs.map} +1 -1
  74. package/dist/{chunk-SDBUPTF4.mjs → chunk-INA4NW3Y.mjs} +3 -3
  75. package/dist/{chunk-SDBUPTF4.mjs.map → chunk-INA4NW3Y.mjs.map} +1 -1
  76. package/dist/{chunk-DNEUGYTE.mjs → chunk-J6HWSJT7.mjs} +3 -3
  77. package/dist/{chunk-DNEUGYTE.mjs.map → chunk-J6HWSJT7.mjs.map} +1 -1
  78. package/dist/{chunk-VOMAEC5G.js → chunk-JJDY5XXG.js} +3 -3
  79. package/dist/{chunk-VOMAEC5G.js.map → chunk-JJDY5XXG.js.map} +1 -1
  80. package/dist/{chunk-MZZQHGXY.mjs → chunk-KL4MV6HK.mjs} +3 -3
  81. package/dist/{chunk-MZZQHGXY.mjs.map → chunk-KL4MV6HK.mjs.map} +1 -1
  82. package/dist/{chunk-JWIJZQYI.js → chunk-M2SEYO5J.js} +5 -5
  83. package/dist/{chunk-JWIJZQYI.js.map → chunk-M2SEYO5J.js.map} +1 -1
  84. package/dist/{chunk-FFQAKIV5.js → chunk-MF6XLEX5.js} +15 -15
  85. package/dist/{chunk-FFQAKIV5.js.map → chunk-MF6XLEX5.js.map} +1 -1
  86. package/dist/{chunk-7UCKV4WA.js → chunk-MP7ZYKMM.js} +8 -8
  87. package/dist/{chunk-7UCKV4WA.js.map → chunk-MP7ZYKMM.js.map} +1 -1
  88. package/dist/{chunk-INW43FWV.js → chunk-N5RTJNMN.js} +6 -6
  89. package/dist/{chunk-INW43FWV.js.map → chunk-N5RTJNMN.js.map} +1 -1
  90. package/dist/{chunk-QNEBWBZ4.js → chunk-NEIUWAAL.js} +5 -5
  91. package/dist/{chunk-QNEBWBZ4.js.map → chunk-NEIUWAAL.js.map} +1 -1
  92. package/dist/{chunk-Z7HAQTWP.js → chunk-OHA43BNK.js} +14 -14
  93. package/dist/{chunk-Z7HAQTWP.js.map → chunk-OHA43BNK.js.map} +1 -1
  94. package/dist/{chunk-TGGSXT3F.mjs → chunk-PTZB4ES3.mjs} +9 -9
  95. package/dist/chunk-PTZB4ES3.mjs.map +1 -0
  96. package/dist/{chunk-FMAEUQEZ.js → chunk-QJK2X3UK.js} +97 -28
  97. package/dist/chunk-QJK2X3UK.js.map +1 -0
  98. package/dist/{chunk-VGPZ4PCZ.mjs → chunk-RCRDDMUO.mjs} +3 -3
  99. package/dist/{chunk-VGPZ4PCZ.mjs.map → chunk-RCRDDMUO.mjs.map} +1 -1
  100. package/dist/{chunk-IWFP2FQ5.js → chunk-RDISSFEH.js} +15 -15
  101. package/dist/{chunk-IWFP2FQ5.js.map → chunk-RDISSFEH.js.map} +1 -1
  102. package/dist/{chunk-R6LQRHPQ.mjs → chunk-RRR6Y6Y5.mjs} +4 -4
  103. package/dist/{chunk-R6LQRHPQ.mjs.map → chunk-RRR6Y6Y5.mjs.map} +1 -1
  104. package/dist/chunk-S5L73KZQ.js +8 -0
  105. package/dist/{chunk-CBN73TLK.js.map → chunk-S5L73KZQ.js.map} +1 -1
  106. package/dist/{chunk-AVWIKVVE.js → chunk-S5UATBC7.js} +14 -14
  107. package/dist/{chunk-AVWIKVVE.js.map → chunk-S5UATBC7.js.map} +1 -1
  108. package/dist/{chunk-PKQVV6LW.js → chunk-SAR473OC.js} +13 -13
  109. package/dist/chunk-SAR473OC.js.map +1 -0
  110. package/dist/{chunk-DYDAV4Y4.mjs → chunk-SL6ZGJVN.mjs} +4 -4
  111. package/dist/{chunk-DYDAV4Y4.mjs.map → chunk-SL6ZGJVN.mjs.map} +1 -1
  112. package/dist/{chunk-WFCRXUNA.mjs → chunk-T3HGONNE.mjs} +4 -4
  113. package/dist/{chunk-WFCRXUNA.mjs.map → chunk-T3HGONNE.mjs.map} +1 -1
  114. package/dist/{chunk-WCIQKO7W.mjs → chunk-T6T5IQMN.mjs} +3 -3
  115. package/dist/{chunk-WCIQKO7W.mjs.map → chunk-T6T5IQMN.mjs.map} +1 -1
  116. package/dist/{chunk-XXBVF7WN.mjs → chunk-TFAYDIWM.mjs} +3 -3
  117. package/dist/{chunk-XXBVF7WN.mjs.map → chunk-TFAYDIWM.mjs.map} +1 -1
  118. package/dist/{chunk-A5FJZWGY.mjs → chunk-TKVADZFD.mjs} +4 -4
  119. package/dist/{chunk-A5FJZWGY.mjs.map → chunk-TKVADZFD.mjs.map} +1 -1
  120. package/dist/{chunk-UDPUBSSS.mjs → chunk-UDNXM6RB.mjs} +3 -3
  121. package/dist/{chunk-UDPUBSSS.mjs.map → chunk-UDNXM6RB.mjs.map} +1 -1
  122. package/dist/{chunk-HLCCE7BD.js → chunk-WCTOQFAN.js} +14 -14
  123. package/dist/{chunk-HLCCE7BD.js.map → chunk-WCTOQFAN.js.map} +1 -1
  124. package/dist/{chunk-KFDFXRBE.js → chunk-XA7RBHKT.js} +4 -4
  125. package/dist/{chunk-KFDFXRBE.js.map → chunk-XA7RBHKT.js.map} +1 -1
  126. package/dist/chunk-XCFCG46K.mjs +6 -0
  127. package/dist/{chunk-LS64Y25E.mjs.map → chunk-XCFCG46K.mjs.map} +1 -1
  128. package/dist/{chunk-4YWGUQPU.js → chunk-XOJYGBYF.js} +3 -3
  129. package/dist/{chunk-4YWGUQPU.js.map → chunk-XOJYGBYF.js.map} +1 -1
  130. package/dist/{chunk-DSECSIWJ.mjs → chunk-XR3MDDQT.mjs} +3 -3
  131. package/dist/{chunk-DSECSIWJ.mjs.map → chunk-XR3MDDQT.mjs.map} +1 -1
  132. package/dist/{chunk-HI6DVYVN.mjs → chunk-XWFUQMU6.mjs} +3 -3
  133. package/dist/{chunk-HI6DVYVN.mjs.map → chunk-XWFUQMU6.mjs.map} +1 -1
  134. package/dist/{chunk-IV7LOJZO.js → chunk-YWXZ4YLU.js} +4 -4
  135. package/dist/{chunk-IV7LOJZO.js.map → chunk-YWXZ4YLU.js.map} +1 -1
  136. package/dist/{chunk-WCRBZZRI.mjs → chunk-ZASFY4NR.mjs} +89 -20
  137. package/dist/chunk-ZASFY4NR.mjs.map +1 -0
  138. package/dist/{chunk-6TAXXKMX.js → chunk-ZAVNGZJZ.js} +77 -3
  139. package/dist/chunk-ZAVNGZJZ.js.map +1 -0
  140. package/dist/cli/agent/checks.d.ts.map +1 -1
  141. package/dist/cli/commands/og.d.ts +46 -11
  142. package/dist/cli/commands/og.d.ts.map +1 -1
  143. package/dist/cli/index.js +516 -174
  144. package/dist/cli/index.js.map +1 -1
  145. package/dist/cli/index.mjs +514 -172
  146. package/dist/cli/index.mjs.map +1 -1
  147. package/dist/client/index.js +4 -4
  148. package/dist/client/index.mjs +3 -3
  149. package/dist/commerce/index.js +56 -56
  150. package/dist/commerce/index.mjs +5 -5
  151. package/dist/engage/index.js +10 -10
  152. package/dist/engage/index.mjs +7 -7
  153. package/dist/fleet/index.js +8 -8
  154. package/dist/fleet/index.mjs +4 -4
  155. package/dist/forms/ManagedForm.d.ts.map +1 -1
  156. package/dist/forms/index.js +16 -16
  157. package/dist/forms/index.mjs +9 -9
  158. package/dist/forms/server.js +10 -10
  159. package/dist/forms/server.mjs +8 -8
  160. package/dist/forms/static.js +7 -7
  161. package/dist/forms/static.mjs +6 -6
  162. package/dist/forms/tracking-session.d.ts +63 -0
  163. package/dist/forms/tracking-session.d.ts.map +1 -0
  164. package/dist/forms/tracking-session.test.d.ts +22 -0
  165. package/dist/forms/tracking-session.test.d.ts.map +1 -0
  166. package/dist/forms/useForm.d.ts +11 -0
  167. package/dist/forms/useForm.d.ts.map +1 -1
  168. package/dist/forms/useFormTracking.d.ts +6 -1
  169. package/dist/forms/useFormTracking.d.ts.map +1 -1
  170. package/dist/images/index.js +11 -11
  171. package/dist/images/index.mjs +4 -4
  172. package/dist/index.js +63 -63
  173. package/dist/index.mjs +9 -9
  174. package/dist/layout/SiteKitClientProviders.d.ts +7 -0
  175. package/dist/layout/SiteKitClientProviders.d.ts.map +1 -1
  176. package/dist/layout/SiteKitLayout.d.ts +18 -1
  177. package/dist/layout/SiteKitLayout.d.ts.map +1 -1
  178. package/dist/layout/client.d.ts +7 -0
  179. package/dist/layout/client.d.ts.map +1 -1
  180. package/dist/layout/client.js +8 -8
  181. package/dist/layout/client.mjs +7 -7
  182. package/dist/layout/index.js +11 -11
  183. package/dist/layout/index.js.map +1 -1
  184. package/dist/layout/index.mjs +9 -9
  185. package/dist/layout/index.mjs.map +1 -1
  186. package/dist/maps/index.js +5 -5
  187. package/dist/maps/index.mjs +3 -3
  188. package/dist/og/config.d.ts +36 -0
  189. package/dist/og/config.d.ts.map +1 -1
  190. package/dist/og/index.js +5 -5
  191. package/dist/og/index.mjs +1 -1
  192. package/dist/og/pages.d.ts +56 -0
  193. package/dist/og/pages.d.ts.map +1 -0
  194. package/dist/og/pages.test.d.ts +2 -0
  195. package/dist/og/pages.test.d.ts.map +1 -0
  196. package/dist/og/template.d.ts.map +1 -1
  197. package/dist/og/wiring.d.ts +56 -0
  198. package/dist/og/wiring.d.ts.map +1 -0
  199. package/dist/og/wiring.test.d.ts +2 -0
  200. package/dist/og/wiring.test.d.ts.map +1 -0
  201. package/dist/search/index.js +4 -4
  202. package/dist/search/index.mjs +3 -3
  203. package/dist/seo/client.js +5 -5
  204. package/dist/seo/client.mjs +4 -4
  205. package/dist/seo/index.js +5 -5
  206. package/dist/seo/index.mjs +4 -4
  207. package/dist/seo/register-sitemap-cli.js +1 -1
  208. package/dist/seo/register-sitemap-cli.mjs +1 -1
  209. package/dist/server/index.js +3 -3
  210. package/dist/server/index.mjs +2 -2
  211. package/dist/shared/version.d.ts +1 -1
  212. package/dist/signal/index.js +11 -11
  213. package/dist/signal/index.mjs +2 -2
  214. package/dist/sync/index.js +16 -16
  215. package/dist/sync/index.mjs +4 -4
  216. package/dist/types.d.ts +5 -2
  217. package/dist/types.d.ts.map +1 -1
  218. package/package.json +3 -3
  219. package/dist/AnalyticsProvider-JTAJ27EC.js +0 -31
  220. package/dist/AnalyticsProvider-QD7H2FER.mjs +0 -10
  221. package/dist/ChatWidget-7UV4LXJR.js +0 -20
  222. package/dist/ChatWidget-BS6STWYV.mjs +0 -11
  223. package/dist/EngageWidget-AQOTCO46.js +0 -18
  224. package/dist/EngageWidget-M7MZXPC4.mjs +0 -9
  225. package/dist/ManagedForm-5BXS3XKX.js +0 -23
  226. package/dist/ManagedForm-BFZWPWGY.mjs +0 -14
  227. package/dist/SitemapSync-2X6NM3TX.mjs +0 -8
  228. package/dist/SitemapSync-XBYRZ7WH.js +0 -17
  229. package/dist/chunk-6TAXXKMX.js.map +0 -1
  230. package/dist/chunk-CBN73TLK.js +0 -8
  231. package/dist/chunk-DQO4UKFE.mjs.map +0 -1
  232. package/dist/chunk-FMAEUQEZ.js.map +0 -1
  233. package/dist/chunk-LS64Y25E.mjs +0 -6
  234. package/dist/chunk-MTXQG3TX.mjs.map +0 -1
  235. package/dist/chunk-PKQVV6LW.js.map +0 -1
  236. package/dist/chunk-S2C3QU4E.js.map +0 -1
  237. package/dist/chunk-TGGSXT3F.mjs.map +0 -1
  238. package/dist/chunk-WCRBZZRI.mjs.map +0 -1
@@ -30,6 +30,13 @@ export interface SiteKitClientProvidersProps {
30
30
  analytics?: boolean | AnalyticsConfig;
31
31
  engage?: boolean | EngageConfig;
32
32
  signal?: boolean | SignalConfig;
33
+ /**
34
+ * Runtime SitemapSync from the visitor's browser. Default FALSE — sitemap
35
+ * registration belongs to build time and to sonor-api's nightly reconciler,
36
+ * not to whoever happens to load the page. See SiteKitLayout for the full
37
+ * reasoning; in short, its guards live in session/localStorage, so every new
38
+ * visitor missed them and re-POSTed the whole sitemap.
39
+ */
33
40
  sitemapSync?: boolean;
34
41
  /**
35
42
  * Fleet heartbeat — reports kit version + active modules to Sonor once per
@@ -1 +1 @@
1
- {"version":3,"file":"SiteKitClientProviders.d.ts","sourceRoot":"","sources":["../../src/layout/SiteKitClientProviders.tsx"],"names":[],"mappings":"AAEA;;;;;;;;;;;;;;;;;;;;;GAqBG;AAEH,OAAO,KAAK,EAAE,EAA2C,KAAK,SAAS,EAAE,MAAM,OAAO,CAAA;AAmBtF,OAAO,KAAK,EAAE,eAAe,EAAE,YAAY,EAAE,YAAY,EAAE,MAAM,SAAS,CAAA;AA4B1E,MAAM,WAAW,2BAA2B;IAC1C,QAAQ,EAAE,SAAS,CAAA;IACnB,MAAM,EAAE,MAAM,CAAA;IACd,MAAM,EAAE,MAAM,CAAA;IACd,SAAS,CAAC,EAAE,MAAM,CAAA;IAClB,SAAS,CAAC,EAAE,OAAO,GAAG,eAAe,CAAA;IACrC,MAAM,CAAC,EAAE,OAAO,GAAG,YAAY,CAAA;IAC/B,MAAM,CAAC,EAAE,OAAO,GAAG,YAAY,CAAA;IAC/B,WAAW,CAAC,EAAE,OAAO,CAAA;IACrB;;;;;OAKG;IACH,KAAK,CAAC,EAAE,OAAO,CAAA;IACf;;;;;OAKG;IACH,KAAK,CAAC,EAAE,OAAO,CAAA;IACf,KAAK,CAAC,EAAE,OAAO,CAAA;IACf,2EAA2E;IAC3E,cAAc,CAAC,EAAE,MAAM,CAAA;CACxB;AAED,wBAAgB,sBAAsB,CAAC,EACrC,QAAQ,EACR,MAAM,EACN,MAAM,EACN,SAAS,EACT,SAAgB,EAChB,MAAa,EACb,MAAc,EACd,WAAkB,EAClB,KAAY,EACZ,KAAY,EACZ,KAAa,EACb,cAAc,GACf,EAAE,2BAA2B,qBAuJ7B"}
1
+ {"version":3,"file":"SiteKitClientProviders.d.ts","sourceRoot":"","sources":["../../src/layout/SiteKitClientProviders.tsx"],"names":[],"mappings":"AAEA;;;;;;;;;;;;;;;;;;;;;GAqBG;AAEH,OAAO,KAAK,EAAE,EAA2C,KAAK,SAAS,EAAE,MAAM,OAAO,CAAA;AAmBtF,OAAO,KAAK,EAAE,eAAe,EAAE,YAAY,EAAE,YAAY,EAAE,MAAM,SAAS,CAAA;AA4B1E,MAAM,WAAW,2BAA2B;IAC1C,QAAQ,EAAE,SAAS,CAAA;IACnB,MAAM,EAAE,MAAM,CAAA;IACd,MAAM,EAAE,MAAM,CAAA;IACd,SAAS,CAAC,EAAE,MAAM,CAAA;IAClB,SAAS,CAAC,EAAE,OAAO,GAAG,eAAe,CAAA;IACrC,MAAM,CAAC,EAAE,OAAO,GAAG,YAAY,CAAA;IAC/B,MAAM,CAAC,EAAE,OAAO,GAAG,YAAY,CAAA;IAC/B;;;;;;OAMG;IACH,WAAW,CAAC,EAAE,OAAO,CAAA;IACrB;;;;;OAKG;IACH,KAAK,CAAC,EAAE,OAAO,CAAA;IACf;;;;;OAKG;IACH,KAAK,CAAC,EAAE,OAAO,CAAA;IACf,KAAK,CAAC,EAAE,OAAO,CAAA;IACf,2EAA2E;IAC3E,cAAc,CAAC,EAAE,MAAM,CAAA;CACxB;AAED,wBAAgB,sBAAsB,CAAC,EACrC,QAAQ,EACR,MAAM,EACN,MAAM,EACN,SAAS,EACT,SAAgB,EAChB,MAAa,EACb,MAAc,EACd,WAAmB,EACnB,KAAY,EACZ,KAAY,EACZ,KAAa,EACb,cAAc,GACf,EAAE,2BAA2B,qBAuJ7B"}
@@ -58,7 +58,24 @@ export interface SiteKitLayoutProps {
58
58
  engage?: boolean | EngageConfig;
59
59
  /** Signal AI (experiments, behavior). false (default) | true | config object */
60
60
  signal?: boolean | SignalConfig;
61
- /** SitemapSync client component. Default: true */
61
+ /**
62
+ * Runtime SitemapSync from the visitor's browser. **Default: false.**
63
+ *
64
+ * Sitemap registration is a build-time and server-side job. Build-time
65
+ * `createSitemap` is canonical, and sonor-api's nightly reconciler fetches
66
+ * each host's /sitemap.xml itself, so nothing here needs a visitor.
67
+ *
68
+ * This defaulted to true, and because its throttle lives in sessionStorage
69
+ * and its content hash in localStorage, every first-time visitor, incognito
70
+ * tab and crawler missed both guards and re-POSTed the entire sitemap:
71
+ * upforge.io took ~140 full syncs in a day, queencityriverboats.com ~76.
72
+ * That coupled sitemap traffic to VISITOR COUNT rather than to content
73
+ * changes — exactly backwards — and made every reader pay for platform
74
+ * bookkeeping in bandwidth, XML parsing and an API round-trip.
75
+ *
76
+ * Set true only to re-enable the legacy browser fallback for a site whose
77
+ * build-time registration cannot be made to work.
78
+ */
62
79
  sitemapSync?: boolean;
63
80
  /**
64
81
  * Fleet heartbeat — reports this site's kit version + active modules to Sonor
@@ -1 +1 @@
1
- {"version":3,"file":"SiteKitLayout.d.ts","sourceRoot":"","sources":["../../src/layout/SiteKitLayout.tsx"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA2CG;AAEH,OAAO,KAAK,KAAK,MAAM,OAAO,CAAA;AAO9B,OAAO,KAAK,EAAE,eAAe,EAAE,YAAY,EAAE,YAAY,EAAE,MAAM,SAAS,CAAA;AAE1E,MAAM,WAAW,kBAAkB;IACjC,QAAQ,EAAE,KAAK,CAAC,SAAS,CAAA;IAEzB,yDAAyD;IACzD,MAAM,CAAC,EAAE,MAAM,CAAA;IACf,8DAA8D;IAC9D,MAAM,CAAC,EAAE,MAAM,CAAA;IACf,gFAAgF;IAChF,SAAS,CAAC,EAAE,MAAM,CAAA;IAElB,iEAAiE;IACjE,SAAS,CAAC,EAAE,OAAO,GAAG,eAAe,CAAA;IACrC,4EAA4E;IAC5E,MAAM,CAAC,EAAE,OAAO,GAAG,YAAY,CAAA;IAC/B,gFAAgF;IAChF,MAAM,CAAC,EAAE,OAAO,GAAG,YAAY,CAAA;IAC/B,kDAAkD;IAClD,WAAW,CAAC,EAAE,OAAO,CAAA;IACrB;;;;OAIG;IACH,KAAK,CAAC,EAAE,OAAO,CAAA;IACf;;;;;OAKG;IACH,KAAK,CAAC,EAAE,OAAO,CAAA;IACf,8CAA8C;IAC9C,OAAO,CAAC,EAAE,OAAO,CAAA;IACjB,sDAAsD;IACtD,cAAc,CAAC,EAAE,OAAO,CAAA;IAExB,mDAAmD;IACnD,KAAK,CAAC,EAAE,OAAO,CAAA;IACf;;;OAGG;IACH,qBAAqB,CAAC,EAAE,OAAO,CAAA;IAC/B;;;;;OAKG;IACH,WAAW,CAAC,EAAE,OAAO,GAAG;QAAE,IAAI,CAAC,EAAE,WAAW,GAAG,UAAU,CAAC;QAAC,OAAO,CAAC,EAAE,MAAM,EAAE,CAAA;KAAE,CAAA;CAChF;AAED,wBAAsB,aAAa,CAAC,EAClC,QAAQ,EACR,MAAM,EACN,MAAM,EACN,SAAS,EACT,SAAgB,EAChB,MAAa,EACb,MAAc,EACd,WAAkB,EAClB,KAAY,EACZ,KAAY,EACZ,OAAc,EACd,cAAqB,EACrB,KAAa,EACb,qBAA6B,EAC7B,WAAmB,GACpB,EAAE,kBAAkB,8BAkEpB"}
1
+ {"version":3,"file":"SiteKitLayout.d.ts","sourceRoot":"","sources":["../../src/layout/SiteKitLayout.tsx"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA2CG;AAEH,OAAO,KAAK,KAAK,MAAM,OAAO,CAAA;AAO9B,OAAO,KAAK,EAAE,eAAe,EAAE,YAAY,EAAE,YAAY,EAAE,MAAM,SAAS,CAAA;AAE1E,MAAM,WAAW,kBAAkB;IACjC,QAAQ,EAAE,KAAK,CAAC,SAAS,CAAA;IAEzB,yDAAyD;IACzD,MAAM,CAAC,EAAE,MAAM,CAAA;IACf,8DAA8D;IAC9D,MAAM,CAAC,EAAE,MAAM,CAAA;IACf,gFAAgF;IAChF,SAAS,CAAC,EAAE,MAAM,CAAA;IAElB,iEAAiE;IACjE,SAAS,CAAC,EAAE,OAAO,GAAG,eAAe,CAAA;IACrC,4EAA4E;IAC5E,MAAM,CAAC,EAAE,OAAO,GAAG,YAAY,CAAA;IAC/B,gFAAgF;IAChF,MAAM,CAAC,EAAE,OAAO,GAAG,YAAY,CAAA;IAC/B;;;;;;;;;;;;;;;;;OAiBG;IACH,WAAW,CAAC,EAAE,OAAO,CAAA;IACrB;;;;OAIG;IACH,KAAK,CAAC,EAAE,OAAO,CAAA;IACf;;;;;OAKG;IACH,KAAK,CAAC,EAAE,OAAO,CAAA;IACf,8CAA8C;IAC9C,OAAO,CAAC,EAAE,OAAO,CAAA;IACjB,sDAAsD;IACtD,cAAc,CAAC,EAAE,OAAO,CAAA;IAExB,mDAAmD;IACnD,KAAK,CAAC,EAAE,OAAO,CAAA;IACf;;;OAGG;IACH,qBAAqB,CAAC,EAAE,OAAO,CAAA;IAC/B;;;;;OAKG;IACH,WAAW,CAAC,EAAE,OAAO,GAAG;QAAE,IAAI,CAAC,EAAE,WAAW,GAAG,UAAU,CAAC;QAAC,OAAO,CAAC,EAAE,MAAM,EAAE,CAAA;KAAE,CAAA;CAChF;AAED,wBAAsB,aAAa,CAAC,EAClC,QAAQ,EACR,MAAM,EACN,MAAM,EACN,SAAS,EACT,SAAgB,EAChB,MAAa,EACb,MAAc,EACd,WAAmB,EACnB,KAAY,EACZ,KAAY,EACZ,OAAc,EACd,cAAqB,EACrB,KAAa,EACb,qBAA6B,EAC7B,WAAmB,GACpB,EAAE,kBAAkB,8BAkEpB"}
@@ -30,6 +30,13 @@ export interface SiteKitClientProvidersProps {
30
30
  analytics?: boolean | AnalyticsConfig;
31
31
  engage?: boolean | EngageConfig;
32
32
  signal?: boolean | SignalConfig;
33
+ /**
34
+ * Runtime SitemapSync from the visitor's browser. Default FALSE — sitemap
35
+ * registration belongs to build time and to sonor-api's nightly reconciler,
36
+ * not to whoever happens to load the page. See SiteKitLayout for the full
37
+ * reasoning; in short, its guards live in session/localStorage, so every new
38
+ * visitor missed them and re-POSTed the whole sitemap.
39
+ */
33
40
  sitemapSync?: boolean;
34
41
  /**
35
42
  * Fleet heartbeat — reports kit version + active modules to Sonor once per
@@ -1 +1 @@
1
- {"version":3,"file":"SiteKitClientProviders.d.ts","sourceRoot":"","sources":["../../src/layout/SiteKitClientProviders.tsx"],"names":[],"mappings":"AAEA;;;;;;;;;;;;;;;;;;;;;GAqBG;AAEH,OAAO,KAAK,EAAE,EAA2C,KAAK,SAAS,EAAE,MAAM,OAAO,CAAA;AAmBtF,OAAO,KAAK,EAAE,eAAe,EAAE,YAAY,EAAE,YAAY,EAAE,MAAM,SAAS,CAAA;AA4B1E,MAAM,WAAW,2BAA2B;IAC1C,QAAQ,EAAE,SAAS,CAAA;IACnB,MAAM,EAAE,MAAM,CAAA;IACd,MAAM,EAAE,MAAM,CAAA;IACd,SAAS,CAAC,EAAE,MAAM,CAAA;IAClB,SAAS,CAAC,EAAE,OAAO,GAAG,eAAe,CAAA;IACrC,MAAM,CAAC,EAAE,OAAO,GAAG,YAAY,CAAA;IAC/B,MAAM,CAAC,EAAE,OAAO,GAAG,YAAY,CAAA;IAC/B,WAAW,CAAC,EAAE,OAAO,CAAA;IACrB;;;;;OAKG;IACH,KAAK,CAAC,EAAE,OAAO,CAAA;IACf;;;;;OAKG;IACH,KAAK,CAAC,EAAE,OAAO,CAAA;IACf,KAAK,CAAC,EAAE,OAAO,CAAA;IACf,2EAA2E;IAC3E,cAAc,CAAC,EAAE,MAAM,CAAA;CACxB;AAED,wBAAgB,sBAAsB,CAAC,EACrC,QAAQ,EACR,MAAM,EACN,MAAM,EACN,SAAS,EACT,SAAgB,EAChB,MAAa,EACb,MAAc,EACd,WAAkB,EAClB,KAAY,EACZ,KAAY,EACZ,KAAa,EACb,cAAc,GACf,EAAE,2BAA2B,qBAuJ7B"}
1
+ {"version":3,"file":"SiteKitClientProviders.d.ts","sourceRoot":"","sources":["../../src/layout/SiteKitClientProviders.tsx"],"names":[],"mappings":"AAEA;;;;;;;;;;;;;;;;;;;;;GAqBG;AAEH,OAAO,KAAK,EAAE,EAA2C,KAAK,SAAS,EAAE,MAAM,OAAO,CAAA;AAmBtF,OAAO,KAAK,EAAE,eAAe,EAAE,YAAY,EAAE,YAAY,EAAE,MAAM,SAAS,CAAA;AA4B1E,MAAM,WAAW,2BAA2B;IAC1C,QAAQ,EAAE,SAAS,CAAA;IACnB,MAAM,EAAE,MAAM,CAAA;IACd,MAAM,EAAE,MAAM,CAAA;IACd,SAAS,CAAC,EAAE,MAAM,CAAA;IAClB,SAAS,CAAC,EAAE,OAAO,GAAG,eAAe,CAAA;IACrC,MAAM,CAAC,EAAE,OAAO,GAAG,YAAY,CAAA;IAC/B,MAAM,CAAC,EAAE,OAAO,GAAG,YAAY,CAAA;IAC/B;;;;;;OAMG;IACH,WAAW,CAAC,EAAE,OAAO,CAAA;IACrB;;;;;OAKG;IACH,KAAK,CAAC,EAAE,OAAO,CAAA;IACf;;;;;OAKG;IACH,KAAK,CAAC,EAAE,OAAO,CAAA;IACf,KAAK,CAAC,EAAE,OAAO,CAAA;IACf,2EAA2E;IAC3E,cAAc,CAAC,EAAE,MAAM,CAAA;CACxB;AAED,wBAAgB,sBAAsB,CAAC,EACrC,QAAQ,EACR,MAAM,EACN,MAAM,EACN,SAAS,EACT,SAAgB,EAChB,MAAa,EACb,MAAc,EACd,WAAmB,EACnB,KAAY,EACZ,KAAY,EACZ,KAAa,EACb,cAAc,GACf,EAAE,2BAA2B,qBAuJ7B"}
@@ -1,25 +1,25 @@
1
1
  'use client';
2
2
  'use strict';
3
3
 
4
- var chunkPKQVV6LW_js = require('../chunk-PKQVV6LW.js');
5
- require('../chunk-JWIJZQYI.js');
6
- require('../chunk-VTFDE7H2.js');
4
+ var chunkSAR473OC_js = require('../chunk-SAR473OC.js');
5
+ require('../chunk-M2SEYO5J.js');
6
+ require('../chunk-HVDKAR77.js');
7
7
  require('../chunk-Q2NBD54V.js');
8
8
  require('../chunk-NB4MK2Q5.js');
9
9
  require('../chunk-HGNSJXWT.js');
10
- require('../chunk-VOMAEC5G.js');
10
+ require('../chunk-JJDY5XXG.js');
11
11
  require('../chunk-RC4WWQXR.js');
12
12
  require('../chunk-VJMPIRSD.js');
13
- require('../chunk-FFQAKIV5.js');
14
- require('../chunk-KFDFXRBE.js');
15
- require('../chunk-CBN73TLK.js');
13
+ require('../chunk-MF6XLEX5.js');
14
+ require('../chunk-XA7RBHKT.js');
15
+ require('../chunk-S5L73KZQ.js');
16
16
  require('../chunk-SNAQBZPT.js');
17
17
 
18
18
 
19
19
 
20
20
  Object.defineProperty(exports, "SiteKitClientProviders", {
21
21
  enumerable: true,
22
- get: function () { return chunkPKQVV6LW_js.SiteKitClientProviders; }
22
+ get: function () { return chunkSAR473OC_js.SiteKitClientProviders; }
23
23
  });
24
24
  //# sourceMappingURL=client.js.map
25
25
  //# sourceMappingURL=client.js.map
@@ -1,16 +1,16 @@
1
1
  'use client';
2
- export { SiteKitClientProviders } from '../chunk-TGGSXT3F.mjs';
3
- import '../chunk-UKFBG6FV.mjs';
4
- import '../chunk-WFCRXUNA.mjs';
2
+ export { SiteKitClientProviders } from '../chunk-PTZB4ES3.mjs';
3
+ import '../chunk-I7ORAWYT.mjs';
4
+ import '../chunk-T3HGONNE.mjs';
5
5
  import '../chunk-ZPLN537Q.mjs';
6
6
  import '../chunk-NI7OY4FW.mjs';
7
7
  import '../chunk-ZVBLXXNJ.mjs';
8
- import '../chunk-XZCZCND2.mjs';
8
+ import '../chunk-DZUOLOYS.mjs';
9
9
  import '../chunk-ZZQAGCSI.mjs';
10
10
  import '../chunk-6EDVCUAG.mjs';
11
- import '../chunk-R6LQRHPQ.mjs';
12
- import '../chunk-WCIQKO7W.mjs';
13
- import '../chunk-LS64Y25E.mjs';
11
+ import '../chunk-RRR6Y6Y5.mjs';
12
+ import '../chunk-T6T5IQMN.mjs';
13
+ import '../chunk-XCFCG46K.mjs';
14
14
  import '../chunk-BEXTDHO4.mjs';
15
15
  //# sourceMappingURL=client.mjs.map
16
16
  //# sourceMappingURL=client.mjs.map
@@ -1,21 +1,21 @@
1
1
  'use strict';
2
2
 
3
- var chunkPKQVV6LW_js = require('../chunk-PKQVV6LW.js');
4
- require('../chunk-JWIJZQYI.js');
5
- require('../chunk-VTFDE7H2.js');
3
+ var chunkSAR473OC_js = require('../chunk-SAR473OC.js');
4
+ require('../chunk-M2SEYO5J.js');
5
+ require('../chunk-HVDKAR77.js');
6
6
  require('../chunk-Q2NBD54V.js');
7
7
  require('../chunk-NB4MK2Q5.js');
8
8
  require('../chunk-HGNSJXWT.js');
9
9
  var chunkGCPPXUAI_js = require('../chunk-GCPPXUAI.js');
10
- require('../chunk-VOMAEC5G.js');
11
- var chunk4PP4D3TF_js = require('../chunk-4PP4D3TF.js');
10
+ require('../chunk-JJDY5XXG.js');
11
+ var chunkBN4AL7XB_js = require('../chunk-BN4AL7XB.js');
12
12
  var chunkDV2LJYFD_js = require('../chunk-DV2LJYFD.js');
13
13
  var chunkQPIKPWAZ_js = require('../chunk-QPIKPWAZ.js');
14
14
  require('../chunk-RC4WWQXR.js');
15
15
  require('../chunk-VJMPIRSD.js');
16
- require('../chunk-FFQAKIV5.js');
17
- require('../chunk-KFDFXRBE.js');
18
- require('../chunk-CBN73TLK.js');
16
+ require('../chunk-MF6XLEX5.js');
17
+ require('../chunk-XA7RBHKT.js');
18
+ require('../chunk-S5L73KZQ.js');
19
19
  require('../chunk-SNAQBZPT.js');
20
20
  var jsxRuntime = require('react/jsx-runtime');
21
21
 
@@ -52,7 +52,7 @@ async function SiteKitLayout({
52
52
  analytics = true,
53
53
  engage = true,
54
54
  signal = false,
55
- sitemapSync = true,
55
+ sitemapSync = false,
56
56
  fleet = true,
57
57
  defer = true,
58
58
  favicon = true,
@@ -69,7 +69,7 @@ async function SiteKitLayout({
69
69
  );
70
70
  }
71
71
  const apiOrigin = chunkQPIKPWAZ_js.resolveApiOrigin(resolvedApiUrl);
72
- const clientCredential = await chunk4PP4D3TF_js.resolveClientCredential(resolvedApiKey, resolvedApiUrl);
72
+ const clientCredential = await chunkBN4AL7XB_js.resolveClientCredential(resolvedApiKey, resolvedApiUrl);
73
73
  return /* @__PURE__ */ jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [
74
74
  /* @__PURE__ */ jsxRuntime.jsx("link", { rel: "preconnect", href: apiOrigin, crossOrigin: "anonymous" }),
75
75
  /* @__PURE__ */ jsxRuntime.jsx("link", { rel: "dns-prefetch", href: apiOrigin }),
@@ -77,7 +77,7 @@ async function SiteKitLayout({
77
77
  managedScripts && /* @__PURE__ */ jsxRuntime.jsx(chunkDV2LJYFD_js.ManagedScripts, { position: "head" }),
78
78
  speculation && /* @__PURE__ */ jsxRuntime.jsx(SpeculationRules, { ...typeof speculation === "object" ? speculation : {} }),
79
79
  /* @__PURE__ */ jsxRuntime.jsxs(
80
- chunkPKQVV6LW_js.SiteKitClientProviders,
80
+ chunkSAR473OC_js.SiteKitClientProviders,
81
81
  {
82
82
  apiKey: clientCredential,
83
83
  apiUrl: resolvedApiUrl,
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/layout/SpeculationRules.tsx","../../src/layout/SiteKitLayout.tsx"],"names":["jsx","resolveApiOrigin","resolveClientCredential","jsxs","Fragment","ManagedFavicon","ManagedScripts","SiteKitClientProviders"],"mappings":"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","file":"index.js","sourcesContent":["/**\n * SpeculationRules — declarative near-instant navigation for static sites.\n *\n * Emits a `<script type=\"speculationrules\">` telling supporting browsers\n * (Chromium 121+) to prerender same-origin links as the user shows intent\n * (moderate eagerness = hover/mousedown). Non-supporting browsers ignore the\n * tag entirely; there is no JS, no polyfill, no runtime cost — pure\n * progressive enhancement, ideal for the force-static fleet.\n *\n * Server component: renders during SSR, ships as static HTML.\n *\n * Excluded by default: URLs with a query string (often personalized) and\n * obvious non-page paths. Keep exclusions tight — prerendering a page that\n * sets cookies or fires analytics on load double-fires them only if the\n * analytics module ignores prerendering; site-kit analytics defers to\n * post-activation, and Chrome delays most side effects until activation.\n */\n\ninterface SpeculationRulesProps {\n /**\n * 'prerender' (default) renders the next page fully in the background;\n * 'prefetch' only fetches the document. Prefetch is the conservative\n * fallback if a site sees issues with prerender.\n */\n mode?: 'prerender' | 'prefetch'\n /** Additional URL patterns to exclude (speculation rules URL pattern syntax). */\n exclude?: string[]\n}\n\nexport function SpeculationRules({ mode = 'prerender', exclude = [] }: SpeculationRulesProps) {\n const rules = {\n [mode]: [\n {\n source: 'document' as const,\n where: {\n and: [\n { href_matches: '/*' },\n { not: { href_matches: '/*\\\\?*' } },\n { not: { href_matches: '/api/*' } },\n ...exclude.map(pattern => ({ not: { href_matches: pattern } })),\n ],\n },\n eagerness: 'moderate' as const,\n },\n ],\n }\n\n return (\n <script\n type=\"speculationrules\"\n dangerouslySetInnerHTML={{ __html: JSON.stringify(rules) }}\n />\n )\n}\n","/**\n * @sonordev/site-kit/layout — SiteKitLayout\n *\n * The master layout component. A single RSC that auto-composes every\n * site-kit feature your layout needs:\n *\n * Server-side (RSC):\n * - ManagedFavicon (link tags from Portal logo)\n * - ManagedScripts position=\"head\" (tracking pixels, analytics tags)\n * - ManagedScripts position=\"body-end\"\n *\n * Client-side (island):\n * - AnalyticsProvider (page views, scroll depth, heatmap, web vitals)\n * - EngageWidget (popups, nudges, chat)\n * - SignalBridge (A/B experiments, behavior tracking)\n * - SitemapSync (keeps Portal seo_pages in sync)\n *\n * @example\n * ```tsx\n * // app/layout.tsx\n * import { SiteKitLayout } from '@sonordev/site-kit/layout'\n *\n * export default function RootLayout({ children }) {\n * return (\n * <html lang=\"en\">\n * <body>\n * <SiteKitLayout>\n * <Header />\n * <main>{children}</main>\n * <Footer />\n * </SiteKitLayout>\n * </body>\n * </html>\n * )\n * }\n * ```\n *\n * @example Opt out of specific features:\n * ```tsx\n * <SiteKitLayout engage={false} signal={false}>\n * {children}\n * </SiteKitLayout>\n * ```\n */\n\nimport * as React from 'react'\nimport { ManagedFavicon } from '../images/ManagedFavicon'\nimport { ManagedScripts } from '../seo/ManagedScripts'\nimport { resolveApiOrigin } from '../server/server-fetch'\nimport { resolveClientCredential } from '../server/mint-site-token'\nimport { SiteKitClientProviders } from './SiteKitClientProviders'\nimport { SpeculationRules } from './SpeculationRules'\nimport type { AnalyticsConfig, EngageConfig, SignalConfig } from './types'\n\nexport interface SiteKitLayoutProps {\n children: React.ReactNode\n\n /** Portal API key. Defaults to SONOR_API_KEY env var. */\n apiKey?: string\n /** Portal API URL. Defaults to env or https://api.sonor.io */\n apiUrl?: string\n /** Project ID (for Engage chat room routing). Auto-resolved if not provided. */\n projectId?: string\n\n /** Analytics tracking. true (default) | false | config object */\n analytics?: boolean | AnalyticsConfig\n /** Engage widgets (popups, chat). true (default) | false | config object */\n engage?: boolean | EngageConfig\n /** Signal AI (experiments, behavior). false (default) | true | config object */\n signal?: boolean | SignalConfig\n /** SitemapSync client component. Default: true */\n sitemapSync?: boolean\n /**\n * Fleet heartbeat — reports this site's kit version + active modules to Sonor\n * once per session so the platform can track version drift. Default: true.\n * Deferred like Analytics; never in the hydration path.\n */\n fleet?: boolean\n /**\n * Defer client modules (Analytics, Engage, SitemapSync) until window load +\n * idle or the first user interaction, keeping their JS and mount work out of\n * the critical hydration path. Default: true. Pass false to restore legacy\n * eager mounting. SignalBridge is never deferred.\n */\n defer?: boolean\n /** ManagedFavicon in <head>. Default: true */\n favicon?: boolean\n /** ManagedScripts (head + body-end). Default: true */\n managedScripts?: boolean\n\n /** Debug mode — logs to console. Default: false */\n debug?: boolean\n /**\n * When true, append a screen-reader-only link to `/llms.txt` after main content.\n * Default false — prefer `buildAiDiscoveryHeaders()` for discovery.\n */\n showLlmsTxtFooterLink?: boolean\n /**\n * Emit a Speculation Rules script prerendering same-origin links on intent\n * (Chromium 121+; other browsers ignore it). Zero JS, static-safe. Default\n * false — opt in per site, or pass { mode: 'prefetch' } for the\n * conservative variant.\n */\n speculation?: boolean | { mode?: 'prerender' | 'prefetch'; exclude?: string[] }\n}\n\nexport async function SiteKitLayout({\n children,\n apiKey,\n apiUrl,\n projectId,\n analytics = true,\n engage = true,\n signal = false,\n sitemapSync = true,\n fleet = true,\n defer = true,\n favicon = true,\n managedScripts = true,\n debug = false,\n showLlmsTxtFooterLink = false,\n speculation = false,\n}: SiteKitLayoutProps) {\n // Resolve API config from env (server-side, safe)\n const resolvedApiKey =\n apiKey ??\n process.env.SONOR_API_KEY ??\n ''\n const resolvedApiUrl =\n apiUrl ??\n process.env.SONOR_API_URL ??\n 'https://api.sonor.io'\n\n if (!resolvedApiKey && debug) {\n console.warn(\n '[SiteKitLayout] No API key found. Set SONOR_API_KEY.',\n )\n }\n\n const apiOrigin = resolveApiOrigin(resolvedApiUrl)\n\n // Mint a short-lived client token so the raw key never reaches the browser.\n // Falls back to the raw key if minting is unavailable (older API / transient\n // outage) — the build never breaks. The client refreshes the token as needed.\n const clientCredential = await resolveClientCredential(resolvedApiKey, resolvedApiUrl)\n\n return (\n <>\n <link rel=\"preconnect\" href={apiOrigin} crossOrigin=\"anonymous\" />\n <link rel=\"dns-prefetch\" href={apiOrigin} />\n {/* Server-rendered head components */}\n {favicon && <ManagedFavicon apiKey={resolvedApiKey} apiUrl={resolvedApiUrl} />}\n {managedScripts && <ManagedScripts position=\"head\" />}\n {speculation && (\n <SpeculationRules {...(typeof speculation === 'object' ? speculation : {})} />\n )}\n\n {/* Client-side providers island — receives the minted token (or raw-key\n fallback), never the raw key when minting succeeds. */}\n <SiteKitClientProviders\n apiKey={clientCredential}\n apiUrl={resolvedApiUrl}\n mapsBrowserKey={\n process.env.NEXT_PUBLIC_GOOGLE_MAPS_API_KEY ||\n process.env.GOOGLE_MAPS_BROWSER_KEY ||\n undefined\n }\n projectId={projectId}\n analytics={analytics}\n engage={engage}\n signal={signal}\n sitemapSync={sitemapSync}\n fleet={fleet}\n defer={defer}\n debug={debug}\n >\n {children}\n {showLlmsTxtFooterLink ? (\n <footer className=\"sr-only\" aria-hidden=\"true\">\n <a href=\"/llms.txt\">llms.txt</a>\n </footer>\n ) : null}\n </SiteKitClientProviders>\n\n {/* Server-rendered body-end scripts */}\n {managedScripts && <ManagedScripts position=\"body-end\" />}\n </>\n )\n}\n"]}
1
+ {"version":3,"sources":["../../src/layout/SpeculationRules.tsx","../../src/layout/SiteKitLayout.tsx"],"names":["jsx","resolveApiOrigin","resolveClientCredential","jsxs","Fragment","ManagedFavicon","ManagedScripts","SiteKitClientProviders"],"mappings":"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","file":"index.js","sourcesContent":["/**\n * SpeculationRules — declarative near-instant navigation for static sites.\n *\n * Emits a `<script type=\"speculationrules\">` telling supporting browsers\n * (Chromium 121+) to prerender same-origin links as the user shows intent\n * (moderate eagerness = hover/mousedown). Non-supporting browsers ignore the\n * tag entirely; there is no JS, no polyfill, no runtime cost — pure\n * progressive enhancement, ideal for the force-static fleet.\n *\n * Server component: renders during SSR, ships as static HTML.\n *\n * Excluded by default: URLs with a query string (often personalized) and\n * obvious non-page paths. Keep exclusions tight — prerendering a page that\n * sets cookies or fires analytics on load double-fires them only if the\n * analytics module ignores prerendering; site-kit analytics defers to\n * post-activation, and Chrome delays most side effects until activation.\n */\n\ninterface SpeculationRulesProps {\n /**\n * 'prerender' (default) renders the next page fully in the background;\n * 'prefetch' only fetches the document. Prefetch is the conservative\n * fallback if a site sees issues with prerender.\n */\n mode?: 'prerender' | 'prefetch'\n /** Additional URL patterns to exclude (speculation rules URL pattern syntax). */\n exclude?: string[]\n}\n\nexport function SpeculationRules({ mode = 'prerender', exclude = [] }: SpeculationRulesProps) {\n const rules = {\n [mode]: [\n {\n source: 'document' as const,\n where: {\n and: [\n { href_matches: '/*' },\n { not: { href_matches: '/*\\\\?*' } },\n { not: { href_matches: '/api/*' } },\n ...exclude.map(pattern => ({ not: { href_matches: pattern } })),\n ],\n },\n eagerness: 'moderate' as const,\n },\n ],\n }\n\n return (\n <script\n type=\"speculationrules\"\n dangerouslySetInnerHTML={{ __html: JSON.stringify(rules) }}\n />\n )\n}\n","/**\n * @sonordev/site-kit/layout — SiteKitLayout\n *\n * The master layout component. A single RSC that auto-composes every\n * site-kit feature your layout needs:\n *\n * Server-side (RSC):\n * - ManagedFavicon (link tags from Portal logo)\n * - ManagedScripts position=\"head\" (tracking pixels, analytics tags)\n * - ManagedScripts position=\"body-end\"\n *\n * Client-side (island):\n * - AnalyticsProvider (page views, scroll depth, heatmap, web vitals)\n * - EngageWidget (popups, nudges, chat)\n * - SignalBridge (A/B experiments, behavior tracking)\n * - SitemapSync (keeps Portal seo_pages in sync)\n *\n * @example\n * ```tsx\n * // app/layout.tsx\n * import { SiteKitLayout } from '@sonordev/site-kit/layout'\n *\n * export default function RootLayout({ children }) {\n * return (\n * <html lang=\"en\">\n * <body>\n * <SiteKitLayout>\n * <Header />\n * <main>{children}</main>\n * <Footer />\n * </SiteKitLayout>\n * </body>\n * </html>\n * )\n * }\n * ```\n *\n * @example Opt out of specific features:\n * ```tsx\n * <SiteKitLayout engage={false} signal={false}>\n * {children}\n * </SiteKitLayout>\n * ```\n */\n\nimport * as React from 'react'\nimport { ManagedFavicon } from '../images/ManagedFavicon'\nimport { ManagedScripts } from '../seo/ManagedScripts'\nimport { resolveApiOrigin } from '../server/server-fetch'\nimport { resolveClientCredential } from '../server/mint-site-token'\nimport { SiteKitClientProviders } from './SiteKitClientProviders'\nimport { SpeculationRules } from './SpeculationRules'\nimport type { AnalyticsConfig, EngageConfig, SignalConfig } from './types'\n\nexport interface SiteKitLayoutProps {\n children: React.ReactNode\n\n /** Portal API key. Defaults to SONOR_API_KEY env var. */\n apiKey?: string\n /** Portal API URL. Defaults to env or https://api.sonor.io */\n apiUrl?: string\n /** Project ID (for Engage chat room routing). Auto-resolved if not provided. */\n projectId?: string\n\n /** Analytics tracking. true (default) | false | config object */\n analytics?: boolean | AnalyticsConfig\n /** Engage widgets (popups, chat). true (default) | false | config object */\n engage?: boolean | EngageConfig\n /** Signal AI (experiments, behavior). false (default) | true | config object */\n signal?: boolean | SignalConfig\n /**\n * Runtime SitemapSync from the visitor's browser. **Default: false.**\n *\n * Sitemap registration is a build-time and server-side job. Build-time\n * `createSitemap` is canonical, and sonor-api's nightly reconciler fetches\n * each host's /sitemap.xml itself, so nothing here needs a visitor.\n *\n * This defaulted to true, and because its throttle lives in sessionStorage\n * and its content hash in localStorage, every first-time visitor, incognito\n * tab and crawler missed both guards and re-POSTed the entire sitemap:\n * upforge.io took ~140 full syncs in a day, queencityriverboats.com ~76.\n * That coupled sitemap traffic to VISITOR COUNT rather than to content\n * changes — exactly backwards — and made every reader pay for platform\n * bookkeeping in bandwidth, XML parsing and an API round-trip.\n *\n * Set true only to re-enable the legacy browser fallback for a site whose\n * build-time registration cannot be made to work.\n */\n sitemapSync?: boolean\n /**\n * Fleet heartbeat — reports this site's kit version + active modules to Sonor\n * once per session so the platform can track version drift. Default: true.\n * Deferred like Analytics; never in the hydration path.\n */\n fleet?: boolean\n /**\n * Defer client modules (Analytics, Engage, SitemapSync) until window load +\n * idle or the first user interaction, keeping their JS and mount work out of\n * the critical hydration path. Default: true. Pass false to restore legacy\n * eager mounting. SignalBridge is never deferred.\n */\n defer?: boolean\n /** ManagedFavicon in <head>. Default: true */\n favicon?: boolean\n /** ManagedScripts (head + body-end). Default: true */\n managedScripts?: boolean\n\n /** Debug mode — logs to console. Default: false */\n debug?: boolean\n /**\n * When true, append a screen-reader-only link to `/llms.txt` after main content.\n * Default false — prefer `buildAiDiscoveryHeaders()` for discovery.\n */\n showLlmsTxtFooterLink?: boolean\n /**\n * Emit a Speculation Rules script prerendering same-origin links on intent\n * (Chromium 121+; other browsers ignore it). Zero JS, static-safe. Default\n * false — opt in per site, or pass { mode: 'prefetch' } for the\n * conservative variant.\n */\n speculation?: boolean | { mode?: 'prerender' | 'prefetch'; exclude?: string[] }\n}\n\nexport async function SiteKitLayout({\n children,\n apiKey,\n apiUrl,\n projectId,\n analytics = true,\n engage = true,\n signal = false,\n sitemapSync = false,\n fleet = true,\n defer = true,\n favicon = true,\n managedScripts = true,\n debug = false,\n showLlmsTxtFooterLink = false,\n speculation = false,\n}: SiteKitLayoutProps) {\n // Resolve API config from env (server-side, safe)\n const resolvedApiKey =\n apiKey ??\n process.env.SONOR_API_KEY ??\n ''\n const resolvedApiUrl =\n apiUrl ??\n process.env.SONOR_API_URL ??\n 'https://api.sonor.io'\n\n if (!resolvedApiKey && debug) {\n console.warn(\n '[SiteKitLayout] No API key found. Set SONOR_API_KEY.',\n )\n }\n\n const apiOrigin = resolveApiOrigin(resolvedApiUrl)\n\n // Mint a short-lived client token so the raw key never reaches the browser.\n // Falls back to the raw key if minting is unavailable (older API / transient\n // outage) — the build never breaks. The client refreshes the token as needed.\n const clientCredential = await resolveClientCredential(resolvedApiKey, resolvedApiUrl)\n\n return (\n <>\n <link rel=\"preconnect\" href={apiOrigin} crossOrigin=\"anonymous\" />\n <link rel=\"dns-prefetch\" href={apiOrigin} />\n {/* Server-rendered head components */}\n {favicon && <ManagedFavicon apiKey={resolvedApiKey} apiUrl={resolvedApiUrl} />}\n {managedScripts && <ManagedScripts position=\"head\" />}\n {speculation && (\n <SpeculationRules {...(typeof speculation === 'object' ? speculation : {})} />\n )}\n\n {/* Client-side providers island — receives the minted token (or raw-key\n fallback), never the raw key when minting succeeds. */}\n <SiteKitClientProviders\n apiKey={clientCredential}\n apiUrl={resolvedApiUrl}\n mapsBrowserKey={\n process.env.NEXT_PUBLIC_GOOGLE_MAPS_API_KEY ||\n process.env.GOOGLE_MAPS_BROWSER_KEY ||\n undefined\n }\n projectId={projectId}\n analytics={analytics}\n engage={engage}\n signal={signal}\n sitemapSync={sitemapSync}\n fleet={fleet}\n defer={defer}\n debug={debug}\n >\n {children}\n {showLlmsTxtFooterLink ? (\n <footer className=\"sr-only\" aria-hidden=\"true\">\n <a href=\"/llms.txt\">llms.txt</a>\n </footer>\n ) : null}\n </SiteKitClientProviders>\n\n {/* Server-rendered body-end scripts */}\n {managedScripts && <ManagedScripts position=\"body-end\" />}\n </>\n )\n}\n"]}
@@ -1,19 +1,19 @@
1
- import { SiteKitClientProviders } from '../chunk-TGGSXT3F.mjs';
2
- import '../chunk-UKFBG6FV.mjs';
3
- import '../chunk-WFCRXUNA.mjs';
1
+ import { SiteKitClientProviders } from '../chunk-PTZB4ES3.mjs';
2
+ import '../chunk-I7ORAWYT.mjs';
3
+ import '../chunk-T3HGONNE.mjs';
4
4
  import '../chunk-ZPLN537Q.mjs';
5
5
  import '../chunk-NI7OY4FW.mjs';
6
6
  import '../chunk-ZVBLXXNJ.mjs';
7
7
  import { ManagedFavicon } from '../chunk-CU6OGBKK.mjs';
8
- import '../chunk-XZCZCND2.mjs';
9
- import { resolveClientCredential } from '../chunk-MZZQHGXY.mjs';
8
+ import '../chunk-DZUOLOYS.mjs';
9
+ import { resolveClientCredential } from '../chunk-KL4MV6HK.mjs';
10
10
  import { ManagedScripts } from '../chunk-6PJTLBRR.mjs';
11
11
  import { resolveApiOrigin } from '../chunk-UDBUK5ZJ.mjs';
12
12
  import '../chunk-ZZQAGCSI.mjs';
13
13
  import '../chunk-6EDVCUAG.mjs';
14
- import '../chunk-R6LQRHPQ.mjs';
15
- import '../chunk-WCIQKO7W.mjs';
16
- import '../chunk-LS64Y25E.mjs';
14
+ import '../chunk-RRR6Y6Y5.mjs';
15
+ import '../chunk-T6T5IQMN.mjs';
16
+ import '../chunk-XCFCG46K.mjs';
17
17
  import '../chunk-BEXTDHO4.mjs';
18
18
  import { jsx, jsxs, Fragment } from 'react/jsx-runtime';
19
19
 
@@ -50,7 +50,7 @@ async function SiteKitLayout({
50
50
  analytics = true,
51
51
  engage = true,
52
52
  signal = false,
53
- sitemapSync = true,
53
+ sitemapSync = false,
54
54
  fleet = true,
55
55
  defer = true,
56
56
  favicon = true,
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/layout/SpeculationRules.tsx","../../src/layout/SiteKitLayout.tsx"],"names":["jsx"],"mappings":"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","file":"index.mjs","sourcesContent":["/**\n * SpeculationRules — declarative near-instant navigation for static sites.\n *\n * Emits a `<script type=\"speculationrules\">` telling supporting browsers\n * (Chromium 121+) to prerender same-origin links as the user shows intent\n * (moderate eagerness = hover/mousedown). Non-supporting browsers ignore the\n * tag entirely; there is no JS, no polyfill, no runtime cost — pure\n * progressive enhancement, ideal for the force-static fleet.\n *\n * Server component: renders during SSR, ships as static HTML.\n *\n * Excluded by default: URLs with a query string (often personalized) and\n * obvious non-page paths. Keep exclusions tight — prerendering a page that\n * sets cookies or fires analytics on load double-fires them only if the\n * analytics module ignores prerendering; site-kit analytics defers to\n * post-activation, and Chrome delays most side effects until activation.\n */\n\ninterface SpeculationRulesProps {\n /**\n * 'prerender' (default) renders the next page fully in the background;\n * 'prefetch' only fetches the document. Prefetch is the conservative\n * fallback if a site sees issues with prerender.\n */\n mode?: 'prerender' | 'prefetch'\n /** Additional URL patterns to exclude (speculation rules URL pattern syntax). */\n exclude?: string[]\n}\n\nexport function SpeculationRules({ mode = 'prerender', exclude = [] }: SpeculationRulesProps) {\n const rules = {\n [mode]: [\n {\n source: 'document' as const,\n where: {\n and: [\n { href_matches: '/*' },\n { not: { href_matches: '/*\\\\?*' } },\n { not: { href_matches: '/api/*' } },\n ...exclude.map(pattern => ({ not: { href_matches: pattern } })),\n ],\n },\n eagerness: 'moderate' as const,\n },\n ],\n }\n\n return (\n <script\n type=\"speculationrules\"\n dangerouslySetInnerHTML={{ __html: JSON.stringify(rules) }}\n />\n )\n}\n","/**\n * @sonordev/site-kit/layout — SiteKitLayout\n *\n * The master layout component. A single RSC that auto-composes every\n * site-kit feature your layout needs:\n *\n * Server-side (RSC):\n * - ManagedFavicon (link tags from Portal logo)\n * - ManagedScripts position=\"head\" (tracking pixels, analytics tags)\n * - ManagedScripts position=\"body-end\"\n *\n * Client-side (island):\n * - AnalyticsProvider (page views, scroll depth, heatmap, web vitals)\n * - EngageWidget (popups, nudges, chat)\n * - SignalBridge (A/B experiments, behavior tracking)\n * - SitemapSync (keeps Portal seo_pages in sync)\n *\n * @example\n * ```tsx\n * // app/layout.tsx\n * import { SiteKitLayout } from '@sonordev/site-kit/layout'\n *\n * export default function RootLayout({ children }) {\n * return (\n * <html lang=\"en\">\n * <body>\n * <SiteKitLayout>\n * <Header />\n * <main>{children}</main>\n * <Footer />\n * </SiteKitLayout>\n * </body>\n * </html>\n * )\n * }\n * ```\n *\n * @example Opt out of specific features:\n * ```tsx\n * <SiteKitLayout engage={false} signal={false}>\n * {children}\n * </SiteKitLayout>\n * ```\n */\n\nimport * as React from 'react'\nimport { ManagedFavicon } from '../images/ManagedFavicon'\nimport { ManagedScripts } from '../seo/ManagedScripts'\nimport { resolveApiOrigin } from '../server/server-fetch'\nimport { resolveClientCredential } from '../server/mint-site-token'\nimport { SiteKitClientProviders } from './SiteKitClientProviders'\nimport { SpeculationRules } from './SpeculationRules'\nimport type { AnalyticsConfig, EngageConfig, SignalConfig } from './types'\n\nexport interface SiteKitLayoutProps {\n children: React.ReactNode\n\n /** Portal API key. Defaults to SONOR_API_KEY env var. */\n apiKey?: string\n /** Portal API URL. Defaults to env or https://api.sonor.io */\n apiUrl?: string\n /** Project ID (for Engage chat room routing). Auto-resolved if not provided. */\n projectId?: string\n\n /** Analytics tracking. true (default) | false | config object */\n analytics?: boolean | AnalyticsConfig\n /** Engage widgets (popups, chat). true (default) | false | config object */\n engage?: boolean | EngageConfig\n /** Signal AI (experiments, behavior). false (default) | true | config object */\n signal?: boolean | SignalConfig\n /** SitemapSync client component. Default: true */\n sitemapSync?: boolean\n /**\n * Fleet heartbeat — reports this site's kit version + active modules to Sonor\n * once per session so the platform can track version drift. Default: true.\n * Deferred like Analytics; never in the hydration path.\n */\n fleet?: boolean\n /**\n * Defer client modules (Analytics, Engage, SitemapSync) until window load +\n * idle or the first user interaction, keeping their JS and mount work out of\n * the critical hydration path. Default: true. Pass false to restore legacy\n * eager mounting. SignalBridge is never deferred.\n */\n defer?: boolean\n /** ManagedFavicon in <head>. Default: true */\n favicon?: boolean\n /** ManagedScripts (head + body-end). Default: true */\n managedScripts?: boolean\n\n /** Debug mode — logs to console. Default: false */\n debug?: boolean\n /**\n * When true, append a screen-reader-only link to `/llms.txt` after main content.\n * Default false — prefer `buildAiDiscoveryHeaders()` for discovery.\n */\n showLlmsTxtFooterLink?: boolean\n /**\n * Emit a Speculation Rules script prerendering same-origin links on intent\n * (Chromium 121+; other browsers ignore it). Zero JS, static-safe. Default\n * false — opt in per site, or pass { mode: 'prefetch' } for the\n * conservative variant.\n */\n speculation?: boolean | { mode?: 'prerender' | 'prefetch'; exclude?: string[] }\n}\n\nexport async function SiteKitLayout({\n children,\n apiKey,\n apiUrl,\n projectId,\n analytics = true,\n engage = true,\n signal = false,\n sitemapSync = true,\n fleet = true,\n defer = true,\n favicon = true,\n managedScripts = true,\n debug = false,\n showLlmsTxtFooterLink = false,\n speculation = false,\n}: SiteKitLayoutProps) {\n // Resolve API config from env (server-side, safe)\n const resolvedApiKey =\n apiKey ??\n process.env.SONOR_API_KEY ??\n ''\n const resolvedApiUrl =\n apiUrl ??\n process.env.SONOR_API_URL ??\n 'https://api.sonor.io'\n\n if (!resolvedApiKey && debug) {\n console.warn(\n '[SiteKitLayout] No API key found. Set SONOR_API_KEY.',\n )\n }\n\n const apiOrigin = resolveApiOrigin(resolvedApiUrl)\n\n // Mint a short-lived client token so the raw key never reaches the browser.\n // Falls back to the raw key if minting is unavailable (older API / transient\n // outage) — the build never breaks. The client refreshes the token as needed.\n const clientCredential = await resolveClientCredential(resolvedApiKey, resolvedApiUrl)\n\n return (\n <>\n <link rel=\"preconnect\" href={apiOrigin} crossOrigin=\"anonymous\" />\n <link rel=\"dns-prefetch\" href={apiOrigin} />\n {/* Server-rendered head components */}\n {favicon && <ManagedFavicon apiKey={resolvedApiKey} apiUrl={resolvedApiUrl} />}\n {managedScripts && <ManagedScripts position=\"head\" />}\n {speculation && (\n <SpeculationRules {...(typeof speculation === 'object' ? speculation : {})} />\n )}\n\n {/* Client-side providers island — receives the minted token (or raw-key\n fallback), never the raw key when minting succeeds. */}\n <SiteKitClientProviders\n apiKey={clientCredential}\n apiUrl={resolvedApiUrl}\n mapsBrowserKey={\n process.env.NEXT_PUBLIC_GOOGLE_MAPS_API_KEY ||\n process.env.GOOGLE_MAPS_BROWSER_KEY ||\n undefined\n }\n projectId={projectId}\n analytics={analytics}\n engage={engage}\n signal={signal}\n sitemapSync={sitemapSync}\n fleet={fleet}\n defer={defer}\n debug={debug}\n >\n {children}\n {showLlmsTxtFooterLink ? (\n <footer className=\"sr-only\" aria-hidden=\"true\">\n <a href=\"/llms.txt\">llms.txt</a>\n </footer>\n ) : null}\n </SiteKitClientProviders>\n\n {/* Server-rendered body-end scripts */}\n {managedScripts && <ManagedScripts position=\"body-end\" />}\n </>\n )\n}\n"]}
1
+ {"version":3,"sources":["../../src/layout/SpeculationRules.tsx","../../src/layout/SiteKitLayout.tsx"],"names":["jsx"],"mappings":"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","file":"index.mjs","sourcesContent":["/**\n * SpeculationRules — declarative near-instant navigation for static sites.\n *\n * Emits a `<script type=\"speculationrules\">` telling supporting browsers\n * (Chromium 121+) to prerender same-origin links as the user shows intent\n * (moderate eagerness = hover/mousedown). Non-supporting browsers ignore the\n * tag entirely; there is no JS, no polyfill, no runtime cost — pure\n * progressive enhancement, ideal for the force-static fleet.\n *\n * Server component: renders during SSR, ships as static HTML.\n *\n * Excluded by default: URLs with a query string (often personalized) and\n * obvious non-page paths. Keep exclusions tight — prerendering a page that\n * sets cookies or fires analytics on load double-fires them only if the\n * analytics module ignores prerendering; site-kit analytics defers to\n * post-activation, and Chrome delays most side effects until activation.\n */\n\ninterface SpeculationRulesProps {\n /**\n * 'prerender' (default) renders the next page fully in the background;\n * 'prefetch' only fetches the document. Prefetch is the conservative\n * fallback if a site sees issues with prerender.\n */\n mode?: 'prerender' | 'prefetch'\n /** Additional URL patterns to exclude (speculation rules URL pattern syntax). */\n exclude?: string[]\n}\n\nexport function SpeculationRules({ mode = 'prerender', exclude = [] }: SpeculationRulesProps) {\n const rules = {\n [mode]: [\n {\n source: 'document' as const,\n where: {\n and: [\n { href_matches: '/*' },\n { not: { href_matches: '/*\\\\?*' } },\n { not: { href_matches: '/api/*' } },\n ...exclude.map(pattern => ({ not: { href_matches: pattern } })),\n ],\n },\n eagerness: 'moderate' as const,\n },\n ],\n }\n\n return (\n <script\n type=\"speculationrules\"\n dangerouslySetInnerHTML={{ __html: JSON.stringify(rules) }}\n />\n )\n}\n","/**\n * @sonordev/site-kit/layout — SiteKitLayout\n *\n * The master layout component. A single RSC that auto-composes every\n * site-kit feature your layout needs:\n *\n * Server-side (RSC):\n * - ManagedFavicon (link tags from Portal logo)\n * - ManagedScripts position=\"head\" (tracking pixels, analytics tags)\n * - ManagedScripts position=\"body-end\"\n *\n * Client-side (island):\n * - AnalyticsProvider (page views, scroll depth, heatmap, web vitals)\n * - EngageWidget (popups, nudges, chat)\n * - SignalBridge (A/B experiments, behavior tracking)\n * - SitemapSync (keeps Portal seo_pages in sync)\n *\n * @example\n * ```tsx\n * // app/layout.tsx\n * import { SiteKitLayout } from '@sonordev/site-kit/layout'\n *\n * export default function RootLayout({ children }) {\n * return (\n * <html lang=\"en\">\n * <body>\n * <SiteKitLayout>\n * <Header />\n * <main>{children}</main>\n * <Footer />\n * </SiteKitLayout>\n * </body>\n * </html>\n * )\n * }\n * ```\n *\n * @example Opt out of specific features:\n * ```tsx\n * <SiteKitLayout engage={false} signal={false}>\n * {children}\n * </SiteKitLayout>\n * ```\n */\n\nimport * as React from 'react'\nimport { ManagedFavicon } from '../images/ManagedFavicon'\nimport { ManagedScripts } from '../seo/ManagedScripts'\nimport { resolveApiOrigin } from '../server/server-fetch'\nimport { resolveClientCredential } from '../server/mint-site-token'\nimport { SiteKitClientProviders } from './SiteKitClientProviders'\nimport { SpeculationRules } from './SpeculationRules'\nimport type { AnalyticsConfig, EngageConfig, SignalConfig } from './types'\n\nexport interface SiteKitLayoutProps {\n children: React.ReactNode\n\n /** Portal API key. Defaults to SONOR_API_KEY env var. */\n apiKey?: string\n /** Portal API URL. Defaults to env or https://api.sonor.io */\n apiUrl?: string\n /** Project ID (for Engage chat room routing). Auto-resolved if not provided. */\n projectId?: string\n\n /** Analytics tracking. true (default) | false | config object */\n analytics?: boolean | AnalyticsConfig\n /** Engage widgets (popups, chat). true (default) | false | config object */\n engage?: boolean | EngageConfig\n /** Signal AI (experiments, behavior). false (default) | true | config object */\n signal?: boolean | SignalConfig\n /**\n * Runtime SitemapSync from the visitor's browser. **Default: false.**\n *\n * Sitemap registration is a build-time and server-side job. Build-time\n * `createSitemap` is canonical, and sonor-api's nightly reconciler fetches\n * each host's /sitemap.xml itself, so nothing here needs a visitor.\n *\n * This defaulted to true, and because its throttle lives in sessionStorage\n * and its content hash in localStorage, every first-time visitor, incognito\n * tab and crawler missed both guards and re-POSTed the entire sitemap:\n * upforge.io took ~140 full syncs in a day, queencityriverboats.com ~76.\n * That coupled sitemap traffic to VISITOR COUNT rather than to content\n * changes — exactly backwards — and made every reader pay for platform\n * bookkeeping in bandwidth, XML parsing and an API round-trip.\n *\n * Set true only to re-enable the legacy browser fallback for a site whose\n * build-time registration cannot be made to work.\n */\n sitemapSync?: boolean\n /**\n * Fleet heartbeat — reports this site's kit version + active modules to Sonor\n * once per session so the platform can track version drift. Default: true.\n * Deferred like Analytics; never in the hydration path.\n */\n fleet?: boolean\n /**\n * Defer client modules (Analytics, Engage, SitemapSync) until window load +\n * idle or the first user interaction, keeping their JS and mount work out of\n * the critical hydration path. Default: true. Pass false to restore legacy\n * eager mounting. SignalBridge is never deferred.\n */\n defer?: boolean\n /** ManagedFavicon in <head>. Default: true */\n favicon?: boolean\n /** ManagedScripts (head + body-end). Default: true */\n managedScripts?: boolean\n\n /** Debug mode — logs to console. Default: false */\n debug?: boolean\n /**\n * When true, append a screen-reader-only link to `/llms.txt` after main content.\n * Default false — prefer `buildAiDiscoveryHeaders()` for discovery.\n */\n showLlmsTxtFooterLink?: boolean\n /**\n * Emit a Speculation Rules script prerendering same-origin links on intent\n * (Chromium 121+; other browsers ignore it). Zero JS, static-safe. Default\n * false — opt in per site, or pass { mode: 'prefetch' } for the\n * conservative variant.\n */\n speculation?: boolean | { mode?: 'prerender' | 'prefetch'; exclude?: string[] }\n}\n\nexport async function SiteKitLayout({\n children,\n apiKey,\n apiUrl,\n projectId,\n analytics = true,\n engage = true,\n signal = false,\n sitemapSync = false,\n fleet = true,\n defer = true,\n favicon = true,\n managedScripts = true,\n debug = false,\n showLlmsTxtFooterLink = false,\n speculation = false,\n}: SiteKitLayoutProps) {\n // Resolve API config from env (server-side, safe)\n const resolvedApiKey =\n apiKey ??\n process.env.SONOR_API_KEY ??\n ''\n const resolvedApiUrl =\n apiUrl ??\n process.env.SONOR_API_URL ??\n 'https://api.sonor.io'\n\n if (!resolvedApiKey && debug) {\n console.warn(\n '[SiteKitLayout] No API key found. Set SONOR_API_KEY.',\n )\n }\n\n const apiOrigin = resolveApiOrigin(resolvedApiUrl)\n\n // Mint a short-lived client token so the raw key never reaches the browser.\n // Falls back to the raw key if minting is unavailable (older API / transient\n // outage) — the build never breaks. The client refreshes the token as needed.\n const clientCredential = await resolveClientCredential(resolvedApiKey, resolvedApiUrl)\n\n return (\n <>\n <link rel=\"preconnect\" href={apiOrigin} crossOrigin=\"anonymous\" />\n <link rel=\"dns-prefetch\" href={apiOrigin} />\n {/* Server-rendered head components */}\n {favicon && <ManagedFavicon apiKey={resolvedApiKey} apiUrl={resolvedApiUrl} />}\n {managedScripts && <ManagedScripts position=\"head\" />}\n {speculation && (\n <SpeculationRules {...(typeof speculation === 'object' ? speculation : {})} />\n )}\n\n {/* Client-side providers island — receives the minted token (or raw-key\n fallback), never the raw key when minting succeeds. */}\n <SiteKitClientProviders\n apiKey={clientCredential}\n apiUrl={resolvedApiUrl}\n mapsBrowserKey={\n process.env.NEXT_PUBLIC_GOOGLE_MAPS_API_KEY ||\n process.env.GOOGLE_MAPS_BROWSER_KEY ||\n undefined\n }\n projectId={projectId}\n analytics={analytics}\n engage={engage}\n signal={signal}\n sitemapSync={sitemapSync}\n fleet={fleet}\n defer={defer}\n debug={debug}\n >\n {children}\n {showLlmsTxtFooterLink ? (\n <footer className=\"sr-only\" aria-hidden=\"true\">\n <a href=\"/llms.txt\">llms.txt</a>\n </footer>\n ) : null}\n </SiteKitClientProviders>\n\n {/* Server-rendered body-end scripts */}\n {managedScripts && <ManagedScripts position=\"body-end\" />}\n </>\n )\n}\n"]}
@@ -1,9 +1,9 @@
1
1
  'use client';
2
2
  'use strict';
3
3
 
4
- var chunkFFQAKIV5_js = require('../chunk-FFQAKIV5.js');
5
- require('../chunk-KFDFXRBE.js');
6
- require('../chunk-CBN73TLK.js');
4
+ var chunkMF6XLEX5_js = require('../chunk-MF6XLEX5.js');
5
+ require('../chunk-XA7RBHKT.js');
6
+ require('../chunk-S5L73KZQ.js');
7
7
  require('../chunk-SNAQBZPT.js');
8
8
  var react = require('react');
9
9
  var reactGoogleMaps = require('@vis.gl/react-google-maps');
@@ -141,7 +141,7 @@ async function fetchMapsConfig() {
141
141
  const { apiUrl, apiKey } = getApiConfig();
142
142
  if (apiKey) {
143
143
  try {
144
- const res = await chunkFFQAKIV5_js.sonorFetch(
144
+ const res = await chunkMF6XLEX5_js.sonorFetch(
145
145
  `${apiUrl}/api/public/maps/config`,
146
146
  { headers: { "Content-Type": "application/json" } },
147
147
  { apiKey }
@@ -181,7 +181,7 @@ async function fetchNearbyPlaces(params) {
181
181
  });
182
182
  if (params.radius) searchParams.set("radius", String(params.radius));
183
183
  if (params.limit) searchParams.set("limit", String(params.limit));
184
- const res = await chunkFFQAKIV5_js.sonorFetch(
184
+ const res = await chunkMF6XLEX5_js.sonorFetch(
185
185
  `${apiUrl}/api/public/maps/nearby-places?${searchParams}`,
186
186
  { headers: { "Content-Type": "application/json" } },
187
187
  { apiKey }
@@ -1,7 +1,7 @@
1
1
  'use client';
2
- import { sonorFetch } from '../chunk-R6LQRHPQ.mjs';
3
- import '../chunk-WCIQKO7W.mjs';
4
- import '../chunk-LS64Y25E.mjs';
2
+ import { sonorFetch } from '../chunk-RRR6Y6Y5.mjs';
3
+ import '../chunk-T6T5IQMN.mjs';
4
+ import '../chunk-XCFCG46K.mjs';
5
5
  import '../chunk-BEXTDHO4.mjs';
6
6
  import { useState, useCallback, useEffect } from 'react';
7
7
  import { APIProvider, Map as Map$1, AdvancedMarker, Pin, InfoWindow } from '@vis.gl/react-google-maps';
@@ -76,6 +76,16 @@ export interface OgCardConfig {
76
76
  /** Content photo for the 'split' layout (also rendered in 'plate-left' when set, replacing the plate). */
77
77
  photo?: OgPhoto;
78
78
  content: OgContent;
79
+ /**
80
+ * Per-page overrides, keyed by route path (`/services/garage`) or its slug
81
+ * (`services-garage`). Every static route already gets its own card built
82
+ * from its managed title and description; this is for the handful worth
83
+ * writing by hand — a campaign landing page, the flagship service.
84
+ *
85
+ * Each entry is layered over the site card, so it only states what differs.
86
+ * Build-time only: never rendered as part of a card.
87
+ */
88
+ cards?: Record<string, Partial<Omit<OgCardConfig, 'cards'>>>;
79
89
  /**
80
90
  * MIDDLE escape hatch: keep the loader/renderer/verifier pipeline but
81
91
  * produce your own document. Receives the config and the same helpers the
@@ -98,4 +108,30 @@ export interface OgTemplateHelpers {
98
108
  export declare function defineOgCard(config: OgCardConfig): OgCardConfig;
99
109
  export declare const OG_WIDTH = 1200;
100
110
  export declare const OG_HEIGHT = 630;
111
+ /**
112
+ * Title type scale. The card opens at TITLE_MAX and the in-page fitter steps
113
+ * down until the copy column fits, stopping at TITLE_MIN.
114
+ *
115
+ * The floor is a legibility floor, not a layout one: below ~56px the headline
116
+ * stops reading at the ~300px thumbnail width platforms actually show. A card
117
+ * that would need to go under it is a card whose copy is too long, so the
118
+ * renderer reports that rather than shrinking into mush.
119
+ */
120
+ export declare const TITLE_MAX_PX = 104;
121
+ export declare const TITLE_MIN_PX = 56;
122
+ /**
123
+ * The attribute the in-page fitter writes its findings to, read back by
124
+ * `sonor-setup og` via Chrome's --dump-dom. Shared so the template and the CLI
125
+ * cannot drift on the name.
126
+ */
127
+ export declare const OG_REPORT_ATTR = "data-og-report";
128
+ /** What the in-page fitter reports back about a rendered card. */
129
+ export interface OgRenderReport {
130
+ /** Did everything land inside the frame, at or above the legibility floor? */
131
+ fits: boolean;
132
+ /** Final title size after fitting. Below TITLE_MAX means the copy ran long. */
133
+ titlePx: number;
134
+ /** Human-readable problems, each naming the element and the overflow. */
135
+ issues: string[];
136
+ }
101
137
  //# sourceMappingURL=config.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../../src/og/config.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AAEH,MAAM,WAAW,OAAO;IACtB,yCAAyC;IACzC,EAAE,EAAE,MAAM,CAAA;IACV,0BAA0B;IAC1B,IAAI,EAAE,MAAM,CAAA;IACZ,4BAA4B;IAC5B,MAAM,EAAE,MAAM,CAAA;IACd,2CAA2C;IAC3C,OAAO,EAAE,MAAM,CAAA;IACf,wEAAwE;IACxE,KAAK,CAAC,EAAE,MAAM,CAAA;CACf;AAED,MAAM,WAAW,MAAM;IACrB,yDAAyD;IACzD,MAAM,EAAE,MAAM,CAAA;IACd,OAAO,CAAC,EAAE,MAAM,EAAE,CAAA;CACnB;AAED,MAAM,WAAW,YAAY;IAC3B,mDAAmD;IACnD,KAAK,EAAE,MAAM,CAAA;IACb,6BAA6B;IAC7B,IAAI,CAAC,EAAE,MAAM,CAAA;IACb,gDAAgD;IAChD,KAAK,CAAC,EAAE,MAAM,CAAA;CACf;AAED,MAAM,WAAW,OAAO;IACtB,iEAAiE;IACjE,GAAG,EAAE,MAAM,CAAA;IACX,sCAAsC;IACtC,KAAK,CAAC,EAAE,MAAM,CAAA;IACd,wCAAwC;IACxC,MAAM,CAAC,EAAE,MAAM,CAAA;CAChB;AAED,MAAM,WAAW,SAAS;IACxB,2CAA2C;IAC3C,MAAM,CAAC,EAAE,MAAM,CAAA;IACf,gFAAgF;IAChF,KAAK,EAAE,MAAM,CAAA;IACb,2BAA2B;IAC3B,QAAQ,CAAC,EAAE,MAAM,CAAA;IACjB,4EAA4E;IAC5E,IAAI,CAAC,EAAE,MAAM,CAAA;IACb,mEAAmE;IACnE,GAAG,CAAC,EAAE,MAAM,EAAE,CAAA;CACf;AAED,MAAM,WAAW,YAAY;IAC3B,KAAK,EAAE,OAAO,CAAA;IACd,uEAAuE;IACvE,KAAK,CAAC,EAAE,MAAM,EAAE,CAAA;IAChB,gFAAgF;IAChF,IAAI,CAAC,EAAE,MAAM,CAAA;IACb,UAAU,CAAC,EAAE,YAAY,CAAA;IACzB;;;;;;OAMG;IACH,MAAM,CAAC,EAAE,YAAY,GAAG,UAAU,GAAG,QAAQ,GAAG,OAAO,CAAA;IACvD,0GAA0G;IAC1G,KAAK,CAAC,EAAE,OAAO,CAAA;IACf,OAAO,EAAE,SAAS,CAAA;IAClB;;;;;OAKG;IACH,QAAQ,CAAC,EAAE,CAAC,MAAM,EAAE,YAAY,EAAE,OAAO,EAAE,iBAAiB,KAAK,MAAM,CAAA;IACvE,mEAAmE;IACnE,IAAI,CAAC,EAAE,MAAM,CAAA;CACd;AAED,MAAM,WAAW,iBAAiB;IAChC,6BAA6B;IAC7B,GAAG,EAAE,CAAC,CAAC,EAAE,MAAM,KAAK,MAAM,CAAA;IAC1B,oDAAoD;IACpD,QAAQ,EAAE,MAAM,CAAA;IAChB,KAAK,EAAE,MAAM,CAAA;IACb,MAAM,EAAE,MAAM,CAAA;CACf;AAED,+EAA+E;AAC/E,wBAAgB,YAAY,CAAC,MAAM,EAAE,YAAY,GAAG,YAAY,CAE/D;AAED,eAAO,MAAM,QAAQ,OAAO,CAAA;AAC5B,eAAO,MAAM,SAAS,MAAM,CAAA"}
1
+ {"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../../src/og/config.ts"],"names":[],"mappings":"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"}
package/dist/og/index.js CHANGED
@@ -1,25 +1,25 @@
1
1
  'use strict';
2
2
 
3
- var chunk6TAXXKMX_js = require('../chunk-6TAXXKMX.js');
3
+ var chunkZAVNGZJZ_js = require('../chunk-ZAVNGZJZ.js');
4
4
  require('../chunk-SNAQBZPT.js');
5
5
 
6
6
 
7
7
 
8
8
  Object.defineProperty(exports, "OG_HEIGHT", {
9
9
  enumerable: true,
10
- get: function () { return chunk6TAXXKMX_js.OG_HEIGHT; }
10
+ get: function () { return chunkZAVNGZJZ_js.OG_HEIGHT; }
11
11
  });
12
12
  Object.defineProperty(exports, "OG_WIDTH", {
13
13
  enumerable: true,
14
- get: function () { return chunk6TAXXKMX_js.OG_WIDTH; }
14
+ get: function () { return chunkZAVNGZJZ_js.OG_WIDTH; }
15
15
  });
16
16
  Object.defineProperty(exports, "buildOgHtml", {
17
17
  enumerable: true,
18
- get: function () { return chunk6TAXXKMX_js.buildOgHtml; }
18
+ get: function () { return chunkZAVNGZJZ_js.buildOgHtml; }
19
19
  });
20
20
  Object.defineProperty(exports, "defineOgCard", {
21
21
  enumerable: true,
22
- get: function () { return chunk6TAXXKMX_js.defineOgCard; }
22
+ get: function () { return chunkZAVNGZJZ_js.defineOgCard; }
23
23
  });
24
24
  //# sourceMappingURL=index.js.map
25
25
  //# sourceMappingURL=index.js.map
package/dist/og/index.mjs CHANGED
@@ -1,4 +1,4 @@
1
- export { OG_HEIGHT, OG_WIDTH, buildOgHtml, defineOgCard } from '../chunk-DQO4UKFE.mjs';
1
+ export { OG_HEIGHT, OG_WIDTH, buildOgHtml, defineOgCard } from '../chunk-HTLWSCUQ.mjs';
2
2
  import '../chunk-BEXTDHO4.mjs';
3
3
  //# sourceMappingURL=index.mjs.map
4
4
  //# sourceMappingURL=index.mjs.map
@@ -0,0 +1,56 @@
1
+ /**
2
+ * @sonordev/site-kit/og — per-page card derivation.
3
+ *
4
+ * The site-wide card answers "what is this site". A per-page card answers
5
+ * "what is THIS page", which is what someone pasting a deep link is actually
6
+ * sharing. Every static route gets one by default.
7
+ *
8
+ * Copy comes from Sonor's managed metadata when a key is configured, because
9
+ * that is the same copy the page's <title> and description already use — the
10
+ * card and the SERP entry then say the same thing. Without a key (or when a
11
+ * lookup fails) the path itself is titled, which is worse copy but still a
12
+ * real, page-specific card rather than the site default.
13
+ *
14
+ * Everything else — theme, fonts, logo, photo, bar — is inherited from the
15
+ * site's own og.config.ts, so the whole set reads as one family.
16
+ */
17
+ import type { OgCardConfig } from './config';
18
+ /** A route to build a card for. */
19
+ export interface OgPageRoute {
20
+ /** URL path, e.g. `/services/garage`. */
21
+ path: string;
22
+ /** Managed title, if Sonor had one. */
23
+ title?: string;
24
+ /** Managed meta description, if Sonor had one. */
25
+ description?: string;
26
+ }
27
+ /** `/services/walk-in-closets` -> `Walk In Closets`. The no-managed-data path. */
28
+ export declare function titleFromPath(path: string): string;
29
+ /**
30
+ * The kicker for a page card: its parent section, so a deep link reads
31
+ * "SERVICES / Walk In Closets" rather than repeating the site name on every
32
+ * card. Falls back to the base card's kicker at the top level.
33
+ */
34
+ export declare function kickerFromPath(path: string, fallback?: string): string | undefined;
35
+ /**
36
+ * Keep a card subtitle to two readable lines, never a full meta description.
37
+ *
38
+ * A meta description is written for a SERP row and runs to ~155 characters; at
39
+ * card size that is four lines crowding the bottom bar. This trims to the first
40
+ * sentence when there is one, and otherwise cuts on a word boundary.
41
+ */
42
+ export declare function clampSubtitle(text: string | undefined, max?: number): string | undefined;
43
+ /**
44
+ * File-safe name for a route's card: `/services/garage` -> `services-garage`,
45
+ * `/` -> `home`. Deterministic, so the generator and anything reading the
46
+ * output agree without a manifest.
47
+ */
48
+ export declare function slugForPath(path: string): string;
49
+ /**
50
+ * Build a page's card config by layering its copy over the site's card.
51
+ *
52
+ * `cards` in og.config.ts wins over everything derived here, so a site can
53
+ * hand-write the two or three cards that matter and let the rest be generated.
54
+ */
55
+ export declare function pageCardConfig(base: OgCardConfig, route: OgPageRoute, brand?: string): OgCardConfig;
56
+ //# sourceMappingURL=pages.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"pages.d.ts","sourceRoot":"","sources":["../../src/og/pages.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;GAeG;AAEH,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,UAAU,CAAA;AAE5C,mCAAmC;AACnC,MAAM,WAAW,WAAW;IAC1B,yCAAyC;IACzC,IAAI,EAAE,MAAM,CAAA;IACZ,uCAAuC;IACvC,KAAK,CAAC,EAAE,MAAM,CAAA;IACd,kDAAkD;IAClD,WAAW,CAAC,EAAE,MAAM,CAAA;CACrB;AAiBD,kFAAkF;AAClF,wBAAgB,aAAa,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAOlD;AAED;;;;GAIG;AACH,wBAAgB,cAAc,CAAC,IAAI,EAAE,MAAM,EAAE,QAAQ,CAAC,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS,CAOlF;AAED;;;;;;GAMG;AACH,wBAAgB,aAAa,CAAC,IAAI,EAAE,MAAM,GAAG,SAAS,EAAE,GAAG,SAAM,GAAG,MAAM,GAAG,SAAS,CAiBrF;AAED;;;;GAIG;AACH,wBAAgB,WAAW,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAIhD;AAED;;;;;GAKG;AACH,wBAAgB,cAAc,CAC5B,IAAI,EAAE,YAAY,EAClB,KAAK,EAAE,WAAW,EAClB,KAAK,CAAC,EAAE,MAAM,GACb,YAAY,CAyBd"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=pages.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"pages.test.d.ts","sourceRoot":"","sources":["../../src/og/pages.test.ts"],"names":[],"mappings":""}
@@ -1 +1 @@
1
- {"version":3,"file":"template.d.ts","sourceRoot":"","sources":["../../src/og/template.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAEH,OAAO,KAAK,EAAE,YAAY,EAAsB,MAAM,UAAU,CAAA;AA0DhE,wBAAgB,WAAW,CAAC,MAAM,EAAE,YAAY,GAAG,MAAM,CAkExD"}
1
+ {"version":3,"file":"template.d.ts","sourceRoot":"","sources":["../../src/og/template.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAEH,OAAO,KAAK,EAAE,YAAY,EAAsB,MAAM,UAAU,CAAA;AAwJhE,wBAAgB,WAAW,CAAC,MAAM,EAAE,YAAY,GAAG,MAAM,CAuExD"}