@sonordev/site-kit 5.7.0 → 5.8.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (604) hide show
  1. package/README.md +3 -3
  2. package/agent-manifest.json +14 -2
  3. package/dist/AnalyticsProvider-OCXRNIVE.js +33 -0
  4. package/dist/{AnalyticsProvider-GJFG7YXA.js.map → AnalyticsProvider-OCXRNIVE.js.map} +1 -1
  5. package/dist/AnalyticsProvider-ZAUONQCX.mjs +12 -0
  6. package/dist/{AnalyticsProvider-EWF7JN2X.mjs.map → AnalyticsProvider-ZAUONQCX.mjs.map} +1 -1
  7. package/dist/{BlogViewTracker-2D3IJPJK.js → BlogViewTracker-HK5C7PU6.js} +14 -11
  8. package/dist/BlogViewTracker-HK5C7PU6.js.map +1 -0
  9. package/dist/{BlogViewTracker-CKYG6MYU.mjs → BlogViewTracker-KXRZHN3U.mjs} +13 -10
  10. package/dist/BlogViewTracker-KXRZHN3U.mjs.map +1 -0
  11. package/dist/ChatWidget-3OW5LY37.js +24 -0
  12. package/dist/{ChatWidget-AWP6GBVW.js.map → ChatWidget-3OW5LY37.js.map} +1 -1
  13. package/dist/ChatWidget-54GVS27I.mjs +15 -0
  14. package/dist/{ChatWidget-Z5QXDZP3.mjs.map → ChatWidget-54GVS27I.mjs.map} +1 -1
  15. package/dist/EngageWidget-7EUP76WE.mjs +12 -0
  16. package/dist/{EngageWidget-BKEY5TPO.mjs.map → EngageWidget-7EUP76WE.mjs.map} +1 -1
  17. package/dist/EngageWidget-DDP5UFA4.js +21 -0
  18. package/dist/{EngageWidget-VT4DYXVO.js.map → EngageWidget-DDP5UFA4.js.map} +1 -1
  19. package/dist/{FileField-JJN5QKDL.mjs → FileField-IQLN6E3C.mjs} +5 -5
  20. package/dist/{FileField-JJN5QKDL.mjs.map → FileField-IQLN6E3C.mjs.map} +1 -1
  21. package/dist/{FileField-62ZWZMQK.js → FileField-SBPL4JHP.js} +6 -6
  22. package/dist/{FileField-62ZWZMQK.js.map → FileField-SBPL4JHP.js.map} +1 -1
  23. package/dist/{FormSpotlight-OTFB6QM5.mjs → FormSpotlight-E2LKKHGV.mjs} +11 -7
  24. package/dist/FormSpotlight-E2LKKHGV.mjs.map +1 -0
  25. package/dist/{FormSpotlight-URS4XRS7.js → FormSpotlight-YTACNE57.js} +25 -21
  26. package/dist/FormSpotlight-YTACNE57.js.map +1 -0
  27. package/dist/{FormStage-FVKMIV73.js → FormStage-S277U2CP.js} +20 -15
  28. package/dist/FormStage-S277U2CP.js.map +1 -0
  29. package/dist/{FormStage-VPGOCMAV.mjs → FormStage-YSBN5XKL.mjs} +9 -4
  30. package/dist/FormStage-YSBN5XKL.mjs.map +1 -0
  31. package/dist/ManagedForm-I3QVRQ53.mjs +16 -0
  32. package/dist/{ManagedForm-CXVDJMHN.mjs.map → ManagedForm-I3QVRQ53.mjs.map} +1 -1
  33. package/dist/ManagedForm-TSYKQFLJ.js +25 -0
  34. package/dist/{ManagedForm-FGNTDGED.js.map → ManagedForm-TSYKQFLJ.js.map} +1 -1
  35. package/dist/{ManagedNewsletterForm-SQYB4BZU.mjs → ManagedNewsletterForm-T3YRAWKZ.mjs} +9 -7
  36. package/dist/ManagedNewsletterForm-T3YRAWKZ.mjs.map +1 -0
  37. package/dist/{ManagedNewsletterForm-3O5L44AZ.js → ManagedNewsletterForm-YSOPPKS6.js} +10 -8
  38. package/dist/ManagedNewsletterForm-YSOPPKS6.js.map +1 -0
  39. package/dist/{SignalCore-M2PKKIGH.mjs → SignalCore-PPSIQ4BW.mjs} +8 -14
  40. package/dist/SignalCore-PPSIQ4BW.mjs.map +1 -0
  41. package/dist/{SignalCore-RFBOBNLQ.js → SignalCore-SUZH3XWZ.js} +14 -20
  42. package/dist/SignalCore-SUZH3XWZ.js.map +1 -0
  43. package/dist/SitemapSync-HSHCOKCL.mjs +9 -0
  44. package/dist/{SitemapSync-4OVMIIGC.mjs.map → SitemapSync-HSHCOKCL.mjs.map} +1 -1
  45. package/dist/SitemapSync-LH6UVP4P.js +18 -0
  46. package/dist/{SitemapSync-RK3SQ4M2.js.map → SitemapSync-LH6UVP4P.js.map} +1 -1
  47. package/dist/analytics/AnalyticsProvider.d.ts.map +1 -1
  48. package/dist/analytics/index.js +10 -9
  49. package/dist/analytics/index.mjs +5 -4
  50. package/dist/blog/BlogLayout.d.ts +3 -1
  51. package/dist/blog/BlogLayout.d.ts.map +1 -1
  52. package/dist/blog/BlogList.d.ts +7 -1
  53. package/dist/blog/BlogList.d.ts.map +1 -1
  54. package/dist/blog/BlogPost.d.ts +20 -1
  55. package/dist/blog/BlogPost.d.ts.map +1 -1
  56. package/dist/blog/BlogSidebar.d.ts +3 -1
  57. package/dist/blog/BlogSidebar.d.ts.map +1 -1
  58. package/dist/blog/BlogViewTracker.d.ts +8 -2
  59. package/dist/blog/BlogViewTracker.d.ts.map +1 -1
  60. package/dist/blog/ClusterLandingPage.d.ts +3 -1
  61. package/dist/blog/ClusterLandingPage.d.ts.map +1 -1
  62. package/dist/blog/ClusterNavigation.d.ts +5 -2
  63. package/dist/blog/ClusterNavigation.d.ts.map +1 -1
  64. package/dist/blog/RelatedPosts.d.ts +3 -1
  65. package/dist/blog/RelatedPosts.d.ts.map +1 -1
  66. package/dist/blog/index.d.ts +1 -1
  67. package/dist/blog/index.d.ts.map +1 -1
  68. package/dist/blog/index.js +40 -31
  69. package/dist/blog/index.js.map +1 -1
  70. package/dist/blog/index.mjs +11 -6
  71. package/dist/blog/index.mjs.map +1 -1
  72. package/dist/blog/not-found.test.d.ts +2 -0
  73. package/dist/blog/not-found.test.d.ts.map +1 -0
  74. package/dist/blog/processBlogHtml.d.ts +19 -2
  75. package/dist/blog/processBlogHtml.d.ts.map +1 -1
  76. package/dist/blog/public-reads.d.ts +27 -0
  77. package/dist/blog/public-reads.d.ts.map +1 -0
  78. package/dist/blog/server-core.d.ts +76 -10
  79. package/dist/blog/server-core.d.ts.map +1 -1
  80. package/dist/blog/server-ui.js +29 -23
  81. package/dist/blog/server-ui.js.map +1 -1
  82. package/dist/blog/server-ui.mjs +12 -6
  83. package/dist/blog/server-ui.mjs.map +1 -1
  84. package/dist/blog/server.d.ts +76 -10
  85. package/dist/blog/server.d.ts.map +1 -1
  86. package/dist/blog/server.js +54 -47
  87. package/dist/blog/server.mjs +5 -2
  88. package/dist/blog/site-scope.test.d.ts +2 -0
  89. package/dist/blog/site-scope.test.d.ts.map +1 -0
  90. package/dist/brand/extract-brand-profile.d.ts +36 -2
  91. package/dist/brand/extract-brand-profile.d.ts.map +1 -1
  92. package/dist/brand/extract-brand-profile.test.d.ts +2 -0
  93. package/dist/brand/extract-brand-profile.test.d.ts.map +1 -0
  94. package/dist/{chunk-3YQILJKJ.js → chunk-2FQG2AHJ.js} +60 -35
  95. package/dist/chunk-2FQG2AHJ.js.map +1 -0
  96. package/dist/{chunk-D553G64G.js → chunk-2OQWLXDO.js} +13 -13
  97. package/dist/{chunk-D553G64G.js.map → chunk-2OQWLXDO.js.map} +1 -1
  98. package/dist/{chunk-OYOO2OO5.js → chunk-2SCDUVFJ.js} +10 -10
  99. package/dist/{chunk-OYOO2OO5.js.map → chunk-2SCDUVFJ.js.map} +1 -1
  100. package/dist/{chunk-3S5JN6KL.js → chunk-35ERUUH3.js} +6 -6
  101. package/dist/{chunk-3S5JN6KL.js.map → chunk-35ERUUH3.js.map} +1 -1
  102. package/dist/{chunk-57AFHENV.mjs → chunk-3AUFD7KR.mjs} +3 -3
  103. package/dist/{chunk-57AFHENV.mjs.map → chunk-3AUFD7KR.mjs.map} +1 -1
  104. package/dist/{chunk-L7ACQ6PC.js → chunk-3BVCF4ZF.js} +4 -4
  105. package/dist/{chunk-L7ACQ6PC.js.map → chunk-3BVCF4ZF.js.map} +1 -1
  106. package/dist/{chunk-BFJOZ3MU.mjs → chunk-3EY5E35M.mjs} +36 -71
  107. package/dist/chunk-3EY5E35M.mjs.map +1 -0
  108. package/dist/{chunk-BQGEVMIR.mjs → chunk-3SLFT453.mjs} +5 -5
  109. package/dist/{chunk-BQGEVMIR.mjs.map → chunk-3SLFT453.mjs.map} +1 -1
  110. package/dist/{chunk-ILNCUSXW.mjs → chunk-4L7OHRWB.mjs} +12 -9
  111. package/dist/chunk-4L7OHRWB.mjs.map +1 -0
  112. package/dist/chunk-4LYW6PMU.mjs +72 -0
  113. package/dist/chunk-4LYW6PMU.mjs.map +1 -0
  114. package/dist/{chunk-TSZIACRC.js → chunk-4OS6M3V4.js} +6 -12
  115. package/dist/chunk-4OS6M3V4.js.map +1 -0
  116. package/dist/{chunk-YKUEFRZI.js → chunk-4RY7JETY.js} +14 -14
  117. package/dist/{chunk-YKUEFRZI.js.map → chunk-4RY7JETY.js.map} +1 -1
  118. package/dist/chunk-4TLFZ6NR.mjs +16 -0
  119. package/dist/chunk-4TLFZ6NR.mjs.map +1 -0
  120. package/dist/{chunk-4B4S56WJ.mjs → chunk-5B4J3IBX.mjs} +75 -21
  121. package/dist/chunk-5B4J3IBX.mjs.map +1 -0
  122. package/dist/chunk-5O7JSWT6.js +8 -0
  123. package/dist/{chunk-5TXXTYXL.js.map → chunk-5O7JSWT6.js.map} +1 -1
  124. package/dist/chunk-5SANRSX3.mjs +17 -0
  125. package/dist/chunk-5SANRSX3.mjs.map +1 -0
  126. package/dist/{chunk-FBDHKYNF.mjs → chunk-5WGMXSCB.mjs} +3 -3
  127. package/dist/{chunk-FBDHKYNF.mjs.map → chunk-5WGMXSCB.mjs.map} +1 -1
  128. package/dist/chunk-5XFFUP6D.js +100 -0
  129. package/dist/chunk-5XFFUP6D.js.map +1 -0
  130. package/dist/{chunk-7ZX6TO6C.mjs → chunk-6HFFTGFP.mjs} +50 -26
  131. package/dist/chunk-6HFFTGFP.mjs.map +1 -0
  132. package/dist/{chunk-R2SXXFXZ.mjs → chunk-6SBTHS6C.mjs} +3 -3
  133. package/dist/{chunk-R2SXXFXZ.mjs.map → chunk-6SBTHS6C.mjs.map} +1 -1
  134. package/dist/{chunk-FO4KGPGF.js → chunk-7TC3GRXQ.js} +73 -38
  135. package/dist/chunk-7TC3GRXQ.js.map +1 -0
  136. package/dist/{chunk-XLPU3TEE.mjs → chunk-7THZOAUR.mjs} +4 -4
  137. package/dist/{chunk-XLPU3TEE.mjs.map → chunk-7THZOAUR.mjs.map} +1 -1
  138. package/dist/{chunk-MW2M6O7A.mjs → chunk-AOWJP25J.mjs} +4 -4
  139. package/dist/{chunk-MW2M6O7A.mjs.map → chunk-AOWJP25J.mjs.map} +1 -1
  140. package/dist/{chunk-UQ5YULFU.mjs → chunk-B2VFMPVJ.mjs} +4 -4
  141. package/dist/{chunk-UQ5YULFU.mjs.map → chunk-B2VFMPVJ.mjs.map} +1 -1
  142. package/dist/{chunk-JTF4DFUF.mjs → chunk-B35OJ7FR.mjs} +4 -4
  143. package/dist/{chunk-JTF4DFUF.mjs.map → chunk-B35OJ7FR.mjs.map} +1 -1
  144. package/dist/{chunk-2N27LCZH.js → chunk-BER36QXU.js} +9 -9
  145. package/dist/{chunk-2N27LCZH.js.map → chunk-BER36QXU.js.map} +1 -1
  146. package/dist/{chunk-47XQWV4S.mjs → chunk-BFZNLTWK.mjs} +3 -3
  147. package/dist/{chunk-47XQWV4S.mjs.map → chunk-BFZNLTWK.mjs.map} +1 -1
  148. package/dist/chunk-BQP6JIE2.mjs +28 -0
  149. package/dist/chunk-BQP6JIE2.mjs.map +1 -0
  150. package/dist/{chunk-KXGD4E7G.js → chunk-C3WU45JT.js} +7 -7
  151. package/dist/{chunk-KXGD4E7G.js.map → chunk-C3WU45JT.js.map} +1 -1
  152. package/dist/chunk-CUNZAD46.js +53 -0
  153. package/dist/chunk-CUNZAD46.js.map +1 -0
  154. package/dist/chunk-CXAXZFFW.js +157 -0
  155. package/dist/chunk-CXAXZFFW.js.map +1 -0
  156. package/dist/{chunk-H4OBGC43.mjs → chunk-DA7IANFG.mjs} +14 -3
  157. package/dist/chunk-DA7IANFG.mjs.map +1 -0
  158. package/dist/{chunk-NOU3JQJK.js → chunk-EIW6YEPY.js} +8 -8
  159. package/dist/{chunk-NOU3JQJK.js.map → chunk-EIW6YEPY.js.map} +1 -1
  160. package/dist/{chunk-RCSTDJUH.js → chunk-F6SKG34N.js} +8 -13
  161. package/dist/chunk-F6SKG34N.js.map +1 -0
  162. package/dist/{chunk-LC7AM4J5.js → chunk-FHPW7XVH.js} +77 -20
  163. package/dist/chunk-FHPW7XVH.js.map +1 -0
  164. package/dist/{chunk-JNRHTZL4.js → chunk-FVW6FT6L.js} +73 -29
  165. package/dist/chunk-FVW6FT6L.js.map +1 -0
  166. package/dist/{chunk-BFM5PEFV.js → chunk-GNDWTXLU.js} +56 -177
  167. package/dist/chunk-GNDWTXLU.js.map +1 -0
  168. package/dist/{chunk-OZ3FU4BT.js → chunk-H5NBFNND.js} +2 -2
  169. package/dist/chunk-H5NBFNND.js.map +1 -0
  170. package/dist/{chunk-RNAGCAIB.js → chunk-HAKD27AZ.js} +7 -7
  171. package/dist/{chunk-RNAGCAIB.js.map → chunk-HAKD27AZ.js.map} +1 -1
  172. package/dist/chunk-HCN3IKMW.mjs +106 -0
  173. package/dist/chunk-HCN3IKMW.mjs.map +1 -0
  174. package/dist/{chunk-V5THCFPG.mjs → chunk-HCX343AS.mjs} +4 -4
  175. package/dist/{chunk-V5THCFPG.mjs.map → chunk-HCX343AS.mjs.map} +1 -1
  176. package/dist/{chunk-TDJKGN5Q.mjs → chunk-HEOQT5SM.mjs} +216 -103
  177. package/dist/chunk-HEOQT5SM.mjs.map +1 -0
  178. package/dist/{chunk-6FC5Q4KU.mjs → chunk-HOJ4J4X2.mjs} +30 -12
  179. package/dist/chunk-HOJ4J4X2.mjs.map +1 -0
  180. package/dist/{chunk-ELQ4SRRR.js → chunk-HQOHB6QF.js} +15 -15
  181. package/dist/{chunk-ELQ4SRRR.js.map → chunk-HQOHB6QF.js.map} +1 -1
  182. package/dist/chunk-HRMGITUZ.mjs +6 -0
  183. package/dist/{chunk-QRBPT6Z6.mjs.map → chunk-HRMGITUZ.mjs.map} +1 -1
  184. package/dist/{chunk-JQ7M6CVL.mjs → chunk-HYVEIP2N.mjs} +3 -3
  185. package/dist/{chunk-JQ7M6CVL.mjs.map → chunk-HYVEIP2N.mjs.map} +1 -1
  186. package/dist/{chunk-H6YVT3BL.js → chunk-I3ND4XYW.js} +12 -9
  187. package/dist/chunk-I3ND4XYW.js.map +1 -0
  188. package/dist/{chunk-4UVM7E2W.js → chunk-JDTU2RWC.js} +3 -3
  189. package/dist/{chunk-4UVM7E2W.js.map → chunk-JDTU2RWC.js.map} +1 -1
  190. package/dist/{chunk-GZJE23Y5.mjs → chunk-JLVCWC6A.mjs} +2 -2
  191. package/dist/chunk-JLVCWC6A.mjs.map +1 -0
  192. package/dist/chunk-K4TCEAUX.js +52 -0
  193. package/dist/chunk-K4TCEAUX.js.map +1 -0
  194. package/dist/chunk-KV7XXLJV.mjs +30 -0
  195. package/dist/chunk-KV7XXLJV.mjs.map +1 -0
  196. package/dist/{chunk-C563AHZZ.mjs → chunk-L24RDT6Q.mjs} +3 -3
  197. package/dist/{chunk-C563AHZZ.mjs.map → chunk-L24RDT6Q.mjs.map} +1 -1
  198. package/dist/{chunk-FEWWGEQF.js → chunk-LBZGYF3B.js} +4 -4
  199. package/dist/{chunk-FEWWGEQF.js.map → chunk-LBZGYF3B.js.map} +1 -1
  200. package/dist/{chunk-CPY74A4F.js → chunk-LMEUYRRR.js} +72 -106
  201. package/dist/chunk-LMEUYRRR.js.map +1 -0
  202. package/dist/chunk-LVGSOW2F.js +32 -0
  203. package/dist/chunk-LVGSOW2F.js.map +1 -0
  204. package/dist/{chunk-DOB37PV4.js → chunk-M45AL7EA.js} +37 -19
  205. package/dist/chunk-M45AL7EA.js.map +1 -0
  206. package/dist/{chunk-YYDZ2TYR.js → chunk-MHX6TOAS.js} +3 -3
  207. package/dist/{chunk-YYDZ2TYR.js.map → chunk-MHX6TOAS.js.map} +1 -1
  208. package/dist/chunk-MLVHVKFT.mjs +148 -0
  209. package/dist/chunk-MLVHVKFT.mjs.map +1 -0
  210. package/dist/{chunk-M5GY2AI3.mjs → chunk-N2NZBPQ5.mjs} +4 -10
  211. package/dist/chunk-N2NZBPQ5.mjs.map +1 -0
  212. package/dist/chunk-NRBITVDK.js +114 -0
  213. package/dist/chunk-NRBITVDK.js.map +1 -0
  214. package/dist/{chunk-O2VJZOR2.mjs → chunk-O4YBWJHP.mjs} +6 -11
  215. package/dist/chunk-O4YBWJHP.mjs.map +1 -0
  216. package/dist/{chunk-BUJWXSYZ.mjs → chunk-O5ZSGBQD.mjs} +4 -4
  217. package/dist/{chunk-BUJWXSYZ.mjs.map → chunk-O5ZSGBQD.mjs.map} +1 -1
  218. package/dist/{chunk-TP7H6BSK.mjs → chunk-OE7CTIOU.mjs} +73 -30
  219. package/dist/chunk-OE7CTIOU.mjs.map +1 -0
  220. package/dist/{chunk-UJ6CHZAI.mjs → chunk-OEW2LFOV.js} +169 -25
  221. package/dist/chunk-OEW2LFOV.js.map +1 -0
  222. package/dist/chunk-P4Y75QSU.js +19 -0
  223. package/dist/chunk-P4Y75QSU.js.map +1 -0
  224. package/dist/{chunk-Q7347KP6.mjs → chunk-PK2OTGW5.mjs} +6 -12
  225. package/dist/chunk-PK2OTGW5.mjs.map +1 -0
  226. package/dist/{chunk-H65OX263.js → chunk-PRTXAIIC.js} +15 -15
  227. package/dist/{chunk-H65OX263.js.map → chunk-PRTXAIIC.js.map} +1 -1
  228. package/dist/{chunk-ABZGEHTC.mjs → chunk-PUAXHYBL.mjs} +3 -3
  229. package/dist/{chunk-ABZGEHTC.mjs.map → chunk-PUAXHYBL.mjs.map} +1 -1
  230. package/dist/chunk-QRHVMTHF.mjs +94 -0
  231. package/dist/chunk-QRHVMTHF.mjs.map +1 -0
  232. package/dist/{chunk-JTCQJKJE.js → chunk-QTJTDQYR.js} +76 -111
  233. package/dist/chunk-QTJTDQYR.js.map +1 -0
  234. package/dist/{chunk-HBN4A2N4.mjs → chunk-QVHVL7EX.mjs} +3 -3
  235. package/dist/{chunk-HBN4A2N4.mjs.map → chunk-QVHVL7EX.mjs.map} +1 -1
  236. package/dist/chunk-R7GHP3FY.js +81 -0
  237. package/dist/chunk-R7GHP3FY.js.map +1 -0
  238. package/dist/{chunk-P4TB4ROG.js → chunk-SEP5D4MI.js} +8 -2
  239. package/dist/chunk-SEP5D4MI.js.map +1 -0
  240. package/dist/{chunk-3CLP35TT.mjs → chunk-TXMVU4EY.mjs} +62 -97
  241. package/dist/chunk-TXMVU4EY.mjs.map +1 -0
  242. package/dist/{chunk-L4V6TKMJ.mjs → chunk-U2V542EO.mjs} +7 -3
  243. package/dist/chunk-U2V542EO.mjs.map +1 -0
  244. package/dist/{chunk-4WBTM6YE.js → chunk-UWHCHYCX.js} +4 -4
  245. package/dist/{chunk-4WBTM6YE.js.map → chunk-UWHCHYCX.js.map} +1 -1
  246. package/dist/{chunk-JNAXDFC4.mjs → chunk-VJ74275U.mjs} +38 -156
  247. package/dist/chunk-VJ74275U.mjs.map +1 -0
  248. package/dist/{chunk-H7274TKR.mjs → chunk-VJV7WUR2.mjs} +12 -4
  249. package/dist/chunk-VJV7WUR2.mjs.map +1 -0
  250. package/dist/{chunk-4A5V73SR.mjs → chunk-VYL6IHJA.mjs} +9 -9
  251. package/dist/{chunk-4A5V73SR.mjs.map → chunk-VYL6IHJA.mjs.map} +1 -1
  252. package/dist/{chunk-5B4FABFK.js → chunk-WS7MH3GD.js} +14 -2
  253. package/dist/chunk-WS7MH3GD.js.map +1 -0
  254. package/dist/{chunk-IPV2TUAT.js → chunk-XA2GJFVM.js} +12 -4
  255. package/dist/chunk-XA2GJFVM.js.map +1 -0
  256. package/dist/chunk-XBX2K3GA.js +33 -0
  257. package/dist/chunk-XBX2K3GA.js.map +1 -0
  258. package/dist/{chunk-F3AKYZOH.js → chunk-XCYKM2SA.js} +6 -13
  259. package/dist/chunk-XCYKM2SA.js.map +1 -0
  260. package/dist/{chunk-6CJP7BFM.js → chunk-XZO5I4RS.mjs} +147 -20
  261. package/dist/chunk-XZO5I4RS.mjs.map +1 -0
  262. package/dist/chunk-Y5QZPUL3.mjs +47 -0
  263. package/dist/chunk-Y5QZPUL3.mjs.map +1 -0
  264. package/dist/{chunk-C4PZ2R3B.js → chunk-YECDJDDD.js} +10 -10
  265. package/dist/{chunk-C4PZ2R3B.js.map → chunk-YECDJDDD.js.map} +1 -1
  266. package/dist/chunk-YN7QHLWF.js +19 -0
  267. package/dist/chunk-YN7QHLWF.js.map +1 -0
  268. package/dist/chunk-YU7QZ3PP.mjs +45 -0
  269. package/dist/chunk-YU7QZ3PP.mjs.map +1 -0
  270. package/dist/{chunk-VFGEY6FJ.js → chunk-ZEOC26LZ.js} +223 -110
  271. package/dist/chunk-ZEOC26LZ.js.map +1 -0
  272. package/dist/{chunk-RVRN5U7W.mjs → chunk-ZVI7MBVF.mjs} +73 -38
  273. package/dist/chunk-ZVI7MBVF.mjs.map +1 -0
  274. package/dist/cli/agent/checks.d.ts +15 -1
  275. package/dist/cli/agent/checks.d.ts.map +1 -1
  276. package/dist/cli/agent/sitemap-trailing-slash.test.d.ts +2 -0
  277. package/dist/cli/agent/sitemap-trailing-slash.test.d.ts.map +1 -0
  278. package/dist/cli/commands/doctor.d.ts.map +1 -1
  279. package/dist/cli/commands/og.d.ts +26 -8
  280. package/dist/cli/commands/og.d.ts.map +1 -1
  281. package/dist/cli/index.js +683 -322
  282. package/dist/cli/index.js.map +1 -1
  283. package/dist/cli/index.mjs +604 -243
  284. package/dist/cli/index.mjs.map +1 -1
  285. package/dist/client/index.js +6 -6
  286. package/dist/client/index.mjs +5 -5
  287. package/dist/commerce/CheckoutForm.d.ts.map +1 -1
  288. package/dist/commerce/ProductDetail.d.ts.map +1 -1
  289. package/dist/commerce/api.d.ts +14 -0
  290. package/dist/commerce/api.d.ts.map +1 -1
  291. package/dist/commerce/discount-checkout.test.d.ts +2 -0
  292. package/dist/commerce/discount-checkout.test.d.ts.map +1 -0
  293. package/dist/commerce/index.d.ts +1 -1
  294. package/dist/commerce/index.d.ts.map +1 -1
  295. package/dist/commerce/index.js +61 -56
  296. package/dist/commerce/index.mjs +6 -5
  297. package/dist/config/index.js +3 -3
  298. package/dist/config/index.mjs +1 -1
  299. package/dist/discover-CYXYKHZ2.mjs +4 -0
  300. package/dist/{discover-FGTKWOL3.mjs.map → discover-CYXYKHZ2.mjs.map} +1 -1
  301. package/dist/discover-NGEPXZOD.js +21 -0
  302. package/dist/{discover-NJZPWTDL.js.map → discover-NGEPXZOD.js.map} +1 -1
  303. package/dist/engage/index.js +12 -10
  304. package/dist/engage/index.js.map +1 -1
  305. package/dist/engage/index.mjs +9 -7
  306. package/dist/engage/index.mjs.map +1 -1
  307. package/dist/fleet/index.js +8 -8
  308. package/dist/fleet/index.mjs +4 -4
  309. package/dist/forms/FormClient.d.ts.map +1 -1
  310. package/dist/forms/FormField.d.ts +7 -1
  311. package/dist/forms/FormField.d.ts.map +1 -1
  312. package/dist/forms/FormSpotlight.d.ts +1 -1
  313. package/dist/forms/FormSpotlight.d.ts.map +1 -1
  314. package/dist/forms/FormStage.d.ts +1 -1
  315. package/dist/forms/FormStage.d.ts.map +1 -1
  316. package/dist/forms/experience-plan.d.ts +0 -1
  317. package/dist/forms/experience-plan.d.ts.map +1 -1
  318. package/dist/forms/field-interactions.d.ts +63 -0
  319. package/dist/forms/field-interactions.d.ts.map +1 -0
  320. package/dist/forms/field-interactions.test.d.ts +8 -0
  321. package/dist/forms/field-interactions.test.d.ts.map +1 -0
  322. package/dist/forms/field-rules.d.ts +41 -0
  323. package/dist/forms/field-rules.d.ts.map +1 -0
  324. package/dist/forms/field-rules.test.d.ts +8 -0
  325. package/dist/forms/field-rules.test.d.ts.map +1 -0
  326. package/dist/forms/form-field-focus.test.d.ts +8 -0
  327. package/dist/forms/form-field-focus.test.d.ts.map +1 -0
  328. package/dist/forms/index.js +25 -23
  329. package/dist/forms/index.js.map +1 -1
  330. package/dist/forms/index.mjs +13 -11
  331. package/dist/forms/index.mjs.map +1 -1
  332. package/dist/forms/server.js +11 -11
  333. package/dist/forms/server.mjs +9 -9
  334. package/dist/forms/static.js +8 -8
  335. package/dist/forms/static.mjs +7 -7
  336. package/dist/forms/tracking-session.d.ts +48 -3
  337. package/dist/forms/tracking-session.d.ts.map +1 -1
  338. package/dist/forms/types.d.ts +11 -0
  339. package/dist/forms/types.d.ts.map +1 -1
  340. package/dist/forms/useForm.d.ts +8 -0
  341. package/dist/forms/useForm.d.ts.map +1 -1
  342. package/dist/forms/useFormTracking.d.ts +29 -4
  343. package/dist/forms/useFormTracking.d.ts.map +1 -1
  344. package/dist/images/index.js +11 -11
  345. package/dist/images/index.mjs +4 -4
  346. package/dist/index.js +72 -68
  347. package/dist/index.js.map +1 -1
  348. package/dist/index.mjs +14 -10
  349. package/dist/index.mjs.map +1 -1
  350. package/dist/layout/client.js +10 -10
  351. package/dist/layout/client.mjs +9 -9
  352. package/dist/layout/index.js +13 -12
  353. package/dist/layout/index.js.map +1 -1
  354. package/dist/layout/index.mjs +11 -10
  355. package/dist/layout/index.mjs.map +1 -1
  356. package/dist/llms/aiRobots.d.ts +20 -4
  357. package/dist/llms/aiRobots.d.ts.map +1 -1
  358. package/dist/llms/api.d.ts +8 -3
  359. package/dist/llms/api.d.ts.map +1 -1
  360. package/dist/llms/discovery-headers.d.ts +24 -0
  361. package/dist/llms/discovery-headers.d.ts.map +1 -1
  362. package/dist/llms/generateLLMsTxt.d.ts.map +1 -1
  363. package/dist/llms/index.d.ts +2 -2
  364. package/dist/llms/index.d.ts.map +1 -1
  365. package/dist/llms/index.js +45 -96
  366. package/dist/llms/index.js.map +1 -1
  367. package/dist/llms/index.mjs +11 -81
  368. package/dist/llms/index.mjs.map +1 -1
  369. package/dist/llms/links.d.ts +26 -0
  370. package/dist/llms/links.d.ts.map +1 -0
  371. package/dist/llms/links.test.d.ts +2 -0
  372. package/dist/llms/links.test.d.ts.map +1 -0
  373. package/dist/llms/types.d.ts +15 -0
  374. package/dist/llms/types.d.ts.map +1 -1
  375. package/dist/llms/wiring.d.ts +22 -0
  376. package/dist/llms/wiring.d.ts.map +1 -1
  377. package/dist/llms/writeLLMsTxt.d.ts +9 -0
  378. package/dist/llms/writeLLMsTxt.d.ts.map +1 -1
  379. package/dist/maps/index.js +5 -5
  380. package/dist/maps/index.mjs +3 -3
  381. package/dist/motion/gsap.d.ts +54 -0
  382. package/dist/motion/gsap.d.ts.map +1 -1
  383. package/dist/motion/gsap.js +34 -4
  384. package/dist/motion/gsap.js.map +1 -1
  385. package/dist/motion/gsap.mjs +33 -5
  386. package/dist/motion/gsap.mjs.map +1 -1
  387. package/dist/motion/gsap.test.d.ts +2 -0
  388. package/dist/motion/gsap.test.d.ts.map +1 -0
  389. package/dist/og/config.d.ts +6 -0
  390. package/dist/og/config.d.ts.map +1 -1
  391. package/dist/og/contrast.d.ts +33 -0
  392. package/dist/og/contrast.d.ts.map +1 -0
  393. package/dist/og/index.d.ts +2 -0
  394. package/dist/og/index.d.ts.map +1 -1
  395. package/dist/og/index.js +26 -8
  396. package/dist/og/index.mjs +3 -1
  397. package/dist/og/pages.d.ts +101 -0
  398. package/dist/og/pages.d.ts.map +1 -1
  399. package/dist/og/route-copy.d.ts +34 -0
  400. package/dist/og/route-copy.d.ts.map +1 -0
  401. package/dist/og/route-fit.d.ts +77 -0
  402. package/dist/og/route-fit.d.ts.map +1 -0
  403. package/dist/og/route.d.ts +80 -20
  404. package/dist/og/route.d.ts.map +1 -1
  405. package/dist/og/route.js +195 -25
  406. package/dist/og/route.js.map +1 -1
  407. package/dist/og/route.mjs +193 -26
  408. package/dist/og/route.mjs.map +1 -1
  409. package/dist/og/route.test.d.ts +2 -0
  410. package/dist/og/route.test.d.ts.map +1 -0
  411. package/dist/og/template.d.ts.map +1 -1
  412. package/dist/og/wiring.d.ts +43 -3
  413. package/dist/og/wiring.d.ts.map +1 -1
  414. package/dist/proxy/index.d.ts.map +1 -1
  415. package/dist/proxy/index.js +15 -10
  416. package/dist/proxy/index.js.map +1 -1
  417. package/dist/proxy/index.mjs +12 -7
  418. package/dist/proxy/index.mjs.map +1 -1
  419. package/dist/proxy/llms-discovery.test.d.ts +2 -0
  420. package/dist/proxy/llms-discovery.test.d.ts.map +1 -0
  421. package/dist/redirects/index.d.ts +24 -0
  422. package/dist/redirects/index.d.ts.map +1 -1
  423. package/dist/redirects/index.js +11 -8
  424. package/dist/redirects/index.mjs +4 -1
  425. package/dist/redirects/index.test.d.ts +2 -0
  426. package/dist/redirects/index.test.d.ts.map +1 -0
  427. package/dist/redirects/not-found.js +8 -5
  428. package/dist/redirects/not-found.js.map +1 -1
  429. package/dist/redirects/not-found.mjs +4 -1
  430. package/dist/redirects/not-found.mjs.map +1 -1
  431. package/dist/robots/index.d.ts +2 -0
  432. package/dist/robots/index.d.ts.map +1 -1
  433. package/dist/robots/index.js +23 -3
  434. package/dist/robots/index.js.map +1 -1
  435. package/dist/robots/index.mjs +2 -2
  436. package/dist/robots/index.mjs.map +1 -1
  437. package/dist/search/index.js +4 -4
  438. package/dist/search/index.mjs +3 -3
  439. package/dist/seo/ManagedContent.d.ts +4 -2
  440. package/dist/seo/ManagedContent.d.ts.map +1 -1
  441. package/dist/seo/ManagedFAQ.d.ts.map +1 -1
  442. package/dist/seo/ManagedInternalLinks.d.ts.map +1 -1
  443. package/dist/seo/ManagedSchema.d.ts.map +1 -1
  444. package/dist/seo/client.js +6 -6
  445. package/dist/seo/client.mjs +5 -5
  446. package/dist/seo/getManagedMetadata.d.ts.map +1 -1
  447. package/dist/seo/getManagedMetadata.test.d.ts +2 -0
  448. package/dist/seo/getManagedMetadata.test.d.ts.map +1 -0
  449. package/dist/seo/index.js +59 -49
  450. package/dist/seo/index.js.map +1 -1
  451. package/dist/seo/index.mjs +29 -19
  452. package/dist/seo/index.mjs.map +1 -1
  453. package/dist/seo/managed-schema-filter.test.d.ts +2 -0
  454. package/dist/seo/managed-schema-filter.test.d.ts.map +1 -0
  455. package/dist/seo/register-sitemap-cli-impl.d.ts +32 -0
  456. package/dist/seo/register-sitemap-cli-impl.d.ts.map +1 -1
  457. package/dist/seo/register-sitemap-cli.d.ts +7 -0
  458. package/dist/seo/register-sitemap-cli.d.ts.map +1 -1
  459. package/dist/seo/register-sitemap-cli.js +273 -56
  460. package/dist/seo/register-sitemap-cli.js.map +1 -1
  461. package/dist/seo/register-sitemap-cli.mjs +269 -52
  462. package/dist/seo/register-sitemap-cli.mjs.map +1 -1
  463. package/dist/seo/register-sitemap-request.d.ts +36 -0
  464. package/dist/seo/register-sitemap-request.d.ts.map +1 -0
  465. package/dist/seo/register-sitemap-request.test.d.ts +2 -0
  466. package/dist/seo/register-sitemap-request.test.d.ts.map +1 -0
  467. package/dist/seo/routing.d.ts +2 -0
  468. package/dist/seo/routing.d.ts.map +1 -1
  469. package/dist/seo/schema-filter.d.ts +43 -0
  470. package/dist/seo/schema-filter.d.ts.map +1 -0
  471. package/dist/seo/schema-filter.test.d.ts +2 -0
  472. package/dist/seo/schema-filter.test.d.ts.map +1 -0
  473. package/dist/seo/server-api.d.ts +15 -2
  474. package/dist/seo/server-api.d.ts.map +1 -1
  475. package/dist/seo/server.js +23 -18
  476. package/dist/seo/server.mjs +7 -2
  477. package/dist/seo/site-scope.test.d.ts +2 -0
  478. package/dist/seo/site-scope.test.d.ts.map +1 -0
  479. package/dist/seo/types.d.ts +30 -0
  480. package/dist/seo/types.d.ts.map +1 -1
  481. package/dist/seo-meta/contract.d.ts +60 -0
  482. package/dist/seo-meta/contract.d.ts.map +1 -0
  483. package/dist/seo-meta/contract.js +41 -0
  484. package/dist/seo-meta/contract.js.map +1 -0
  485. package/dist/seo-meta/contract.mjs +4 -0
  486. package/dist/seo-meta/contract.mjs.map +1 -0
  487. package/dist/seo-meta/contract.test.d.ts +2 -0
  488. package/dist/seo-meta/contract.test.d.ts.map +1 -0
  489. package/dist/server/index.js +4 -3
  490. package/dist/server/index.mjs +3 -2
  491. package/dist/server/mint-site-token.d.ts +2 -32
  492. package/dist/server/mint-site-token.d.ts.map +1 -1
  493. package/dist/{server-api-RG3ZL3DV.mjs → server-api-A2EFCTZX.mjs} +7 -3
  494. package/dist/{server-api-RG3ZL3DV.mjs.map → server-api-A2EFCTZX.mjs.map} +1 -1
  495. package/dist/{server-api-RYJQAUGO.js → server-api-IWTZ7C3O.js} +25 -21
  496. package/dist/{server-api-RYJQAUGO.js.map → server-api-IWTZ7C3O.js.map} +1 -1
  497. package/dist/shared/build-entries.d.ts +2 -0
  498. package/dist/shared/build-entries.d.ts.map +1 -1
  499. package/dist/shared/fresh-fetch.d.ts +64 -0
  500. package/dist/shared/fresh-fetch.d.ts.map +1 -0
  501. package/dist/shared/fresh-fetch.test.d.ts +2 -0
  502. package/dist/shared/fresh-fetch.test.d.ts.map +1 -0
  503. package/dist/shared/next-files.d.ts +7 -0
  504. package/dist/shared/next-files.d.ts.map +1 -1
  505. package/dist/shared/page-leave.d.ts +27 -0
  506. package/dist/shared/page-leave.d.ts.map +1 -0
  507. package/dist/shared/page-leave.test.d.ts +2 -0
  508. package/dist/shared/page-leave.test.d.ts.map +1 -0
  509. package/dist/shared/source-graph.d.ts +63 -0
  510. package/dist/shared/source-graph.d.ts.map +1 -0
  511. package/dist/shared/source-graph.test.d.ts +2 -0
  512. package/dist/shared/source-graph.test.d.ts.map +1 -0
  513. package/dist/shared/version.d.ts +1 -1
  514. package/dist/signal/SignalCore.d.ts.map +1 -1
  515. package/dist/signal/index.js +11 -11
  516. package/dist/signal/index.mjs +2 -2
  517. package/dist/sitemap/index.d.ts +19 -4
  518. package/dist/sitemap/index.d.ts.map +1 -1
  519. package/dist/sitemap/index.js +53 -43
  520. package/dist/sitemap/index.js.map +1 -1
  521. package/dist/sitemap/index.mjs +37 -27
  522. package/dist/sitemap/index.mjs.map +1 -1
  523. package/dist/sitemap/shared.d.ts +65 -0
  524. package/dist/sitemap/shared.d.ts.map +1 -1
  525. package/dist/sitemap/trailing-slash.test.d.ts +2 -0
  526. package/dist/sitemap/trailing-slash.test.d.ts.map +1 -0
  527. package/dist/sites/resolve.d.ts.map +1 -1
  528. package/dist/sites/site-param.d.ts +16 -0
  529. package/dist/sites/site-param.d.ts.map +1 -0
  530. package/dist/sync/index.js +17 -17
  531. package/dist/sync/index.mjs +4 -4
  532. package/dist/writeLLMsTxt-CQ7A4AAL.js +20 -0
  533. package/dist/writeLLMsTxt-CQ7A4AAL.js.map +1 -0
  534. package/dist/writeLLMsTxt-NX5MSPYX.mjs +11 -0
  535. package/dist/writeLLMsTxt-NX5MSPYX.mjs.map +1 -0
  536. package/package.json +8 -3
  537. package/dist/AnalyticsProvider-EWF7JN2X.mjs +0 -11
  538. package/dist/AnalyticsProvider-GJFG7YXA.js +0 -32
  539. package/dist/BlogViewTracker-2D3IJPJK.js.map +0 -1
  540. package/dist/BlogViewTracker-CKYG6MYU.mjs.map +0 -1
  541. package/dist/ChatWidget-AWP6GBVW.js +0 -22
  542. package/dist/ChatWidget-Z5QXDZP3.mjs +0 -13
  543. package/dist/EngageWidget-BKEY5TPO.mjs +0 -12
  544. package/dist/EngageWidget-VT4DYXVO.js +0 -21
  545. package/dist/FormSpotlight-OTFB6QM5.mjs.map +0 -1
  546. package/dist/FormSpotlight-URS4XRS7.js.map +0 -1
  547. package/dist/FormStage-FVKMIV73.js.map +0 -1
  548. package/dist/FormStage-VPGOCMAV.mjs.map +0 -1
  549. package/dist/ManagedForm-CXVDJMHN.mjs +0 -14
  550. package/dist/ManagedForm-FGNTDGED.js +0 -23
  551. package/dist/ManagedNewsletterForm-3O5L44AZ.js.map +0 -1
  552. package/dist/ManagedNewsletterForm-SQYB4BZU.mjs.map +0 -1
  553. package/dist/SignalCore-M2PKKIGH.mjs.map +0 -1
  554. package/dist/SignalCore-RFBOBNLQ.js.map +0 -1
  555. package/dist/SitemapSync-4OVMIIGC.mjs +0 -9
  556. package/dist/SitemapSync-RK3SQ4M2.js +0 -18
  557. package/dist/chunk-3CLP35TT.mjs.map +0 -1
  558. package/dist/chunk-3UC6JETG.js +0 -32
  559. package/dist/chunk-3UC6JETG.js.map +0 -1
  560. package/dist/chunk-3YQILJKJ.js.map +0 -1
  561. package/dist/chunk-4B4S56WJ.mjs.map +0 -1
  562. package/dist/chunk-5B4FABFK.js.map +0 -1
  563. package/dist/chunk-5TXXTYXL.js +0 -8
  564. package/dist/chunk-6CJP7BFM.js.map +0 -1
  565. package/dist/chunk-6FC5Q4KU.mjs.map +0 -1
  566. package/dist/chunk-7ZX6TO6C.mjs.map +0 -1
  567. package/dist/chunk-AWK57R5S.mjs +0 -29
  568. package/dist/chunk-AWK57R5S.mjs.map +0 -1
  569. package/dist/chunk-BFJOZ3MU.mjs.map +0 -1
  570. package/dist/chunk-BFM5PEFV.js.map +0 -1
  571. package/dist/chunk-CPY74A4F.js.map +0 -1
  572. package/dist/chunk-DOB37PV4.js.map +0 -1
  573. package/dist/chunk-F3AKYZOH.js.map +0 -1
  574. package/dist/chunk-FO4KGPGF.js.map +0 -1
  575. package/dist/chunk-GZJE23Y5.mjs.map +0 -1
  576. package/dist/chunk-H4OBGC43.mjs.map +0 -1
  577. package/dist/chunk-H6YVT3BL.js.map +0 -1
  578. package/dist/chunk-H7274TKR.mjs.map +0 -1
  579. package/dist/chunk-ILNCUSXW.mjs.map +0 -1
  580. package/dist/chunk-IPV2TUAT.js.map +0 -1
  581. package/dist/chunk-JEOKDUPQ.js +0 -45
  582. package/dist/chunk-JEOKDUPQ.js.map +0 -1
  583. package/dist/chunk-JNAXDFC4.mjs.map +0 -1
  584. package/dist/chunk-JNRHTZL4.js.map +0 -1
  585. package/dist/chunk-JTCQJKJE.js.map +0 -1
  586. package/dist/chunk-L4V6TKMJ.mjs.map +0 -1
  587. package/dist/chunk-LC7AM4J5.js.map +0 -1
  588. package/dist/chunk-M5GY2AI3.mjs.map +0 -1
  589. package/dist/chunk-O2VJZOR2.mjs.map +0 -1
  590. package/dist/chunk-OZ3FU4BT.js.map +0 -1
  591. package/dist/chunk-P4TB4ROG.js.map +0 -1
  592. package/dist/chunk-Q7347KP6.mjs.map +0 -1
  593. package/dist/chunk-QJU6HBSK.mjs +0 -39
  594. package/dist/chunk-QJU6HBSK.mjs.map +0 -1
  595. package/dist/chunk-QRBPT6Z6.mjs +0 -6
  596. package/dist/chunk-RCSTDJUH.js.map +0 -1
  597. package/dist/chunk-RVRN5U7W.mjs.map +0 -1
  598. package/dist/chunk-TDJKGN5Q.mjs.map +0 -1
  599. package/dist/chunk-TP7H6BSK.mjs.map +0 -1
  600. package/dist/chunk-TSZIACRC.js.map +0 -1
  601. package/dist/chunk-UJ6CHZAI.mjs.map +0 -1
  602. package/dist/chunk-VFGEY6FJ.js.map +0 -1
  603. package/dist/discover-FGTKWOL3.mjs +0 -4
  604. package/dist/discover-NJZPWTDL.js +0 -21
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/forms/FormSpotlight.tsx"],"names":[],"mappings":"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","file":"FormSpotlight-E2LKKHGV.mjs","sourcesContent":["'use client'\n\n/**\n * FormSpotlight — a professional form that CONVERSES back.\n *\n * At rest it is a normal form. The life:\n * - hovering a field expands it slightly; clicking keeps it expanded and a\n * GLOWING OUTLINE animates in around it\n * - the outline is ONE physical element: finishing a field and moving on,\n * the glow glides out of the old field and into the next (rect-tracked,\n * so it chases layout wherever the next field lives)\n * - a completed field earns its animated checkmark (the existing lock-in\n * tick + ring)\n * - when a whole row completes and you move on, the fields COLLAPSE INTO A\n * SENTENCE the form says back — \"Nice to meet you, Ramsey.\" /\n * \"We'll follow up at ramsey@… or 555‑0100.\" — with a drawn check and a\n * little edit button to reopen the row\n * - when the last requirement clears, the submit wakes (existing\n * [data-sk-ready] pop + breathe)\n *\n * Rows come from the classic grid's own math (stageViews): consecutive\n * half/third-width fields share a row, full-width fields stand alone,\n * chapters break rows.\n *\n * This is a RENDER BRANCH of FormClient, never a customRender: FormClient\n * still owns values/errors/honeypot/submit, so spam defense and validation\n * are identical to classic. Field index rides the existing step-tracking\n * pipe (totalSteps = question count) — form_analytics becomes a per-field\n * funnel with zero API changes.\n *\n * Construction rules: zero deps, one deduped style tag, data-sk-part on\n * everything, --sk-* theming, accents mix --sk-primary toward currentColor\n * (contrast law). Reduced motion collapses to instant states. SSR renders\n * the plain expanded form — the choreography arms only after interaction.\n */\n\nimport React, { useCallback, useEffect, useMemo, useRef, useState } from 'react'\nimport { useFieldControls } from './field-controls'\nimport { FormField } from './FormField'\nimport { StageStyles, SummaryTick } from './experience-chrome'\nimport {\n AUTO_ADVANCE_TYPES,\n stageEstimate,\n stageFirstName,\n stageViews,\n} from './experience-plan'\nimport type { StageView } from './experience-plan'\nimport { isDisplayOnly, isEmptyValue } from './field-rules'\nimport type { ExperienceRenderProps, FormField as FormFieldType } from './types'\n\n/** Controls where the glow should wrap the whole wrapper, not one input. */\nconst MULTI_CONTROL_TYPES = ['radio', 'checkbox', 'rating', 'slider']\n\n// ============================================\n// Sentences — what the form says back (unit-tested)\n// ============================================\n\nfunction optionLabel(field: FormFieldType, value: unknown): string {\n const raw = Array.isArray(field.options) ? field.options : []\n const hit = raw.find(\n (o: any) => (typeof o === 'string' ? o : o?.value) === value,\n ) as any\n if (!hit) return String(value)\n return typeof hit === 'string' ? hit : hit.label || String(value)\n}\n\nfunction formatDateish(value: string): string | null {\n const m = /^(\\d{4})-(\\d{2})-(\\d{2})$/.exec(value)\n if (!m) return null\n const MONTHS = [\n 'January', 'February', 'March', 'April', 'May', 'June',\n 'July', 'August', 'September', 'October', 'November', 'December',\n ]\n const month = MONTHS[Number(m[2]) - 1]\n if (!month) return null\n return `${month} ${Number(m[3])}`\n}\n\n/** Render a configured completion message: {value}, {label}, {first_name},\n and {any_field_slug}. Unknown tokens resolve to '' rather than printing\n braces at the visitor. */\nexport function renderCompletionTemplate(\n template: string,\n field: FormFieldType,\n values: Record<string, unknown>,\n): string {\n const stringify = (v: unknown) =>\n Array.isArray(v) ? v.map(String).join(', ') : v === undefined || v === null ? '' : String(v)\n return template\n .replace(/\\{(\\w+)\\}/g, (_match, token: string) => {\n if (token === 'value') return stringify(values[field.slug])\n if (token === 'label') return field.label\n if (token === 'first_name') {\n const key = Object.keys(values).find((k) => /^first[_-]?name$/i.test(k))\n return (key ? stageFirstName(values[key]) : null) || ''\n }\n return stringify(values[token])\n })\n .replace(/\\s{2,}/g, ' ')\n .trim()\n}\n\n/**\n * The sentence a completed row collapses into. Warm, professional, specific.\n * Returns null when there is nothing worth saying (row left empty).\n *\n * A `completion_message` configured on any answered field in the row wins\n * over the built-in sentences — that is the Sonor-side override, so the copy\n * can be changed per form without a site deploy.\n */\nexport function groupSentence(\n fields: FormFieldType[],\n values: Record<string, unknown>,\n): string | null {\n const val = (f: FormFieldType) => values[f.slug]\n const answered = fields.filter((f) => !isEmptyValue(val(f)))\n if (answered.length === 0) return null\n\n // Author-configured copy wins, in field order.\n for (const f of answered) {\n const template = f.completion_message?.trim()\n if (template) {\n const rendered = renderCompletionTemplate(template, f, values)\n if (rendered) return rendered\n }\n }\n\n // Name row → the greeting.\n const firstNameField = fields.find((f) => /first[_-]?name|^fname$/i.test(f.slug))\n const anyNameField = fields.find(\n (f) => /(^|_|-)name($|_|-)/i.test(f.slug) || /name/i.test(f.slug),\n )\n if (firstNameField || anyNameField) {\n const source = firstNameField ?? anyNameField\n const name = stageFirstName(val(source!))\n if (name) return `Nice to meet you, ${name}.`\n }\n\n // Contact row → where the follow-up lands.\n const email = fields.find(\n (f) => f.field_type === 'email' && !isEmptyValue(val(f)),\n )\n const phone = fields.find(\n (f) => (f.field_type === 'phone' || f.field_type === 'tel') && !isEmptyValue(val(f)),\n )\n if (email && phone) return `We'll follow up at ${val(email)} or ${val(phone)}.`\n if (email) return `We'll follow up at ${val(email)}.`\n if (phone) return `We'll follow up at ${val(phone)}.`\n\n // Single-field rows by type.\n if (answered.length === 1) {\n const f = answered[0]\n const v = val(f)\n switch (f.field_type) {\n case 'date':\n case 'datetime': {\n const pretty = formatDateish(String(v))\n if (pretty) return `Locked in for ${pretty}.`\n break\n }\n case 'select':\n case 'radio':\n return `${optionLabel(f, v)} it is.`\n case 'rating':\n return `${v} stars. Appreciated.`\n case 'textarea':\n return `Got it. Thanks for the detail.`\n case 'checkbox':\n if (Array.isArray(v))\n return `${v.map((x) => optionLabel(f, x)).join(', ')}. Noted.`\n if (v === true) return `${f.label}. Noted.`\n break\n default:\n break\n }\n }\n\n // Fallback: honest and plain.\n return answered\n .map((f) => {\n const v = val(f)\n return `${f.label}: ${Array.isArray(v) ? v.join(', ') : String(v)}`\n })\n .join(' · ')\n}\n\n// ============================================\n// Styles (deduped tag; head/pips/collapse mechanics come from StageStyles)\n// ============================================\n\nconst STYLE_ID = 'sk-spot-css'\n\nconst CSS = `\n@keyframes sk-spot-shake-a { 0%, 100% { transform: translateX(0) } 18% { transform: translateX(-9px) } 40% { transform: translateX(7px) } 62% { transform: translateX(-5px) } 82% { transform: translateX(3px) } }\n@keyframes sk-spot-shake-b { 0%, 100% { transform: translateX(0) } 18% { transform: translateX(-9px) } 40% { transform: translateX(7px) } 62% { transform: translateX(-5px) } 82% { transform: translateX(3px) } }\n@keyframes sk-spot-glow-breathe {\n 0%, 100% { box-shadow: 0 0 14px 0 color-mix(in srgb, var(--sk-primary, #2563eb) 45%, transparent) }\n 50% { box-shadow: 0 0 24px 2px color-mix(in srgb, var(--sk-primary, #2563eb) 60%, transparent) }\n}\n\n.sk-spot { position: relative; }\n\n/* ---- The glow: one ring that VISITS fields. Its position never animates —\n on every move a GHOST plays the exit at the old field WHILE the real ring\n plays its entrance at the new one. One seamless overlapping gesture, zero\n timers (immune to background throttling). ---- */\n/* Leaves WITH the field: the field it is leaving relaxes from its focused\n scale back to rest, so the ring shrinks by the same amount on the same\n curve instead of expanding away from it. */\n@keyframes sk-glow-out {\n 0% { opacity: 1; transform: scale(1);\n box-shadow: 0 0 14px 0 color-mix(in srgb, var(--sk-primary, #2563eb) 45%, transparent) }\n 100% { opacity: 0; transform: scale(.98);\n box-shadow: 0 0 6px 0 color-mix(in srgb, var(--sk-primary, #2563eb) 0%, transparent) }\n}\n/* Settles in rather than popping: a hair under resting size, no overshoot\n past it, and the halo rises straight to rest instead of flaring first. */\n@keyframes sk-glow-in {\n 0% { opacity: 0; transform: scale(.985);\n box-shadow: 0 0 6px 0 color-mix(in srgb, var(--sk-primary, #2563eb) 20%, transparent) }\n 100% { opacity: 1; transform: scale(1);\n box-shadow: 0 0 14px 0 color-mix(in srgb, var(--sk-primary, #2563eb) 45%, transparent) }\n}\n.sk-spot__glow, .sk-spot__glow-ghost {\n position: absolute; pointer-events: none; z-index: 2;\n border: 2px solid color-mix(in srgb, var(--sk-primary, #2563eb) 72%, currentColor);\n border-radius: calc(var(--sk-input-radius, 6px) + 4px);\n}\n.sk-spot__glow { opacity: 0; transition: none; }\n.sk-spot__glow[data-sk-on=\"true\"] {\n /* ease-out, not a spring — the ring arrives and settles, never bounces. */\n animation:\n sk-glow-in .38s cubic-bezier(.22,.8,.3,1) both,\n sk-spot-glow-breathe 2.2s ease-in-out .42s infinite;\n}\n/* Same duration and curve as the field's own transform transition below, so\n ring and field relax together rather than on separate clocks. */\n.sk-spot__glow-ghost { animation: sk-glow-out .3s cubic-bezier(.22,1,.36,1) both; }\n\n/* ---- Rows ---- */\n.sk-spot__groups { display: flex; flex-direction: column; }\n/* A collapsed row keeps the height it had as fields (set inline), and the\n sentence rides in the middle of that reserved space. */\n[data-sk-part=\"spot-group\"] { display: flex; flex-direction: column; justify-content: center; }\n/* Vertical clip only: the collapse animation needs the y-axis contained,\n but scaled labels and the glow must never lose their left edge. */\n.sk-spot .sk-stage__collapse > div { overflow: visible clip; }\n.sk-spot__rowfields { display: flex; flex-wrap: wrap; gap: 16px; padding: 4px 2px 6px; }\n.sk-spot__rowfields > * { flex: 1 1 100%; }\n@media (min-width: 560px) {\n .sk-spot__rowfields > .sk-spot__q--sub { flex: 1 1 0; min-width: 180px; }\n}\n\n/* ---- Fields: hover expands a touch; the active one holds it ---- */\n.sk-spot__q {\n position: relative;\n transition: transform .3s cubic-bezier(.22,1,.36,1), opacity .3s ease;\n}\n.sk-spot__q:hover { transform: scale(1.015); }\n.sk-spot__q[data-sk-spot=\"active\"] { transform: scale(1.02); z-index: 1; }\n.sk-spot--live .sk-spot__q[data-sk-spot=\"idle\"]:not(:hover) { opacity: .72; }\n.sk-spot__q .sk-form__label { transition: opacity .3s ease; }\n.sk-spot--live .sk-spot__q[data-sk-spot=\"filled\"] .sk-form__label { opacity: .75; }\n\n/* ---- Sentence rows: what the form says back ---- */\n/* Both layers cross-fade as the rows morph, so neither pops in or out. */\n.sk-spot__rowfields { opacity: 1; transition: opacity .3s ease .08s; }\n[data-sk-group-state=\"sentence\"] .sk-spot__rowfields { opacity: 0; transition-delay: 0s; }\n.sk-spot__sentence {\n display: flex; align-items: center; gap: 10px;\n padding: 12px 2px;\n opacity: 1; transition: opacity .3s ease .08s;\n}\n[data-sk-group-state=\"open\"] .sk-spot__sentence { opacity: 0; transition-delay: 0s; }\n.sk-spot__sentence-text { font-weight: 600; overflow-wrap: anywhere; }\n.sk-spot__sentence-edit {\n margin-left: auto; flex-shrink: 0;\n display: inline-flex; align-items: center; justify-content: center;\n width: 26px; height: 26px; border-radius: 50%;\n background: none; cursor: pointer; color: inherit;\n border: 1px solid color-mix(in srgb, currentColor 30%, transparent);\n opacity: .6;\n transition: opacity .15s ease, background-color .15s ease;\n}\n.sk-spot__sentence-edit:hover,\n.sk-spot__sentence-edit:focus-visible {\n opacity: 1;\n background: color-mix(in srgb, currentColor 10%, transparent);\n}\n\n/* ---- Finale: the submit gets room and presence. :where() keeps the\n specificity at zero so site button theming always wins. ---- */\n.sk-spot :where(.sk-form__actions) { margin-top: 28px; display: flex; justify-content: flex-end; }\n.sk-spot :where([data-sk-part=\"spot-submit\"]) {\n padding: 13px 30px; font-size: 1.05em; min-width: 200px; cursor: pointer;\n}\n@media (max-width: 560px) {\n .sk-spot :where([data-sk-part=\"spot-submit\"]) { width: 100%; }\n}\n\n@media (prefers-reduced-motion: reduce) {\n .sk-spot__glow { animation: none !important; }\n .sk-spot__glow[data-sk-on=\"true\"] { opacity: 1;\n box-shadow: 0 0 14px 0 color-mix(in srgb, var(--sk-primary, #2563eb) 50%, transparent); }\n .sk-spot__glow-ghost { animation: none !important; opacity: 0; }\n .sk-spot__q { transition: none; animation: none !important; }\n .sk-spot__q:hover { transform: none; }\n .sk-spot__q[data-sk-spot=\"active\"] { transform: none; }\n .sk-spot__rowfields, .sk-spot__sentence { transition: none; }\n}\n`\n\nexport function SpotStyles() {\n return <style id={STYLE_ID} dangerouslySetInnerHTML={{ __html: CSS }} />\n}\n\nfunction PencilIcon() {\n return (\n <svg width=\"12\" height=\"12\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\" strokeLinecap=\"round\" strokeLinejoin=\"round\" aria-hidden=\"true\">\n <path d=\"M17 3a2.85 2.85 0 1 1 4 4L7.5 20.5 2 22l1.5-5.5Z\" />\n </svg>\n )\n}\n\n// ============================================\n// Component\n// ============================================\n\ninterface GlowRect {\n top: number\n left: number\n width: number\n height: number\n visible: boolean\n}\n\nexport function FormSpotlight({\n config,\n values,\n errors,\n touched,\n isSubmitting,\n submitError,\n momentum,\n className,\n setFieldValue,\n validateField,\n isFieldVisible,\n fieldIsComplete,\n applyFieldError,\n submit,\n trackStepChange,\n trackFieldFocus,\n trackFieldBlur,\n honeypot,\n}: ExperienceRenderProps) {\n // Same on-demand date/file controls the classic form uses.\n const fieldControls = useFieldControls(config.fields)\n // Rows from the classic grid's own math; conditional visibility live.\n const views = useMemo(() => {\n return stageViews(config)\n .map((v) => ({ ...v, fields: v.fields.filter(isFieldVisible) }))\n .filter((v) => v.fields.length > 0)\n }, [config, isFieldVisible])\n const questions = useMemo(() => views.flatMap((v) => v.fields), [views])\n const questionCount = questions.length\n\n const groupOf = useCallback(\n (slug: string) => views.findIndex((v) => v.fields.some((f) => f.slug === slug)),\n [views],\n )\n\n const firstIncomplete = questions.findIndex((q) => !fieldIsComplete(q))\n const [activeSlug, setActiveSlug] = useState<string | null>(\n () => questions[Math.max(0, firstIncomplete)]?.slug ?? null,\n )\n // Choreography (glow, dimming, collapsing) arms only after interaction —\n // SSR and first paint are a calm, normal form.\n const [live, setLive] = useState(false)\n const [shakes, setShakes] = useState<Record<string, number>>({})\n const [collapsed, setCollapsed] = useState<Record<number, boolean>>({})\n const [glow, setGlow] = useState<GlowRect>({ top: 0, left: 0, width: 0, height: 0, visible: false })\n\n const formRef = useRef<HTMLFormElement | null>(null)\n const autoTimer = useRef<number | null>(null)\n\n const activeIndex = questions.findIndex((q) => q.slug === activeSlug)\n const activeGroup = activeSlug ? groupOf(activeSlug) : -1\n\n const groupComplete = useCallback(\n (view: StageView) =>\n view.fields.every(\n (f) => fieldIsComplete(f) || (!f.is_required && isEmptyValue(values[f.slug])),\n ) && view.fields.some((f) => !isEmptyValue(values[f.slug])),\n [fieldIsComplete, values],\n )\n\n const completeCount = questions.reduce((n, q) => n + (fieldIsComplete(q) ? 1 : 0), 0)\n const ready = momentum.total > 0 ? momentum.done >= momentum.total : true\n\n const clearAutoTimer = useCallback(() => {\n if (autoTimer.current !== null) {\n window.clearTimeout(autoTimer.current)\n autoTimer.current = null\n }\n }, [])\n useEffect(() => clearAutoTimer, [clearAutoTimer])\n\n // ---- The glow choreography: out on the old field, in on the new ----\n const measureRect = useCallback(\n (slug: string): Omit<GlowRect, 'visible'> | null => {\n const form = formRef.current\n if (!form) return null\n const wrapper = form.querySelector<HTMLElement>(`[data-sk-slug=\"${slug}\"]`)\n if (!wrapper) return null\n const field = questions.find((q) => q.slug === slug)\n const target = MULTI_CONTROL_TYPES.includes(field?.field_type || '')\n ? wrapper\n : wrapper.querySelector<HTMLElement>(\n 'input:not([data-sk-honeypot]), textarea, select, button',\n ) || wrapper\n const formRect = form.getBoundingClientRect()\n const rect = target.getBoundingClientRect()\n const PAD = 4\n return {\n top: rect.top - formRect.top - PAD,\n left: rect.left - formRect.left - PAD,\n width: rect.width + PAD * 2,\n height: rect.height + PAD * 2,\n }\n },\n [questions],\n )\n const measureRectRef = useRef(measureRect)\n measureRectRef.current = measureRect\n\n // The real ring (keyed by slug so its entrance replays per visit) + one\n // ghost slot replaying the exit at the rect the ring just left.\n const [glowOn, setGlowOn] = useState(false)\n const [ghost, setGhost] = useState<\n (Omit<GlowRect, 'visible'> & { key: number }) | null\n >(null)\n const ghostSeq = useRef(0)\n const glowStateRef = useRef({ on: false, rect: null as Omit<GlowRect, 'visible'> | null })\n\n useEffect(() => {\n if (!live) return\n const prev = glowStateRef.current\n const leave = () => {\n if (prev.on && prev.rect) {\n ghostSeq.current += 1\n setGhost({ ...prev.rect, key: ghostSeq.current })\n }\n }\n if (!activeSlug) {\n leave()\n setGlowOn(false)\n glowStateRef.current = { on: false, rect: null }\n return\n }\n const rect = measureRectRef.current(activeSlug)\n if (!rect) {\n leave()\n setGlowOn(false)\n glowStateRef.current = { on: false, rect: null }\n return\n }\n // Exit and entrance start the same frame — one seamless gesture.\n leave()\n setGlow({ ...rect, visible: true })\n setGlowOn(true)\n glowStateRef.current = { on: true, rect }\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [activeSlug, live])\n\n // While resting on a field, follow layout reflow (rows collapsing above,\n // viewport resizes) with a position snap — never a cross-field slide.\n useEffect(() => {\n if (!live || typeof ResizeObserver === 'undefined') return\n const form = formRef.current\n if (!form) return\n const follow = () => {\n if (!glowStateRef.current.on) return\n const slug = activeSlugRef.current\n if (!slug) return\n const rect = measureRectRef.current(slug)\n if (rect) {\n setGlow({ ...rect, visible: true })\n glowStateRef.current = { on: true, rect }\n }\n }\n const ro = new ResizeObserver(follow)\n ro.observe(form)\n window.addEventListener('resize', follow)\n return () => {\n ro.disconnect()\n window.removeEventListener('resize', follow)\n }\n }, [live])\n\n // ---- Collapse rows into sentences once they're complete and left ----\n // The row's open height is captured first and held as a floor on the group,\n // so swapping fields for a sentence never shrinks the form box (and never\n // yanks the rest of the page upward mid-fill).\n const groupEls = useRef<Record<number, HTMLDivElement | null>>({})\n const [reserved, setReserved] = useState<Record<number, number>>({})\n useEffect(() => {\n if (!live) return\n const heights: Record<number, number> = {}\n setCollapsed((prev) => {\n let changed = false\n const next = { ...prev }\n views.forEach((view, i) => {\n if (i === activeGroup || prev[i]) return\n if (groupComplete(view) && groupSentence(view.fields, values)) {\n const height = groupEls.current[i]?.getBoundingClientRect().height\n if (height) heights[i] = height\n next[i] = true\n changed = true\n }\n })\n return changed ? next : prev\n })\n if (Object.keys(heights).length) {\n setReserved((prev) => ({ ...heights, ...prev }))\n }\n }, [activeGroup, live, views, groupComplete, values])\n\n const inputFor = useCallback((slug: string): HTMLElement | null => {\n return (\n formRef.current?.querySelector<HTMLElement>(\n `[data-sk-slug=\"${slug}\"] input:not([data-sk-honeypot]), [data-sk-slug=\"${slug}\"] textarea, [data-sk-slug=\"${slug}\"] select, [data-sk-slug=\"${slug}\"] button`,\n ) ?? null\n )\n }, [])\n\n const reopenGroup = useCallback(\n (index: number) => {\n setLive(true)\n setCollapsed((prev) => ({ ...prev, [index]: false }))\n const slug = views[index]?.fields[0]?.slug\n if (slug) {\n window.setTimeout(() => inputFor(slug)?.focus(), 120)\n const qIndex = questions.findIndex((q) => q.slug === slug)\n if (qIndex >= 0) trackStepChange(qIndex + 1)\n }\n },\n [views, questions, inputFor, trackStepChange],\n )\n\n /** Focus the next unanswered question after `from` (collapsed rows are\n complete by definition, so travel naturally skips them); with nothing\n left, land on the wake-lit submit. */\n const travelOnward = useCallback(\n (from: number) => {\n for (let i = from + 1; i < questions.length; i++) {\n if (!fieldIsComplete(questions[i])) {\n inputFor(questions[i].slug)?.focus()\n return\n }\n }\n for (let i = 0; i < from; i++) {\n if (!fieldIsComplete(questions[i])) {\n inputFor(questions[i].slug)?.focus()\n return\n }\n }\n setActiveSlug(null)\n formRef.current\n ?.querySelector<HTMLElement>('[data-sk-part=\"spot-submit\"]')\n ?.focus()\n },\n [questions, fieldIsComplete, inputFor],\n )\n\n const shake = useCallback((slug: string) => {\n setShakes((prev) => ({ ...prev, [slug]: (prev[slug] || 0) + 1 }))\n }, [])\n\n const advanceFrom = useCallback(\n (index: number) => {\n const q = questions[index]\n if (!q) return\n const error = validateField(q)\n if (error) {\n applyFieldError(q.slug, error)\n shake(q.slug)\n return\n }\n travelOnward(index)\n },\n [questions, validateField, applyFieldError, shake, travelOnward],\n )\n const advanceFromRef = useRef(advanceFrom)\n advanceFromRef.current = advanceFrom\n const activeIndexRef = useRef(activeIndex)\n activeIndexRef.current = activeIndex\n\n // Focus drives the spotlight. Native focusin (not React's synthetic focus\n // system): it works identically across React versions, portals, and\n // programmatic .focus() calls — the travel helpers depend on that.\n const activeSlugRef = useRef(activeSlug)\n activeSlugRef.current = activeSlug\n const questionsRef = useRef(questions)\n questionsRef.current = questions\n const trackStepChangeRef = useRef(trackStepChange)\n trackStepChangeRef.current = trackStepChange\n useEffect(() => {\n const form = formRef.current\n if (!form) return\n const onFocusIn = (e: FocusEvent) => {\n const wrapper = (e.target as HTMLElement | null)?.closest?.('[data-sk-slug]')\n const slug = wrapper?.getAttribute('data-sk-slug') ?? null\n setLive(true)\n if (slug && slug !== activeSlugRef.current) {\n setActiveSlug(slug)\n const index = questionsRef.current.findIndex((q) => q.slug === slug)\n if (index >= 0) trackStepChangeRef.current(index + 1)\n } else if (!slug) {\n setActiveSlug(null)\n }\n }\n form.addEventListener('focusin', onFocusIn)\n return () => form.removeEventListener('focusin', onFocusIn)\n }, [])\n\n const handleFieldChange = useCallback(\n (field: FormFieldType, soloAutoAdvance: boolean) => (value: unknown) => {\n setLive(true)\n setFieldValue(field.slug, value)\n if (soloAutoAdvance && !isEmptyValue(value)) {\n clearAutoTimer()\n autoTimer.current = window.setTimeout(() => {\n autoTimer.current = null\n if (activeIndexRef.current >= 0) advanceFromRef.current(activeIndexRef.current)\n }, 380)\n }\n },\n [setFieldValue, clearAutoTimer],\n )\n\n const travelInputs = useCallback((): HTMLElement[] => {\n const form = formRef.current\n if (!form) return []\n return questions\n .map((q) => inputFor(q.slug))\n .filter((el): el is HTMLElement => !!el)\n }, [questions, inputFor])\n\n const handleKeyDown = useCallback(\n (e: React.KeyboardEvent<HTMLFormElement>) => {\n const target = e.target as HTMLElement\n const tag = target.tagName\n const isField = tag === 'INPUT' || tag === 'TEXTAREA' || tag === 'SELECT'\n if (!isField || activeIndex < 0) return\n\n if (e.key === 'Enter') {\n if (tag === 'TEXTAREA' && e.shiftKey) return\n e.preventDefault()\n advanceFrom(activeIndex)\n return\n }\n\n if (e.key === 'ArrowDown' || e.key === 'ArrowUp') {\n if (tag !== 'INPUT') return\n const type = (target as HTMLInputElement).type\n if (type === 'number' || type === 'range' || type === 'radio' || type === 'checkbox')\n return\n e.preventDefault()\n const inputs = travelInputs()\n const domIndex = inputs.indexOf(inputFor(questions[activeIndex].slug) as HTMLElement)\n if (e.key === 'ArrowDown') {\n const next = inputs[domIndex + 1]\n if (next) next.focus()\n else\n formRef.current\n ?.querySelector<HTMLElement>('[data-sk-part=\"spot-submit\"]')\n ?.focus()\n } else {\n const prev = inputs[domIndex - 1]\n if (prev) prev.focus()\n }\n }\n },\n [activeIndex, questions, advanceFrom, travelInputs, inputFor],\n )\n\n const handleSubmit = useCallback(\n (e: React.FormEvent) => {\n e.preventDefault()\n if (isSubmitting) return\n clearAutoTimer()\n void submit()\n },\n [isSubmitting, submit, clearAutoTimer],\n )\n\n // validateAll errors from a submit attempt: reopen the offending row if it\n // collapsed, sweep the glow there, shake.\n useEffect(() => {\n const offender = questions.find((q) => errors[q.slug])\n if (!offender) return\n const g = groupOf(offender.slug)\n if (g >= 0 && collapsed[g]) {\n setCollapsed((prev) => ({ ...prev, [g]: false }))\n window.setTimeout(() => inputFor(offender.slug)?.focus(), 120)\n shake(offender.slug)\n return\n }\n if (offender.slug !== activeSlug) {\n inputFor(offender.slug)?.focus()\n shake(offender.slug)\n }\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [errors])\n\n // Display-only fields (heading/paragraph) render standalone, in order.\n const firstFieldIdToView = useMemo(() => {\n const map = new Map<string, number>()\n views.forEach((v, i) => map.set(v.fields[0].id, i))\n return map\n }, [views])\n const renderedViews = new Set<number>()\n\n return (\n <form\n ref={formRef}\n className={`sk-form sk-spot ${live ? 'sk-spot--live ' : ''}${className || ''}`}\n data-sk-part=\"spotlight\"\n data-sk-state={isSubmitting ? 'submitting' : 'idle'}\n data-sk-ready={ready && momentum.total > 0 ? 'true' : undefined}\n onSubmit={handleSubmit}\n onKeyDown={handleKeyDown}\n >\n <StageStyles />\n <SpotStyles />\n\n {/* The glowing outline — it never belongs to a field, it VISITS. The\n ghost replays the exit at the old rect while the ring enters the\n new one: one seamless overlapping gesture. */}\n {ghost && (\n <span\n key={`ghost-${ghost.key}`}\n className=\"sk-spot__glow-ghost\"\n data-sk-part=\"spot-glow-ghost\"\n style={{ top: ghost.top, left: ghost.left, width: ghost.width, height: ghost.height }}\n onAnimationEnd={() =>\n setGhost((g) => (g && g.key === ghost.key ? null : g))\n }\n aria-hidden=\"true\"\n />\n )}\n <span\n key={`glow-${activeSlug || 'none'}`}\n className=\"sk-spot__glow\"\n data-sk-part=\"spot-glow\"\n data-sk-on={glowOn ? 'true' : undefined}\n style={{ top: glow.top, left: glow.left, width: glow.width, height: glow.height }}\n aria-hidden=\"true\"\n />\n\n <header className=\"sk-stage__head\" data-sk-part=\"stage-head\">\n <span className=\"sk-stage__head-name\">{config.name}</span>\n <span className=\"sk-stage__head-meta\" data-sk-part=\"stage-estimate\">\n {`Takes ${stageEstimate(questionCount)}`}\n </span>\n </header>\n\n <div className=\"sk-stage__hud\" data-sk-part=\"stage-hud\">\n <div\n className=\"sk-stage__meter\"\n data-sk-part=\"stage-meter\"\n role=\"progressbar\"\n // A progressbar must have an accessible name; aria-valuetext alone\n // is not one (axe: aria-progressbar-name).\n aria-label=\"Form progress\"\n aria-valuemin={0}\n aria-valuemax={questionCount}\n aria-valuenow={completeCount}\n aria-valuetext={`${completeCount} of ${questionCount} answered`}\n >\n {questions.map((q, i) => (\n <span\n key={q.id}\n className=\"sk-stage__seg\"\n data-sk-lit={fieldIsComplete(q) ? 'true' : undefined}\n data-sk-live={i === activeIndex ? 'true' : undefined}\n aria-hidden=\"true\"\n />\n ))}\n </div>\n <span\n className=\"sk-stage__counter\"\n data-sk-part=\"stage-counter\"\n data-sk-ready={ready && momentum.total > 0 ? 'true' : undefined}\n aria-live=\"polite\"\n >\n {ready ? 'Ready' : `${completeCount} / ${questionCount}`}\n </span>\n </div>\n\n <div className=\"sk-spot__groups\" data-sk-part=\"spot-groups\">\n {(config.fields || []).map((field) => {\n if (!isFieldVisible(field)) return null\n if (isDisplayOnly(field)) {\n return (\n <FormField\n controls={fieldControls}\n key={field.id}\n field={field}\n value={values[field.slug]}\n onChange={(value) => setFieldValue(field.slug, value)}\n />\n )\n }\n const viewIndex = firstFieldIdToView.get(field.id)\n if (viewIndex === undefined || renderedViews.has(viewIndex)) return null\n renderedViews.add(viewIndex)\n const view = views[viewIndex]\n const isCollapsed = collapsed[viewIndex] === true\n // Computed in both states, never gated on isCollapsed: unmounting\n // the sentence on reopen made it vanish instantly while its layer\n // was still animating closed. Kept mounted, it collapses WITH the\n // layer and the fields bloom in over it.\n const sentence = groupSentence(view.fields, values)\n\n return (\n <div\n key={view.fields[0].id}\n ref={(el) => {\n groupEls.current[viewIndex] = el\n }}\n data-sk-part=\"spot-group\"\n data-sk-group-state={isCollapsed ? 'sentence' : 'open'}\n // Held in BOTH states, not just while collapsed: the open row\n // is exactly this tall anyway, so keeping the floor means the\n // box never changes height — collapsing to a sentence and\n // reopening to fields are both pure crossfades, with no jump\n // at either end.\n style={\n reserved[viewIndex] ? { minHeight: reserved[viewIndex] } : undefined\n }\n >\n {/* The row of fields — collapses away once it has been said. */}\n <div\n className=\"sk-stage__collapse\"\n style={{ gridTemplateRows: isCollapsed ? '0fr' : '1fr' }}\n >\n <div inert={isCollapsed ? true : undefined}>\n <div className=\"sk-spot__rowfields\" data-sk-part=\"spot-rowfields\">\n {view.fields.map((f) => {\n const isActive = f.slug === activeSlug\n const filled = fieldIsComplete(f)\n const shakeN = shakes[f.slug] || 0\n return (\n <div\n key={f.id}\n data-sk-slug={f.slug}\n data-sk-part=\"spot-question\"\n data-sk-spot={isActive ? 'active' : filled ? 'filled' : 'idle'}\n className={\n 'sk-spot__q' +\n (view.fields.length > 1 ? ' sk-spot__q--sub' : '') +\n ` sk-form__field-wrapper sk-form__field-wrapper--${f.width || 'full'}`\n }\n style={\n shakeN > 0\n ? {\n animation: `${shakeN % 2 ? 'sk-spot-shake-a' : 'sk-spot-shake-b'} .38s ease`,\n }\n : undefined\n }\n >\n <FormField\n controls={fieldControls}\n field={f}\n value={values[f.slug]}\n error={errors[f.slug]}\n showValid={\n !!touched[f.slug] && !errors[f.slug] && fieldIsComplete(f)\n }\n onChange={handleFieldChange(\n f,\n view.fields.length === 1 &&\n AUTO_ADVANCE_TYPES.includes(f.field_type),\n )}\n onFocus={() => trackFieldFocus(f.slug)}\n onBlur={() => trackFieldBlur(f.slug)}\n />\n </div>\n )\n })}\n </div>\n </div>\n </div>\n\n {/* What the form says back — with its check and a way back. */}\n <div\n className=\"sk-stage__collapse\"\n style={{ gridTemplateRows: isCollapsed ? '1fr' : '0fr' }}\n >\n <div inert={isCollapsed ? undefined : true}>\n {sentence && (\n <div className=\"sk-spot__sentence\" data-sk-part=\"spot-sentence\">\n <SummaryTick />\n <span className=\"sk-spot__sentence-text\">{sentence}</span>\n <button\n type=\"button\"\n className=\"sk-spot__sentence-edit\"\n data-sk-part=\"spot-sentence-edit\"\n aria-label={`Edit ${view.fields.map((f) => f.label).join(', ')}`}\n onClick={() => reopenGroup(viewIndex)}\n >\n <PencilIcon />\n </button>\n </div>\n )}\n </div>\n </div>\n </div>\n )\n })}\n </div>\n\n <div className=\"sk-form__actions\" style={{ justifyContent: 'flex-end' }}>\n <button\n type=\"submit\"\n className=\"sk-form__btn sk-form__btn--submit\"\n data-sk-part=\"spot-submit\"\n disabled={isSubmitting}\n >\n {isSubmitting ? 'Submitting...' : config.submit_button_text}\n </button>\n </div>\n\n {submitError && (\n <p\n className=\"sk-form__submit-error\"\n role=\"alert\"\n style={{ color: 'var(--sk-error, #dc2626)', fontSize: 14, marginTop: 12 }}\n >\n {submitError}\n </p>\n )}\n\n {honeypot}\n </form>\n )\n}\n"]}
@@ -2,13 +2,13 @@
2
2
  'use strict';
3
3
 
4
4
  var chunkMVHR77V4_js = require('./chunk-MVHR77V4.js');
5
- var chunkF3AKYZOH_js = require('./chunk-F3AKYZOH.js');
6
- var chunkIPV2TUAT_js = require('./chunk-IPV2TUAT.js');
5
+ var chunkXCYKM2SA_js = require('./chunk-XCYKM2SA.js');
6
+ var chunkXA2GJFVM_js = require('./chunk-XA2GJFVM.js');
7
+ var chunk5XFFUP6D_js = require('./chunk-5XFFUP6D.js');
7
8
  require('./chunk-SNAQBZPT.js');
8
9
  var react = require('react');
9
10
  var jsxRuntime = require('react/jsx-runtime');
10
11
 
11
- var NON_QUESTION_TYPES = ["heading", "section_header", "paragraph", "hidden"];
12
12
  var MULTI_CONTROL_TYPES = ["radio", "checkbox", "rating", "slider"];
13
13
  function optionLabel(field, value) {
14
14
  const raw = Array.isArray(field.options) ? field.options : [];
@@ -46,14 +46,14 @@ function renderCompletionTemplate(template, field, values) {
46
46
  if (token === "label") return field.label;
47
47
  if (token === "first_name") {
48
48
  const key = Object.keys(values).find((k) => /^first[_-]?name$/i.test(k));
49
- return (key ? chunkF3AKYZOH_js.stageFirstName(values[key]) : null) || "";
49
+ return (key ? chunkXCYKM2SA_js.stageFirstName(values[key]) : null) || "";
50
50
  }
51
51
  return stringify(values[token]);
52
52
  }).replace(/\s{2,}/g, " ").trim();
53
53
  }
54
54
  function groupSentence(fields, values) {
55
55
  const val = (f) => values[f.slug];
56
- const answered = fields.filter((f) => !chunkF3AKYZOH_js.isEmptyValue(val(f)));
56
+ const answered = fields.filter((f) => !chunk5XFFUP6D_js.isEmptyValue(val(f)));
57
57
  if (answered.length === 0) return null;
58
58
  for (const f of answered) {
59
59
  const template = f.completion_message?.trim();
@@ -68,14 +68,14 @@ function groupSentence(fields, values) {
68
68
  );
69
69
  if (firstNameField || anyNameField) {
70
70
  const source = firstNameField ?? anyNameField;
71
- const name = chunkF3AKYZOH_js.stageFirstName(val(source));
71
+ const name = chunkXCYKM2SA_js.stageFirstName(val(source));
72
72
  if (name) return `Nice to meet you, ${name}.`;
73
73
  }
74
74
  const email = fields.find(
75
- (f) => f.field_type === "email" && !chunkF3AKYZOH_js.isEmptyValue(val(f))
75
+ (f) => f.field_type === "email" && !chunk5XFFUP6D_js.isEmptyValue(val(f))
76
76
  );
77
77
  const phone = fields.find(
78
- (f) => (f.field_type === "phone" || f.field_type === "tel") && !chunkF3AKYZOH_js.isEmptyValue(val(f))
78
+ (f) => (f.field_type === "phone" || f.field_type === "tel") && !chunk5XFFUP6D_js.isEmptyValue(val(f))
79
79
  );
80
80
  if (email && phone) return `We'll follow up at ${val(email)} or ${val(phone)}.`;
81
81
  if (email) return `We'll follow up at ${val(email)}.`;
@@ -251,11 +251,13 @@ function FormSpotlight({
251
251
  applyFieldError,
252
252
  submit,
253
253
  trackStepChange,
254
+ trackFieldFocus,
255
+ trackFieldBlur,
254
256
  honeypot
255
257
  }) {
256
- const fieldControls = chunkF3AKYZOH_js.useFieldControls(config.fields);
258
+ const fieldControls = chunkXCYKM2SA_js.useFieldControls(config.fields);
257
259
  const views = react.useMemo(() => {
258
- return chunkF3AKYZOH_js.stageViews(config).map((v) => ({ ...v, fields: v.fields.filter(isFieldVisible) })).filter((v) => v.fields.length > 0);
260
+ return chunkXCYKM2SA_js.stageViews(config).map((v) => ({ ...v, fields: v.fields.filter(isFieldVisible) })).filter((v) => v.fields.length > 0);
259
261
  }, [config, isFieldVisible]);
260
262
  const questions = react.useMemo(() => views.flatMap((v) => v.fields), [views]);
261
263
  const questionCount = questions.length;
@@ -277,8 +279,8 @@ function FormSpotlight({
277
279
  const activeGroup = activeSlug ? groupOf(activeSlug) : -1;
278
280
  const groupComplete = react.useCallback(
279
281
  (view) => view.fields.every(
280
- (f) => fieldIsComplete(f) || !f.is_required && chunkF3AKYZOH_js.isEmptyValue(values[f.slug])
281
- ) && view.fields.some((f) => !chunkF3AKYZOH_js.isEmptyValue(values[f.slug])),
282
+ (f) => fieldIsComplete(f) || !f.is_required && chunk5XFFUP6D_js.isEmptyValue(values[f.slug])
283
+ ) && view.fields.some((f) => !chunk5XFFUP6D_js.isEmptyValue(values[f.slug])),
282
284
  [fieldIsComplete, values]
283
285
  );
284
286
  const completeCount = questions.reduce((n, q) => n + (fieldIsComplete(q) ? 1 : 0), 0);
@@ -476,7 +478,7 @@ function FormSpotlight({
476
478
  (field, soloAutoAdvance) => (value) => {
477
479
  setLive(true);
478
480
  setFieldValue(field.slug, value);
479
- if (soloAutoAdvance && !chunkF3AKYZOH_js.isEmptyValue(value)) {
481
+ if (soloAutoAdvance && !chunk5XFFUP6D_js.isEmptyValue(value)) {
480
482
  clearAutoTimer();
481
483
  autoTimer.current = window.setTimeout(() => {
482
484
  autoTimer.current = null;
@@ -591,7 +593,7 @@ function FormSpotlight({
591
593
  ),
592
594
  /* @__PURE__ */ jsxRuntime.jsxs("header", { className: "sk-stage__head", "data-sk-part": "stage-head", children: [
593
595
  /* @__PURE__ */ jsxRuntime.jsx("span", { className: "sk-stage__head-name", children: config.name }),
594
- /* @__PURE__ */ jsxRuntime.jsx("span", { className: "sk-stage__head-meta", "data-sk-part": "stage-estimate", children: `Takes ${chunkF3AKYZOH_js.stageEstimate(questionCount)}` })
596
+ /* @__PURE__ */ jsxRuntime.jsx("span", { className: "sk-stage__head-meta", "data-sk-part": "stage-estimate", children: `Takes ${chunkXCYKM2SA_js.stageEstimate(questionCount)}` })
595
597
  ] }),
596
598
  /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "sk-stage__hud", "data-sk-part": "stage-hud", children: [
597
599
  /* @__PURE__ */ jsxRuntime.jsx(
@@ -630,9 +632,9 @@ function FormSpotlight({
630
632
  ] }),
631
633
  /* @__PURE__ */ jsxRuntime.jsx("div", { className: "sk-spot__groups", "data-sk-part": "spot-groups", children: (config.fields || []).map((field) => {
632
634
  if (!isFieldVisible(field)) return null;
633
- if (NON_QUESTION_TYPES.includes(field.field_type)) {
635
+ if (chunk5XFFUP6D_js.isDisplayOnly(field)) {
634
636
  return /* @__PURE__ */ jsxRuntime.jsx(
635
- chunkIPV2TUAT_js.FormField,
637
+ chunkXA2GJFVM_js.FormField,
636
638
  {
637
639
  controls: fieldControls,
638
640
  field,
@@ -678,7 +680,7 @@ function FormSpotlight({
678
680
  animation: `${shakeN % 2 ? "sk-spot-shake-a" : "sk-spot-shake-b"} .38s ease`
679
681
  } : void 0,
680
682
  children: /* @__PURE__ */ jsxRuntime.jsx(
681
- chunkIPV2TUAT_js.FormField,
683
+ chunkXA2GJFVM_js.FormField,
682
684
  {
683
685
  controls: fieldControls,
684
686
  field: f,
@@ -687,8 +689,10 @@ function FormSpotlight({
687
689
  showValid: !!touched[f.slug] && !errors[f.slug] && fieldIsComplete(f),
688
690
  onChange: handleFieldChange(
689
691
  f,
690
- view.fields.length === 1 && chunkF3AKYZOH_js.AUTO_ADVANCE_TYPES.includes(f.field_type)
691
- )
692
+ view.fields.length === 1 && chunkXCYKM2SA_js.AUTO_ADVANCE_TYPES.includes(f.field_type)
693
+ ),
694
+ onFocus: () => trackFieldFocus(f.slug),
695
+ onBlur: () => trackFieldBlur(f.slug)
692
696
  }
693
697
  )
694
698
  },
@@ -753,5 +757,5 @@ exports.FormSpotlight = FormSpotlight;
753
757
  exports.SpotStyles = SpotStyles;
754
758
  exports.groupSentence = groupSentence;
755
759
  exports.renderCompletionTemplate = renderCompletionTemplate;
756
- //# sourceMappingURL=FormSpotlight-URS4XRS7.js.map
757
- //# sourceMappingURL=FormSpotlight-URS4XRS7.js.map
760
+ //# sourceMappingURL=FormSpotlight-YTACNE57.js.map
761
+ //# sourceMappingURL=FormSpotlight-YTACNE57.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/forms/FormSpotlight.tsx"],"names":["stageFirstName","isEmptyValue","jsx","useFieldControls","useMemo","stageViews","useCallback","useState","useRef","useEffect","jsxs","StageStyles","stageEstimate","isDisplayOnly","FormField","AUTO_ADVANCE_TYPES","SummaryTick"],"mappings":"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","file":"FormSpotlight-YTACNE57.js","sourcesContent":["'use client'\n\n/**\n * FormSpotlight — a professional form that CONVERSES back.\n *\n * At rest it is a normal form. The life:\n * - hovering a field expands it slightly; clicking keeps it expanded and a\n * GLOWING OUTLINE animates in around it\n * - the outline is ONE physical element: finishing a field and moving on,\n * the glow glides out of the old field and into the next (rect-tracked,\n * so it chases layout wherever the next field lives)\n * - a completed field earns its animated checkmark (the existing lock-in\n * tick + ring)\n * - when a whole row completes and you move on, the fields COLLAPSE INTO A\n * SENTENCE the form says back — \"Nice to meet you, Ramsey.\" /\n * \"We'll follow up at ramsey@… or 555‑0100.\" — with a drawn check and a\n * little edit button to reopen the row\n * - when the last requirement clears, the submit wakes (existing\n * [data-sk-ready] pop + breathe)\n *\n * Rows come from the classic grid's own math (stageViews): consecutive\n * half/third-width fields share a row, full-width fields stand alone,\n * chapters break rows.\n *\n * This is a RENDER BRANCH of FormClient, never a customRender: FormClient\n * still owns values/errors/honeypot/submit, so spam defense and validation\n * are identical to classic. Field index rides the existing step-tracking\n * pipe (totalSteps = question count) — form_analytics becomes a per-field\n * funnel with zero API changes.\n *\n * Construction rules: zero deps, one deduped style tag, data-sk-part on\n * everything, --sk-* theming, accents mix --sk-primary toward currentColor\n * (contrast law). Reduced motion collapses to instant states. SSR renders\n * the plain expanded form — the choreography arms only after interaction.\n */\n\nimport React, { useCallback, useEffect, useMemo, useRef, useState } from 'react'\nimport { useFieldControls } from './field-controls'\nimport { FormField } from './FormField'\nimport { StageStyles, SummaryTick } from './experience-chrome'\nimport {\n AUTO_ADVANCE_TYPES,\n stageEstimate,\n stageFirstName,\n stageViews,\n} from './experience-plan'\nimport type { StageView } from './experience-plan'\nimport { isDisplayOnly, isEmptyValue } from './field-rules'\nimport type { ExperienceRenderProps, FormField as FormFieldType } from './types'\n\n/** Controls where the glow should wrap the whole wrapper, not one input. */\nconst MULTI_CONTROL_TYPES = ['radio', 'checkbox', 'rating', 'slider']\n\n// ============================================\n// Sentences — what the form says back (unit-tested)\n// ============================================\n\nfunction optionLabel(field: FormFieldType, value: unknown): string {\n const raw = Array.isArray(field.options) ? field.options : []\n const hit = raw.find(\n (o: any) => (typeof o === 'string' ? o : o?.value) === value,\n ) as any\n if (!hit) return String(value)\n return typeof hit === 'string' ? hit : hit.label || String(value)\n}\n\nfunction formatDateish(value: string): string | null {\n const m = /^(\\d{4})-(\\d{2})-(\\d{2})$/.exec(value)\n if (!m) return null\n const MONTHS = [\n 'January', 'February', 'March', 'April', 'May', 'June',\n 'July', 'August', 'September', 'October', 'November', 'December',\n ]\n const month = MONTHS[Number(m[2]) - 1]\n if (!month) return null\n return `${month} ${Number(m[3])}`\n}\n\n/** Render a configured completion message: {value}, {label}, {first_name},\n and {any_field_slug}. Unknown tokens resolve to '' rather than printing\n braces at the visitor. */\nexport function renderCompletionTemplate(\n template: string,\n field: FormFieldType,\n values: Record<string, unknown>,\n): string {\n const stringify = (v: unknown) =>\n Array.isArray(v) ? v.map(String).join(', ') : v === undefined || v === null ? '' : String(v)\n return template\n .replace(/\\{(\\w+)\\}/g, (_match, token: string) => {\n if (token === 'value') return stringify(values[field.slug])\n if (token === 'label') return field.label\n if (token === 'first_name') {\n const key = Object.keys(values).find((k) => /^first[_-]?name$/i.test(k))\n return (key ? stageFirstName(values[key]) : null) || ''\n }\n return stringify(values[token])\n })\n .replace(/\\s{2,}/g, ' ')\n .trim()\n}\n\n/**\n * The sentence a completed row collapses into. Warm, professional, specific.\n * Returns null when there is nothing worth saying (row left empty).\n *\n * A `completion_message` configured on any answered field in the row wins\n * over the built-in sentences — that is the Sonor-side override, so the copy\n * can be changed per form without a site deploy.\n */\nexport function groupSentence(\n fields: FormFieldType[],\n values: Record<string, unknown>,\n): string | null {\n const val = (f: FormFieldType) => values[f.slug]\n const answered = fields.filter((f) => !isEmptyValue(val(f)))\n if (answered.length === 0) return null\n\n // Author-configured copy wins, in field order.\n for (const f of answered) {\n const template = f.completion_message?.trim()\n if (template) {\n const rendered = renderCompletionTemplate(template, f, values)\n if (rendered) return rendered\n }\n }\n\n // Name row → the greeting.\n const firstNameField = fields.find((f) => /first[_-]?name|^fname$/i.test(f.slug))\n const anyNameField = fields.find(\n (f) => /(^|_|-)name($|_|-)/i.test(f.slug) || /name/i.test(f.slug),\n )\n if (firstNameField || anyNameField) {\n const source = firstNameField ?? anyNameField\n const name = stageFirstName(val(source!))\n if (name) return `Nice to meet you, ${name}.`\n }\n\n // Contact row → where the follow-up lands.\n const email = fields.find(\n (f) => f.field_type === 'email' && !isEmptyValue(val(f)),\n )\n const phone = fields.find(\n (f) => (f.field_type === 'phone' || f.field_type === 'tel') && !isEmptyValue(val(f)),\n )\n if (email && phone) return `We'll follow up at ${val(email)} or ${val(phone)}.`\n if (email) return `We'll follow up at ${val(email)}.`\n if (phone) return `We'll follow up at ${val(phone)}.`\n\n // Single-field rows by type.\n if (answered.length === 1) {\n const f = answered[0]\n const v = val(f)\n switch (f.field_type) {\n case 'date':\n case 'datetime': {\n const pretty = formatDateish(String(v))\n if (pretty) return `Locked in for ${pretty}.`\n break\n }\n case 'select':\n case 'radio':\n return `${optionLabel(f, v)} it is.`\n case 'rating':\n return `${v} stars. Appreciated.`\n case 'textarea':\n return `Got it. Thanks for the detail.`\n case 'checkbox':\n if (Array.isArray(v))\n return `${v.map((x) => optionLabel(f, x)).join(', ')}. Noted.`\n if (v === true) return `${f.label}. Noted.`\n break\n default:\n break\n }\n }\n\n // Fallback: honest and plain.\n return answered\n .map((f) => {\n const v = val(f)\n return `${f.label}: ${Array.isArray(v) ? v.join(', ') : String(v)}`\n })\n .join(' · ')\n}\n\n// ============================================\n// Styles (deduped tag; head/pips/collapse mechanics come from StageStyles)\n// ============================================\n\nconst STYLE_ID = 'sk-spot-css'\n\nconst CSS = `\n@keyframes sk-spot-shake-a { 0%, 100% { transform: translateX(0) } 18% { transform: translateX(-9px) } 40% { transform: translateX(7px) } 62% { transform: translateX(-5px) } 82% { transform: translateX(3px) } }\n@keyframes sk-spot-shake-b { 0%, 100% { transform: translateX(0) } 18% { transform: translateX(-9px) } 40% { transform: translateX(7px) } 62% { transform: translateX(-5px) } 82% { transform: translateX(3px) } }\n@keyframes sk-spot-glow-breathe {\n 0%, 100% { box-shadow: 0 0 14px 0 color-mix(in srgb, var(--sk-primary, #2563eb) 45%, transparent) }\n 50% { box-shadow: 0 0 24px 2px color-mix(in srgb, var(--sk-primary, #2563eb) 60%, transparent) }\n}\n\n.sk-spot { position: relative; }\n\n/* ---- The glow: one ring that VISITS fields. Its position never animates —\n on every move a GHOST plays the exit at the old field WHILE the real ring\n plays its entrance at the new one. One seamless overlapping gesture, zero\n timers (immune to background throttling). ---- */\n/* Leaves WITH the field: the field it is leaving relaxes from its focused\n scale back to rest, so the ring shrinks by the same amount on the same\n curve instead of expanding away from it. */\n@keyframes sk-glow-out {\n 0% { opacity: 1; transform: scale(1);\n box-shadow: 0 0 14px 0 color-mix(in srgb, var(--sk-primary, #2563eb) 45%, transparent) }\n 100% { opacity: 0; transform: scale(.98);\n box-shadow: 0 0 6px 0 color-mix(in srgb, var(--sk-primary, #2563eb) 0%, transparent) }\n}\n/* Settles in rather than popping: a hair under resting size, no overshoot\n past it, and the halo rises straight to rest instead of flaring first. */\n@keyframes sk-glow-in {\n 0% { opacity: 0; transform: scale(.985);\n box-shadow: 0 0 6px 0 color-mix(in srgb, var(--sk-primary, #2563eb) 20%, transparent) }\n 100% { opacity: 1; transform: scale(1);\n box-shadow: 0 0 14px 0 color-mix(in srgb, var(--sk-primary, #2563eb) 45%, transparent) }\n}\n.sk-spot__glow, .sk-spot__glow-ghost {\n position: absolute; pointer-events: none; z-index: 2;\n border: 2px solid color-mix(in srgb, var(--sk-primary, #2563eb) 72%, currentColor);\n border-radius: calc(var(--sk-input-radius, 6px) + 4px);\n}\n.sk-spot__glow { opacity: 0; transition: none; }\n.sk-spot__glow[data-sk-on=\"true\"] {\n /* ease-out, not a spring — the ring arrives and settles, never bounces. */\n animation:\n sk-glow-in .38s cubic-bezier(.22,.8,.3,1) both,\n sk-spot-glow-breathe 2.2s ease-in-out .42s infinite;\n}\n/* Same duration and curve as the field's own transform transition below, so\n ring and field relax together rather than on separate clocks. */\n.sk-spot__glow-ghost { animation: sk-glow-out .3s cubic-bezier(.22,1,.36,1) both; }\n\n/* ---- Rows ---- */\n.sk-spot__groups { display: flex; flex-direction: column; }\n/* A collapsed row keeps the height it had as fields (set inline), and the\n sentence rides in the middle of that reserved space. */\n[data-sk-part=\"spot-group\"] { display: flex; flex-direction: column; justify-content: center; }\n/* Vertical clip only: the collapse animation needs the y-axis contained,\n but scaled labels and the glow must never lose their left edge. */\n.sk-spot .sk-stage__collapse > div { overflow: visible clip; }\n.sk-spot__rowfields { display: flex; flex-wrap: wrap; gap: 16px; padding: 4px 2px 6px; }\n.sk-spot__rowfields > * { flex: 1 1 100%; }\n@media (min-width: 560px) {\n .sk-spot__rowfields > .sk-spot__q--sub { flex: 1 1 0; min-width: 180px; }\n}\n\n/* ---- Fields: hover expands a touch; the active one holds it ---- */\n.sk-spot__q {\n position: relative;\n transition: transform .3s cubic-bezier(.22,1,.36,1), opacity .3s ease;\n}\n.sk-spot__q:hover { transform: scale(1.015); }\n.sk-spot__q[data-sk-spot=\"active\"] { transform: scale(1.02); z-index: 1; }\n.sk-spot--live .sk-spot__q[data-sk-spot=\"idle\"]:not(:hover) { opacity: .72; }\n.sk-spot__q .sk-form__label { transition: opacity .3s ease; }\n.sk-spot--live .sk-spot__q[data-sk-spot=\"filled\"] .sk-form__label { opacity: .75; }\n\n/* ---- Sentence rows: what the form says back ---- */\n/* Both layers cross-fade as the rows morph, so neither pops in or out. */\n.sk-spot__rowfields { opacity: 1; transition: opacity .3s ease .08s; }\n[data-sk-group-state=\"sentence\"] .sk-spot__rowfields { opacity: 0; transition-delay: 0s; }\n.sk-spot__sentence {\n display: flex; align-items: center; gap: 10px;\n padding: 12px 2px;\n opacity: 1; transition: opacity .3s ease .08s;\n}\n[data-sk-group-state=\"open\"] .sk-spot__sentence { opacity: 0; transition-delay: 0s; }\n.sk-spot__sentence-text { font-weight: 600; overflow-wrap: anywhere; }\n.sk-spot__sentence-edit {\n margin-left: auto; flex-shrink: 0;\n display: inline-flex; align-items: center; justify-content: center;\n width: 26px; height: 26px; border-radius: 50%;\n background: none; cursor: pointer; color: inherit;\n border: 1px solid color-mix(in srgb, currentColor 30%, transparent);\n opacity: .6;\n transition: opacity .15s ease, background-color .15s ease;\n}\n.sk-spot__sentence-edit:hover,\n.sk-spot__sentence-edit:focus-visible {\n opacity: 1;\n background: color-mix(in srgb, currentColor 10%, transparent);\n}\n\n/* ---- Finale: the submit gets room and presence. :where() keeps the\n specificity at zero so site button theming always wins. ---- */\n.sk-spot :where(.sk-form__actions) { margin-top: 28px; display: flex; justify-content: flex-end; }\n.sk-spot :where([data-sk-part=\"spot-submit\"]) {\n padding: 13px 30px; font-size: 1.05em; min-width: 200px; cursor: pointer;\n}\n@media (max-width: 560px) {\n .sk-spot :where([data-sk-part=\"spot-submit\"]) { width: 100%; }\n}\n\n@media (prefers-reduced-motion: reduce) {\n .sk-spot__glow { animation: none !important; }\n .sk-spot__glow[data-sk-on=\"true\"] { opacity: 1;\n box-shadow: 0 0 14px 0 color-mix(in srgb, var(--sk-primary, #2563eb) 50%, transparent); }\n .sk-spot__glow-ghost { animation: none !important; opacity: 0; }\n .sk-spot__q { transition: none; animation: none !important; }\n .sk-spot__q:hover { transform: none; }\n .sk-spot__q[data-sk-spot=\"active\"] { transform: none; }\n .sk-spot__rowfields, .sk-spot__sentence { transition: none; }\n}\n`\n\nexport function SpotStyles() {\n return <style id={STYLE_ID} dangerouslySetInnerHTML={{ __html: CSS }} />\n}\n\nfunction PencilIcon() {\n return (\n <svg width=\"12\" height=\"12\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\" strokeLinecap=\"round\" strokeLinejoin=\"round\" aria-hidden=\"true\">\n <path d=\"M17 3a2.85 2.85 0 1 1 4 4L7.5 20.5 2 22l1.5-5.5Z\" />\n </svg>\n )\n}\n\n// ============================================\n// Component\n// ============================================\n\ninterface GlowRect {\n top: number\n left: number\n width: number\n height: number\n visible: boolean\n}\n\nexport function FormSpotlight({\n config,\n values,\n errors,\n touched,\n isSubmitting,\n submitError,\n momentum,\n className,\n setFieldValue,\n validateField,\n isFieldVisible,\n fieldIsComplete,\n applyFieldError,\n submit,\n trackStepChange,\n trackFieldFocus,\n trackFieldBlur,\n honeypot,\n}: ExperienceRenderProps) {\n // Same on-demand date/file controls the classic form uses.\n const fieldControls = useFieldControls(config.fields)\n // Rows from the classic grid's own math; conditional visibility live.\n const views = useMemo(() => {\n return stageViews(config)\n .map((v) => ({ ...v, fields: v.fields.filter(isFieldVisible) }))\n .filter((v) => v.fields.length > 0)\n }, [config, isFieldVisible])\n const questions = useMemo(() => views.flatMap((v) => v.fields), [views])\n const questionCount = questions.length\n\n const groupOf = useCallback(\n (slug: string) => views.findIndex((v) => v.fields.some((f) => f.slug === slug)),\n [views],\n )\n\n const firstIncomplete = questions.findIndex((q) => !fieldIsComplete(q))\n const [activeSlug, setActiveSlug] = useState<string | null>(\n () => questions[Math.max(0, firstIncomplete)]?.slug ?? null,\n )\n // Choreography (glow, dimming, collapsing) arms only after interaction —\n // SSR and first paint are a calm, normal form.\n const [live, setLive] = useState(false)\n const [shakes, setShakes] = useState<Record<string, number>>({})\n const [collapsed, setCollapsed] = useState<Record<number, boolean>>({})\n const [glow, setGlow] = useState<GlowRect>({ top: 0, left: 0, width: 0, height: 0, visible: false })\n\n const formRef = useRef<HTMLFormElement | null>(null)\n const autoTimer = useRef<number | null>(null)\n\n const activeIndex = questions.findIndex((q) => q.slug === activeSlug)\n const activeGroup = activeSlug ? groupOf(activeSlug) : -1\n\n const groupComplete = useCallback(\n (view: StageView) =>\n view.fields.every(\n (f) => fieldIsComplete(f) || (!f.is_required && isEmptyValue(values[f.slug])),\n ) && view.fields.some((f) => !isEmptyValue(values[f.slug])),\n [fieldIsComplete, values],\n )\n\n const completeCount = questions.reduce((n, q) => n + (fieldIsComplete(q) ? 1 : 0), 0)\n const ready = momentum.total > 0 ? momentum.done >= momentum.total : true\n\n const clearAutoTimer = useCallback(() => {\n if (autoTimer.current !== null) {\n window.clearTimeout(autoTimer.current)\n autoTimer.current = null\n }\n }, [])\n useEffect(() => clearAutoTimer, [clearAutoTimer])\n\n // ---- The glow choreography: out on the old field, in on the new ----\n const measureRect = useCallback(\n (slug: string): Omit<GlowRect, 'visible'> | null => {\n const form = formRef.current\n if (!form) return null\n const wrapper = form.querySelector<HTMLElement>(`[data-sk-slug=\"${slug}\"]`)\n if (!wrapper) return null\n const field = questions.find((q) => q.slug === slug)\n const target = MULTI_CONTROL_TYPES.includes(field?.field_type || '')\n ? wrapper\n : wrapper.querySelector<HTMLElement>(\n 'input:not([data-sk-honeypot]), textarea, select, button',\n ) || wrapper\n const formRect = form.getBoundingClientRect()\n const rect = target.getBoundingClientRect()\n const PAD = 4\n return {\n top: rect.top - formRect.top - PAD,\n left: rect.left - formRect.left - PAD,\n width: rect.width + PAD * 2,\n height: rect.height + PAD * 2,\n }\n },\n [questions],\n )\n const measureRectRef = useRef(measureRect)\n measureRectRef.current = measureRect\n\n // The real ring (keyed by slug so its entrance replays per visit) + one\n // ghost slot replaying the exit at the rect the ring just left.\n const [glowOn, setGlowOn] = useState(false)\n const [ghost, setGhost] = useState<\n (Omit<GlowRect, 'visible'> & { key: number }) | null\n >(null)\n const ghostSeq = useRef(0)\n const glowStateRef = useRef({ on: false, rect: null as Omit<GlowRect, 'visible'> | null })\n\n useEffect(() => {\n if (!live) return\n const prev = glowStateRef.current\n const leave = () => {\n if (prev.on && prev.rect) {\n ghostSeq.current += 1\n setGhost({ ...prev.rect, key: ghostSeq.current })\n }\n }\n if (!activeSlug) {\n leave()\n setGlowOn(false)\n glowStateRef.current = { on: false, rect: null }\n return\n }\n const rect = measureRectRef.current(activeSlug)\n if (!rect) {\n leave()\n setGlowOn(false)\n glowStateRef.current = { on: false, rect: null }\n return\n }\n // Exit and entrance start the same frame — one seamless gesture.\n leave()\n setGlow({ ...rect, visible: true })\n setGlowOn(true)\n glowStateRef.current = { on: true, rect }\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [activeSlug, live])\n\n // While resting on a field, follow layout reflow (rows collapsing above,\n // viewport resizes) with a position snap — never a cross-field slide.\n useEffect(() => {\n if (!live || typeof ResizeObserver === 'undefined') return\n const form = formRef.current\n if (!form) return\n const follow = () => {\n if (!glowStateRef.current.on) return\n const slug = activeSlugRef.current\n if (!slug) return\n const rect = measureRectRef.current(slug)\n if (rect) {\n setGlow({ ...rect, visible: true })\n glowStateRef.current = { on: true, rect }\n }\n }\n const ro = new ResizeObserver(follow)\n ro.observe(form)\n window.addEventListener('resize', follow)\n return () => {\n ro.disconnect()\n window.removeEventListener('resize', follow)\n }\n }, [live])\n\n // ---- Collapse rows into sentences once they're complete and left ----\n // The row's open height is captured first and held as a floor on the group,\n // so swapping fields for a sentence never shrinks the form box (and never\n // yanks the rest of the page upward mid-fill).\n const groupEls = useRef<Record<number, HTMLDivElement | null>>({})\n const [reserved, setReserved] = useState<Record<number, number>>({})\n useEffect(() => {\n if (!live) return\n const heights: Record<number, number> = {}\n setCollapsed((prev) => {\n let changed = false\n const next = { ...prev }\n views.forEach((view, i) => {\n if (i === activeGroup || prev[i]) return\n if (groupComplete(view) && groupSentence(view.fields, values)) {\n const height = groupEls.current[i]?.getBoundingClientRect().height\n if (height) heights[i] = height\n next[i] = true\n changed = true\n }\n })\n return changed ? next : prev\n })\n if (Object.keys(heights).length) {\n setReserved((prev) => ({ ...heights, ...prev }))\n }\n }, [activeGroup, live, views, groupComplete, values])\n\n const inputFor = useCallback((slug: string): HTMLElement | null => {\n return (\n formRef.current?.querySelector<HTMLElement>(\n `[data-sk-slug=\"${slug}\"] input:not([data-sk-honeypot]), [data-sk-slug=\"${slug}\"] textarea, [data-sk-slug=\"${slug}\"] select, [data-sk-slug=\"${slug}\"] button`,\n ) ?? null\n )\n }, [])\n\n const reopenGroup = useCallback(\n (index: number) => {\n setLive(true)\n setCollapsed((prev) => ({ ...prev, [index]: false }))\n const slug = views[index]?.fields[0]?.slug\n if (slug) {\n window.setTimeout(() => inputFor(slug)?.focus(), 120)\n const qIndex = questions.findIndex((q) => q.slug === slug)\n if (qIndex >= 0) trackStepChange(qIndex + 1)\n }\n },\n [views, questions, inputFor, trackStepChange],\n )\n\n /** Focus the next unanswered question after `from` (collapsed rows are\n complete by definition, so travel naturally skips them); with nothing\n left, land on the wake-lit submit. */\n const travelOnward = useCallback(\n (from: number) => {\n for (let i = from + 1; i < questions.length; i++) {\n if (!fieldIsComplete(questions[i])) {\n inputFor(questions[i].slug)?.focus()\n return\n }\n }\n for (let i = 0; i < from; i++) {\n if (!fieldIsComplete(questions[i])) {\n inputFor(questions[i].slug)?.focus()\n return\n }\n }\n setActiveSlug(null)\n formRef.current\n ?.querySelector<HTMLElement>('[data-sk-part=\"spot-submit\"]')\n ?.focus()\n },\n [questions, fieldIsComplete, inputFor],\n )\n\n const shake = useCallback((slug: string) => {\n setShakes((prev) => ({ ...prev, [slug]: (prev[slug] || 0) + 1 }))\n }, [])\n\n const advanceFrom = useCallback(\n (index: number) => {\n const q = questions[index]\n if (!q) return\n const error = validateField(q)\n if (error) {\n applyFieldError(q.slug, error)\n shake(q.slug)\n return\n }\n travelOnward(index)\n },\n [questions, validateField, applyFieldError, shake, travelOnward],\n )\n const advanceFromRef = useRef(advanceFrom)\n advanceFromRef.current = advanceFrom\n const activeIndexRef = useRef(activeIndex)\n activeIndexRef.current = activeIndex\n\n // Focus drives the spotlight. Native focusin (not React's synthetic focus\n // system): it works identically across React versions, portals, and\n // programmatic .focus() calls — the travel helpers depend on that.\n const activeSlugRef = useRef(activeSlug)\n activeSlugRef.current = activeSlug\n const questionsRef = useRef(questions)\n questionsRef.current = questions\n const trackStepChangeRef = useRef(trackStepChange)\n trackStepChangeRef.current = trackStepChange\n useEffect(() => {\n const form = formRef.current\n if (!form) return\n const onFocusIn = (e: FocusEvent) => {\n const wrapper = (e.target as HTMLElement | null)?.closest?.('[data-sk-slug]')\n const slug = wrapper?.getAttribute('data-sk-slug') ?? null\n setLive(true)\n if (slug && slug !== activeSlugRef.current) {\n setActiveSlug(slug)\n const index = questionsRef.current.findIndex((q) => q.slug === slug)\n if (index >= 0) trackStepChangeRef.current(index + 1)\n } else if (!slug) {\n setActiveSlug(null)\n }\n }\n form.addEventListener('focusin', onFocusIn)\n return () => form.removeEventListener('focusin', onFocusIn)\n }, [])\n\n const handleFieldChange = useCallback(\n (field: FormFieldType, soloAutoAdvance: boolean) => (value: unknown) => {\n setLive(true)\n setFieldValue(field.slug, value)\n if (soloAutoAdvance && !isEmptyValue(value)) {\n clearAutoTimer()\n autoTimer.current = window.setTimeout(() => {\n autoTimer.current = null\n if (activeIndexRef.current >= 0) advanceFromRef.current(activeIndexRef.current)\n }, 380)\n }\n },\n [setFieldValue, clearAutoTimer],\n )\n\n const travelInputs = useCallback((): HTMLElement[] => {\n const form = formRef.current\n if (!form) return []\n return questions\n .map((q) => inputFor(q.slug))\n .filter((el): el is HTMLElement => !!el)\n }, [questions, inputFor])\n\n const handleKeyDown = useCallback(\n (e: React.KeyboardEvent<HTMLFormElement>) => {\n const target = e.target as HTMLElement\n const tag = target.tagName\n const isField = tag === 'INPUT' || tag === 'TEXTAREA' || tag === 'SELECT'\n if (!isField || activeIndex < 0) return\n\n if (e.key === 'Enter') {\n if (tag === 'TEXTAREA' && e.shiftKey) return\n e.preventDefault()\n advanceFrom(activeIndex)\n return\n }\n\n if (e.key === 'ArrowDown' || e.key === 'ArrowUp') {\n if (tag !== 'INPUT') return\n const type = (target as HTMLInputElement).type\n if (type === 'number' || type === 'range' || type === 'radio' || type === 'checkbox')\n return\n e.preventDefault()\n const inputs = travelInputs()\n const domIndex = inputs.indexOf(inputFor(questions[activeIndex].slug) as HTMLElement)\n if (e.key === 'ArrowDown') {\n const next = inputs[domIndex + 1]\n if (next) next.focus()\n else\n formRef.current\n ?.querySelector<HTMLElement>('[data-sk-part=\"spot-submit\"]')\n ?.focus()\n } else {\n const prev = inputs[domIndex - 1]\n if (prev) prev.focus()\n }\n }\n },\n [activeIndex, questions, advanceFrom, travelInputs, inputFor],\n )\n\n const handleSubmit = useCallback(\n (e: React.FormEvent) => {\n e.preventDefault()\n if (isSubmitting) return\n clearAutoTimer()\n void submit()\n },\n [isSubmitting, submit, clearAutoTimer],\n )\n\n // validateAll errors from a submit attempt: reopen the offending row if it\n // collapsed, sweep the glow there, shake.\n useEffect(() => {\n const offender = questions.find((q) => errors[q.slug])\n if (!offender) return\n const g = groupOf(offender.slug)\n if (g >= 0 && collapsed[g]) {\n setCollapsed((prev) => ({ ...prev, [g]: false }))\n window.setTimeout(() => inputFor(offender.slug)?.focus(), 120)\n shake(offender.slug)\n return\n }\n if (offender.slug !== activeSlug) {\n inputFor(offender.slug)?.focus()\n shake(offender.slug)\n }\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [errors])\n\n // Display-only fields (heading/paragraph) render standalone, in order.\n const firstFieldIdToView = useMemo(() => {\n const map = new Map<string, number>()\n views.forEach((v, i) => map.set(v.fields[0].id, i))\n return map\n }, [views])\n const renderedViews = new Set<number>()\n\n return (\n <form\n ref={formRef}\n className={`sk-form sk-spot ${live ? 'sk-spot--live ' : ''}${className || ''}`}\n data-sk-part=\"spotlight\"\n data-sk-state={isSubmitting ? 'submitting' : 'idle'}\n data-sk-ready={ready && momentum.total > 0 ? 'true' : undefined}\n onSubmit={handleSubmit}\n onKeyDown={handleKeyDown}\n >\n <StageStyles />\n <SpotStyles />\n\n {/* The glowing outline — it never belongs to a field, it VISITS. The\n ghost replays the exit at the old rect while the ring enters the\n new one: one seamless overlapping gesture. */}\n {ghost && (\n <span\n key={`ghost-${ghost.key}`}\n className=\"sk-spot__glow-ghost\"\n data-sk-part=\"spot-glow-ghost\"\n style={{ top: ghost.top, left: ghost.left, width: ghost.width, height: ghost.height }}\n onAnimationEnd={() =>\n setGhost((g) => (g && g.key === ghost.key ? null : g))\n }\n aria-hidden=\"true\"\n />\n )}\n <span\n key={`glow-${activeSlug || 'none'}`}\n className=\"sk-spot__glow\"\n data-sk-part=\"spot-glow\"\n data-sk-on={glowOn ? 'true' : undefined}\n style={{ top: glow.top, left: glow.left, width: glow.width, height: glow.height }}\n aria-hidden=\"true\"\n />\n\n <header className=\"sk-stage__head\" data-sk-part=\"stage-head\">\n <span className=\"sk-stage__head-name\">{config.name}</span>\n <span className=\"sk-stage__head-meta\" data-sk-part=\"stage-estimate\">\n {`Takes ${stageEstimate(questionCount)}`}\n </span>\n </header>\n\n <div className=\"sk-stage__hud\" data-sk-part=\"stage-hud\">\n <div\n className=\"sk-stage__meter\"\n data-sk-part=\"stage-meter\"\n role=\"progressbar\"\n // A progressbar must have an accessible name; aria-valuetext alone\n // is not one (axe: aria-progressbar-name).\n aria-label=\"Form progress\"\n aria-valuemin={0}\n aria-valuemax={questionCount}\n aria-valuenow={completeCount}\n aria-valuetext={`${completeCount} of ${questionCount} answered`}\n >\n {questions.map((q, i) => (\n <span\n key={q.id}\n className=\"sk-stage__seg\"\n data-sk-lit={fieldIsComplete(q) ? 'true' : undefined}\n data-sk-live={i === activeIndex ? 'true' : undefined}\n aria-hidden=\"true\"\n />\n ))}\n </div>\n <span\n className=\"sk-stage__counter\"\n data-sk-part=\"stage-counter\"\n data-sk-ready={ready && momentum.total > 0 ? 'true' : undefined}\n aria-live=\"polite\"\n >\n {ready ? 'Ready' : `${completeCount} / ${questionCount}`}\n </span>\n </div>\n\n <div className=\"sk-spot__groups\" data-sk-part=\"spot-groups\">\n {(config.fields || []).map((field) => {\n if (!isFieldVisible(field)) return null\n if (isDisplayOnly(field)) {\n return (\n <FormField\n controls={fieldControls}\n key={field.id}\n field={field}\n value={values[field.slug]}\n onChange={(value) => setFieldValue(field.slug, value)}\n />\n )\n }\n const viewIndex = firstFieldIdToView.get(field.id)\n if (viewIndex === undefined || renderedViews.has(viewIndex)) return null\n renderedViews.add(viewIndex)\n const view = views[viewIndex]\n const isCollapsed = collapsed[viewIndex] === true\n // Computed in both states, never gated on isCollapsed: unmounting\n // the sentence on reopen made it vanish instantly while its layer\n // was still animating closed. Kept mounted, it collapses WITH the\n // layer and the fields bloom in over it.\n const sentence = groupSentence(view.fields, values)\n\n return (\n <div\n key={view.fields[0].id}\n ref={(el) => {\n groupEls.current[viewIndex] = el\n }}\n data-sk-part=\"spot-group\"\n data-sk-group-state={isCollapsed ? 'sentence' : 'open'}\n // Held in BOTH states, not just while collapsed: the open row\n // is exactly this tall anyway, so keeping the floor means the\n // box never changes height — collapsing to a sentence and\n // reopening to fields are both pure crossfades, with no jump\n // at either end.\n style={\n reserved[viewIndex] ? { minHeight: reserved[viewIndex] } : undefined\n }\n >\n {/* The row of fields — collapses away once it has been said. */}\n <div\n className=\"sk-stage__collapse\"\n style={{ gridTemplateRows: isCollapsed ? '0fr' : '1fr' }}\n >\n <div inert={isCollapsed ? true : undefined}>\n <div className=\"sk-spot__rowfields\" data-sk-part=\"spot-rowfields\">\n {view.fields.map((f) => {\n const isActive = f.slug === activeSlug\n const filled = fieldIsComplete(f)\n const shakeN = shakes[f.slug] || 0\n return (\n <div\n key={f.id}\n data-sk-slug={f.slug}\n data-sk-part=\"spot-question\"\n data-sk-spot={isActive ? 'active' : filled ? 'filled' : 'idle'}\n className={\n 'sk-spot__q' +\n (view.fields.length > 1 ? ' sk-spot__q--sub' : '') +\n ` sk-form__field-wrapper sk-form__field-wrapper--${f.width || 'full'}`\n }\n style={\n shakeN > 0\n ? {\n animation: `${shakeN % 2 ? 'sk-spot-shake-a' : 'sk-spot-shake-b'} .38s ease`,\n }\n : undefined\n }\n >\n <FormField\n controls={fieldControls}\n field={f}\n value={values[f.slug]}\n error={errors[f.slug]}\n showValid={\n !!touched[f.slug] && !errors[f.slug] && fieldIsComplete(f)\n }\n onChange={handleFieldChange(\n f,\n view.fields.length === 1 &&\n AUTO_ADVANCE_TYPES.includes(f.field_type),\n )}\n onFocus={() => trackFieldFocus(f.slug)}\n onBlur={() => trackFieldBlur(f.slug)}\n />\n </div>\n )\n })}\n </div>\n </div>\n </div>\n\n {/* What the form says back — with its check and a way back. */}\n <div\n className=\"sk-stage__collapse\"\n style={{ gridTemplateRows: isCollapsed ? '1fr' : '0fr' }}\n >\n <div inert={isCollapsed ? undefined : true}>\n {sentence && (\n <div className=\"sk-spot__sentence\" data-sk-part=\"spot-sentence\">\n <SummaryTick />\n <span className=\"sk-spot__sentence-text\">{sentence}</span>\n <button\n type=\"button\"\n className=\"sk-spot__sentence-edit\"\n data-sk-part=\"spot-sentence-edit\"\n aria-label={`Edit ${view.fields.map((f) => f.label).join(', ')}`}\n onClick={() => reopenGroup(viewIndex)}\n >\n <PencilIcon />\n </button>\n </div>\n )}\n </div>\n </div>\n </div>\n )\n })}\n </div>\n\n <div className=\"sk-form__actions\" style={{ justifyContent: 'flex-end' }}>\n <button\n type=\"submit\"\n className=\"sk-form__btn sk-form__btn--submit\"\n data-sk-part=\"spot-submit\"\n disabled={isSubmitting}\n >\n {isSubmitting ? 'Submitting...' : config.submit_button_text}\n </button>\n </div>\n\n {submitError && (\n <p\n className=\"sk-form__submit-error\"\n role=\"alert\"\n style={{ color: 'var(--sk-error, #dc2626)', fontSize: 14, marginTop: 12 }}\n >\n {submitError}\n </p>\n )}\n\n {honeypot}\n </form>\n )\n}\n"]}
@@ -2,8 +2,9 @@
2
2
  'use strict';
3
3
 
4
4
  var chunkMVHR77V4_js = require('./chunk-MVHR77V4.js');
5
- var chunkF3AKYZOH_js = require('./chunk-F3AKYZOH.js');
6
- var chunkIPV2TUAT_js = require('./chunk-IPV2TUAT.js');
5
+ var chunkXCYKM2SA_js = require('./chunk-XCYKM2SA.js');
6
+ var chunkXA2GJFVM_js = require('./chunk-XA2GJFVM.js');
7
+ var chunk5XFFUP6D_js = require('./chunk-5XFFUP6D.js');
7
8
  require('./chunk-SNAQBZPT.js');
8
9
  var react = require('react');
9
10
  var jsxRuntime = require('react/jsx-runtime');
@@ -25,9 +26,11 @@ function FormStage({
25
26
  applyFieldError,
26
27
  submit,
27
28
  trackStepChange,
29
+ trackFieldFocus,
30
+ trackFieldBlur,
28
31
  honeypot
29
32
  }) {
30
- const fieldControls = chunkF3AKYZOH_js.useFieldControls(config.fields);
33
+ const fieldControls = chunkXCYKM2SA_js.useFieldControls(config.fields);
31
34
  const [activeIndex, setActiveIndex] = react.useState(0);
32
35
  const [visited, setVisited] = react.useState({});
33
36
  const [shakeCount, setShakeCount] = react.useState(0);
@@ -35,7 +38,7 @@ function FormStage({
35
38
  const autoAdvanceTimer = react.useRef(null);
36
39
  const hasInteractedRef = react.useRef(false);
37
40
  const views = react.useMemo(() => {
38
- return chunkF3AKYZOH_js.stageViews(config).map((v) => ({ ...v, fields: v.fields.filter(isFieldVisible) })).filter((v) => v.fields.length > 0);
41
+ return chunkXCYKM2SA_js.stageViews(config).map((v) => ({ ...v, fields: v.fields.filter(isFieldVisible) })).filter((v) => v.fields.length > 0);
39
42
  }, [config, isFieldVisible]);
40
43
  const total = views.length;
41
44
  const questionCount = react.useMemo(
@@ -50,7 +53,7 @@ function FormStage({
50
53
  [views]
51
54
  );
52
55
  const nameField = nameViewIndex >= 0 ? views[nameViewIndex].fields.find((f) => /^first[_-]?name$/i.test(f.slug)) : void 0;
53
- const firstName = nameField ? chunkF3AKYZOH_js.stageFirstName(values[nameField.slug]) : null;
56
+ const firstName = nameField ? chunkXCYKM2SA_js.stageFirstName(values[nameField.slug]) : null;
54
57
  const clearAutoAdvance = react.useCallback(() => {
55
58
  if (autoAdvanceTimer.current !== null) {
56
59
  window.clearTimeout(autoAdvanceTimer.current);
@@ -59,7 +62,7 @@ function FormStage({
59
62
  }, []);
60
63
  react.useEffect(() => clearAutoAdvance, [clearAutoAdvance]);
61
64
  const beatHasValue = react.useCallback(
62
- (index) => (views[index]?.fields || []).some((f) => !chunkF3AKYZOH_js.isEmptyValue(values[f.slug])),
65
+ (index) => (views[index]?.fields || []).some((f) => !chunk5XFFUP6D_js.isEmptyValue(values[f.slug])),
63
66
  [views, values]
64
67
  );
65
68
  const beatComplete = react.useCallback(
@@ -67,7 +70,7 @@ function FormStage({
67
70
  const v = views[index];
68
71
  if (!v) return false;
69
72
  return v.fields.every(
70
- (f) => fieldIsComplete(f) || !f.is_required && chunkF3AKYZOH_js.isEmptyValue(values[f.slug])
73
+ (f) => fieldIsComplete(f) || !f.is_required && chunk5XFFUP6D_js.isEmptyValue(values[f.slug])
71
74
  ) && (beatHasValue(index) || visited[index] === true);
72
75
  },
73
76
  [views, fieldIsComplete, values, beatHasValue, visited]
@@ -146,7 +149,7 @@ function FormStage({
146
149
  (field, soloAutoAdvance) => (value) => {
147
150
  hasInteractedRef.current = true;
148
151
  setFieldValue(field.slug, value);
149
- if (soloAutoAdvance && !chunkF3AKYZOH_js.isEmptyValue(value)) {
152
+ if (soloAutoAdvance && !chunk5XFFUP6D_js.isEmptyValue(value)) {
150
153
  clearAutoAdvance();
151
154
  autoAdvanceTimer.current = window.setTimeout(() => {
152
155
  autoAdvanceTimer.current = null;
@@ -220,7 +223,7 @@ function FormStage({
220
223
  const completeBeats = views.reduce((n, _v, i) => n + (beatComplete(i) ? 1 : 0), 0);
221
224
  const activeView = activeIndex === REST ? null : views[activeIndex];
222
225
  !!activeView && activeView.fields.length > 1;
223
- const activeAllOptionalEmpty = !!activeView && activeView.fields.every((f) => !f.is_required && chunkF3AKYZOH_js.isEmptyValue(values[f.slug]));
226
+ const activeAllOptionalEmpty = !!activeView && activeView.fields.every((f) => !f.is_required && chunk5XFFUP6D_js.isEmptyValue(values[f.slug]));
224
227
  const activeHasTextarea = !!activeView && activeView.fields.some((f) => f.field_type === "textarea");
225
228
  const eyebrow = activeIndex !== REST && firstName && activeIndex === nameViewIndex + 1 ? { text: `Nice to meet you, ${firstName}.`, greet: true } : activeView?.step?.title ? { text: activeView.step.title, greet: false } : null;
226
229
  return /* @__PURE__ */ jsxRuntime.jsxs(
@@ -237,7 +240,7 @@ function FormStage({
237
240
  /* @__PURE__ */ jsxRuntime.jsx(chunkMVHR77V4_js.StageStyles, {}),
238
241
  /* @__PURE__ */ jsxRuntime.jsxs("header", { className: "sk-stage__head", "data-sk-part": "stage-head", children: [
239
242
  /* @__PURE__ */ jsxRuntime.jsx("span", { className: "sk-stage__head-name", children: config.name }),
240
- /* @__PURE__ */ jsxRuntime.jsx("span", { className: "sk-stage__head-meta", "data-sk-part": "stage-estimate", children: `Takes ${chunkF3AKYZOH_js.stageEstimate(questionCount)}` })
243
+ /* @__PURE__ */ jsxRuntime.jsx("span", { className: "sk-stage__head-meta", "data-sk-part": "stage-estimate", children: `Takes ${chunkXCYKM2SA_js.stageEstimate(questionCount)}` })
241
244
  ] }),
242
245
  /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "sk-stage__hud", "data-sk-part": "stage-hud", children: [
243
246
  /* @__PURE__ */ jsxRuntime.jsx(
@@ -277,7 +280,7 @@ function FormStage({
277
280
  /* @__PURE__ */ jsxRuntime.jsx("div", { className: "sk-stage__beats", "data-sk-part": "stage-beats", children: views.map((view, i) => {
278
281
  const isActive = i === activeIndex;
279
282
  const filled = visited[i] === true || beatHasValue(i);
280
- const answers = view.fields.map((f) => chunkF3AKYZOH_js.formatAnswer(values[f.slug])).filter((a) => a !== null);
283
+ const answers = view.fields.map((f) => chunkXCYKM2SA_js.formatAnswer(values[f.slug])).filter((a) => a !== null);
281
284
  const summaryValue = answers.length ? answers.join(" \xB7 ") : filled ? "Skipped" : null;
282
285
  const summaryLabel = view.step?.title || view.fields.map((f) => f.label).join(" \xB7 ");
283
286
  const complete = beatComplete(i) && answers.length > 0;
@@ -332,7 +335,7 @@ function FormStage({
332
335
  "data-sk-part": "stage-question",
333
336
  children: [
334
337
  /* @__PURE__ */ jsxRuntime.jsx("div", { className: "sk-stage__fields", children: view.fields.map((f) => /* @__PURE__ */ jsxRuntime.jsx(
335
- chunkIPV2TUAT_js.FormField,
338
+ chunkXA2GJFVM_js.FormField,
336
339
  {
337
340
  controls: fieldControls,
338
341
  field: { ...f, hide_label: false },
@@ -341,8 +344,10 @@ function FormStage({
341
344
  showValid: !!touched[f.slug] && !errors[f.slug] && fieldIsComplete(f),
342
345
  onChange: handleFieldChange(
343
346
  f,
344
- view.fields.length === 1 && chunkF3AKYZOH_js.AUTO_ADVANCE_TYPES.includes(f.field_type)
347
+ view.fields.length === 1 && chunkXCYKM2SA_js.AUTO_ADVANCE_TYPES.includes(f.field_type)
345
348
  ),
349
+ onFocus: () => trackFieldFocus(f.slug),
350
+ onBlur: () => trackFieldBlur(f.slug),
346
351
  classPrefix: "sk-stage"
347
352
  },
348
353
  f.id
@@ -413,5 +418,5 @@ function FormStage({
413
418
  }
414
419
 
415
420
  exports.FormStage = FormStage;
416
- //# sourceMappingURL=FormStage-FVKMIV73.js.map
417
- //# sourceMappingURL=FormStage-FVKMIV73.js.map
421
+ //# sourceMappingURL=FormStage-S277U2CP.js.map
422
+ //# sourceMappingURL=FormStage-S277U2CP.js.map