@sonordev/site-kit 5.7.0 → 5.8.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 (604) hide show
  1. package/README.md +3 -3
  2. package/agent-manifest.json +14 -2
  3. package/dist/AnalyticsProvider-OCXRNIVE.js +33 -0
  4. package/dist/{AnalyticsProvider-GJFG7YXA.js.map → AnalyticsProvider-OCXRNIVE.js.map} +1 -1
  5. package/dist/AnalyticsProvider-ZAUONQCX.mjs +12 -0
  6. package/dist/{AnalyticsProvider-EWF7JN2X.mjs.map → AnalyticsProvider-ZAUONQCX.mjs.map} +1 -1
  7. package/dist/{BlogViewTracker-2D3IJPJK.js → BlogViewTracker-HK5C7PU6.js} +14 -11
  8. package/dist/BlogViewTracker-HK5C7PU6.js.map +1 -0
  9. package/dist/{BlogViewTracker-CKYG6MYU.mjs → BlogViewTracker-KXRZHN3U.mjs} +13 -10
  10. package/dist/BlogViewTracker-KXRZHN3U.mjs.map +1 -0
  11. package/dist/ChatWidget-3OW5LY37.js +24 -0
  12. package/dist/{ChatWidget-AWP6GBVW.js.map → ChatWidget-3OW5LY37.js.map} +1 -1
  13. package/dist/ChatWidget-54GVS27I.mjs +15 -0
  14. package/dist/{ChatWidget-Z5QXDZP3.mjs.map → ChatWidget-54GVS27I.mjs.map} +1 -1
  15. package/dist/EngageWidget-7EUP76WE.mjs +12 -0
  16. package/dist/{EngageWidget-BKEY5TPO.mjs.map → EngageWidget-7EUP76WE.mjs.map} +1 -1
  17. package/dist/EngageWidget-DDP5UFA4.js +21 -0
  18. package/dist/{EngageWidget-VT4DYXVO.js.map → EngageWidget-DDP5UFA4.js.map} +1 -1
  19. package/dist/{FileField-JJN5QKDL.mjs → FileField-IQLN6E3C.mjs} +5 -5
  20. package/dist/{FileField-JJN5QKDL.mjs.map → FileField-IQLN6E3C.mjs.map} +1 -1
  21. package/dist/{FileField-62ZWZMQK.js → FileField-SBPL4JHP.js} +6 -6
  22. package/dist/{FileField-62ZWZMQK.js.map → FileField-SBPL4JHP.js.map} +1 -1
  23. package/dist/{FormSpotlight-OTFB6QM5.mjs → FormSpotlight-E2LKKHGV.mjs} +11 -7
  24. package/dist/FormSpotlight-E2LKKHGV.mjs.map +1 -0
  25. package/dist/{FormSpotlight-URS4XRS7.js → FormSpotlight-YTACNE57.js} +25 -21
  26. package/dist/FormSpotlight-YTACNE57.js.map +1 -0
  27. package/dist/{FormStage-FVKMIV73.js → FormStage-S277U2CP.js} +20 -15
  28. package/dist/FormStage-S277U2CP.js.map +1 -0
  29. package/dist/{FormStage-VPGOCMAV.mjs → FormStage-YSBN5XKL.mjs} +9 -4
  30. package/dist/FormStage-YSBN5XKL.mjs.map +1 -0
  31. package/dist/ManagedForm-I3QVRQ53.mjs +16 -0
  32. package/dist/{ManagedForm-CXVDJMHN.mjs.map → ManagedForm-I3QVRQ53.mjs.map} +1 -1
  33. package/dist/ManagedForm-TSYKQFLJ.js +25 -0
  34. package/dist/{ManagedForm-FGNTDGED.js.map → ManagedForm-TSYKQFLJ.js.map} +1 -1
  35. package/dist/{ManagedNewsletterForm-SQYB4BZU.mjs → ManagedNewsletterForm-T3YRAWKZ.mjs} +9 -7
  36. package/dist/ManagedNewsletterForm-T3YRAWKZ.mjs.map +1 -0
  37. package/dist/{ManagedNewsletterForm-3O5L44AZ.js → ManagedNewsletterForm-YSOPPKS6.js} +10 -8
  38. package/dist/ManagedNewsletterForm-YSOPPKS6.js.map +1 -0
  39. package/dist/{SignalCore-M2PKKIGH.mjs → SignalCore-PPSIQ4BW.mjs} +8 -14
  40. package/dist/SignalCore-PPSIQ4BW.mjs.map +1 -0
  41. package/dist/{SignalCore-RFBOBNLQ.js → SignalCore-SUZH3XWZ.js} +14 -20
  42. package/dist/SignalCore-SUZH3XWZ.js.map +1 -0
  43. package/dist/SitemapSync-HSHCOKCL.mjs +9 -0
  44. package/dist/{SitemapSync-4OVMIIGC.mjs.map → SitemapSync-HSHCOKCL.mjs.map} +1 -1
  45. package/dist/SitemapSync-LH6UVP4P.js +18 -0
  46. package/dist/{SitemapSync-RK3SQ4M2.js.map → SitemapSync-LH6UVP4P.js.map} +1 -1
  47. package/dist/analytics/AnalyticsProvider.d.ts.map +1 -1
  48. package/dist/analytics/index.js +10 -9
  49. package/dist/analytics/index.mjs +5 -4
  50. package/dist/blog/BlogLayout.d.ts +3 -1
  51. package/dist/blog/BlogLayout.d.ts.map +1 -1
  52. package/dist/blog/BlogList.d.ts +7 -1
  53. package/dist/blog/BlogList.d.ts.map +1 -1
  54. package/dist/blog/BlogPost.d.ts +20 -1
  55. package/dist/blog/BlogPost.d.ts.map +1 -1
  56. package/dist/blog/BlogSidebar.d.ts +3 -1
  57. package/dist/blog/BlogSidebar.d.ts.map +1 -1
  58. package/dist/blog/BlogViewTracker.d.ts +8 -2
  59. package/dist/blog/BlogViewTracker.d.ts.map +1 -1
  60. package/dist/blog/ClusterLandingPage.d.ts +3 -1
  61. package/dist/blog/ClusterLandingPage.d.ts.map +1 -1
  62. package/dist/blog/ClusterNavigation.d.ts +5 -2
  63. package/dist/blog/ClusterNavigation.d.ts.map +1 -1
  64. package/dist/blog/RelatedPosts.d.ts +3 -1
  65. package/dist/blog/RelatedPosts.d.ts.map +1 -1
  66. package/dist/blog/index.d.ts +1 -1
  67. package/dist/blog/index.d.ts.map +1 -1
  68. package/dist/blog/index.js +40 -31
  69. package/dist/blog/index.js.map +1 -1
  70. package/dist/blog/index.mjs +11 -6
  71. package/dist/blog/index.mjs.map +1 -1
  72. package/dist/blog/not-found.test.d.ts +2 -0
  73. package/dist/blog/not-found.test.d.ts.map +1 -0
  74. package/dist/blog/processBlogHtml.d.ts +19 -2
  75. package/dist/blog/processBlogHtml.d.ts.map +1 -1
  76. package/dist/blog/public-reads.d.ts +27 -0
  77. package/dist/blog/public-reads.d.ts.map +1 -0
  78. package/dist/blog/server-core.d.ts +76 -10
  79. package/dist/blog/server-core.d.ts.map +1 -1
  80. package/dist/blog/server-ui.js +29 -23
  81. package/dist/blog/server-ui.js.map +1 -1
  82. package/dist/blog/server-ui.mjs +12 -6
  83. package/dist/blog/server-ui.mjs.map +1 -1
  84. package/dist/blog/server.d.ts +76 -10
  85. package/dist/blog/server.d.ts.map +1 -1
  86. package/dist/blog/server.js +54 -47
  87. package/dist/blog/server.mjs +5 -2
  88. package/dist/blog/site-scope.test.d.ts +2 -0
  89. package/dist/blog/site-scope.test.d.ts.map +1 -0
  90. package/dist/brand/extract-brand-profile.d.ts +36 -2
  91. package/dist/brand/extract-brand-profile.d.ts.map +1 -1
  92. package/dist/brand/extract-brand-profile.test.d.ts +2 -0
  93. package/dist/brand/extract-brand-profile.test.d.ts.map +1 -0
  94. package/dist/{chunk-3YQILJKJ.js → chunk-2FQG2AHJ.js} +60 -35
  95. package/dist/chunk-2FQG2AHJ.js.map +1 -0
  96. package/dist/{chunk-D553G64G.js → chunk-2OQWLXDO.js} +13 -13
  97. package/dist/{chunk-D553G64G.js.map → chunk-2OQWLXDO.js.map} +1 -1
  98. package/dist/{chunk-OYOO2OO5.js → chunk-2SCDUVFJ.js} +10 -10
  99. package/dist/{chunk-OYOO2OO5.js.map → chunk-2SCDUVFJ.js.map} +1 -1
  100. package/dist/{chunk-3S5JN6KL.js → chunk-35ERUUH3.js} +6 -6
  101. package/dist/{chunk-3S5JN6KL.js.map → chunk-35ERUUH3.js.map} +1 -1
  102. package/dist/{chunk-57AFHENV.mjs → chunk-3AUFD7KR.mjs} +3 -3
  103. package/dist/{chunk-57AFHENV.mjs.map → chunk-3AUFD7KR.mjs.map} +1 -1
  104. package/dist/{chunk-L7ACQ6PC.js → chunk-3BVCF4ZF.js} +4 -4
  105. package/dist/{chunk-L7ACQ6PC.js.map → chunk-3BVCF4ZF.js.map} +1 -1
  106. package/dist/{chunk-BFJOZ3MU.mjs → chunk-3EY5E35M.mjs} +36 -71
  107. package/dist/chunk-3EY5E35M.mjs.map +1 -0
  108. package/dist/{chunk-BQGEVMIR.mjs → chunk-3SLFT453.mjs} +5 -5
  109. package/dist/{chunk-BQGEVMIR.mjs.map → chunk-3SLFT453.mjs.map} +1 -1
  110. package/dist/{chunk-ILNCUSXW.mjs → chunk-4L7OHRWB.mjs} +12 -9
  111. package/dist/chunk-4L7OHRWB.mjs.map +1 -0
  112. package/dist/chunk-4LYW6PMU.mjs +72 -0
  113. package/dist/chunk-4LYW6PMU.mjs.map +1 -0
  114. package/dist/{chunk-TSZIACRC.js → chunk-4OS6M3V4.js} +6 -12
  115. package/dist/chunk-4OS6M3V4.js.map +1 -0
  116. package/dist/{chunk-YKUEFRZI.js → chunk-4RY7JETY.js} +14 -14
  117. package/dist/{chunk-YKUEFRZI.js.map → chunk-4RY7JETY.js.map} +1 -1
  118. package/dist/chunk-4TLFZ6NR.mjs +16 -0
  119. package/dist/chunk-4TLFZ6NR.mjs.map +1 -0
  120. package/dist/{chunk-4B4S56WJ.mjs → chunk-5B4J3IBX.mjs} +75 -21
  121. package/dist/chunk-5B4J3IBX.mjs.map +1 -0
  122. package/dist/chunk-5O7JSWT6.js +8 -0
  123. package/dist/{chunk-5TXXTYXL.js.map → chunk-5O7JSWT6.js.map} +1 -1
  124. package/dist/chunk-5SANRSX3.mjs +17 -0
  125. package/dist/chunk-5SANRSX3.mjs.map +1 -0
  126. package/dist/{chunk-FBDHKYNF.mjs → chunk-5WGMXSCB.mjs} +3 -3
  127. package/dist/{chunk-FBDHKYNF.mjs.map → chunk-5WGMXSCB.mjs.map} +1 -1
  128. package/dist/chunk-5XFFUP6D.js +100 -0
  129. package/dist/chunk-5XFFUP6D.js.map +1 -0
  130. package/dist/{chunk-7ZX6TO6C.mjs → chunk-6HFFTGFP.mjs} +50 -26
  131. package/dist/chunk-6HFFTGFP.mjs.map +1 -0
  132. package/dist/{chunk-R2SXXFXZ.mjs → chunk-6SBTHS6C.mjs} +3 -3
  133. package/dist/{chunk-R2SXXFXZ.mjs.map → chunk-6SBTHS6C.mjs.map} +1 -1
  134. package/dist/{chunk-FO4KGPGF.js → chunk-7TC3GRXQ.js} +73 -38
  135. package/dist/chunk-7TC3GRXQ.js.map +1 -0
  136. package/dist/{chunk-XLPU3TEE.mjs → chunk-7THZOAUR.mjs} +4 -4
  137. package/dist/{chunk-XLPU3TEE.mjs.map → chunk-7THZOAUR.mjs.map} +1 -1
  138. package/dist/{chunk-MW2M6O7A.mjs → chunk-AOWJP25J.mjs} +4 -4
  139. package/dist/{chunk-MW2M6O7A.mjs.map → chunk-AOWJP25J.mjs.map} +1 -1
  140. package/dist/{chunk-UQ5YULFU.mjs → chunk-B2VFMPVJ.mjs} +4 -4
  141. package/dist/{chunk-UQ5YULFU.mjs.map → chunk-B2VFMPVJ.mjs.map} +1 -1
  142. package/dist/{chunk-JTF4DFUF.mjs → chunk-B35OJ7FR.mjs} +4 -4
  143. package/dist/{chunk-JTF4DFUF.mjs.map → chunk-B35OJ7FR.mjs.map} +1 -1
  144. package/dist/{chunk-2N27LCZH.js → chunk-BER36QXU.js} +9 -9
  145. package/dist/{chunk-2N27LCZH.js.map → chunk-BER36QXU.js.map} +1 -1
  146. package/dist/{chunk-47XQWV4S.mjs → chunk-BFZNLTWK.mjs} +3 -3
  147. package/dist/{chunk-47XQWV4S.mjs.map → chunk-BFZNLTWK.mjs.map} +1 -1
  148. package/dist/chunk-BQP6JIE2.mjs +28 -0
  149. package/dist/chunk-BQP6JIE2.mjs.map +1 -0
  150. package/dist/{chunk-KXGD4E7G.js → chunk-C3WU45JT.js} +7 -7
  151. package/dist/{chunk-KXGD4E7G.js.map → chunk-C3WU45JT.js.map} +1 -1
  152. package/dist/chunk-CUNZAD46.js +53 -0
  153. package/dist/chunk-CUNZAD46.js.map +1 -0
  154. package/dist/chunk-CXAXZFFW.js +157 -0
  155. package/dist/chunk-CXAXZFFW.js.map +1 -0
  156. package/dist/{chunk-H4OBGC43.mjs → chunk-DA7IANFG.mjs} +14 -3
  157. package/dist/chunk-DA7IANFG.mjs.map +1 -0
  158. package/dist/{chunk-NOU3JQJK.js → chunk-EIW6YEPY.js} +8 -8
  159. package/dist/{chunk-NOU3JQJK.js.map → chunk-EIW6YEPY.js.map} +1 -1
  160. package/dist/{chunk-RCSTDJUH.js → chunk-F6SKG34N.js} +8 -13
  161. package/dist/chunk-F6SKG34N.js.map +1 -0
  162. package/dist/{chunk-LC7AM4J5.js → chunk-FHPW7XVH.js} +77 -20
  163. package/dist/chunk-FHPW7XVH.js.map +1 -0
  164. package/dist/{chunk-JNRHTZL4.js → chunk-FVW6FT6L.js} +73 -29
  165. package/dist/chunk-FVW6FT6L.js.map +1 -0
  166. package/dist/{chunk-BFM5PEFV.js → chunk-GNDWTXLU.js} +56 -177
  167. package/dist/chunk-GNDWTXLU.js.map +1 -0
  168. package/dist/{chunk-OZ3FU4BT.js → chunk-H5NBFNND.js} +2 -2
  169. package/dist/chunk-H5NBFNND.js.map +1 -0
  170. package/dist/{chunk-RNAGCAIB.js → chunk-HAKD27AZ.js} +7 -7
  171. package/dist/{chunk-RNAGCAIB.js.map → chunk-HAKD27AZ.js.map} +1 -1
  172. package/dist/chunk-HCN3IKMW.mjs +106 -0
  173. package/dist/chunk-HCN3IKMW.mjs.map +1 -0
  174. package/dist/{chunk-V5THCFPG.mjs → chunk-HCX343AS.mjs} +4 -4
  175. package/dist/{chunk-V5THCFPG.mjs.map → chunk-HCX343AS.mjs.map} +1 -1
  176. package/dist/{chunk-TDJKGN5Q.mjs → chunk-HEOQT5SM.mjs} +216 -103
  177. package/dist/chunk-HEOQT5SM.mjs.map +1 -0
  178. package/dist/{chunk-6FC5Q4KU.mjs → chunk-HOJ4J4X2.mjs} +30 -12
  179. package/dist/chunk-HOJ4J4X2.mjs.map +1 -0
  180. package/dist/{chunk-ELQ4SRRR.js → chunk-HQOHB6QF.js} +15 -15
  181. package/dist/{chunk-ELQ4SRRR.js.map → chunk-HQOHB6QF.js.map} +1 -1
  182. package/dist/chunk-HRMGITUZ.mjs +6 -0
  183. package/dist/{chunk-QRBPT6Z6.mjs.map → chunk-HRMGITUZ.mjs.map} +1 -1
  184. package/dist/{chunk-JQ7M6CVL.mjs → chunk-HYVEIP2N.mjs} +3 -3
  185. package/dist/{chunk-JQ7M6CVL.mjs.map → chunk-HYVEIP2N.mjs.map} +1 -1
  186. package/dist/{chunk-H6YVT3BL.js → chunk-I3ND4XYW.js} +12 -9
  187. package/dist/chunk-I3ND4XYW.js.map +1 -0
  188. package/dist/{chunk-4UVM7E2W.js → chunk-JDTU2RWC.js} +3 -3
  189. package/dist/{chunk-4UVM7E2W.js.map → chunk-JDTU2RWC.js.map} +1 -1
  190. package/dist/{chunk-GZJE23Y5.mjs → chunk-JLVCWC6A.mjs} +2 -2
  191. package/dist/chunk-JLVCWC6A.mjs.map +1 -0
  192. package/dist/chunk-K4TCEAUX.js +52 -0
  193. package/dist/chunk-K4TCEAUX.js.map +1 -0
  194. package/dist/chunk-KV7XXLJV.mjs +30 -0
  195. package/dist/chunk-KV7XXLJV.mjs.map +1 -0
  196. package/dist/{chunk-C563AHZZ.mjs → chunk-L24RDT6Q.mjs} +3 -3
  197. package/dist/{chunk-C563AHZZ.mjs.map → chunk-L24RDT6Q.mjs.map} +1 -1
  198. package/dist/{chunk-FEWWGEQF.js → chunk-LBZGYF3B.js} +4 -4
  199. package/dist/{chunk-FEWWGEQF.js.map → chunk-LBZGYF3B.js.map} +1 -1
  200. package/dist/{chunk-CPY74A4F.js → chunk-LMEUYRRR.js} +72 -106
  201. package/dist/chunk-LMEUYRRR.js.map +1 -0
  202. package/dist/chunk-LVGSOW2F.js +32 -0
  203. package/dist/chunk-LVGSOW2F.js.map +1 -0
  204. package/dist/{chunk-DOB37PV4.js → chunk-M45AL7EA.js} +37 -19
  205. package/dist/chunk-M45AL7EA.js.map +1 -0
  206. package/dist/{chunk-YYDZ2TYR.js → chunk-MHX6TOAS.js} +3 -3
  207. package/dist/{chunk-YYDZ2TYR.js.map → chunk-MHX6TOAS.js.map} +1 -1
  208. package/dist/chunk-MLVHVKFT.mjs +148 -0
  209. package/dist/chunk-MLVHVKFT.mjs.map +1 -0
  210. package/dist/{chunk-M5GY2AI3.mjs → chunk-N2NZBPQ5.mjs} +4 -10
  211. package/dist/chunk-N2NZBPQ5.mjs.map +1 -0
  212. package/dist/chunk-NRBITVDK.js +114 -0
  213. package/dist/chunk-NRBITVDK.js.map +1 -0
  214. package/dist/{chunk-O2VJZOR2.mjs → chunk-O4YBWJHP.mjs} +6 -11
  215. package/dist/chunk-O4YBWJHP.mjs.map +1 -0
  216. package/dist/{chunk-BUJWXSYZ.mjs → chunk-O5ZSGBQD.mjs} +4 -4
  217. package/dist/{chunk-BUJWXSYZ.mjs.map → chunk-O5ZSGBQD.mjs.map} +1 -1
  218. package/dist/{chunk-TP7H6BSK.mjs → chunk-OE7CTIOU.mjs} +73 -30
  219. package/dist/chunk-OE7CTIOU.mjs.map +1 -0
  220. package/dist/{chunk-UJ6CHZAI.mjs → chunk-OEW2LFOV.js} +169 -25
  221. package/dist/chunk-OEW2LFOV.js.map +1 -0
  222. package/dist/chunk-P4Y75QSU.js +19 -0
  223. package/dist/chunk-P4Y75QSU.js.map +1 -0
  224. package/dist/{chunk-Q7347KP6.mjs → chunk-PK2OTGW5.mjs} +6 -12
  225. package/dist/chunk-PK2OTGW5.mjs.map +1 -0
  226. package/dist/{chunk-H65OX263.js → chunk-PRTXAIIC.js} +15 -15
  227. package/dist/{chunk-H65OX263.js.map → chunk-PRTXAIIC.js.map} +1 -1
  228. package/dist/{chunk-ABZGEHTC.mjs → chunk-PUAXHYBL.mjs} +3 -3
  229. package/dist/{chunk-ABZGEHTC.mjs.map → chunk-PUAXHYBL.mjs.map} +1 -1
  230. package/dist/chunk-QRHVMTHF.mjs +94 -0
  231. package/dist/chunk-QRHVMTHF.mjs.map +1 -0
  232. package/dist/{chunk-JTCQJKJE.js → chunk-QTJTDQYR.js} +76 -111
  233. package/dist/chunk-QTJTDQYR.js.map +1 -0
  234. package/dist/{chunk-HBN4A2N4.mjs → chunk-QVHVL7EX.mjs} +3 -3
  235. package/dist/{chunk-HBN4A2N4.mjs.map → chunk-QVHVL7EX.mjs.map} +1 -1
  236. package/dist/chunk-R7GHP3FY.js +81 -0
  237. package/dist/chunk-R7GHP3FY.js.map +1 -0
  238. package/dist/{chunk-P4TB4ROG.js → chunk-SEP5D4MI.js} +8 -2
  239. package/dist/chunk-SEP5D4MI.js.map +1 -0
  240. package/dist/{chunk-3CLP35TT.mjs → chunk-TXMVU4EY.mjs} +62 -97
  241. package/dist/chunk-TXMVU4EY.mjs.map +1 -0
  242. package/dist/{chunk-L4V6TKMJ.mjs → chunk-U2V542EO.mjs} +7 -3
  243. package/dist/chunk-U2V542EO.mjs.map +1 -0
  244. package/dist/{chunk-4WBTM6YE.js → chunk-UWHCHYCX.js} +4 -4
  245. package/dist/{chunk-4WBTM6YE.js.map → chunk-UWHCHYCX.js.map} +1 -1
  246. package/dist/{chunk-JNAXDFC4.mjs → chunk-VJ74275U.mjs} +38 -156
  247. package/dist/chunk-VJ74275U.mjs.map +1 -0
  248. package/dist/{chunk-H7274TKR.mjs → chunk-VJV7WUR2.mjs} +12 -4
  249. package/dist/chunk-VJV7WUR2.mjs.map +1 -0
  250. package/dist/{chunk-4A5V73SR.mjs → chunk-VYL6IHJA.mjs} +9 -9
  251. package/dist/{chunk-4A5V73SR.mjs.map → chunk-VYL6IHJA.mjs.map} +1 -1
  252. package/dist/{chunk-5B4FABFK.js → chunk-WS7MH3GD.js} +14 -2
  253. package/dist/chunk-WS7MH3GD.js.map +1 -0
  254. package/dist/{chunk-IPV2TUAT.js → chunk-XA2GJFVM.js} +12 -4
  255. package/dist/chunk-XA2GJFVM.js.map +1 -0
  256. package/dist/chunk-XBX2K3GA.js +33 -0
  257. package/dist/chunk-XBX2K3GA.js.map +1 -0
  258. package/dist/{chunk-F3AKYZOH.js → chunk-XCYKM2SA.js} +6 -13
  259. package/dist/chunk-XCYKM2SA.js.map +1 -0
  260. package/dist/{chunk-6CJP7BFM.js → chunk-XZO5I4RS.mjs} +147 -20
  261. package/dist/chunk-XZO5I4RS.mjs.map +1 -0
  262. package/dist/chunk-Y5QZPUL3.mjs +47 -0
  263. package/dist/chunk-Y5QZPUL3.mjs.map +1 -0
  264. package/dist/{chunk-C4PZ2R3B.js → chunk-YECDJDDD.js} +10 -10
  265. package/dist/{chunk-C4PZ2R3B.js.map → chunk-YECDJDDD.js.map} +1 -1
  266. package/dist/chunk-YN7QHLWF.js +19 -0
  267. package/dist/chunk-YN7QHLWF.js.map +1 -0
  268. package/dist/chunk-YU7QZ3PP.mjs +45 -0
  269. package/dist/chunk-YU7QZ3PP.mjs.map +1 -0
  270. package/dist/{chunk-VFGEY6FJ.js → chunk-ZEOC26LZ.js} +223 -110
  271. package/dist/chunk-ZEOC26LZ.js.map +1 -0
  272. package/dist/{chunk-RVRN5U7W.mjs → chunk-ZVI7MBVF.mjs} +73 -38
  273. package/dist/chunk-ZVI7MBVF.mjs.map +1 -0
  274. package/dist/cli/agent/checks.d.ts +15 -1
  275. package/dist/cli/agent/checks.d.ts.map +1 -1
  276. package/dist/cli/agent/sitemap-trailing-slash.test.d.ts +2 -0
  277. package/dist/cli/agent/sitemap-trailing-slash.test.d.ts.map +1 -0
  278. package/dist/cli/commands/doctor.d.ts.map +1 -1
  279. package/dist/cli/commands/og.d.ts +26 -8
  280. package/dist/cli/commands/og.d.ts.map +1 -1
  281. package/dist/cli/index.js +683 -322
  282. package/dist/cli/index.js.map +1 -1
  283. package/dist/cli/index.mjs +604 -243
  284. package/dist/cli/index.mjs.map +1 -1
  285. package/dist/client/index.js +6 -6
  286. package/dist/client/index.mjs +5 -5
  287. package/dist/commerce/CheckoutForm.d.ts.map +1 -1
  288. package/dist/commerce/ProductDetail.d.ts.map +1 -1
  289. package/dist/commerce/api.d.ts +14 -0
  290. package/dist/commerce/api.d.ts.map +1 -1
  291. package/dist/commerce/discount-checkout.test.d.ts +2 -0
  292. package/dist/commerce/discount-checkout.test.d.ts.map +1 -0
  293. package/dist/commerce/index.d.ts +1 -1
  294. package/dist/commerce/index.d.ts.map +1 -1
  295. package/dist/commerce/index.js +61 -56
  296. package/dist/commerce/index.mjs +6 -5
  297. package/dist/config/index.js +3 -3
  298. package/dist/config/index.mjs +1 -1
  299. package/dist/discover-CYXYKHZ2.mjs +4 -0
  300. package/dist/{discover-FGTKWOL3.mjs.map → discover-CYXYKHZ2.mjs.map} +1 -1
  301. package/dist/discover-NGEPXZOD.js +21 -0
  302. package/dist/{discover-NJZPWTDL.js.map → discover-NGEPXZOD.js.map} +1 -1
  303. package/dist/engage/index.js +12 -10
  304. package/dist/engage/index.js.map +1 -1
  305. package/dist/engage/index.mjs +9 -7
  306. package/dist/engage/index.mjs.map +1 -1
  307. package/dist/fleet/index.js +8 -8
  308. package/dist/fleet/index.mjs +4 -4
  309. package/dist/forms/FormClient.d.ts.map +1 -1
  310. package/dist/forms/FormField.d.ts +7 -1
  311. package/dist/forms/FormField.d.ts.map +1 -1
  312. package/dist/forms/FormSpotlight.d.ts +1 -1
  313. package/dist/forms/FormSpotlight.d.ts.map +1 -1
  314. package/dist/forms/FormStage.d.ts +1 -1
  315. package/dist/forms/FormStage.d.ts.map +1 -1
  316. package/dist/forms/experience-plan.d.ts +0 -1
  317. package/dist/forms/experience-plan.d.ts.map +1 -1
  318. package/dist/forms/field-interactions.d.ts +63 -0
  319. package/dist/forms/field-interactions.d.ts.map +1 -0
  320. package/dist/forms/field-interactions.test.d.ts +8 -0
  321. package/dist/forms/field-interactions.test.d.ts.map +1 -0
  322. package/dist/forms/field-rules.d.ts +41 -0
  323. package/dist/forms/field-rules.d.ts.map +1 -0
  324. package/dist/forms/field-rules.test.d.ts +8 -0
  325. package/dist/forms/field-rules.test.d.ts.map +1 -0
  326. package/dist/forms/form-field-focus.test.d.ts +8 -0
  327. package/dist/forms/form-field-focus.test.d.ts.map +1 -0
  328. package/dist/forms/index.js +25 -23
  329. package/dist/forms/index.js.map +1 -1
  330. package/dist/forms/index.mjs +13 -11
  331. package/dist/forms/index.mjs.map +1 -1
  332. package/dist/forms/server.js +11 -11
  333. package/dist/forms/server.mjs +9 -9
  334. package/dist/forms/static.js +8 -8
  335. package/dist/forms/static.mjs +7 -7
  336. package/dist/forms/tracking-session.d.ts +48 -3
  337. package/dist/forms/tracking-session.d.ts.map +1 -1
  338. package/dist/forms/types.d.ts +11 -0
  339. package/dist/forms/types.d.ts.map +1 -1
  340. package/dist/forms/useForm.d.ts +8 -0
  341. package/dist/forms/useForm.d.ts.map +1 -1
  342. package/dist/forms/useFormTracking.d.ts +29 -4
  343. package/dist/forms/useFormTracking.d.ts.map +1 -1
  344. package/dist/images/index.js +11 -11
  345. package/dist/images/index.mjs +4 -4
  346. package/dist/index.js +72 -68
  347. package/dist/index.js.map +1 -1
  348. package/dist/index.mjs +14 -10
  349. package/dist/index.mjs.map +1 -1
  350. package/dist/layout/client.js +10 -10
  351. package/dist/layout/client.mjs +9 -9
  352. package/dist/layout/index.js +13 -12
  353. package/dist/layout/index.js.map +1 -1
  354. package/dist/layout/index.mjs +11 -10
  355. package/dist/layout/index.mjs.map +1 -1
  356. package/dist/llms/aiRobots.d.ts +20 -4
  357. package/dist/llms/aiRobots.d.ts.map +1 -1
  358. package/dist/llms/api.d.ts +8 -3
  359. package/dist/llms/api.d.ts.map +1 -1
  360. package/dist/llms/discovery-headers.d.ts +24 -0
  361. package/dist/llms/discovery-headers.d.ts.map +1 -1
  362. package/dist/llms/generateLLMsTxt.d.ts.map +1 -1
  363. package/dist/llms/index.d.ts +2 -2
  364. package/dist/llms/index.d.ts.map +1 -1
  365. package/dist/llms/index.js +45 -96
  366. package/dist/llms/index.js.map +1 -1
  367. package/dist/llms/index.mjs +11 -81
  368. package/dist/llms/index.mjs.map +1 -1
  369. package/dist/llms/links.d.ts +26 -0
  370. package/dist/llms/links.d.ts.map +1 -0
  371. package/dist/llms/links.test.d.ts +2 -0
  372. package/dist/llms/links.test.d.ts.map +1 -0
  373. package/dist/llms/types.d.ts +15 -0
  374. package/dist/llms/types.d.ts.map +1 -1
  375. package/dist/llms/wiring.d.ts +22 -0
  376. package/dist/llms/wiring.d.ts.map +1 -1
  377. package/dist/llms/writeLLMsTxt.d.ts +9 -0
  378. package/dist/llms/writeLLMsTxt.d.ts.map +1 -1
  379. package/dist/maps/index.js +5 -5
  380. package/dist/maps/index.mjs +3 -3
  381. package/dist/motion/gsap.d.ts +54 -0
  382. package/dist/motion/gsap.d.ts.map +1 -1
  383. package/dist/motion/gsap.js +34 -4
  384. package/dist/motion/gsap.js.map +1 -1
  385. package/dist/motion/gsap.mjs +33 -5
  386. package/dist/motion/gsap.mjs.map +1 -1
  387. package/dist/motion/gsap.test.d.ts +2 -0
  388. package/dist/motion/gsap.test.d.ts.map +1 -0
  389. package/dist/og/config.d.ts +6 -0
  390. package/dist/og/config.d.ts.map +1 -1
  391. package/dist/og/contrast.d.ts +33 -0
  392. package/dist/og/contrast.d.ts.map +1 -0
  393. package/dist/og/index.d.ts +2 -0
  394. package/dist/og/index.d.ts.map +1 -1
  395. package/dist/og/index.js +26 -8
  396. package/dist/og/index.mjs +3 -1
  397. package/dist/og/pages.d.ts +101 -0
  398. package/dist/og/pages.d.ts.map +1 -1
  399. package/dist/og/route-copy.d.ts +34 -0
  400. package/dist/og/route-copy.d.ts.map +1 -0
  401. package/dist/og/route-fit.d.ts +77 -0
  402. package/dist/og/route-fit.d.ts.map +1 -0
  403. package/dist/og/route.d.ts +80 -20
  404. package/dist/og/route.d.ts.map +1 -1
  405. package/dist/og/route.js +195 -25
  406. package/dist/og/route.js.map +1 -1
  407. package/dist/og/route.mjs +193 -26
  408. package/dist/og/route.mjs.map +1 -1
  409. package/dist/og/route.test.d.ts +2 -0
  410. package/dist/og/route.test.d.ts.map +1 -0
  411. package/dist/og/template.d.ts.map +1 -1
  412. package/dist/og/wiring.d.ts +43 -3
  413. package/dist/og/wiring.d.ts.map +1 -1
  414. package/dist/proxy/index.d.ts.map +1 -1
  415. package/dist/proxy/index.js +15 -10
  416. package/dist/proxy/index.js.map +1 -1
  417. package/dist/proxy/index.mjs +12 -7
  418. package/dist/proxy/index.mjs.map +1 -1
  419. package/dist/proxy/llms-discovery.test.d.ts +2 -0
  420. package/dist/proxy/llms-discovery.test.d.ts.map +1 -0
  421. package/dist/redirects/index.d.ts +24 -0
  422. package/dist/redirects/index.d.ts.map +1 -1
  423. package/dist/redirects/index.js +11 -8
  424. package/dist/redirects/index.mjs +4 -1
  425. package/dist/redirects/index.test.d.ts +2 -0
  426. package/dist/redirects/index.test.d.ts.map +1 -0
  427. package/dist/redirects/not-found.js +8 -5
  428. package/dist/redirects/not-found.js.map +1 -1
  429. package/dist/redirects/not-found.mjs +4 -1
  430. package/dist/redirects/not-found.mjs.map +1 -1
  431. package/dist/robots/index.d.ts +2 -0
  432. package/dist/robots/index.d.ts.map +1 -1
  433. package/dist/robots/index.js +23 -3
  434. package/dist/robots/index.js.map +1 -1
  435. package/dist/robots/index.mjs +2 -2
  436. package/dist/robots/index.mjs.map +1 -1
  437. package/dist/search/index.js +4 -4
  438. package/dist/search/index.mjs +3 -3
  439. package/dist/seo/ManagedContent.d.ts +4 -2
  440. package/dist/seo/ManagedContent.d.ts.map +1 -1
  441. package/dist/seo/ManagedFAQ.d.ts.map +1 -1
  442. package/dist/seo/ManagedInternalLinks.d.ts.map +1 -1
  443. package/dist/seo/ManagedSchema.d.ts.map +1 -1
  444. package/dist/seo/client.js +6 -6
  445. package/dist/seo/client.mjs +5 -5
  446. package/dist/seo/getManagedMetadata.d.ts.map +1 -1
  447. package/dist/seo/getManagedMetadata.test.d.ts +2 -0
  448. package/dist/seo/getManagedMetadata.test.d.ts.map +1 -0
  449. package/dist/seo/index.js +59 -49
  450. package/dist/seo/index.js.map +1 -1
  451. package/dist/seo/index.mjs +29 -19
  452. package/dist/seo/index.mjs.map +1 -1
  453. package/dist/seo/managed-schema-filter.test.d.ts +2 -0
  454. package/dist/seo/managed-schema-filter.test.d.ts.map +1 -0
  455. package/dist/seo/register-sitemap-cli-impl.d.ts +32 -0
  456. package/dist/seo/register-sitemap-cli-impl.d.ts.map +1 -1
  457. package/dist/seo/register-sitemap-cli.d.ts +7 -0
  458. package/dist/seo/register-sitemap-cli.d.ts.map +1 -1
  459. package/dist/seo/register-sitemap-cli.js +273 -56
  460. package/dist/seo/register-sitemap-cli.js.map +1 -1
  461. package/dist/seo/register-sitemap-cli.mjs +269 -52
  462. package/dist/seo/register-sitemap-cli.mjs.map +1 -1
  463. package/dist/seo/register-sitemap-request.d.ts +36 -0
  464. package/dist/seo/register-sitemap-request.d.ts.map +1 -0
  465. package/dist/seo/register-sitemap-request.test.d.ts +2 -0
  466. package/dist/seo/register-sitemap-request.test.d.ts.map +1 -0
  467. package/dist/seo/routing.d.ts +2 -0
  468. package/dist/seo/routing.d.ts.map +1 -1
  469. package/dist/seo/schema-filter.d.ts +43 -0
  470. package/dist/seo/schema-filter.d.ts.map +1 -0
  471. package/dist/seo/schema-filter.test.d.ts +2 -0
  472. package/dist/seo/schema-filter.test.d.ts.map +1 -0
  473. package/dist/seo/server-api.d.ts +15 -2
  474. package/dist/seo/server-api.d.ts.map +1 -1
  475. package/dist/seo/server.js +23 -18
  476. package/dist/seo/server.mjs +7 -2
  477. package/dist/seo/site-scope.test.d.ts +2 -0
  478. package/dist/seo/site-scope.test.d.ts.map +1 -0
  479. package/dist/seo/types.d.ts +30 -0
  480. package/dist/seo/types.d.ts.map +1 -1
  481. package/dist/seo-meta/contract.d.ts +60 -0
  482. package/dist/seo-meta/contract.d.ts.map +1 -0
  483. package/dist/seo-meta/contract.js +41 -0
  484. package/dist/seo-meta/contract.js.map +1 -0
  485. package/dist/seo-meta/contract.mjs +4 -0
  486. package/dist/seo-meta/contract.mjs.map +1 -0
  487. package/dist/seo-meta/contract.test.d.ts +2 -0
  488. package/dist/seo-meta/contract.test.d.ts.map +1 -0
  489. package/dist/server/index.js +4 -3
  490. package/dist/server/index.mjs +3 -2
  491. package/dist/server/mint-site-token.d.ts +2 -32
  492. package/dist/server/mint-site-token.d.ts.map +1 -1
  493. package/dist/{server-api-RG3ZL3DV.mjs → server-api-A2EFCTZX.mjs} +7 -3
  494. package/dist/{server-api-RG3ZL3DV.mjs.map → server-api-A2EFCTZX.mjs.map} +1 -1
  495. package/dist/{server-api-RYJQAUGO.js → server-api-IWTZ7C3O.js} +25 -21
  496. package/dist/{server-api-RYJQAUGO.js.map → server-api-IWTZ7C3O.js.map} +1 -1
  497. package/dist/shared/build-entries.d.ts +2 -0
  498. package/dist/shared/build-entries.d.ts.map +1 -1
  499. package/dist/shared/fresh-fetch.d.ts +64 -0
  500. package/dist/shared/fresh-fetch.d.ts.map +1 -0
  501. package/dist/shared/fresh-fetch.test.d.ts +2 -0
  502. package/dist/shared/fresh-fetch.test.d.ts.map +1 -0
  503. package/dist/shared/next-files.d.ts +7 -0
  504. package/dist/shared/next-files.d.ts.map +1 -1
  505. package/dist/shared/page-leave.d.ts +27 -0
  506. package/dist/shared/page-leave.d.ts.map +1 -0
  507. package/dist/shared/page-leave.test.d.ts +2 -0
  508. package/dist/shared/page-leave.test.d.ts.map +1 -0
  509. package/dist/shared/source-graph.d.ts +63 -0
  510. package/dist/shared/source-graph.d.ts.map +1 -0
  511. package/dist/shared/source-graph.test.d.ts +2 -0
  512. package/dist/shared/source-graph.test.d.ts.map +1 -0
  513. package/dist/shared/version.d.ts +1 -1
  514. package/dist/signal/SignalCore.d.ts.map +1 -1
  515. package/dist/signal/index.js +11 -11
  516. package/dist/signal/index.mjs +2 -2
  517. package/dist/sitemap/index.d.ts +19 -4
  518. package/dist/sitemap/index.d.ts.map +1 -1
  519. package/dist/sitemap/index.js +53 -43
  520. package/dist/sitemap/index.js.map +1 -1
  521. package/dist/sitemap/index.mjs +37 -27
  522. package/dist/sitemap/index.mjs.map +1 -1
  523. package/dist/sitemap/shared.d.ts +65 -0
  524. package/dist/sitemap/shared.d.ts.map +1 -1
  525. package/dist/sitemap/trailing-slash.test.d.ts +2 -0
  526. package/dist/sitemap/trailing-slash.test.d.ts.map +1 -0
  527. package/dist/sites/resolve.d.ts.map +1 -1
  528. package/dist/sites/site-param.d.ts +16 -0
  529. package/dist/sites/site-param.d.ts.map +1 -0
  530. package/dist/sync/index.js +17 -17
  531. package/dist/sync/index.mjs +4 -4
  532. package/dist/writeLLMsTxt-CQ7A4AAL.js +20 -0
  533. package/dist/writeLLMsTxt-CQ7A4AAL.js.map +1 -0
  534. package/dist/writeLLMsTxt-NX5MSPYX.mjs +11 -0
  535. package/dist/writeLLMsTxt-NX5MSPYX.mjs.map +1 -0
  536. package/package.json +8 -3
  537. package/dist/AnalyticsProvider-EWF7JN2X.mjs +0 -11
  538. package/dist/AnalyticsProvider-GJFG7YXA.js +0 -32
  539. package/dist/BlogViewTracker-2D3IJPJK.js.map +0 -1
  540. package/dist/BlogViewTracker-CKYG6MYU.mjs.map +0 -1
  541. package/dist/ChatWidget-AWP6GBVW.js +0 -22
  542. package/dist/ChatWidget-Z5QXDZP3.mjs +0 -13
  543. package/dist/EngageWidget-BKEY5TPO.mjs +0 -12
  544. package/dist/EngageWidget-VT4DYXVO.js +0 -21
  545. package/dist/FormSpotlight-OTFB6QM5.mjs.map +0 -1
  546. package/dist/FormSpotlight-URS4XRS7.js.map +0 -1
  547. package/dist/FormStage-FVKMIV73.js.map +0 -1
  548. package/dist/FormStage-VPGOCMAV.mjs.map +0 -1
  549. package/dist/ManagedForm-CXVDJMHN.mjs +0 -14
  550. package/dist/ManagedForm-FGNTDGED.js +0 -23
  551. package/dist/ManagedNewsletterForm-3O5L44AZ.js.map +0 -1
  552. package/dist/ManagedNewsletterForm-SQYB4BZU.mjs.map +0 -1
  553. package/dist/SignalCore-M2PKKIGH.mjs.map +0 -1
  554. package/dist/SignalCore-RFBOBNLQ.js.map +0 -1
  555. package/dist/SitemapSync-4OVMIIGC.mjs +0 -9
  556. package/dist/SitemapSync-RK3SQ4M2.js +0 -18
  557. package/dist/chunk-3CLP35TT.mjs.map +0 -1
  558. package/dist/chunk-3UC6JETG.js +0 -32
  559. package/dist/chunk-3UC6JETG.js.map +0 -1
  560. package/dist/chunk-3YQILJKJ.js.map +0 -1
  561. package/dist/chunk-4B4S56WJ.mjs.map +0 -1
  562. package/dist/chunk-5B4FABFK.js.map +0 -1
  563. package/dist/chunk-5TXXTYXL.js +0 -8
  564. package/dist/chunk-6CJP7BFM.js.map +0 -1
  565. package/dist/chunk-6FC5Q4KU.mjs.map +0 -1
  566. package/dist/chunk-7ZX6TO6C.mjs.map +0 -1
  567. package/dist/chunk-AWK57R5S.mjs +0 -29
  568. package/dist/chunk-AWK57R5S.mjs.map +0 -1
  569. package/dist/chunk-BFJOZ3MU.mjs.map +0 -1
  570. package/dist/chunk-BFM5PEFV.js.map +0 -1
  571. package/dist/chunk-CPY74A4F.js.map +0 -1
  572. package/dist/chunk-DOB37PV4.js.map +0 -1
  573. package/dist/chunk-F3AKYZOH.js.map +0 -1
  574. package/dist/chunk-FO4KGPGF.js.map +0 -1
  575. package/dist/chunk-GZJE23Y5.mjs.map +0 -1
  576. package/dist/chunk-H4OBGC43.mjs.map +0 -1
  577. package/dist/chunk-H6YVT3BL.js.map +0 -1
  578. package/dist/chunk-H7274TKR.mjs.map +0 -1
  579. package/dist/chunk-ILNCUSXW.mjs.map +0 -1
  580. package/dist/chunk-IPV2TUAT.js.map +0 -1
  581. package/dist/chunk-JEOKDUPQ.js +0 -45
  582. package/dist/chunk-JEOKDUPQ.js.map +0 -1
  583. package/dist/chunk-JNAXDFC4.mjs.map +0 -1
  584. package/dist/chunk-JNRHTZL4.js.map +0 -1
  585. package/dist/chunk-JTCQJKJE.js.map +0 -1
  586. package/dist/chunk-L4V6TKMJ.mjs.map +0 -1
  587. package/dist/chunk-LC7AM4J5.js.map +0 -1
  588. package/dist/chunk-M5GY2AI3.mjs.map +0 -1
  589. package/dist/chunk-O2VJZOR2.mjs.map +0 -1
  590. package/dist/chunk-OZ3FU4BT.js.map +0 -1
  591. package/dist/chunk-P4TB4ROG.js.map +0 -1
  592. package/dist/chunk-Q7347KP6.mjs.map +0 -1
  593. package/dist/chunk-QJU6HBSK.mjs +0 -39
  594. package/dist/chunk-QJU6HBSK.mjs.map +0 -1
  595. package/dist/chunk-QRBPT6Z6.mjs +0 -6
  596. package/dist/chunk-RCSTDJUH.js.map +0 -1
  597. package/dist/chunk-RVRN5U7W.mjs.map +0 -1
  598. package/dist/chunk-TDJKGN5Q.mjs.map +0 -1
  599. package/dist/chunk-TP7H6BSK.mjs.map +0 -1
  600. package/dist/chunk-TSZIACRC.js.map +0 -1
  601. package/dist/chunk-UJ6CHZAI.mjs.map +0 -1
  602. package/dist/chunk-VFGEY6FJ.js.map +0 -1
  603. package/dist/discover-FGTKWOL3.mjs +0 -4
  604. package/dist/discover-NJZPWTDL.js +0 -21
@@ -0,0 +1,81 @@
1
+ 'use strict';
2
+
3
+ // src/sitemap/shared.ts
4
+ function inferPageType(urlPath) {
5
+ if (urlPath === "/" || urlPath === "") return "homepage";
6
+ if (/^\/services(\/|$)/i.test(urlPath)) return "service";
7
+ if (/^\/compare(\/|$)/i.test(urlPath)) return "comparison";
8
+ if (/^\/(insights|blog)(\/|$)/i.test(urlPath)) return "blog";
9
+ if (/^\/industries(\/|$)/i.test(urlPath)) return "industry";
10
+ if (/^\/work(\/|$)/i.test(urlPath)) return "portfolio";
11
+ if (/^\/faq(\/|$)/i.test(urlPath)) return "faq";
12
+ if (/^\/pricing(\/|$)/i.test(urlPath)) return "pricing";
13
+ return "page";
14
+ }
15
+ function stripTrailingSlash(path) {
16
+ if (path !== "/" && path.endsWith("/")) {
17
+ return path.slice(0, -1);
18
+ }
19
+ return path;
20
+ }
21
+ function applyTrailingSlash(path, trailingSlash) {
22
+ const cut = path.search(/[?#]/);
23
+ const pathname = cut === -1 ? path : path.slice(0, cut);
24
+ const suffix = cut === -1 ? "" : path.slice(cut);
25
+ return shapePathname(pathname, trailingSlash) + suffix;
26
+ }
27
+ function shapePathname(pathname, trailingSlash) {
28
+ if (pathname === "" || pathname === "/") return pathname;
29
+ if (/^\/\.well-known(\/|$)/.test(pathname)) return pathname;
30
+ const bare = stripTrailingSlash(pathname);
31
+ if (!trailingSlash) return bare;
32
+ const lastSegment = bare.slice(bare.lastIndexOf("/") + 1);
33
+ return lastSegment.includes(".") ? bare : `${bare}/`;
34
+ }
35
+ function nextTrailingSlash() {
36
+ let value;
37
+ try {
38
+ value = process.env.__NEXT_TRAILING_SLASH;
39
+ } catch {
40
+ return void 0;
41
+ }
42
+ if (value === true || value === "true") return true;
43
+ if (value === false || value === "false") return false;
44
+ return void 0;
45
+ }
46
+ function resolveTrailingSlash(explicit) {
47
+ return explicit ?? nextTrailingSlash() ?? false;
48
+ }
49
+ function locToPath(loc) {
50
+ let path;
51
+ try {
52
+ path = new URL(loc).pathname;
53
+ } catch {
54
+ path = loc.startsWith("/") ? loc : `/${loc}`;
55
+ }
56
+ return stripTrailingSlash(path);
57
+ }
58
+ var EMBEDDED_DOMAIN_PREFIX = /^\/{1,2}[a-z0-9.-]+\.[a-z]{2,}(\/|$)/i;
59
+ var EMBEDDED_DOMAIN_ANYWHERE = /\/\/[a-z0-9.-]+\.[a-z]{2,}/i;
60
+ function stripEmbeddedDomain(path) {
61
+ return path.replace(EMBEDDED_DOMAIN_PREFIX, "/");
62
+ }
63
+ function isMalformedSitemapPath(path) {
64
+ return path.includes("://") || EMBEDDED_DOMAIN_ANYWHERE.test(path);
65
+ }
66
+ var LLMS_WRITE_ROUTE_BUDGET_MS = 5e4;
67
+ function llmsWriteTimeoutMs(configured, routeStartedAt, now = Date.now()) {
68
+ if (configured != null) return configured;
69
+ return LLMS_WRITE_ROUTE_BUDGET_MS - (now - routeStartedAt);
70
+ }
71
+
72
+ exports.applyTrailingSlash = applyTrailingSlash;
73
+ exports.inferPageType = inferPageType;
74
+ exports.isMalformedSitemapPath = isMalformedSitemapPath;
75
+ exports.llmsWriteTimeoutMs = llmsWriteTimeoutMs;
76
+ exports.locToPath = locToPath;
77
+ exports.resolveTrailingSlash = resolveTrailingSlash;
78
+ exports.stripEmbeddedDomain = stripEmbeddedDomain;
79
+ exports.stripTrailingSlash = stripTrailingSlash;
80
+ //# sourceMappingURL=chunk-R7GHP3FY.js.map
81
+ //# sourceMappingURL=chunk-R7GHP3FY.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/sitemap/shared.ts"],"names":[],"mappings":"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","file":"chunk-R7GHP3FY.js","sourcesContent":["/**\n * @sonordev/site-kit — shared sitemap page classification + path normalization\n *\n * Single source of truth for two bits of logic that used to be copy-pasted in\n * three places (createSitemap in `sitemap/index.ts`, the runtime `SitemapSync`\n * component, and the `sonor-register-sitemap` CLI):\n *\n * 1. inferPageType — path → Signal page-type hint\n * 2. path normalization — turning a sitemap `<loc>` / entry URL into a clean,\n * site-relative path, and rejecting/repairing malformed embedded-domain paths\n *\n * It also owns the outbound direction, `applyTrailingSlash`: the shape of a\n * path in a URL the kit emits, which follows the site's Next `trailingSlash`.\n * Normalized paths (the dedupe/sync key) never carry the slash. Emitted URLs\n * carry it when the site does.\n *\n * The copies had already drifted (one treated `''` as the homepage, the others\n * didn't; one stripped embedded domains, another only rejected them). Keeping\n * one implementation is the CLAUDE.md \"consolidate duplicated logic\" rule.\n *\n * Pure string logic only — NO Node built-ins, NO React — so this file is safe to\n * import from the browser `SitemapSync` client component AND from the Node CLI.\n */\n\n/** Signal page-type hint attached to each sitemap entry. */\nexport type PageType =\n | 'homepage'\n | 'service'\n | 'comparison'\n | 'blog'\n | 'industry'\n | 'portfolio'\n | 'faq'\n | 'pricing'\n | 'page'\n\n/**\n * Infer a page type from a URL path, to give Signal context about what each\n * page covers. Accepts both `'/'` and `''` as the homepage (callers pass either\n * depending on how they normalized the path).\n */\nexport function inferPageType(urlPath: string): PageType {\n if (urlPath === '/' || urlPath === '') return 'homepage'\n if (/^\\/services(\\/|$)/i.test(urlPath)) return 'service'\n if (/^\\/compare(\\/|$)/i.test(urlPath)) return 'comparison'\n if (/^\\/(insights|blog)(\\/|$)/i.test(urlPath)) return 'blog'\n if (/^\\/industries(\\/|$)/i.test(urlPath)) return 'industry'\n if (/^\\/work(\\/|$)/i.test(urlPath)) return 'portfolio'\n if (/^\\/faq(\\/|$)/i.test(urlPath)) return 'faq'\n if (/^\\/pricing(\\/|$)/i.test(urlPath)) return 'pricing'\n return 'page'\n}\n\n/**\n * Strip a trailing slash from a path, preserving the `'/'` root. Used so that\n * `/about` and `/about/` are treated as the same page everywhere.\n */\nexport function stripTrailingSlash(path: string): string {\n if (path !== '/' && path.endsWith('/')) {\n return path.slice(0, -1)\n }\n return path\n}\n\n/**\n * Shape a site path the way the site's own Next config serves it.\n *\n * Single source of truth for Next's `trailingSlash` URL shape, used by\n * createSitemap (`<loc>`), the llms.txt link rewrite and ClusterNavigation.\n * With `trailingSlash: true`, Next 308-redirects `/about` to `/about/`. Every\n * URL the kit emits for a page has to carry the slash already, or crawlers\n * get a redirect instead of the page and the sitemap disagrees with the\n * canonicals. That's what happened on the five MDG property sites\n * (2026-09-15).\n *\n * Mirrors the redirects Next adds in `lib/load-custom-routes`:\n * - `/` stays `/`.\n * - A last segment with a `.` is a file (`/llms.txt`, `/feed.xml`) and never\n * gets a slash.\n * - `/.well-known/*` is left exactly as written. Next exempts it from both\n * redirects.\n * - `trailingSlash: false` strips the slash, which is Next's default.\n *\n * A `?query` or `#hash` is kept and the rule applies to the path before it.\n */\nexport function applyTrailingSlash(path: string, trailingSlash: boolean): string {\n const cut = path.search(/[?#]/)\n const pathname = cut === -1 ? path : path.slice(0, cut)\n const suffix = cut === -1 ? '' : path.slice(cut)\n return shapePathname(pathname, trailingSlash) + suffix\n}\n\nfunction shapePathname(pathname: string, trailingSlash: boolean): string {\n if (pathname === '' || pathname === '/') return pathname\n if (/^\\/\\.well-known(\\/|$)/.test(pathname)) return pathname\n const bare = stripTrailingSlash(pathname)\n if (!trailingSlash) return bare\n const lastSegment = bare.slice(bare.lastIndexOf('/') + 1)\n return lastSegment.includes('.') ? bare : `${bare}/`\n}\n\n/**\n * The site's `next.config` `trailingSlash`, or undefined when not running inside\n * a Next bundle.\n *\n * Next inlines `process.env.__NEXT_TRAILING_SLASH` at compile time (its\n * `define-env`) into every module it bundles, node_modules included, for\n * server, edge and client alike. The kit reads the site's config this way\n * with no file I/O. Keep the expression spelled exactly like this: the\n * bundler matches the literal member expression, so destructuring\n * `process.env` or indexing it with a variable gets no substitution.\n *\n * Returns undefined in plain Node, like a postbuild script, or when a site\n * lists the kit in `serverExternalPackages`. Pass `trailingSlash` explicitly\n * there.\n */\nexport function nextTrailingSlash(): boolean | undefined {\n let value: unknown\n try {\n value = process.env.__NEXT_TRAILING_SLASH\n } catch {\n return undefined // no `process` in this runtime and no Next substitution\n }\n if (value === true || value === 'true') return true\n if (value === false || value === 'false') return false\n return undefined\n}\n\n/** An explicit `trailingSlash` option, else the site's Next config, else Next's default (false). */\nexport function resolveTrailingSlash(explicit?: boolean): boolean {\n return explicit ?? nextTrailingSlash() ?? false\n}\n\n/**\n * Turn a sitemap `<loc>` value (a full URL) or an already-relative path into a\n * clean, site-relative path. Falls back gracefully when the value isn't a\n * parseable absolute URL, and always strips the trailing slash.\n *\n * `https://example.com/about/` → `/about`\n * `about` → `/about`\n */\nexport function locToPath(loc: string): string {\n let path: string\n try {\n path = new URL(loc).pathname\n } catch {\n path = loc.startsWith('/') ? loc : `/${loc}`\n }\n return stripTrailingSlash(path)\n}\n\n/**\n * Matches a leading embedded domain in a malformed path, e.g. a crawler or bad\n * generator producing `//example.com/services` instead of `/services`.\n */\nconst EMBEDDED_DOMAIN_PREFIX = /^\\/{1,2}[a-z0-9.-]+\\.[a-z]{2,}(\\/|$)/i\n\n/** Matches an embedded protocol or domain anywhere in a path (unrepairable). */\nconst EMBEDDED_DOMAIN_ANYWHERE = /\\/\\/[a-z0-9.-]+\\.[a-z]{2,}/i\n\n/**\n * Repair a path whose leading segment is actually a domain\n * (`//example.com/x` → `/x`). Only touches the leading embedded domain; a path\n * that's malformed deeper in is left for `isMalformedSitemapPath` to reject.\n */\nexport function stripEmbeddedDomain(path: string): string {\n return path.replace(EMBEDDED_DOMAIN_PREFIX, '/')\n}\n\n/**\n * True when a path still contains an embedded protocol or domain after\n * normalization — such a \"path\" isn't a real page path and must not be synced.\n */\nexport function isMalformedSitemapPath(path: string): boolean {\n return path.includes('://') || EMBEDDED_DOMAIN_ANYWHERE.test(path)\n}\n\n/**\n * How much of the sitemap route's time the build-time llms.txt write may use.\n *\n * Next gives a prerendered route 60s (`staticPageGenerationTimeout`), then\n * retries it and fails the build. Sonor generates llms.txt through an LLM call\n * that takes roughly 27-60s, so the write can't reliably fit, and it runs\n * after the Portal sync has already spent part of the budget. Until 2026-09 a\n * one-year Data Cache entry hid this: the call ran live only on a site's first\n * build, and every later build replayed the stored response (a stale file).\n * With reads fresh (shared/fresh-fetch.ts), the write gets whatever is left of\n * this share of the budget. When Sonor answers in time, llms.txt refreshes;\n * when it doesn't, the existing file keeps serving and the build still passes.\n */\nexport const LLMS_WRITE_ROUTE_BUDGET_MS = 50_000\n\n/**\n * Timeout for the in-route llms.txt write: an explicit `llmsWriteTimeoutMs`\n * wins; otherwise what's left of LLMS_WRITE_ROUTE_BUDGET_MS since the route\n * started. Zero or less means skip the write.\n */\nexport function llmsWriteTimeoutMs(\n configured: number | undefined,\n routeStartedAt: number,\n now: number = Date.now(),\n): number {\n if (configured != null) return configured\n return LLMS_WRITE_ROUTE_BUDGET_MS - (now - routeStartedAt)\n}\n"]}
@@ -13,6 +13,7 @@ var NEXT_APP_DIRS = ["app", path__default.default.join("src", "app")];
13
13
  var NEXT_SOURCE_EXTENSIONS = ["tsx", "ts", "jsx", "js"];
14
14
  var NEXT_PROXY_FILES = ["proxy.ts", "proxy.js", "src/proxy.ts", "src/proxy.js"];
15
15
  var NEXT_MIDDLEWARE_FILES = ["middleware.ts", "middleware.js", "src/middleware.ts", "src/middleware.js"];
16
+ var NEXT_CONFIG_FILES = ["next.config.js", "next.config.mjs", "next.config.ts", "next.config.mts"];
16
17
  function safeExists(p) {
17
18
  try {
18
19
  return fs2__default.default.existsSync(p);
@@ -37,6 +38,9 @@ function findRootLayout(cwd) {
37
38
  }
38
39
  return null;
39
40
  }
41
+ function findNextConfig(cwd) {
42
+ return NEXT_CONFIG_FILES.find((rel) => safeExists(path__default.default.join(cwd, rel))) ?? null;
43
+ }
40
44
  function findProxyFiles(cwd) {
41
45
  return [...NEXT_PROXY_FILES, ...NEXT_MIDDLEWARE_FILES].filter((rel) => safeExists(path__default.default.join(cwd, rel)));
42
46
  }
@@ -99,12 +103,14 @@ function discoverNextJsRoutes(appDir, basePath = "") {
99
103
  exports.NEXT_APP_DIRS = NEXT_APP_DIRS;
100
104
  exports.NEXT_MIDDLEWARE_FILES = NEXT_MIDDLEWARE_FILES;
101
105
  exports.NEXT_PROXY_FILES = NEXT_PROXY_FILES;
106
+ exports.NEXT_SOURCE_EXTENSIONS = NEXT_SOURCE_EXTENSIONS;
102
107
  exports.discoverNextJsRoutes = discoverNextJsRoutes;
103
108
  exports.findAppDirForDiscovery = findAppDirForDiscovery;
104
109
  exports.findConventionFile = findConventionFile;
110
+ exports.findNextConfig = findNextConfig;
105
111
  exports.findProxyFiles = findProxyFiles;
106
112
  exports.findRootLayout = findRootLayout;
107
113
  exports.findSitemapRoute = findSitemapRoute;
108
114
  exports.hasPageFile = hasPageFile;
109
- //# sourceMappingURL=chunk-P4TB4ROG.js.map
110
- //# sourceMappingURL=chunk-P4TB4ROG.js.map
115
+ //# sourceMappingURL=chunk-SEP5D4MI.js.map
116
+ //# sourceMappingURL=chunk-SEP5D4MI.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-SEP5D4MI.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\n/**\n * next.config candidates in Next's own resolution order (`CONFIG_FILES` in\n * next/dist/shared/lib/constants). Next reads the first one present.\n */\nexport const NEXT_CONFIG_FILES = ['next.config.js', 'next.config.mjs', 'next.config.ts', 'next.config.mts']\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 path of the next.config Next will read, or null. */\nexport function findNextConfig(cwd: string): string | null {\n return NEXT_CONFIG_FILES.find(rel => safeExists(path.join(cwd, rel))) ?? 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"]}
@@ -1,9 +1,10 @@
1
1
  'use client';
2
- import { countStageViews, countStageQuestions, useFieldControls } from './chunk-Q7347KP6.mjs';
3
- import { HoneypotField, NativeFallbackFields, nativeFormProps } from './chunk-FBDHKYNF.mjs';
4
- import { DelightStyles, FormMomentum, FormField } from './chunk-H7274TKR.mjs';
5
- import { useFormTracking, useForm } from './chunk-TDJKGN5Q.mjs';
6
- import { submitForm, DEFAULT_FORM_SUCCESS_MESSAGE } from './chunk-HBN4A2N4.mjs';
2
+ import { countStageViews, countStageQuestions, useFieldControls } from './chunk-PK2OTGW5.mjs';
3
+ import { HoneypotField, NativeFallbackFields, nativeFormProps } from './chunk-5WGMXSCB.mjs';
4
+ import { DelightStyles, FormMomentum, FormField } from './chunk-VJV7WUR2.mjs';
5
+ import { useFormTracking, useForm } from './chunk-HEOQT5SM.mjs';
6
+ import { isFieldVisible, validateField, isFieldComplete, isDisplayOnly } from './chunk-QRHVMTHF.mjs';
7
+ import { submitForm, DEFAULT_FORM_SUCCESS_MESSAGE } from './chunk-QVHVL7EX.mjs';
7
8
  import { DEFAULT_HONEYPOT_FIELD } from './chunk-TMVKRQGJ.mjs';
8
9
  import { useState, useRef, useMemo, useEffect, useCallback } from 'react';
9
10
  import { jsx, Fragment, jsxs } from 'react/jsx-runtime';
@@ -43,12 +44,6 @@ function FormClient({
43
44
  const requested = experience ?? (config.layout === "stage" ? "stage" : config.layout === "classic" ? "classic" : "spotlight");
44
45
  const resolvedExperience = !customRender && questionCount > 0 && requested !== "classic" ? requested : "classic";
45
46
  const fieldControls = useFieldControls(config.fields);
46
- const { trackStepChange, trackComplete } = useFormTracking({
47
- formId: config.id,
48
- // Alternate experiences report their unit (beat / field index) as the
49
- // step — form_analytics becomes a drop-off funnel with zero API changes.
50
- totalSteps: resolvedExperience === "stage" ? stageBeatCount : resolvedExperience === "spotlight" ? questionCount : config.total_steps
51
- });
52
47
  const [Celebration, setCelebration] = useState(null);
53
48
  useEffect(() => {
54
49
  if (!isSubmitting && !isComplete) return;
@@ -68,7 +63,7 @@ function FormClient({
68
63
  return;
69
64
  }
70
65
  let cancelled = false;
71
- const load = resolvedExperience === "stage" ? import('./FormStage-VPGOCMAV.mjs').then((m) => m.FormStage) : import('./FormSpotlight-OTFB6QM5.mjs').then((m) => m.FormSpotlight);
66
+ const load = resolvedExperience === "stage" ? import('./FormStage-YSBN5XKL.mjs').then((m) => m.FormStage) : import('./FormSpotlight-E2LKKHGV.mjs').then((m) => m.FormSpotlight);
72
67
  load.then((Component) => {
73
68
  if (!cancelled) setExperience(() => Component);
74
69
  }).catch((err) => {
@@ -86,98 +81,61 @@ function FormClient({
86
81
  if (!currentStepConfig2) return config.fields || [];
87
82
  return (config.fields || []).filter((f) => f.step_id === currentStepConfig2.id);
88
83
  }, [config, step]);
89
- const isFieldVisible = useCallback((field) => {
90
- if (!field.conditional?.show_when) return true;
91
- const { field: condField, operator, value } = field.conditional.show_when;
92
- const fieldValue = values[condField];
93
- switch (operator) {
94
- case "equals":
95
- return fieldValue === value;
96
- case "not_equals":
97
- return fieldValue !== value;
98
- case "contains":
99
- return String(fieldValue).includes(String(value));
100
- case "not_contains":
101
- return !String(fieldValue).includes(String(value));
102
- case "is_empty":
103
- return !fieldValue || fieldValue === "";
104
- case "not_empty":
105
- return !!fieldValue && fieldValue !== "";
106
- case "greater_than":
107
- return Number(fieldValue) > Number(value);
108
- case "less_than":
109
- return Number(fieldValue) < Number(value);
110
- default:
111
- return true;
112
- }
113
- }, [values]);
114
- const validateField = useCallback((field) => {
115
- if (!isFieldVisible(field)) return null;
116
- if (["heading", "section_header", "paragraph", "hidden"].includes(field.field_type)) return null;
117
- const value = values[field.slug];
118
- const rules = field.validation || {};
119
- if (field.is_required && (!value || value === "")) {
120
- return rules.custom_error || `${field.label} is required`;
121
- }
122
- if (!value) return null;
123
- const strValue = String(value);
124
- if (rules.min_length && strValue.length < rules.min_length) {
125
- return `${field.label} must be at least ${rules.min_length} characters`;
126
- }
127
- if (rules.max_length && strValue.length > rules.max_length) {
128
- return `${field.label} must be no more than ${rules.max_length} characters`;
129
- }
130
- if (rules.min !== void 0 && Number(value) < rules.min) {
131
- return `${field.label} must be at least ${rules.min}`;
132
- }
133
- if (rules.max !== void 0 && Number(value) > rules.max) {
134
- return `${field.label} must be no more than ${rules.max}`;
135
- }
136
- if (rules.pattern) {
137
- try {
138
- if (!new RegExp(rules.pattern).test(strValue)) {
139
- return rules.custom_error || `${field.label} is invalid`;
140
- }
141
- } catch {
142
- }
143
- }
144
- if (field.field_type === "email" && !/^[^\s@]+@[^\s@]+\.[^\s@]+$/.test(strValue)) {
145
- return "Please enter a valid email address";
146
- }
147
- if (field.field_type === "phone" && !/^[\d\s\-\+\(\)]+$/.test(strValue)) {
148
- return "Please enter a valid phone number";
149
- }
150
- return null;
151
- }, [values, isFieldVisible]);
152
- const fieldIsComplete = useCallback((field) => {
153
- if (!isFieldVisible(field)) return false;
154
- if (["heading", "section_header", "paragraph", "hidden"].includes(field.field_type)) return false;
155
- const value = values[field.slug];
156
- if (value === void 0 || value === null || value === "") return false;
157
- return validateField(field) === null;
158
- }, [values, isFieldVisible, validateField]);
84
+ const isFieldVisible2 = useCallback(
85
+ (field) => isFieldVisible(field, values),
86
+ [values]
87
+ );
88
+ const validateField2 = useCallback(
89
+ (field) => validateField(field, values, isFieldVisible2),
90
+ [values, isFieldVisible2]
91
+ );
92
+ const fieldIsComplete = useCallback(
93
+ (field) => isFieldComplete(field, values, isFieldVisible2),
94
+ [values, isFieldVisible2]
95
+ );
159
96
  const momentum = useMemo(() => {
160
97
  const measurable = (config.fields || []).filter(
161
- (f) => f.is_required && isFieldVisible(f) && !["heading", "section_header", "paragraph", "hidden"].includes(f.field_type)
98
+ (f) => f.is_required && isFieldVisible2(f) && !isDisplayOnly(f)
162
99
  );
163
100
  return { done: measurable.filter(fieldIsComplete).length, total: measurable.length };
164
- }, [config, isFieldVisible, fieldIsComplete]);
101
+ }, [config, isFieldVisible2, fieldIsComplete]);
102
+ const fieldBySlug = useMemo(
103
+ () => new Map((config.fields || []).map((f) => [f.slug, f])),
104
+ [config.fields]
105
+ );
106
+ const {
107
+ trackStepChange,
108
+ trackComplete,
109
+ trackFieldFocus,
110
+ trackFieldBlur,
111
+ trackFieldChange
112
+ } = useFormTracking({
113
+ formId: config.id,
114
+ // Alternate experiences report their unit (beat / field index) as the
115
+ // step — form_analytics becomes a drop-off funnel with zero API changes.
116
+ totalSteps: resolvedExperience === "stage" ? stageBeatCount : resolvedExperience === "spotlight" ? questionCount : config.total_steps,
117
+ // Same verdict as the valid tick and the momentum count.
118
+ isFieldComplete: (slug) => {
119
+ const field = fieldBySlug.get(slug);
120
+ return field ? fieldIsComplete(field) : false;
121
+ }
122
+ });
165
123
  const validateStep = useCallback(() => {
166
124
  const newErrors = {};
167
125
  for (const field of currentFields) {
168
- const error = validateField(field);
126
+ const error = validateField2(field);
169
127
  if (error) {
170
128
  newErrors[field.slug] = error;
171
129
  }
172
130
  }
173
131
  setErrors(newErrors);
174
132
  return Object.keys(newErrors).length === 0;
175
- }, [currentFields, validateField]);
133
+ }, [currentFields, validateField2]);
176
134
  const validateAll = useCallback(() => {
177
135
  const allFields = config.fields || [];
178
136
  const newErrors = {};
179
137
  for (const field of allFields) {
180
- const error = validateField(field);
138
+ const error = validateField2(field);
181
139
  if (error) newErrors[field.slug] = error;
182
140
  }
183
141
  setErrors(newErrors);
@@ -193,18 +151,19 @@ function FormClient({
193
151
  }
194
152
  }
195
153
  return { ok: false, firstErrorStep };
196
- }, [config, validateField]);
154
+ }, [config, validateField2]);
197
155
  const buildVisibleValues = useCallback(() => {
198
156
  const out = {};
199
157
  for (const field of config.fields || []) {
200
- if (!isFieldVisible(field)) continue;
158
+ if (!isFieldVisible2(field)) continue;
201
159
  if (field.slug in values) out[field.slug] = values[field.slug];
202
160
  }
203
161
  return out;
204
- }, [config, values, isFieldVisible]);
162
+ }, [config, values, isFieldVisible2]);
205
163
  const setFieldValue = useCallback((key, value) => {
206
164
  setTouched((prev) => prev[key] ? prev : { ...prev, [key]: true });
207
165
  setValues((prev) => ({ ...prev, [key]: value }));
166
+ trackFieldChange(key);
208
167
  if (errors[key]) {
209
168
  setErrors((prev) => {
210
169
  const next = { ...prev };
@@ -212,7 +171,7 @@ function FormClient({
212
171
  return next;
213
172
  });
214
173
  }
215
- }, [errors]);
174
+ }, [errors, trackFieldChange]);
216
175
  const nextStep = useCallback(() => {
217
176
  if (!validateStep()) return false;
218
177
  if (step < config.total_steps) {
@@ -305,7 +264,9 @@ function FormClient({
305
264
  goToStep,
306
265
  submit,
307
266
  setFieldValue,
308
- isFieldVisible
267
+ isFieldVisible: isFieldVisible2,
268
+ trackFieldFocus,
269
+ trackFieldBlur
309
270
  };
310
271
  if (isComplete) {
311
272
  const raw = config.success_message;
@@ -327,12 +288,14 @@ function FormClient({
327
288
  momentum,
328
289
  className,
329
290
  setFieldValue,
330
- validateField,
331
- isFieldVisible,
291
+ validateField: validateField2,
292
+ isFieldVisible: isFieldVisible2,
332
293
  fieldIsComplete,
333
294
  applyFieldError: (slug, message) => setErrors((prev) => ({ ...prev, [slug]: message })),
334
295
  submit,
335
296
  trackStepChange,
297
+ trackFieldFocus,
298
+ trackFieldBlur,
336
299
  honeypot: config.honeypot_enabled ? /* @__PURE__ */ jsx(
337
300
  HoneypotField,
338
301
  {
@@ -410,7 +373,7 @@ function FormClient({
410
373
  currentStepConfig.description && /* @__PURE__ */ jsx("p", { className: "sk-form__step-description", children: currentStepConfig.description })
411
374
  ] }),
412
375
  /* @__PURE__ */ jsx("div", { className: "sk-form__fields", children: currentFields.map((field) => {
413
- if (!isFieldVisible(field)) return null;
376
+ if (!isFieldVisible2(field)) return null;
414
377
  return /* @__PURE__ */ jsx("div", { className: `sk-form__field-wrapper sk-form__field-wrapper--${field.width || "full"}`, children: /* @__PURE__ */ jsx(
415
378
  FormField,
416
379
  {
@@ -419,6 +382,8 @@ function FormClient({
419
382
  error: errors[field.slug],
420
383
  showValid: !!touched[field.slug] && !errors[field.slug] && fieldIsComplete(field),
421
384
  onChange: (value) => setFieldValue(field.slug, value),
385
+ onFocus: () => trackFieldFocus(field.slug),
386
+ onBlur: () => trackFieldBlur(field.slug),
422
387
  controls: fieldControls
423
388
  }
424
389
  ) }, field.id);
@@ -514,5 +479,5 @@ function ManagedForm({
514
479
  }
515
480
 
516
481
  export { FormClient, ManagedForm };
517
- //# sourceMappingURL=chunk-3CLP35TT.mjs.map
518
- //# sourceMappingURL=chunk-3CLP35TT.mjs.map
482
+ //# sourceMappingURL=chunk-TXMVU4EY.mjs.map
483
+ //# sourceMappingURL=chunk-TXMVU4EY.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/forms/FormClient.tsx","../src/forms/ManagedForm.tsx"],"names":["currentStepConfig","isFieldVisible","validateField","jsx"],"mappings":"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","file":"chunk-TXMVU4EY.mjs","sourcesContent":["/**\n * @sonordev/site-kit/forms - Form Client Component\n * \n * Handles form state, validation, and submission\n */\n\n'use client'\n\nimport React, { useState, useCallback, useMemo, useRef, useEffect } from 'react'\nimport { useFormTracking } from './useFormTracking'\nimport * as fieldRules from './field-rules'\nimport { FormField } from './FormField'\nimport { submitForm, DEFAULT_HONEYPOT_FIELD } from './submitForm'\nimport type { \n ManagedFormConfig, \n FormField as FormFieldType, \n FormRenderProps,\n FormSubmission,\n} from './types'\nimport { DEFAULT_FORM_SUCCESS_MESSAGE } from './defaultSuccessMessage'\nimport { DelightStyles, FormMomentum } from './delight'\nimport { HoneypotField } from './HoneypotField'\nimport { useFieldControls } from './field-controls'\nimport { nativeFormProps, NativeFallbackFields } from './native-fallback'\nimport { countStageViews, countStageQuestions } from './experience-plan'\nimport type { ExperienceRenderProps, FormExperience } from './types'\n\ninterface FormClientProps {\n config: ManagedFormConfig\n className?: string\n onSuccess?: (submission: FormSubmission) => void\n onError?: (error: Error) => void\n customRender?: (props: FormRenderProps) => React.ReactNode\n /**\n * Pre-fill field values by slug. For context the page already has and the\n * visitor should not retype: an email captured earlier in a conversation,\n * the service they were reading about, an estimate the assistant just\n * produced. Applied ON TOP of each field's configured default_value.\n *\n * Unknown slugs are ignored, so a stale key cannot break the form.\n */\n defaultValues?: Record<string, unknown>\n /**\n * Which rendering the form gets. Defaults to the form's `layout` config\n * (`layout: 'stage'` in Sonor flips a form to stage with no site deploy),\n * else 'classic'. customRender always wins over this.\n */\n experience?: FormExperience\n /** Absolute page URL for the no-JS 303 to land on (see native-fallback). */\n nativeReturnTo?: string\n}\n\nexport function FormClient({\n config,\n className,\n onSuccess,\n onError,\n customRender,\n experience,\n nativeReturnTo,\n defaultValues,\n}: FormClientProps) {\n // Seed default_value fields once (lazy initializer — config is stable for\n // the life of this mount; ManagedForm only renders us once it has a form).\n const [values, setValues] = useState<Record<string, unknown>>(() => {\n const defaults: Record<string, unknown> = {}\n for (const field of config.fields || []) {\n if (field.default_value !== undefined && field.default_value !== null) {\n defaults[field.slug] = field.default_value\n }\n }\n // Caller-supplied values win over the form's configured defaults — they\n // are per-visitor context (what Echo already knows about this person,\n // the service they were reading about) rather than form configuration.\n return { ...defaults, ...(defaultValues || {}) }\n })\n const [errors, setErrors] = useState<Record<string, string>>({})\n const [step, setStep] = useState(1)\n // Direction of the last step change, so the transition slides the way the\n // user is travelling ('forward' on Next, 'back' on Back).\n const [stepDirection, setStepDirection] = useState<'forward' | 'back'>('forward')\n const [isSubmitting, setIsSubmitting] = useState(false)\n const [isComplete, setIsComplete] = useState(false)\n const [submitError, setSubmitError] = useState<string | null>(null)\n const [honeypotValue, setHoneypotValue] = useState('')\n // Fields the user has interacted with — the valid tick only appears after\n // real input (never on pristine fields), so it reads as earned feedback.\n const [touched, setTouched] = useState<Record<string, boolean>>({})\n const honeypotFieldName = config.honeypot_field || DEFAULT_HONEYPOT_FIELD\n\n // Anti-bot: record when form first rendered (bots submit in < 3 seconds)\n const formLoadedAt = useRef(Date.now())\n // Synchronous guard against a concurrent double-submit (Enter + click, etc.).\n const isSubmittingRef = useRef(false)\n\n // Resolve the experience: explicit prop > form config > SPOTLIGHT.\n //\n // Spotlight is the 4.0 default: every managed form converses back unless it\n // opts out. Opting out is `experience=\"classic\"` on the component or\n // `layout: 'classic'` in Sonor (forms are data, so either side can decide\n // with no deploy from the other). customRender always wins, and a form with\n // no answerable fields has nothing to perform, so it falls back to classic.\n const stageBeatCount = useMemo(() => countStageViews(config), [config])\n const questionCount = useMemo(() => countStageQuestions(config), [config])\n const requested: FormExperience =\n experience ??\n (config.layout === 'stage'\n ? 'stage'\n : config.layout === 'classic'\n ? 'classic'\n : 'spotlight')\n const resolvedExperience: FormExperience =\n !customRender && questionCount > 0 && requested !== 'classic'\n ? requested\n : 'classic'\n\n // Date/file controls are fetched only when the form actually has such a\n // field — most forms have neither, and the date picker alone was ~5 KB\n // gzipped in every forms bundle. Until a chunk lands (and for SSR/no-JS),\n // FormField renders the native control, which submits the same value.\n const fieldControls = useFieldControls(config.fields)\n\n // The celebration is fetched as soon as the user starts submitting, so the\n // chunk arrives during the network round-trip and the payoff still feels\n // instant — without putting its markup and CSS in every form's bundle.\n const [Celebration, setCelebration] =\n useState<React.ComponentType<{ message: string; className?: string }> | null>(null)\n useEffect(() => {\n if (!isSubmitting && !isComplete) return\n let cancelled = false\n import('./FormCelebration')\n .then((m) => {\n if (!cancelled) setCelebration(() => m.FormCelebration)\n })\n .catch(() => {\n // Stays null — the plain confirmation message renders instead.\n })\n return () => {\n cancelled = true\n }\n }, [isSubmitting, isComplete])\n\n // Experience components load on demand, so a classic form (the fleet\n // default) never downloads stage/spotlight code or their stylesheets.\n // Until the chunk lands — and for SSR and no-JS — the CLASSIC form renders:\n // a complete, working, submittable form. The experience is progressive\n // enhancement layered on top, never a prerequisite for capturing the lead.\n const [Experience, setExperience] =\n useState<React.ComponentType<ExperienceRenderProps> | null>(null)\n useEffect(() => {\n if (resolvedExperience === 'classic') {\n setExperience(null)\n return\n }\n let cancelled = false\n const load =\n resolvedExperience === 'stage'\n ? import('./FormStage').then((m) => m.FormStage)\n : import('./FormSpotlight').then((m) => m.FormSpotlight)\n load\n .then((Component) => {\n // setState with a component value needs the updater form, or React\n // would call it as a lazy initializer.\n if (!cancelled) setExperience(() => Component)\n })\n .catch((err) => {\n // Chunk failed (offline, cache miss, CDN hiccup): stay on classic.\n console.error('[Forms] Experience failed to load; using classic form:', err)\n })\n return () => {\n cancelled = true\n }\n }, [resolvedExperience])\n \n // Get fields for current step\n const currentFields = useMemo(() => {\n if (!config.is_multi_step) {\n return config.fields || []\n }\n \n const currentStepConfig = config.steps?.find(s => s.step_number === step)\n if (!currentStepConfig) return config.fields || []\n \n return (config.fields || []).filter(f => f.step_id === currentStepConfig.id)\n }, [config, step])\n \n // Visibility, validation and completeness all come from field-rules.ts,\n // shared with useForm. These wrappers only bind the current values.\n const isFieldVisible = useCallback(\n (field: FormFieldType): boolean => fieldRules.isFieldVisible(field, values),\n [values],\n )\n\n const validateField = useCallback(\n (field: FormFieldType): string | null => fieldRules.validateField(field, values, isFieldVisible),\n [values, isFieldVisible],\n )\n\n // Delight: per-field validity for the tick + fields-completed momentum.\n const fieldIsComplete = useCallback(\n (field: FormFieldType): boolean => fieldRules.isFieldComplete(field, values, isFieldVisible),\n [values, isFieldVisible],\n )\n\n const momentum = useMemo(() => {\n const measurable = (config.fields || []).filter(\n f => f.is_required && isFieldVisible(f) && !fieldRules.isDisplayOnly(f),\n )\n return { done: measurable.filter(fieldIsComplete).length, total: measurable.length }\n }, [config, isFieldVisible, fieldIsComplete])\n\n const fieldBySlug = useMemo(\n () => new Map((config.fields || []).map((f) => [f.slug, f] as const)),\n [config.fields],\n )\n\n const {\n trackStepChange,\n trackComplete,\n trackFieldFocus,\n trackFieldBlur,\n trackFieldChange,\n } = useFormTracking({\n formId: config.id,\n // Alternate experiences report their unit (beat / field index) as the\n // step — form_analytics becomes a drop-off funnel with zero API changes.\n totalSteps:\n resolvedExperience === 'stage'\n ? stageBeatCount\n : resolvedExperience === 'spotlight'\n ? questionCount\n : config.total_steps,\n // Same verdict as the valid tick and the momentum count.\n isFieldComplete: (slug) => {\n const field = fieldBySlug.get(slug)\n return field ? fieldIsComplete(field) : false\n },\n })\n\n // Validate current step\n const validateStep = useCallback((): boolean => {\n const newErrors: Record<string, string> = {}\n \n for (const field of currentFields) {\n const error = validateField(field)\n if (error) {\n newErrors[field.slug] = error\n }\n }\n \n setErrors(newErrors)\n return Object.keys(newErrors).length === 0\n }, [currentFields, validateField])\n\n // Validate EVERY field across all steps — used on final submit so a required\n // field left empty on an earlier step cannot slip through. Returns the first\n // step containing an error so the user can be taken straight to it.\n const validateAll = useCallback((): { ok: boolean; firstErrorStep: number | null } => {\n const allFields = config.fields || []\n const newErrors: Record<string, string> = {}\n for (const field of allFields) {\n const error = validateField(field)\n if (error) newErrors[field.slug] = error\n }\n setErrors(newErrors)\n if (Object.keys(newErrors).length === 0) return { ok: true, firstErrorStep: null }\n\n let firstErrorStep: number | null = null\n if (config.is_multi_step && config.steps) {\n const ordered = [...config.steps].sort((a, b) => a.step_number - b.step_number)\n for (const s of ordered) {\n if (allFields.some((f) => f.step_id === s.id && newErrors[f.slug])) {\n firstErrorStep = s.step_number\n break\n }\n }\n }\n return { ok: false, firstErrorStep }\n }, [config, validateField])\n\n // Collect values for currently-visible fields only, so a value typed into a\n // field that later became conditionally hidden is never submitted.\n const buildVisibleValues = useCallback((): Record<string, unknown> => {\n const out: Record<string, unknown> = {}\n for (const field of config.fields || []) {\n if (!isFieldVisible(field)) continue\n if (field.slug in values) out[field.slug] = values[field.slug]\n }\n return out\n }, [config, values, isFieldVisible])\n\n // Set field value\n const setFieldValue = useCallback((key: string, value: unknown) => {\n setTouched(prev => (prev[key] ? prev : { ...prev, [key]: true }))\n setValues(prev => ({ ...prev, [key]: value }))\n trackFieldChange(key)\n // Clear error when field changes\n if (errors[key]) {\n setErrors(prev => {\n const next = { ...prev }\n delete next[key]\n return next\n })\n }\n }, [errors, trackFieldChange])\n \n // Step navigation\n const nextStep = useCallback((): boolean => {\n if (!validateStep()) return false\n \n if (step < config.total_steps) {\n const newStep = step + 1\n setStepDirection('forward')\n setStep(newStep)\n trackStepChange(newStep)\n return true\n }\n return false\n }, [step, config.total_steps, validateStep, trackStepChange])\n\n const prevStep = useCallback(() => {\n if (step > 1) {\n const newStep = step - 1\n setStepDirection('back')\n setStep(newStep)\n trackStepChange(newStep)\n }\n }, [step, trackStepChange])\n\n const goToStep = useCallback((targetStep: number) => {\n if (targetStep >= 1 && targetStep <= config.total_steps) {\n setStepDirection(targetStep < step ? 'back' : 'forward')\n setStep(targetStep)\n trackStepChange(targetStep)\n }\n }, [step, config.total_steps, trackStepChange])\n \n // Submit form\n const submit = useCallback(async () => {\n // Re-entrancy guard — refs update synchronously, so this blocks a second\n // submit fired in the same tick (Enter key + button click, or a double-tap).\n if (isSubmittingRef.current) return\n\n const { ok, firstErrorStep } = validateAll()\n if (!ok) {\n if (firstErrorStep != null) {\n setStepDirection('back')\n setStep(firstErrorStep)\n }\n return\n }\n\n isSubmittingRef.current = true\n setIsSubmitting(true)\n setSubmitError(null)\n\n try {\n const data = await submitForm({\n config,\n values: buildVisibleValues(),\n honeypotValue: config.honeypot_enabled ? honeypotValue : '',\n formLoadedAt: formLoadedAt.current,\n })\n\n trackComplete()\n setIsComplete(true)\n onSuccess?.(data as FormSubmission)\n\n if (config.redirect_url) {\n window.location.href = config.redirect_url\n }\n } catch (error) {\n console.error('[Forms] Submission error:', error)\n setSubmitError('Something went wrong sending your submission. Please try again.')\n onError?.(error as Error)\n } finally {\n isSubmittingRef.current = false\n setIsSubmitting(false)\n }\n }, [config, honeypotValue, validateAll, buildVisibleValues, trackComplete, onSuccess, onError])\n \n // Progress percentage\n const progress = useMemo(() => {\n return Math.round((step / config.total_steps) * 100)\n }, [step, config.total_steps])\n\n // Title/description the admin gave the current step, used as the step's\n // conversational heading. Absent for single-step forms.\n const currentStepConfig = useMemo(\n () => config.steps?.find((s) => s.step_number === step),\n [config.steps, step],\n )\n\n // Move focus to the new step's panel so keyboard and screen-reader users land\n // on the fields they just navigated to instead of staying on a button that\n // has moved. Skipped on first render so the form never steals focus on load.\n const stepPanelRef = useRef<HTMLDivElement | null>(null)\n const hasNavigatedRef = useRef(false)\n useEffect(() => {\n if (!config.is_multi_step) return\n if (!hasNavigatedRef.current) {\n hasNavigatedRef.current = true\n return\n }\n stepPanelRef.current?.focus()\n }, [step, config.is_multi_step])\n\n\n // Render props for custom rendering\n const renderProps: FormRenderProps = {\n config,\n fields: currentFields,\n step,\n totalSteps: config.total_steps,\n values,\n errors,\n isSubmitting,\n progress,\n nextStep,\n prevStep,\n goToStep,\n submit,\n setFieldValue,\n isFieldVisible,\n trackFieldFocus,\n trackFieldBlur,\n }\n \n // Show success message (fallback when API returns empty / null success_message)\n if (isComplete) {\n const raw = config.success_message\n const message =\n typeof raw === 'string' && raw.trim().length > 0\n ? raw.trim()\n : DEFAULT_FORM_SUCCESS_MESSAGE\n // The payoff moment — celebration, not a receipt. Sites theme it via\n // --sk-primary + data-sk-part; reduced-motion users get the static check.\n // Loaded lazily (it only ever renders AFTER a submit round-trip, so the\n // chunk fetch is free), but the confirmation itself never depends on\n // that chunk: until it lands, and if it never lands, the plain message\n // below is shown. A user must always be told their submission worked.\n if (Celebration) return <Celebration message={message} className={className} />\n return (\n <div className={className} data-sk-part=\"celebration-fallback\" role=\"status\">\n <p>{message}</p>\n </div>\n )\n }\n \n // Custom render\n if (customRender) {\n return <>{customRender(renderProps)}</>\n }\n\n // Alternate experiences — render BRANCHES, not customRenders: this\n // FormClient still owns values/errors/honeypot/submit, so spam defense and\n // validation are identical to classic.\n if (resolvedExperience !== 'classic' && Experience) {\n const bundle: ExperienceRenderProps = {\n config,\n values,\n errors,\n touched,\n isSubmitting,\n submitError,\n momentum,\n className,\n setFieldValue,\n validateField,\n isFieldVisible,\n fieldIsComplete,\n applyFieldError: (slug, message) =>\n setErrors((prev) => ({ ...prev, [slug]: message })),\n submit,\n trackStepChange,\n trackFieldFocus,\n trackFieldBlur,\n honeypot: config.honeypot_enabled ? (\n <HoneypotField\n name={honeypotFieldName}\n value={honeypotValue}\n onChange={setHoneypotValue}\n />\n ) : null,\n }\n return (\n <>\n <DelightStyles />\n <Experience {...bundle} />\n </>\n )\n }\n\n // Default render\n return (\n <form data-sk-state={isSubmitting ? 'submitting' : 'idle'}\n // Ready = every required field validates AND the submit button (not\n // \"Next\") is what's showing — the wake-up glow means \"press start\".\n data-sk-ready={\n momentum.total > 0 && momentum.done >= momentum.total && step >= config.total_steps\n ? 'true'\n : undefined\n }\n className={`sk-form ${className || ''}`}\n // No-JS floor: real action/method so the browser can POST without the\n // bundle. With JS the preventDefault below always wins.\n {...nativeFormProps(config)}\n onSubmit={(e) => {\n e.preventDefault()\n if (step < config.total_steps) {\n nextStep()\n } else {\n submit()\n }\n }}\n >\n <DelightStyles />\n <FormMomentum done={momentum.done} total={momentum.total} />\n {/* Step indicator for multi-step */}\n {config.is_multi_step && (\n <div className=\"sk-form__progress\">\n <div className=\"sk-form__progress-header\">\n <span className=\"sk-form__progress-step\">\n Step {step} of {config.total_steps}\n </span>\n {/* The percentage readout is opt-in — \"Step 2 of 4\" already gives\n the user their position, and a bare number reads as pressure. */}\n {config.show_progress && (\n <span className=\"sk-form__progress-percent\">{progress}%</span>\n )}\n </div>\n <div\n className=\"sk-form__progress-track\"\n role=\"progressbar\"\n aria-valuemin={1}\n aria-valuemax={config.total_steps}\n aria-valuenow={step}\n aria-valuetext={`Step ${step} of ${config.total_steps}`}\n >\n <div className=\"sk-form__progress-bar\" style={{ width: `${progress}%` }} />\n </div>\n <ol className=\"sk-form__progress-dots\" aria-hidden=\"true\">\n {Array.from({ length: config.total_steps }, (_, i) => i + 1).map((n) => (\n <li\n key={n}\n className={\n 'sk-form__progress-dot' +\n (n === step ? ' sk-form__progress-dot--current' : '') +\n (n < step ? ' sk-form__progress-dot--done' : '')\n }\n />\n ))}\n </ol>\n </div>\n )}\n\n {/* Fields — keyed by step so each step animates in on navigation */}\n <div\n key={step}\n ref={stepPanelRef}\n tabIndex={-1}\n className={\n 'sk-form__step' +\n (config.is_multi_step ? ` sk-form__step--${stepDirection}` : '')\n }\n >\n {config.is_multi_step && (currentStepConfig?.title || currentStepConfig?.description) && (\n <div className=\"sk-form__step-intro\">\n {currentStepConfig.title && (\n <h3 className=\"sk-form__step-title\">{currentStepConfig.title}</h3>\n )}\n {currentStepConfig.description && (\n <p className=\"sk-form__step-description\">{currentStepConfig.description}</p>\n )}\n </div>\n )}\n\n <div className=\"sk-form__fields\">\n {currentFields.map((field) => {\n if (!isFieldVisible(field)) return null\n\n return (\n <div key={field.id} className={`sk-form__field-wrapper sk-form__field-wrapper--${field.width || 'full'}`}>\n <FormField\n field={field}\n value={values[field.slug]}\n error={errors[field.slug]}\n showValid={!!touched[field.slug] && !errors[field.slug] && fieldIsComplete(field)}\n onChange={(value) => setFieldValue(field.slug, value)}\n onFocus={() => trackFieldFocus(field.slug)}\n onBlur={() => trackFieldBlur(field.slug)}\n controls={fieldControls}\n />\n </div>\n )\n })}\n </div>\n </div>\n\n {/* Navigation buttons */}\n <div\n className=\"sk-form__actions\"\n style={{ justifyContent: step > 1 ? 'space-between' : 'flex-end' }}\n >\n {step > 1 && (\n <button type=\"button\" className=\"sk-form__btn sk-form__btn--back\" onClick={prevStep}>\n Back\n </button>\n )}\n <button type=\"submit\" className=\"sk-form__btn sk-form__btn--submit\" disabled={isSubmitting}>\n {isSubmitting\n ? 'Submitting...'\n : step < config.total_steps\n ? 'Next'\n : config.submit_button_text\n }\n </button>\n </div>\n\n {submitError && (\n <p\n className=\"sk-form__submit-error\"\n role=\"alert\"\n style={{ color: 'var(--sk-error, #dc2626)', fontSize: 14, marginTop: 12 }}\n >\n {submitError}\n </p>\n )}\n\n {/* Honeypot field — shared single source of truth with the stage\n experience (HoneypotField.tsx holds the invariants). */}\n {config.honeypot_enabled && (\n <HoneypotField\n name={honeypotFieldName}\n value={honeypotValue}\n onChange={setHoneypotValue}\n />\n )}\n\n {/* No-JS control fields (_sk_token auth + _sk_return destination). */}\n <NativeFallbackFields config={config} returnTo={nativeReturnTo} />\n </form>\n )\n}\n","/**\n * @sonordev/site-kit/forms - Managed Form Component\n * \n * Fetches form config from Portal API and renders fields with validation\n */\n\n'use client'\n\nimport type { ManagedFormProps } from './types'\nimport { useForm } from './useForm'\nimport { FormClient } from './FormClient'\n\n// ============================================\n// Main Component (Client Component)\n// ============================================\n\nexport function ManagedForm({\n formId,\n projectId,\n className,\n onSuccess,\n onError,\n initialConfig,\n experience,\n nativeReturnTo,\n defaultValues,\n children,\n}: ManagedFormProps) {\n const {\n form,\n isLoading,\n fetchError,\n } = useForm(formId, {\n projectId,\n onSuccess,\n onError,\n initialForm: initialConfig,\n // FormClient below owns this form's tracking — it renders the fields,\n // drives step navigation and runs the submit, so it is the only thing that\n // can report a real funnel. useForm is used here purely to FETCH the\n // config; we never call its submit, so its analytics row could only ever\n // open and abandon, never complete.\n //\n // Leaving this on is the double-count bug fixed in 4.2.2: two\n // trackers per form, two form_analytics rows per page load, every\n // start -> submission rate reported at half its true value.\n trackAnalytics: false,\n })\n \n if (isLoading) {\n return (\n <div className={className}>\n <p style={{ color: '#6b7280' }}>Loading form...</p>\n </div>\n )\n }\n \n if (fetchError || !form) {\n return (\n <div className={className}>\n <p style={{ color: 'var(--sk-error, #dc2626)' }}>\n {fetchError?.message || 'Form not found or inactive.'}\n </p>\n </div>\n )\n }\n \n // Pass to client component for interactivity\n return (\n <FormClient\n config={form}\n className={className}\n onSuccess={onSuccess}\n onError={onError}\n customRender={children}\n experience={experience}\n nativeReturnTo={nativeReturnTo}\n defaultValues={defaultValues}\n />\n )\n}\n\n"]}
@@ -6,6 +6,7 @@ var NEXT_APP_DIRS = ["app", path.join("src", "app")];
6
6
  var NEXT_SOURCE_EXTENSIONS = ["tsx", "ts", "jsx", "js"];
7
7
  var NEXT_PROXY_FILES = ["proxy.ts", "proxy.js", "src/proxy.ts", "src/proxy.js"];
8
8
  var NEXT_MIDDLEWARE_FILES = ["middleware.ts", "middleware.js", "src/middleware.ts", "src/middleware.js"];
9
+ var NEXT_CONFIG_FILES = ["next.config.js", "next.config.mjs", "next.config.ts", "next.config.mts"];
9
10
  function safeExists(p) {
10
11
  try {
11
12
  return fs2.existsSync(p);
@@ -30,6 +31,9 @@ function findRootLayout(cwd) {
30
31
  }
31
32
  return null;
32
33
  }
34
+ function findNextConfig(cwd) {
35
+ return NEXT_CONFIG_FILES.find((rel) => safeExists(path.join(cwd, rel))) ?? null;
36
+ }
33
37
  function findProxyFiles(cwd) {
34
38
  return [...NEXT_PROXY_FILES, ...NEXT_MIDDLEWARE_FILES].filter((rel) => safeExists(path.join(cwd, rel)));
35
39
  }
@@ -89,6 +93,6 @@ function discoverNextJsRoutes(appDir, basePath = "") {
89
93
  return entries;
90
94
  }
91
95
 
92
- export { NEXT_APP_DIRS, NEXT_MIDDLEWARE_FILES, NEXT_PROXY_FILES, discoverNextJsRoutes, findAppDirForDiscovery, findConventionFile, findProxyFiles, findRootLayout, findSitemapRoute, hasPageFile };
93
- //# sourceMappingURL=chunk-L4V6TKMJ.mjs.map
94
- //# sourceMappingURL=chunk-L4V6TKMJ.mjs.map
96
+ export { NEXT_APP_DIRS, NEXT_MIDDLEWARE_FILES, NEXT_PROXY_FILES, NEXT_SOURCE_EXTENSIONS, discoverNextJsRoutes, findAppDirForDiscovery, findConventionFile, findNextConfig, findProxyFiles, findRootLayout, findSitemapRoute, hasPageFile };
97
+ //# sourceMappingURL=chunk-U2V542EO.mjs.map
98
+ //# sourceMappingURL=chunk-U2V542EO.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/shared/next-files.ts","../src/sitemap/discover.ts"],"names":["fs","path"],"mappings":"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","file":"chunk-U2V542EO.mjs","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\n/**\n * next.config candidates in Next's own resolution order (`CONFIG_FILES` in\n * next/dist/shared/lib/constants). Next reads the first one present.\n */\nexport const NEXT_CONFIG_FILES = ['next.config.js', 'next.config.mjs', 'next.config.ts', 'next.config.mts']\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 path of the next.config Next will read, or null. */\nexport function findNextConfig(cwd: string): string | null {\n return NEXT_CONFIG_FILES.find(rel => safeExists(path.join(cwd, rel))) ?? 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"]}
@@ -1,6 +1,6 @@
1
1
  'use strict';
2
2
 
3
- var chunk5TXXTYXL_js = require('./chunk-5TXXTYXL.js');
3
+ var chunk5O7JSWT6_js = require('./chunk-5O7JSWT6.js');
4
4
 
5
5
  // src/shared/siteToken.ts
6
6
  var SITE_TOKEN_PREFIX = "st1.";
@@ -99,7 +99,7 @@ async function doRefresh() {
99
99
  method: "POST",
100
100
  headers: {
101
101
  "content-type": "application/json",
102
- "x-sitekit-version": chunk5TXXTYXL_js.SITE_KIT_VERSION,
102
+ "x-sitekit-version": chunk5O7JSWT6_js.SITE_KIT_VERSION,
103
103
  // Send the current token as x-api-key too, so the server's key-scoped
104
104
  // throttler buckets refreshes by token rather than by shared CDN IP.
105
105
  "x-api-key": current
@@ -154,5 +154,5 @@ exports.getFreshCredential = getFreshCredential;
154
154
  exports.isSiteToken = isSiteToken;
155
155
  exports.isTokenMode = isTokenMode;
156
156
  exports.refreshSiteToken = refreshSiteToken;
157
- //# sourceMappingURL=chunk-4WBTM6YE.js.map
158
- //# sourceMappingURL=chunk-4WBTM6YE.js.map
157
+ //# sourceMappingURL=chunk-UWHCHYCX.js.map
158
+ //# sourceMappingURL=chunk-UWHCHYCX.js.map