@sonordev/site-kit 5.1.0 → 5.3.1

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 (267) hide show
  1. package/README.md +15 -0
  2. package/agent-manifest.json +23 -2
  3. package/dist/AnalyticsProvider-NA7EMJCA.mjs +10 -0
  4. package/dist/{AnalyticsProvider-2LCSA6G3.mjs.map → AnalyticsProvider-NA7EMJCA.mjs.map} +1 -1
  5. package/dist/AnalyticsProvider-XE3ADUUH.js +31 -0
  6. package/dist/{AnalyticsProvider-V2U3TQMH.js.map → AnalyticsProvider-XE3ADUUH.js.map} +1 -1
  7. package/dist/{BlogViewTracker-COTPD7WL.js → BlogViewTracker-DVJHZ7CM.js} +6 -6
  8. package/dist/{BlogViewTracker-COTPD7WL.js.map → BlogViewTracker-DVJHZ7CM.js.map} +1 -1
  9. package/dist/{BlogViewTracker-HG25ONRP.mjs → BlogViewTracker-MKJYTTJQ.mjs} +5 -5
  10. package/dist/{BlogViewTracker-HG25ONRP.mjs.map → BlogViewTracker-MKJYTTJQ.mjs.map} +1 -1
  11. package/dist/ChatWidget-BD4F4XLD.mjs +11 -0
  12. package/dist/{ChatWidget-RWO7R7EJ.mjs.map → ChatWidget-BD4F4XLD.mjs.map} +1 -1
  13. package/dist/ChatWidget-BZ3KOSXG.js +20 -0
  14. package/dist/{ChatWidget-4QUJYFXU.js.map → ChatWidget-BZ3KOSXG.js.map} +1 -1
  15. package/dist/EngageWidget-JPP6EDCJ.js +18 -0
  16. package/dist/{EngageWidget-RSOXB3YM.js.map → EngageWidget-JPP6EDCJ.js.map} +1 -1
  17. package/dist/EngageWidget-L7B6PCM3.mjs +9 -0
  18. package/dist/{EngageWidget-LF4AC4QN.mjs.map → EngageWidget-L7B6PCM3.mjs.map} +1 -1
  19. package/dist/{FileField-YJ7DZXC3.mjs → FileField-7WPRONDS.mjs} +5 -5
  20. package/dist/{FileField-YJ7DZXC3.mjs.map → FileField-7WPRONDS.mjs.map} +1 -1
  21. package/dist/{FileField-S2GUM3QB.js → FileField-GHT7444Y.js} +6 -6
  22. package/dist/{FileField-S2GUM3QB.js.map → FileField-GHT7444Y.js.map} +1 -1
  23. package/dist/{FormSpotlight-7WAXLXZA.js → FormSpotlight-BB2IB7IX.js} +18 -18
  24. package/dist/{FormSpotlight-7WAXLXZA.js.map → FormSpotlight-BB2IB7IX.js.map} +1 -1
  25. package/dist/{FormSpotlight-HLH5LQKI.mjs → FormSpotlight-WZVS6HHR.mjs} +4 -4
  26. package/dist/{FormSpotlight-HLH5LQKI.mjs.map → FormSpotlight-WZVS6HHR.mjs.map} +1 -1
  27. package/dist/{FormStage-LEZYERJB.js → FormStage-FLBLXENZ.js} +15 -15
  28. package/dist/{FormStage-LEZYERJB.js.map → FormStage-FLBLXENZ.js.map} +1 -1
  29. package/dist/{FormStage-Q5JW75AF.mjs → FormStage-Y3NHHMV2.mjs} +4 -4
  30. package/dist/{FormStage-Q5JW75AF.mjs.map → FormStage-Y3NHHMV2.mjs.map} +1 -1
  31. package/dist/ManagedForm-2OPCHDNJ.js +23 -0
  32. package/dist/{ManagedForm-H4SEFSAF.js.map → ManagedForm-2OPCHDNJ.js.map} +1 -1
  33. package/dist/ManagedForm-AJM6D4SK.mjs +14 -0
  34. package/dist/{ManagedForm-U3NFIVEC.mjs.map → ManagedForm-AJM6D4SK.mjs.map} +1 -1
  35. package/dist/{ManagedNewsletterForm-KT2NGUNW.js → ManagedNewsletterForm-L2ZHJ7F4.js} +8 -8
  36. package/dist/{ManagedNewsletterForm-KT2NGUNW.js.map → ManagedNewsletterForm-L2ZHJ7F4.js.map} +1 -1
  37. package/dist/{ManagedNewsletterForm-YKYW7B6P.mjs → ManagedNewsletterForm-MJI2JXIB.mjs} +7 -7
  38. package/dist/{ManagedNewsletterForm-YKYW7B6P.mjs.map → ManagedNewsletterForm-MJI2JXIB.mjs.map} +1 -1
  39. package/dist/{SignalCore-2BH5PUGS.mjs → SignalCore-23YDDSWO.mjs} +5 -5
  40. package/dist/{SignalCore-2BH5PUGS.mjs.map → SignalCore-23YDDSWO.mjs.map} +1 -1
  41. package/dist/{SignalCore-JM4ODFL2.js → SignalCore-G2VM7NUP.js} +11 -11
  42. package/dist/{SignalCore-JM4ODFL2.js.map → SignalCore-G2VM7NUP.js.map} +1 -1
  43. package/dist/SitemapSync-T2N3TCWF.js +17 -0
  44. package/dist/{SitemapSync-J4UMJRTO.js.map → SitemapSync-T2N3TCWF.js.map} +1 -1
  45. package/dist/SitemapSync-YLWMU6J3.mjs +8 -0
  46. package/dist/{SitemapSync-5CXS2JGB.mjs.map → SitemapSync-YLWMU6J3.mjs.map} +1 -1
  47. package/dist/analytics/index.js +9 -9
  48. package/dist/analytics/index.mjs +4 -4
  49. package/dist/blog/index.js +20 -20
  50. package/dist/blog/index.mjs +3 -3
  51. package/dist/blog/server-ui.js +14 -14
  52. package/dist/blog/server-ui.mjs +2 -2
  53. package/dist/{chunk-44ZTBQH4.js → chunk-2MPOO6QJ.js} +3 -3
  54. package/dist/{chunk-44ZTBQH4.js.map → chunk-2MPOO6QJ.js.map} +1 -1
  55. package/dist/{chunk-E3GHVAMK.js → chunk-2VQ5YXOD.js} +23 -23
  56. package/dist/{chunk-E3GHVAMK.js.map → chunk-2VQ5YXOD.js.map} +1 -1
  57. package/dist/{chunk-CGQO7MFO.js → chunk-47566YF4.js} +14 -14
  58. package/dist/{chunk-CGQO7MFO.js.map → chunk-47566YF4.js.map} +1 -1
  59. package/dist/{chunk-ADOGOLYO.mjs → chunk-4HL6CAZ7.mjs} +4 -4
  60. package/dist/{chunk-ADOGOLYO.mjs.map → chunk-4HL6CAZ7.mjs.map} +1 -1
  61. package/dist/{chunk-DTNNZJYM.mjs → chunk-4IMZ45YA.mjs} +5 -5
  62. package/dist/{chunk-DTNNZJYM.mjs.map → chunk-4IMZ45YA.mjs.map} +1 -1
  63. package/dist/{chunk-ACLBRIYD.js → chunk-4S7BHFGT.js} +3 -3
  64. package/dist/{chunk-ACLBRIYD.js.map → chunk-4S7BHFGT.js.map} +1 -1
  65. package/dist/{chunk-FMOOQKZU.js → chunk-5HMN3FXL.js} +10 -10
  66. package/dist/{chunk-FMOOQKZU.js.map → chunk-5HMN3FXL.js.map} +1 -1
  67. package/dist/{chunk-TAM2D54C.js → chunk-5TGSM5EQ.js} +14 -14
  68. package/dist/{chunk-TAM2D54C.js.map → chunk-5TGSM5EQ.js.map} +1 -1
  69. package/dist/{chunk-BVLGJ2CZ.mjs → chunk-77HT6TYK.mjs} +3 -3
  70. package/dist/{chunk-BVLGJ2CZ.mjs.map → chunk-77HT6TYK.mjs.map} +1 -1
  71. package/dist/{chunk-2XHEUWHV.mjs → chunk-7UPPYERC.mjs} +4 -4
  72. package/dist/{chunk-2XHEUWHV.mjs.map → chunk-7UPPYERC.mjs.map} +1 -1
  73. package/dist/chunk-AEW7EFYU.js +147 -0
  74. package/dist/chunk-AEW7EFYU.js.map +1 -0
  75. package/dist/{chunk-OAJVITNO.mjs → chunk-AJBJH3BA.mjs} +3 -3
  76. package/dist/{chunk-OAJVITNO.mjs.map → chunk-AJBJH3BA.mjs.map} +1 -1
  77. package/dist/{chunk-SXNKLHOX.mjs → chunk-AKQA5ZYZ.mjs} +3 -3
  78. package/dist/{chunk-SXNKLHOX.mjs.map → chunk-AKQA5ZYZ.mjs.map} +1 -1
  79. package/dist/{chunk-WZMM57R2.js → chunk-APL44ZVK.js} +5 -5
  80. package/dist/{chunk-WZMM57R2.js.map → chunk-APL44ZVK.js.map} +1 -1
  81. package/dist/{chunk-JEI3CSY4.js → chunk-AVPMSJCQ.js} +4 -4
  82. package/dist/{chunk-JEI3CSY4.js.map → chunk-AVPMSJCQ.js.map} +1 -1
  83. package/dist/{chunk-TECD4AP7.mjs → chunk-COAVBUMS.mjs} +3 -3
  84. package/dist/{chunk-TECD4AP7.mjs.map → chunk-COAVBUMS.mjs.map} +1 -1
  85. package/dist/{chunk-BUDV7QHH.mjs → chunk-DBJRJ2Q2.mjs} +4 -4
  86. package/dist/{chunk-BUDV7QHH.mjs.map → chunk-DBJRJ2Q2.mjs.map} +1 -1
  87. package/dist/{chunk-OTHKWMDB.mjs → chunk-DN6A6KXH.mjs} +3 -3
  88. package/dist/{chunk-OTHKWMDB.mjs.map → chunk-DN6A6KXH.mjs.map} +1 -1
  89. package/dist/{chunk-GYAH4KFC.js → chunk-DTX4R45S.js} +40 -4
  90. package/dist/chunk-DTX4R45S.js.map +1 -0
  91. package/dist/{chunk-UMWVTIIZ.mjs → chunk-FH4LLJFL.mjs} +8 -8
  92. package/dist/{chunk-UMWVTIIZ.mjs.map → chunk-FH4LLJFL.mjs.map} +1 -1
  93. package/dist/{chunk-ZFZMN4LT.mjs → chunk-GM5E6R5W.mjs} +39 -3
  94. package/dist/chunk-GM5E6R5W.mjs.map +1 -0
  95. package/dist/{chunk-GZVSGQKT.js → chunk-GPH3VVLP.js} +3 -3
  96. package/dist/{chunk-GZVSGQKT.js.map → chunk-GPH3VVLP.js.map} +1 -1
  97. package/dist/{chunk-CBMHJPR7.js → chunk-GQTSQR63.js} +5 -5
  98. package/dist/{chunk-CBMHJPR7.js.map → chunk-GQTSQR63.js.map} +1 -1
  99. package/dist/{chunk-BGBJSMXT.js → chunk-GTK3CGWF.js} +6 -6
  100. package/dist/{chunk-BGBJSMXT.js.map → chunk-GTK3CGWF.js.map} +1 -1
  101. package/dist/{chunk-LB7LHVWI.mjs → chunk-H7274TKR.mjs} +9 -3
  102. package/dist/chunk-H7274TKR.mjs.map +1 -0
  103. package/dist/{chunk-MCXHQHIX.js → chunk-HIV5YK5G.js} +4 -4
  104. package/dist/{chunk-MCXHQHIX.js.map → chunk-HIV5YK5G.js.map} +1 -1
  105. package/dist/chunk-HRQ4367C.mjs +6 -0
  106. package/dist/{chunk-4SQ6PROR.mjs.map → chunk-HRQ4367C.mjs.map} +1 -1
  107. package/dist/{chunk-A3VGZAZQ.mjs → chunk-I72AUITZ.mjs} +3 -3
  108. package/dist/{chunk-A3VGZAZQ.mjs.map → chunk-I72AUITZ.mjs.map} +1 -1
  109. package/dist/{chunk-2ACKOMAL.js → chunk-IPV2TUAT.js} +9 -3
  110. package/dist/chunk-IPV2TUAT.js.map +1 -0
  111. package/dist/{chunk-CYQB5GLU.mjs → chunk-ISKJLXB4.mjs} +4 -4
  112. package/dist/{chunk-CYQB5GLU.mjs.map → chunk-ISKJLXB4.mjs.map} +1 -1
  113. package/dist/{chunk-HPIY7AR3.js → chunk-KP56C66Z.js} +14 -14
  114. package/dist/{chunk-HPIY7AR3.js.map → chunk-KP56C66Z.js.map} +1 -1
  115. package/dist/{chunk-PXAALKTP.js → chunk-KP5BFPGT.js} +5 -3
  116. package/dist/chunk-KP5BFPGT.js.map +1 -0
  117. package/dist/{chunk-VCNPTLK2.js → chunk-LFJRMY4V.js} +12 -12
  118. package/dist/{chunk-VCNPTLK2.js.map → chunk-LFJRMY4V.js.map} +1 -1
  119. package/dist/{chunk-2EJX56YJ.js → chunk-LHD45PGP.js} +8 -8
  120. package/dist/{chunk-2EJX56YJ.js.map → chunk-LHD45PGP.js.map} +1 -1
  121. package/dist/chunk-MLXUMVBK.mjs +142 -0
  122. package/dist/chunk-MLXUMVBK.mjs.map +1 -0
  123. package/dist/{chunk-ROJ25QM3.mjs → chunk-NW5CBNRU.mjs} +3 -3
  124. package/dist/{chunk-ROJ25QM3.mjs.map → chunk-NW5CBNRU.mjs.map} +1 -1
  125. package/dist/{chunk-5G2ZRQMO.mjs → chunk-PA5ZVCW2.mjs} +3 -3
  126. package/dist/{chunk-5G2ZRQMO.mjs.map → chunk-PA5ZVCW2.mjs.map} +1 -1
  127. package/dist/{chunk-IQLYFQKZ.js → chunk-QG7WHAGD.js} +15 -15
  128. package/dist/{chunk-IQLYFQKZ.js.map → chunk-QG7WHAGD.js.map} +1 -1
  129. package/dist/{chunk-FZISCIJV.mjs → chunk-R4PFWVGZ.mjs} +4 -4
  130. package/dist/{chunk-FZISCIJV.mjs.map → chunk-R4PFWVGZ.mjs.map} +1 -1
  131. package/dist/{chunk-5YKMHPJL.mjs → chunk-R5F2JQVX.mjs} +5 -3
  132. package/dist/chunk-R5F2JQVX.mjs.map +1 -0
  133. package/dist/{chunk-CKPFETIO.js → chunk-SHZXSIRH.js} +4 -4
  134. package/dist/{chunk-CKPFETIO.js.map → chunk-SHZXSIRH.js.map} +1 -1
  135. package/dist/{chunk-NSTY7ZZA.mjs → chunk-SI7R3IJX.mjs} +8 -8
  136. package/dist/{chunk-NSTY7ZZA.mjs.map → chunk-SI7R3IJX.mjs.map} +1 -1
  137. package/dist/{chunk-ACWGG4VW.js → chunk-TAIGHH5J.js} +9 -9
  138. package/dist/{chunk-ACWGG4VW.js.map → chunk-TAIGHH5J.js.map} +1 -1
  139. package/dist/chunk-TMQKZ4DO.js +8 -0
  140. package/dist/{chunk-YPEX4RDE.js.map → chunk-TMQKZ4DO.js.map} +1 -1
  141. package/dist/{chunk-VIIGOCX4.js → chunk-UJOEN4X6.js} +15 -15
  142. package/dist/{chunk-VIIGOCX4.js.map → chunk-UJOEN4X6.js.map} +1 -1
  143. package/dist/{chunk-EZLK2OQL.js → chunk-UYR22S67.js} +7 -7
  144. package/dist/{chunk-EZLK2OQL.js.map → chunk-UYR22S67.js.map} +1 -1
  145. package/dist/{chunk-5W56B52Z.mjs → chunk-VGX6G3TA.mjs} +3 -3
  146. package/dist/{chunk-5W56B52Z.mjs.map → chunk-VGX6G3TA.mjs.map} +1 -1
  147. package/dist/{chunk-WMNRTCYY.js → chunk-VLR2UYO4.js} +11 -11
  148. package/dist/{chunk-WMNRTCYY.js.map → chunk-VLR2UYO4.js.map} +1 -1
  149. package/dist/{chunk-VWVUYL5J.mjs → chunk-W47J6ZZG.mjs} +4 -4
  150. package/dist/{chunk-VWVUYL5J.mjs.map → chunk-W47J6ZZG.mjs.map} +1 -1
  151. package/dist/{chunk-NIJVVW4G.mjs → chunk-WD57YWY5.mjs} +3 -3
  152. package/dist/{chunk-NIJVVW4G.mjs.map → chunk-WD57YWY5.mjs.map} +1 -1
  153. package/dist/{chunk-ADBLBGCQ.mjs → chunk-WZZYTFDV.mjs} +3 -3
  154. package/dist/{chunk-ADBLBGCQ.mjs.map → chunk-WZZYTFDV.mjs.map} +1 -1
  155. package/dist/{chunk-EKTMXHBI.mjs → chunk-X4PL7R63.mjs} +3 -3
  156. package/dist/{chunk-EKTMXHBI.mjs.map → chunk-X4PL7R63.mjs.map} +1 -1
  157. package/dist/{chunk-6YKNDQYJ.mjs → chunk-XR47TOGW.mjs} +3 -3
  158. package/dist/{chunk-6YKNDQYJ.mjs.map → chunk-XR47TOGW.mjs.map} +1 -1
  159. package/dist/{chunk-DKRXPXOR.js → chunk-ZMFJXFUY.js} +3 -3
  160. package/dist/{chunk-DKRXPXOR.js.map → chunk-ZMFJXFUY.js.map} +1 -1
  161. package/dist/cli/index.js +3 -3
  162. package/dist/cli/index.mjs +1 -1
  163. package/dist/client/index.js +4 -4
  164. package/dist/client/index.mjs +3 -3
  165. package/dist/commerce/index.js +56 -56
  166. package/dist/commerce/index.mjs +5 -5
  167. package/dist/config/index.js +2 -2
  168. package/dist/config/index.mjs +1 -1
  169. package/dist/engage/index.js +13 -13
  170. package/dist/engage/index.mjs +7 -7
  171. package/dist/fleet/index.js +8 -8
  172. package/dist/fleet/index.mjs +4 -4
  173. package/dist/forms/FormField.d.ts +2 -1
  174. package/dist/forms/FormField.d.ts.map +1 -1
  175. package/dist/forms/ga4-identity.d.ts +31 -0
  176. package/dist/forms/ga4-identity.d.ts.map +1 -0
  177. package/dist/forms/ga4-identity.test.d.ts +2 -0
  178. package/dist/forms/ga4-identity.test.d.ts.map +1 -0
  179. package/dist/forms/index.js +24 -24
  180. package/dist/forms/index.mjs +10 -10
  181. package/dist/forms/server.js +11 -11
  182. package/dist/forms/server.mjs +9 -9
  183. package/dist/forms/static.js +8 -8
  184. package/dist/forms/static.mjs +7 -7
  185. package/dist/forms/styles.css +21 -0
  186. package/dist/forms/submitForm.d.ts.map +1 -1
  187. package/dist/forms/types.d.ts +13 -0
  188. package/dist/forms/types.d.ts.map +1 -1
  189. package/dist/images/index.js +11 -11
  190. package/dist/images/index.mjs +4 -4
  191. package/dist/index.js +63 -63
  192. package/dist/index.mjs +9 -9
  193. package/dist/layout/client.js +8 -8
  194. package/dist/layout/client.mjs +7 -7
  195. package/dist/layout/index.js +10 -10
  196. package/dist/layout/index.mjs +8 -8
  197. package/dist/maps/index.js +5 -5
  198. package/dist/maps/index.mjs +3 -3
  199. package/dist/motion/Parallax.d.ts +42 -0
  200. package/dist/motion/Parallax.d.ts.map +1 -0
  201. package/dist/motion/Reveal.d.ts +59 -0
  202. package/dist/motion/Reveal.d.ts.map +1 -0
  203. package/dist/motion/ScrollScene.d.ts +42 -0
  204. package/dist/motion/ScrollScene.d.ts.map +1 -0
  205. package/dist/motion/engine.d.ts +74 -0
  206. package/dist/motion/engine.d.ts.map +1 -0
  207. package/dist/motion/failsafe.d.ts +20 -0
  208. package/dist/motion/failsafe.d.ts.map +1 -0
  209. package/dist/motion/gsap.d.ts +84 -0
  210. package/dist/motion/gsap.d.ts.map +1 -0
  211. package/dist/motion/gsap.js +103 -0
  212. package/dist/motion/gsap.js.map +1 -0
  213. package/dist/motion/gsap.mjs +99 -0
  214. package/dist/motion/gsap.mjs.map +1 -0
  215. package/dist/motion/index.d.ts +31 -0
  216. package/dist/motion/index.d.ts.map +1 -0
  217. package/dist/motion/index.js +252 -0
  218. package/dist/motion/index.js.map +1 -0
  219. package/dist/motion/index.mjs +230 -0
  220. package/dist/motion/index.mjs.map +1 -0
  221. package/dist/motion/motion.test.d.ts +16 -0
  222. package/dist/motion/motion.test.d.ts.map +1 -0
  223. package/dist/motion/three.d.ts +105 -0
  224. package/dist/motion/three.d.ts.map +1 -0
  225. package/dist/motion/three.js +150 -0
  226. package/dist/motion/three.js.map +1 -0
  227. package/dist/motion/three.mjs +145 -0
  228. package/dist/motion/three.mjs.map +1 -0
  229. package/dist/proxy/index.js +3 -3
  230. package/dist/proxy/index.mjs +2 -2
  231. package/dist/proxy/securityHeaders.d.ts +21 -6
  232. package/dist/proxy/securityHeaders.d.ts.map +1 -1
  233. package/dist/search/index.js +4 -4
  234. package/dist/search/index.mjs +3 -3
  235. package/dist/seo/client.js +5 -5
  236. package/dist/seo/client.mjs +4 -4
  237. package/dist/seo/index.js +5 -5
  238. package/dist/seo/index.mjs +4 -4
  239. package/dist/server/index.js +3 -3
  240. package/dist/server/index.mjs +2 -2
  241. package/dist/shared/build-entries.d.ts +7 -1
  242. package/dist/shared/build-entries.d.ts.map +1 -1
  243. package/dist/shared/version.d.ts +1 -1
  244. package/dist/signal/index.js +11 -11
  245. package/dist/signal/index.mjs +2 -2
  246. package/dist/sync/index.js +16 -16
  247. package/dist/sync/index.mjs +4 -4
  248. package/package.json +28 -2
  249. package/skills/site-kit/SKILL.md +6 -0
  250. package/dist/AnalyticsProvider-2LCSA6G3.mjs +0 -10
  251. package/dist/AnalyticsProvider-V2U3TQMH.js +0 -31
  252. package/dist/ChatWidget-4QUJYFXU.js +0 -20
  253. package/dist/ChatWidget-RWO7R7EJ.mjs +0 -11
  254. package/dist/EngageWidget-LF4AC4QN.mjs +0 -9
  255. package/dist/EngageWidget-RSOXB3YM.js +0 -18
  256. package/dist/ManagedForm-H4SEFSAF.js +0 -23
  257. package/dist/ManagedForm-U3NFIVEC.mjs +0 -14
  258. package/dist/SitemapSync-5CXS2JGB.mjs +0 -8
  259. package/dist/SitemapSync-J4UMJRTO.js +0 -17
  260. package/dist/chunk-2ACKOMAL.js.map +0 -1
  261. package/dist/chunk-4SQ6PROR.mjs +0 -6
  262. package/dist/chunk-5YKMHPJL.mjs.map +0 -1
  263. package/dist/chunk-GYAH4KFC.js.map +0 -1
  264. package/dist/chunk-LB7LHVWI.mjs.map +0 -1
  265. package/dist/chunk-PXAALKTP.js.map +0 -1
  266. package/dist/chunk-YPEX4RDE.js +0 -8
  267. package/dist/chunk-ZFZMN4LT.mjs.map +0 -1
@@ -26,7 +26,7 @@ function useFieldControls(fields) {
26
26
  }
27
27
  if (needsFile && !requested.current.file) {
28
28
  requested.current.file = true;
29
- import('./FileField-YJ7DZXC3.mjs').then((m) => {
29
+ import('./FileField-7WPRONDS.mjs').then((m) => {
30
30
  if (!cancelled) setControls((prev) => ({ ...prev, File: m.FileField }));
31
31
  }).catch(() => {
32
32
  requested.current.file = false;
@@ -134,5 +134,5 @@ function formatAnswer(value) {
134
134
  var AUTO_ADVANCE_TYPES = ["radio", "select", "rating"];
135
135
 
136
136
  export { AUTO_ADVANCE_TYPES, countStageQuestions, countStageViews, formatAnswer, isEmptyValue, stageEstimate, stageFirstName, stageViews, useFieldControls };
137
- //# sourceMappingURL=chunk-BVLGJ2CZ.mjs.map
138
- //# sourceMappingURL=chunk-BVLGJ2CZ.mjs.map
137
+ //# sourceMappingURL=chunk-77HT6TYK.mjs.map
138
+ //# sourceMappingURL=chunk-77HT6TYK.mjs.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/forms/field-controls.ts","../src/forms/experience-plan.ts"],"names":[],"mappings":"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","file":"chunk-BVLGJ2CZ.mjs","sourcesContent":["'use client'\n\n/**\n * The field controls that need React hooks, loaded only when a form actually\n * has a field that uses them.\n *\n * FormField deliberately does NOT import these. DatePicker carries 17 hooks\n * and FileField holds upload state; importing them there put both in\n * FormField's chunk, which the build stamps `'use client'` — so a Server\n * Component rendering a single text input shipped 38 KB of date picker to the\n * browser. Injecting them from the client side keeps FormField hook-free and\n * therefore server-renderable, which is the whole basis of StaticForm.\n *\n * Injection alone still put both controls in the forms entry's eager graph,\n * because a module-level constant referencing them is a static import: every\n * form paid for the date picker, and most forms have no date field. They are\n * now fetched on demand, per control, from the field list.\n *\n * The wait costs nothing visually. FormField already renders the native\n * control when a control is absent (static mode does exactly this), so a date\n * field paints as `<input type=\"date\">` and upgrades in place when the chunk\n * lands — the same enhancement path a no-JS visitor never leaves.\n *\n * Every client renderer of <FormField> (FormClient, FormSpotlight, FormStage)\n * calls this hook, so the experiences and the classic form always offer\n * identical controls.\n */\n\nimport { useEffect, useMemo, useRef, useState } from 'react'\nimport type { FormField as FormFieldType } from './types'\n\nexport interface FieldControls {\n Date?: React.ComponentType<any>\n File?: React.ComponentType<any>\n}\n\n/** Stable identity for the common case (no date, no file) — no render churn. */\nconst NO_CONTROLS: FieldControls = {}\n\nexport function useFieldControls(fields: FormFieldType[] | undefined): FieldControls {\n const needsDate = useMemo(\n () => (fields ?? []).some((f) => f.field_type === 'date' || f.field_type === 'datetime'),\n [fields],\n )\n const needsFile = useMemo(\n () => (fields ?? []).some((f) => f.field_type === 'file'),\n [fields],\n )\n\n const [controls, setControls] = useState<FieldControls>(NO_CONTROLS)\n // Guards re-import when a conditional field toggles visibility mid-fill.\n const requested = useRef({ date: false, file: false })\n\n useEffect(() => {\n let cancelled = false\n\n if (needsDate && !requested.current.date) {\n requested.current.date = true\n import('./DatePicker')\n .then((m) => {\n if (!cancelled) setControls((prev) => ({ ...prev, Date: m.DatePicker }))\n })\n .catch(() => {\n // Chunk never arrived — the native date input stays, which submits\n // the same value. A failed fetch must not cost the lead.\n requested.current.date = false\n })\n }\n\n if (needsFile && !requested.current.file) {\n requested.current.file = true\n import('./FileField')\n .then((m) => {\n if (!cancelled) setControls((prev) => ({ ...prev, File: m.FileField }))\n })\n .catch(() => {\n requested.current.file = false\n })\n }\n\n return () => {\n cancelled = true\n }\n }, [needsDate, needsFile])\n\n return controls\n}\n","/**\n * Shared planning helpers for the alternate form experiences (stage,\n * spotlight). Pure data — no React, no CSS — so FormClient can import the\n * counts it needs for tracking WITHOUT pulling an experience component (and\n * its stylesheet) into every site's forms bundle. The components themselves\n * are lazy-loaded; this module is the only part that ships eagerly.\n */\n\nimport type {\n FormField as FormFieldType,\n FormStep,\n ManagedFormConfig,\n} from './types'\n\n/** Display-only / non-question field types — never staged. */\nconst NON_QUESTION_TYPES = ['heading', 'section_header', 'paragraph', 'hidden']\n\nexport interface StageQuestion {\n field: FormFieldType\n /** The step (chapter) this question belongs to, when the form is multi-step. */\n step?: FormStep\n}\n\nexport interface StageView {\n fields: FormFieldType[]\n step?: FormStep\n}\n\n/**\n * Flatten a form into its ordered question list. Steps become chapters:\n * multi-step forms iterate steps in step_number order (fields are already\n * sorted by sort_order via normalizeFormConfig); stepless fields trail.\n */\nexport function stageQuestions(config: ManagedFormConfig): StageQuestion[] {\n const input = (config.fields || []).filter(\n (f) => !NON_QUESTION_TYPES.includes(f.field_type),\n )\n if (!config.is_multi_step || !config.steps?.length) {\n return input.map((field) => ({ field }))\n }\n const ordered = [...config.steps].sort((a, b) => a.step_number - b.step_number)\n const out: StageQuestion[] = []\n const claimed = new Set<string>()\n for (const step of ordered) {\n for (const field of input) {\n if (field.step_id === step.id) {\n out.push({ field, step })\n claimed.add(field.id)\n }\n }\n }\n for (const field of input) {\n if (!claimed.has(field.id)) out.push({ field })\n }\n return out\n}\n\nconst WIDTH_FRACTION: Record<string, number> = {\n full: 1,\n half: 1 / 2,\n third: 1 / 3,\n quarter: 1 / 4,\n}\n\n/**\n * Group questions into beats using the classic grid's own row math:\n * consecutive sub-full-width fields fill a row (2 halves, 3 thirds...) and\n * that row is one beat; a full-width field closes any open row and stands\n * alone; a chapter change always starts a fresh beat.\n */\nexport function stageViews(config: ManagedFormConfig): StageView[] {\n const questions = stageQuestions(config)\n const views: StageView[] = []\n let open: StageView | null = null\n let openWidth = 0\n\n const close = () => {\n if (open) views.push(open)\n open = null\n openWidth = 0\n }\n\n for (const q of questions) {\n const fraction = WIDTH_FRACTION[q.field.width] ?? 1\n const chapterChanged = open && open.step?.id !== q.step?.id\n if (fraction >= 1 || chapterChanged) close()\n if (!open) {\n open = { fields: [q.field], step: q.step }\n openWidth = fraction\n if (fraction >= 1) close()\n continue\n }\n if (openWidth + fraction > 1.0001) close()\n if (!open) {\n open = { fields: [q.field], step: q.step }\n openWidth = fraction\n continue\n }\n open.fields.push(q.field)\n openWidth += fraction\n }\n close()\n return views\n}\n\nexport function countStageViews(config: ManagedFormConfig): number {\n return stageViews(config).length\n}\n\nexport function countStageQuestions(config: ManagedFormConfig): number {\n return stageQuestions(config).length\n}\n\n/**\n * Honest, friendly time estimate: \"about 40 seconds\".\n * ~8s per question, rounded to something a human would actually say.\n */\nexport function stageEstimate(questionCount: number): string {\n const seconds = questionCount * 8\n if (seconds < 50) return `about ${Math.max(15, Math.ceil(seconds / 5) * 5)} seconds`\n if (seconds <= 90) return 'about a minute'\n return `about ${Math.round(seconds / 60)} minutes`\n}\n\n/** First name for the greeting — conservative: short, single token, else null. */\nexport function stageFirstName(value: unknown): string | null {\n if (typeof value !== 'string') return null\n const token = value.trim().split(/\\s+/)[0]\n if (!token || token.length > 24) return null\n return token\n}\n\nexport function isEmptyValue(value: unknown): boolean {\n if (value === undefined || value === null || value === '') return true\n if (Array.isArray(value)) return value.length === 0\n return false\n}\n\nexport function formatAnswer(value: unknown): string | null {\n if (isEmptyValue(value)) return null\n if (Array.isArray(value)) return value.map(String).join(', ')\n if (typeof value === 'boolean') return value ? 'Yes' : 'No'\n return String(value)\n}\n\n/** Single-select types where picking an answer advances after a lock-in beat. */\nexport const AUTO_ADVANCE_TYPES = ['radio', 'select', 'rating']\n"]}
1
+ {"version":3,"sources":["../src/forms/field-controls.ts","../src/forms/experience-plan.ts"],"names":[],"mappings":"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","file":"chunk-77HT6TYK.mjs","sourcesContent":["'use client'\n\n/**\n * The field controls that need React hooks, loaded only when a form actually\n * has a field that uses them.\n *\n * FormField deliberately does NOT import these. DatePicker carries 17 hooks\n * and FileField holds upload state; importing them there put both in\n * FormField's chunk, which the build stamps `'use client'` — so a Server\n * Component rendering a single text input shipped 38 KB of date picker to the\n * browser. Injecting them from the client side keeps FormField hook-free and\n * therefore server-renderable, which is the whole basis of StaticForm.\n *\n * Injection alone still put both controls in the forms entry's eager graph,\n * because a module-level constant referencing them is a static import: every\n * form paid for the date picker, and most forms have no date field. They are\n * now fetched on demand, per control, from the field list.\n *\n * The wait costs nothing visually. FormField already renders the native\n * control when a control is absent (static mode does exactly this), so a date\n * field paints as `<input type=\"date\">` and upgrades in place when the chunk\n * lands — the same enhancement path a no-JS visitor never leaves.\n *\n * Every client renderer of <FormField> (FormClient, FormSpotlight, FormStage)\n * calls this hook, so the experiences and the classic form always offer\n * identical controls.\n */\n\nimport { useEffect, useMemo, useRef, useState } from 'react'\nimport type { FormField as FormFieldType } from './types'\n\nexport interface FieldControls {\n Date?: React.ComponentType<any>\n File?: React.ComponentType<any>\n}\n\n/** Stable identity for the common case (no date, no file) — no render churn. */\nconst NO_CONTROLS: FieldControls = {}\n\nexport function useFieldControls(fields: FormFieldType[] | undefined): FieldControls {\n const needsDate = useMemo(\n () => (fields ?? []).some((f) => f.field_type === 'date' || f.field_type === 'datetime'),\n [fields],\n )\n const needsFile = useMemo(\n () => (fields ?? []).some((f) => f.field_type === 'file'),\n [fields],\n )\n\n const [controls, setControls] = useState<FieldControls>(NO_CONTROLS)\n // Guards re-import when a conditional field toggles visibility mid-fill.\n const requested = useRef({ date: false, file: false })\n\n useEffect(() => {\n let cancelled = false\n\n if (needsDate && !requested.current.date) {\n requested.current.date = true\n import('./DatePicker')\n .then((m) => {\n if (!cancelled) setControls((prev) => ({ ...prev, Date: m.DatePicker }))\n })\n .catch(() => {\n // Chunk never arrived — the native date input stays, which submits\n // the same value. A failed fetch must not cost the lead.\n requested.current.date = false\n })\n }\n\n if (needsFile && !requested.current.file) {\n requested.current.file = true\n import('./FileField')\n .then((m) => {\n if (!cancelled) setControls((prev) => ({ ...prev, File: m.FileField }))\n })\n .catch(() => {\n requested.current.file = false\n })\n }\n\n return () => {\n cancelled = true\n }\n }, [needsDate, needsFile])\n\n return controls\n}\n","/**\n * Shared planning helpers for the alternate form experiences (stage,\n * spotlight). Pure data — no React, no CSS — so FormClient can import the\n * counts it needs for tracking WITHOUT pulling an experience component (and\n * its stylesheet) into every site's forms bundle. The components themselves\n * are lazy-loaded; this module is the only part that ships eagerly.\n */\n\nimport type {\n FormField as FormFieldType,\n FormStep,\n ManagedFormConfig,\n} from './types'\n\n/** Display-only / non-question field types — never staged. */\nconst NON_QUESTION_TYPES = ['heading', 'section_header', 'paragraph', 'hidden']\n\nexport interface StageQuestion {\n field: FormFieldType\n /** The step (chapter) this question belongs to, when the form is multi-step. */\n step?: FormStep\n}\n\nexport interface StageView {\n fields: FormFieldType[]\n step?: FormStep\n}\n\n/**\n * Flatten a form into its ordered question list. Steps become chapters:\n * multi-step forms iterate steps in step_number order (fields are already\n * sorted by sort_order via normalizeFormConfig); stepless fields trail.\n */\nexport function stageQuestions(config: ManagedFormConfig): StageQuestion[] {\n const input = (config.fields || []).filter(\n (f) => !NON_QUESTION_TYPES.includes(f.field_type),\n )\n if (!config.is_multi_step || !config.steps?.length) {\n return input.map((field) => ({ field }))\n }\n const ordered = [...config.steps].sort((a, b) => a.step_number - b.step_number)\n const out: StageQuestion[] = []\n const claimed = new Set<string>()\n for (const step of ordered) {\n for (const field of input) {\n if (field.step_id === step.id) {\n out.push({ field, step })\n claimed.add(field.id)\n }\n }\n }\n for (const field of input) {\n if (!claimed.has(field.id)) out.push({ field })\n }\n return out\n}\n\nconst WIDTH_FRACTION: Record<string, number> = {\n full: 1,\n half: 1 / 2,\n third: 1 / 3,\n quarter: 1 / 4,\n}\n\n/**\n * Group questions into beats using the classic grid's own row math:\n * consecutive sub-full-width fields fill a row (2 halves, 3 thirds...) and\n * that row is one beat; a full-width field closes any open row and stands\n * alone; a chapter change always starts a fresh beat.\n */\nexport function stageViews(config: ManagedFormConfig): StageView[] {\n const questions = stageQuestions(config)\n const views: StageView[] = []\n let open: StageView | null = null\n let openWidth = 0\n\n const close = () => {\n if (open) views.push(open)\n open = null\n openWidth = 0\n }\n\n for (const q of questions) {\n const fraction = WIDTH_FRACTION[q.field.width] ?? 1\n const chapterChanged = open && open.step?.id !== q.step?.id\n if (fraction >= 1 || chapterChanged) close()\n if (!open) {\n open = { fields: [q.field], step: q.step }\n openWidth = fraction\n if (fraction >= 1) close()\n continue\n }\n if (openWidth + fraction > 1.0001) close()\n if (!open) {\n open = { fields: [q.field], step: q.step }\n openWidth = fraction\n continue\n }\n open.fields.push(q.field)\n openWidth += fraction\n }\n close()\n return views\n}\n\nexport function countStageViews(config: ManagedFormConfig): number {\n return stageViews(config).length\n}\n\nexport function countStageQuestions(config: ManagedFormConfig): number {\n return stageQuestions(config).length\n}\n\n/**\n * Honest, friendly time estimate: \"about 40 seconds\".\n * ~8s per question, rounded to something a human would actually say.\n */\nexport function stageEstimate(questionCount: number): string {\n const seconds = questionCount * 8\n if (seconds < 50) return `about ${Math.max(15, Math.ceil(seconds / 5) * 5)} seconds`\n if (seconds <= 90) return 'about a minute'\n return `about ${Math.round(seconds / 60)} minutes`\n}\n\n/** First name for the greeting — conservative: short, single token, else null. */\nexport function stageFirstName(value: unknown): string | null {\n if (typeof value !== 'string') return null\n const token = value.trim().split(/\\s+/)[0]\n if (!token || token.length > 24) return null\n return token\n}\n\nexport function isEmptyValue(value: unknown): boolean {\n if (value === undefined || value === null || value === '') return true\n if (Array.isArray(value)) return value.length === 0\n return false\n}\n\nexport function formatAnswer(value: unknown): string | null {\n if (isEmptyValue(value)) return null\n if (Array.isArray(value)) return value.map(String).join(', ')\n if (typeof value === 'boolean') return value ? 'Yes' : 'No'\n return String(value)\n}\n\n/** Single-select types where picking an answer advances after a lock-in beat. */\nexport const AUTO_ADVANCE_TYPES = ['radio', 'select', 'rating']\n"]}
@@ -1,6 +1,6 @@
1
1
  'use client';
2
- import { useForm } from './chunk-BUDV7QHH.mjs';
3
- import { sonorFetch } from './chunk-ADOGOLYO.mjs';
2
+ import { useForm } from './chunk-DBJRJ2Q2.mjs';
3
+ import { sonorFetch } from './chunk-4HL6CAZ7.mjs';
4
4
  import { useState, useRef, useEffect, useCallback } from 'react';
5
5
  import ReactMarkdown from 'react-markdown';
6
6
  import { jsxs, jsx, Fragment } from 'react/jsx-runtime';
@@ -1605,5 +1605,5 @@ function ChatWidget({ projectId: propProjectId, config, apiUrl: propApiUrl, sign
1605
1605
  }
1606
1606
 
1607
1607
  export { ChatWidget };
1608
- //# sourceMappingURL=chunk-2XHEUWHV.mjs.map
1609
- //# sourceMappingURL=chunk-2XHEUWHV.mjs.map
1608
+ //# sourceMappingURL=chunk-7UPPYERC.mjs.map
1609
+ //# sourceMappingURL=chunk-7UPPYERC.mjs.map