@sonordev/site-kit 5.6.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 (632) hide show
  1. package/README.md +3 -3
  2. package/agent-manifest.json +24 -4
  3. package/dist/AnalyticsProvider-OCXRNIVE.js +33 -0
  4. package/dist/{AnalyticsProvider-6PXC7UDP.js.map → AnalyticsProvider-OCXRNIVE.js.map} +1 -1
  5. package/dist/AnalyticsProvider-ZAUONQCX.mjs +12 -0
  6. package/dist/{AnalyticsProvider-FVQIYSLY.mjs.map → AnalyticsProvider-ZAUONQCX.mjs.map} +1 -1
  7. package/dist/{BlogViewTracker-S4HSRCW7.js → BlogViewTracker-HK5C7PU6.js} +14 -11
  8. package/dist/BlogViewTracker-HK5C7PU6.js.map +1 -0
  9. package/dist/{BlogViewTracker-ZUGLBOVI.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-2TQWCXWP.js.map → ChatWidget-3OW5LY37.js.map} +1 -1
  13. package/dist/ChatWidget-54GVS27I.mjs +15 -0
  14. package/dist/{ChatWidget-DG52ZIE6.mjs.map → ChatWidget-54GVS27I.mjs.map} +1 -1
  15. package/dist/EngageWidget-7EUP76WE.mjs +12 -0
  16. package/dist/{EngageWidget-2VUJADIU.mjs.map → EngageWidget-7EUP76WE.mjs.map} +1 -1
  17. package/dist/EngageWidget-DDP5UFA4.js +21 -0
  18. package/dist/{EngageWidget-Z7RC2INM.js.map → EngageWidget-DDP5UFA4.js.map} +1 -1
  19. package/dist/{FileField-FSQ7W3A5.mjs → FileField-IQLN6E3C.mjs} +5 -5
  20. package/dist/{FileField-FSQ7W3A5.mjs.map → FileField-IQLN6E3C.mjs.map} +1 -1
  21. package/dist/{FileField-UOQHL25J.js → FileField-SBPL4JHP.js} +6 -6
  22. package/dist/{FileField-UOQHL25J.js.map → FileField-SBPL4JHP.js.map} +1 -1
  23. package/dist/{FormSpotlight-RHL5FWM2.mjs → FormSpotlight-E2LKKHGV.mjs} +11 -7
  24. package/dist/FormSpotlight-E2LKKHGV.mjs.map +1 -0
  25. package/dist/{FormSpotlight-TED32NHP.js → FormSpotlight-YTACNE57.js} +25 -21
  26. package/dist/FormSpotlight-YTACNE57.js.map +1 -0
  27. package/dist/{FormStage-PFEBKHGY.js → FormStage-S277U2CP.js} +20 -15
  28. package/dist/FormStage-S277U2CP.js.map +1 -0
  29. package/dist/{FormStage-DINIRFOX.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-545YAUFC.mjs.map → ManagedForm-I3QVRQ53.mjs.map} +1 -1
  33. package/dist/ManagedForm-TSYKQFLJ.js +25 -0
  34. package/dist/{ManagedForm-43WLCUAK.js.map → ManagedForm-TSYKQFLJ.js.map} +1 -1
  35. package/dist/{ManagedNewsletterForm-ZPY5RRKX.mjs → ManagedNewsletterForm-T3YRAWKZ.mjs} +9 -7
  36. package/dist/ManagedNewsletterForm-T3YRAWKZ.mjs.map +1 -0
  37. package/dist/{ManagedNewsletterForm-I3QN57HB.js → ManagedNewsletterForm-YSOPPKS6.js} +10 -8
  38. package/dist/ManagedNewsletterForm-YSOPPKS6.js.map +1 -0
  39. package/dist/{SignalCore-EEH5IM4U.mjs → SignalCore-PPSIQ4BW.mjs} +8 -14
  40. package/dist/SignalCore-PPSIQ4BW.mjs.map +1 -0
  41. package/dist/{SignalCore-M4AXIMV4.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-46G7LVZS.mjs.map → SitemapSync-HSHCOKCL.mjs.map} +1 -1
  45. package/dist/SitemapSync-LH6UVP4P.js +18 -0
  46. package/dist/{SitemapSync-XK4JKCS7.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/metadata-images.test.d.ts +2 -0
  73. package/dist/blog/metadata-images.test.d.ts.map +1 -0
  74. package/dist/blog/not-found.test.d.ts +2 -0
  75. package/dist/blog/not-found.test.d.ts.map +1 -0
  76. package/dist/blog/processBlogHtml.d.ts +19 -2
  77. package/dist/blog/processBlogHtml.d.ts.map +1 -1
  78. package/dist/blog/public-reads.d.ts +27 -0
  79. package/dist/blog/public-reads.d.ts.map +1 -0
  80. package/dist/blog/server-core.d.ts +107 -16
  81. package/dist/blog/server-core.d.ts.map +1 -1
  82. package/dist/blog/server-ui.js +29 -23
  83. package/dist/blog/server-ui.js.map +1 -1
  84. package/dist/blog/server-ui.mjs +12 -6
  85. package/dist/blog/server-ui.mjs.map +1 -1
  86. package/dist/blog/server.d.ts +107 -16
  87. package/dist/blog/server.d.ts.map +1 -1
  88. package/dist/blog/server.js +54 -47
  89. package/dist/blog/server.mjs +5 -2
  90. package/dist/blog/site-scope.test.d.ts +2 -0
  91. package/dist/blog/site-scope.test.d.ts.map +1 -0
  92. package/dist/blog/static-params.test.d.ts +2 -0
  93. package/dist/blog/static-params.test.d.ts.map +1 -0
  94. package/dist/brand/extract-brand-profile.d.ts +36 -2
  95. package/dist/brand/extract-brand-profile.d.ts.map +1 -1
  96. package/dist/brand/extract-brand-profile.test.d.ts +2 -0
  97. package/dist/brand/extract-brand-profile.test.d.ts.map +1 -0
  98. package/dist/{chunk-B64AZC6P.js → chunk-2FQG2AHJ.js} +60 -35
  99. package/dist/chunk-2FQG2AHJ.js.map +1 -0
  100. package/dist/{chunk-N2PGTPWN.js → chunk-2OQWLXDO.js} +13 -13
  101. package/dist/{chunk-N2PGTPWN.js.map → chunk-2OQWLXDO.js.map} +1 -1
  102. package/dist/{chunk-T5VTQUNF.js → chunk-2SCDUVFJ.js} +10 -10
  103. package/dist/{chunk-T5VTQUNF.js.map → chunk-2SCDUVFJ.js.map} +1 -1
  104. package/dist/{chunk-S4RC6VAQ.js → chunk-35ERUUH3.js} +6 -6
  105. package/dist/{chunk-S4RC6VAQ.js.map → chunk-35ERUUH3.js.map} +1 -1
  106. package/dist/{chunk-VHZ4LHQT.mjs → chunk-3AUFD7KR.mjs} +3 -3
  107. package/dist/{chunk-VHZ4LHQT.mjs.map → chunk-3AUFD7KR.mjs.map} +1 -1
  108. package/dist/{chunk-DHIWR7CG.js → chunk-3BVCF4ZF.js} +4 -4
  109. package/dist/{chunk-DHIWR7CG.js.map → chunk-3BVCF4ZF.js.map} +1 -1
  110. package/dist/{chunk-EEQYKMGH.mjs → chunk-3EY5E35M.mjs} +57 -86
  111. package/dist/chunk-3EY5E35M.mjs.map +1 -0
  112. package/dist/{chunk-JNABXCLY.mjs → chunk-3SLFT453.mjs} +5 -5
  113. package/dist/{chunk-JNABXCLY.mjs.map → chunk-3SLFT453.mjs.map} +1 -1
  114. package/dist/{chunk-AJQI3WTN.mjs → chunk-4L7OHRWB.mjs} +12 -9
  115. package/dist/chunk-4L7OHRWB.mjs.map +1 -0
  116. package/dist/chunk-4LYW6PMU.mjs +72 -0
  117. package/dist/chunk-4LYW6PMU.mjs.map +1 -0
  118. package/dist/{chunk-R3KTBKSW.js → chunk-4OS6M3V4.js} +6 -12
  119. package/dist/chunk-4OS6M3V4.js.map +1 -0
  120. package/dist/{chunk-AY7JBGYC.js → chunk-4RY7JETY.js} +14 -14
  121. package/dist/{chunk-AY7JBGYC.js.map → chunk-4RY7JETY.js.map} +1 -1
  122. package/dist/chunk-4TLFZ6NR.mjs +16 -0
  123. package/dist/chunk-4TLFZ6NR.mjs.map +1 -0
  124. package/dist/{chunk-4B4S56WJ.mjs → chunk-5B4J3IBX.mjs} +75 -21
  125. package/dist/chunk-5B4J3IBX.mjs.map +1 -0
  126. package/dist/chunk-5O7JSWT6.js +8 -0
  127. package/dist/{chunk-KSL3WA2I.js.map → chunk-5O7JSWT6.js.map} +1 -1
  128. package/dist/chunk-5SANRSX3.mjs +17 -0
  129. package/dist/chunk-5SANRSX3.mjs.map +1 -0
  130. package/dist/{chunk-LCSYJXIO.mjs → chunk-5WGMXSCB.mjs} +3 -3
  131. package/dist/{chunk-LCSYJXIO.mjs.map → chunk-5WGMXSCB.mjs.map} +1 -1
  132. package/dist/chunk-5XFFUP6D.js +100 -0
  133. package/dist/chunk-5XFFUP6D.js.map +1 -0
  134. package/dist/{chunk-AHZR4VGY.mjs → chunk-6HFFTGFP.mjs} +50 -26
  135. package/dist/chunk-6HFFTGFP.mjs.map +1 -0
  136. package/dist/{chunk-USKIL6V6.mjs → chunk-6SBTHS6C.mjs} +3 -3
  137. package/dist/{chunk-USKIL6V6.mjs.map → chunk-6SBTHS6C.mjs.map} +1 -1
  138. package/dist/{chunk-NZSFOZJV.js → chunk-7TC3GRXQ.js} +73 -38
  139. package/dist/chunk-7TC3GRXQ.js.map +1 -0
  140. package/dist/{chunk-HIHAXEPD.mjs → chunk-7THZOAUR.mjs} +4 -4
  141. package/dist/{chunk-HIHAXEPD.mjs.map → chunk-7THZOAUR.mjs.map} +1 -1
  142. package/dist/{chunk-YCI36ZUS.mjs → chunk-AOWJP25J.mjs} +4 -4
  143. package/dist/{chunk-YCI36ZUS.mjs.map → chunk-AOWJP25J.mjs.map} +1 -1
  144. package/dist/{chunk-H44XZUOV.mjs → chunk-B2VFMPVJ.mjs} +4 -4
  145. package/dist/{chunk-H44XZUOV.mjs.map → chunk-B2VFMPVJ.mjs.map} +1 -1
  146. package/dist/{chunk-OA7KKOAK.mjs → chunk-B35OJ7FR.mjs} +4 -4
  147. package/dist/{chunk-OA7KKOAK.mjs.map → chunk-B35OJ7FR.mjs.map} +1 -1
  148. package/dist/{chunk-XR32C47O.js → chunk-BER36QXU.js} +9 -9
  149. package/dist/{chunk-XR32C47O.js.map → chunk-BER36QXU.js.map} +1 -1
  150. package/dist/{chunk-7C7XO5HX.mjs → chunk-BFZNLTWK.mjs} +3 -3
  151. package/dist/{chunk-7C7XO5HX.mjs.map → chunk-BFZNLTWK.mjs.map} +1 -1
  152. package/dist/chunk-BQP6JIE2.mjs +28 -0
  153. package/dist/chunk-BQP6JIE2.mjs.map +1 -0
  154. package/dist/{chunk-5KIO6FXE.js → chunk-C3WU45JT.js} +7 -7
  155. package/dist/{chunk-5KIO6FXE.js.map → chunk-C3WU45JT.js.map} +1 -1
  156. package/dist/chunk-CUNZAD46.js +53 -0
  157. package/dist/chunk-CUNZAD46.js.map +1 -0
  158. package/dist/chunk-CXAXZFFW.js +157 -0
  159. package/dist/chunk-CXAXZFFW.js.map +1 -0
  160. package/dist/{chunk-H4OBGC43.mjs → chunk-DA7IANFG.mjs} +14 -3
  161. package/dist/chunk-DA7IANFG.mjs.map +1 -0
  162. package/dist/{chunk-BWSMUSDB.js → chunk-EIW6YEPY.js} +8 -8
  163. package/dist/{chunk-BWSMUSDB.js.map → chunk-EIW6YEPY.js.map} +1 -1
  164. package/dist/{chunk-UU47DGHE.js → chunk-F6SKG34N.js} +8 -13
  165. package/dist/chunk-F6SKG34N.js.map +1 -0
  166. package/dist/{chunk-LC7AM4J5.js → chunk-FHPW7XVH.js} +77 -20
  167. package/dist/chunk-FHPW7XVH.js.map +1 -0
  168. package/dist/{chunk-JNRHTZL4.js → chunk-FVW6FT6L.js} +73 -29
  169. package/dist/chunk-FVW6FT6L.js.map +1 -0
  170. package/dist/{chunk-KY6M76JW.js → chunk-GNDWTXLU.js} +56 -177
  171. package/dist/chunk-GNDWTXLU.js.map +1 -0
  172. package/dist/{chunk-OZ3FU4BT.js → chunk-H5NBFNND.js} +2 -2
  173. package/dist/chunk-H5NBFNND.js.map +1 -0
  174. package/dist/{chunk-SYGGZZMU.js → chunk-HAKD27AZ.js} +7 -7
  175. package/dist/{chunk-SYGGZZMU.js.map → chunk-HAKD27AZ.js.map} +1 -1
  176. package/dist/chunk-HCN3IKMW.mjs +106 -0
  177. package/dist/chunk-HCN3IKMW.mjs.map +1 -0
  178. package/dist/{chunk-QNPVVWR7.mjs → chunk-HCX343AS.mjs} +4 -4
  179. package/dist/{chunk-QNPVVWR7.mjs.map → chunk-HCX343AS.mjs.map} +1 -1
  180. package/dist/{chunk-C2MSD2UM.mjs → chunk-HEOQT5SM.mjs} +216 -103
  181. package/dist/chunk-HEOQT5SM.mjs.map +1 -0
  182. package/dist/{chunk-RU54J2PY.mjs → chunk-HOJ4J4X2.mjs} +30 -12
  183. package/dist/chunk-HOJ4J4X2.mjs.map +1 -0
  184. package/dist/{chunk-H3D3ZGOJ.js → chunk-HQOHB6QF.js} +15 -15
  185. package/dist/{chunk-H3D3ZGOJ.js.map → chunk-HQOHB6QF.js.map} +1 -1
  186. package/dist/chunk-HRMGITUZ.mjs +6 -0
  187. package/dist/{chunk-DQUBETXH.mjs.map → chunk-HRMGITUZ.mjs.map} +1 -1
  188. package/dist/{chunk-7AUDKXY5.mjs → chunk-HYVEIP2N.mjs} +3 -3
  189. package/dist/{chunk-7AUDKXY5.mjs.map → chunk-HYVEIP2N.mjs.map} +1 -1
  190. package/dist/{chunk-46BMNWE6.js → chunk-I3ND4XYW.js} +12 -9
  191. package/dist/chunk-I3ND4XYW.js.map +1 -0
  192. package/dist/{chunk-53KMRZT7.js → chunk-JDTU2RWC.js} +3 -3
  193. package/dist/{chunk-53KMRZT7.js.map → chunk-JDTU2RWC.js.map} +1 -1
  194. package/dist/{chunk-GZJE23Y5.mjs → chunk-JLVCWC6A.mjs} +2 -2
  195. package/dist/chunk-JLVCWC6A.mjs.map +1 -0
  196. package/dist/chunk-K4TCEAUX.js +52 -0
  197. package/dist/chunk-K4TCEAUX.js.map +1 -0
  198. package/dist/chunk-KV7XXLJV.mjs +30 -0
  199. package/dist/chunk-KV7XXLJV.mjs.map +1 -0
  200. package/dist/{chunk-5UFDHGFE.mjs → chunk-L24RDT6Q.mjs} +3 -3
  201. package/dist/{chunk-5UFDHGFE.mjs.map → chunk-L24RDT6Q.mjs.map} +1 -1
  202. package/dist/{chunk-JE5DWAE6.js → chunk-LBZGYF3B.js} +4 -4
  203. package/dist/{chunk-JE5DWAE6.js.map → chunk-LBZGYF3B.js.map} +1 -1
  204. package/dist/{chunk-746RKQHA.js → chunk-LMEUYRRR.js} +93 -121
  205. package/dist/chunk-LMEUYRRR.js.map +1 -0
  206. package/dist/chunk-LVGSOW2F.js +32 -0
  207. package/dist/chunk-LVGSOW2F.js.map +1 -0
  208. package/dist/{chunk-KPKQKFT4.js → chunk-M45AL7EA.js} +37 -19
  209. package/dist/chunk-M45AL7EA.js.map +1 -0
  210. package/dist/{chunk-XK5AIWQG.js → chunk-MHX6TOAS.js} +3 -3
  211. package/dist/{chunk-XK5AIWQG.js.map → chunk-MHX6TOAS.js.map} +1 -1
  212. package/dist/chunk-MLVHVKFT.mjs +148 -0
  213. package/dist/chunk-MLVHVKFT.mjs.map +1 -0
  214. package/dist/{chunk-RIYAMYLV.mjs → chunk-N2NZBPQ5.mjs} +4 -10
  215. package/dist/chunk-N2NZBPQ5.mjs.map +1 -0
  216. package/dist/chunk-NRBITVDK.js +114 -0
  217. package/dist/chunk-NRBITVDK.js.map +1 -0
  218. package/dist/{chunk-IYCLN3XS.mjs → chunk-O4YBWJHP.mjs} +6 -11
  219. package/dist/chunk-O4YBWJHP.mjs.map +1 -0
  220. package/dist/{chunk-5KIEZHVK.mjs → chunk-O5ZSGBQD.mjs} +4 -4
  221. package/dist/{chunk-5KIEZHVK.mjs.map → chunk-O5ZSGBQD.mjs.map} +1 -1
  222. package/dist/{chunk-TP7H6BSK.mjs → chunk-OE7CTIOU.mjs} +73 -30
  223. package/dist/chunk-OE7CTIOU.mjs.map +1 -0
  224. package/dist/{chunk-UJ6CHZAI.mjs → chunk-OEW2LFOV.js} +169 -25
  225. package/dist/chunk-OEW2LFOV.js.map +1 -0
  226. package/dist/chunk-P4Y75QSU.js +19 -0
  227. package/dist/chunk-P4Y75QSU.js.map +1 -0
  228. package/dist/{chunk-6OP5XSMM.mjs → chunk-PK2OTGW5.mjs} +6 -12
  229. package/dist/chunk-PK2OTGW5.mjs.map +1 -0
  230. package/dist/{chunk-OC7AO7XS.js → chunk-PRTXAIIC.js} +15 -15
  231. package/dist/{chunk-OC7AO7XS.js.map → chunk-PRTXAIIC.js.map} +1 -1
  232. package/dist/{chunk-K2V3ZW36.mjs → chunk-PUAXHYBL.mjs} +3 -3
  233. package/dist/{chunk-K2V3ZW36.mjs.map → chunk-PUAXHYBL.mjs.map} +1 -1
  234. package/dist/chunk-QRHVMTHF.mjs +94 -0
  235. package/dist/chunk-QRHVMTHF.mjs.map +1 -0
  236. package/dist/{chunk-BZLIOT7Q.js → chunk-QTJTDQYR.js} +76 -111
  237. package/dist/chunk-QTJTDQYR.js.map +1 -0
  238. package/dist/{chunk-GJ6NOLGC.mjs → chunk-QVHVL7EX.mjs} +3 -3
  239. package/dist/{chunk-GJ6NOLGC.mjs.map → chunk-QVHVL7EX.mjs.map} +1 -1
  240. package/dist/chunk-R7GHP3FY.js +81 -0
  241. package/dist/chunk-R7GHP3FY.js.map +1 -0
  242. package/dist/chunk-SEP5D4MI.js +116 -0
  243. package/dist/chunk-SEP5D4MI.js.map +1 -0
  244. package/dist/{chunk-GPLCPMVD.mjs → chunk-TXMVU4EY.mjs} +62 -97
  245. package/dist/chunk-TXMVU4EY.mjs.map +1 -0
  246. package/dist/chunk-U2V542EO.mjs +98 -0
  247. package/dist/chunk-U2V542EO.mjs.map +1 -0
  248. package/dist/{chunk-YYN4YZYZ.js → chunk-UWHCHYCX.js} +4 -4
  249. package/dist/{chunk-YYN4YZYZ.js.map → chunk-UWHCHYCX.js.map} +1 -1
  250. package/dist/{chunk-473WDGQZ.mjs → chunk-VJ74275U.mjs} +38 -156
  251. package/dist/chunk-VJ74275U.mjs.map +1 -0
  252. package/dist/{chunk-H7274TKR.mjs → chunk-VJV7WUR2.mjs} +12 -4
  253. package/dist/chunk-VJV7WUR2.mjs.map +1 -0
  254. package/dist/{chunk-CQS5ZYI6.mjs → chunk-VYL6IHJA.mjs} +9 -9
  255. package/dist/{chunk-CQS5ZYI6.mjs.map → chunk-VYL6IHJA.mjs.map} +1 -1
  256. package/dist/{chunk-5B4FABFK.js → chunk-WS7MH3GD.js} +14 -2
  257. package/dist/chunk-WS7MH3GD.js.map +1 -0
  258. package/dist/{chunk-IPV2TUAT.js → chunk-XA2GJFVM.js} +12 -4
  259. package/dist/chunk-XA2GJFVM.js.map +1 -0
  260. package/dist/chunk-XBX2K3GA.js +33 -0
  261. package/dist/chunk-XBX2K3GA.js.map +1 -0
  262. package/dist/{chunk-X5TCH7VZ.js → chunk-XCYKM2SA.js} +6 -13
  263. package/dist/chunk-XCYKM2SA.js.map +1 -0
  264. package/dist/{chunk-6CJP7BFM.js → chunk-XZO5I4RS.mjs} +147 -20
  265. package/dist/chunk-XZO5I4RS.mjs.map +1 -0
  266. package/dist/chunk-Y5QZPUL3.mjs +47 -0
  267. package/dist/chunk-Y5QZPUL3.mjs.map +1 -0
  268. package/dist/{chunk-B6O7D5U4.js → chunk-YECDJDDD.js} +10 -10
  269. package/dist/{chunk-B6O7D5U4.js.map → chunk-YECDJDDD.js.map} +1 -1
  270. package/dist/chunk-YN7QHLWF.js +19 -0
  271. package/dist/chunk-YN7QHLWF.js.map +1 -0
  272. package/dist/chunk-YU7QZ3PP.mjs +45 -0
  273. package/dist/chunk-YU7QZ3PP.mjs.map +1 -0
  274. package/dist/{chunk-CQRLKNHQ.js → chunk-ZEOC26LZ.js} +223 -110
  275. package/dist/chunk-ZEOC26LZ.js.map +1 -0
  276. package/dist/{chunk-AEARU24Q.mjs → chunk-ZVI7MBVF.mjs} +73 -38
  277. package/dist/chunk-ZVI7MBVF.mjs.map +1 -0
  278. package/dist/cli/agent/checks.d.ts +15 -1
  279. package/dist/cli/agent/checks.d.ts.map +1 -1
  280. package/dist/cli/agent/sitemap-trailing-slash.test.d.ts +2 -0
  281. package/dist/cli/agent/sitemap-trailing-slash.test.d.ts.map +1 -0
  282. package/dist/cli/commands/api-routes.d.ts.map +1 -1
  283. package/dist/cli/commands/doctor.d.ts.map +1 -1
  284. package/dist/cli/commands/geo.d.ts +4 -0
  285. package/dist/cli/commands/geo.d.ts.map +1 -1
  286. package/dist/cli/commands/geo.test.d.ts +2 -0
  287. package/dist/cli/commands/geo.test.d.ts.map +1 -0
  288. package/dist/cli/commands/og.d.ts +31 -4
  289. package/dist/cli/commands/og.d.ts.map +1 -1
  290. package/dist/cli/commands/scaffold.d.ts +1 -2
  291. package/dist/cli/commands/scaffold.d.ts.map +1 -1
  292. package/dist/cli/commands/sync.d.ts.map +1 -1
  293. package/dist/cli/generators/index.d.ts +5 -0
  294. package/dist/cli/generators/index.d.ts.map +1 -1
  295. package/dist/cli/generators/index.test.d.ts +2 -0
  296. package/dist/cli/generators/index.test.d.ts.map +1 -0
  297. package/dist/cli/index.js +921 -466
  298. package/dist/cli/index.js.map +1 -1
  299. package/dist/cli/index.mjs +862 -407
  300. package/dist/cli/index.mjs.map +1 -1
  301. package/dist/client/index.js +6 -6
  302. package/dist/client/index.mjs +5 -5
  303. package/dist/commerce/CheckoutForm.d.ts.map +1 -1
  304. package/dist/commerce/ProductDetail.d.ts.map +1 -1
  305. package/dist/commerce/api.d.ts +14 -0
  306. package/dist/commerce/api.d.ts.map +1 -1
  307. package/dist/commerce/discount-checkout.test.d.ts +2 -0
  308. package/dist/commerce/discount-checkout.test.d.ts.map +1 -0
  309. package/dist/commerce/index.d.ts +1 -1
  310. package/dist/commerce/index.d.ts.map +1 -1
  311. package/dist/commerce/index.js +61 -56
  312. package/dist/commerce/index.mjs +6 -5
  313. package/dist/config/index.js +3 -3
  314. package/dist/config/index.mjs +1 -1
  315. package/dist/discover-CYXYKHZ2.mjs +4 -0
  316. package/dist/{discover-BEJRYNFF.mjs.map → discover-CYXYKHZ2.mjs.map} +1 -1
  317. package/dist/discover-NGEPXZOD.js +21 -0
  318. package/dist/{discover-WVDYDUJX.js.map → discover-NGEPXZOD.js.map} +1 -1
  319. package/dist/engage/index.js +12 -10
  320. package/dist/engage/index.js.map +1 -1
  321. package/dist/engage/index.mjs +9 -7
  322. package/dist/engage/index.mjs.map +1 -1
  323. package/dist/fleet/index.js +8 -8
  324. package/dist/fleet/index.mjs +4 -4
  325. package/dist/forms/FormClient.d.ts.map +1 -1
  326. package/dist/forms/FormField.d.ts +7 -1
  327. package/dist/forms/FormField.d.ts.map +1 -1
  328. package/dist/forms/FormSpotlight.d.ts +1 -1
  329. package/dist/forms/FormSpotlight.d.ts.map +1 -1
  330. package/dist/forms/FormStage.d.ts +1 -1
  331. package/dist/forms/FormStage.d.ts.map +1 -1
  332. package/dist/forms/experience-plan.d.ts +0 -1
  333. package/dist/forms/experience-plan.d.ts.map +1 -1
  334. package/dist/forms/field-interactions.d.ts +63 -0
  335. package/dist/forms/field-interactions.d.ts.map +1 -0
  336. package/dist/forms/field-interactions.test.d.ts +8 -0
  337. package/dist/forms/field-interactions.test.d.ts.map +1 -0
  338. package/dist/forms/field-rules.d.ts +41 -0
  339. package/dist/forms/field-rules.d.ts.map +1 -0
  340. package/dist/forms/field-rules.test.d.ts +8 -0
  341. package/dist/forms/field-rules.test.d.ts.map +1 -0
  342. package/dist/forms/form-field-focus.test.d.ts +8 -0
  343. package/dist/forms/form-field-focus.test.d.ts.map +1 -0
  344. package/dist/forms/index.js +25 -23
  345. package/dist/forms/index.js.map +1 -1
  346. package/dist/forms/index.mjs +13 -11
  347. package/dist/forms/index.mjs.map +1 -1
  348. package/dist/forms/server.js +11 -11
  349. package/dist/forms/server.mjs +9 -9
  350. package/dist/forms/static.js +8 -8
  351. package/dist/forms/static.mjs +7 -7
  352. package/dist/forms/tracking-session.d.ts +48 -3
  353. package/dist/forms/tracking-session.d.ts.map +1 -1
  354. package/dist/forms/types.d.ts +11 -0
  355. package/dist/forms/types.d.ts.map +1 -1
  356. package/dist/forms/useForm.d.ts +8 -0
  357. package/dist/forms/useForm.d.ts.map +1 -1
  358. package/dist/forms/useFormTracking.d.ts +29 -4
  359. package/dist/forms/useFormTracking.d.ts.map +1 -1
  360. package/dist/images/index.js +11 -11
  361. package/dist/images/index.mjs +4 -4
  362. package/dist/index.js +72 -68
  363. package/dist/index.js.map +1 -1
  364. package/dist/index.mjs +14 -10
  365. package/dist/index.mjs.map +1 -1
  366. package/dist/layout/client.js +10 -10
  367. package/dist/layout/client.mjs +9 -9
  368. package/dist/layout/index.js +13 -12
  369. package/dist/layout/index.js.map +1 -1
  370. package/dist/layout/index.mjs +11 -10
  371. package/dist/layout/index.mjs.map +1 -1
  372. package/dist/llms/aiRobots.d.ts +24 -5
  373. package/dist/llms/aiRobots.d.ts.map +1 -1
  374. package/dist/llms/api.d.ts +8 -3
  375. package/dist/llms/api.d.ts.map +1 -1
  376. package/dist/llms/discovery-headers.d.ts +24 -0
  377. package/dist/llms/discovery-headers.d.ts.map +1 -1
  378. package/dist/llms/generateLLMsTxt.d.ts.map +1 -1
  379. package/dist/llms/handlers.d.ts +20 -2
  380. package/dist/llms/handlers.d.ts.map +1 -1
  381. package/dist/llms/index.d.ts +2 -2
  382. package/dist/llms/index.d.ts.map +1 -1
  383. package/dist/llms/index.js +54 -98
  384. package/dist/llms/index.js.map +1 -1
  385. package/dist/llms/index.mjs +20 -83
  386. package/dist/llms/index.mjs.map +1 -1
  387. package/dist/llms/links.d.ts +26 -0
  388. package/dist/llms/links.d.ts.map +1 -0
  389. package/dist/llms/links.test.d.ts +2 -0
  390. package/dist/llms/links.test.d.ts.map +1 -0
  391. package/dist/llms/types.d.ts +15 -0
  392. package/dist/llms/types.d.ts.map +1 -1
  393. package/dist/llms/wiring.d.ts +103 -0
  394. package/dist/llms/wiring.d.ts.map +1 -0
  395. package/dist/llms/wiring.test.d.ts +2 -0
  396. package/dist/llms/wiring.test.d.ts.map +1 -0
  397. package/dist/llms/writeLLMsTxt.d.ts +9 -0
  398. package/dist/llms/writeLLMsTxt.d.ts.map +1 -1
  399. package/dist/maps/index.js +5 -5
  400. package/dist/maps/index.mjs +3 -3
  401. package/dist/motion/gsap.d.ts +54 -0
  402. package/dist/motion/gsap.d.ts.map +1 -1
  403. package/dist/motion/gsap.js +34 -4
  404. package/dist/motion/gsap.js.map +1 -1
  405. package/dist/motion/gsap.mjs +33 -5
  406. package/dist/motion/gsap.mjs.map +1 -1
  407. package/dist/motion/gsap.test.d.ts +2 -0
  408. package/dist/motion/gsap.test.d.ts.map +1 -0
  409. package/dist/og/config.d.ts +6 -0
  410. package/dist/og/config.d.ts.map +1 -1
  411. package/dist/og/contrast.d.ts +33 -0
  412. package/dist/og/contrast.d.ts.map +1 -0
  413. package/dist/og/index.d.ts +2 -0
  414. package/dist/og/index.d.ts.map +1 -1
  415. package/dist/og/index.js +26 -8
  416. package/dist/og/index.mjs +3 -1
  417. package/dist/og/pages.d.ts +101 -0
  418. package/dist/og/pages.d.ts.map +1 -1
  419. package/dist/og/route-copy.d.ts +34 -0
  420. package/dist/og/route-copy.d.ts.map +1 -0
  421. package/dist/og/route-fit.d.ts +77 -0
  422. package/dist/og/route-fit.d.ts.map +1 -0
  423. package/dist/og/route.d.ts +80 -20
  424. package/dist/og/route.d.ts.map +1 -1
  425. package/dist/og/route.js +195 -25
  426. package/dist/og/route.js.map +1 -1
  427. package/dist/og/route.mjs +193 -26
  428. package/dist/og/route.mjs.map +1 -1
  429. package/dist/og/route.test.d.ts +2 -0
  430. package/dist/og/route.test.d.ts.map +1 -0
  431. package/dist/og/template.d.ts.map +1 -1
  432. package/dist/og/wiring.d.ts +48 -4
  433. package/dist/og/wiring.d.ts.map +1 -1
  434. package/dist/proxy/index.d.ts +16 -11
  435. package/dist/proxy/index.d.ts.map +1 -1
  436. package/dist/proxy/index.js +15 -10
  437. package/dist/proxy/index.js.map +1 -1
  438. package/dist/proxy/index.mjs +12 -7
  439. package/dist/proxy/index.mjs.map +1 -1
  440. package/dist/proxy/llms-discovery.test.d.ts +2 -0
  441. package/dist/proxy/llms-discovery.test.d.ts.map +1 -0
  442. package/dist/redirects/index.d.ts +25 -1
  443. package/dist/redirects/index.d.ts.map +1 -1
  444. package/dist/redirects/index.js +11 -8
  445. package/dist/redirects/index.mjs +4 -1
  446. package/dist/redirects/index.test.d.ts +2 -0
  447. package/dist/redirects/index.test.d.ts.map +1 -0
  448. package/dist/redirects/not-found.d.ts +14 -29
  449. package/dist/redirects/not-found.d.ts.map +1 -1
  450. package/dist/redirects/not-found.js +15 -5
  451. package/dist/redirects/not-found.js.map +1 -1
  452. package/dist/redirects/not-found.mjs +11 -1
  453. package/dist/redirects/not-found.mjs.map +1 -1
  454. package/dist/robots/index.d.ts +7 -1
  455. package/dist/robots/index.d.ts.map +1 -1
  456. package/dist/robots/index.js +27 -1
  457. package/dist/robots/index.js.map +1 -1
  458. package/dist/robots/index.mjs +4 -1
  459. package/dist/robots/index.mjs.map +1 -1
  460. package/dist/robots/index.test.d.ts +2 -0
  461. package/dist/robots/index.test.d.ts.map +1 -0
  462. package/dist/robots/next-internals.d.ts +22 -0
  463. package/dist/robots/next-internals.d.ts.map +1 -0
  464. package/dist/search/index.js +4 -4
  465. package/dist/search/index.mjs +3 -3
  466. package/dist/seo/ManagedContent.d.ts +4 -2
  467. package/dist/seo/ManagedContent.d.ts.map +1 -1
  468. package/dist/seo/ManagedFAQ.d.ts.map +1 -1
  469. package/dist/seo/ManagedInternalLinks.d.ts.map +1 -1
  470. package/dist/seo/ManagedSchema.d.ts.map +1 -1
  471. package/dist/seo/client.js +6 -6
  472. package/dist/seo/client.mjs +5 -5
  473. package/dist/seo/getManagedMetadata.d.ts.map +1 -1
  474. package/dist/seo/getManagedMetadata.test.d.ts +2 -0
  475. package/dist/seo/getManagedMetadata.test.d.ts.map +1 -0
  476. package/dist/seo/index.js +59 -49
  477. package/dist/seo/index.js.map +1 -1
  478. package/dist/seo/index.mjs +29 -19
  479. package/dist/seo/index.mjs.map +1 -1
  480. package/dist/seo/managed-schema-filter.test.d.ts +2 -0
  481. package/dist/seo/managed-schema-filter.test.d.ts.map +1 -0
  482. package/dist/seo/register-sitemap-cli-impl.d.ts +32 -0
  483. package/dist/seo/register-sitemap-cli-impl.d.ts.map +1 -1
  484. package/dist/seo/register-sitemap-cli.d.ts +7 -0
  485. package/dist/seo/register-sitemap-cli.d.ts.map +1 -1
  486. package/dist/seo/register-sitemap-cli.js +273 -56
  487. package/dist/seo/register-sitemap-cli.js.map +1 -1
  488. package/dist/seo/register-sitemap-cli.mjs +269 -52
  489. package/dist/seo/register-sitemap-cli.mjs.map +1 -1
  490. package/dist/seo/register-sitemap-request.d.ts +36 -0
  491. package/dist/seo/register-sitemap-request.d.ts.map +1 -0
  492. package/dist/seo/register-sitemap-request.test.d.ts +2 -0
  493. package/dist/seo/register-sitemap-request.test.d.ts.map +1 -0
  494. package/dist/seo/routing.d.ts +2 -0
  495. package/dist/seo/routing.d.ts.map +1 -1
  496. package/dist/seo/schema-filter.d.ts +43 -0
  497. package/dist/seo/schema-filter.d.ts.map +1 -0
  498. package/dist/seo/schema-filter.test.d.ts +2 -0
  499. package/dist/seo/schema-filter.test.d.ts.map +1 -0
  500. package/dist/seo/server-api.d.ts +15 -2
  501. package/dist/seo/server-api.d.ts.map +1 -1
  502. package/dist/seo/server.js +23 -18
  503. package/dist/seo/server.mjs +7 -2
  504. package/dist/seo/site-scope.test.d.ts +2 -0
  505. package/dist/seo/site-scope.test.d.ts.map +1 -0
  506. package/dist/seo/types.d.ts +30 -0
  507. package/dist/seo/types.d.ts.map +1 -1
  508. package/dist/seo-meta/contract.d.ts +60 -0
  509. package/dist/seo-meta/contract.d.ts.map +1 -0
  510. package/dist/seo-meta/contract.js +41 -0
  511. package/dist/seo-meta/contract.js.map +1 -0
  512. package/dist/seo-meta/contract.mjs +4 -0
  513. package/dist/seo-meta/contract.mjs.map +1 -0
  514. package/dist/seo-meta/contract.test.d.ts +2 -0
  515. package/dist/seo-meta/contract.test.d.ts.map +1 -0
  516. package/dist/server/index.js +4 -3
  517. package/dist/server/index.mjs +3 -2
  518. package/dist/server/mint-site-token.d.ts +2 -32
  519. package/dist/server/mint-site-token.d.ts.map +1 -1
  520. package/dist/{server-api-RG3ZL3DV.mjs → server-api-A2EFCTZX.mjs} +7 -3
  521. package/dist/{server-api-RG3ZL3DV.mjs.map → server-api-A2EFCTZX.mjs.map} +1 -1
  522. package/dist/{server-api-RYJQAUGO.js → server-api-IWTZ7C3O.js} +25 -21
  523. package/dist/{server-api-RYJQAUGO.js.map → server-api-IWTZ7C3O.js.map} +1 -1
  524. package/dist/shared/build-entries.d.ts +2 -0
  525. package/dist/shared/build-entries.d.ts.map +1 -1
  526. package/dist/shared/fresh-fetch.d.ts +64 -0
  527. package/dist/shared/fresh-fetch.d.ts.map +1 -0
  528. package/dist/shared/fresh-fetch.test.d.ts +2 -0
  529. package/dist/shared/fresh-fetch.test.d.ts.map +1 -0
  530. package/dist/shared/next-files.d.ts +42 -0
  531. package/dist/shared/next-files.d.ts.map +1 -0
  532. package/dist/shared/next-files.test.d.ts +2 -0
  533. package/dist/shared/next-files.test.d.ts.map +1 -0
  534. package/dist/shared/page-leave.d.ts +27 -0
  535. package/dist/shared/page-leave.d.ts.map +1 -0
  536. package/dist/shared/page-leave.test.d.ts +2 -0
  537. package/dist/shared/page-leave.test.d.ts.map +1 -0
  538. package/dist/shared/source-graph.d.ts +63 -0
  539. package/dist/shared/source-graph.d.ts.map +1 -0
  540. package/dist/shared/source-graph.test.d.ts +2 -0
  541. package/dist/shared/source-graph.test.d.ts.map +1 -0
  542. package/dist/shared/version.d.ts +1 -1
  543. package/dist/signal/SignalCore.d.ts.map +1 -1
  544. package/dist/signal/index.js +11 -11
  545. package/dist/signal/index.mjs +2 -2
  546. package/dist/sitemap/discover.d.ts.map +1 -1
  547. package/dist/sitemap/index.d.ts +25 -5
  548. package/dist/sitemap/index.d.ts.map +1 -1
  549. package/dist/sitemap/index.js +54 -51
  550. package/dist/sitemap/index.js.map +1 -1
  551. package/dist/sitemap/index.mjs +39 -36
  552. package/dist/sitemap/index.mjs.map +1 -1
  553. package/dist/sitemap/shared.d.ts +65 -0
  554. package/dist/sitemap/shared.d.ts.map +1 -1
  555. package/dist/sitemap/trailing-slash.test.d.ts +2 -0
  556. package/dist/sitemap/trailing-slash.test.d.ts.map +1 -0
  557. package/dist/sites/resolve.d.ts.map +1 -1
  558. package/dist/sites/site-param.d.ts +16 -0
  559. package/dist/sites/site-param.d.ts.map +1 -0
  560. package/dist/sync/index.js +17 -17
  561. package/dist/sync/index.mjs +4 -4
  562. package/dist/writeLLMsTxt-CQ7A4AAL.js +20 -0
  563. package/dist/writeLLMsTxt-CQ7A4AAL.js.map +1 -0
  564. package/dist/writeLLMsTxt-NX5MSPYX.mjs +11 -0
  565. package/dist/writeLLMsTxt-NX5MSPYX.mjs.map +1 -0
  566. package/package.json +25 -22
  567. package/dist/AnalyticsProvider-6PXC7UDP.js +0 -32
  568. package/dist/AnalyticsProvider-FVQIYSLY.mjs +0 -11
  569. package/dist/BlogViewTracker-S4HSRCW7.js.map +0 -1
  570. package/dist/BlogViewTracker-ZUGLBOVI.mjs.map +0 -1
  571. package/dist/ChatWidget-2TQWCXWP.js +0 -22
  572. package/dist/ChatWidget-DG52ZIE6.mjs +0 -13
  573. package/dist/EngageWidget-2VUJADIU.mjs +0 -12
  574. package/dist/EngageWidget-Z7RC2INM.js +0 -21
  575. package/dist/FormSpotlight-RHL5FWM2.mjs.map +0 -1
  576. package/dist/FormSpotlight-TED32NHP.js.map +0 -1
  577. package/dist/FormStage-DINIRFOX.mjs.map +0 -1
  578. package/dist/FormStage-PFEBKHGY.js.map +0 -1
  579. package/dist/ManagedForm-43WLCUAK.js +0 -23
  580. package/dist/ManagedForm-545YAUFC.mjs +0 -14
  581. package/dist/ManagedNewsletterForm-I3QN57HB.js.map +0 -1
  582. package/dist/ManagedNewsletterForm-ZPY5RRKX.mjs.map +0 -1
  583. package/dist/SignalCore-EEH5IM4U.mjs.map +0 -1
  584. package/dist/SignalCore-M4AXIMV4.js.map +0 -1
  585. package/dist/SitemapSync-46G7LVZS.mjs +0 -9
  586. package/dist/SitemapSync-XK4JKCS7.js +0 -18
  587. package/dist/chunk-46BMNWE6.js.map +0 -1
  588. package/dist/chunk-473WDGQZ.mjs.map +0 -1
  589. package/dist/chunk-4B4S56WJ.mjs.map +0 -1
  590. package/dist/chunk-5B4FABFK.js.map +0 -1
  591. package/dist/chunk-6CJP7BFM.js.map +0 -1
  592. package/dist/chunk-6OP5XSMM.mjs.map +0 -1
  593. package/dist/chunk-746RKQHA.js.map +0 -1
  594. package/dist/chunk-AEARU24Q.mjs.map +0 -1
  595. package/dist/chunk-AHZR4VGY.mjs.map +0 -1
  596. package/dist/chunk-AJQI3WTN.mjs.map +0 -1
  597. package/dist/chunk-B64AZC6P.js.map +0 -1
  598. package/dist/chunk-BZLIOT7Q.js.map +0 -1
  599. package/dist/chunk-C2MSD2UM.mjs.map +0 -1
  600. package/dist/chunk-CQRLKNHQ.js.map +0 -1
  601. package/dist/chunk-DQUBETXH.mjs +0 -6
  602. package/dist/chunk-EEQYKMGH.mjs.map +0 -1
  603. package/dist/chunk-GPLCPMVD.mjs.map +0 -1
  604. package/dist/chunk-GZJE23Y5.mjs.map +0 -1
  605. package/dist/chunk-H4OBGC43.mjs.map +0 -1
  606. package/dist/chunk-H7274TKR.mjs.map +0 -1
  607. package/dist/chunk-IPV2TUAT.js.map +0 -1
  608. package/dist/chunk-IYCLN3XS.mjs.map +0 -1
  609. package/dist/chunk-JEOKDUPQ.js +0 -45
  610. package/dist/chunk-JEOKDUPQ.js.map +0 -1
  611. package/dist/chunk-JNRHTZL4.js.map +0 -1
  612. package/dist/chunk-KPKQKFT4.js.map +0 -1
  613. package/dist/chunk-KSL3WA2I.js +0 -8
  614. package/dist/chunk-KY6M76JW.js.map +0 -1
  615. package/dist/chunk-LC7AM4J5.js.map +0 -1
  616. package/dist/chunk-LOS5D6B3.js +0 -72
  617. package/dist/chunk-LOS5D6B3.js.map +0 -1
  618. package/dist/chunk-NZSFOZJV.js.map +0 -1
  619. package/dist/chunk-OZ3FU4BT.js.map +0 -1
  620. package/dist/chunk-QJU6HBSK.mjs +0 -39
  621. package/dist/chunk-QJU6HBSK.mjs.map +0 -1
  622. package/dist/chunk-R3KTBKSW.js.map +0 -1
  623. package/dist/chunk-RIYAMYLV.mjs.map +0 -1
  624. package/dist/chunk-RU54J2PY.mjs.map +0 -1
  625. package/dist/chunk-TP7H6BSK.mjs.map +0 -1
  626. package/dist/chunk-UJ6CHZAI.mjs.map +0 -1
  627. package/dist/chunk-UU47DGHE.js.map +0 -1
  628. package/dist/chunk-X5TCH7VZ.js.map +0 -1
  629. package/dist/chunk-XIJ4F6IE.mjs +0 -63
  630. package/dist/chunk-XIJ4F6IE.mjs.map +0 -1
  631. package/dist/discover-BEJRYNFF.mjs +0 -4
  632. package/dist/discover-WVDYDUJX.js +0 -21
@@ -0,0 +1,19 @@
1
+ 'use strict';
2
+
3
+ var chunkH5NBFNND_js = require('./chunk-H5NBFNND.js');
4
+
5
+ // src/sites/site-param.ts
6
+ function withSiteParam(url, site) {
7
+ const host = chunkH5NBFNND_js.resolveSiteHost(site);
8
+ if (!host) return url;
9
+ return `${url}${url.includes("?") ? "&" : "?"}site=${encodeURIComponent(host)}`;
10
+ }
11
+ function withSiteBody(body, site) {
12
+ const host = chunkH5NBFNND_js.resolveSiteHost(site);
13
+ return host ? { ...body, site: host } : body;
14
+ }
15
+
16
+ exports.withSiteBody = withSiteBody;
17
+ exports.withSiteParam = withSiteParam;
18
+ //# sourceMappingURL=chunk-YN7QHLWF.js.map
19
+ //# sourceMappingURL=chunk-YN7QHLWF.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/sites/site-param.ts"],"names":["resolveSiteHost"],"mappings":";;;;;AAiCO,SAAS,aAAA,CAAc,KAAa,IAAA,EAAuB;AAChE,EAAA,MAAM,IAAA,GAAOA,iCAAgB,IAAI,CAAA;AACjC,EAAA,IAAI,CAAC,MAAM,OAAO,GAAA;AAClB,EAAA,OAAO,CAAA,EAAG,GAAG,CAAA,EAAG,GAAA,CAAI,QAAA,CAAS,GAAG,CAAA,GAAI,GAAA,GAAM,GAAG,CAAA,KAAA,EAAQ,kBAAA,CAAmB,IAAI,CAAC,CAAA,CAAA;AAC/E;AAMO,SAAS,YAAA,CAA+B,MAAS,IAAA,EAAsC;AAC5F,EAAA,MAAM,IAAA,GAAOA,iCAAgB,IAAI,CAAA;AACjC,EAAA,OAAO,OAAO,EAAE,GAAG,IAAA,EAAM,IAAA,EAAM,MAAK,GAAI,IAAA;AAC1C","file":"chunk-YN7QHLWF.js","sourcesContent":["/**\n * @sonordev/site-kit/sites — withSiteParam / withSiteBody (leaf module)\n *\n * SINGLE SOURCE OF TRUTH for \"tell the Sonor API which sub-site is asking\".\n * Every site-scoped read goes through one of these two: the llms reads\n * (`llms/api`, FAQ items included), every blog read (`blog/server-core` and\n * the blog server-ui components, plus the client `BlogViewTracker`), the\n * managed FAQ, internal-link and content-block reads (`seo/server-api`\n * getFAQData / getInternalLinks / getContentBlock), and the managed redirect\n * rules and hit tracking (`redirects`). Do not re-fork the\n * append-or-omit rule into a module of its own — the llms copy of it is where\n * this came from, and two copies drift.\n *\n * The host comes from `resolveSiteHost` (explicit → NEXT_PUBLIC_SITE_URL host\n * → window.location.host), already normalized, so it matches what the API\n * stores. When nothing resolves, the param/field is OMITTED rather than sent\n * empty: an absent `site` is how single-site projects (and older API servers)\n * keep their project-wide behavior.\n *\n * A leaf on purpose. It imports only `./resolve` (→ `./normalize`), both pure\n * string logic, so the client-stamped `blog` barrel and `BlogViewTracker` can\n * use it without reaching `server-only` code or the sites contract's JSON\n * schema.\n */\nimport { resolveSiteHost } from './resolve'\n\n/**\n * Append `site=<host>` to an API URL or endpoint path. Returns the input\n * unchanged when the host resolves empty.\n *\n * withSiteParam('/public/blog/posts?page=2', 'bd-charlotte.com')\n * → '/public/blog/posts?page=2&site=bd-charlotte.com'\n */\nexport function withSiteParam(url: string, site?: string): string {\n const host = resolveSiteHost(site)\n if (!host) return url\n return `${url}${url.includes('?') ? '&' : '?'}site=${encodeURIComponent(host)}`\n}\n\n/**\n * Add `site: <host>` to a JSON request body. Returns the body unchanged (no\n * `site` key at all) when the host resolves empty.\n */\nexport function withSiteBody<T extends object>(body: T, site?: string): T & { site?: string } {\n const host = resolveSiteHost(site)\n return host ? { ...body, site: host } : body\n}\n"]}
@@ -0,0 +1,45 @@
1
+ // src/og/config.ts
2
+ function defineOgCard(config) {
3
+ return config;
4
+ }
5
+ var OG_WIDTH = 1200;
6
+ var OG_HEIGHT = 630;
7
+ var TITLE_MAX_PX = 104;
8
+ var TITLE_MIN_PX = 56;
9
+ var OG_REPORT_ATTR = "data-og-report";
10
+
11
+ // src/og/contrast.ts
12
+ var AA_LARGE = 3;
13
+ function parseHexColor(color) {
14
+ const hex = color.trim().replace(/^#/, "");
15
+ if (!/^([0-9a-f]{3}|[0-9a-f]{6}|[0-9a-f]{8})$/i.test(hex)) return null;
16
+ const full = hex.length === 3 ? hex.replace(/./g, (c) => c + c) : hex.slice(0, 6);
17
+ return [0, 2, 4].map((i) => parseInt(full.slice(i, i + 2), 16));
18
+ }
19
+ function luminance([r, g, b]) {
20
+ const channel = (v) => {
21
+ const s = v / 255;
22
+ return s <= 0.03928 ? s / 12.92 : ((s + 0.055) / 1.055) ** 2.4;
23
+ };
24
+ return 0.2126 * channel(r) + 0.7152 * channel(g) + 0.0722 * channel(b);
25
+ }
26
+ function contrastRatio(a, b) {
27
+ const ca = parseHexColor(a);
28
+ const cb = parseHexColor(b);
29
+ if (!ca || !cb) return null;
30
+ const [hi, lo] = [luminance(ca), luminance(cb)].sort((x, y) => y - x);
31
+ return (hi + 0.05) / (lo + 0.05);
32
+ }
33
+ function barTextColor(theme) {
34
+ if (theme.barText) return theme.barText;
35
+ const candidates = [theme.surface, theme.bg, theme.text].filter((c) => !!c);
36
+ const scored = candidates.map((color) => ({ color, ratio: contrastRatio(color, theme.accent) }));
37
+ const passing = scored.find((s) => s.ratio !== null && s.ratio >= AA_LARGE);
38
+ if (passing) return passing.color;
39
+ const measurable = scored.filter((s) => s.ratio !== null).sort((a, b) => b.ratio - a.ratio);
40
+ return measurable[0]?.color ?? candidates[0];
41
+ }
42
+
43
+ export { OG_HEIGHT, OG_REPORT_ATTR, OG_WIDTH, TITLE_MAX_PX, TITLE_MIN_PX, barTextColor, defineOgCard };
44
+ //# sourceMappingURL=chunk-YU7QZ3PP.mjs.map
45
+ //# sourceMappingURL=chunk-YU7QZ3PP.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/og/config.ts","../src/og/contrast.ts"],"names":[],"mappings":";AA0IO,SAAS,aAAa,MAAA,EAAoC;AAC/D,EAAA,OAAO,MAAA;AACT;AAEO,IAAM,QAAA,GAAW;AACjB,IAAM,SAAA,GAAY;AAWlB,IAAM,YAAA,GAAe;AACrB,IAAM,YAAA,GAAe;AAOrB,IAAM,cAAA,GAAiB;;;AC1I9B,IAAM,QAAA,GAAW,CAAA;AAGV,SAAS,cAAc,KAAA,EAAgD;AAC5E,EAAA,MAAM,MAAM,KAAA,CAAM,IAAA,EAAK,CAAE,OAAA,CAAQ,MAAM,EAAE,CAAA;AACzC,EAAA,IAAI,CAAC,0CAAA,CAA2C,IAAA,CAAK,GAAG,GAAG,OAAO,IAAA;AAClE,EAAA,MAAM,IAAA,GAAO,GAAA,CAAI,MAAA,KAAW,CAAA,GAAI,IAAI,OAAA,CAAQ,IAAA,EAAM,CAAA,CAAA,KAAK,CAAA,GAAI,CAAC,CAAA,GAAI,GAAA,CAAI,KAAA,CAAM,GAAG,CAAC,CAAA;AAC9E,EAAA,OAAO,CAAC,CAAA,EAAG,CAAA,EAAG,CAAC,EAAE,GAAA,CAAI,CAAA,CAAA,KAAK,QAAA,CAAS,IAAA,CAAK,MAAM,CAAA,EAAG,CAAA,GAAI,CAAC,CAAA,EAAG,EAAE,CAAC,CAAA;AAC9D;AAEA,SAAS,SAAA,CAAU,CAAC,CAAA,EAAG,CAAA,EAAG,CAAC,CAAA,EAAqC;AAC9D,EAAA,MAAM,OAAA,GAAU,CAAC,CAAA,KAAc;AAC7B,IAAA,MAAM,IAAI,CAAA,GAAI,GAAA;AACd,IAAA,OAAO,KAAK,OAAA,GAAU,CAAA,GAAI,KAAA,GAAA,CAAA,CAAU,CAAA,GAAI,SAAS,KAAA,KAAU,GAAA;AAAA,EAC7D,CAAA;AACA,EAAA,OAAO,MAAA,GAAS,OAAA,CAAQ,CAAC,CAAA,GAAI,MAAA,GAAS,QAAQ,CAAC,CAAA,GAAI,MAAA,GAAS,OAAA,CAAQ,CAAC,CAAA;AACvE;AAGO,SAAS,aAAA,CAAc,GAAW,CAAA,EAA0B;AACjE,EAAA,MAAM,EAAA,GAAK,cAAc,CAAC,CAAA;AAC1B,EAAA,MAAM,EAAA,GAAK,cAAc,CAAC,CAAA;AAC1B,EAAA,IAAI,CAAC,EAAA,IAAM,CAAC,EAAA,EAAI,OAAO,IAAA;AACvB,EAAA,MAAM,CAAC,EAAA,EAAI,EAAE,CAAA,GAAI,CAAC,UAAU,EAAE,CAAA,EAAG,SAAA,CAAU,EAAE,CAAC,CAAA,CAAE,IAAA,CAAK,CAAC,CAAA,EAAG,CAAA,KAAM,IAAI,CAAC,CAAA;AACpE,EAAA,OAAA,CAAQ,EAAA,GAAK,SAAS,EAAA,GAAK,IAAA,CAAA;AAC7B;AAYO,SAAS,aAAa,KAAA,EAAyB;AACpD,EAAA,IAAI,KAAA,CAAM,OAAA,EAAS,OAAO,KAAA,CAAM,OAAA;AAChC,EAAA,MAAM,UAAA,GAAa,CAAC,KAAA,CAAM,OAAA,EAAS,MAAM,EAAA,EAAI,KAAA,CAAM,IAAI,CAAA,CAAE,MAAA,CAAO,CAAC,CAAA,KAAmB,CAAC,CAAC,CAAC,CAAA;AACvF,EAAA,MAAM,MAAA,GAAS,UAAA,CAAW,GAAA,CAAI,CAAA,KAAA,MAAU,EAAE,KAAA,EAAO,KAAA,EAAO,aAAA,CAAc,KAAA,EAAO,KAAA,CAAM,MAAM,CAAA,EAAE,CAAE,CAAA;AAC7F,EAAA,MAAM,OAAA,GAAU,OAAO,IAAA,CAAK,CAAA,CAAA,KAAK,EAAE,KAAA,KAAU,IAAA,IAAQ,CAAA,CAAE,KAAA,IAAS,QAAQ,CAAA;AACxE,EAAA,IAAI,OAAA,SAAgB,OAAA,CAAQ,KAAA;AAC5B,EAAA,MAAM,UAAA,GAAa,MAAA,CAAO,MAAA,CAAO,CAAA,CAAA,KAAK,EAAE,KAAA,KAAU,IAAI,CAAA,CAAE,IAAA,CAAK,CAAC,CAAA,EAAG,CAAA,KAAM,CAAA,CAAE,KAAA,GAAS,EAAE,KAAM,CAAA;AAG1F,EAAA,OAAO,UAAA,CAAW,CAAC,CAAA,EAAG,KAAA,IAAS,WAAW,CAAC,CAAA;AAC7C","file":"chunk-YU7QZ3PP.mjs","sourcesContent":["/**\n * @sonordev/site-kit/og — OG card config contract.\n *\n * THE SITE OWNS THE THEME. Sonor stores one brand_primary/secondary per\n * project; real sites have full palettes (Ludlow: red, ink, cream, scrim —\n * four tokens where Sonor stores two). So the card's colors, fonts, and\n * layout come from a repo-owned og.config.ts, typically importing the same\n * constants the site itself uses. Sonor brand data is only the zero-config\n * seed used by `sonor-setup og` when no og.config.ts exists.\n *\n * Rendering is BUILD-TIME via headless Chrome (`sonor-setup og`), writing a\n * static public/og.png: full real CSS (no Satori subset), Google Fonts load\n * in the template (no font vendoring), zero runtime cost — the right shape\n * for a force-static fleet. Per-entity runtime cards are a future tier.\n */\n\nexport interface OgTheme {\n /** Page background behind everything. */\n bg: string\n /** Primary text color. */\n text: string\n /** Accent (kicker, bar). */\n accent: string\n /** Plate/surface color behind the logo. */\n surface: string\n /** Muted text (subtitle). Defaults derived from `text` when omitted. */\n muted?: string\n /**\n * Bottom-bar text, set on `accent`. Defaults to the first of `surface`,\n * `bg`, `text` that reaches WCAG AA for large text (3:1) against the\n * accent (see og/contrast.ts).\n */\n barText?: string\n}\n\nexport interface OgFont {\n /** Google Fonts family name, e.g. 'Barlow Condensed'. */\n family: string\n weights?: number[]\n}\n\nexport interface OgBackground {\n /** Path under public/, e.g. '/hero-frost.avif'. */\n image: string\n /** CSS blur radius in px. */\n blur?: number\n /** Overlay color, e.g. 'rgba(17,17,16,.68)'. */\n scrim?: string\n}\n\nexport interface OgPhoto {\n /** Path under public/ ('/team.jpg') or an absolute https URL. */\n src: string\n /** Pane width in px (default 430). */\n width?: number\n /** Corner radius in px (default 24). */\n radius?: number\n}\n\nexport interface OgContent {\n /** Small all-caps line above the title. */\n kicker?: string\n /** The big line. `\\n` for a manual break. Keep it short — previews truncate. */\n title: string\n /** One supporting line. */\n subtitle?: string\n /** Handwritten-style accent line (rendered in the last configured font). */\n hand?: string\n /** Bottom bar segments, e.g. ['Give an hour', 'ludlowpto.org']. */\n bar?: string[]\n}\n\n/**\n * A per-route entry in `cards`. Layered over the derived card, so it only\n * states what differs — including inside `content`: a route can override just\n * the subtitle and keep the title Sonor derived. The runtime always merged\n * field by field; this type used to demand a full OgContent, which forced\n * casts in every site that used the documented pattern.\n */\nexport type OgCardOverride = Partial<Omit<OgCardConfig, 'cards' | 'content'>> & {\n content?: Partial<OgContent>\n}\n\nexport interface OgCardConfig {\n theme: OgTheme\n /** First font = display face, second (optional) = hand/accent face. */\n fonts?: OgFont[]\n /** Path under public/ to the logo shown on the plate, e.g. '/logo-mark.svg'. */\n logo?: string\n background?: OgBackground\n /**\n * 'plate-left': logo plate left, copy right (the Ludlow layout).\n * 'centered': stacked, logo above title.\n * 'banner': no plate, full-bleed copy.\n * 'split': copy left, content photo right — for cards that show the page's\n * own imagery (a project photo, a product, the storefront).\n */\n layout?: 'plate-left' | 'centered' | 'banner' | 'split'\n /** Content photo for the 'split' layout (also rendered in 'plate-left' when set, replacing the plate). */\n photo?: OgPhoto\n content: OgContent\n /**\n * Per-page overrides, keyed by route path (`/services/garage`) or its slug\n * (`services-garage`). Every static route already gets its own card built\n * from its managed title and description; this is for the handful worth\n * writing by hand — a campaign landing page, the flagship service.\n *\n * A dynamic route is keyed by its pattern, one `*` per dynamic level:\n * `/services/*` for `[slug]`, plus another star for each nested `[param]`\n * (slug form `services-any`, `services-any-any`). Nested patterns are worth\n * writing by hand — they all derive from the same static ancestor otherwise.\n * `sonor-setup og` warns about any key that matches no route.\n *\n * Each entry is layered over the site card, so it only states what differs.\n * Build-time only: never rendered as part of a card.\n */\n cards?: Record<string, OgCardOverride>\n /**\n * MIDDLE escape hatch: keep the loader/renderer/verifier pipeline but\n * produce your own document. Receives the config and the same helpers the\n * stock template uses (esc, fontLink). Root-relative src attributes are\n * still rewritten to public/ files automatically.\n */\n template?: (config: OgCardConfig, helpers: OgTemplateHelpers) => string\n /** FULL escape hatch: raw HTML replaces everything, no helpers. */\n html?: string\n}\n\nexport interface OgTemplateHelpers {\n /** HTML-escape user text. */\n esc: (s: string) => string\n /** <link> tag loading the config's Google Fonts. */\n fontLink: string\n width: number\n height: number\n}\n\n/** Identity helper for typed configs: `export default defineOgCard({...})`. */\nexport function defineOgCard(config: OgCardConfig): OgCardConfig {\n return config\n}\n\nexport const OG_WIDTH = 1200\nexport const OG_HEIGHT = 630\n\n/**\n * Title type scale. The card opens at TITLE_MAX and the in-page fitter steps\n * down until the copy column fits, stopping at TITLE_MIN.\n *\n * The floor is a legibility floor, not a layout one: below ~56px the headline\n * stops reading at the ~300px thumbnail width platforms actually show. A card\n * that would need to go under it is a card whose copy is too long, so the\n * renderer reports that rather than shrinking into mush.\n */\nexport const TITLE_MAX_PX = 104\nexport const TITLE_MIN_PX = 56\n\n/**\n * The attribute the in-page fitter writes its findings to, read back by\n * `sonor-setup og` via Chrome's --dump-dom. Shared so the template and the CLI\n * cannot drift on the name.\n */\nexport const OG_REPORT_ATTR = 'data-og-report'\n\n/** What the in-page fitter reports back about a rendered card. */\nexport interface OgRenderReport {\n /** Did everything land inside the frame, at or above the legibility floor? */\n fits: boolean\n /** Final title size after fitting. Below TITLE_MAX means the copy ran long. */\n titlePx: number\n /** Human-readable problems, each naming the element and the overflow. */\n issues: string[]\n}\n","/**\n * @sonordev/site-kit/og — text color for the card's bottom bar.\n *\n * SINGLE SOURCE OF TRUTH for \"what color is the bar text\", shared by the\n * build-time template (template.ts) and the runtime card (route.tsx). The two\n * disagreed: the template set the bar in `theme.surface`, the runtime card in\n * `theme.text`, and on a site whose text and accent are both strong colors the\n * runtime bar came out unreadable (navy on crimson on watsonhac.com, ink on\n * green on reinhart). Both sites dropped the bar rather than ship it.\n *\n * `theme.barText` always wins. Otherwise the first candidate that reaches\n * WCAG AA for large text against the accent is used, in the order the\n * template always preferred (surface, then bg, then text), so every card\n * that already read well keeps its color. Failing that, the highest-contrast\n * candidate.\n *\n * Pure: no DOM, no Node built-ins.\n */\n\n/**\n * WCAG AA for LARGE text: the bar is bold and 30px or more on both cards,\n * well past the 18.66px-bold line. 4.5:1 (normal text) would flip readable\n * fleet bars like abbeyglenapts.com's white on orange (3.3:1) for no gain.\n */\nconst AA_LARGE = 3\n\n/** `#abc`, `#aabbcc`, `#aabbccdd` → [r, g, b] in 0-255, or null for anything else. */\nexport function parseHexColor(color: string): [number, number, number] | null {\n const hex = color.trim().replace(/^#/, '')\n if (!/^([0-9a-f]{3}|[0-9a-f]{6}|[0-9a-f]{8})$/i.test(hex)) return null\n const full = hex.length === 3 ? hex.replace(/./g, c => c + c) : hex.slice(0, 6)\n return [0, 2, 4].map(i => parseInt(full.slice(i, i + 2), 16)) as [number, number, number]\n}\n\nfunction luminance([r, g, b]: [number, number, number]): number {\n const channel = (v: number) => {\n const s = v / 255\n return s <= 0.03928 ? s / 12.92 : ((s + 0.055) / 1.055) ** 2.4\n }\n return 0.2126 * channel(r) + 0.7152 * channel(g) + 0.0722 * channel(b)\n}\n\n/** WCAG contrast ratio of two hex colors, or null when either isn't hex. */\nexport function contrastRatio(a: string, b: string): number | null {\n const ca = parseHexColor(a)\n const cb = parseHexColor(b)\n if (!ca || !cb) return null\n const [hi, lo] = [luminance(ca), luminance(cb)].sort((x, y) => y - x)\n return (hi + 0.05) / (lo + 0.05)\n}\n\nexport interface BarTheme {\n bg: string\n text: string\n accent: string\n surface?: string\n /** Explicit bar text color. Always wins. */\n barText?: string\n}\n\n/** The color to set the bottom bar's text in, on `theme.accent`. */\nexport function barTextColor(theme: BarTheme): string {\n if (theme.barText) return theme.barText\n const candidates = [theme.surface, theme.bg, theme.text].filter((c): c is string => !!c)\n const scored = candidates.map(color => ({ color, ratio: contrastRatio(color, theme.accent) }))\n const passing = scored.find(s => s.ratio !== null && s.ratio >= AA_LARGE)\n if (passing) return passing.color\n const measurable = scored.filter(s => s.ratio !== null).sort((a, b) => b.ratio! - a.ratio!)\n // Non-hex colors (rgb(), names) can't be scored; keep the template's old\n // choice for them rather than guess.\n return measurable[0]?.color ?? candidates[0]\n}\n"]}
@@ -1,11 +1,102 @@
1
1
  'use client';
2
2
  'use strict';
3
3
 
4
- var chunkJE5DWAE6_js = require('./chunk-JE5DWAE6.js');
4
+ var chunk5XFFUP6D_js = require('./chunk-5XFFUP6D.js');
5
+ var chunkLBZGYF3B_js = require('./chunk-LBZGYF3B.js');
6
+ var chunkP4Y75QSU_js = require('./chunk-P4Y75QSU.js');
5
7
  var chunkVJMPIRSD_js = require('./chunk-VJMPIRSD.js');
6
- var chunkOC7AO7XS_js = require('./chunk-OC7AO7XS.js');
8
+ var chunkPRTXAIIC_js = require('./chunk-PRTXAIIC.js');
7
9
  var react = require('react');
8
10
 
11
+ // src/forms/field-interactions.ts
12
+ var MAX_TRACKED_FIELDS = 100;
13
+ var MAX_FIELD_SLUG_LENGTH = 100;
14
+ var FieldInteractionLog = class {
15
+ constructor() {
16
+ /**
17
+ * The field the visitor was on, reported as `abandonment_field` when they
18
+ * leave. The last FOCUSED field once the form reports focus; a headless form
19
+ * that never wires focus falls back to the last field whose value changed.
20
+ */
21
+ this.lastField = null;
22
+ this.entries = /* @__PURE__ */ new Map();
23
+ this.focusReported = false;
24
+ /** The one field holding focus, if any. Only one can, so this is a slot, not a flag per field. */
25
+ this.open = null;
26
+ }
27
+ /**
28
+ * Visitor moved focus into `slug`. Returns true when that's a new visit to
29
+ * the field; false for an untrackable slug or a field that already has focus.
30
+ */
31
+ focus(slug, now = Date.now()) {
32
+ if (this.open?.slug === slug) return false;
33
+ const entry = this.entry(slug);
34
+ if (!entry) return false;
35
+ this.close(now);
36
+ entry.focusCount++;
37
+ this.open = { slug, since: now };
38
+ this.focusReported = true;
39
+ this.lastField = slug;
40
+ return true;
41
+ }
42
+ /** Visitor moved focus out of `slug`. */
43
+ blur(slug, now = Date.now()) {
44
+ if (this.open?.slug === slug) this.close(now);
45
+ }
46
+ /**
47
+ * `slug`'s value changed. Counts as reaching the field even without a focus
48
+ * event: autofill, a custom renderer that doesn't report focus, a picker
49
+ * that sets the value from outside the input.
50
+ */
51
+ change(slug) {
52
+ if (!this.entry(slug)) return false;
53
+ if (!this.focusReported) this.lastField = slug;
54
+ return true;
55
+ }
56
+ get size() {
57
+ return this.entries.size;
58
+ }
59
+ /**
60
+ * Every field reached so far. Time for a field that still has focus counts
61
+ * up to `now`, so a report built as the page hides includes the field the
62
+ * visitor was sitting in.
63
+ */
64
+ snapshot(isComplete, now = Date.now()) {
65
+ const out = {};
66
+ for (const [slug, entry] of this.entries) {
67
+ const openMs = this.open?.slug === slug ? Math.max(0, now - this.open.since) : 0;
68
+ out[slug] = {
69
+ completed: safeIsComplete(isComplete, slug),
70
+ focusCount: entry.focusCount,
71
+ timeMs: Math.round(entry.timeMs + openMs)
72
+ };
73
+ }
74
+ return out;
75
+ }
76
+ close(now) {
77
+ if (!this.open) return;
78
+ const entry = this.entries.get(this.open.slug);
79
+ if (entry) entry.timeMs += Math.max(0, now - this.open.since);
80
+ this.open = null;
81
+ }
82
+ entry(slug) {
83
+ if (typeof slug !== "string" || slug.length === 0 || slug.length > MAX_FIELD_SLUG_LENGTH) return null;
84
+ const existing = this.entries.get(slug);
85
+ if (existing) return existing;
86
+ if (this.entries.size >= MAX_TRACKED_FIELDS) return null;
87
+ const created = { focusCount: 0, timeMs: 0 };
88
+ this.entries.set(slug, created);
89
+ return created;
90
+ }
91
+ };
92
+ function safeIsComplete(isComplete, slug) {
93
+ try {
94
+ return isComplete(slug) === true;
95
+ } catch {
96
+ return false;
97
+ }
98
+ }
99
+
9
100
  // src/forms/tracking-session.ts
10
101
  var SESSION_GRACE_MS = 2e3;
11
102
  var activeSessions = /* @__PURE__ */ new Map();
@@ -25,7 +116,11 @@ function acquireTrackingSession(formId, start) {
25
116
  startedAt: Date.now(),
26
117
  // Assigned below — declared here so the object shape is complete first.
27
118
  analyticsId: null,
119
+ fields: new FieldInteractionLog(),
120
+ interacted: false,
121
+ completed: false,
28
122
  abandonSent: false,
123
+ onEnd: null,
29
124
  refCount: 1,
30
125
  releaseTimer: null
31
126
  };
@@ -41,17 +136,38 @@ function releaseTrackingSession(formId, session) {
41
136
  session.releaseTimer = null;
42
137
  if (session.refCount <= 0 && activeSessions.get(formId) === session) {
43
138
  activeSessions.delete(formId);
139
+ const onEnd = session.onEnd;
140
+ session.onEnd = null;
141
+ try {
142
+ onEnd?.();
143
+ } catch {
144
+ }
44
145
  }
45
146
  }, SESSION_GRACE_MS);
46
147
  session.releaseTimer?.unref?.();
47
148
  }
149
+ function noteActivity(session) {
150
+ if (session.completed) return;
151
+ session.interacted = true;
152
+ session.abandonSent = false;
153
+ }
154
+ function claimAbandon(session) {
155
+ if (session.completed || !session.interacted || session.abandonSent) return false;
156
+ session.abandonSent = true;
157
+ return true;
158
+ }
159
+ function markCompleted(session) {
160
+ session.completed = true;
161
+ session.abandonSent = true;
162
+ }
48
163
 
49
164
  // src/forms/useFormTracking.ts
50
165
  function useFormTracking({
51
166
  formId,
52
167
  totalSteps,
53
168
  enabled = true,
54
- debug = false
169
+ debug = false,
170
+ isFieldComplete: isFieldComplete2
55
171
  }) {
56
172
  const sessionRef = react.useRef(null);
57
173
  const sessionIdRef = react.useRef("");
@@ -61,6 +177,12 @@ function useFormTracking({
61
177
  const currentStepRef = react.useRef(1);
62
178
  const maxStepRef = react.useRef(1);
63
179
  const analyticsIdRef = react.useRef(null);
180
+ const isFieldCompleteRef = react.useRef(isFieldComplete2);
181
+ isFieldCompleteRef.current = isFieldComplete2;
182
+ const fieldReport = react.useCallback((session, now) => {
183
+ const check = isFieldCompleteRef.current;
184
+ return session.fields.snapshot((slug) => check ? check(slug) : false, now);
185
+ }, []);
64
186
  react.useEffect(() => {
65
187
  if (!enabled) return;
66
188
  if (!formId) {
@@ -75,7 +197,7 @@ function useFormTracking({
75
197
  return null;
76
198
  }
77
199
  try {
78
- const response = await chunkOC7AO7XS_js.sonorFetch(
200
+ const response = await chunkPRTXAIIC_js.sonorFetch(
79
201
  `${apiUrl}/api/public/forms/analytics/start`,
80
202
  {
81
203
  method: "POST",
@@ -108,37 +230,40 @@ function useFormTracking({
108
230
  void session.analyticsId.then((id) => {
109
231
  if (joined) analyticsIdRef.current = id;
110
232
  });
111
- const handleBeforeUnload = () => {
112
- if (!analyticsIdRef.current) return;
113
- if (session.abandonSent) return;
233
+ const reportAbandon = (analyticsId) => {
234
+ if (!analyticsId) return;
114
235
  const apiUrl = window.__SITE_KIT_API_URL__;
115
236
  const apiKey = window.__SITE_KIT_API_KEY__;
116
237
  if (!apiUrl || !apiKey) return;
238
+ if (!claimAbandon(session)) return;
117
239
  const now = Date.now();
118
- const currentStepTime = Math.floor((now - stepStartTimeRef.current) / 1e3);
119
- stepTimesRef.current[currentStepRef.current] = currentStepTime;
120
- session.abandonSent = true;
121
- chunkOC7AO7XS_js.sonorBeacon(
240
+ stepTimesRef.current[currentStepRef.current] = Math.floor((now - stepStartTimeRef.current) / 1e3);
241
+ chunkPRTXAIIC_js.sonorBeacon(
122
242
  `${apiUrl}/api/public/forms/analytics/abandon`,
123
243
  {
124
- analyticsId: analyticsIdRef.current,
244
+ analyticsId,
125
245
  step: currentStepRef.current,
126
246
  maxStep: maxStepRef.current,
127
247
  stepTimes: stepTimesRef.current,
128
- totalTimeSeconds: Math.floor((now - startTimeRef.current) / 1e3)
248
+ totalTimeSeconds: Math.floor((now - startTimeRef.current) / 1e3),
249
+ fieldInteractions: fieldReport(session, now),
250
+ abandonmentField: session.fields.lastField
129
251
  },
130
252
  apiKey
131
253
  );
132
- if (debug) console.log("[Forms] Abandonment tracked");
254
+ if (debug) console.log("[Forms] Abandonment tracked:", session.fields.lastField);
255
+ };
256
+ const stopLeaveListener = chunkP4Y75QSU_js.onPageLeave(() => reportAbandon(analyticsIdRef.current));
257
+ session.onEnd = () => {
258
+ void session.analyticsId.then(reportAbandon);
133
259
  };
134
- window.addEventListener("beforeunload", handleBeforeUnload);
135
260
  return () => {
136
261
  joined = false;
137
- window.removeEventListener("beforeunload", handleBeforeUnload);
262
+ stopLeaveListener();
138
263
  releaseTrackingSession(formId, session);
139
264
  sessionRef.current = null;
140
265
  };
141
- }, [formId, enabled, debug]);
266
+ }, [formId, enabled, debug, fieldReport]);
142
267
  const resolveAnalyticsId = react.useCallback(async () => {
143
268
  if (analyticsIdRef.current) return analyticsIdRef.current;
144
269
  const session = sessionRef.current;
@@ -147,6 +272,19 @@ function useFormTracking({
147
272
  if (id) analyticsIdRef.current = id;
148
273
  return id;
149
274
  }, []);
275
+ const trackFieldFocus = react.useCallback((slug) => {
276
+ const session = sessionRef.current;
277
+ if (!session || session.completed) return;
278
+ if (session.fields.focus(slug)) noteActivity(session);
279
+ }, []);
280
+ const trackFieldBlur = react.useCallback((slug) => {
281
+ sessionRef.current?.fields.blur(slug);
282
+ }, []);
283
+ const trackFieldChange = react.useCallback((slug) => {
284
+ const session = sessionRef.current;
285
+ if (!session || session.completed) return;
286
+ if (session.fields.change(slug)) noteActivity(session);
287
+ }, []);
150
288
  const trackStepChange = react.useCallback(async (step) => {
151
289
  if (!enabled) return;
152
290
  const apiUrl = window.__SITE_KIT_API_URL__;
@@ -161,10 +299,12 @@ function useFormTracking({
161
299
  currentStepRef.current = step;
162
300
  maxStepRef.current = Math.max(maxStepRef.current, step);
163
301
  stepStartTimeRef.current = now;
302
+ const session = sessionRef.current;
303
+ if (session) noteActivity(session);
164
304
  const analyticsId = await resolveAnalyticsId();
165
305
  if (!analyticsId) return;
166
306
  try {
167
- const response = await chunkOC7AO7XS_js.sonorFetch(
307
+ const response = await chunkPRTXAIIC_js.sonorFetch(
168
308
  `${apiUrl}/api/public/forms/analytics/step`,
169
309
  {
170
310
  method: "POST",
@@ -173,7 +313,8 @@ function useFormTracking({
173
313
  analyticsId,
174
314
  step,
175
315
  maxStep: maxStepRef.current,
176
- stepTimes: stepTimesRef.current
316
+ stepTimes: stepTimesRef.current,
317
+ ...session ? { fieldInteractions: fieldReport(session, Date.now()) } : {}
177
318
  })
178
319
  },
179
320
  { apiKey, retries: 0 }
@@ -185,9 +326,11 @@ function useFormTracking({
185
326
  } catch (error) {
186
327
  if (debug) console.error("[Forms] Error updating step:", error);
187
328
  }
188
- }, [enabled, debug, resolveAnalyticsId]);
329
+ }, [enabled, debug, resolveAnalyticsId, fieldReport]);
189
330
  const trackComplete = react.useCallback(async () => {
190
331
  if (!enabled) return;
332
+ const session = sessionRef.current;
333
+ if (session) markCompleted(session);
191
334
  const apiUrl = window.__SITE_KIT_API_URL__;
192
335
  const apiKey = window.__SITE_KIT_API_KEY__;
193
336
  if (!apiUrl || !apiKey) {
@@ -197,21 +340,26 @@ function useFormTracking({
197
340
  const now = Date.now();
198
341
  const finalStepTime = Math.floor((now - stepStartTimeRef.current) / 1e3);
199
342
  stepTimesRef.current[currentStepRef.current] = finalStepTime;
343
+ const fieldInteractions = session ? fieldReport(session, now) : void 0;
200
344
  const analyticsId = await resolveAnalyticsId();
201
345
  if (!analyticsId) return;
202
- const session = sessionRef.current;
203
- if (session) session.abandonSent = true;
204
346
  try {
205
- const response = await chunkOC7AO7XS_js.sonorFetch(
347
+ const response = await chunkPRTXAIIC_js.sonorFetch(
206
348
  `${apiUrl}/api/public/forms/analytics/complete`,
207
349
  {
208
350
  method: "POST",
351
+ // A form with a redirect_url navigates away right after submit, which
352
+ // cancels an ordinary in-flight fetch. And since completion now
353
+ // suppresses the abandon beacon, losing this would leave the row
354
+ // neither completed nor abandoned.
355
+ keepalive: true,
209
356
  headers: { "Content-Type": "application/json" },
210
357
  body: JSON.stringify({
211
358
  analyticsId,
212
359
  totalSteps,
213
360
  stepTimes: stepTimesRef.current,
214
- totalTimeSeconds: Math.floor((now - startTimeRef.current) / 1e3)
361
+ totalTimeSeconds: Math.floor((now - startTimeRef.current) / 1e3),
362
+ ...fieldInteractions ? { fieldInteractions } : {}
215
363
  })
216
364
  },
217
365
  { apiKey, retries: 0 }
@@ -223,10 +371,13 @@ function useFormTracking({
223
371
  } catch (error) {
224
372
  if (debug) console.error("[Forms] Error completing tracking:", error);
225
373
  }
226
- }, [enabled, totalSteps, formId, debug, resolveAnalyticsId]);
374
+ }, [enabled, totalSteps, debug, resolveAnalyticsId, fieldReport]);
227
375
  return {
228
376
  trackStepChange,
229
377
  trackComplete,
378
+ trackFieldFocus,
379
+ trackFieldBlur,
380
+ trackFieldChange,
230
381
  sessionId: sessionIdRef.current
231
382
  };
232
383
  }
@@ -249,7 +400,7 @@ function useForm(formIdOrSlug, options = {}) {
249
400
  } = options;
250
401
  const projectId = optionsProjectId || (typeof window !== "undefined" ? window.__SITE_KIT_PROJECT_ID__ : void 0);
251
402
  const [form, setForm] = react.useState(
252
- () => initialForm ? chunkJE5DWAE6_js.normalizeFormConfig(initialForm) : null
403
+ () => initialForm ? chunkLBZGYF3B_js.normalizeFormConfig(initialForm) : null
253
404
  );
254
405
  const [isLoading, setIsLoading] = react.useState(!initialForm);
255
406
  const [fetchError, setFetchError] = react.useState(null);
@@ -272,11 +423,6 @@ function useForm(formIdOrSlug, options = {}) {
272
423
  const formLoadedAt = react.useRef(Date.now());
273
424
  const totalSteps = form?.total_steps || 1;
274
425
  const isMultiStep = form?.is_multi_step || false;
275
- const { trackStepChange, trackComplete } = useFormTracking({
276
- formId: form?.id || "",
277
- totalSteps,
278
- enabled: trackAnalytics
279
- });
280
426
  react.useEffect(() => {
281
427
  const initialMatches = initialForm && (initialForm.slug === formIdOrSlug || initialForm.id === formIdOrSlug);
282
428
  if (initialMatches) {
@@ -310,7 +456,7 @@ function useForm(formIdOrSlug, options = {}) {
310
456
  formIdOrSlug
311
457
  })
312
458
  };
313
- const response = await chunkOC7AO7XS_js.sonorFetch(url, init, { apiKey, retries: 3, timeoutMs: 15e3 });
459
+ const response = await chunkPRTXAIIC_js.sonorFetch(url, init, { apiKey, retries: 3, timeoutMs: 15e3 });
314
460
  if (!response.ok) {
315
461
  throw new Error(`Failed to fetch form: ${response.statusText}`);
316
462
  }
@@ -320,7 +466,7 @@ function useForm(formIdOrSlug, options = {}) {
320
466
  ;
321
467
  window.__SITE_KIT_RECAPTCHA_SITE_KEY__ = data.recaptcha_site_key;
322
468
  }
323
- setForm(chunkJE5DWAE6_js.normalizeFormConfig(data));
469
+ setForm(chunkLBZGYF3B_js.normalizeFormConfig(data));
324
470
  const defaults = {};
325
471
  for (const field of data.fields || []) {
326
472
  if (field.default_value !== void 0 && field.default_value !== null) {
@@ -343,102 +489,67 @@ function useForm(formIdOrSlug, options = {}) {
343
489
  if (!currentStepConfig) return allFields;
344
490
  return allFields.filter((f) => f.step_id === currentStepConfig.id);
345
491
  }, [form, step, allFields, isMultiStep]);
346
- const isFieldVisible = react.useCallback((field) => {
347
- if (!field.conditional?.show_when) return true;
348
- const { field: condField, operator, value } = field.conditional.show_when;
349
- const fieldValue = values[condField];
350
- switch (operator) {
351
- case "equals":
352
- return fieldValue === value;
353
- case "not_equals":
354
- return fieldValue !== value;
355
- case "contains":
356
- return String(fieldValue || "").includes(String(value));
357
- case "not_contains":
358
- return !String(fieldValue || "").includes(String(value));
359
- case "is_empty":
360
- return !fieldValue || fieldValue === "";
361
- case "not_empty":
362
- return !!fieldValue && fieldValue !== "";
363
- case "greater_than":
364
- return Number(fieldValue) > Number(value);
365
- case "less_than":
366
- return Number(fieldValue) < Number(value);
367
- default:
368
- return true;
369
- }
370
- }, [values]);
492
+ const isFieldVisible2 = react.useCallback(
493
+ (field) => chunk5XFFUP6D_js.isFieldVisible(field, values),
494
+ [values]
495
+ );
371
496
  const visibleFields = react.useMemo(() => {
372
- return fields.filter(isFieldVisible);
373
- }, [fields, isFieldVisible]);
374
- const validateField = react.useCallback((field) => {
375
- if (!isFieldVisible(field)) return null;
376
- if (["heading", "section_header", "paragraph", "hidden"].includes(field.field_type)) return null;
377
- const value = values[field.slug];
378
- const rules = field.validation || {};
379
- if (field.is_required && (!value || value === "")) {
380
- return rules.custom_error || `${field.label} is required`;
381
- }
382
- if (!value) return null;
383
- const strValue = String(value);
384
- if (rules.min_length && strValue.length < rules.min_length) {
385
- return `${field.label} must be at least ${rules.min_length} characters`;
386
- }
387
- if (rules.max_length && strValue.length > rules.max_length) {
388
- return `${field.label} must be no more than ${rules.max_length} characters`;
389
- }
390
- if (rules.min !== void 0 && Number(value) < rules.min) {
391
- return `${field.label} must be at least ${rules.min}`;
392
- }
393
- if (rules.max !== void 0 && Number(value) > rules.max) {
394
- return `${field.label} must be no more than ${rules.max}`;
395
- }
396
- if (rules.pattern) {
397
- try {
398
- if (!new RegExp(rules.pattern).test(strValue)) {
399
- return rules.custom_error || `${field.label} is invalid`;
400
- }
401
- } catch {
402
- }
403
- }
404
- if (field.field_type === "email" && !/^[^\s@]+@[^\s@]+\.[^\s@]+$/.test(strValue)) {
405
- return "Please enter a valid email address";
406
- }
407
- if (field.field_type === "phone" && !/^[\d\s\-\+\(\)]+$/.test(strValue)) {
408
- return "Please enter a valid phone number";
497
+ return fields.filter(isFieldVisible2);
498
+ }, [fields, isFieldVisible2]);
499
+ const validateField2 = react.useCallback(
500
+ (field) => chunk5XFFUP6D_js.validateField(field, values, isFieldVisible2),
501
+ [values, isFieldVisible2]
502
+ );
503
+ const fieldBySlug = react.useMemo(
504
+ () => new Map(allFields.map((f) => [f.slug, f])),
505
+ [allFields]
506
+ );
507
+ const {
508
+ trackStepChange,
509
+ trackComplete,
510
+ trackFieldFocus,
511
+ trackFieldBlur,
512
+ trackFieldChange
513
+ } = useFormTracking({
514
+ formId: form?.id || "",
515
+ totalSteps,
516
+ enabled: trackAnalytics,
517
+ isFieldComplete: (slug) => {
518
+ const field = fieldBySlug.get(slug);
519
+ return field ? chunk5XFFUP6D_js.isFieldComplete(field, values, isFieldVisible2) : false;
409
520
  }
410
- return null;
411
- }, [values, isFieldVisible]);
521
+ });
412
522
  const validate = react.useCallback(() => {
413
523
  const newErrors = {};
414
524
  for (const field of fields) {
415
- const error = validateField(field);
525
+ const error = validateField2(field);
416
526
  if (error) {
417
527
  newErrors[field.slug] = error;
418
528
  }
419
529
  }
420
530
  setErrors(newErrors);
421
531
  return Object.keys(newErrors).length === 0;
422
- }, [fields, validateField]);
532
+ }, [fields, validateField2]);
423
533
  const validateAll = react.useCallback(() => {
424
534
  const newErrors = {};
425
535
  for (const field of allFields) {
426
- const error = validateField(field);
536
+ const error = validateField2(field);
427
537
  if (error) newErrors[field.slug] = error;
428
538
  }
429
539
  setErrors(newErrors);
430
540
  return Object.keys(newErrors).length === 0;
431
- }, [allFields, validateField]);
541
+ }, [allFields, validateField2]);
432
542
  const buildVisibleValues = react.useCallback(() => {
433
543
  const out = {};
434
544
  for (const field of allFields) {
435
- if (!isFieldVisible(field)) continue;
545
+ if (!isFieldVisible2(field)) continue;
436
546
  if (field.slug in values) out[field.slug] = values[field.slug];
437
547
  }
438
548
  return out;
439
- }, [allFields, values, isFieldVisible]);
549
+ }, [allFields, values, isFieldVisible2]);
440
550
  const setFieldValue = react.useCallback((key, value) => {
441
551
  setValuesState((prev) => ({ ...prev, [key]: value }));
552
+ trackFieldChange(key);
442
553
  setErrors((prev) => {
443
554
  if (prev[key]) {
444
555
  const next = { ...prev };
@@ -447,7 +558,7 @@ function useForm(formIdOrSlug, options = {}) {
447
558
  }
448
559
  return prev;
449
560
  });
450
- }, []);
561
+ }, [trackFieldChange]);
451
562
  const setValues = react.useCallback((newValues) => {
452
563
  setValuesState((prev) => ({ ...prev, ...newValues }));
453
564
  }, []);
@@ -489,7 +600,7 @@ function useForm(formIdOrSlug, options = {}) {
489
600
  setIsSubmitting(true);
490
601
  setSubmitError(null);
491
602
  try {
492
- const data = await chunkJE5DWAE6_js.submitForm({
603
+ const data = await chunkLBZGYF3B_js.submitForm({
493
604
  config: form,
494
605
  values: buildVisibleValues(),
495
606
  honeypotValue: "",
@@ -542,16 +653,18 @@ function useForm(formIdOrSlug, options = {}) {
542
653
  canGoPrev,
543
654
  isLastStep,
544
655
  validate,
545
- validateField,
546
- isFieldVisible,
656
+ validateField: validateField2,
657
+ isFieldVisible: isFieldVisible2,
547
658
  submit,
548
659
  isSubmitting,
549
660
  isComplete,
550
- reset
661
+ reset,
662
+ trackFieldFocus,
663
+ trackFieldBlur
551
664
  };
552
665
  }
553
666
 
554
667
  exports.useForm = useForm;
555
668
  exports.useFormTracking = useFormTracking;
556
- //# sourceMappingURL=chunk-CQRLKNHQ.js.map
557
- //# sourceMappingURL=chunk-CQRLKNHQ.js.map
669
+ //# sourceMappingURL=chunk-ZEOC26LZ.js.map
670
+ //# sourceMappingURL=chunk-ZEOC26LZ.js.map