@sonordev/site-kit 5.6.0 → 5.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 (316) hide show
  1. package/agent-manifest.json +11 -3
  2. package/dist/AnalyticsProvider-EWF7JN2X.mjs +11 -0
  3. package/dist/{AnalyticsProvider-FVQIYSLY.mjs.map → AnalyticsProvider-EWF7JN2X.mjs.map} +1 -1
  4. package/dist/AnalyticsProvider-GJFG7YXA.js +32 -0
  5. package/dist/{AnalyticsProvider-6PXC7UDP.js.map → AnalyticsProvider-GJFG7YXA.js.map} +1 -1
  6. package/dist/{BlogViewTracker-S4HSRCW7.js → BlogViewTracker-2D3IJPJK.js} +6 -6
  7. package/dist/{BlogViewTracker-S4HSRCW7.js.map → BlogViewTracker-2D3IJPJK.js.map} +1 -1
  8. package/dist/{BlogViewTracker-ZUGLBOVI.mjs → BlogViewTracker-CKYG6MYU.mjs} +5 -5
  9. package/dist/{BlogViewTracker-ZUGLBOVI.mjs.map → BlogViewTracker-CKYG6MYU.mjs.map} +1 -1
  10. package/dist/ChatWidget-AWP6GBVW.js +22 -0
  11. package/dist/{ChatWidget-2TQWCXWP.js.map → ChatWidget-AWP6GBVW.js.map} +1 -1
  12. package/dist/ChatWidget-Z5QXDZP3.mjs +13 -0
  13. package/dist/{ChatWidget-DG52ZIE6.mjs.map → ChatWidget-Z5QXDZP3.mjs.map} +1 -1
  14. package/dist/EngageWidget-BKEY5TPO.mjs +12 -0
  15. package/dist/{EngageWidget-2VUJADIU.mjs.map → EngageWidget-BKEY5TPO.mjs.map} +1 -1
  16. package/dist/EngageWidget-VT4DYXVO.js +21 -0
  17. package/dist/{EngageWidget-Z7RC2INM.js.map → EngageWidget-VT4DYXVO.js.map} +1 -1
  18. package/dist/{FileField-UOQHL25J.js → FileField-62ZWZMQK.js} +6 -6
  19. package/dist/{FileField-UOQHL25J.js.map → FileField-62ZWZMQK.js.map} +1 -1
  20. package/dist/{FileField-FSQ7W3A5.mjs → FileField-JJN5QKDL.mjs} +5 -5
  21. package/dist/{FileField-FSQ7W3A5.mjs.map → FileField-JJN5QKDL.mjs.map} +1 -1
  22. package/dist/{FormSpotlight-RHL5FWM2.mjs → FormSpotlight-OTFB6QM5.mjs} +3 -3
  23. package/dist/{FormSpotlight-RHL5FWM2.mjs.map → FormSpotlight-OTFB6QM5.mjs.map} +1 -1
  24. package/dist/{FormSpotlight-TED32NHP.js → FormSpotlight-URS4XRS7.js} +15 -15
  25. package/dist/{FormSpotlight-TED32NHP.js.map → FormSpotlight-URS4XRS7.js.map} +1 -1
  26. package/dist/{FormStage-PFEBKHGY.js → FormStage-FVKMIV73.js} +13 -13
  27. package/dist/{FormStage-PFEBKHGY.js.map → FormStage-FVKMIV73.js.map} +1 -1
  28. package/dist/{FormStage-DINIRFOX.mjs → FormStage-VPGOCMAV.mjs} +3 -3
  29. package/dist/{FormStage-DINIRFOX.mjs.map → FormStage-VPGOCMAV.mjs.map} +1 -1
  30. package/dist/ManagedForm-CXVDJMHN.mjs +14 -0
  31. package/dist/{ManagedForm-545YAUFC.mjs.map → ManagedForm-CXVDJMHN.mjs.map} +1 -1
  32. package/dist/ManagedForm-FGNTDGED.js +23 -0
  33. package/dist/{ManagedForm-43WLCUAK.js.map → ManagedForm-FGNTDGED.js.map} +1 -1
  34. package/dist/{ManagedNewsletterForm-I3QN57HB.js → ManagedNewsletterForm-3O5L44AZ.js} +8 -8
  35. package/dist/{ManagedNewsletterForm-I3QN57HB.js.map → ManagedNewsletterForm-3O5L44AZ.js.map} +1 -1
  36. package/dist/{ManagedNewsletterForm-ZPY5RRKX.mjs → ManagedNewsletterForm-SQYB4BZU.mjs} +7 -7
  37. package/dist/{ManagedNewsletterForm-ZPY5RRKX.mjs.map → ManagedNewsletterForm-SQYB4BZU.mjs.map} +1 -1
  38. package/dist/{SignalCore-EEH5IM4U.mjs → SignalCore-M2PKKIGH.mjs} +5 -5
  39. package/dist/{SignalCore-EEH5IM4U.mjs.map → SignalCore-M2PKKIGH.mjs.map} +1 -1
  40. package/dist/{SignalCore-M4AXIMV4.js → SignalCore-RFBOBNLQ.js} +11 -11
  41. package/dist/{SignalCore-M4AXIMV4.js.map → SignalCore-RFBOBNLQ.js.map} +1 -1
  42. package/dist/SitemapSync-4OVMIIGC.mjs +9 -0
  43. package/dist/{SitemapSync-46G7LVZS.mjs.map → SitemapSync-4OVMIIGC.mjs.map} +1 -1
  44. package/dist/SitemapSync-RK3SQ4M2.js +18 -0
  45. package/dist/{SitemapSync-XK4JKCS7.js.map → SitemapSync-RK3SQ4M2.js.map} +1 -1
  46. package/dist/analytics/index.js +9 -9
  47. package/dist/analytics/index.mjs +4 -4
  48. package/dist/blog/index.js +20 -20
  49. package/dist/blog/index.mjs +3 -3
  50. package/dist/blog/metadata-images.test.d.ts +2 -0
  51. package/dist/blog/metadata-images.test.d.ts.map +1 -0
  52. package/dist/blog/server-core.d.ts +31 -6
  53. package/dist/blog/server-core.d.ts.map +1 -1
  54. package/dist/blog/server-ui.js +16 -16
  55. package/dist/blog/server-ui.mjs +3 -3
  56. package/dist/blog/server.d.ts +31 -6
  57. package/dist/blog/server.d.ts.map +1 -1
  58. package/dist/blog/server.js +40 -40
  59. package/dist/blog/server.mjs +1 -1
  60. package/dist/blog/static-params.test.d.ts +2 -0
  61. package/dist/blog/static-params.test.d.ts.map +1 -0
  62. package/dist/{chunk-XR32C47O.js → chunk-2N27LCZH.js} +5 -5
  63. package/dist/{chunk-XR32C47O.js.map → chunk-2N27LCZH.js.map} +1 -1
  64. package/dist/{chunk-GPLCPMVD.mjs → chunk-3CLP35TT.mjs} +7 -7
  65. package/dist/{chunk-GPLCPMVD.mjs.map → chunk-3CLP35TT.mjs.map} +1 -1
  66. package/dist/{chunk-S4RC6VAQ.js → chunk-3S5JN6KL.js} +6 -6
  67. package/dist/{chunk-S4RC6VAQ.js.map → chunk-3S5JN6KL.js.map} +1 -1
  68. package/dist/chunk-3UC6JETG.js +32 -0
  69. package/dist/chunk-3UC6JETG.js.map +1 -0
  70. package/dist/{chunk-B64AZC6P.js → chunk-3YQILJKJ.js} +14 -14
  71. package/dist/{chunk-B64AZC6P.js.map → chunk-3YQILJKJ.js.map} +1 -1
  72. package/dist/{chunk-7C7XO5HX.mjs → chunk-47XQWV4S.mjs} +3 -3
  73. package/dist/{chunk-7C7XO5HX.mjs.map → chunk-47XQWV4S.mjs.map} +1 -1
  74. package/dist/{chunk-CQS5ZYI6.mjs → chunk-4A5V73SR.mjs} +8 -8
  75. package/dist/{chunk-CQS5ZYI6.mjs.map → chunk-4A5V73SR.mjs.map} +1 -1
  76. package/dist/{chunk-53KMRZT7.js → chunk-4UVM7E2W.js} +3 -3
  77. package/dist/{chunk-53KMRZT7.js.map → chunk-4UVM7E2W.js.map} +1 -1
  78. package/dist/{chunk-YYN4YZYZ.js → chunk-4WBTM6YE.js} +4 -4
  79. package/dist/{chunk-YYN4YZYZ.js.map → chunk-4WBTM6YE.js.map} +1 -1
  80. package/dist/{chunk-VHZ4LHQT.mjs → chunk-57AFHENV.mjs} +3 -3
  81. package/dist/{chunk-VHZ4LHQT.mjs.map → chunk-57AFHENV.mjs.map} +1 -1
  82. package/dist/chunk-5TXXTYXL.js +8 -0
  83. package/dist/{chunk-KSL3WA2I.js.map → chunk-5TXXTYXL.js.map} +1 -1
  84. package/dist/{chunk-RU54J2PY.mjs → chunk-6FC5Q4KU.mjs} +3 -3
  85. package/dist/{chunk-RU54J2PY.mjs.map → chunk-6FC5Q4KU.mjs.map} +1 -1
  86. package/dist/{chunk-AHZR4VGY.mjs → chunk-7ZX6TO6C.mjs} +4 -4
  87. package/dist/{chunk-AHZR4VGY.mjs.map → chunk-7ZX6TO6C.mjs.map} +1 -1
  88. package/dist/{chunk-K2V3ZW36.mjs → chunk-ABZGEHTC.mjs} +3 -3
  89. package/dist/{chunk-K2V3ZW36.mjs.map → chunk-ABZGEHTC.mjs.map} +1 -1
  90. package/dist/chunk-AWK57R5S.mjs +29 -0
  91. package/dist/chunk-AWK57R5S.mjs.map +1 -0
  92. package/dist/{chunk-EEQYKMGH.mjs → chunk-BFJOZ3MU.mjs} +23 -17
  93. package/dist/chunk-BFJOZ3MU.mjs.map +1 -0
  94. package/dist/{chunk-KY6M76JW.js → chunk-BFM5PEFV.js} +3 -3
  95. package/dist/{chunk-KY6M76JW.js.map → chunk-BFM5PEFV.js.map} +1 -1
  96. package/dist/{chunk-JNABXCLY.mjs → chunk-BQGEVMIR.mjs} +4 -4
  97. package/dist/{chunk-JNABXCLY.mjs.map → chunk-BQGEVMIR.mjs.map} +1 -1
  98. package/dist/{chunk-5KIEZHVK.mjs → chunk-BUJWXSYZ.mjs} +4 -4
  99. package/dist/{chunk-5KIEZHVK.mjs.map → chunk-BUJWXSYZ.mjs.map} +1 -1
  100. package/dist/{chunk-B6O7D5U4.js → chunk-C4PZ2R3B.js} +10 -10
  101. package/dist/{chunk-B6O7D5U4.js.map → chunk-C4PZ2R3B.js.map} +1 -1
  102. package/dist/{chunk-5UFDHGFE.mjs → chunk-C563AHZZ.mjs} +3 -3
  103. package/dist/{chunk-5UFDHGFE.mjs.map → chunk-C563AHZZ.mjs.map} +1 -1
  104. package/dist/{chunk-746RKQHA.js → chunk-CPY74A4F.js} +23 -17
  105. package/dist/chunk-CPY74A4F.js.map +1 -0
  106. package/dist/{chunk-N2PGTPWN.js → chunk-D553G64G.js} +11 -11
  107. package/dist/{chunk-N2PGTPWN.js.map → chunk-D553G64G.js.map} +1 -1
  108. package/dist/{chunk-KPKQKFT4.js → chunk-DOB37PV4.js} +3 -3
  109. package/dist/{chunk-KPKQKFT4.js.map → chunk-DOB37PV4.js.map} +1 -1
  110. package/dist/{chunk-H3D3ZGOJ.js → chunk-ELQ4SRRR.js} +15 -15
  111. package/dist/{chunk-H3D3ZGOJ.js.map → chunk-ELQ4SRRR.js.map} +1 -1
  112. package/dist/{chunk-X5TCH7VZ.js → chunk-F3AKYZOH.js} +3 -3
  113. package/dist/{chunk-X5TCH7VZ.js.map → chunk-F3AKYZOH.js.map} +1 -1
  114. package/dist/{chunk-LCSYJXIO.mjs → chunk-FBDHKYNF.mjs} +3 -3
  115. package/dist/{chunk-LCSYJXIO.mjs.map → chunk-FBDHKYNF.mjs.map} +1 -1
  116. package/dist/{chunk-JE5DWAE6.js → chunk-FEWWGEQF.js} +4 -4
  117. package/dist/{chunk-JE5DWAE6.js.map → chunk-FEWWGEQF.js.map} +1 -1
  118. package/dist/{chunk-NZSFOZJV.js → chunk-FO4KGPGF.js} +2 -2
  119. package/dist/{chunk-NZSFOZJV.js.map → chunk-FO4KGPGF.js.map} +1 -1
  120. package/dist/{chunk-OC7AO7XS.js → chunk-H65OX263.js} +15 -15
  121. package/dist/{chunk-OC7AO7XS.js.map → chunk-H65OX263.js.map} +1 -1
  122. package/dist/{chunk-46BMNWE6.js → chunk-H6YVT3BL.js} +2 -2
  123. package/dist/{chunk-46BMNWE6.js.map → chunk-H6YVT3BL.js.map} +1 -1
  124. package/dist/{chunk-GJ6NOLGC.mjs → chunk-HBN4A2N4.mjs} +3 -3
  125. package/dist/{chunk-GJ6NOLGC.mjs.map → chunk-HBN4A2N4.mjs.map} +1 -1
  126. package/dist/{chunk-AJQI3WTN.mjs → chunk-ILNCUSXW.mjs} +2 -2
  127. package/dist/{chunk-AJQI3WTN.mjs.map → chunk-ILNCUSXW.mjs.map} +1 -1
  128. package/dist/{chunk-473WDGQZ.mjs → chunk-JNAXDFC4.mjs} +3 -3
  129. package/dist/{chunk-473WDGQZ.mjs.map → chunk-JNAXDFC4.mjs.map} +1 -1
  130. package/dist/{chunk-7AUDKXY5.mjs → chunk-JQ7M6CVL.mjs} +3 -3
  131. package/dist/{chunk-7AUDKXY5.mjs.map → chunk-JQ7M6CVL.mjs.map} +1 -1
  132. package/dist/{chunk-BZLIOT7Q.js → chunk-JTCQJKJE.js} +18 -18
  133. package/dist/{chunk-BZLIOT7Q.js.map → chunk-JTCQJKJE.js.map} +1 -1
  134. package/dist/{chunk-OA7KKOAK.mjs → chunk-JTF4DFUF.mjs} +3 -3
  135. package/dist/{chunk-OA7KKOAK.mjs.map → chunk-JTF4DFUF.mjs.map} +1 -1
  136. package/dist/{chunk-5KIO6FXE.js → chunk-KXGD4E7G.js} +5 -5
  137. package/dist/{chunk-5KIO6FXE.js.map → chunk-KXGD4E7G.js.map} +1 -1
  138. package/dist/chunk-L4V6TKMJ.mjs +94 -0
  139. package/dist/chunk-L4V6TKMJ.mjs.map +1 -0
  140. package/dist/{chunk-DHIWR7CG.js → chunk-L7ACQ6PC.js} +4 -4
  141. package/dist/{chunk-DHIWR7CG.js.map → chunk-L7ACQ6PC.js.map} +1 -1
  142. package/dist/{chunk-RIYAMYLV.mjs → chunk-M5GY2AI3.mjs} +3 -3
  143. package/dist/{chunk-RIYAMYLV.mjs.map → chunk-M5GY2AI3.mjs.map} +1 -1
  144. package/dist/{chunk-YCI36ZUS.mjs → chunk-MW2M6O7A.mjs} +4 -4
  145. package/dist/{chunk-YCI36ZUS.mjs.map → chunk-MW2M6O7A.mjs.map} +1 -1
  146. package/dist/{chunk-BWSMUSDB.js → chunk-NOU3JQJK.js} +8 -8
  147. package/dist/{chunk-BWSMUSDB.js.map → chunk-NOU3JQJK.js.map} +1 -1
  148. package/dist/{chunk-IYCLN3XS.mjs → chunk-O2VJZOR2.mjs} +3 -3
  149. package/dist/{chunk-IYCLN3XS.mjs.map → chunk-O2VJZOR2.mjs.map} +1 -1
  150. package/dist/{chunk-T5VTQUNF.js → chunk-OYOO2OO5.js} +8 -8
  151. package/dist/{chunk-T5VTQUNF.js.map → chunk-OYOO2OO5.js.map} +1 -1
  152. package/dist/chunk-P4TB4ROG.js +110 -0
  153. package/dist/chunk-P4TB4ROG.js.map +1 -0
  154. package/dist/{chunk-6OP5XSMM.mjs → chunk-Q7347KP6.mjs} +3 -3
  155. package/dist/{chunk-6OP5XSMM.mjs.map → chunk-Q7347KP6.mjs.map} +1 -1
  156. package/dist/chunk-QRBPT6Z6.mjs +6 -0
  157. package/dist/{chunk-DQUBETXH.mjs.map → chunk-QRBPT6Z6.mjs.map} +1 -1
  158. package/dist/{chunk-USKIL6V6.mjs → chunk-R2SXXFXZ.mjs} +3 -3
  159. package/dist/{chunk-USKIL6V6.mjs.map → chunk-R2SXXFXZ.mjs.map} +1 -1
  160. package/dist/{chunk-UU47DGHE.js → chunk-RCSTDJUH.js} +5 -5
  161. package/dist/{chunk-UU47DGHE.js.map → chunk-RCSTDJUH.js.map} +1 -1
  162. package/dist/{chunk-SYGGZZMU.js → chunk-RNAGCAIB.js} +7 -7
  163. package/dist/{chunk-SYGGZZMU.js.map → chunk-RNAGCAIB.js.map} +1 -1
  164. package/dist/{chunk-AEARU24Q.mjs → chunk-RVRN5U7W.mjs} +2 -2
  165. package/dist/{chunk-AEARU24Q.mjs.map → chunk-RVRN5U7W.mjs.map} +1 -1
  166. package/dist/{chunk-C2MSD2UM.mjs → chunk-TDJKGN5Q.mjs} +4 -4
  167. package/dist/{chunk-C2MSD2UM.mjs.map → chunk-TDJKGN5Q.mjs.map} +1 -1
  168. package/dist/{chunk-R3KTBKSW.js → chunk-TSZIACRC.js} +4 -4
  169. package/dist/{chunk-R3KTBKSW.js.map → chunk-TSZIACRC.js.map} +1 -1
  170. package/dist/{chunk-H44XZUOV.mjs → chunk-UQ5YULFU.mjs} +4 -4
  171. package/dist/{chunk-H44XZUOV.mjs.map → chunk-UQ5YULFU.mjs.map} +1 -1
  172. package/dist/{chunk-QNPVVWR7.mjs → chunk-V5THCFPG.mjs} +3 -3
  173. package/dist/{chunk-QNPVVWR7.mjs.map → chunk-V5THCFPG.mjs.map} +1 -1
  174. package/dist/{chunk-CQRLKNHQ.js → chunk-VFGEY6FJ.js} +12 -12
  175. package/dist/{chunk-CQRLKNHQ.js.map → chunk-VFGEY6FJ.js.map} +1 -1
  176. package/dist/{chunk-HIHAXEPD.mjs → chunk-XLPU3TEE.mjs} +4 -4
  177. package/dist/{chunk-HIHAXEPD.mjs.map → chunk-XLPU3TEE.mjs.map} +1 -1
  178. package/dist/{chunk-AY7JBGYC.js → chunk-YKUEFRZI.js} +14 -14
  179. package/dist/{chunk-AY7JBGYC.js.map → chunk-YKUEFRZI.js.map} +1 -1
  180. package/dist/{chunk-XK5AIWQG.js → chunk-YYDZ2TYR.js} +3 -3
  181. package/dist/{chunk-XK5AIWQG.js.map → chunk-YYDZ2TYR.js.map} +1 -1
  182. package/dist/cli/agent/checks.d.ts.map +1 -1
  183. package/dist/cli/commands/api-routes.d.ts.map +1 -1
  184. package/dist/cli/commands/geo.d.ts +4 -0
  185. package/dist/cli/commands/geo.d.ts.map +1 -1
  186. package/dist/cli/commands/geo.test.d.ts +2 -0
  187. package/dist/cli/commands/geo.test.d.ts.map +1 -0
  188. package/dist/cli/commands/og.d.ts +10 -1
  189. package/dist/cli/commands/og.d.ts.map +1 -1
  190. package/dist/cli/commands/scaffold.d.ts +1 -2
  191. package/dist/cli/commands/scaffold.d.ts.map +1 -1
  192. package/dist/cli/commands/sync.d.ts.map +1 -1
  193. package/dist/cli/generators/index.d.ts +5 -0
  194. package/dist/cli/generators/index.d.ts.map +1 -1
  195. package/dist/cli/generators/index.test.d.ts +2 -0
  196. package/dist/cli/generators/index.test.d.ts.map +1 -0
  197. package/dist/cli/index.js +360 -266
  198. package/dist/cli/index.js.map +1 -1
  199. package/dist/cli/index.mjs +356 -262
  200. package/dist/cli/index.mjs.map +1 -1
  201. package/dist/client/index.js +4 -4
  202. package/dist/client/index.mjs +3 -3
  203. package/dist/commerce/index.js +56 -56
  204. package/dist/commerce/index.mjs +5 -5
  205. package/dist/discover-FGTKWOL3.mjs +4 -0
  206. package/dist/{discover-BEJRYNFF.mjs.map → discover-FGTKWOL3.mjs.map} +1 -1
  207. package/dist/discover-NJZPWTDL.js +21 -0
  208. package/dist/{discover-WVDYDUJX.js.map → discover-NJZPWTDL.js.map} +1 -1
  209. package/dist/engage/index.js +10 -10
  210. package/dist/engage/index.mjs +7 -7
  211. package/dist/fleet/index.js +8 -8
  212. package/dist/fleet/index.mjs +4 -4
  213. package/dist/forms/index.js +16 -16
  214. package/dist/forms/index.mjs +9 -9
  215. package/dist/forms/server.js +10 -10
  216. package/dist/forms/server.mjs +8 -8
  217. package/dist/forms/static.js +7 -7
  218. package/dist/forms/static.mjs +6 -6
  219. package/dist/images/index.js +11 -11
  220. package/dist/images/index.mjs +4 -4
  221. package/dist/index.js +68 -68
  222. package/dist/index.mjs +10 -10
  223. package/dist/layout/client.js +8 -8
  224. package/dist/layout/client.mjs +7 -7
  225. package/dist/layout/index.js +10 -10
  226. package/dist/layout/index.mjs +8 -8
  227. package/dist/llms/aiRobots.d.ts +4 -1
  228. package/dist/llms/aiRobots.d.ts.map +1 -1
  229. package/dist/llms/handlers.d.ts +20 -2
  230. package/dist/llms/handlers.d.ts.map +1 -1
  231. package/dist/llms/index.js +25 -18
  232. package/dist/llms/index.js.map +1 -1
  233. package/dist/llms/index.mjs +15 -8
  234. package/dist/llms/index.mjs.map +1 -1
  235. package/dist/llms/wiring.d.ts +81 -0
  236. package/dist/llms/wiring.d.ts.map +1 -0
  237. package/dist/llms/wiring.test.d.ts +2 -0
  238. package/dist/llms/wiring.test.d.ts.map +1 -0
  239. package/dist/maps/index.js +5 -5
  240. package/dist/maps/index.mjs +3 -3
  241. package/dist/og/wiring.d.ts +5 -1
  242. package/dist/og/wiring.d.ts.map +1 -1
  243. package/dist/proxy/index.d.ts +16 -11
  244. package/dist/proxy/index.d.ts.map +1 -1
  245. package/dist/proxy/index.js +3 -3
  246. package/dist/proxy/index.js.map +1 -1
  247. package/dist/proxy/index.mjs +1 -1
  248. package/dist/proxy/index.mjs.map +1 -1
  249. package/dist/redirects/index.d.ts +1 -1
  250. package/dist/redirects/index.js +8 -8
  251. package/dist/redirects/index.mjs +1 -1
  252. package/dist/redirects/not-found.d.ts +14 -29
  253. package/dist/redirects/not-found.d.ts.map +1 -1
  254. package/dist/redirects/not-found.js +12 -5
  255. package/dist/redirects/not-found.js.map +1 -1
  256. package/dist/redirects/not-found.mjs +8 -1
  257. package/dist/redirects/not-found.mjs.map +1 -1
  258. package/dist/robots/index.d.ts +5 -1
  259. package/dist/robots/index.d.ts.map +1 -1
  260. package/dist/robots/index.js +7 -1
  261. package/dist/robots/index.js.map +1 -1
  262. package/dist/robots/index.mjs +4 -1
  263. package/dist/robots/index.mjs.map +1 -1
  264. package/dist/robots/index.test.d.ts +2 -0
  265. package/dist/robots/index.test.d.ts.map +1 -0
  266. package/dist/robots/next-internals.d.ts +22 -0
  267. package/dist/robots/next-internals.d.ts.map +1 -0
  268. package/dist/search/index.js +4 -4
  269. package/dist/search/index.mjs +3 -3
  270. package/dist/seo/client.js +5 -5
  271. package/dist/seo/client.mjs +4 -4
  272. package/dist/seo/index.js +14 -14
  273. package/dist/seo/index.mjs +6 -6
  274. package/dist/seo/register-sitemap-cli.js +4 -4
  275. package/dist/seo/register-sitemap-cli.mjs +1 -1
  276. package/dist/seo/server.js +5 -5
  277. package/dist/seo/server.mjs +1 -1
  278. package/dist/server/index.js +3 -3
  279. package/dist/server/index.mjs +2 -2
  280. package/dist/shared/next-files.d.ts +35 -0
  281. package/dist/shared/next-files.d.ts.map +1 -0
  282. package/dist/shared/next-files.test.d.ts +2 -0
  283. package/dist/shared/next-files.test.d.ts.map +1 -0
  284. package/dist/shared/version.d.ts +1 -1
  285. package/dist/signal/index.js +11 -11
  286. package/dist/signal/index.mjs +2 -2
  287. package/dist/sitemap/discover.d.ts.map +1 -1
  288. package/dist/sitemap/index.d.ts +6 -1
  289. package/dist/sitemap/index.d.ts.map +1 -1
  290. package/dist/sitemap/index.js +5 -12
  291. package/dist/sitemap/index.js.map +1 -1
  292. package/dist/sitemap/index.mjs +4 -11
  293. package/dist/sitemap/index.mjs.map +1 -1
  294. package/dist/sync/index.js +17 -17
  295. package/dist/sync/index.mjs +4 -4
  296. package/package.json +19 -21
  297. package/dist/AnalyticsProvider-6PXC7UDP.js +0 -32
  298. package/dist/AnalyticsProvider-FVQIYSLY.mjs +0 -11
  299. package/dist/ChatWidget-2TQWCXWP.js +0 -22
  300. package/dist/ChatWidget-DG52ZIE6.mjs +0 -13
  301. package/dist/EngageWidget-2VUJADIU.mjs +0 -12
  302. package/dist/EngageWidget-Z7RC2INM.js +0 -21
  303. package/dist/ManagedForm-43WLCUAK.js +0 -23
  304. package/dist/ManagedForm-545YAUFC.mjs +0 -14
  305. package/dist/SitemapSync-46G7LVZS.mjs +0 -9
  306. package/dist/SitemapSync-XK4JKCS7.js +0 -18
  307. package/dist/chunk-746RKQHA.js.map +0 -1
  308. package/dist/chunk-DQUBETXH.mjs +0 -6
  309. package/dist/chunk-EEQYKMGH.mjs.map +0 -1
  310. package/dist/chunk-KSL3WA2I.js +0 -8
  311. package/dist/chunk-LOS5D6B3.js +0 -72
  312. package/dist/chunk-LOS5D6B3.js.map +0 -1
  313. package/dist/chunk-XIJ4F6IE.mjs +0 -63
  314. package/dist/chunk-XIJ4F6IE.mjs.map +0 -1
  315. package/dist/discover-BEJRYNFF.mjs +0 -4
  316. package/dist/discover-WVDYDUJX.js +0 -21
@@ -0,0 +1,110 @@
1
+ 'use strict';
2
+
3
+ var fs2 = require('fs');
4
+ var path = require('path');
5
+
6
+ function _interopDefault (e) { return e && e.__esModule ? e : { default: e }; }
7
+
8
+ var fs2__default = /*#__PURE__*/_interopDefault(fs2);
9
+ var path__default = /*#__PURE__*/_interopDefault(path);
10
+
11
+ // src/sitemap/discover.ts
12
+ var NEXT_APP_DIRS = ["app", path__default.default.join("src", "app")];
13
+ var NEXT_SOURCE_EXTENSIONS = ["tsx", "ts", "jsx", "js"];
14
+ var NEXT_PROXY_FILES = ["proxy.ts", "proxy.js", "src/proxy.ts", "src/proxy.js"];
15
+ var NEXT_MIDDLEWARE_FILES = ["middleware.ts", "middleware.js", "src/middleware.ts", "src/middleware.js"];
16
+ function safeExists(p) {
17
+ try {
18
+ return fs2__default.default.existsSync(p);
19
+ } catch {
20
+ return false;
21
+ }
22
+ }
23
+ function findConventionFile(dir, basename) {
24
+ for (const ext of NEXT_SOURCE_EXTENSIONS) {
25
+ const file = path__default.default.join(dir, `${basename}.${ext}`);
26
+ if (safeExists(file)) return file;
27
+ }
28
+ return null;
29
+ }
30
+ function hasPageFile(dir) {
31
+ return findConventionFile(dir, "page") !== null;
32
+ }
33
+ function findRootLayout(cwd) {
34
+ for (const rel of NEXT_APP_DIRS) {
35
+ const found = findConventionFile(path__default.default.join(cwd, rel), "layout");
36
+ if (found) return found;
37
+ }
38
+ return null;
39
+ }
40
+ function findProxyFiles(cwd) {
41
+ return [...NEXT_PROXY_FILES, ...NEXT_MIDDLEWARE_FILES].filter((rel) => safeExists(path__default.default.join(cwd, rel)));
42
+ }
43
+
44
+ // src/sitemap/discover.ts
45
+ var SITEMAP_ROUTE_EXTENSIONS = ["ts", "tsx", "js", "jsx", "mjs"];
46
+ function findAppDirForDiscovery(cwd = process.cwd()) {
47
+ for (const candidate of NEXT_APP_DIRS) {
48
+ const abs = path__default.default.join(cwd, candidate);
49
+ if (fs2__default.default.existsSync(abs)) return abs;
50
+ }
51
+ return null;
52
+ }
53
+ function findSitemapRoute(cwd = process.cwd()) {
54
+ for (const dir of NEXT_APP_DIRS) {
55
+ for (const ext of SITEMAP_ROUTE_EXTENSIONS) {
56
+ const rel = path__default.default.join(dir, `sitemap.${ext}`);
57
+ if (fs2__default.default.existsSync(path__default.default.join(cwd, rel))) return rel;
58
+ }
59
+ }
60
+ return null;
61
+ }
62
+ function discoverNextJsRoutes(appDir, basePath = "") {
63
+ const entries = [];
64
+ const items = fs2__default.default.readdirSync(appDir, { withFileTypes: true });
65
+ for (const item of items) {
66
+ if (item.name.startsWith("_") || item.name.startsWith(".")) continue;
67
+ if (item.name === "api") continue;
68
+ if (item.name === "node_modules") continue;
69
+ const itemPath = path__default.default.join(appDir, item.name);
70
+ if (item.isDirectory()) {
71
+ const hasPage = hasPageFile(itemPath);
72
+ const isRouteGroup = item.name.startsWith("(") && item.name.endsWith(")");
73
+ const isDynamic = item.name.startsWith("[") && item.name.endsWith("]");
74
+ let routePath = basePath;
75
+ if (!isRouteGroup && !isDynamic) {
76
+ routePath = `${basePath}/${item.name}`;
77
+ }
78
+ if (hasPage && !isDynamic) {
79
+ const priority = routePath === "" ? 1 : 0.8;
80
+ entries.push({ path: routePath || "/", priority });
81
+ }
82
+ if (!isDynamic) {
83
+ const subEntries = discoverNextJsRoutes(
84
+ itemPath,
85
+ isRouteGroup ? basePath : routePath
86
+ );
87
+ entries.push(...subEntries);
88
+ }
89
+ }
90
+ }
91
+ if (basePath === "") {
92
+ if (hasPageFile(appDir)) {
93
+ entries.unshift({ path: "/", priority: 1 });
94
+ }
95
+ }
96
+ return entries;
97
+ }
98
+
99
+ exports.NEXT_APP_DIRS = NEXT_APP_DIRS;
100
+ exports.NEXT_MIDDLEWARE_FILES = NEXT_MIDDLEWARE_FILES;
101
+ exports.NEXT_PROXY_FILES = NEXT_PROXY_FILES;
102
+ exports.discoverNextJsRoutes = discoverNextJsRoutes;
103
+ exports.findAppDirForDiscovery = findAppDirForDiscovery;
104
+ exports.findConventionFile = findConventionFile;
105
+ exports.findProxyFiles = findProxyFiles;
106
+ exports.findRootLayout = findRootLayout;
107
+ exports.findSitemapRoute = findSitemapRoute;
108
+ exports.hasPageFile = hasPageFile;
109
+ //# sourceMappingURL=chunk-P4TB4ROG.js.map
110
+ //# sourceMappingURL=chunk-P4TB4ROG.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/shared/next-files.ts","../src/sitemap/discover.ts"],"names":["path","fs"],"mappings":"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","file":"chunk-P4TB4ROG.js","sourcesContent":["/**\n * @sonordev/site-kit — where a Next.js project keeps its convention files.\n *\n * SINGLE SOURCE OF TRUTH for \"find the root layout / a page / the proxy\". Each\n * CLI check used to carry its own candidate list, and the lists drifted: the OG\n * wiring rule only looked for `app/layout.tsx`, so `doctor` told a site whose\n * root layout is `app/layout.jsx` (heinrich-law-nextjs, 2026-09-14) that it had\n * no layout at all. `geo` knew about `.jsx` but not `src/app`, and none of them\n * knew about `proxy.ts`. Route every lookup through here; never re-fork a list.\n *\n * Node-only (fs/path): never import from browser or client code.\n */\n\nimport fs from 'fs'\nimport path from 'path'\n\n/** App-directory candidates, in Next's resolution order (`app/` wins over `src/app/`). */\nexport const NEXT_APP_DIRS = ['app', path.join('src', 'app')]\n\n/**\n * Extensions Next resolves for convention files (`layout`, `page`, `route`,\n * `opengraph-image`) under the default `pageExtensions`.\n */\nexport const NEXT_SOURCE_EXTENSIONS = ['tsx', 'ts', 'jsx', 'js']\n\n/**\n * Next 16 Proxy files. The proxy lives at the project root, or in `src/` when\n * the app directory does, beside `src/app`.\n */\nexport const NEXT_PROXY_FILES = ['proxy.ts', 'proxy.js', 'src/proxy.ts', 'src/proxy.js']\n\n/** The pre-16 name for the same file. Still builds; deprecated. */\nexport const NEXT_MIDDLEWARE_FILES = ['middleware.ts', 'middleware.js', 'src/middleware.ts', 'src/middleware.js']\n\nfunction safeExists(p: string): boolean {\n try {\n return fs.existsSync(p)\n } catch {\n return false\n }\n}\n\n/** `dir/<basename>.<ext>` for the first extension that exists, or null. */\nexport function findConventionFile(dir: string, basename: string): string | null {\n for (const ext of NEXT_SOURCE_EXTENSIONS) {\n const file = path.join(dir, `${basename}.${ext}`)\n if (safeExists(file)) return file\n }\n return null\n}\n\n/** True when `dir` holds a `page.{tsx,ts,jsx,js}`. */\nexport function hasPageFile(dir: string): boolean {\n return findConventionFile(dir, 'page') !== null\n}\n\n/** Absolute path of the root layout (`app/layout.*`, then `src/app/layout.*`), or null. */\nexport function findRootLayout(cwd: string): string | null {\n for (const rel of NEXT_APP_DIRS) {\n const found = findConventionFile(path.join(cwd, rel), 'layout')\n if (found) return found\n }\n return null\n}\n\n/** Project-relative paths of every proxy and middleware file present, proxy first. */\nexport function findProxyFiles(cwd: string): string[] {\n return [...NEXT_PROXY_FILES, ...NEXT_MIDDLEWARE_FILES].filter(rel => safeExists(path.join(cwd, rel)))\n}\n","/**\n * @sonordev/site-kit — Node-only filesystem discovery for the sitemap CLI\n *\n * Single source of truth for the build-time filesystem scan used by\n * `registerLocalSitemap` (both the standalone CLI impl and the server routing\n * helper used to keep their own byte-drifting copies of `discoverNextJsRoutes`).\n *\n * Plus `findSitemapRoute` — the guard that makes `--auto-discover` safe to leave\n * in any site's `postbuild`.\n *\n * IMPORTANT — why a filesystem scan must never drive a `full-replace`:\n * a scan of `app/` can only see STATIC route segments. It structurally cannot\n * enumerate the params of a dynamic route (`/work/[slug]`, `/blog/[cat]/[id]`),\n * and it ignores the app's sitemap `exclude` config. So the route set it\n * produces is always a strict, incomplete SUBSET of the real page set. Feeding\n * that incomplete set to a `full-replace` sync tells the API to DELETE every\n * page that isn't in it — i.e. every dynamic page, plus anything the app\n * intentionally excluded. When a site also has an `app/sitemap.{ts,js}` (which\n * `createSitemap` syncs as an authoritative full-replace), the two syncs delete\n * and recreate each other's rows on every build (the sitemap-oscillation bug),\n * destroying managed metadata, Signal optimizations, LLM schemas, and GSC\n * history on real pages. Hence: auto-discover is additive by default, and skips\n * entirely when a sitemap route already exists.\n *\n * Node built-ins (`fs`/`path`) only — never import this from browser/client code.\n */\n\nimport fs from 'fs'\nimport path from 'path'\n// App-dir order and page extensions are shared with the OG/doctor/geo checks.\nimport { NEXT_APP_DIRS as APP_DIR_CANDIDATES, hasPageFile } from '../shared/next-files'\n\n/** Extensions a Next.js `sitemap` route file can use. */\nconst SITEMAP_ROUTE_EXTENSIONS = ['ts', 'tsx', 'js', 'jsx', 'mjs']\n\n/**\n * Return the app directory (absolute path) that exists under `cwd`, or null.\n * Prefers `app/`, then `src/app/`.\n */\nexport function findAppDirForDiscovery(cwd: string = process.cwd()): string | null {\n for (const candidate of APP_DIR_CANDIDATES) {\n const abs = path.join(cwd, candidate)\n if (fs.existsSync(abs)) return abs\n }\n return null\n}\n\n/**\n * Detect a Next.js `sitemap` route file (`app/sitemap.{ts,tsx,js,jsx,mjs}` or\n * `src/app/sitemap.*`). Returns the project-relative path if found, else null.\n *\n * Presence of this file means the framework already emits `/sitemap.xml` — the\n * authoritative page set — and site-kit's runtime `SitemapSync` syncs that real\n * sitemap (dynamic routes and all) additively. In that world an `--auto-discover`\n * filesystem scan is both inferior and dangerous (see the module header), so the\n * CLI skips.\n */\nexport function findSitemapRoute(cwd: string = process.cwd()): string | null {\n for (const dir of APP_DIR_CANDIDATES) {\n for (const ext of SITEMAP_ROUTE_EXTENSIONS) {\n const rel = path.join(dir, `sitemap.${ext}`)\n if (fs.existsSync(path.join(cwd, rel))) return rel\n }\n }\n return null\n}\n\n/**\n * Recursively discover STATIC Next.js routes from an app directory.\n *\n * Intentionally skips dynamic segments (`[slug]`) — they can't be enumerated\n * from disk — which is exactly why the result is incomplete and must only ever\n * drive an additive sync. Route groups `(marketing)` are folded out of the URL.\n */\nexport function discoverNextJsRoutes(\n appDir: string,\n basePath: string = '',\n): Array<{ path: string; priority: number }> {\n const entries: Array<{ path: string; priority: number }> = []\n\n const items = fs.readdirSync(appDir, { withFileTypes: true })\n\n for (const item of items) {\n if (item.name.startsWith('_') || item.name.startsWith('.')) continue\n if (item.name === 'api') continue\n if (item.name === 'node_modules') continue\n\n const itemPath = path.join(appDir, item.name)\n\n if (item.isDirectory()) {\n const hasPage = hasPageFile(itemPath)\n\n const isRouteGroup = item.name.startsWith('(') && item.name.endsWith(')')\n const isDynamic = item.name.startsWith('[') && item.name.endsWith(']')\n\n let routePath = basePath\n if (!isRouteGroup && !isDynamic) {\n routePath = `${basePath}/${item.name}`\n }\n\n if (hasPage && !isDynamic) {\n const priority = routePath === '' ? 1.0 : 0.8\n entries.push({ path: routePath || '/', priority })\n }\n\n if (!isDynamic) {\n const subEntries = discoverNextJsRoutes(\n itemPath,\n isRouteGroup ? basePath : routePath,\n )\n entries.push(...subEntries)\n }\n }\n }\n\n if (basePath === '') {\n if (hasPageFile(appDir)) {\n entries.unshift({ path: '/', priority: 1.0 })\n }\n }\n\n return entries\n}\n"]}
@@ -26,7 +26,7 @@ function useFieldControls(fields) {
26
26
  }
27
27
  if (needsFile && !requested.current.file) {
28
28
  requested.current.file = true;
29
- import('./FileField-FSQ7W3A5.mjs').then((m) => {
29
+ import('./FileField-JJN5QKDL.mjs').then((m) => {
30
30
  if (!cancelled) setControls((prev) => ({ ...prev, File: m.FileField }));
31
31
  }).catch(() => {
32
32
  requested.current.file = false;
@@ -134,5 +134,5 @@ function formatAnswer(value) {
134
134
  var AUTO_ADVANCE_TYPES = ["radio", "select", "rating"];
135
135
 
136
136
  export { AUTO_ADVANCE_TYPES, countStageQuestions, countStageViews, formatAnswer, isEmptyValue, stageEstimate, stageFirstName, stageViews, useFieldControls };
137
- //# sourceMappingURL=chunk-6OP5XSMM.mjs.map
138
- //# sourceMappingURL=chunk-6OP5XSMM.mjs.map
137
+ //# sourceMappingURL=chunk-Q7347KP6.mjs.map
138
+ //# sourceMappingURL=chunk-Q7347KP6.mjs.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/forms/field-controls.ts","../src/forms/experience-plan.ts"],"names":[],"mappings":"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","file":"chunk-6OP5XSMM.mjs","sourcesContent":["'use client'\n\n/**\n * The field controls that need React hooks, loaded only when a form actually\n * has a field that uses them.\n *\n * FormField deliberately does NOT import these. DatePicker carries 17 hooks\n * and FileField holds upload state; importing them there put both in\n * FormField's chunk, which the build stamps `'use client'` — so a Server\n * Component rendering a single text input shipped 38 KB of date picker to the\n * browser. Injecting them from the client side keeps FormField hook-free and\n * therefore server-renderable, which is the whole basis of StaticForm.\n *\n * Injection alone still put both controls in the forms entry's eager graph,\n * because a module-level constant referencing them is a static import: every\n * form paid for the date picker, and most forms have no date field. They are\n * now fetched on demand, per control, from the field list.\n *\n * The wait costs nothing visually. FormField already renders the native\n * control when a control is absent (static mode does exactly this), so a date\n * field paints as `<input type=\"date\">` and upgrades in place when the chunk\n * lands — the same enhancement path a no-JS visitor never leaves.\n *\n * Every client renderer of <FormField> (FormClient, FormSpotlight, FormStage)\n * calls this hook, so the experiences and the classic form always offer\n * identical controls.\n */\n\nimport { useEffect, useMemo, useRef, useState } from 'react'\nimport type { FormField as FormFieldType } from './types'\n\nexport interface FieldControls {\n Date?: React.ComponentType<any>\n File?: React.ComponentType<any>\n}\n\n/** Stable identity for the common case (no date, no file) — no render churn. */\nconst NO_CONTROLS: FieldControls = {}\n\nexport function useFieldControls(fields: FormFieldType[] | undefined): FieldControls {\n const needsDate = useMemo(\n () => (fields ?? []).some((f) => f.field_type === 'date' || f.field_type === 'datetime'),\n [fields],\n )\n const needsFile = useMemo(\n () => (fields ?? []).some((f) => f.field_type === 'file'),\n [fields],\n )\n\n const [controls, setControls] = useState<FieldControls>(NO_CONTROLS)\n // Guards re-import when a conditional field toggles visibility mid-fill.\n const requested = useRef({ date: false, file: false })\n\n useEffect(() => {\n let cancelled = false\n\n if (needsDate && !requested.current.date) {\n requested.current.date = true\n import('./DatePicker')\n .then((m) => {\n if (!cancelled) setControls((prev) => ({ ...prev, Date: m.DatePicker }))\n })\n .catch(() => {\n // Chunk never arrived — the native date input stays, which submits\n // the same value. A failed fetch must not cost the lead.\n requested.current.date = false\n })\n }\n\n if (needsFile && !requested.current.file) {\n requested.current.file = true\n import('./FileField')\n .then((m) => {\n if (!cancelled) setControls((prev) => ({ ...prev, File: m.FileField }))\n })\n .catch(() => {\n requested.current.file = false\n })\n }\n\n return () => {\n cancelled = true\n }\n }, [needsDate, needsFile])\n\n return controls\n}\n","/**\n * Shared planning helpers for the alternate form experiences (stage,\n * spotlight). Pure data — no React, no CSS — so FormClient can import the\n * counts it needs for tracking WITHOUT pulling an experience component (and\n * its stylesheet) into every site's forms bundle. The components themselves\n * are lazy-loaded; this module is the only part that ships eagerly.\n */\n\nimport type {\n FormField as FormFieldType,\n FormStep,\n ManagedFormConfig,\n} from './types'\n\n/** Display-only / non-question field types — never staged. */\nconst NON_QUESTION_TYPES = ['heading', 'section_header', 'paragraph', 'hidden']\n\nexport interface StageQuestion {\n field: FormFieldType\n /** The step (chapter) this question belongs to, when the form is multi-step. */\n step?: FormStep\n}\n\nexport interface StageView {\n fields: FormFieldType[]\n step?: FormStep\n}\n\n/**\n * Flatten a form into its ordered question list. Steps become chapters:\n * multi-step forms iterate steps in step_number order (fields are already\n * sorted by sort_order via normalizeFormConfig); stepless fields trail.\n */\nexport function stageQuestions(config: ManagedFormConfig): StageQuestion[] {\n const input = (config.fields || []).filter(\n (f) => !NON_QUESTION_TYPES.includes(f.field_type),\n )\n if (!config.is_multi_step || !config.steps?.length) {\n return input.map((field) => ({ field }))\n }\n const ordered = [...config.steps].sort((a, b) => a.step_number - b.step_number)\n const out: StageQuestion[] = []\n const claimed = new Set<string>()\n for (const step of ordered) {\n for (const field of input) {\n if (field.step_id === step.id) {\n out.push({ field, step })\n claimed.add(field.id)\n }\n }\n }\n for (const field of input) {\n if (!claimed.has(field.id)) out.push({ field })\n }\n return out\n}\n\nconst WIDTH_FRACTION: Record<string, number> = {\n full: 1,\n half: 1 / 2,\n third: 1 / 3,\n quarter: 1 / 4,\n}\n\n/**\n * Group questions into beats using the classic grid's own row math:\n * consecutive sub-full-width fields fill a row (2 halves, 3 thirds...) and\n * that row is one beat; a full-width field closes any open row and stands\n * alone; a chapter change always starts a fresh beat.\n */\nexport function stageViews(config: ManagedFormConfig): StageView[] {\n const questions = stageQuestions(config)\n const views: StageView[] = []\n let open: StageView | null = null\n let openWidth = 0\n\n const close = () => {\n if (open) views.push(open)\n open = null\n openWidth = 0\n }\n\n for (const q of questions) {\n const fraction = WIDTH_FRACTION[q.field.width] ?? 1\n const chapterChanged = open && open.step?.id !== q.step?.id\n if (fraction >= 1 || chapterChanged) close()\n if (!open) {\n open = { fields: [q.field], step: q.step }\n openWidth = fraction\n if (fraction >= 1) close()\n continue\n }\n if (openWidth + fraction > 1.0001) close()\n if (!open) {\n open = { fields: [q.field], step: q.step }\n openWidth = fraction\n continue\n }\n open.fields.push(q.field)\n openWidth += fraction\n }\n close()\n return views\n}\n\nexport function countStageViews(config: ManagedFormConfig): number {\n return stageViews(config).length\n}\n\nexport function countStageQuestions(config: ManagedFormConfig): number {\n return stageQuestions(config).length\n}\n\n/**\n * Honest, friendly time estimate: \"about 40 seconds\".\n * ~8s per question, rounded to something a human would actually say.\n */\nexport function stageEstimate(questionCount: number): string {\n const seconds = questionCount * 8\n if (seconds < 50) return `about ${Math.max(15, Math.ceil(seconds / 5) * 5)} seconds`\n if (seconds <= 90) return 'about a minute'\n return `about ${Math.round(seconds / 60)} minutes`\n}\n\n/** First name for the greeting — conservative: short, single token, else null. */\nexport function stageFirstName(value: unknown): string | null {\n if (typeof value !== 'string') return null\n const token = value.trim().split(/\\s+/)[0]\n if (!token || token.length > 24) return null\n return token\n}\n\nexport function isEmptyValue(value: unknown): boolean {\n if (value === undefined || value === null || value === '') return true\n if (Array.isArray(value)) return value.length === 0\n return false\n}\n\nexport function formatAnswer(value: unknown): string | null {\n if (isEmptyValue(value)) return null\n if (Array.isArray(value)) return value.map(String).join(', ')\n if (typeof value === 'boolean') return value ? 'Yes' : 'No'\n return String(value)\n}\n\n/** Single-select types where picking an answer advances after a lock-in beat. */\nexport const AUTO_ADVANCE_TYPES = ['radio', 'select', 'rating']\n"]}
1
+ {"version":3,"sources":["../src/forms/field-controls.ts","../src/forms/experience-plan.ts"],"names":[],"mappings":"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","file":"chunk-Q7347KP6.mjs","sourcesContent":["'use client'\n\n/**\n * The field controls that need React hooks, loaded only when a form actually\n * has a field that uses them.\n *\n * FormField deliberately does NOT import these. DatePicker carries 17 hooks\n * and FileField holds upload state; importing them there put both in\n * FormField's chunk, which the build stamps `'use client'` — so a Server\n * Component rendering a single text input shipped 38 KB of date picker to the\n * browser. Injecting them from the client side keeps FormField hook-free and\n * therefore server-renderable, which is the whole basis of StaticForm.\n *\n * Injection alone still put both controls in the forms entry's eager graph,\n * because a module-level constant referencing them is a static import: every\n * form paid for the date picker, and most forms have no date field. They are\n * now fetched on demand, per control, from the field list.\n *\n * The wait costs nothing visually. FormField already renders the native\n * control when a control is absent (static mode does exactly this), so a date\n * field paints as `<input type=\"date\">` and upgrades in place when the chunk\n * lands — the same enhancement path a no-JS visitor never leaves.\n *\n * Every client renderer of <FormField> (FormClient, FormSpotlight, FormStage)\n * calls this hook, so the experiences and the classic form always offer\n * identical controls.\n */\n\nimport { useEffect, useMemo, useRef, useState } from 'react'\nimport type { FormField as FormFieldType } from './types'\n\nexport interface FieldControls {\n Date?: React.ComponentType<any>\n File?: React.ComponentType<any>\n}\n\n/** Stable identity for the common case (no date, no file) — no render churn. */\nconst NO_CONTROLS: FieldControls = {}\n\nexport function useFieldControls(fields: FormFieldType[] | undefined): FieldControls {\n const needsDate = useMemo(\n () => (fields ?? []).some((f) => f.field_type === 'date' || f.field_type === 'datetime'),\n [fields],\n )\n const needsFile = useMemo(\n () => (fields ?? []).some((f) => f.field_type === 'file'),\n [fields],\n )\n\n const [controls, setControls] = useState<FieldControls>(NO_CONTROLS)\n // Guards re-import when a conditional field toggles visibility mid-fill.\n const requested = useRef({ date: false, file: false })\n\n useEffect(() => {\n let cancelled = false\n\n if (needsDate && !requested.current.date) {\n requested.current.date = true\n import('./DatePicker')\n .then((m) => {\n if (!cancelled) setControls((prev) => ({ ...prev, Date: m.DatePicker }))\n })\n .catch(() => {\n // Chunk never arrived — the native date input stays, which submits\n // the same value. A failed fetch must not cost the lead.\n requested.current.date = false\n })\n }\n\n if (needsFile && !requested.current.file) {\n requested.current.file = true\n import('./FileField')\n .then((m) => {\n if (!cancelled) setControls((prev) => ({ ...prev, File: m.FileField }))\n })\n .catch(() => {\n requested.current.file = false\n })\n }\n\n return () => {\n cancelled = true\n }\n }, [needsDate, needsFile])\n\n return controls\n}\n","/**\n * Shared planning helpers for the alternate form experiences (stage,\n * spotlight). Pure data — no React, no CSS — so FormClient can import the\n * counts it needs for tracking WITHOUT pulling an experience component (and\n * its stylesheet) into every site's forms bundle. The components themselves\n * are lazy-loaded; this module is the only part that ships eagerly.\n */\n\nimport type {\n FormField as FormFieldType,\n FormStep,\n ManagedFormConfig,\n} from './types'\n\n/** Display-only / non-question field types — never staged. */\nconst NON_QUESTION_TYPES = ['heading', 'section_header', 'paragraph', 'hidden']\n\nexport interface StageQuestion {\n field: FormFieldType\n /** The step (chapter) this question belongs to, when the form is multi-step. */\n step?: FormStep\n}\n\nexport interface StageView {\n fields: FormFieldType[]\n step?: FormStep\n}\n\n/**\n * Flatten a form into its ordered question list. Steps become chapters:\n * multi-step forms iterate steps in step_number order (fields are already\n * sorted by sort_order via normalizeFormConfig); stepless fields trail.\n */\nexport function stageQuestions(config: ManagedFormConfig): StageQuestion[] {\n const input = (config.fields || []).filter(\n (f) => !NON_QUESTION_TYPES.includes(f.field_type),\n )\n if (!config.is_multi_step || !config.steps?.length) {\n return input.map((field) => ({ field }))\n }\n const ordered = [...config.steps].sort((a, b) => a.step_number - b.step_number)\n const out: StageQuestion[] = []\n const claimed = new Set<string>()\n for (const step of ordered) {\n for (const field of input) {\n if (field.step_id === step.id) {\n out.push({ field, step })\n claimed.add(field.id)\n }\n }\n }\n for (const field of input) {\n if (!claimed.has(field.id)) out.push({ field })\n }\n return out\n}\n\nconst WIDTH_FRACTION: Record<string, number> = {\n full: 1,\n half: 1 / 2,\n third: 1 / 3,\n quarter: 1 / 4,\n}\n\n/**\n * Group questions into beats using the classic grid's own row math:\n * consecutive sub-full-width fields fill a row (2 halves, 3 thirds...) and\n * that row is one beat; a full-width field closes any open row and stands\n * alone; a chapter change always starts a fresh beat.\n */\nexport function stageViews(config: ManagedFormConfig): StageView[] {\n const questions = stageQuestions(config)\n const views: StageView[] = []\n let open: StageView | null = null\n let openWidth = 0\n\n const close = () => {\n if (open) views.push(open)\n open = null\n openWidth = 0\n }\n\n for (const q of questions) {\n const fraction = WIDTH_FRACTION[q.field.width] ?? 1\n const chapterChanged = open && open.step?.id !== q.step?.id\n if (fraction >= 1 || chapterChanged) close()\n if (!open) {\n open = { fields: [q.field], step: q.step }\n openWidth = fraction\n if (fraction >= 1) close()\n continue\n }\n if (openWidth + fraction > 1.0001) close()\n if (!open) {\n open = { fields: [q.field], step: q.step }\n openWidth = fraction\n continue\n }\n open.fields.push(q.field)\n openWidth += fraction\n }\n close()\n return views\n}\n\nexport function countStageViews(config: ManagedFormConfig): number {\n return stageViews(config).length\n}\n\nexport function countStageQuestions(config: ManagedFormConfig): number {\n return stageQuestions(config).length\n}\n\n/**\n * Honest, friendly time estimate: \"about 40 seconds\".\n * ~8s per question, rounded to something a human would actually say.\n */\nexport function stageEstimate(questionCount: number): string {\n const seconds = questionCount * 8\n if (seconds < 50) return `about ${Math.max(15, Math.ceil(seconds / 5) * 5)} seconds`\n if (seconds <= 90) return 'about a minute'\n return `about ${Math.round(seconds / 60)} minutes`\n}\n\n/** First name for the greeting — conservative: short, single token, else null. */\nexport function stageFirstName(value: unknown): string | null {\n if (typeof value !== 'string') return null\n const token = value.trim().split(/\\s+/)[0]\n if (!token || token.length > 24) return null\n return token\n}\n\nexport function isEmptyValue(value: unknown): boolean {\n if (value === undefined || value === null || value === '') return true\n if (Array.isArray(value)) return value.length === 0\n return false\n}\n\nexport function formatAnswer(value: unknown): string | null {\n if (isEmptyValue(value)) return null\n if (Array.isArray(value)) return value.map(String).join(', ')\n if (typeof value === 'boolean') return value ? 'Yes' : 'No'\n return String(value)\n}\n\n/** Single-select types where picking an answer advances after a lock-in beat. */\nexport const AUTO_ADVANCE_TYPES = ['radio', 'select', 'rating']\n"]}
@@ -0,0 +1,6 @@
1
+ // src/shared/version.ts
2
+ var SITE_KIT_VERSION = "5.7.0";
3
+
4
+ export { SITE_KIT_VERSION };
5
+ //# sourceMappingURL=chunk-QRBPT6Z6.mjs.map
6
+ //# sourceMappingURL=chunk-QRBPT6Z6.mjs.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/shared/version.ts"],"names":[],"mappings":";AASO,IAAM,gBAAA,GAAmB","file":"chunk-DQUBETXH.mjs","sourcesContent":["/**\n * @sonordev/site-kit shared - Package version constant\n *\n * Single source of truth for the version the kit reports at runtime (the\n * x-sitekit-version request header set by sonorFetch). Kept as a plain const\n * so client bundles don't need JSON imports; scripts/verify-dts.cjs asserts\n * it matches package.json at publish time, and version.test.ts asserts it in\n * dev, so it can't silently drift.\n */\nexport const SITE_KIT_VERSION = '5.6.0'\n"]}
1
+ {"version":3,"sources":["../src/shared/version.ts"],"names":[],"mappings":";AASO,IAAM,gBAAA,GAAmB","file":"chunk-QRBPT6Z6.mjs","sourcesContent":["/**\n * @sonordev/site-kit shared - Package version constant\n *\n * Single source of truth for the version the kit reports at runtime (the\n * x-sitekit-version request header set by sonorFetch). Kept as a plain const\n * so client bundles don't need JSON imports; scripts/verify-dts.cjs asserts\n * it matches package.json at publish time, and version.test.ts asserts it in\n * dev, so it can't silently drift.\n */\nexport const SITE_KIT_VERSION = '5.7.0'\n"]}
@@ -54,7 +54,7 @@ function useSignal() {
54
54
  return useSyncExternalStore(subscribe, getSnapshot, getServerSnapshot);
55
55
  }
56
56
  var LazySignalCore = dynamic(
57
- () => import('./SignalCore-EEH5IM4U.mjs').then((m) => ({ default: m.SignalCore })),
57
+ () => import('./SignalCore-M2PKKIGH.mjs').then((m) => ({ default: m.SignalCore })),
58
58
  { ssr: false }
59
59
  );
60
60
  function SignalBridge({
@@ -161,5 +161,5 @@ function useSignalExperiment(experimentId) {
161
161
  }
162
162
 
163
163
  export { SignalBridge, useSignal, useSignalConfig, useSignalEvent, useSignalExperiment, useSignalOutcome };
164
- //# sourceMappingURL=chunk-USKIL6V6.mjs.map
165
- //# sourceMappingURL=chunk-USKIL6V6.mjs.map
164
+ //# sourceMappingURL=chunk-R2SXXFXZ.mjs.map
165
+ //# sourceMappingURL=chunk-R2SXXFXZ.mjs.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/signal/store.ts","../src/signal/SignalBridge.tsx"],"names":[],"mappings":"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","file":"chunk-USKIL6V6.mjs","sourcesContent":["'use client'\n\n/**\n * Signal store — module singleton behind useSignal().\n *\n * 4.0: SignalBridge no longer wraps page children in a React context; it\n * mounts as a childless sibling and publishes its API here. useSignal()\n * subscribes via useSyncExternalStore, so consumers work anywhere in the\n * tree — and BEFORE the bridge mounts, they get a buffering stub whose\n * trackEvent/trackOutcome queue calls that the bridge drains on publish.\n * getExperiment returns null pre-publish, identical to the pre-config\n * `loading` window consumers already handle.\n *\n * Behavior change vs 3.x (major): useSignal() no longer throws outside a\n * SignalBridge. With signal disabled it stays a bounded no-op stub — a\n * one-time debug warning fires instead of a crash.\n */\n\nimport { useSyncExternalStore } from 'react'\nimport type {\n SignalContextValue,\n SignalEvent,\n SignalOutcome,\n} from './types'\n\nconst pendingEvents: Partial<SignalEvent>[] = []\nconst pendingOutcomes: SignalOutcome[] = []\nconst MAX_PENDING = 100\nlet warnedNoBridge = false\n\n/** Frozen pre-bridge stub — stable reference (useSyncExternalStore requirement). */\nconst STUB: SignalContextValue = Object.freeze({\n config: null,\n loading: true,\n error: null,\n trackEvent: (event: Partial<SignalEvent>) => {\n if (pendingEvents.length < MAX_PENDING) pendingEvents.push(event)\n else if (!warnedNoBridge) {\n warnedNoBridge = true\n console.warn('[site-kit] Signal events are queuing but no SignalBridge has mounted — is signal enabled on SiteKitLayout?')\n }\n },\n trackOutcome: (outcome: SignalOutcome) => {\n if (pendingOutcomes.length < MAX_PENDING) pendingOutcomes.push(outcome)\n },\n getExperiment: () => null,\n refreshConfig: async () => {},\n})\n\nlet current: SignalContextValue = STUB\nconst listeners = new Set<() => void>()\n\nfunction emit() {\n for (const l of listeners) l()\n}\n\n/** Bridge-side: publish the live API (called whenever its value changes). */\nexport function publishSignal(value: SignalContextValue): void {\n const firstPublish = current === STUB\n current = value\n if (firstPublish) {\n // Drain calls made before the bridge mounted. The bridge's own trackEvent\n // buffers again internally until SignalCore loads, so nothing is lost.\n pendingEvents.splice(0).forEach(e => value.trackEvent(e))\n pendingOutcomes.splice(0).forEach(o => value.trackOutcome(o))\n }\n emit()\n}\n\n/** Bridge-side: reset on unmount so a remount starts clean (tests, HMR). */\nexport function resetSignal(): void {\n current = STUB\n emit()\n}\n\nfunction subscribe(onChange: () => void) {\n listeners.add(onChange)\n return () => listeners.delete(onChange)\n}\n\nconst getSnapshot = () => current\nconst getServerSnapshot = () => STUB\n\n/**\n * Access Signal (experiments, behavioral events) from anywhere in the tree.\n * No provider required — see module docs for pre-mount buffering semantics.\n */\nexport function useSignal(): SignalContextValue {\n return useSyncExternalStore(subscribe, getSnapshot, getServerSnapshot)\n}\n","/**\n * @sonordev/site-kit/signal - SignalBridge\n *\n * Central coordination layer for Signal AI integration.\n *\n * Architecture (2026-07 perf release): SignalBridge is a tiny SSR-SAFE context shell. It\n * renders {children} immediately — children server-render and hydrate\n * normally, no ssr:false wrapper — and lazy-loads the heavy machinery\n * (SignalCore: config fetch, SSE streaming, experiment assignment, event\n * queue, behavior tracking) as a CHILDLESS sibling. The core registers its\n * imperative API into the shell on mount; `trackEvent`/`trackOutcome` calls\n * made before the core is ready are buffered and drained on registration.\n *\n * This removes the old failure mode where enabling `signal` de-opted the\n * whole route to client rendering (the same SSR bailout the analytics\n * sibling-mount fixed) — the #1 recommendation of the 2026-07 perf audit.\n *\n * The core is NOT idle-deferred: experiment variants must apply as early as\n * possible, so it starts loading on hydration.\n */\n\n'use client'\n\nimport React, { useCallback, useEffect, useMemo, useRef, useState } from 'react'\nimport dynamic from 'next/dynamic'\nimport type { SignalCoreApi, SignalCoreState } from './SignalCore'\nimport type {\n SignalConfig,\n SignalContextValue,\n SignalBridgeProps,\n SignalEvent,\n SignalOutcome,\n ExperimentAssignment,\n} from './types'\n\n// Heavy machinery — loaded client-side only, never wraps content.\nimport { publishSignal, resetSignal, useSignal } from './store'\n\nconst LazySignalCore = dynamic(\n () => import('./SignalCore').then(m => ({ default: m.SignalCore })),\n { ssr: false },\n)\n\n// ============================================\n// Context\n// ============================================\n\n// 4.0: the context is gone. useSignal() reads the module store, so consumers\n// work anywhere in the tree and SignalBridge mounts as a childless sibling.\nexport { useSignal } from './store'\n\n// ============================================\n// SignalBridge Component (shell)\n// ============================================\n\nexport function SignalBridge({\n enabled = true,\n realtime = true,\n experiments = true,\n behaviorTracking = true,\n visitorId: externalVisitorId,\n sessionId: externalSessionId,\n pageMetadataRef,\n children,\n}: SignalBridgeProps) {\n const [config, setConfig] = useState<SignalConfig | null>(null)\n const [loading, setLoading] = useState(true)\n const [error, setError] = useState<Error | null>(null)\n\n const coreRef = useRef<SignalCoreApi | null>(null)\n // Calls made before the core chunk loads are buffered here and drained on\n // registration — consumers can call trackEvent/trackOutcome from first render.\n const pendingEventsRef = useRef<Partial<SignalEvent>[]>([])\n const pendingOutcomesRef = useRef<SignalOutcome[]>([])\n\n const handleState = useCallback((state: SignalCoreState) => {\n setConfig(state.config)\n setLoading(state.loading)\n setError(state.error)\n }, [])\n\n const handleRegister = useCallback((api: SignalCoreApi | null) => {\n coreRef.current = api\n if (api) {\n pendingEventsRef.current.splice(0).forEach(event => api.trackEvent(event))\n pendingOutcomesRef.current.splice(0).forEach(outcome => api.trackOutcome(outcome))\n }\n }, [])\n\n const trackEvent = useCallback((event: Partial<SignalEvent>) => {\n if (coreRef.current) {\n coreRef.current.trackEvent(event)\n } else {\n pendingEventsRef.current.push(event)\n }\n }, [])\n\n const trackOutcome = useCallback((outcome: SignalOutcome) => {\n if (coreRef.current) {\n coreRef.current.trackOutcome(outcome)\n } else {\n pendingOutcomesRef.current.push(outcome)\n }\n }, [])\n\n const getExperiment = useCallback((experimentId: string): ExperimentAssignment | null => {\n // null before the core loads — identical to the pre-config-fetch behavior\n // consumers already handle via `loading`.\n return coreRef.current?.getExperiment(experimentId) ?? null\n }, [])\n\n const refreshConfig = useCallback(async () => {\n await coreRef.current?.refreshConfig()\n }, [])\n\n const contextValue = useMemo<SignalContextValue>(() => ({\n config,\n loading,\n error,\n trackEvent,\n trackOutcome,\n getExperiment,\n refreshConfig,\n }), [config, loading, error, trackEvent, trackOutcome, getExperiment, refreshConfig])\n\n // Publish to the module store (drains pre-mount buffered calls on first\n // publish); reset on unmount so tests/HMR start clean.\n useEffect(() => {\n publishSignal(contextValue)\n }, [contextValue])\n useEffect(() => () => resetSignal(), [])\n\n return (\n <>\n {children}\n {enabled && (\n <LazySignalCore\n enabled={enabled}\n realtime={realtime}\n experiments={experiments}\n behaviorTracking={behaviorTracking}\n externalVisitorId={externalVisitorId}\n externalSessionId={externalSessionId}\n pageMetadataRef={pageMetadataRef}\n onRegister={handleRegister}\n onState={handleState}\n />\n )}\n </>\n )\n}\n\n// ============================================\n// Convenience Hooks\n// ============================================\n\n/**\n * Hook to access Signal config\n */\nexport function useSignalConfig(): SignalConfig | null {\n const { config } = useSignal()\n return config\n}\n\n/**\n * Hook for tracking events\n */\nexport function useSignalEvent() {\n const { trackEvent } = useSignal()\n return trackEvent\n}\n\n/**\n * Hook for tracking outcomes/conversions\n */\nexport function useSignalOutcome() {\n const { trackOutcome } = useSignal()\n return { trackOutcome }\n}\n\n/**\n * Hook for experiment assignment\n */\nexport function useSignalExperiment(experimentId: string): {\n assignment: ExperimentAssignment | null\n variant: string | null\n isControl: boolean\n} {\n const { getExperiment, config } = useSignal()\n const assignment = getExperiment(experimentId)\n\n // Check if experiment is running\n const experiment = config?.experiments?.find(e => e.id === experimentId)\n const isRunning = experiment?.status === 'running'\n\n return {\n assignment: isRunning ? assignment : null,\n variant: isRunning && assignment ? assignment.variant_key : null,\n isControl: !assignment || assignment.variant_key === 'control',\n }\n}\n"]}
1
+ {"version":3,"sources":["../src/signal/store.ts","../src/signal/SignalBridge.tsx"],"names":[],"mappings":"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","file":"chunk-R2SXXFXZ.mjs","sourcesContent":["'use client'\n\n/**\n * Signal store — module singleton behind useSignal().\n *\n * 4.0: SignalBridge no longer wraps page children in a React context; it\n * mounts as a childless sibling and publishes its API here. useSignal()\n * subscribes via useSyncExternalStore, so consumers work anywhere in the\n * tree — and BEFORE the bridge mounts, they get a buffering stub whose\n * trackEvent/trackOutcome queue calls that the bridge drains on publish.\n * getExperiment returns null pre-publish, identical to the pre-config\n * `loading` window consumers already handle.\n *\n * Behavior change vs 3.x (major): useSignal() no longer throws outside a\n * SignalBridge. With signal disabled it stays a bounded no-op stub — a\n * one-time debug warning fires instead of a crash.\n */\n\nimport { useSyncExternalStore } from 'react'\nimport type {\n SignalContextValue,\n SignalEvent,\n SignalOutcome,\n} from './types'\n\nconst pendingEvents: Partial<SignalEvent>[] = []\nconst pendingOutcomes: SignalOutcome[] = []\nconst MAX_PENDING = 100\nlet warnedNoBridge = false\n\n/** Frozen pre-bridge stub — stable reference (useSyncExternalStore requirement). */\nconst STUB: SignalContextValue = Object.freeze({\n config: null,\n loading: true,\n error: null,\n trackEvent: (event: Partial<SignalEvent>) => {\n if (pendingEvents.length < MAX_PENDING) pendingEvents.push(event)\n else if (!warnedNoBridge) {\n warnedNoBridge = true\n console.warn('[site-kit] Signal events are queuing but no SignalBridge has mounted — is signal enabled on SiteKitLayout?')\n }\n },\n trackOutcome: (outcome: SignalOutcome) => {\n if (pendingOutcomes.length < MAX_PENDING) pendingOutcomes.push(outcome)\n },\n getExperiment: () => null,\n refreshConfig: async () => {},\n})\n\nlet current: SignalContextValue = STUB\nconst listeners = new Set<() => void>()\n\nfunction emit() {\n for (const l of listeners) l()\n}\n\n/** Bridge-side: publish the live API (called whenever its value changes). */\nexport function publishSignal(value: SignalContextValue): void {\n const firstPublish = current === STUB\n current = value\n if (firstPublish) {\n // Drain calls made before the bridge mounted. The bridge's own trackEvent\n // buffers again internally until SignalCore loads, so nothing is lost.\n pendingEvents.splice(0).forEach(e => value.trackEvent(e))\n pendingOutcomes.splice(0).forEach(o => value.trackOutcome(o))\n }\n emit()\n}\n\n/** Bridge-side: reset on unmount so a remount starts clean (tests, HMR). */\nexport function resetSignal(): void {\n current = STUB\n emit()\n}\n\nfunction subscribe(onChange: () => void) {\n listeners.add(onChange)\n return () => listeners.delete(onChange)\n}\n\nconst getSnapshot = () => current\nconst getServerSnapshot = () => STUB\n\n/**\n * Access Signal (experiments, behavioral events) from anywhere in the tree.\n * No provider required — see module docs for pre-mount buffering semantics.\n */\nexport function useSignal(): SignalContextValue {\n return useSyncExternalStore(subscribe, getSnapshot, getServerSnapshot)\n}\n","/**\n * @sonordev/site-kit/signal - SignalBridge\n *\n * Central coordination layer for Signal AI integration.\n *\n * Architecture (2026-07 perf release): SignalBridge is a tiny SSR-SAFE context shell. It\n * renders {children} immediately — children server-render and hydrate\n * normally, no ssr:false wrapper — and lazy-loads the heavy machinery\n * (SignalCore: config fetch, SSE streaming, experiment assignment, event\n * queue, behavior tracking) as a CHILDLESS sibling. The core registers its\n * imperative API into the shell on mount; `trackEvent`/`trackOutcome` calls\n * made before the core is ready are buffered and drained on registration.\n *\n * This removes the old failure mode where enabling `signal` de-opted the\n * whole route to client rendering (the same SSR bailout the analytics\n * sibling-mount fixed) — the #1 recommendation of the 2026-07 perf audit.\n *\n * The core is NOT idle-deferred: experiment variants must apply as early as\n * possible, so it starts loading on hydration.\n */\n\n'use client'\n\nimport React, { useCallback, useEffect, useMemo, useRef, useState } from 'react'\nimport dynamic from 'next/dynamic'\nimport type { SignalCoreApi, SignalCoreState } from './SignalCore'\nimport type {\n SignalConfig,\n SignalContextValue,\n SignalBridgeProps,\n SignalEvent,\n SignalOutcome,\n ExperimentAssignment,\n} from './types'\n\n// Heavy machinery — loaded client-side only, never wraps content.\nimport { publishSignal, resetSignal, useSignal } from './store'\n\nconst LazySignalCore = dynamic(\n () => import('./SignalCore').then(m => ({ default: m.SignalCore })),\n { ssr: false },\n)\n\n// ============================================\n// Context\n// ============================================\n\n// 4.0: the context is gone. useSignal() reads the module store, so consumers\n// work anywhere in the tree and SignalBridge mounts as a childless sibling.\nexport { useSignal } from './store'\n\n// ============================================\n// SignalBridge Component (shell)\n// ============================================\n\nexport function SignalBridge({\n enabled = true,\n realtime = true,\n experiments = true,\n behaviorTracking = true,\n visitorId: externalVisitorId,\n sessionId: externalSessionId,\n pageMetadataRef,\n children,\n}: SignalBridgeProps) {\n const [config, setConfig] = useState<SignalConfig | null>(null)\n const [loading, setLoading] = useState(true)\n const [error, setError] = useState<Error | null>(null)\n\n const coreRef = useRef<SignalCoreApi | null>(null)\n // Calls made before the core chunk loads are buffered here and drained on\n // registration — consumers can call trackEvent/trackOutcome from first render.\n const pendingEventsRef = useRef<Partial<SignalEvent>[]>([])\n const pendingOutcomesRef = useRef<SignalOutcome[]>([])\n\n const handleState = useCallback((state: SignalCoreState) => {\n setConfig(state.config)\n setLoading(state.loading)\n setError(state.error)\n }, [])\n\n const handleRegister = useCallback((api: SignalCoreApi | null) => {\n coreRef.current = api\n if (api) {\n pendingEventsRef.current.splice(0).forEach(event => api.trackEvent(event))\n pendingOutcomesRef.current.splice(0).forEach(outcome => api.trackOutcome(outcome))\n }\n }, [])\n\n const trackEvent = useCallback((event: Partial<SignalEvent>) => {\n if (coreRef.current) {\n coreRef.current.trackEvent(event)\n } else {\n pendingEventsRef.current.push(event)\n }\n }, [])\n\n const trackOutcome = useCallback((outcome: SignalOutcome) => {\n if (coreRef.current) {\n coreRef.current.trackOutcome(outcome)\n } else {\n pendingOutcomesRef.current.push(outcome)\n }\n }, [])\n\n const getExperiment = useCallback((experimentId: string): ExperimentAssignment | null => {\n // null before the core loads — identical to the pre-config-fetch behavior\n // consumers already handle via `loading`.\n return coreRef.current?.getExperiment(experimentId) ?? null\n }, [])\n\n const refreshConfig = useCallback(async () => {\n await coreRef.current?.refreshConfig()\n }, [])\n\n const contextValue = useMemo<SignalContextValue>(() => ({\n config,\n loading,\n error,\n trackEvent,\n trackOutcome,\n getExperiment,\n refreshConfig,\n }), [config, loading, error, trackEvent, trackOutcome, getExperiment, refreshConfig])\n\n // Publish to the module store (drains pre-mount buffered calls on first\n // publish); reset on unmount so tests/HMR start clean.\n useEffect(() => {\n publishSignal(contextValue)\n }, [contextValue])\n useEffect(() => () => resetSignal(), [])\n\n return (\n <>\n {children}\n {enabled && (\n <LazySignalCore\n enabled={enabled}\n realtime={realtime}\n experiments={experiments}\n behaviorTracking={behaviorTracking}\n externalVisitorId={externalVisitorId}\n externalSessionId={externalSessionId}\n pageMetadataRef={pageMetadataRef}\n onRegister={handleRegister}\n onState={handleState}\n />\n )}\n </>\n )\n}\n\n// ============================================\n// Convenience Hooks\n// ============================================\n\n/**\n * Hook to access Signal config\n */\nexport function useSignalConfig(): SignalConfig | null {\n const { config } = useSignal()\n return config\n}\n\n/**\n * Hook for tracking events\n */\nexport function useSignalEvent() {\n const { trackEvent } = useSignal()\n return trackEvent\n}\n\n/**\n * Hook for tracking outcomes/conversions\n */\nexport function useSignalOutcome() {\n const { trackOutcome } = useSignal()\n return { trackOutcome }\n}\n\n/**\n * Hook for experiment assignment\n */\nexport function useSignalExperiment(experimentId: string): {\n assignment: ExperimentAssignment | null\n variant: string | null\n isControl: boolean\n} {\n const { getExperiment, config } = useSignal()\n const assignment = getExperiment(experimentId)\n\n // Check if experiment is running\n const experiment = config?.experiments?.find(e => e.id === experimentId)\n const isRunning = experiment?.status === 'running'\n\n return {\n assignment: isRunning ? assignment : null,\n variant: isRunning && assignment ? assignment.variant_key : null,\n isControl: !assignment || assignment.variant_key === 'control',\n }\n}\n"]}
@@ -4,7 +4,7 @@
4
4
  var chunk3DWIYCQX_js = require('./chunk-3DWIYCQX.js');
5
5
  var chunkRC4WWQXR_js = require('./chunk-RC4WWQXR.js');
6
6
  var chunk5RNAUYWE_js = require('./chunk-5RNAUYWE.js');
7
- var chunkOC7AO7XS_js = require('./chunk-OC7AO7XS.js');
7
+ var chunkH65OX263_js = require('./chunk-H65OX263.js');
8
8
  var react = require('react');
9
9
  var navigation = require('next/navigation');
10
10
  var jsxRuntime = require('react/jsx-runtime');
@@ -14,7 +14,7 @@ async function analyticsSend(path, body, options = {}) {
14
14
  const target = chunk5RNAUYWE_js.resolveAnalyticsTarget(options);
15
15
  if (!target) return null;
16
16
  try {
17
- return await chunkOC7AO7XS_js.sonorFetch(
17
+ return await chunkH65OX263_js.sonorFetch(
18
18
  `${target.apiUrl}${path}`,
19
19
  {
20
20
  method: options.method || "POST",
@@ -31,7 +31,7 @@ async function analyticsSend(path, body, options = {}) {
31
31
  function analyticsBeacon(path, body, options = {}) {
32
32
  const target = chunk5RNAUYWE_js.resolveAnalyticsTarget(options);
33
33
  if (!target) return;
34
- chunkOC7AO7XS_js.sonorBeacon(`${target.apiUrl}${path}`, body, target.apiKey);
34
+ chunkH65OX263_js.sonorBeacon(`${target.apiUrl}${path}`, body, target.apiKey);
35
35
  }
36
36
 
37
37
  // src/analytics/WebVitals.tsx
@@ -1023,5 +1023,5 @@ exports.WebVitals = WebVitals;
1023
1023
  exports.useAnalytics = useAnalytics;
1024
1024
  exports.useAnalyticsOptional = useAnalyticsOptional;
1025
1025
  exports.useTrackEvent = useTrackEvent;
1026
- //# sourceMappingURL=chunk-UU47DGHE.js.map
1027
- //# sourceMappingURL=chunk-UU47DGHE.js.map
1026
+ //# sourceMappingURL=chunk-RCSTDJUH.js.map
1027
+ //# sourceMappingURL=chunk-RCSTDJUH.js.map