@sonordev/site-kit 5.4.0 → 5.5.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 (318) hide show
  1. package/AGENTS.md +16 -6
  2. package/README.md +9 -7
  3. package/agent-manifest.json +7 -7
  4. package/dist/AnalyticsProvider-KFXAH4GR.mjs +11 -0
  5. package/dist/{AnalyticsProvider-2XIOMRCN.mjs.map → AnalyticsProvider-KFXAH4GR.mjs.map} +1 -1
  6. package/dist/AnalyticsProvider-WDDW3IJW.js +32 -0
  7. package/dist/{AnalyticsProvider-Y2P2BPOI.js.map → AnalyticsProvider-WDDW3IJW.js.map} +1 -1
  8. package/dist/{BlogViewTracker-6EGEDPP3.js → BlogViewTracker-D4DIEP4Q.js} +6 -6
  9. package/dist/{BlogViewTracker-6EGEDPP3.js.map → BlogViewTracker-D4DIEP4Q.js.map} +1 -1
  10. package/dist/{BlogViewTracker-R4YQ76WP.mjs → BlogViewTracker-ZVEGGH3Y.mjs} +5 -5
  11. package/dist/{BlogViewTracker-R4YQ76WP.mjs.map → BlogViewTracker-ZVEGGH3Y.mjs.map} +1 -1
  12. package/dist/ChatWidget-2ZYPYIMQ.js +22 -0
  13. package/dist/{ChatWidget-2OFWPCWF.js.map → ChatWidget-2ZYPYIMQ.js.map} +1 -1
  14. package/dist/ChatWidget-FYCCLMQE.mjs +13 -0
  15. package/dist/{ChatWidget-4AOGHYXQ.mjs.map → ChatWidget-FYCCLMQE.mjs.map} +1 -1
  16. package/dist/EngageWidget-6HUZYOY7.mjs +11 -0
  17. package/dist/{EngageWidget-SFO2XRNG.mjs.map → EngageWidget-6HUZYOY7.mjs.map} +1 -1
  18. package/dist/EngageWidget-MYQTBBW6.js +20 -0
  19. package/dist/{EngageWidget-T4KAAD3G.js.map → EngageWidget-MYQTBBW6.js.map} +1 -1
  20. package/dist/{FileField-CE2XNBBG.js → FileField-JK2S24XU.js} +6 -6
  21. package/dist/{FileField-CE2XNBBG.js.map → FileField-JK2S24XU.js.map} +1 -1
  22. package/dist/{FileField-7DF2SLPF.mjs → FileField-OZZHWGPA.mjs} +5 -5
  23. package/dist/{FileField-7DF2SLPF.mjs.map → FileField-OZZHWGPA.mjs.map} +1 -1
  24. package/dist/{FormSpotlight-ZD3WR5BC.js → FormSpotlight-5AXFQU5M.js} +15 -15
  25. package/dist/{FormSpotlight-ZD3WR5BC.js.map → FormSpotlight-5AXFQU5M.js.map} +1 -1
  26. package/dist/{FormSpotlight-IRLKSZGV.mjs → FormSpotlight-XV42L72H.mjs} +3 -3
  27. package/dist/{FormSpotlight-IRLKSZGV.mjs.map → FormSpotlight-XV42L72H.mjs.map} +1 -1
  28. package/dist/{FormStage-OSPXOUQE.js → FormStage-HATUHNRV.js} +13 -13
  29. package/dist/{FormStage-OSPXOUQE.js.map → FormStage-HATUHNRV.js.map} +1 -1
  30. package/dist/{FormStage-2OSRNQJL.mjs → FormStage-RUK675HV.mjs} +3 -3
  31. package/dist/{FormStage-2OSRNQJL.mjs.map → FormStage-RUK675HV.mjs.map} +1 -1
  32. package/dist/ManagedForm-JWEXJEXK.js +23 -0
  33. package/dist/{ManagedForm-JCHGBBQW.js.map → ManagedForm-JWEXJEXK.js.map} +1 -1
  34. package/dist/ManagedForm-OA3MNGXT.mjs +14 -0
  35. package/dist/{ManagedForm-5G37EDJT.mjs.map → ManagedForm-OA3MNGXT.mjs.map} +1 -1
  36. package/dist/{ManagedNewsletterForm-4LVJZROZ.js → ManagedNewsletterForm-AAHH63KT.js} +8 -8
  37. package/dist/{ManagedNewsletterForm-4LVJZROZ.js.map → ManagedNewsletterForm-AAHH63KT.js.map} +1 -1
  38. package/dist/{ManagedNewsletterForm-QJSVH23S.mjs → ManagedNewsletterForm-HZKTNWLW.mjs} +7 -7
  39. package/dist/{ManagedNewsletterForm-QJSVH23S.mjs.map → ManagedNewsletterForm-HZKTNWLW.mjs.map} +1 -1
  40. package/dist/{SignalCore-L6Z3YTCF.mjs → SignalCore-X3GDGBZD.mjs} +5 -5
  41. package/dist/{SignalCore-L6Z3YTCF.mjs.map → SignalCore-X3GDGBZD.mjs.map} +1 -1
  42. package/dist/{SignalCore-NQ4YEOI7.js → SignalCore-YSNZYBKJ.js} +11 -11
  43. package/dist/{SignalCore-NQ4YEOI7.js.map → SignalCore-YSNZYBKJ.js.map} +1 -1
  44. package/dist/SitemapSync-2PTDBH5E.mjs +9 -0
  45. package/dist/{SitemapSync-MYSTLJOM.mjs.map → SitemapSync-2PTDBH5E.mjs.map} +1 -1
  46. package/dist/SitemapSync-3SFAI546.js +18 -0
  47. package/dist/{SitemapSync-3LUZWBTB.js.map → SitemapSync-3SFAI546.js.map} +1 -1
  48. package/dist/analytics/dispatch.d.ts +4 -4
  49. package/dist/analytics/index.js +15 -15
  50. package/dist/analytics/index.mjs +6 -6
  51. package/dist/{api-NTHZ6PAW.mjs → api-D745LGGU.mjs} +3 -3
  52. package/dist/api-D745LGGU.mjs.map +1 -0
  53. package/dist/{api-N5OLQXYN.js → api-XR5APCH3.js} +3 -3
  54. package/dist/api-XR5APCH3.js.map +1 -0
  55. package/dist/blog/index.js +20 -20
  56. package/dist/blog/index.mjs +3 -3
  57. package/dist/blog/server-ui.js +14 -14
  58. package/dist/blog/server-ui.mjs +2 -2
  59. package/dist/{chunk-WSUQ76LN.js → chunk-2CMSWJWC.js} +18 -18
  60. package/dist/{chunk-WSUQ76LN.js.map → chunk-2CMSWJWC.js.map} +1 -1
  61. package/dist/{chunk-QWLL3B6U.js → chunk-2OU4KBUN.js} +26 -23
  62. package/dist/chunk-2OU4KBUN.js.map +1 -0
  63. package/dist/{chunk-A2VLEORI.mjs → chunk-3B6CXGAK.mjs} +3 -3
  64. package/dist/{chunk-A2VLEORI.mjs.map → chunk-3B6CXGAK.mjs.map} +1 -1
  65. package/dist/{chunk-HMFFAUCD.js → chunk-3DWIYCQX.js} +2 -2
  66. package/dist/chunk-3DWIYCQX.js.map +1 -0
  67. package/dist/{chunk-3EPMDPWI.js → chunk-3SDMJMN2.js} +5 -5
  68. package/dist/{chunk-3EPMDPWI.js.map → chunk-3SDMJMN2.js.map} +1 -1
  69. package/dist/chunk-4U5NCKQY.mjs +39 -0
  70. package/dist/chunk-4U5NCKQY.mjs.map +1 -0
  71. package/dist/{chunk-I4PDSDVE.mjs → chunk-4XGACM7D.mjs} +3 -3
  72. package/dist/{chunk-I4PDSDVE.mjs.map → chunk-4XGACM7D.mjs.map} +1 -1
  73. package/dist/{chunk-HDDV63XJ.mjs → chunk-5TGAUWNO.mjs} +3 -3
  74. package/dist/{chunk-HDDV63XJ.mjs.map → chunk-5TGAUWNO.mjs.map} +1 -1
  75. package/dist/{chunk-RO55G3OA.mjs → chunk-64BOVMXG.mjs} +3 -3
  76. package/dist/{chunk-RO55G3OA.mjs.map → chunk-64BOVMXG.mjs.map} +1 -1
  77. package/dist/{chunk-JJ26JKBJ.mjs → chunk-7PPNXORV.mjs} +3 -3
  78. package/dist/{chunk-JJ26JKBJ.mjs.map → chunk-7PPNXORV.mjs.map} +1 -1
  79. package/dist/{chunk-LHYVFWHL.js → chunk-A3F5GRNJ.js} +8 -8
  80. package/dist/{chunk-LHYVFWHL.js.map → chunk-A3F5GRNJ.js.map} +1 -1
  81. package/dist/{chunk-SZHKNGNR.mjs → chunk-AEARU24Q.mjs} +40 -26
  82. package/dist/chunk-AEARU24Q.mjs.map +1 -0
  83. package/dist/{chunk-HBMF3M5F.js → chunk-BNOQXDPJ.js} +4 -4
  84. package/dist/{chunk-HBMF3M5F.js.map → chunk-BNOQXDPJ.js.map} +1 -1
  85. package/dist/{chunk-5737U6DI.js → chunk-CT5REGAK.js} +15 -15
  86. package/dist/{chunk-5737U6DI.js.map → chunk-CT5REGAK.js.map} +1 -1
  87. package/dist/{chunk-HH5KGXTK.mjs → chunk-DRLHQQBH.mjs} +4 -4
  88. package/dist/{chunk-HH5KGXTK.mjs.map → chunk-DRLHQQBH.mjs.map} +1 -1
  89. package/dist/{chunk-UOLY4NXK.mjs → chunk-DYULWKDC.mjs} +4 -4
  90. package/dist/{chunk-UOLY4NXK.mjs.map → chunk-DYULWKDC.mjs.map} +1 -1
  91. package/dist/chunk-ESP5RMB7.js +42 -0
  92. package/dist/chunk-ESP5RMB7.js.map +1 -0
  93. package/dist/{chunk-LF4L3ZP5.js → chunk-FF5N5D3D.js} +8 -8
  94. package/dist/{chunk-LF4L3ZP5.js.map → chunk-FF5N5D3D.js.map} +1 -1
  95. package/dist/{chunk-ITFZZ6YT.js → chunk-FYVLQ3OU.js} +3 -3
  96. package/dist/{chunk-ITFZZ6YT.js.map → chunk-FYVLQ3OU.js.map} +1 -1
  97. package/dist/{chunk-N6X76QUF.mjs → chunk-G5HUI4BO.mjs} +3 -3
  98. package/dist/{chunk-N6X76QUF.mjs.map → chunk-G5HUI4BO.mjs.map} +1 -1
  99. package/dist/chunk-G6WF4G3E.js +43 -0
  100. package/dist/chunk-G6WF4G3E.js.map +1 -0
  101. package/dist/{chunk-DQM5GR2P.mjs → chunk-HBI67P7Y.mjs} +4 -4
  102. package/dist/{chunk-DQM5GR2P.mjs.map → chunk-HBI67P7Y.mjs.map} +1 -1
  103. package/dist/{chunk-VA36CJRV.js → chunk-HFJQMIFM.js} +4 -4
  104. package/dist/{chunk-VA36CJRV.js.map → chunk-HFJQMIFM.js.map} +1 -1
  105. package/dist/{chunk-VWDT7H6L.js → chunk-HX3BRMOX.js} +3 -3
  106. package/dist/{chunk-VWDT7H6L.js.map → chunk-HX3BRMOX.js.map} +1 -1
  107. package/dist/{chunk-3TXX5KIN.js → chunk-JNRHTZL4.js} +2 -2
  108. package/dist/{chunk-3TXX5KIN.js.map → chunk-JNRHTZL4.js.map} +1 -1
  109. package/dist/{chunk-U53KN4SA.js → chunk-KAUUGRYB.js} +5 -5
  110. package/dist/{chunk-U53KN4SA.js.map → chunk-KAUUGRYB.js.map} +1 -1
  111. package/dist/{chunk-L2LJQIM3.js → chunk-KPKQKFT4.js} +11 -11
  112. package/dist/chunk-KPKQKFT4.js.map +1 -0
  113. package/dist/{chunk-ZLPXFV5Y.js → chunk-MCJF2KJ6.js} +5 -5
  114. package/dist/{chunk-ZLPXFV5Y.js.map → chunk-MCJF2KJ6.js.map} +1 -1
  115. package/dist/{chunk-URVGBWCP.js → chunk-MNYM2XU4.js} +4 -4
  116. package/dist/{chunk-URVGBWCP.js.map → chunk-MNYM2XU4.js.map} +1 -1
  117. package/dist/{chunk-ACTLQ2RH.mjs → chunk-MU7IEPDG.mjs} +4 -4
  118. package/dist/chunk-MU7IEPDG.mjs.map +1 -0
  119. package/dist/chunk-NSWO43XW.mjs +39 -0
  120. package/dist/chunk-NSWO43XW.mjs.map +1 -0
  121. package/dist/{chunk-KMGGAL2X.js → chunk-NZSFOZJV.js} +40 -26
  122. package/dist/chunk-NZSFOZJV.js.map +1 -0
  123. package/dist/{chunk-MIFP6QEQ.mjs → chunk-OFSA7LUH.mjs} +4 -4
  124. package/dist/{chunk-MIFP6QEQ.mjs.map → chunk-OFSA7LUH.mjs.map} +1 -1
  125. package/dist/{chunk-2KIGFOPM.js → chunk-PIPLBBDH.js} +8 -8
  126. package/dist/{chunk-2KIGFOPM.js.map → chunk-PIPLBBDH.js.map} +1 -1
  127. package/dist/{chunk-7PLH3H3W.js → chunk-Q26VZNM2.js} +3 -3
  128. package/dist/{chunk-7PLH3H3W.js.map → chunk-Q26VZNM2.js.map} +1 -1
  129. package/dist/{chunk-GQ6CUOLA.js → chunk-QEGUI2Q2.js} +15 -15
  130. package/dist/{chunk-GQ6CUOLA.js.map → chunk-QEGUI2Q2.js.map} +1 -1
  131. package/dist/{chunk-LBS4PRC7.js → chunk-QFNSM77X.js} +3 -3
  132. package/dist/{chunk-LBS4PRC7.js.map → chunk-QFNSM77X.js.map} +1 -1
  133. package/dist/{chunk-MTANHZKJ.mjs → chunk-R4MX6EOM.mjs} +7 -7
  134. package/dist/{chunk-MTANHZKJ.mjs.map → chunk-R4MX6EOM.mjs.map} +1 -1
  135. package/dist/{chunk-LIYSLNEK.mjs → chunk-RMMHWSPP.mjs} +3 -3
  136. package/dist/{chunk-LIYSLNEK.mjs.map → chunk-RMMHWSPP.mjs.map} +1 -1
  137. package/dist/{chunk-B4BFQSSS.mjs → chunk-RU54J2PY.mjs} +4 -4
  138. package/dist/chunk-RU54J2PY.mjs.map +1 -0
  139. package/dist/{chunk-SJXGIUHP.mjs → chunk-RZUZMUTN.mjs} +9 -8
  140. package/dist/chunk-RZUZMUTN.mjs.map +1 -0
  141. package/dist/{chunk-N6AVWMIB.mjs → chunk-S6FEC6UT.mjs} +9 -5
  142. package/dist/chunk-S6FEC6UT.mjs.map +1 -0
  143. package/dist/{chunk-3DPXOZAU.mjs → chunk-SHLWA6JY.mjs} +2 -2
  144. package/dist/chunk-SHLWA6JY.mjs.map +1 -0
  145. package/dist/{chunk-7IPSQ5JR.js → chunk-SQVYLIIN.js} +11 -7
  146. package/dist/chunk-SQVYLIIN.js.map +1 -0
  147. package/dist/chunk-SUZ3ZLB2.js +8 -0
  148. package/dist/{chunk-UTOHMK52.js.map → chunk-SUZ3ZLB2.js.map} +1 -1
  149. package/dist/{chunk-7Y2UPFSY.mjs → chunk-TALEV3IH.mjs} +3 -3
  150. package/dist/{chunk-7Y2UPFSY.mjs.map → chunk-TALEV3IH.mjs.map} +1 -1
  151. package/dist/{chunk-UOTXSWKZ.mjs → chunk-TP7H6BSK.mjs} +2 -2
  152. package/dist/{chunk-UOTXSWKZ.mjs.map → chunk-TP7H6BSK.mjs.map} +1 -1
  153. package/dist/{chunk-XWF7QPIP.mjs → chunk-TX2QQ7IX.mjs} +3 -3
  154. package/dist/{chunk-XWF7QPIP.mjs.map → chunk-TX2QQ7IX.mjs.map} +1 -1
  155. package/dist/{chunk-AWFZIXCT.js → chunk-UNPEMSLK.js} +12 -11
  156. package/dist/chunk-UNPEMSLK.js.map +1 -0
  157. package/dist/{chunk-NUH245XK.mjs → chunk-UZL2QU2V.mjs} +16 -13
  158. package/dist/chunk-UZL2QU2V.mjs.map +1 -0
  159. package/dist/{chunk-G5I3XEQS.mjs → chunk-V6NOM7PJ.mjs} +3 -3
  160. package/dist/{chunk-G5I3XEQS.mjs.map → chunk-V6NOM7PJ.mjs.map} +1 -1
  161. package/dist/{chunk-ZY5AVC4P.js → chunk-VAS3LH5W.js} +10 -10
  162. package/dist/{chunk-ZY5AVC4P.js.map → chunk-VAS3LH5W.js.map} +1 -1
  163. package/dist/{chunk-KQ3VAOAF.mjs → chunk-VYHRAICF.mjs} +4 -4
  164. package/dist/{chunk-KQ3VAOAF.mjs.map → chunk-VYHRAICF.mjs.map} +1 -1
  165. package/dist/{chunk-LUYUFILE.js → chunk-W5NVW23S.js} +4 -4
  166. package/dist/{chunk-LUYUFILE.js.map → chunk-W5NVW23S.js.map} +1 -1
  167. package/dist/chunk-WDBCXRTT.mjs +6 -0
  168. package/dist/{chunk-7U7C6XRI.mjs.map → chunk-WDBCXRTT.mjs.map} +1 -1
  169. package/dist/{chunk-6CUBSQMD.mjs → chunk-WIZRCI6J.mjs} +3 -3
  170. package/dist/{chunk-6CUBSQMD.mjs.map → chunk-WIZRCI6J.mjs.map} +1 -1
  171. package/dist/{chunk-EBMPXFOP.mjs → chunk-X2XFLYZ3.mjs} +3 -3
  172. package/dist/{chunk-EBMPXFOP.mjs.map → chunk-X2XFLYZ3.mjs.map} +1 -1
  173. package/dist/{chunk-B36PTS7B.mjs → chunk-XQYC4KMH.mjs} +3 -3
  174. package/dist/{chunk-B36PTS7B.mjs.map → chunk-XQYC4KMH.mjs.map} +1 -1
  175. package/dist/{chunk-DPDV5Z4G.js → chunk-YNC5D3FT.js} +12 -12
  176. package/dist/{chunk-DPDV5Z4G.js.map → chunk-YNC5D3FT.js.map} +1 -1
  177. package/dist/{chunk-4WQB2ORG.js → chunk-YYAFHIY7.js} +15 -15
  178. package/dist/chunk-YYAFHIY7.js.map +1 -0
  179. package/dist/{chunk-OXZYP32B.js → chunk-Z6S4MWSR.js} +7 -7
  180. package/dist/{chunk-OXZYP32B.js.map → chunk-Z6S4MWSR.js.map} +1 -1
  181. package/dist/{chunk-ZDFVYSKK.mjs → chunk-ZRQFG3L6.mjs} +5 -5
  182. package/dist/{chunk-ZDFVYSKK.mjs.map → chunk-ZRQFG3L6.mjs.map} +1 -1
  183. package/dist/cli/agent/checks.d.ts.map +1 -1
  184. package/dist/cli/agent/ssr-bailout.d.ts +27 -0
  185. package/dist/cli/agent/ssr-bailout.d.ts.map +1 -0
  186. package/dist/cli/agent/ssr-bailout.test.d.ts +2 -0
  187. package/dist/cli/agent/ssr-bailout.test.d.ts.map +1 -0
  188. package/dist/cli/codemod/transforms.d.ts.map +1 -1
  189. package/dist/cli/index.js +38 -51
  190. package/dist/cli/index.js.map +1 -1
  191. package/dist/cli/index.mjs +36 -49
  192. package/dist/cli/index.mjs.map +1 -1
  193. package/dist/cli/migrator/index.d.ts.map +1 -1
  194. package/dist/client/index.d.ts +1 -0
  195. package/dist/client/index.d.ts.map +1 -1
  196. package/dist/client/index.js +20 -7
  197. package/dist/client/index.js.map +1 -1
  198. package/dist/client/index.mjs +5 -4
  199. package/dist/client/index.mjs.map +1 -1
  200. package/dist/cms/index.js.map +1 -1
  201. package/dist/cms/index.mjs.map +1 -1
  202. package/dist/cms/sanity-image.d.ts +1 -1
  203. package/dist/commerce/index.js +58 -58
  204. package/dist/commerce/index.mjs +7 -7
  205. package/dist/engage/ChatWidget.d.ts.map +1 -1
  206. package/dist/engage/EngageWidget.d.ts +3 -4
  207. package/dist/engage/EngageWidget.d.ts.map +1 -1
  208. package/dist/engage/chat-launcher.test.d.ts +2 -0
  209. package/dist/engage/chat-launcher.test.d.ts.map +1 -0
  210. package/dist/engage/index.js +12 -10
  211. package/dist/engage/index.js.map +1 -1
  212. package/dist/engage/index.mjs +9 -7
  213. package/dist/engage/index.mjs.map +1 -1
  214. package/dist/engage/launcher-placement.d.ts +56 -0
  215. package/dist/engage/launcher-placement.d.ts.map +1 -0
  216. package/dist/engage/launcher-placement.test.d.ts +2 -0
  217. package/dist/engage/launcher-placement.test.d.ts.map +1 -0
  218. package/dist/engage/types.d.ts +41 -7
  219. package/dist/engage/types.d.ts.map +1 -1
  220. package/dist/fleet/index.js +8 -8
  221. package/dist/fleet/index.mjs +4 -4
  222. package/dist/forms/index.js +16 -16
  223. package/dist/forms/index.mjs +9 -9
  224. package/dist/forms/server.js +10 -10
  225. package/dist/forms/server.mjs +8 -8
  226. package/dist/forms/static.js +7 -7
  227. package/dist/forms/static.mjs +6 -6
  228. package/dist/images/ManagedImage.d.ts.map +1 -1
  229. package/dist/images/index.js +11 -11
  230. package/dist/images/index.mjs +4 -4
  231. package/dist/index.js +65 -65
  232. package/dist/index.mjs +11 -11
  233. package/dist/layout/SiteKitClientProviders.d.ts.map +1 -1
  234. package/dist/layout/client.d.ts.map +1 -1
  235. package/dist/layout/client.js +8 -8
  236. package/dist/layout/client.mjs +7 -7
  237. package/dist/layout/index.js +10 -10
  238. package/dist/layout/index.mjs +8 -8
  239. package/dist/layout/types.d.ts +7 -3
  240. package/dist/layout/types.d.ts.map +1 -1
  241. package/dist/llms/generateLLMsTxt.d.ts.map +1 -1
  242. package/dist/llms/index.js +12 -12
  243. package/dist/llms/index.mjs +2 -2
  244. package/dist/llms/types.d.ts +7 -1
  245. package/dist/llms/types.d.ts.map +1 -1
  246. package/dist/maps/index.js +5 -5
  247. package/dist/maps/index.mjs +3 -3
  248. package/dist/mcp/WebMcpTools.d.ts +5 -2
  249. package/dist/mcp/WebMcpTools.d.ts.map +1 -1
  250. package/dist/mcp/client.js.map +1 -1
  251. package/dist/mcp/client.mjs.map +1 -1
  252. package/dist/search/index.js +4 -4
  253. package/dist/search/index.mjs +3 -3
  254. package/dist/seo/LocationPageContent.d.ts +6 -5
  255. package/dist/seo/LocationPageContent.d.ts.map +1 -1
  256. package/dist/seo/api.d.ts +4 -5
  257. package/dist/seo/api.d.ts.map +1 -1
  258. package/dist/seo/client.js +5 -5
  259. package/dist/seo/client.mjs +4 -4
  260. package/dist/seo/index.js +42 -42
  261. package/dist/seo/index.js.map +1 -1
  262. package/dist/seo/index.mjs +8 -8
  263. package/dist/seo/index.mjs.map +1 -1
  264. package/dist/seo/routing.d.ts +9 -23
  265. package/dist/seo/routing.d.ts.map +1 -1
  266. package/dist/seo/server-api.d.ts +11 -5
  267. package/dist/seo/server-api.d.ts.map +1 -1
  268. package/dist/seo/server.js +18 -18
  269. package/dist/seo/server.mjs +2 -2
  270. package/dist/server/index.js +3 -3
  271. package/dist/server/index.mjs +2 -2
  272. package/dist/{server-api-HW4PL2L2.mjs → server-api-RG3ZL3DV.mjs} +3 -3
  273. package/dist/{server-api-HW4PL2L2.mjs.map → server-api-RG3ZL3DV.mjs.map} +1 -1
  274. package/dist/{server-api-DB2SIUP4.js → server-api-RYJQAUGO.js} +21 -21
  275. package/dist/{server-api-DB2SIUP4.js.map → server-api-RYJQAUGO.js.map} +1 -1
  276. package/dist/shared/version.d.ts +1 -1
  277. package/dist/shared/visual-viewport-gap.d.ts +52 -0
  278. package/dist/shared/visual-viewport-gap.d.ts.map +1 -0
  279. package/dist/shared/visual-viewport-gap.test.d.ts +2 -0
  280. package/dist/shared/visual-viewport-gap.test.d.ts.map +1 -0
  281. package/dist/signal/index.js +11 -11
  282. package/dist/signal/index.mjs +2 -2
  283. package/dist/sitemap/index.js +2 -2
  284. package/dist/sitemap/index.mjs +1 -1
  285. package/dist/sync/index.js +17 -17
  286. package/dist/sync/index.mjs +4 -4
  287. package/dist/types.d.ts +9 -0
  288. package/dist/types.d.ts.map +1 -1
  289. package/package.json +1 -1
  290. package/skills/site-kit/SKILL.md +8 -3
  291. package/dist/AnalyticsProvider-2XIOMRCN.mjs +0 -11
  292. package/dist/AnalyticsProvider-Y2P2BPOI.js +0 -32
  293. package/dist/ChatWidget-2OFWPCWF.js +0 -20
  294. package/dist/ChatWidget-4AOGHYXQ.mjs +0 -11
  295. package/dist/EngageWidget-SFO2XRNG.mjs +0 -9
  296. package/dist/EngageWidget-T4KAAD3G.js +0 -18
  297. package/dist/ManagedForm-5G37EDJT.mjs +0 -14
  298. package/dist/ManagedForm-JCHGBBQW.js +0 -23
  299. package/dist/SitemapSync-3LUZWBTB.js +0 -18
  300. package/dist/SitemapSync-MYSTLJOM.mjs +0 -9
  301. package/dist/api-N5OLQXYN.js.map +0 -1
  302. package/dist/api-NTHZ6PAW.mjs.map +0 -1
  303. package/dist/chunk-3DPXOZAU.mjs.map +0 -1
  304. package/dist/chunk-4WQB2ORG.js.map +0 -1
  305. package/dist/chunk-7IPSQ5JR.js.map +0 -1
  306. package/dist/chunk-7U7C6XRI.mjs +0 -6
  307. package/dist/chunk-ACTLQ2RH.mjs.map +0 -1
  308. package/dist/chunk-AWFZIXCT.js.map +0 -1
  309. package/dist/chunk-B4BFQSSS.mjs.map +0 -1
  310. package/dist/chunk-HMFFAUCD.js.map +0 -1
  311. package/dist/chunk-KMGGAL2X.js.map +0 -1
  312. package/dist/chunk-L2LJQIM3.js.map +0 -1
  313. package/dist/chunk-N6AVWMIB.mjs.map +0 -1
  314. package/dist/chunk-NUH245XK.mjs.map +0 -1
  315. package/dist/chunk-QWLL3B6U.js.map +0 -1
  316. package/dist/chunk-SJXGIUHP.mjs.map +0 -1
  317. package/dist/chunk-SZHKNGNR.mjs.map +0 -1
  318. package/dist/chunk-UTOHMK52.js +0 -8
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/forms/FormSpotlight.tsx"],"names":[],"mappings":"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","file":"FormSpotlight-IRLKSZGV.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 isEmptyValue,\n stageEstimate,\n stageFirstName,\n stageViews,\n} from './experience-plan'\nimport type { StageView } from './experience-plan'\nimport type { ExperienceRenderProps, FormField as FormFieldType } from './types'\n\nconst NON_QUESTION_TYPES = ['heading', 'section_header', 'paragraph', 'hidden']\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 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 (NON_QUESTION_TYPES.includes(field.field_type)) {\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 />\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"]}
1
+ {"version":3,"sources":["../src/forms/FormSpotlight.tsx"],"names":[],"mappings":"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","file":"FormSpotlight-XV42L72H.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 isEmptyValue,\n stageEstimate,\n stageFirstName,\n stageViews,\n} from './experience-plan'\nimport type { StageView } from './experience-plan'\nimport type { ExperienceRenderProps, FormField as FormFieldType } from './types'\n\nconst NON_QUESTION_TYPES = ['heading', 'section_header', 'paragraph', 'hidden']\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 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 (NON_QUESTION_TYPES.includes(field.field_type)) {\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 />\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,7 +2,7 @@
2
2
  'use strict';
3
3
 
4
4
  var chunkMVHR77V4_js = require('./chunk-MVHR77V4.js');
5
- var chunk7PLH3H3W_js = require('./chunk-7PLH3H3W.js');
5
+ var chunkQ26VZNM2_js = require('./chunk-Q26VZNM2.js');
6
6
  var chunkIPV2TUAT_js = require('./chunk-IPV2TUAT.js');
7
7
  require('./chunk-SNAQBZPT.js');
8
8
  var react = require('react');
@@ -27,7 +27,7 @@ function FormStage({
27
27
  trackStepChange,
28
28
  honeypot
29
29
  }) {
30
- const fieldControls = chunk7PLH3H3W_js.useFieldControls(config.fields);
30
+ const fieldControls = chunkQ26VZNM2_js.useFieldControls(config.fields);
31
31
  const [activeIndex, setActiveIndex] = react.useState(0);
32
32
  const [visited, setVisited] = react.useState({});
33
33
  const [shakeCount, setShakeCount] = react.useState(0);
@@ -35,7 +35,7 @@ function FormStage({
35
35
  const autoAdvanceTimer = react.useRef(null);
36
36
  const hasInteractedRef = react.useRef(false);
37
37
  const views = react.useMemo(() => {
38
- return chunk7PLH3H3W_js.stageViews(config).map((v) => ({ ...v, fields: v.fields.filter(isFieldVisible) })).filter((v) => v.fields.length > 0);
38
+ return chunkQ26VZNM2_js.stageViews(config).map((v) => ({ ...v, fields: v.fields.filter(isFieldVisible) })).filter((v) => v.fields.length > 0);
39
39
  }, [config, isFieldVisible]);
40
40
  const total = views.length;
41
41
  const questionCount = react.useMemo(
@@ -50,7 +50,7 @@ function FormStage({
50
50
  [views]
51
51
  );
52
52
  const nameField = nameViewIndex >= 0 ? views[nameViewIndex].fields.find((f) => /^first[_-]?name$/i.test(f.slug)) : void 0;
53
- const firstName = nameField ? chunk7PLH3H3W_js.stageFirstName(values[nameField.slug]) : null;
53
+ const firstName = nameField ? chunkQ26VZNM2_js.stageFirstName(values[nameField.slug]) : null;
54
54
  const clearAutoAdvance = react.useCallback(() => {
55
55
  if (autoAdvanceTimer.current !== null) {
56
56
  window.clearTimeout(autoAdvanceTimer.current);
@@ -59,7 +59,7 @@ function FormStage({
59
59
  }, []);
60
60
  react.useEffect(() => clearAutoAdvance, [clearAutoAdvance]);
61
61
  const beatHasValue = react.useCallback(
62
- (index) => (views[index]?.fields || []).some((f) => !chunk7PLH3H3W_js.isEmptyValue(values[f.slug])),
62
+ (index) => (views[index]?.fields || []).some((f) => !chunkQ26VZNM2_js.isEmptyValue(values[f.slug])),
63
63
  [views, values]
64
64
  );
65
65
  const beatComplete = react.useCallback(
@@ -67,7 +67,7 @@ function FormStage({
67
67
  const v = views[index];
68
68
  if (!v) return false;
69
69
  return v.fields.every(
70
- (f) => fieldIsComplete(f) || !f.is_required && chunk7PLH3H3W_js.isEmptyValue(values[f.slug])
70
+ (f) => fieldIsComplete(f) || !f.is_required && chunkQ26VZNM2_js.isEmptyValue(values[f.slug])
71
71
  ) && (beatHasValue(index) || visited[index] === true);
72
72
  },
73
73
  [views, fieldIsComplete, values, beatHasValue, visited]
@@ -146,7 +146,7 @@ function FormStage({
146
146
  (field, soloAutoAdvance) => (value) => {
147
147
  hasInteractedRef.current = true;
148
148
  setFieldValue(field.slug, value);
149
- if (soloAutoAdvance && !chunk7PLH3H3W_js.isEmptyValue(value)) {
149
+ if (soloAutoAdvance && !chunkQ26VZNM2_js.isEmptyValue(value)) {
150
150
  clearAutoAdvance();
151
151
  autoAdvanceTimer.current = window.setTimeout(() => {
152
152
  autoAdvanceTimer.current = null;
@@ -220,7 +220,7 @@ function FormStage({
220
220
  const completeBeats = views.reduce((n, _v, i) => n + (beatComplete(i) ? 1 : 0), 0);
221
221
  const activeView = activeIndex === REST ? null : views[activeIndex];
222
222
  !!activeView && activeView.fields.length > 1;
223
- const activeAllOptionalEmpty = !!activeView && activeView.fields.every((f) => !f.is_required && chunk7PLH3H3W_js.isEmptyValue(values[f.slug]));
223
+ const activeAllOptionalEmpty = !!activeView && activeView.fields.every((f) => !f.is_required && chunkQ26VZNM2_js.isEmptyValue(values[f.slug]));
224
224
  const activeHasTextarea = !!activeView && activeView.fields.some((f) => f.field_type === "textarea");
225
225
  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
226
  return /* @__PURE__ */ jsxRuntime.jsxs(
@@ -237,7 +237,7 @@ function FormStage({
237
237
  /* @__PURE__ */ jsxRuntime.jsx(chunkMVHR77V4_js.StageStyles, {}),
238
238
  /* @__PURE__ */ jsxRuntime.jsxs("header", { className: "sk-stage__head", "data-sk-part": "stage-head", children: [
239
239
  /* @__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 ${chunk7PLH3H3W_js.stageEstimate(questionCount)}` })
240
+ /* @__PURE__ */ jsxRuntime.jsx("span", { className: "sk-stage__head-meta", "data-sk-part": "stage-estimate", children: `Takes ${chunkQ26VZNM2_js.stageEstimate(questionCount)}` })
241
241
  ] }),
242
242
  /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "sk-stage__hud", "data-sk-part": "stage-hud", children: [
243
243
  /* @__PURE__ */ jsxRuntime.jsx(
@@ -277,7 +277,7 @@ function FormStage({
277
277
  /* @__PURE__ */ jsxRuntime.jsx("div", { className: "sk-stage__beats", "data-sk-part": "stage-beats", children: views.map((view, i) => {
278
278
  const isActive = i === activeIndex;
279
279
  const filled = visited[i] === true || beatHasValue(i);
280
- const answers = view.fields.map((f) => chunk7PLH3H3W_js.formatAnswer(values[f.slug])).filter((a) => a !== null);
280
+ const answers = view.fields.map((f) => chunkQ26VZNM2_js.formatAnswer(values[f.slug])).filter((a) => a !== null);
281
281
  const summaryValue = answers.length ? answers.join(" \xB7 ") : filled ? "Skipped" : null;
282
282
  const summaryLabel = view.step?.title || view.fields.map((f) => f.label).join(" \xB7 ");
283
283
  const complete = beatComplete(i) && answers.length > 0;
@@ -341,7 +341,7 @@ function FormStage({
341
341
  showValid: !!touched[f.slug] && !errors[f.slug] && fieldIsComplete(f),
342
342
  onChange: handleFieldChange(
343
343
  f,
344
- view.fields.length === 1 && chunk7PLH3H3W_js.AUTO_ADVANCE_TYPES.includes(f.field_type)
344
+ view.fields.length === 1 && chunkQ26VZNM2_js.AUTO_ADVANCE_TYPES.includes(f.field_type)
345
345
  ),
346
346
  classPrefix: "sk-stage"
347
347
  },
@@ -413,5 +413,5 @@ function FormStage({
413
413
  }
414
414
 
415
415
  exports.FormStage = FormStage;
416
- //# sourceMappingURL=FormStage-OSPXOUQE.js.map
417
- //# sourceMappingURL=FormStage-OSPXOUQE.js.map
416
+ //# sourceMappingURL=FormStage-HATUHNRV.js.map
417
+ //# sourceMappingURL=FormStage-HATUHNRV.js.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/forms/FormStage.tsx"],"names":["useFieldControls","useState","useRef","useMemo","stageViews","useEffect","stageFirstName","useCallback","isEmptyValue","jsxs","jsx","StageStyles","stageEstimate","formatAnswer","SummaryTick","FormField","AUTO_ADVANCE_TYPES","Fragment"],"mappings":"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","file":"FormStage-OSPXOUQE.js","sourcesContent":["'use client'\n\n/**\n * FormStage — the \"stage\" experience: a spotlight ACCORDION. Beats expand and\n * collapse on one surface (paired grid-rows morphs: the active beat blooms\n * while the previous settles into a filled summary row of label · answer ·\n * tick; upcoming beats wait as dim numbered rows). Enter advances: next field\n * in the beat, then the next beat, then the wake-lit submit. Because every\n * answer stays visible, the form is its own review — no confirm screen.\n *\n * A beat is a VIEW, not a field (see experience-plan.ts): consecutive\n * half/third-width fields share a beat exactly like they share a row in the\n * classic grid; full-width fields stand alone; steps break beats.\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. Beat index rides the existing step-tracking pipe,\n * turning form_analytics into a per-beat funnel with zero API changes.\n *\n * Loaded lazily by FormClient — classic-form sites never download it.\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 formatAnswer,\n isEmptyValue,\n stageEstimate,\n stageFirstName,\n stageViews,\n} from './experience-plan'\nimport type { StageView } from './experience-plan'\nimport type { ExperienceRenderProps, FormField as FormFieldType } from './types'\n\n/** -1 = at rest (nothing active — every beat settled, submit has the floor). */\nconst REST = -1\n\nexport function FormStage({\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 honeypot,\n}: ExperienceRenderProps) {\n // Same on-demand date/file controls the classic form uses.\n const fieldControls = useFieldControls(config.fields)\n const [activeIndex, setActiveIndex] = useState(0)\n // Beats deliberately passed through (including skipped-empty optionals) —\n // drives \"Skipped\" vs \"not there yet\" in the settled rows.\n const [visited, setVisited] = useState<Record<number, boolean>>({})\n // Incremented on each rejected advance so the shake animation replays.\n const [shakeCount, setShakeCount] = useState(0)\n\n const formRef = useRef<HTMLFormElement | null>(null)\n const autoAdvanceTimer = useRef<number | null>(null)\n // Focus is only ever moved after the user has interacted — never on load.\n const hasInteractedRef = useRef(false)\n\n // The run respects conditional visibility live — answering an earlier\n // beat can add or remove later ones.\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 total = views.length\n const questionCount = useMemo(\n () => views.reduce((n, v) => n + v.fields.length, 0),\n [views],\n )\n\n // Clamp if a conditional hid beats behind the cursor.\n useEffect(() => {\n if (activeIndex > 0 && activeIndex >= total) setActiveIndex(total - 1)\n }, [activeIndex, total])\n\n // Greeting: the beat right after the first-name answer says hello.\n const nameViewIndex = useMemo(\n () => views.findIndex((v) => v.fields.some((f) => /^first[_-]?name$/i.test(f.slug))),\n [views],\n )\n const nameField =\n nameViewIndex >= 0\n ? views[nameViewIndex].fields.find((f) => /^first[_-]?name$/i.test(f.slug))\n : undefined\n const firstName = nameField ? stageFirstName(values[nameField.slug]) : null\n\n const clearAutoAdvance = useCallback(() => {\n if (autoAdvanceTimer.current !== null) {\n window.clearTimeout(autoAdvanceTimer.current)\n autoAdvanceTimer.current = null\n }\n }, [])\n useEffect(() => clearAutoAdvance, [clearAutoAdvance])\n\n const beatHasValue = useCallback(\n (index: number) =>\n (views[index]?.fields || []).some((f) => !isEmptyValue(values[f.slug])),\n [views, values],\n )\n const beatComplete = useCallback(\n (index: number) => {\n const v = views[index]\n if (!v) return false\n return v.fields.every(\n (f) => fieldIsComplete(f) || (!f.is_required && isEmptyValue(values[f.slug])),\n ) && (beatHasValue(index) || visited[index] === true)\n },\n [views, fieldIsComplete, values, beatHasValue, visited],\n )\n\n const activate = useCallback(\n (index: number) => {\n hasInteractedRef.current = true\n clearAutoAdvance()\n setShakeCount(0)\n setActiveIndex(index)\n if (index !== REST) trackStepChange(index + 1)\n },\n [clearAutoAdvance, trackStepChange],\n )\n\n const advance = useCallback(() => {\n hasInteractedRef.current = true\n clearAutoAdvance()\n const view = views[activeIndex]\n if (!view) return\n let failed = false\n for (const field of view.fields) {\n const error = validateField(field)\n if (error) {\n applyFieldError(field.slug, error)\n failed = true\n }\n }\n if (failed) {\n setShakeCount((n) => n + 1)\n return\n }\n setShakeCount(0)\n setVisited((prev) => ({ ...prev, [activeIndex]: true }))\n if (activeIndex >= views.length - 1) {\n // Every beat settled — the submit takes the floor (wake glow via\n // [data-sk-ready] once momentum completes).\n setActiveIndex(REST)\n } else {\n setActiveIndex(activeIndex + 1)\n trackStepChange(activeIndex + 2)\n }\n }, [views, activeIndex, validateField, applyFieldError, trackStepChange, clearAutoAdvance])\n\n // advance() closes over stale state inside the auto-advance timeout — the\n // ref always points at the freshest render's advance.\n const advanceRef = useRef(advance)\n advanceRef.current = advance\n\n // Validation errors raised by submit()'s validateAll while at rest: travel\n // to the first offending beat, shaking. (Errors raised by advance() are\n // always in the active beat, so this never fights the user's typing.)\n useEffect(() => {\n const index = views.findIndex((v) => v.fields.some((f) => errors[f.slug]))\n if (index >= 0 && index !== activeIndex) {\n setActiveIndex(index)\n setShakeCount((n) => n + 1)\n trackStepChange(index + 1)\n }\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [errors])\n\n // Land focus inside the newly active beat — first errored field after a\n // shake, else the first field. At rest, focus the finale submit so Enter\n // finishes the arc. Only after real interaction, never on load.\n useEffect(() => {\n if (!hasInteractedRef.current) return\n const timer = window.setTimeout(() => {\n if (activeIndex === REST) {\n formRef.current\n ?.querySelector<HTMLElement>('[data-sk-part=\"stage-submit\"]')\n ?.focus()\n return\n }\n const root = formRef.current?.querySelector<HTMLElement>(\n '[data-sk-beat-state=\"active\"]',\n )\n if (!root) return\n const inputs = Array.from(\n root.querySelectorAll<HTMLElement>(\n 'input:not([data-sk-honeypot]), textarea, select',\n ),\n )\n const errored = inputs.find((el) => {\n const name = el.getAttribute('name')\n return name ? !!errors[name] : false\n })\n ;(errored || inputs[0])?.focus({ preventScroll: false })\n }, 90) // let the bloom start so focus scroll lands on settled layout\n return () => window.clearTimeout(timer)\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [activeIndex, shakeCount])\n\n const handleFieldChange = useCallback(\n (field: FormFieldType, soloAutoAdvance: boolean) => (value: unknown) => {\n hasInteractedRef.current = true\n setFieldValue(field.slug, value)\n // A solo single-select beat locks in and advances after a moment — the\n // pick IS the confirmation. Grouped beats and text wait for Enter/OK.\n if (soloAutoAdvance && !isEmptyValue(value)) {\n clearAutoAdvance()\n autoAdvanceTimer.current = window.setTimeout(() => {\n autoAdvanceTimer.current = null\n advanceRef.current()\n }, 380)\n }\n },\n [setFieldValue, clearAutoAdvance],\n )\n\n /** Focusable travel order inside the active beat (excludes radio/checkbox\n — those advance via their own click/auto-advance path). */\n const travelInputs = useCallback((): HTMLElement[] => {\n const root = formRef.current?.querySelector<HTMLElement>(\n '[data-sk-beat-state=\"active\"]',\n )\n if (!root) return []\n return Array.from(\n root.querySelectorAll<HTMLElement>(\n 'input:not([data-sk-honeypot]):not([type=\"radio\"]):not([type=\"checkbox\"]), textarea, select',\n ),\n )\n }, [])\n\n const handleKeyDown = useCallback(\n (e: React.KeyboardEvent<HTMLFormElement>) => {\n if (activeIndex === REST) return\n const target = e.target as HTMLElement\n const tag = target.tagName\n const isField = tag === 'INPUT' || tag === 'TEXTAREA' || tag === 'SELECT'\n if (!isField) return\n\n // Enter does the next thing: next field in the beat, else next beat.\n // Shift+Enter keeps making newlines in long answers.\n if (e.key === 'Enter') {\n if (tag === 'TEXTAREA' && e.shiftKey) return\n e.preventDefault()\n const inputs = travelInputs()\n const index = inputs.indexOf(target)\n if (index >= 0 && index < inputs.length - 1) inputs[index + 1].focus()\n else advance()\n return\n }\n\n // Vertical arrows travel too — but never where they already mean\n // something (textarea caret, select option, number/range steppers).\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') return\n e.preventDefault()\n const inputs = travelInputs()\n const index = inputs.indexOf(target)\n if (e.key === 'ArrowDown') {\n if (index >= 0 && index < inputs.length - 1) inputs[index + 1].focus()\n else advance()\n } else {\n if (index > 0) inputs[index - 1].focus()\n else if (activeIndex > 0) activate(activeIndex - 1)\n }\n }\n },\n [activeIndex, advance, activate, travelInputs],\n )\n\n // Enter inside a beat routes through keydown; form submission here only\n // fires from the beat's OK button. The finale submit is type=\"button\".\n const handleSubmit = useCallback(\n (e: React.FormEvent) => {\n e.preventDefault()\n if (isSubmitting) return\n if (activeIndex !== REST) advance()\n else void submit()\n },\n [activeIndex, isSubmitting, advance, submit],\n )\n\n const handleFinaleSubmit = useCallback(() => {\n hasInteractedRef.current = true\n clearAutoAdvance()\n if (isSubmitting) return\n // validateAll inside submit() surfaces gaps; the errors effect then\n // travels to the first offending beat.\n void submit()\n }, [isSubmitting, submit, clearAutoAdvance])\n\n const ready = momentum.total > 0 ? momentum.done >= momentum.total : true\n const completeBeats = views.reduce((n, _v, i) => n + (beatComplete(i) ? 1 : 0), 0)\n\n const activeView = activeIndex === REST ? null : views[activeIndex]\n const activeIsGroup = !!activeView && activeView.fields.length > 1\n const activeAllOptionalEmpty =\n !!activeView &&\n activeView.fields.every((f) => !f.is_required && isEmptyValue(values[f.slug]))\n const activeHasTextarea =\n !!activeView && activeView.fields.some((f) => f.field_type === 'textarea')\n const eyebrow =\n activeIndex !== REST && firstName && activeIndex === nameViewIndex + 1\n ? { text: `Nice to meet you, ${firstName}.`, greet: true }\n : activeView?.step?.title\n ? { text: activeView.step.title, greet: false }\n : null\n\n return (\n <form\n ref={formRef}\n className={`sk-form sk-stage ${className || ''}`}\n data-sk-part=\"stage\"\n data-sk-state={isSubmitting ? 'submitting' : 'idle'}\n data-sk-ready={activeIndex === REST && ready && total > 0 ? 'true' : undefined}\n onSubmit={handleSubmit}\n onKeyDown={handleKeyDown}\n >\n <StageStyles />\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={total}\n aria-valuenow={completeBeats}\n aria-valuetext={`${completeBeats} of ${total} answered`}\n >\n {views.map((v, i) => (\n <span\n key={v.fields[0].id}\n className=\"sk-stage__seg\"\n data-sk-lit={beatComplete(i) ? '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={activeIndex === REST && ready ? 'true' : undefined}\n aria-live=\"polite\"\n >\n {activeIndex === REST\n ? ready\n ? 'Ready'\n : `${completeBeats} / ${total}`\n : `${activeIndex + 1} / ${total}`}\n </span>\n </div>\n\n <div className=\"sk-stage__beats\" data-sk-part=\"stage-beats\">\n {views.map((view, i) => {\n const isActive = i === activeIndex\n const filled = visited[i] === true || beatHasValue(i)\n const answers = view.fields\n .map((f) => formatAnswer(values[f.slug]))\n .filter((a): a is string => a !== null)\n const summaryValue = answers.length\n ? answers.join(' · ')\n : filled\n ? 'Skipped'\n : null\n const summaryLabel =\n view.step?.title || view.fields.map((f) => f.label).join(' · ')\n const complete = beatComplete(i) && answers.length > 0\n\n return (\n <section\n key={view.fields[0].id}\n className=\"sk-stage__beat\"\n data-sk-part=\"stage-beat\"\n data-sk-beat-state={isActive ? 'active' : filled ? 'filled' : 'upcoming'}\n data-sk-beat-filled={filled ? 'true' : undefined}\n >\n {/* Settled / waiting row — collapses away while active. */}\n <div className=\"sk-stage__collapse sk-stage__collapse--summary\">\n <div inert={isActive ? true : undefined}>\n <div className=\"sk-stage__summary-inner\">\n <button\n type=\"button\"\n className=\"sk-stage__summary\"\n data-sk-part=\"stage-summary\"\n onClick={() => activate(i)}\n >\n <span className=\"sk-stage__summary-idx\" aria-hidden=\"true\">\n {String(i + 1).padStart(2, '0')}\n </span>\n <span className=\"sk-stage__summary-label\">{summaryLabel}</span>\n {summaryValue !== null && (\n <span\n className={\n 'sk-stage__summary-value' +\n (answers.length === 0\n ? ' sk-stage__summary-value--skipped'\n : '')\n }\n >\n {summaryValue}\n {complete && <SummaryTick />}\n </span>\n )}\n </button>\n </div>\n </div>\n </div>\n\n {/* The lit stage — blooms open while everything else settles. */}\n <div className=\"sk-stage__collapse sk-stage__collapse--body\">\n <div inert={isActive ? undefined : true}>\n <div\n key={isActive ? shakeCount : 0}\n className={\n 'sk-stage__body-inner' +\n (isActive && shakeCount > 0 ? ' sk-stage__shake' : '')\n }\n >\n {isActive && eyebrow && (\n <p\n className={\n 'sk-stage__eyebrow' +\n (eyebrow.greet ? ' sk-stage__eyebrow--greet' : '')\n }\n data-sk-part=\"stage-eyebrow\"\n >\n {eyebrow.text}\n </p>\n )}\n <div\n className={\n 'sk-stage__question' +\n (view.fields.length > 1 ? ' sk-stage__question--group' : '')\n }\n data-sk-part=\"stage-question\"\n >\n <div className=\"sk-stage__fields\">\n {view.fields.map((f) => (\n <FormField\n controls={fieldControls}\n key={f.id}\n // The question IS the label — a hide_label form\n // still asks it.\n field={{ ...f, hide_label: false }}\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 classPrefix=\"sk-stage\"\n />\n ))}\n </div>\n <div className=\"sk-stage__actions\" data-sk-part=\"stage-actions\">\n <button\n type=\"submit\"\n className=\"sk-form__btn sk-form__btn--submit\"\n data-sk-part=\"stage-ok\"\n >\n {isActive && activeAllOptionalEmpty ? 'Skip' : 'OK'}\n </button>\n <span className=\"sk-stage__hint\" data-sk-part=\"stage-hint\">\n {isActive && activeHasTextarea ? (\n <>\n <kbd>Enter ↵</kbd> to continue · <kbd>Shift + Enter</kbd>{' '}\n for a new line\n </>\n ) : (\n <>\n press <kbd>Enter ↵</kbd>\n </>\n )}\n </span>\n </div>\n </div>\n </div>\n </div>\n </div>\n </section>\n )\n })}\n </div>\n\n {/* The finale — wakes ([data-sk-ready] pop + breathe) once every\n requirement clears and the run is at rest. */}\n <div className=\"sk-stage__finale\" data-sk-part=\"stage-finale\">\n <button\n type=\"button\"\n className=\"sk-form__btn sk-form__btn--submit\"\n data-sk-part=\"stage-submit\"\n disabled={isSubmitting}\n onClick={handleFinaleSubmit}\n >\n {isSubmitting ? 'Submitting...' : config.submit_button_text}\n </button>\n {activeIndex === REST && ready && (\n <span className=\"sk-stage__hint\">\n press <kbd>Enter ↵</kbd>\n </span>\n )}\n </div>\n\n {submitError && (\n <p\n className=\"sk-stage__submit-error\"\n role=\"alert\"\n style={{ color: 'var(--sk-error, #dc2626)' }}\n >\n {submitError}\n </p>\n )}\n\n {honeypot}\n </form>\n )\n}\n"]}
1
+ {"version":3,"sources":["../src/forms/FormStage.tsx"],"names":["useFieldControls","useState","useRef","useMemo","stageViews","useEffect","stageFirstName","useCallback","isEmptyValue","jsxs","jsx","StageStyles","stageEstimate","formatAnswer","SummaryTick","FormField","AUTO_ADVANCE_TYPES","Fragment"],"mappings":"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","file":"FormStage-HATUHNRV.js","sourcesContent":["'use client'\n\n/**\n * FormStage — the \"stage\" experience: a spotlight ACCORDION. Beats expand and\n * collapse on one surface (paired grid-rows morphs: the active beat blooms\n * while the previous settles into a filled summary row of label · answer ·\n * tick; upcoming beats wait as dim numbered rows). Enter advances: next field\n * in the beat, then the next beat, then the wake-lit submit. Because every\n * answer stays visible, the form is its own review — no confirm screen.\n *\n * A beat is a VIEW, not a field (see experience-plan.ts): consecutive\n * half/third-width fields share a beat exactly like they share a row in the\n * classic grid; full-width fields stand alone; steps break beats.\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. Beat index rides the existing step-tracking pipe,\n * turning form_analytics into a per-beat funnel with zero API changes.\n *\n * Loaded lazily by FormClient — classic-form sites never download it.\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 formatAnswer,\n isEmptyValue,\n stageEstimate,\n stageFirstName,\n stageViews,\n} from './experience-plan'\nimport type { StageView } from './experience-plan'\nimport type { ExperienceRenderProps, FormField as FormFieldType } from './types'\n\n/** -1 = at rest (nothing active — every beat settled, submit has the floor). */\nconst REST = -1\n\nexport function FormStage({\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 honeypot,\n}: ExperienceRenderProps) {\n // Same on-demand date/file controls the classic form uses.\n const fieldControls = useFieldControls(config.fields)\n const [activeIndex, setActiveIndex] = useState(0)\n // Beats deliberately passed through (including skipped-empty optionals) —\n // drives \"Skipped\" vs \"not there yet\" in the settled rows.\n const [visited, setVisited] = useState<Record<number, boolean>>({})\n // Incremented on each rejected advance so the shake animation replays.\n const [shakeCount, setShakeCount] = useState(0)\n\n const formRef = useRef<HTMLFormElement | null>(null)\n const autoAdvanceTimer = useRef<number | null>(null)\n // Focus is only ever moved after the user has interacted — never on load.\n const hasInteractedRef = useRef(false)\n\n // The run respects conditional visibility live — answering an earlier\n // beat can add or remove later ones.\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 total = views.length\n const questionCount = useMemo(\n () => views.reduce((n, v) => n + v.fields.length, 0),\n [views],\n )\n\n // Clamp if a conditional hid beats behind the cursor.\n useEffect(() => {\n if (activeIndex > 0 && activeIndex >= total) setActiveIndex(total - 1)\n }, [activeIndex, total])\n\n // Greeting: the beat right after the first-name answer says hello.\n const nameViewIndex = useMemo(\n () => views.findIndex((v) => v.fields.some((f) => /^first[_-]?name$/i.test(f.slug))),\n [views],\n )\n const nameField =\n nameViewIndex >= 0\n ? views[nameViewIndex].fields.find((f) => /^first[_-]?name$/i.test(f.slug))\n : undefined\n const firstName = nameField ? stageFirstName(values[nameField.slug]) : null\n\n const clearAutoAdvance = useCallback(() => {\n if (autoAdvanceTimer.current !== null) {\n window.clearTimeout(autoAdvanceTimer.current)\n autoAdvanceTimer.current = null\n }\n }, [])\n useEffect(() => clearAutoAdvance, [clearAutoAdvance])\n\n const beatHasValue = useCallback(\n (index: number) =>\n (views[index]?.fields || []).some((f) => !isEmptyValue(values[f.slug])),\n [views, values],\n )\n const beatComplete = useCallback(\n (index: number) => {\n const v = views[index]\n if (!v) return false\n return v.fields.every(\n (f) => fieldIsComplete(f) || (!f.is_required && isEmptyValue(values[f.slug])),\n ) && (beatHasValue(index) || visited[index] === true)\n },\n [views, fieldIsComplete, values, beatHasValue, visited],\n )\n\n const activate = useCallback(\n (index: number) => {\n hasInteractedRef.current = true\n clearAutoAdvance()\n setShakeCount(0)\n setActiveIndex(index)\n if (index !== REST) trackStepChange(index + 1)\n },\n [clearAutoAdvance, trackStepChange],\n )\n\n const advance = useCallback(() => {\n hasInteractedRef.current = true\n clearAutoAdvance()\n const view = views[activeIndex]\n if (!view) return\n let failed = false\n for (const field of view.fields) {\n const error = validateField(field)\n if (error) {\n applyFieldError(field.slug, error)\n failed = true\n }\n }\n if (failed) {\n setShakeCount((n) => n + 1)\n return\n }\n setShakeCount(0)\n setVisited((prev) => ({ ...prev, [activeIndex]: true }))\n if (activeIndex >= views.length - 1) {\n // Every beat settled — the submit takes the floor (wake glow via\n // [data-sk-ready] once momentum completes).\n setActiveIndex(REST)\n } else {\n setActiveIndex(activeIndex + 1)\n trackStepChange(activeIndex + 2)\n }\n }, [views, activeIndex, validateField, applyFieldError, trackStepChange, clearAutoAdvance])\n\n // advance() closes over stale state inside the auto-advance timeout — the\n // ref always points at the freshest render's advance.\n const advanceRef = useRef(advance)\n advanceRef.current = advance\n\n // Validation errors raised by submit()'s validateAll while at rest: travel\n // to the first offending beat, shaking. (Errors raised by advance() are\n // always in the active beat, so this never fights the user's typing.)\n useEffect(() => {\n const index = views.findIndex((v) => v.fields.some((f) => errors[f.slug]))\n if (index >= 0 && index !== activeIndex) {\n setActiveIndex(index)\n setShakeCount((n) => n + 1)\n trackStepChange(index + 1)\n }\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [errors])\n\n // Land focus inside the newly active beat — first errored field after a\n // shake, else the first field. At rest, focus the finale submit so Enter\n // finishes the arc. Only after real interaction, never on load.\n useEffect(() => {\n if (!hasInteractedRef.current) return\n const timer = window.setTimeout(() => {\n if (activeIndex === REST) {\n formRef.current\n ?.querySelector<HTMLElement>('[data-sk-part=\"stage-submit\"]')\n ?.focus()\n return\n }\n const root = formRef.current?.querySelector<HTMLElement>(\n '[data-sk-beat-state=\"active\"]',\n )\n if (!root) return\n const inputs = Array.from(\n root.querySelectorAll<HTMLElement>(\n 'input:not([data-sk-honeypot]), textarea, select',\n ),\n )\n const errored = inputs.find((el) => {\n const name = el.getAttribute('name')\n return name ? !!errors[name] : false\n })\n ;(errored || inputs[0])?.focus({ preventScroll: false })\n }, 90) // let the bloom start so focus scroll lands on settled layout\n return () => window.clearTimeout(timer)\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [activeIndex, shakeCount])\n\n const handleFieldChange = useCallback(\n (field: FormFieldType, soloAutoAdvance: boolean) => (value: unknown) => {\n hasInteractedRef.current = true\n setFieldValue(field.slug, value)\n // A solo single-select beat locks in and advances after a moment — the\n // pick IS the confirmation. Grouped beats and text wait for Enter/OK.\n if (soloAutoAdvance && !isEmptyValue(value)) {\n clearAutoAdvance()\n autoAdvanceTimer.current = window.setTimeout(() => {\n autoAdvanceTimer.current = null\n advanceRef.current()\n }, 380)\n }\n },\n [setFieldValue, clearAutoAdvance],\n )\n\n /** Focusable travel order inside the active beat (excludes radio/checkbox\n — those advance via their own click/auto-advance path). */\n const travelInputs = useCallback((): HTMLElement[] => {\n const root = formRef.current?.querySelector<HTMLElement>(\n '[data-sk-beat-state=\"active\"]',\n )\n if (!root) return []\n return Array.from(\n root.querySelectorAll<HTMLElement>(\n 'input:not([data-sk-honeypot]):not([type=\"radio\"]):not([type=\"checkbox\"]), textarea, select',\n ),\n )\n }, [])\n\n const handleKeyDown = useCallback(\n (e: React.KeyboardEvent<HTMLFormElement>) => {\n if (activeIndex === REST) return\n const target = e.target as HTMLElement\n const tag = target.tagName\n const isField = tag === 'INPUT' || tag === 'TEXTAREA' || tag === 'SELECT'\n if (!isField) return\n\n // Enter does the next thing: next field in the beat, else next beat.\n // Shift+Enter keeps making newlines in long answers.\n if (e.key === 'Enter') {\n if (tag === 'TEXTAREA' && e.shiftKey) return\n e.preventDefault()\n const inputs = travelInputs()\n const index = inputs.indexOf(target)\n if (index >= 0 && index < inputs.length - 1) inputs[index + 1].focus()\n else advance()\n return\n }\n\n // Vertical arrows travel too — but never where they already mean\n // something (textarea caret, select option, number/range steppers).\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') return\n e.preventDefault()\n const inputs = travelInputs()\n const index = inputs.indexOf(target)\n if (e.key === 'ArrowDown') {\n if (index >= 0 && index < inputs.length - 1) inputs[index + 1].focus()\n else advance()\n } else {\n if (index > 0) inputs[index - 1].focus()\n else if (activeIndex > 0) activate(activeIndex - 1)\n }\n }\n },\n [activeIndex, advance, activate, travelInputs],\n )\n\n // Enter inside a beat routes through keydown; form submission here only\n // fires from the beat's OK button. The finale submit is type=\"button\".\n const handleSubmit = useCallback(\n (e: React.FormEvent) => {\n e.preventDefault()\n if (isSubmitting) return\n if (activeIndex !== REST) advance()\n else void submit()\n },\n [activeIndex, isSubmitting, advance, submit],\n )\n\n const handleFinaleSubmit = useCallback(() => {\n hasInteractedRef.current = true\n clearAutoAdvance()\n if (isSubmitting) return\n // validateAll inside submit() surfaces gaps; the errors effect then\n // travels to the first offending beat.\n void submit()\n }, [isSubmitting, submit, clearAutoAdvance])\n\n const ready = momentum.total > 0 ? momentum.done >= momentum.total : true\n const completeBeats = views.reduce((n, _v, i) => n + (beatComplete(i) ? 1 : 0), 0)\n\n const activeView = activeIndex === REST ? null : views[activeIndex]\n const activeIsGroup = !!activeView && activeView.fields.length > 1\n const activeAllOptionalEmpty =\n !!activeView &&\n activeView.fields.every((f) => !f.is_required && isEmptyValue(values[f.slug]))\n const activeHasTextarea =\n !!activeView && activeView.fields.some((f) => f.field_type === 'textarea')\n const eyebrow =\n activeIndex !== REST && firstName && activeIndex === nameViewIndex + 1\n ? { text: `Nice to meet you, ${firstName}.`, greet: true }\n : activeView?.step?.title\n ? { text: activeView.step.title, greet: false }\n : null\n\n return (\n <form\n ref={formRef}\n className={`sk-form sk-stage ${className || ''}`}\n data-sk-part=\"stage\"\n data-sk-state={isSubmitting ? 'submitting' : 'idle'}\n data-sk-ready={activeIndex === REST && ready && total > 0 ? 'true' : undefined}\n onSubmit={handleSubmit}\n onKeyDown={handleKeyDown}\n >\n <StageStyles />\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={total}\n aria-valuenow={completeBeats}\n aria-valuetext={`${completeBeats} of ${total} answered`}\n >\n {views.map((v, i) => (\n <span\n key={v.fields[0].id}\n className=\"sk-stage__seg\"\n data-sk-lit={beatComplete(i) ? '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={activeIndex === REST && ready ? 'true' : undefined}\n aria-live=\"polite\"\n >\n {activeIndex === REST\n ? ready\n ? 'Ready'\n : `${completeBeats} / ${total}`\n : `${activeIndex + 1} / ${total}`}\n </span>\n </div>\n\n <div className=\"sk-stage__beats\" data-sk-part=\"stage-beats\">\n {views.map((view, i) => {\n const isActive = i === activeIndex\n const filled = visited[i] === true || beatHasValue(i)\n const answers = view.fields\n .map((f) => formatAnswer(values[f.slug]))\n .filter((a): a is string => a !== null)\n const summaryValue = answers.length\n ? answers.join(' · ')\n : filled\n ? 'Skipped'\n : null\n const summaryLabel =\n view.step?.title || view.fields.map((f) => f.label).join(' · ')\n const complete = beatComplete(i) && answers.length > 0\n\n return (\n <section\n key={view.fields[0].id}\n className=\"sk-stage__beat\"\n data-sk-part=\"stage-beat\"\n data-sk-beat-state={isActive ? 'active' : filled ? 'filled' : 'upcoming'}\n data-sk-beat-filled={filled ? 'true' : undefined}\n >\n {/* Settled / waiting row — collapses away while active. */}\n <div className=\"sk-stage__collapse sk-stage__collapse--summary\">\n <div inert={isActive ? true : undefined}>\n <div className=\"sk-stage__summary-inner\">\n <button\n type=\"button\"\n className=\"sk-stage__summary\"\n data-sk-part=\"stage-summary\"\n onClick={() => activate(i)}\n >\n <span className=\"sk-stage__summary-idx\" aria-hidden=\"true\">\n {String(i + 1).padStart(2, '0')}\n </span>\n <span className=\"sk-stage__summary-label\">{summaryLabel}</span>\n {summaryValue !== null && (\n <span\n className={\n 'sk-stage__summary-value' +\n (answers.length === 0\n ? ' sk-stage__summary-value--skipped'\n : '')\n }\n >\n {summaryValue}\n {complete && <SummaryTick />}\n </span>\n )}\n </button>\n </div>\n </div>\n </div>\n\n {/* The lit stage — blooms open while everything else settles. */}\n <div className=\"sk-stage__collapse sk-stage__collapse--body\">\n <div inert={isActive ? undefined : true}>\n <div\n key={isActive ? shakeCount : 0}\n className={\n 'sk-stage__body-inner' +\n (isActive && shakeCount > 0 ? ' sk-stage__shake' : '')\n }\n >\n {isActive && eyebrow && (\n <p\n className={\n 'sk-stage__eyebrow' +\n (eyebrow.greet ? ' sk-stage__eyebrow--greet' : '')\n }\n data-sk-part=\"stage-eyebrow\"\n >\n {eyebrow.text}\n </p>\n )}\n <div\n className={\n 'sk-stage__question' +\n (view.fields.length > 1 ? ' sk-stage__question--group' : '')\n }\n data-sk-part=\"stage-question\"\n >\n <div className=\"sk-stage__fields\">\n {view.fields.map((f) => (\n <FormField\n controls={fieldControls}\n key={f.id}\n // The question IS the label — a hide_label form\n // still asks it.\n field={{ ...f, hide_label: false }}\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 classPrefix=\"sk-stage\"\n />\n ))}\n </div>\n <div className=\"sk-stage__actions\" data-sk-part=\"stage-actions\">\n <button\n type=\"submit\"\n className=\"sk-form__btn sk-form__btn--submit\"\n data-sk-part=\"stage-ok\"\n >\n {isActive && activeAllOptionalEmpty ? 'Skip' : 'OK'}\n </button>\n <span className=\"sk-stage__hint\" data-sk-part=\"stage-hint\">\n {isActive && activeHasTextarea ? (\n <>\n <kbd>Enter ↵</kbd> to continue · <kbd>Shift + Enter</kbd>{' '}\n for a new line\n </>\n ) : (\n <>\n press <kbd>Enter ↵</kbd>\n </>\n )}\n </span>\n </div>\n </div>\n </div>\n </div>\n </div>\n </section>\n )\n })}\n </div>\n\n {/* The finale — wakes ([data-sk-ready] pop + breathe) once every\n requirement clears and the run is at rest. */}\n <div className=\"sk-stage__finale\" data-sk-part=\"stage-finale\">\n <button\n type=\"button\"\n className=\"sk-form__btn sk-form__btn--submit\"\n data-sk-part=\"stage-submit\"\n disabled={isSubmitting}\n onClick={handleFinaleSubmit}\n >\n {isSubmitting ? 'Submitting...' : config.submit_button_text}\n </button>\n {activeIndex === REST && ready && (\n <span className=\"sk-stage__hint\">\n press <kbd>Enter ↵</kbd>\n </span>\n )}\n </div>\n\n {submitError && (\n <p\n className=\"sk-stage__submit-error\"\n role=\"alert\"\n style={{ color: 'var(--sk-error, #dc2626)' }}\n >\n {submitError}\n </p>\n )}\n\n {honeypot}\n </form>\n )\n}\n"]}