@sonordev/site-kit 3.6.3 → 3.7.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (146) hide show
  1. package/agent-manifest.json +1 -1
  2. package/dist/AnalyticsProvider-JWXDXOIR.js +31 -0
  3. package/dist/{AnalyticsProvider-ZJHOU5HI.js.map → AnalyticsProvider-JWXDXOIR.js.map} +1 -1
  4. package/dist/AnalyticsProvider-OIRXQE7O.mjs +10 -0
  5. package/dist/{AnalyticsProvider-X243YBPQ.mjs.map → AnalyticsProvider-OIRXQE7O.mjs.map} +1 -1
  6. package/dist/ChatWidget-FFCUDCT6.mjs +10 -0
  7. package/dist/{ChatWidget-L5E73JUY.mjs.map → ChatWidget-FFCUDCT6.mjs.map} +1 -1
  8. package/dist/ChatWidget-K2BFJXGB.js +19 -0
  9. package/dist/{ChatWidget-NRQBBRLK.js.map → ChatWidget-K2BFJXGB.js.map} +1 -1
  10. package/dist/EngageWidget-QKRXI3NB.mjs +9 -0
  11. package/dist/{EngageWidget-X7UIQUPC.mjs.map → EngageWidget-QKRXI3NB.mjs.map} +1 -1
  12. package/dist/EngageWidget-XRXXVVUK.js +18 -0
  13. package/dist/{EngageWidget-HLBJE4ZB.js.map → EngageWidget-XRXXVVUK.js.map} +1 -1
  14. package/dist/{SignalCore-G6MAO72R.mjs → SignalCore-6MUAX656.mjs} +5 -5
  15. package/dist/{SignalCore-G6MAO72R.mjs.map → SignalCore-6MUAX656.mjs.map} +1 -1
  16. package/dist/{SignalCore-CWDC45EQ.js → SignalCore-BXCBV6GR.js} +11 -11
  17. package/dist/{SignalCore-CWDC45EQ.js.map → SignalCore-BXCBV6GR.js.map} +1 -1
  18. package/dist/SitemapSync-KS7KTJBK.mjs +8 -0
  19. package/dist/{SitemapSync-QAMSDAF7.mjs.map → SitemapSync-KS7KTJBK.mjs.map} +1 -1
  20. package/dist/SitemapSync-WEZHTSFL.js +17 -0
  21. package/dist/{SitemapSync-FWWORZOF.js.map → SitemapSync-WEZHTSFL.js.map} +1 -1
  22. package/dist/analytics/index.js +12 -12
  23. package/dist/analytics/index.mjs +5 -5
  24. package/dist/{chunk-EY2236OY.mjs → chunk-2CNKJMGT.mjs} +3 -3
  25. package/dist/{chunk-EY2236OY.mjs.map → chunk-2CNKJMGT.mjs.map} +1 -1
  26. package/dist/{chunk-XS2COTTD.mjs → chunk-2EYHSGQ3.mjs} +3 -3
  27. package/dist/{chunk-XS2COTTD.mjs.map → chunk-2EYHSGQ3.mjs.map} +1 -1
  28. package/dist/chunk-2HH4VVJT.mjs +6 -0
  29. package/dist/{chunk-JYM4I57K.mjs.map → chunk-2HH4VVJT.mjs.map} +1 -1
  30. package/dist/{chunk-OYT6SFLM.js → chunk-2PQUCJJF.js} +5 -5
  31. package/dist/{chunk-OYT6SFLM.js.map → chunk-2PQUCJJF.js.map} +1 -1
  32. package/dist/{chunk-PUH6YPZY.mjs → chunk-3K7WF6KB.mjs} +8 -8
  33. package/dist/{chunk-PUH6YPZY.mjs.map → chunk-3K7WF6KB.mjs.map} +1 -1
  34. package/dist/{chunk-GR4YKNFX.js → chunk-4NUHZ24M.js} +13 -13
  35. package/dist/{chunk-GR4YKNFX.js.map → chunk-4NUHZ24M.js.map} +1 -1
  36. package/dist/{chunk-LSZ6CT6U.mjs → chunk-54ZC6LPR.mjs} +3 -3
  37. package/dist/{chunk-LSZ6CT6U.mjs.map → chunk-54ZC6LPR.mjs.map} +1 -1
  38. package/dist/{chunk-PHLJDLRA.mjs → chunk-5Y5GCSH6.mjs} +3 -3
  39. package/dist/{chunk-PHLJDLRA.mjs.map → chunk-5Y5GCSH6.mjs.map} +1 -1
  40. package/dist/{chunk-7KIXGDUP.js → chunk-7UZV6JXD.js} +22 -15
  41. package/dist/chunk-7UZV6JXD.js.map +1 -0
  42. package/dist/{chunk-KYYSS5L7.mjs → chunk-AJPPCSVW.mjs} +3 -3
  43. package/dist/{chunk-KYYSS5L7.mjs.map → chunk-AJPPCSVW.mjs.map} +1 -1
  44. package/dist/{chunk-ZQ2JTDPC.js → chunk-AKBGYQLC.js} +15 -15
  45. package/dist/{chunk-ZQ2JTDPC.js.map → chunk-AKBGYQLC.js.map} +1 -1
  46. package/dist/{chunk-O4ILWMIB.js → chunk-AUBFDSTJ.js} +8 -8
  47. package/dist/{chunk-O4ILWMIB.js.map → chunk-AUBFDSTJ.js.map} +1 -1
  48. package/dist/{chunk-QR7CMR3W.js → chunk-C3QMG4HS.js} +15 -15
  49. package/dist/{chunk-QR7CMR3W.js.map → chunk-C3QMG4HS.js.map} +1 -1
  50. package/dist/{chunk-IJR3ATI5.mjs → chunk-CDKWTLWF.mjs} +4 -4
  51. package/dist/{chunk-IJR3ATI5.mjs.map → chunk-CDKWTLWF.mjs.map} +1 -1
  52. package/dist/{chunk-VOYRWPE3.mjs → chunk-FP523A7G.mjs} +3 -3
  53. package/dist/{chunk-VOYRWPE3.mjs.map → chunk-FP523A7G.mjs.map} +1 -1
  54. package/dist/{chunk-T3ARA52J.js → chunk-GZHLVOW3.js} +4 -4
  55. package/dist/{chunk-T3ARA52J.js.map → chunk-GZHLVOW3.js.map} +1 -1
  56. package/dist/{chunk-5OJ36D7M.js → chunk-HWJF7WMI.js} +14 -14
  57. package/dist/{chunk-5OJ36D7M.js.map → chunk-HWJF7WMI.js.map} +1 -1
  58. package/dist/{chunk-WQXSILFH.mjs → chunk-JFAAPREU.mjs} +12 -5
  59. package/dist/chunk-JFAAPREU.mjs.map +1 -0
  60. package/dist/{chunk-FK342VJY.mjs → chunk-LFFBDQM3.mjs} +4 -4
  61. package/dist/{chunk-FK342VJY.mjs.map → chunk-LFFBDQM3.mjs.map} +1 -1
  62. package/dist/{chunk-DEVPKGCD.mjs → chunk-LSWTMMKJ.mjs} +3 -3
  63. package/dist/{chunk-DEVPKGCD.mjs.map → chunk-LSWTMMKJ.mjs.map} +1 -1
  64. package/dist/{chunk-FJTER53S.mjs → chunk-NM7L2XKF.mjs} +4 -4
  65. package/dist/{chunk-FJTER53S.mjs.map → chunk-NM7L2XKF.mjs.map} +1 -1
  66. package/dist/{chunk-DCSNIU2V.js → chunk-ON6WW7IE.js} +6 -6
  67. package/dist/{chunk-DCSNIU2V.js.map → chunk-ON6WW7IE.js.map} +1 -1
  68. package/dist/{chunk-BS3P5PTY.mjs → chunk-QAYCRXT4.mjs} +3 -3
  69. package/dist/{chunk-BS3P5PTY.mjs.map → chunk-QAYCRXT4.mjs.map} +1 -1
  70. package/dist/{chunk-TYYTM4WC.js → chunk-QPT5QX2W.js} +12 -12
  71. package/dist/{chunk-TYYTM4WC.js.map → chunk-QPT5QX2W.js.map} +1 -1
  72. package/dist/{chunk-FYCFUYPQ.js → chunk-R3CXRMP7.js} +3 -3
  73. package/dist/{chunk-FYCFUYPQ.js.map → chunk-R3CXRMP7.js.map} +1 -1
  74. package/dist/chunk-SCMHZBTN.js +8 -0
  75. package/dist/{chunk-6ZDXUCAX.js.map → chunk-SCMHZBTN.js.map} +1 -1
  76. package/dist/{chunk-VZF3NFCY.js → chunk-TA6KXHCY.js} +7 -7
  77. package/dist/{chunk-VZF3NFCY.js.map → chunk-TA6KXHCY.js.map} +1 -1
  78. package/dist/{chunk-XHJXIAAW.js → chunk-TQS2X5A3.js} +5 -5
  79. package/dist/{chunk-XHJXIAAW.js.map → chunk-TQS2X5A3.js.map} +1 -1
  80. package/dist/{chunk-EDQXJFH2.mjs → chunk-TZTO5CDS.mjs} +3 -3
  81. package/dist/{chunk-EDQXJFH2.mjs.map → chunk-TZTO5CDS.mjs.map} +1 -1
  82. package/dist/{chunk-KEGWCBLW.mjs → chunk-UWL37MUR.mjs} +3 -3
  83. package/dist/{chunk-KEGWCBLW.mjs.map → chunk-UWL37MUR.mjs.map} +1 -1
  84. package/dist/{chunk-PVRE3PYC.js → chunk-VZU2EHB6.js} +4 -4
  85. package/dist/{chunk-PVRE3PYC.js.map → chunk-VZU2EHB6.js.map} +1 -1
  86. package/dist/{chunk-C7EVU7V7.js → chunk-WQ64SU6E.js} +4 -4
  87. package/dist/{chunk-C7EVU7V7.js.map → chunk-WQ64SU6E.js.map} +1 -1
  88. package/dist/{chunk-O3WBS4VY.js → chunk-XOBW75J2.js} +9 -9
  89. package/dist/{chunk-O3WBS4VY.js.map → chunk-XOBW75J2.js.map} +1 -1
  90. package/dist/{chunk-6B3DEFHU.mjs → chunk-XREO3QRA.mjs} +3 -3
  91. package/dist/{chunk-6B3DEFHU.mjs.map → chunk-XREO3QRA.mjs.map} +1 -1
  92. package/dist/{chunk-2O2PZII5.mjs → chunk-YE7KZQZ3.mjs} +4 -4
  93. package/dist/{chunk-2O2PZII5.mjs.map → chunk-YE7KZQZ3.mjs.map} +1 -1
  94. package/dist/{chunk-D74AZ6TM.js → chunk-ZKAZGLHI.js} +9 -9
  95. package/dist/{chunk-D74AZ6TM.js.map → chunk-ZKAZGLHI.js.map} +1 -1
  96. package/dist/cli/index.js +2 -2
  97. package/dist/cli/index.mjs +1 -1
  98. package/dist/client/index.js +4 -4
  99. package/dist/client/index.mjs +3 -3
  100. package/dist/commerce/index.d.mts +1 -1
  101. package/dist/commerce/index.d.ts +1 -1
  102. package/dist/commerce/index.js +51 -51
  103. package/dist/commerce/index.mjs +6 -6
  104. package/dist/engage/index.js +9 -9
  105. package/dist/engage/index.mjs +6 -6
  106. package/dist/fleet/index.js +8 -8
  107. package/dist/fleet/index.mjs +4 -4
  108. package/dist/forms/index.js +13 -13
  109. package/dist/forms/index.mjs +5 -5
  110. package/dist/images/index.js +11 -11
  111. package/dist/images/index.mjs +4 -4
  112. package/dist/index.d.mts +1 -1
  113. package/dist/index.d.ts +1 -1
  114. package/dist/index.js +64 -64
  115. package/dist/index.mjs +10 -10
  116. package/dist/layout/client.js +8 -8
  117. package/dist/layout/client.mjs +7 -7
  118. package/dist/layout/index.js +10 -10
  119. package/dist/layout/index.mjs +8 -8
  120. package/dist/maps/index.js +5 -5
  121. package/dist/maps/index.mjs +3 -3
  122. package/dist/seo/client.js +5 -5
  123. package/dist/seo/client.mjs +4 -4
  124. package/dist/seo/index.js +5 -5
  125. package/dist/seo/index.mjs +4 -4
  126. package/dist/server/index.js +3 -3
  127. package/dist/server/index.mjs +2 -2
  128. package/dist/signal/index.js +11 -11
  129. package/dist/signal/index.mjs +2 -2
  130. package/dist/sync/index.js +16 -16
  131. package/dist/sync/index.mjs +4 -4
  132. package/dist/{useEventModal-qJfX_1XG.d.mts → useEventModal-DAAiArgM.d.mts} +9 -1
  133. package/dist/{useEventModal-CcxNZOvp.d.ts → useEventModal-ZQX19_4k.d.ts} +9 -1
  134. package/package.json +1 -1
  135. package/dist/AnalyticsProvider-X243YBPQ.mjs +0 -10
  136. package/dist/AnalyticsProvider-ZJHOU5HI.js +0 -31
  137. package/dist/ChatWidget-L5E73JUY.mjs +0 -10
  138. package/dist/ChatWidget-NRQBBRLK.js +0 -19
  139. package/dist/EngageWidget-HLBJE4ZB.js +0 -18
  140. package/dist/EngageWidget-X7UIQUPC.mjs +0 -9
  141. package/dist/SitemapSync-FWWORZOF.js +0 -17
  142. package/dist/SitemapSync-QAMSDAF7.mjs +0 -8
  143. package/dist/chunk-6ZDXUCAX.js +0 -8
  144. package/dist/chunk-7KIXGDUP.js.map +0 -1
  145. package/dist/chunk-JYM4I57K.mjs +0 -6
  146. package/dist/chunk-WQXSILFH.mjs.map +0 -1
@@ -1,7 +1,7 @@
1
1
  'use strict';
2
2
 
3
3
  var chunkNB4MK2Q5_js = require('./chunk-NB4MK2Q5.js');
4
- var chunkT3ARA52J_js = require('./chunk-T3ARA52J.js');
4
+ var chunkGZHLVOW3_js = require('./chunk-GZHLVOW3.js');
5
5
 
6
6
  // src/shared/publishCredential.ts
7
7
  function resolveSiteHost(explicitSite) {
@@ -26,9 +26,9 @@ function publishSiteCredential({
26
26
  mapsBrowserKey
27
27
  }) {
28
28
  if (typeof window === "undefined") return;
29
- chunkT3ARA52J_js.configureSiteCredential({ credential: apiKey, apiUrl });
29
+ chunkGZHLVOW3_js.configureSiteCredential({ credential: apiKey, apiUrl });
30
30
  window.__SITE_KIT_API_URL__ = apiUrl;
31
- window.__SITE_KIT_API_KEY__ = chunkT3ARA52J_js.currentCredential(apiKey);
31
+ window.__SITE_KIT_API_KEY__ = chunkGZHLVOW3_js.currentCredential(apiKey);
32
32
  window.__SITE_KIT_DEBUG__ = debug;
33
33
  window.__SITE_KIT_SITE__ = site ?? resolveSiteHost();
34
34
  if (mapsBrowserKey) window.__GOOGLE_MAPS_API_KEY__ = mapsBrowserKey;
@@ -36,5 +36,5 @@ function publishSiteCredential({
36
36
 
37
37
  exports.publishSiteCredential = publishSiteCredential;
38
38
  exports.resolveSiteHost = resolveSiteHost;
39
- //# sourceMappingURL=chunk-OYT6SFLM.js.map
40
- //# sourceMappingURL=chunk-OYT6SFLM.js.map
39
+ //# sourceMappingURL=chunk-2PQUCJJF.js.map
40
+ //# sourceMappingURL=chunk-2PQUCJJF.js.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/shared/publishCredential.ts"],"names":["normalizeSiteHost","configureSiteCredential","currentCredential"],"mappings":";;;;;;AAqCO,SAAS,gBAAgB,YAAA,EAA+B;AAC7D,EAAA,MAAM,aACJ,OAAO,OAAA,KAAY,WAAA,GAAc,OAAA,CAAQ,IAAI,oBAAA,GAAuB,MAAA;AAEtE,EAAA,IAAI,WAAW,YAAA,IAAgB,EAAA;AAC/B,EAAA,IAAI,CAAC,YAAY,UAAA,EAAY;AAC3B,IAAA,IAAI;AACF,MAAA,QAAA,GAAW,IAAI,GAAA,CAAI,UAAU,CAAA,CAAE,IAAA;AAAA,IACjC,CAAA,CAAA,MAAQ;AAAA,IAER;AAAA,EACF;AACA,EAAA,IAAI,CAAC,QAAA,IAAY,OAAO,MAAA,KAAW,WAAA,EAAa;AAC9C,IAAA,QAAA,GAAW,OAAO,QAAA,CAAS,IAAA;AAAA,EAC7B;AACA,EAAA,OAAOA,kCAAA,CAAkB,QAAQ,CAAA,IAAK,EAAA;AACxC;AAkCO,SAAS,qBAAA,CAAsB;AAAA,EACpC,MAAA;AAAA,EACA,MAAA,GAAS,sBAAA;AAAA,EACT,IAAA;AAAA,EACA,KAAA,GAAQ,KAAA;AAAA,EACR;AACF,CAAA,EAAuC;AACrC,EAAA,IAAI,OAAO,WAAW,WAAA,EAAa;AAKnC,EAAAC,wCAAA,CAAwB,EAAE,UAAA,EAAY,MAAA,EAAQ,MAAA,EAAQ,CAAA;AACrD,EAAC,OAAe,oBAAA,GAAuB,MAAA;AACvC,EAAC,MAAA,CAAe,oBAAA,GAAuBC,kCAAA,CAAkB,MAAM,CAAA;AAC/D,EAAC,OAAe,kBAAA,GAAqB,KAAA;AACrC,EAAC,MAAA,CAAe,iBAAA,GAAoB,IAAA,IAAQ,eAAA,EAAgB;AAG7D,EAAA,IAAI,cAAA,EAAiB,MAAA,CAAe,uBAAA,GAA0B,cAAA;AAChE","file":"chunk-OYT6SFLM.js","sourcesContent":["/**\n * @sonordev/site-kit shared — Client credential + window-global publishing\n *\n * SINGLE SOURCE OF TRUTH for seeding the browser-side token manager and the\n * `window.__SITE_KIT_*` globals that every client module reads. Used by:\n *\n * - `SiteKitClientProviders` (core `SiteKitLayout`)\n * - `SiteKitCredential` (`@sonordev/site-kit/client`) — the public component\n * for layouts that are NOT core `SiteKitLayout`, e.g.\n * `@sonordev/agency-site-kit`'s `AgencySiteKitLayout`.\n *\n * Do not re-fork this. Before it existed, agency sites hand-rolled their own\n * \"set the globals on mount\" component (upforge's `UptradeSiteKitInit`), and\n * because those copies had no access to the token manager they published the\n * RAW `sonor_` key into the client bundle — the exact exposure the mint exists\n * to prevent. Any layout that puts a credential on `window` goes through here.\n *\n * Client-safe: no `server-only` guard, SSR-safe (every write is window-gated).\n * The minting half is server-only and lives in `../server/mint-site-token`.\n */\n// Leaf module, NOT '../sites/contract' — see sites/normalize.ts. Importing the\n// full contract here shipped its JSON schema to every browser that loads a\n// credential-publishing entry.\nimport { normalizeSiteHost } from '../sites/normalize'\nimport { configureSiteCredential, currentCredential } from './siteToken'\n\n/**\n * Resolve the sub-site identifier — the dimension that lets one Sonor project\n * host many sites (e.g. truepowersystems.com + ohiopowerstudies.com under one\n * TPS project). Precedence, per the platform site contract:\n * explicit `site` > NEXT_PUBLIC_SITE_URL host > window.location.host\n *\n * Normalized with the shared contract (lowercase host, no protocol/path/port)\n * so `__SITE_KIT_SITE__` matches exactly what the Sonor API stores — servers\n * re-normalize with the same rule, so this only makes the client emit the\n * canonical value. Always returns a string (possibly empty).\n */\nexport function resolveSiteHost(explicitSite?: string): string {\n const envSiteUrl =\n typeof process !== 'undefined' ? process.env.NEXT_PUBLIC_SITE_URL : undefined\n\n let resolved = explicitSite ?? ''\n if (!resolved && envSiteUrl) {\n try {\n resolved = new URL(envSiteUrl).host\n } catch {\n /* malformed URL — fall through to client-side host */\n }\n }\n if (!resolved && typeof window !== 'undefined') {\n resolved = window.location.host\n }\n return normalizeSiteHost(resolved) ?? ''\n}\n\nexport interface PublishSiteCredentialOptions {\n /**\n * The credential the layout minted server-side. In 3.2+ this is a short-lived\n * `st1.` token that `sonorFetch` refreshes transparently. A raw `sonor_` key\n * still works (2.x kit, or the mint-failed fallback) but should never be\n * routed here from a client component — it would ship the secret to the\n * browser.\n */\n apiKey?: string\n apiUrl?: string\n /** Pre-resolved sub-site host. Omit to resolve via `resolveSiteHost`. */\n site?: string\n debug?: boolean\n /**\n * Referrer-restricted Google Maps BROWSER key for client map components.\n * Resolved server-side by SiteKitLayout (NEXT_PUBLIC_GOOGLE_MAPS_API_KEY /\n * GOOGLE_MAPS_BROWSER_KEY) because maps/api.ts runs client-side, where a bare\n * process.env read is dead code unless the app's bundler happens to inline it.\n * Never route a server secret here.\n */\n mapsBrowserKey?: string\n}\n\n/**\n * Seed the token manager and publish the `window.__SITE_KIT_*` globals.\n *\n * Called during RENDER, not in an effect: client modules read these globals in\n * their own mount effects, and effects run child-first, so an effect-based\n * publish would land after the modules that need it.\n *\n * No-op on the server.\n */\nexport function publishSiteCredential({\n apiKey,\n apiUrl = 'https://api.sonor.io',\n site,\n debug = false,\n mapsBrowserKey,\n}: PublishSiteCredentialOptions): void {\n if (typeof window === 'undefined') return\n\n // Seed the client token manager. The window global is set to the freshest\n // token held — a prior page this session may already have refreshed past the\n // seed the layout injected. In raw-key mode this is a passthrough.\n configureSiteCredential({ credential: apiKey, apiUrl })\n ;(window as any).__SITE_KIT_API_URL__ = apiUrl\n ;(window as any).__SITE_KIT_API_KEY__ = currentCredential(apiKey)\n ;(window as any).__SITE_KIT_DEBUG__ = debug\n ;(window as any).__SITE_KIT_SITE__ = site ?? resolveSiteHost()\n // maps/api.ts falls back to this global when the Sonor platform hasn't\n // provisioned a browser key. Don't clobber a value another layout already set.\n if (mapsBrowserKey) (window as any).__GOOGLE_MAPS_API_KEY__ = mapsBrowserKey\n}\n"]}
1
+ {"version":3,"sources":["../src/shared/publishCredential.ts"],"names":["normalizeSiteHost","configureSiteCredential","currentCredential"],"mappings":";;;;;;AAqCO,SAAS,gBAAgB,YAAA,EAA+B;AAC7D,EAAA,MAAM,aACJ,OAAO,OAAA,KAAY,WAAA,GAAc,OAAA,CAAQ,IAAI,oBAAA,GAAuB,MAAA;AAEtE,EAAA,IAAI,WAAW,YAAA,IAAgB,EAAA;AAC/B,EAAA,IAAI,CAAC,YAAY,UAAA,EAAY;AAC3B,IAAA,IAAI;AACF,MAAA,QAAA,GAAW,IAAI,GAAA,CAAI,UAAU,CAAA,CAAE,IAAA;AAAA,IACjC,CAAA,CAAA,MAAQ;AAAA,IAER;AAAA,EACF;AACA,EAAA,IAAI,CAAC,QAAA,IAAY,OAAO,MAAA,KAAW,WAAA,EAAa;AAC9C,IAAA,QAAA,GAAW,OAAO,QAAA,CAAS,IAAA;AAAA,EAC7B;AACA,EAAA,OAAOA,kCAAA,CAAkB,QAAQ,CAAA,IAAK,EAAA;AACxC;AAkCO,SAAS,qBAAA,CAAsB;AAAA,EACpC,MAAA;AAAA,EACA,MAAA,GAAS,sBAAA;AAAA,EACT,IAAA;AAAA,EACA,KAAA,GAAQ,KAAA;AAAA,EACR;AACF,CAAA,EAAuC;AACrC,EAAA,IAAI,OAAO,WAAW,WAAA,EAAa;AAKnC,EAAAC,wCAAA,CAAwB,EAAE,UAAA,EAAY,MAAA,EAAQ,MAAA,EAAQ,CAAA;AACrD,EAAC,OAAe,oBAAA,GAAuB,MAAA;AACvC,EAAC,MAAA,CAAe,oBAAA,GAAuBC,kCAAA,CAAkB,MAAM,CAAA;AAC/D,EAAC,OAAe,kBAAA,GAAqB,KAAA;AACrC,EAAC,MAAA,CAAe,iBAAA,GAAoB,IAAA,IAAQ,eAAA,EAAgB;AAG7D,EAAA,IAAI,cAAA,EAAiB,MAAA,CAAe,uBAAA,GAA0B,cAAA;AAChE","file":"chunk-2PQUCJJF.js","sourcesContent":["/**\n * @sonordev/site-kit shared — Client credential + window-global publishing\n *\n * SINGLE SOURCE OF TRUTH for seeding the browser-side token manager and the\n * `window.__SITE_KIT_*` globals that every client module reads. Used by:\n *\n * - `SiteKitClientProviders` (core `SiteKitLayout`)\n * - `SiteKitCredential` (`@sonordev/site-kit/client`) — the public component\n * for layouts that are NOT core `SiteKitLayout`, e.g.\n * `@sonordev/agency-site-kit`'s `AgencySiteKitLayout`.\n *\n * Do not re-fork this. Before it existed, agency sites hand-rolled their own\n * \"set the globals on mount\" component (upforge's `UptradeSiteKitInit`), and\n * because those copies had no access to the token manager they published the\n * RAW `sonor_` key into the client bundle — the exact exposure the mint exists\n * to prevent. Any layout that puts a credential on `window` goes through here.\n *\n * Client-safe: no `server-only` guard, SSR-safe (every write is window-gated).\n * The minting half is server-only and lives in `../server/mint-site-token`.\n */\n// Leaf module, NOT '../sites/contract' — see sites/normalize.ts. Importing the\n// full contract here shipped its JSON schema to every browser that loads a\n// credential-publishing entry.\nimport { normalizeSiteHost } from '../sites/normalize'\nimport { configureSiteCredential, currentCredential } from './siteToken'\n\n/**\n * Resolve the sub-site identifier — the dimension that lets one Sonor project\n * host many sites (e.g. truepowersystems.com + ohiopowerstudies.com under one\n * TPS project). Precedence, per the platform site contract:\n * explicit `site` > NEXT_PUBLIC_SITE_URL host > window.location.host\n *\n * Normalized with the shared contract (lowercase host, no protocol/path/port)\n * so `__SITE_KIT_SITE__` matches exactly what the Sonor API stores — servers\n * re-normalize with the same rule, so this only makes the client emit the\n * canonical value. Always returns a string (possibly empty).\n */\nexport function resolveSiteHost(explicitSite?: string): string {\n const envSiteUrl =\n typeof process !== 'undefined' ? process.env.NEXT_PUBLIC_SITE_URL : undefined\n\n let resolved = explicitSite ?? ''\n if (!resolved && envSiteUrl) {\n try {\n resolved = new URL(envSiteUrl).host\n } catch {\n /* malformed URL — fall through to client-side host */\n }\n }\n if (!resolved && typeof window !== 'undefined') {\n resolved = window.location.host\n }\n return normalizeSiteHost(resolved) ?? ''\n}\n\nexport interface PublishSiteCredentialOptions {\n /**\n * The credential the layout minted server-side. In 3.2+ this is a short-lived\n * `st1.` token that `sonorFetch` refreshes transparently. A raw `sonor_` key\n * still works (2.x kit, or the mint-failed fallback) but should never be\n * routed here from a client component — it would ship the secret to the\n * browser.\n */\n apiKey?: string\n apiUrl?: string\n /** Pre-resolved sub-site host. Omit to resolve via `resolveSiteHost`. */\n site?: string\n debug?: boolean\n /**\n * Referrer-restricted Google Maps BROWSER key for client map components.\n * Resolved server-side by SiteKitLayout (NEXT_PUBLIC_GOOGLE_MAPS_API_KEY /\n * GOOGLE_MAPS_BROWSER_KEY) because maps/api.ts runs client-side, where a bare\n * process.env read is dead code unless the app's bundler happens to inline it.\n * Never route a server secret here.\n */\n mapsBrowserKey?: string\n}\n\n/**\n * Seed the token manager and publish the `window.__SITE_KIT_*` globals.\n *\n * Called during RENDER, not in an effect: client modules read these globals in\n * their own mount effects, and effects run child-first, so an effect-based\n * publish would land after the modules that need it.\n *\n * No-op on the server.\n */\nexport function publishSiteCredential({\n apiKey,\n apiUrl = 'https://api.sonor.io',\n site,\n debug = false,\n mapsBrowserKey,\n}: PublishSiteCredentialOptions): void {\n if (typeof window === 'undefined') return\n\n // Seed the client token manager. The window global is set to the freshest\n // token held — a prior page this session may already have refreshed past the\n // seed the layout injected. In raw-key mode this is a passthrough.\n configureSiteCredential({ credential: apiKey, apiUrl })\n ;(window as any).__SITE_KIT_API_URL__ = apiUrl\n ;(window as any).__SITE_KIT_API_KEY__ = currentCredential(apiKey)\n ;(window as any).__SITE_KIT_DEBUG__ = debug\n ;(window as any).__SITE_KIT_SITE__ = site ?? resolveSiteHost()\n // maps/api.ts falls back to this global when the Sonor platform hasn't\n // provisioned a browser key. Don't clobber a value another layout already set.\n if (mapsBrowserKey) (window as any).__GOOGLE_MAPS_API_KEY__ = mapsBrowserKey\n}\n"]}
@@ -1,23 +1,23 @@
1
1
  'use client';
2
- import { resolveSiteHost, publishSiteCredential } from './chunk-6B3DEFHU.mjs';
3
- import { FleetHeartbeat } from './chunk-2O2PZII5.mjs';
2
+ import { resolveSiteHost, publishSiteCredential } from './chunk-XREO3QRA.mjs';
3
+ import { FleetHeartbeat } from './chunk-YE7KZQZ3.mjs';
4
4
  import { useDeferredActivation } from './chunk-ZVBLXXNJ.mjs';
5
- import { SignalBridge } from './chunk-DEVPKGCD.mjs';
5
+ import { SignalBridge } from './chunk-LSWTMMKJ.mjs';
6
6
  import { getOrCreateVisitorId, getOrCreateSessionId, SiteKitIdentityProvider } from './chunk-AX4AROLH.mjs';
7
7
  import { useState, useRef, useCallback, Suspense } from 'react';
8
8
  import dynamic from 'next/dynamic';
9
9
  import { jsx, jsxs, Fragment } from 'react/jsx-runtime';
10
10
 
11
11
  var LazyAnalyticsProvider = dynamic(
12
- () => import('./AnalyticsProvider-X243YBPQ.mjs').then((m) => ({ default: m.AnalyticsProvider })),
12
+ () => import('./AnalyticsProvider-OIRXQE7O.mjs').then((m) => ({ default: m.AnalyticsProvider })),
13
13
  { ssr: false }
14
14
  );
15
15
  var LazyEngageWidget = dynamic(
16
- () => import('./EngageWidget-X7UIQUPC.mjs').then((m) => ({ default: m.EngageWidget })),
16
+ () => import('./EngageWidget-QKRXI3NB.mjs').then((m) => ({ default: m.EngageWidget })),
17
17
  { ssr: false }
18
18
  );
19
19
  var LazySitemapSync = dynamic(
20
- () => import('./SitemapSync-QAMSDAF7.mjs').then((m) => ({ default: m.SitemapSync })),
20
+ () => import('./SitemapSync-KS7KTJBK.mjs').then((m) => ({ default: m.SitemapSync })),
21
21
  { ssr: false }
22
22
  );
23
23
  function SiteKitClientProviders({
@@ -132,5 +132,5 @@ function SiteKitClientProviders({
132
132
  }
133
133
 
134
134
  export { SiteKitClientProviders };
135
- //# sourceMappingURL=chunk-PUH6YPZY.mjs.map
136
- //# sourceMappingURL=chunk-PUH6YPZY.mjs.map
135
+ //# sourceMappingURL=chunk-3K7WF6KB.mjs.map
136
+ //# sourceMappingURL=chunk-3K7WF6KB.mjs.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/layout/SiteKitClientProviders.tsx"],"names":[],"mappings":"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","file":"chunk-PUH6YPZY.mjs","sourcesContent":["'use client'\n\n/**\n * SiteKitClientProviders — Client Island\n *\n * This is the 'use client' boundary for SiteKitLayout.\n * It composes the client-only providers (Analytics, Engage, Signal, SitemapSync)\n * that require React context or browser APIs.\n *\n * All modules are lazy-loaded via next/dynamic so their JS is only downloaded\n * when the feature is enabled — keeping the initial bundle lightweight.\n *\n * All modules share a unified identity (visitor ID + session ID) via\n * SiteKitIdentityProvider, ensuring consistent tracking across Analytics,\n * Signal, and Engage.\n *\n * Props are passed down from the server-side SiteKitLayout component,\n * which reads env vars at render time.\n */\n\nimport React, { Suspense, useCallback, useRef, useState, type ReactNode } from 'react'\nimport dynamic from 'next/dynamic'\nimport {\n SiteKitIdentityProvider,\n getOrCreateVisitorId,\n getOrCreateSessionId,\n} from '../shared/identity'\n// Defer non-critical module mounting until the page is quiet: the lazy\n// modules below are dynamic(ssr:false) and never render on the server, but\n// rendering them during hydration still kicks off their chunk downloads +\n// mount effects inside the critical startup window. useDeferredActivation\n// holds them until window.load + idle or first interaction — the same\n// strategy as the hand-rolled per-site deferrals this replaces (upforge\n// `deferred-analytics.tsx`, TPS `DeferredAnalytics.tsx`). The hook is public\n// (`@sonordev/site-kit/client`) so sites can reuse it for their own scripts.\nimport { useDeferredActivation } from '../shared/defer'\n// Single source of truth for seeding the token manager + the __SITE_KIT_*\n// globals — shared with the public `SiteKitCredential` component that\n// non-core layouts (agency-site-kit) use. Do not re-inline it here.\nimport { publishSiteCredential, resolveSiteHost } from '../shared/publishCredential'\nimport type { AnalyticsConfig, EngageConfig, SignalConfig } from './types'\n\n// Lazy-load feature modules — JS only downloaded when feature is enabled\nconst LazyAnalyticsProvider = dynamic(\n () => import('../analytics/AnalyticsProvider').then(m => ({ default: m.AnalyticsProvider })),\n { ssr: false },\n)\nconst LazyEngageWidget = dynamic(\n () => import('../engage/EngageWidget').then(m => ({ default: m.EngageWidget })),\n { ssr: false },\n)\nconst LazySitemapSync = dynamic(\n () => import('../SitemapSync').then(m => ({ default: m.SitemapSync })),\n { ssr: false },\n)\n// SignalBridge is imported STATICALLY, not via dynamic(ssr:false): it is a\n// tiny SSR-safe context shell that renders children immediately and\n// lazy-loads its machinery (SignalCore) as a childless sibling internally.\n// Wrapping children in a dynamic(ssr:false) component was the old SSR-bailout\n// failure mode — do not reintroduce it.\nimport { SignalBridge } from '../signal/SignalBridge'\n// Fleet heartbeat: a deferred, CHILDLESS SIBLING (like Analytics/Engage) that\n// reports this site's kit version + active modules once per session, so the\n// platform can see version drift across the fleet. Tiny and SSR-safe — renders\n// null until the shared idle gate fires; never wraps page content.\nimport { FleetHeartbeat } from '../fleet/FleetHeartbeat'\nimport type { FleetModule } from '../fleet/contract'\n\nexport interface SiteKitClientProvidersProps {\n children: ReactNode\n apiKey: string\n apiUrl: string\n projectId?: string\n analytics?: boolean | AnalyticsConfig\n engage?: boolean | EngageConfig\n signal?: boolean | SignalConfig\n sitemapSync?: boolean\n /**\n * Fleet heartbeat — reports kit version + active modules to Sonor once per\n * session so the platform can track version drift and key state across every\n * site. Default true. Deferred exactly like Analytics; never in the hydration\n * path, carries no visitor data.\n */\n fleet?: boolean\n /**\n * Defer Analytics / Engage / SitemapSync until window load + idle or first\n * interaction (default true). Pass false to restore legacy eager mounting\n * on hydration. SignalBridge is never deferred — it must apply experiment\n * variants as early as possible.\n */\n defer?: boolean\n debug?: boolean\n /** Browser-safe Google Maps key, resolved server-side by SiteKitLayout. */\n mapsBrowserKey?: string\n}\n\nexport function SiteKitClientProviders({\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 debug = false,\n mapsBrowserKey,\n}: SiteKitClientProvidersProps) {\n // One shared activation gate for all deferred siblings, so they mount in a\n // single commit instead of staggered re-renders.\n const modulesReady = useDeferredActivation(defer)\n // Hoist analytics config so the `site` dimension is resolvable up here.\n const analyticsConfig: AnalyticsConfig =\n typeof analytics === 'object' ? analytics : {}\n\n // Resolve the sub-site identifier — the dimension that lets one Sonor project\n // host many sites (e.g. truepowersystems.com + ohiopowerstudies.com under one\n // TPS project). Precedence lives in resolveSiteHost (shared contract):\n // explicit `analytics.site` > NEXT_PUBLIC_SITE_URL host > window.location.host.\n // Needed as a local too — SignalBridge and the analytics config read it below.\n const site = resolveSiteHost(analyticsConfig.site)\n\n // Seed the token manager + publish the window globals modules read from.\n // No-op on the server; runs during render so it lands before child effects.\n publishSiteCredential({ apiKey, apiUrl, site, debug, mapsBrowserKey })\n\n // Unified identity — single source of truth for all modules\n const [visitorId] = useState(() => getOrCreateVisitorId())\n const [sessionId] = useState(() => getOrCreateSessionId())\n\n // Page metadata bridge: Analytics writes, Signal reads\n const pageMetadataRef = useRef<Record<string, unknown> | null>(null)\n const onPageMetadata = useCallback((metadata: Record<string, unknown>) => {\n pageMetadataRef.current = metadata\n }, [])\n\n let content = <>{children}</>\n\n // Wrap with SignalBridge if enabled. Safe to wrap: the shell is SSR-safe\n // and renders children straight through — the heavy machinery mounts as a\n // childless sibling inside it. Not gated on modulesReady: experiment\n // variants must apply as early as possible.\n if (signal) {\n const signalConfig: SignalConfig =\n typeof signal === 'object' ? signal : {}\n content = (\n <SignalBridge\n enabled\n realtime={signalConfig.realtime !== false}\n experiments={signalConfig.experiments !== false}\n behaviorTracking={signalConfig.behaviorTracking !== false}\n visitorId={visitorId}\n sessionId={sessionId}\n pageMetadataRef={pageMetadataRef}\n >\n {content}\n </SignalBridge>\n )\n }\n\n // Add Analytics if enabled (renders alongside, doesn't wrap).\n //\n // CRITICAL: LazyAnalyticsProvider is dynamic(..., { ssr: false }). Wrapping\n // {content} inside an ssr:false component makes the entire page tree skip\n // server rendering — the route de-opts to 100% client rendering and the\n // hero / LCP element only paints after hydration (mobile LCP ~4s, Lighthouse\n // ~85). Analytics tracks via effects + a metadata ref, so it never needs to\n // wrap page content — mount it as a childless sibling, exactly like Engage.\n // Each deferred sibling is appended as `{modulesReady && <Module/>}` so the\n // children slot never moves in the tree — flipping ready only mounts the\n // sibling, it never remounts page content.\n if (analytics) {\n content = (\n <>\n {content}\n {modulesReady && (\n <Suspense fallback={null}>\n <LazyAnalyticsProvider\n apiUrl={apiUrl}\n apiKey={apiKey}\n site={site}\n trackPageViews={analyticsConfig.trackPageViews !== false}\n trackWebVitals={analyticsConfig.trackWebVitals !== false}\n trackScrollDepth={analyticsConfig.trackScrollDepth !== false}\n trackClicks={analyticsConfig.trackClicks !== false}\n sessionTimeout={analyticsConfig.sessionDuration}\n excludePaths={analyticsConfig.excludePaths}\n debug={debug}\n externalVisitorId={visitorId}\n externalSessionId={sessionId}\n onPageMetadata={onPageMetadata}\n />\n </Suspense>\n )}\n </>\n )\n }\n\n // Add Engage widget if enabled (renders alongside, doesn't wrap)\n if (engage) {\n const engageConfig: EngageConfig =\n typeof engage === 'object' ? engage : {}\n content = (\n <>\n {content}\n {modulesReady && (\n <LazyEngageWidget\n apiUrl={apiUrl}\n apiKey={apiKey}\n projectId={projectId}\n position={engageConfig.position || 'bottom-right'}\n zIndex={engageConfig.zIndex}\n chatEnabled={engageConfig.chatEnabled !== false}\n />\n )}\n </>\n )\n }\n\n // Add SitemapSync if enabled\n if (sitemapSync) {\n content = (\n <>\n {content}\n {modulesReady && <LazySitemapSync debug={debug} />}\n </>\n )\n }\n\n // Fleet heartbeat — childless sibling on the same modulesReady idle gate.\n // Reports the modules actually enabled on THIS layout (honest client-observable\n // set) so the platform can answer \"which version / modules is each site\n // running\". defer={false}: the modulesReady gate already handled deferral, so\n // the heartbeat fires on mount (still bounded to once per session internally).\n if (fleet) {\n const activeModules: FleetModule[] = []\n if (analytics) activeModules.push('analytics')\n if (engage) activeModules.push('engage')\n if (signal) activeModules.push('signal')\n if (sitemapSync) activeModules.push('sitemapSync')\n content = (\n <>\n {content}\n {modulesReady && (\n <FleetHeartbeat\n apiUrl={apiUrl}\n apiKey={apiKey}\n site={site}\n modules={activeModules}\n defer={false}\n debug={debug}\n />\n )}\n </>\n )\n }\n\n return (\n <SiteKitIdentityProvider visitorId={visitorId} sessionId={sessionId}>\n {content}\n </SiteKitIdentityProvider>\n )\n}\n"]}
1
+ {"version":3,"sources":["../src/layout/SiteKitClientProviders.tsx"],"names":[],"mappings":"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","file":"chunk-3K7WF6KB.mjs","sourcesContent":["'use client'\n\n/**\n * SiteKitClientProviders — Client Island\n *\n * This is the 'use client' boundary for SiteKitLayout.\n * It composes the client-only providers (Analytics, Engage, Signal, SitemapSync)\n * that require React context or browser APIs.\n *\n * All modules are lazy-loaded via next/dynamic so their JS is only downloaded\n * when the feature is enabled — keeping the initial bundle lightweight.\n *\n * All modules share a unified identity (visitor ID + session ID) via\n * SiteKitIdentityProvider, ensuring consistent tracking across Analytics,\n * Signal, and Engage.\n *\n * Props are passed down from the server-side SiteKitLayout component,\n * which reads env vars at render time.\n */\n\nimport React, { Suspense, useCallback, useRef, useState, type ReactNode } from 'react'\nimport dynamic from 'next/dynamic'\nimport {\n SiteKitIdentityProvider,\n getOrCreateVisitorId,\n getOrCreateSessionId,\n} from '../shared/identity'\n// Defer non-critical module mounting until the page is quiet: the lazy\n// modules below are dynamic(ssr:false) and never render on the server, but\n// rendering them during hydration still kicks off their chunk downloads +\n// mount effects inside the critical startup window. useDeferredActivation\n// holds them until window.load + idle or first interaction — the same\n// strategy as the hand-rolled per-site deferrals this replaces (upforge\n// `deferred-analytics.tsx`, TPS `DeferredAnalytics.tsx`). The hook is public\n// (`@sonordev/site-kit/client`) so sites can reuse it for their own scripts.\nimport { useDeferredActivation } from '../shared/defer'\n// Single source of truth for seeding the token manager + the __SITE_KIT_*\n// globals — shared with the public `SiteKitCredential` component that\n// non-core layouts (agency-site-kit) use. Do not re-inline it here.\nimport { publishSiteCredential, resolveSiteHost } from '../shared/publishCredential'\nimport type { AnalyticsConfig, EngageConfig, SignalConfig } from './types'\n\n// Lazy-load feature modules — JS only downloaded when feature is enabled\nconst LazyAnalyticsProvider = dynamic(\n () => import('../analytics/AnalyticsProvider').then(m => ({ default: m.AnalyticsProvider })),\n { ssr: false },\n)\nconst LazyEngageWidget = dynamic(\n () => import('../engage/EngageWidget').then(m => ({ default: m.EngageWidget })),\n { ssr: false },\n)\nconst LazySitemapSync = dynamic(\n () => import('../SitemapSync').then(m => ({ default: m.SitemapSync })),\n { ssr: false },\n)\n// SignalBridge is imported STATICALLY, not via dynamic(ssr:false): it is a\n// tiny SSR-safe context shell that renders children immediately and\n// lazy-loads its machinery (SignalCore) as a childless sibling internally.\n// Wrapping children in a dynamic(ssr:false) component was the old SSR-bailout\n// failure mode — do not reintroduce it.\nimport { SignalBridge } from '../signal/SignalBridge'\n// Fleet heartbeat: a deferred, CHILDLESS SIBLING (like Analytics/Engage) that\n// reports this site's kit version + active modules once per session, so the\n// platform can see version drift across the fleet. Tiny and SSR-safe — renders\n// null until the shared idle gate fires; never wraps page content.\nimport { FleetHeartbeat } from '../fleet/FleetHeartbeat'\nimport type { FleetModule } from '../fleet/contract'\n\nexport interface SiteKitClientProvidersProps {\n children: ReactNode\n apiKey: string\n apiUrl: string\n projectId?: string\n analytics?: boolean | AnalyticsConfig\n engage?: boolean | EngageConfig\n signal?: boolean | SignalConfig\n sitemapSync?: boolean\n /**\n * Fleet heartbeat — reports kit version + active modules to Sonor once per\n * session so the platform can track version drift and key state across every\n * site. Default true. Deferred exactly like Analytics; never in the hydration\n * path, carries no visitor data.\n */\n fleet?: boolean\n /**\n * Defer Analytics / Engage / SitemapSync until window load + idle or first\n * interaction (default true). Pass false to restore legacy eager mounting\n * on hydration. SignalBridge is never deferred — it must apply experiment\n * variants as early as possible.\n */\n defer?: boolean\n debug?: boolean\n /** Browser-safe Google Maps key, resolved server-side by SiteKitLayout. */\n mapsBrowserKey?: string\n}\n\nexport function SiteKitClientProviders({\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 debug = false,\n mapsBrowserKey,\n}: SiteKitClientProvidersProps) {\n // One shared activation gate for all deferred siblings, so they mount in a\n // single commit instead of staggered re-renders.\n const modulesReady = useDeferredActivation(defer)\n // Hoist analytics config so the `site` dimension is resolvable up here.\n const analyticsConfig: AnalyticsConfig =\n typeof analytics === 'object' ? analytics : {}\n\n // Resolve the sub-site identifier — the dimension that lets one Sonor project\n // host many sites (e.g. truepowersystems.com + ohiopowerstudies.com under one\n // TPS project). Precedence lives in resolveSiteHost (shared contract):\n // explicit `analytics.site` > NEXT_PUBLIC_SITE_URL host > window.location.host.\n // Needed as a local too — SignalBridge and the analytics config read it below.\n const site = resolveSiteHost(analyticsConfig.site)\n\n // Seed the token manager + publish the window globals modules read from.\n // No-op on the server; runs during render so it lands before child effects.\n publishSiteCredential({ apiKey, apiUrl, site, debug, mapsBrowserKey })\n\n // Unified identity — single source of truth for all modules\n const [visitorId] = useState(() => getOrCreateVisitorId())\n const [sessionId] = useState(() => getOrCreateSessionId())\n\n // Page metadata bridge: Analytics writes, Signal reads\n const pageMetadataRef = useRef<Record<string, unknown> | null>(null)\n const onPageMetadata = useCallback((metadata: Record<string, unknown>) => {\n pageMetadataRef.current = metadata\n }, [])\n\n let content = <>{children}</>\n\n // Wrap with SignalBridge if enabled. Safe to wrap: the shell is SSR-safe\n // and renders children straight through — the heavy machinery mounts as a\n // childless sibling inside it. Not gated on modulesReady: experiment\n // variants must apply as early as possible.\n if (signal) {\n const signalConfig: SignalConfig =\n typeof signal === 'object' ? signal : {}\n content = (\n <SignalBridge\n enabled\n realtime={signalConfig.realtime !== false}\n experiments={signalConfig.experiments !== false}\n behaviorTracking={signalConfig.behaviorTracking !== false}\n visitorId={visitorId}\n sessionId={sessionId}\n pageMetadataRef={pageMetadataRef}\n >\n {content}\n </SignalBridge>\n )\n }\n\n // Add Analytics if enabled (renders alongside, doesn't wrap).\n //\n // CRITICAL: LazyAnalyticsProvider is dynamic(..., { ssr: false }). Wrapping\n // {content} inside an ssr:false component makes the entire page tree skip\n // server rendering — the route de-opts to 100% client rendering and the\n // hero / LCP element only paints after hydration (mobile LCP ~4s, Lighthouse\n // ~85). Analytics tracks via effects + a metadata ref, so it never needs to\n // wrap page content — mount it as a childless sibling, exactly like Engage.\n // Each deferred sibling is appended as `{modulesReady && <Module/>}` so the\n // children slot never moves in the tree — flipping ready only mounts the\n // sibling, it never remounts page content.\n if (analytics) {\n content = (\n <>\n {content}\n {modulesReady && (\n <Suspense fallback={null}>\n <LazyAnalyticsProvider\n apiUrl={apiUrl}\n apiKey={apiKey}\n site={site}\n trackPageViews={analyticsConfig.trackPageViews !== false}\n trackWebVitals={analyticsConfig.trackWebVitals !== false}\n trackScrollDepth={analyticsConfig.trackScrollDepth !== false}\n trackClicks={analyticsConfig.trackClicks !== false}\n sessionTimeout={analyticsConfig.sessionDuration}\n excludePaths={analyticsConfig.excludePaths}\n debug={debug}\n externalVisitorId={visitorId}\n externalSessionId={sessionId}\n onPageMetadata={onPageMetadata}\n />\n </Suspense>\n )}\n </>\n )\n }\n\n // Add Engage widget if enabled (renders alongside, doesn't wrap)\n if (engage) {\n const engageConfig: EngageConfig =\n typeof engage === 'object' ? engage : {}\n content = (\n <>\n {content}\n {modulesReady && (\n <LazyEngageWidget\n apiUrl={apiUrl}\n apiKey={apiKey}\n projectId={projectId}\n position={engageConfig.position || 'bottom-right'}\n zIndex={engageConfig.zIndex}\n chatEnabled={engageConfig.chatEnabled !== false}\n />\n )}\n </>\n )\n }\n\n // Add SitemapSync if enabled\n if (sitemapSync) {\n content = (\n <>\n {content}\n {modulesReady && <LazySitemapSync debug={debug} />}\n </>\n )\n }\n\n // Fleet heartbeat — childless sibling on the same modulesReady idle gate.\n // Reports the modules actually enabled on THIS layout (honest client-observable\n // set) so the platform can answer \"which version / modules is each site\n // running\". defer={false}: the modulesReady gate already handled deferral, so\n // the heartbeat fires on mount (still bounded to once per session internally).\n if (fleet) {\n const activeModules: FleetModule[] = []\n if (analytics) activeModules.push('analytics')\n if (engage) activeModules.push('engage')\n if (signal) activeModules.push('signal')\n if (sitemapSync) activeModules.push('sitemapSync')\n content = (\n <>\n {content}\n {modulesReady && (\n <FleetHeartbeat\n apiUrl={apiUrl}\n apiKey={apiKey}\n site={site}\n modules={activeModules}\n defer={false}\n debug={debug}\n />\n )}\n </>\n )\n }\n\n return (\n <SiteKitIdentityProvider visitorId={visitorId} sessionId={sessionId}>\n {content}\n </SiteKitIdentityProvider>\n )\n}\n"]}
@@ -3,7 +3,7 @@
3
3
 
4
4
  var chunkHMFFAUCD_js = require('./chunk-HMFFAUCD.js');
5
5
  var chunkXB57AM6T_js = require('./chunk-XB57AM6T.js');
6
- var chunkZQ2JTDPC_js = require('./chunk-ZQ2JTDPC.js');
6
+ var chunkAKBGYQLC_js = require('./chunk-AKBGYQLC.js');
7
7
  var react = require('react');
8
8
  var navigation = require('next/navigation');
9
9
  var jsxRuntime = require('react/jsx-runtime');
@@ -50,7 +50,7 @@ function WebVitals({ apiUrl: propApiUrl, apiKey: propApiKey, site: propSite, deb
50
50
  console.log("[Analytics] Web Vital:", data);
51
51
  }
52
52
  try {
53
- await chunkZQ2JTDPC_js.sonorFetch(
53
+ await chunkAKBGYQLC_js.sonorFetch(
54
54
  `${apiUrl}/api/public/analytics/web-vitals`,
55
55
  {
56
56
  method: "POST",
@@ -584,7 +584,7 @@ function AnalyticsProvider({
584
584
  return;
585
585
  }
586
586
  try {
587
- const response = await chunkZQ2JTDPC_js.sonorFetch(
587
+ const response = await chunkAKBGYQLC_js.sonorFetch(
588
588
  `${apiUrl}/api/public/seo/pages`,
589
589
  { method: "GET", headers: { "Content-Type": "application/json" } },
590
590
  { apiKey }
@@ -668,7 +668,7 @@ function AnalyticsProvider({
668
668
  console.log("[Analytics] Page view:", pageView);
669
669
  }
670
670
  try {
671
- const response = await chunkZQ2JTDPC_js.sonorFetch(
671
+ const response = await chunkAKBGYQLC_js.sonorFetch(
672
672
  `${apiUrl}/api/public/analytics/page-view`,
673
673
  {
674
674
  method: "POST",
@@ -758,7 +758,7 @@ function AnalyticsProvider({
758
758
  console.log("[Analytics] Journey step:", sessionData);
759
759
  }
760
760
  try {
761
- await chunkZQ2JTDPC_js.sonorFetch(
761
+ await chunkAKBGYQLC_js.sonorFetch(
762
762
  `${apiUrl}/api/public/analytics/session`,
763
763
  {
764
764
  method: "POST",
@@ -783,7 +783,7 @@ function AnalyticsProvider({
783
783
  previousPageDuration: Math.round((Date.now() - pageEnterTimeRef.current) / 1e3),
784
784
  previousPageScrollDepth: currentScrollDepthRef.current
785
785
  });
786
- chunkZQ2JTDPC_js.sonorBeacon(`${apiUrl}/api/public/analytics/session`, payload, apiKey);
786
+ chunkAKBGYQLC_js.sonorBeacon(`${apiUrl}/api/public/analytics/session`, payload, apiKey);
787
787
  };
788
788
  window.addEventListener("pagehide", handleUnload);
789
789
  return () => {
@@ -848,11 +848,11 @@ function AnalyticsProvider({
848
848
  deviceType: getDeviceType()
849
849
  });
850
850
  if (useBeacon) {
851
- chunkZQ2JTDPC_js.sonorBeacon(`${apiUrl}/api/public/analytics/scroll-depth`, payload, apiKey);
851
+ chunkAKBGYQLC_js.sonorBeacon(`${apiUrl}/api/public/analytics/scroll-depth`, payload, apiKey);
852
852
  if (debug) console.log("[Analytics] Scroll depth (beacon):", { maxDepth, totalTime });
853
853
  } else {
854
854
  try {
855
- await chunkZQ2JTDPC_js.sonorFetch(
855
+ await chunkAKBGYQLC_js.sonorFetch(
856
856
  `${apiUrl}/api/public/analytics/scroll-depth`,
857
857
  {
858
858
  method: "POST",
@@ -930,7 +930,7 @@ function AnalyticsProvider({
930
930
  if (debug) console.log("[Analytics] Click:", clickData);
931
931
  scheduleIdleTask(async () => {
932
932
  try {
933
- await chunkZQ2JTDPC_js.sonorFetch(
933
+ await chunkAKBGYQLC_js.sonorFetch(
934
934
  `${apiUrl}/api/public/analytics/heatmap-click`,
935
935
  {
936
936
  method: "POST",
@@ -973,7 +973,7 @@ function AnalyticsProvider({
973
973
  console.log("[Analytics] Event:", event);
974
974
  }
975
975
  try {
976
- const response = await chunkZQ2JTDPC_js.sonorFetch(
976
+ const response = await chunkAKBGYQLC_js.sonorFetch(
977
977
  `${apiUrl}/api/public/analytics/event`,
978
978
  {
979
979
  method: "POST",
@@ -1016,7 +1016,7 @@ function AnalyticsProvider({
1016
1016
  console.log("[Analytics] Conversion:", conversion);
1017
1017
  }
1018
1018
  try {
1019
- const response = await chunkZQ2JTDPC_js.sonorFetch(
1019
+ const response = await chunkAKBGYQLC_js.sonorFetch(
1020
1020
  `${apiUrl}/api/public/analytics/conversion`,
1021
1021
  {
1022
1022
  method: "POST",
@@ -1077,5 +1077,5 @@ exports.WebVitals = WebVitals;
1077
1077
  exports.useAnalytics = useAnalytics;
1078
1078
  exports.useAnalyticsOptional = useAnalyticsOptional;
1079
1079
  exports.useTrackEvent = useTrackEvent;
1080
- //# sourceMappingURL=chunk-GR4YKNFX.js.map
1081
- //# sourceMappingURL=chunk-GR4YKNFX.js.map
1080
+ //# sourceMappingURL=chunk-4NUHZ24M.js.map
1081
+ //# sourceMappingURL=chunk-4NUHZ24M.js.map