@mistriwork/mistri 1.0.0-rc.12 → 1.0.0-rc.13
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.
- package/README.md +4 -3
- package/dist/client/assets/LayoutBuilder-MPzkVU2e.js.map +1 -1
- package/dist/client/assets/index-D2dHI6hR.js.map +1 -1
- package/dist/client/assets/shell-TreN_uLs.js.map +1 -1
- package/dist/docs/access-model.md +1 -1
- package/dist/docs/build-and-deploy.md +0 -1
- package/dist/docs/cli.md +1 -1
- package/dist/docs/glossary.md +3 -3
- package/dist/docs/query.md +9 -21
- package/dist/docs/status.md +3 -3
- package/dist/embed/react/chunks/LayoutBuilder-Cbxa_wve.js.map +1 -1
- package/dist/embed/react/chunks/app-0UZ1Re1k.js.map +1 -1
- package/dist/embed/react/chunks/page-Bx4o1kpQ.js.map +1 -1
- package/dist/embed/react/chunks/palette-Bb7Lf6eo.js.map +1 -1
- package/dist/embed/react/chunks/shell-DZRACiB9.js.map +1 -1
- package/dist/embed/react/chunks/write-BQO4CFc9.js.map +1 -1
- package/dist/embed/react/index.js +1 -1
- package/dist/server/build/dockerfile.js +1 -1
- package/dist/server/cli/usage.js +2 -2
- package/dist/ui/index.js +2 -2
- package/dist/ui/page.js +2 -2
- package/dist/ui/{shared-N4Ej8yRD.js → shared-1PD7TOTJ.js} +5 -5
- package/dist/ui/{shared-N4Ej8yRD.js.map → shared-1PD7TOTJ.js.map} +1 -1
- package/dist/ui/{shared-D5m86-4o.js → shared-1gMnOu9J.js} +6 -6
- package/dist/ui/{shared-D5m86-4o.js.map → shared-1gMnOu9J.js.map} +1 -1
- package/dist/ui/{shared-Ctaj8mR2.js → shared-5RQMi4BR.js} +3 -3
- package/dist/ui/{shared-Ctaj8mR2.js.map → shared-5RQMi4BR.js.map} +1 -1
- package/dist/ui/{shared-DpLeIATZ.js → shared-B-BUF9fx.js} +2 -2
- package/dist/ui/{shared-DpLeIATZ.js.map → shared-B-BUF9fx.js.map} +1 -1
- package/dist/ui/{shared-DWYnjItP.js → shared-B-MhiPIN.js} +9 -9
- package/dist/ui/{shared-DWYnjItP.js.map → shared-B-MhiPIN.js.map} +1 -1
- package/dist/ui/{shared-0fNuhSbG.js → shared-B07qIMlE.js} +5 -5
- package/dist/ui/{shared-0fNuhSbG.js.map → shared-B07qIMlE.js.map} +1 -1
- package/dist/ui/{shared-lYtMadRU.js → shared-B1SAS_J-.js} +3 -3
- package/dist/ui/{shared-lYtMadRU.js.map → shared-B1SAS_J-.js.map} +1 -1
- package/dist/ui/{shared-CpI0Y8M5.js → shared-B4jgU8h9.js} +6 -6
- package/dist/ui/{shared-CpI0Y8M5.js.map → shared-B4jgU8h9.js.map} +1 -1
- package/dist/ui/{shared-Cxu1c35l.js → shared-B5aBCUi7.js} +30 -30
- package/dist/ui/{shared-Cxu1c35l.js.map → shared-B5aBCUi7.js.map} +1 -1
- package/dist/ui/{shared-CAe-US1q.js → shared-B9H7_Pji.js} +5 -5
- package/dist/ui/{shared-CAe-US1q.js.map → shared-B9H7_Pji.js.map} +1 -1
- package/dist/ui/{shared-Q2bgBaYo.js → shared-BAXr20S-.js} +4 -4
- package/dist/ui/{shared-Q2bgBaYo.js.map → shared-BAXr20S-.js.map} +1 -1
- package/dist/ui/{shared-CyEefFFb.js → shared-BDDUzH-f.js} +19 -19
- package/dist/ui/{shared-CyEefFFb.js.map → shared-BDDUzH-f.js.map} +1 -1
- package/dist/ui/{shared-BdhPI6dq.js → shared-BGmkeDeW.js} +3 -3
- package/dist/ui/{shared-BdhPI6dq.js.map → shared-BGmkeDeW.js.map} +1 -1
- package/dist/ui/{shared-DONIpq2q.js → shared-BHCQ60yN.js} +2 -2
- package/dist/ui/{shared-DONIpq2q.js.map → shared-BHCQ60yN.js.map} +1 -1
- package/dist/ui/{shared-CNmaAv64.js → shared-BHsjawAG.js} +8 -8
- package/dist/ui/{shared-CNmaAv64.js.map → shared-BHsjawAG.js.map} +1 -1
- package/dist/ui/{shared-DgjU9kOy.js → shared-BIQuK_nq.js} +4 -4
- package/dist/ui/{shared-DgjU9kOy.js.map → shared-BIQuK_nq.js.map} +1 -1
- package/dist/ui/{shared-icSQAj21.js → shared-BOe4W2FI.js} +3 -3
- package/dist/ui/{shared-icSQAj21.js.map → shared-BOe4W2FI.js.map} +1 -1
- package/dist/ui/{shared-BlxoOJSk.js → shared-BPpC08ip.js} +3 -3
- package/dist/ui/{shared-BlxoOJSk.js.map → shared-BPpC08ip.js.map} +1 -1
- package/dist/ui/{shared-BtiFL37J.js → shared-BdA3LPCB.js} +2 -2
- package/dist/ui/{shared-BtiFL37J.js.map → shared-BdA3LPCB.js.map} +1 -1
- package/dist/ui/{shared-CvR94vn4.js → shared-Be3nbWsd.js} +11 -11
- package/dist/ui/{shared-CvR94vn4.js.map → shared-Be3nbWsd.js.map} +1 -1
- package/dist/ui/{shared-Bl_nF_IH.js → shared-Bf30ZLoS.js} +8 -4
- package/dist/ui/shared-Bf30ZLoS.js.map +1 -0
- package/dist/ui/{shared-DijrJ_V-.js → shared-BguP_BaR.js} +7 -7
- package/dist/ui/{shared-DijrJ_V-.js.map → shared-BguP_BaR.js.map} +1 -1
- package/dist/ui/{shared-DPAVoWY0.js → shared-BoLbc2WD.js} +17 -2
- package/dist/ui/{shared-DPAVoWY0.js.map → shared-BoLbc2WD.js.map} +1 -1
- package/dist/ui/{shared-BkdBTYwx.js → shared-BttyOW4W.js} +3 -3
- package/dist/ui/{shared-BkdBTYwx.js.map → shared-BttyOW4W.js.map} +1 -1
- package/dist/ui/{shared-CQWLz8uT.js → shared-BumxsBlA.js} +10 -10
- package/dist/ui/{shared-CQWLz8uT.js.map → shared-BumxsBlA.js.map} +1 -1
- package/dist/ui/{shared-Dzu7tFiC.js → shared-Bw73ktBk.js} +3 -3
- package/dist/ui/{shared-Dzu7tFiC.js.map → shared-Bw73ktBk.js.map} +1 -1
- package/dist/ui/{shared-BhAYErSx.js → shared-C1B0GH0e.js} +4 -4
- package/dist/ui/{shared-BhAYErSx.js.map → shared-C1B0GH0e.js.map} +1 -1
- package/dist/ui/{shared-BQJQcGgj.js → shared-C2FsyYr7.js} +4 -4
- package/dist/ui/{shared-BQJQcGgj.js.map → shared-C2FsyYr7.js.map} +1 -1
- package/dist/ui/{shared-B9lw2Ryh.js → shared-C2RU1qjv.js} +4 -4
- package/dist/ui/{shared-B9lw2Ryh.js.map → shared-C2RU1qjv.js.map} +1 -1
- package/dist/ui/{shared-DQYNI9wO.js → shared-C42f07hJ.js} +5 -5
- package/dist/ui/{shared-DQYNI9wO.js.map → shared-C42f07hJ.js.map} +1 -1
- package/dist/ui/{shared-CqCZ8wMY.js → shared-C4LkPCU4.js} +3 -3
- package/dist/ui/{shared-CqCZ8wMY.js.map → shared-C4LkPCU4.js.map} +1 -1
- package/dist/ui/{shared-BhtpgOpa.js → shared-C4wSfz6k.js} +9 -9
- package/dist/ui/{shared-BhtpgOpa.js.map → shared-C4wSfz6k.js.map} +1 -1
- package/dist/ui/{shared-BHc2Izkj.js → shared-C9DZtSFH.js} +2 -2
- package/dist/ui/{shared-BHc2Izkj.js.map → shared-C9DZtSFH.js.map} +1 -1
- package/dist/ui/{shared-DW1YuiNS.js → shared-CA52ClGo.js} +2 -2
- package/dist/ui/{shared-DW1YuiNS.js.map → shared-CA52ClGo.js.map} +1 -1
- package/dist/ui/{shared-BbSbilkh.js → shared-CBciTwm6.js} +9 -9
- package/dist/ui/{shared-BbSbilkh.js.map → shared-CBciTwm6.js.map} +1 -1
- package/dist/ui/{shared-C-J32eBn.js → shared-CL3RLKDA.js} +16 -16
- package/dist/ui/{shared-C-J32eBn.js.map → shared-CL3RLKDA.js.map} +1 -1
- package/dist/ui/{shared-Ck8S4OxW.js → shared-CLq3-_hW.js} +3 -3
- package/dist/ui/{shared-Ck8S4OxW.js.map → shared-CLq3-_hW.js.map} +1 -1
- package/dist/ui/{shared-Q5WefT7G.js → shared-CMjK-Ucd.js} +3 -3
- package/dist/ui/{shared-Q5WefT7G.js.map → shared-CMjK-Ucd.js.map} +1 -1
- package/dist/ui/{shared-D3MAuEA3.js → shared-CPjpSFGh.js} +2 -2
- package/dist/ui/{shared-D3MAuEA3.js.map → shared-CPjpSFGh.js.map} +1 -1
- package/dist/ui/{shared-VshXGwXP.js → shared-CSPhENq3.js} +2 -2
- package/dist/ui/{shared-VshXGwXP.js.map → shared-CSPhENq3.js.map} +1 -1
- package/dist/ui/{shared-DJrJaE73.js → shared-CZJE4Bmp.js} +3 -3
- package/dist/ui/{shared-DJrJaE73.js.map → shared-CZJE4Bmp.js.map} +1 -1
- package/dist/ui/{shared-D7ONOwI7.js → shared-C_BhUL2I.js} +7 -7
- package/dist/ui/{shared-D7ONOwI7.js.map → shared-C_BhUL2I.js.map} +1 -1
- package/dist/ui/{shared-j-2peBIB.js → shared-CbeujwdU.js} +4 -4
- package/dist/ui/{shared-j-2peBIB.js.map → shared-CbeujwdU.js.map} +1 -1
- package/dist/ui/{shared-D5GrOEa2.js → shared-Cbf-o4Dt.js} +4 -4
- package/dist/ui/{shared-D5GrOEa2.js.map → shared-Cbf-o4Dt.js.map} +1 -1
- package/dist/ui/{shared-HwiPIajr.js → shared-CdNmeNHh.js} +3 -3
- package/dist/ui/{shared-HwiPIajr.js.map → shared-CdNmeNHh.js.map} +1 -1
- package/dist/ui/{shared-ZCFt-CPb.js → shared-CdQOMD8J.js} +3 -3
- package/dist/ui/{shared-ZCFt-CPb.js.map → shared-CdQOMD8J.js.map} +1 -1
- package/dist/ui/{shared-ClhXSGGK.js → shared-CdiPYlTh.js} +2 -2
- package/dist/ui/{shared-ClhXSGGK.js.map → shared-CdiPYlTh.js.map} +1 -1
- package/dist/ui/{shared-DA8_pVRZ.js → shared-CepLAhwm.js} +2 -2
- package/dist/ui/{shared-DA8_pVRZ.js.map → shared-CepLAhwm.js.map} +1 -1
- package/dist/ui/{shared-BrYKjrnM.js → shared-Ch82h_Fu.js} +6 -6
- package/dist/ui/{shared-BrYKjrnM.js.map → shared-Ch82h_Fu.js.map} +1 -1
- package/dist/ui/{shared-C4UrE8Fb.js → shared-Chp88all.js} +3 -3
- package/dist/ui/{shared-C4UrE8Fb.js.map → shared-Chp88all.js.map} +1 -1
- package/dist/ui/{shared-CWa80DTO.js → shared-Ci16s2rN.js} +9 -9
- package/dist/ui/{shared-CWa80DTO.js.map → shared-Ci16s2rN.js.map} +1 -1
- package/dist/ui/{shared-tksTLD6Q.js → shared-CiqNkoE1.js} +5 -5
- package/dist/ui/{shared-tksTLD6Q.js.map → shared-CiqNkoE1.js.map} +1 -1
- package/dist/ui/{shared-yt7DjSrq.js → shared-CpMhOq8F.js} +2 -2
- package/dist/ui/{shared-yt7DjSrq.js.map → shared-CpMhOq8F.js.map} +1 -1
- package/dist/ui/{shared-Dm0z5WUl.js → shared-CrWv5JKH.js} +6 -6
- package/dist/ui/{shared-Dm0z5WUl.js.map → shared-CrWv5JKH.js.map} +1 -1
- package/dist/ui/{shared-CQL3FGHc.js → shared-Csfi3Pti.js} +2 -2
- package/dist/ui/{shared-CQL3FGHc.js.map → shared-Csfi3Pti.js.map} +1 -1
- package/dist/ui/{shared-BKNRbm-V.js → shared-CuZt26rm.js} +2 -2
- package/dist/ui/{shared-BKNRbm-V.js.map → shared-CuZt26rm.js.map} +1 -1
- package/dist/ui/{shared-Guq3upiR.js → shared-Cws_z-TS.js} +2 -2
- package/dist/ui/{shared-Guq3upiR.js.map → shared-Cws_z-TS.js.map} +1 -1
- package/dist/ui/{shared-Bw_qZeIj.js → shared-D1KWuCg6.js} +2 -2
- package/dist/ui/{shared-Bw_qZeIj.js.map → shared-D1KWuCg6.js.map} +1 -1
- package/dist/ui/{shared-CuCZKwXW.js → shared-D66ju_Cb.js} +23 -23
- package/dist/ui/{shared-CuCZKwXW.js.map → shared-D66ju_Cb.js.map} +1 -1
- package/dist/ui/{shared-DYfX7NSM.js → shared-DGaQZXnw.js} +2 -2
- package/dist/ui/{shared-DYfX7NSM.js.map → shared-DGaQZXnw.js.map} +1 -1
- package/dist/ui/{shared-B3Hp8tOv.js → shared-DHy41sET.js} +6 -6
- package/dist/ui/{shared-B3Hp8tOv.js.map → shared-DHy41sET.js.map} +1 -1
- package/dist/ui/{shared-CXyd7IKi.js → shared-DKEOMQ6l.js} +2 -2
- package/dist/ui/{shared-CXyd7IKi.js.map → shared-DKEOMQ6l.js.map} +1 -1
- package/dist/ui/{shared-Ccmc8YO0.js → shared-DSUICuaJ.js} +33 -33
- package/dist/ui/{shared-Ccmc8YO0.js.map → shared-DSUICuaJ.js.map} +1 -1
- package/dist/ui/{shared-CL2iw_js.js → shared-DUPMRoO0.js} +13 -13
- package/dist/ui/{shared-CL2iw_js.js.map → shared-DUPMRoO0.js.map} +1 -1
- package/dist/ui/{shared-Dtp4eRul.js → shared-DVfdm6ah.js} +2 -2
- package/dist/ui/{shared-Dtp4eRul.js.map → shared-DVfdm6ah.js.map} +1 -1
- package/dist/ui/{shared-BJ5Ex32G.js → shared-DXM7d7lJ.js} +3 -3
- package/dist/ui/{shared-BJ5Ex32G.js.map → shared-DXM7d7lJ.js.map} +1 -1
- package/dist/ui/{shared-BFr6ld0e.js → shared-DXbMlcev.js} +2 -2
- package/dist/ui/{shared-BFr6ld0e.js.map → shared-DXbMlcev.js.map} +1 -1
- package/dist/ui/{shared-BUp3jv-N.js → shared-D_SkPtJ9.js} +6 -6
- package/dist/ui/{shared-BUp3jv-N.js.map → shared-D_SkPtJ9.js.map} +1 -1
- package/dist/ui/{shared-CdNomVzH.js → shared-Dd21k2ic.js} +4 -4
- package/dist/ui/{shared-CdNomVzH.js.map → shared-Dd21k2ic.js.map} +1 -1
- package/dist/ui/{shared-gRMbxmpu.js → shared-Dh0nHtLZ.js} +8 -8
- package/dist/ui/{shared-gRMbxmpu.js.map → shared-Dh0nHtLZ.js.map} +1 -1
- package/dist/ui/{shared-BKGJgjog.js → shared-DkOdSpSK.js} +3 -3
- package/dist/ui/{shared-BKGJgjog.js.map → shared-DkOdSpSK.js.map} +1 -1
- package/dist/ui/{shared-BMsh72Uq.js → shared-Dkph5ckT.js} +2 -2
- package/dist/ui/{shared-BMsh72Uq.js.map → shared-Dkph5ckT.js.map} +1 -1
- package/dist/ui/{shared-Be1HpDOB.js → shared-Dl1_Nx--.js} +3 -3
- package/dist/ui/{shared-Be1HpDOB.js.map → shared-Dl1_Nx--.js.map} +1 -1
- package/dist/ui/{shared-BQIZWOoJ.js → shared-Dm0IGbAf.js} +2 -2
- package/dist/ui/{shared-BQIZWOoJ.js.map → shared-Dm0IGbAf.js.map} +1 -1
- package/dist/ui/{shared-DSUtcU5S.js → shared-DnIkTpPr.js} +5 -5
- package/dist/ui/{shared-DSUtcU5S.js.map → shared-DnIkTpPr.js.map} +1 -1
- package/dist/ui/{shared-DsxGbYlV.js → shared-Docl_0tq.js} +3 -3
- package/dist/ui/{shared-DsxGbYlV.js.map → shared-Docl_0tq.js.map} +1 -1
- package/dist/ui/{shared-DZskrV26.js → shared-DprrHC72.js} +2 -2
- package/dist/ui/{shared-DZskrV26.js.map → shared-DprrHC72.js.map} +1 -1
- package/dist/ui/{shared-Bmw43Hwf.js → shared-DyKsJTZs.js} +2 -2
- package/dist/ui/{shared-Bmw43Hwf.js.map → shared-DyKsJTZs.js.map} +1 -1
- package/dist/ui/{shared-BLG88Pya.js → shared-FO7vfI3F.js} +4 -4
- package/dist/ui/{shared-BLG88Pya.js.map → shared-FO7vfI3F.js.map} +1 -1
- package/dist/ui/{shared-DLSd80D1.js → shared-HalAVHjv.js} +3 -3
- package/dist/ui/{shared-DLSd80D1.js.map → shared-HalAVHjv.js.map} +1 -1
- package/dist/ui/{shared-D1mMBLdj.js → shared-JvcI-LWp.js} +15 -15
- package/dist/ui/{shared-D1mMBLdj.js.map → shared-JvcI-LWp.js.map} +1 -1
- package/dist/ui/{shared-C6Hv_4O0.js → shared-K7Ym27yg.js} +2 -2
- package/dist/ui/{shared-C6Hv_4O0.js.map → shared-K7Ym27yg.js.map} +1 -1
- package/dist/ui/{shared-B39ln7oi.js → shared-SzlnwfJO.js} +3 -3
- package/dist/ui/{shared-B39ln7oi.js.map → shared-SzlnwfJO.js.map} +1 -1
- package/dist/ui/{shared-DgPn_Jll.js → shared-TrGbd1FY.js} +3 -3
- package/dist/ui/{shared-DgPn_Jll.js.map → shared-TrGbd1FY.js.map} +1 -1
- package/dist/ui/{shared-DrFb-XtA.js → shared-WhbuObEW.js} +2 -2
- package/dist/ui/{shared-DrFb-XtA.js.map → shared-WhbuObEW.js.map} +1 -1
- package/dist/ui/{shared-DiFQljcq.js → shared-XcSKDp6N.js} +11 -11
- package/dist/ui/{shared-DiFQljcq.js.map → shared-XcSKDp6N.js.map} +1 -1
- package/dist/ui/{shared-CMAg58rY.js → shared-Z4uBJU6I.js} +7 -6
- package/dist/ui/shared-Z4uBJU6I.js.map +1 -0
- package/dist/ui/{shared-BnUptuUp.js → shared-bAgeiRa5.js} +2 -2
- package/dist/ui/{shared-BnUptuUp.js.map → shared-bAgeiRa5.js.map} +1 -1
- package/dist/ui/{shared-BxMvSjey.js → shared-cgXG7OgZ.js} +5 -5
- package/dist/ui/{shared-BxMvSjey.js.map → shared-cgXG7OgZ.js.map} +1 -1
- package/dist/ui/{shared-u4CG2kQJ.js → shared-eZ0SB_zm.js} +2 -2
- package/dist/ui/{shared-u4CG2kQJ.js.map → shared-eZ0SB_zm.js.map} +1 -1
- package/dist/ui/{shared-L90bWW8e.js → shared-frKFb79C.js} +2 -2
- package/dist/ui/{shared-L90bWW8e.js.map → shared-frKFb79C.js.map} +1 -1
- package/dist/ui/{shared-Dd34nhkw.js → shared-hAayNSRA.js} +3 -3
- package/dist/ui/{shared-Dd34nhkw.js.map → shared-hAayNSRA.js.map} +1 -1
- package/dist/ui/{shared-DzC64cpp.js → shared-j_J16p2B.js} +2 -2
- package/dist/ui/{shared-DzC64cpp.js.map → shared-j_J16p2B.js.map} +1 -1
- package/dist/ui/{shared-DX7HRIV-.js → shared-tqpl5N3g.js} +6 -6
- package/dist/ui/{shared-DX7HRIV-.js.map → shared-tqpl5N3g.js.map} +1 -1
- package/dist/ui/{shared-BS5dBMpA.js → shared-y-6_ZDts.js} +2 -2
- package/dist/ui/{shared-BS5dBMpA.js.map → shared-y-6_ZDts.js.map} +1 -1
- package/dist/ui/{shared-Cv5v_MP1.js → shared-zG6e1Rhz.js} +13 -13
- package/dist/ui/{shared-Cv5v_MP1.js.map → shared-zG6e1Rhz.js.map} +1 -1
- package/dist/ui/testing.js +1 -1
- package/package.json +4 -4
- package/dist/docs/cli-browser.md +0 -232
- package/dist/docs/database-browser.md +0 -115
- package/dist/docs/keyboard.md +0 -63
- package/dist/docs/mcp.md +0 -86
- package/dist/ui/shared-Bl_nF_IH.js.map +0 -1
- package/dist/ui/shared-CMAg58rY.js.map +0 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"shared-CpI0Y8M5.js","names":["_Fragment","_Fragment"],"sources":["../../src/shared/commandRefusals.ts","../../src/client/components/formLeaveGuard.ts","../../src/client/components/IntakeNote.tsx","../../src/client/components/ReviewValue.tsx","../../src/client/copy/forms/components/FormSurface.ts","../../src/client/components/FormSurface.tsx"],"sourcesContent":["/**\n * A refused command's fixed words, by code: what the server says when the\n * platform refuses, or a handler refuses by code alone. Shared so a form can\n * tell the platform's fixed sentence — written for an integrator reading the\n * API — from a handler's own reason, written for the person, and say the\n * former in a visitor's words instead (FormSurface.tsx, `formRefusal`).\n */\nexport const COMMAND_REFUSAL_MESSAGES = {\n unauthenticated: 'Sign in to continue.',\n stale_account: 'The signed-in account changed. Reload before continuing.',\n invalid_input: 'The command input is invalid.',\n command_version_mismatch: 'This command version is unavailable. Keep the original request for reconciliation.',\n not_found: 'The record was not found.',\n ineligible_state: 'This record is not eligible for this command.',\n consumes_refused: 'There is not enough left of what this would use.',\n reviewer_unavailable: 'The selected reviewer is unavailable.',\n forbidden: 'This command is not available to this account.',\n idempotency_conflict: 'This request key was already used with different input.',\n duplicate_record: 'A record with this value already exists.',\n stale_record: 'The record has changed. Reload it before trying again.',\n cancelled: 'The command was cancelled.',\n temporarily_unavailable: 'The command could not be completed. Retry with the same request key.',\n row_locked: 'The record is locked by another transaction. Nothing was changed; retry in a moment.',\n invalid_result: 'The command did not produce a valid result.',\n} as const;\n\nexport type CommandRefusalCode = keyof typeof COMMAND_REFUSAL_MESSAGES;\n","/**\n * A form's leave guard, the platform's own: a surface probe that every in-App\n * exit asks (`allowMutationExit` in core.js), and the browser's generic\n * `beforeunload` prompt for a reload, a closed tab or an address typed over\n * it. Browsers ignore any text a page gives that prompt and show it only after\n * the person has interacted with the page; mobile Safari may not show it at\n * all, so `pagehide` is where the page drops its copy of the answers, best\n * effort, before it goes into the back-forward cache.\n *\n * A module of its own because FormSurface, on the first page, arms it; the\n * saved-form API (savedFormApi.ts) arrives with the surfaces that use it.\n */\nimport { registerSurfaceMutationPendingProbe } from '@mistriwork/kit/client/core.js';\nimport { addHostListener, removeHostListener } from '@mistriwork/kit/client/shellHost.js';\n\n/**\n * Arm the leave guard: every in-App exit is refused and the browser asks\n * before the page unloads. `onHide` runs on `pagehide`. The returned function\n * disarms it — on submit, and when the surface goes.\n */\nexport function armLeaveGuard(onHide: () => void): () => void {\n const beforeUnload = (event: BeforeUnloadEvent) => {\n event.preventDefault();\n // Older engines ask for a return value; its text is never shown.\n event.returnValue = '';\n };\n addHostListener(window, 'beforeunload', beforeUnload);\n addHostListener(window, 'pagehide', onHide);\n const release = registerSurfaceMutationPendingProbe(() => true);\n return () => {\n removeHostListener(window, 'beforeunload', beforeUnload);\n removeHostListener(window, 'pagehide', onHide);\n release();\n };\n}\n","/** The quiet line over an intake form's progress bar: an App icon and a sentence (\"Your information is stored securely\"). */\nimport type { AppIconName } from '@mistriwork/engine/shared/appIcons.js';\nimport { Icon } from '@mistriwork/kit/client/components/Icon.js';\n\nexport function IntakeNote({ note }: { note: { icon?: AppIconName; text: string } | undefined }) {\n if (!note) return null;\n return (\n <p className=\"intake-note\">\n {note.icon && <Icon name={note.icon} size={16} />}\n <span>{note.text}</span>\n </p>\n );\n}\n","/**\n * One answer on a review, as its `<dd>` holds it: the words sayInput gives, or — for a group — a short list, a line\n * per member by its label (\"Urgent: Yes\"), which reads on a phone where a comma-run of answers did not. Shared by the\n * one-submit form and the form saved on every step.\n *\n * A reference is the one answer the page cannot say from its own memory: what it holds is a key, and \"1\" names\n * nothing to the person confirming it (a field report: a payment's review said 1 and 2 for the two accounts its\n * pickers had named). Where the form reads its choices, an answer that holds one is said by its record's name, read\n * again by its key as the picker reads (CommandReference.tsx `ReviewNamed`), a part loaded with the picker.\n */\nimport type { AppCommandField } from '../../shared/command.js';\nimport { onDemand } from '@mistriwork/kit/client/components/onDemand.js';\nimport { reviewLines, sayInput } from './reviewValues.js';\nimport type { ChoiceSource } from './CommandReference.js';\n\nconst ReviewNamed = onDemand(() => import('./CommandReference.js'), 'ReviewNamed', { quiet: true });\n\n/** Where a review reads a reference's name: the form's own source, and the reader it reads for. */\nexport interface ReviewSource {\n source: ChoiceSource;\n identityEpoch: number;\n}\n\nexport function ReviewValue({ field, value, from }: { field: AppCommandField; value: unknown; from?: ReviewSource }) {\n if (\n from &&\n (field.type === 'reference'\n ? value !== '' && value != null\n : field.type === 'group' && field.fields.some((member) => member.type === 'reference'))\n )\n return <ReviewNamed field={field} value={value} from={from} />;\n if (field.type === 'group') {\n const lines = reviewLines(field, value);\n if (lines.length > 1)\n return (\n <ul className=\"review-lines\">\n {lines.map((line, index) => (\n <li key={index}>{line}</li>\n ))}\n </ul>\n );\n }\n return <>{sayInput(field, value)}</>;\n}\n","/** What FormSurface says, in the forms room (packages/kit/src/client/messages.ts says how the catalog is split). */\nimport { defineMessages } from '@mistriwork/kit/client/messages.js';\n\nexport const say = defineMessages({\n theFormCouldNotBeSubmitted: 'The form could not be submitted ({status}).',\n tooManySubmissionsFromThisAddress: 'Too many submissions from this address. Try again in {retryAfter} seconds.',\n review: 'Review',\n reviewTitle: 'Review your answers',\n reviewLead: 'Check each section. Change anything that is not right.',\n keepThisReference: 'Keep this reference.',\n received: 'Received',\n yourReference: 'Your reference',\n fillInAnother: 'Fill in another',\n backToApp: 'Back to {name}',\n submit: 'Submit',\n change: 'Change {label}',\n changeStep: 'Change',\n checkThisBoxTo: 'Check this box to continue.',\n thisAnswerWasNot: 'This answer was not accepted. Check it and try again.',\n couldNotReach: 'The form could not be sent. Check your connection and try again.',\n refusedInvalidInput: 'Some answers need another look.',\n refusedVersion: 'This form has changed since the page was opened. Reload the page to continue.',\n refusedNotFound: 'What this form was about is no longer here. Reload the page to continue.',\n refusedIneligible: 'This can’t be sent as it stands. Check your answers and try again.',\n refusedForbidden: 'This form can’t be sent from this page. Reload it and try again.',\n refusedKeyReused: 'This was already sent with different answers. Reload the page to start again.',\n refusedDuplicate: 'Something with these details already exists.',\n refusedStale: 'Something changed while you were filling this in. Reload the page and try again.',\n refusedCancelled: 'It was not sent.',\n refusedUnavailable: 'It could not be sent just now. Try again in a moment; it will not be sent twice.',\n refusedLocked: 'Someone else is changing this record right now. Nothing was sent; try again in a moment.',\n});\n","/**\n * A command form, drawn: one form running one command. The same surface\n * draws a public form — the whole page, in the App's name and dress, for\n * anyone — and a signed-in form, a room of the App with its menu beside\n * it; what differs is who submits (the `submit` the host passes) and,\n * signed in, the reference inputs a directory may fill. With steps it is a\n * stepper, each step checked by the same rules before it is left — a step\n * may name a group, which is then a section of that step; without, one\n * page. Either way the whole is submitted once under a submission key held\n * in memory: a retry after a lost answer replays the same receipt, and\n * nothing typed is ever written to browser storage.\n */\nimport { Fragment, useEffect, useId, useMemo, useRef, useState, type ReactNode } from 'react';\nimport type { AppCommandField } from '../../shared/command.js';\nimport type { FormStep, FormStyle } from '../../shared/formRules.js';\nimport type { AppIconName } from '@mistriwork/engine/shared/appIcons.js';\nimport type { CommandInputValue } from '../commandState.js';\nimport type { DraftRule } from '../../shared/commandDraft.js';\nimport {\n CommandFields,\n CommandLive,\n asksDraftLogic,\n blankCommandValues,\n commandInput,\n commandPathLabel,\n commandProblems,\n draftHidden,\n draftLogic,\n prefilledCommandValues,\n type CommandQuestions,\n type CommandValues,\n} from './CommandFields.js';\nimport { commandFieldAt } from '../../shared/commandInput.js';\nimport { COMMAND_REFUSAL_MESSAGES, type CommandRefusalCode } from '../../shared/commandRefusals.js';\nimport { onDemand, useArrived } from '@mistriwork/kit/client/components/onDemand.js';\nimport { Button } from '@mistriwork/ui/Button.js';\nimport { armLeaveGuard } from './formLeaveGuard.js';\nimport { IntakeNote } from './IntakeNote.js';\nimport { answered, maskedLast4, sensitiveText, stepSaid, type NameOf } from './reviewValues.js';\nimport { knownReferenceName } from './referenceNames.js';\nimport './FormSurface.css';\nimport { ReviewValue, type ReviewSource } from './ReviewValue.js';\nimport { say } from '../copy/forms/components/FormSurface.js';\nimport { fetchServer } from '@mistriwork/kit/client/transport.js';\nimport type { ChallengeWidget, FormGuard, GuardHandle } from './PublicGuard.js';\n\n/* The stepper, its parts and the intake style's sheets are a chunk fetched for a form with steps, never by a public\n page whose form has none (the landing, sign-in, a one-page form). A step's row of fields stands in Columns, which\n comes with the stepper, so a step is never drawn without it. Neither is imported here: what a part loaded on\n demand uses of a module the first page reaches is drawn into the first page's chunk. */\nconst stepping = () => import('@mistriwork/kit/client/components/MultiStepForm.js');\nconst Columns = onDemand(() => import('@mistriwork/ui/FormParts.js'), 'Columns');\n/* A public form's guard — its decoy and, where the App names one, its human check (PublicGuard.tsx) — fetched only\n by a public form, so neither a signed-in page nor a first paint carries it. */\nexport const PublicGuard = onDemand(() => import('./PublicGuard.js'), 'PublicGuard', { quiet: true });\nconst MultiStepForm = onDemand(() => Promise.all([stepping(), Columns.ready()]).then(([module]) => module), 'MultiStepForm');\n\n/**\n * Everything a form asks beyond the fields every form has, fetched before it is first drawn, so a public form's\n * first frame is whole: the stepper (and the intake style's sheets) for a form with steps, the draft's logic for a\n * `when` or a rule, the live lines for a number that has them. A form asking none of these fetches nothing.\n */\nexport async function formArrives(\n form: Pick<FormPresentation, 'input' | 'steps' | 'style' | 'rules' | 'challenge' | 'components'>,\n): Promise<void> {\n const fields = form.input ?? [];\n const lives = (list: readonly AppCommandField[]): boolean =>\n list.some(\n (field) => ((field.type === 'number' || field.type === 'money') && !!field.live) || (field.type === 'group' && lives(field.fields)),\n );\n await Promise.all([\n form.steps\n ? MultiStepForm.ready().then(() => (form.style === 'intake' ? stepping().then((module) => module.loadIntakeStyle()) : undefined))\n : undefined,\n asksDraftLogic(fields, form.rules) ? draftLogic.ready() : undefined,\n lives(fields) ? CommandLive.ready() : undefined,\n form.challenge ? PublicGuard.ready() : undefined,\n // The App's own input components it draws: where they are served, for the kit's slot; their code comes as drawn.\n form.components && Object.keys(form.components).length\n ? import('./sdk/publicInputs.js').then(({ installPublicInputs }) => installPublicInputs(form.components!))\n : undefined,\n ]).catch(() => {});\n}\n\nexport type { CommandValues } from './CommandFields.js';\n\n/** What the surface draws: a form's words, the inputs it asks, and its steps when it has them. */\nexport interface FormPresentation {\n id: string;\n label: string;\n description?: string;\n input: AppCommandField[];\n steps?: FormStep[];\n /** How the steps are drawn: the stepper (the default) or the intake style. */\n style?: FormStyle;\n /** Intake: the quiet line over the progress bar. */\n note?: { icon?: AppIconName; text: string };\n /** Intake: `false` leaves the review out; absent, the last page reviews every answer, editable. */\n review?: false;\n submitLabel?: string;\n done?: { title?: string; description?: string };\n /** The inputs a link's address may start filled. */\n prefillable?: string[];\n /** The inputs drawn by the App's own input components, by the form (`inputs`); a field may name its own (`input`). */\n inputs?: Readonly<Record<string, { id: string }>>;\n /** A public form: where each input component it draws is served (http/formRoutes.ts), loaded as it is drawn. */\n components?: Readonly<Record<string, { href: string; css?: string }>>;\n /** Saved on every step (SavedFormSurface.tsx): the inputs the submit itself asks, on the review. */\n save?: { submit: string[] };\n /** The command's rules over the draft: each is said at its field on the step that asks the last field it names. */\n rules?: readonly DraftRule[];\n /** A public form's human check (`auth.challenge`): the provider's widget, drawn in its slot (PublicGuard.tsx). */\n challenge?: ChallengeWidget;\n}\n/** What a submission answers: the handler's reference when it gave one, and the receipt. */\nexport interface FormReceipt {\n reference?: string;\n /** What the command's own result said it did, where it said one: shown in place of the form's static description. */\n message?: string;\n receipt: { id: string; status: string };\n}\ntype SubmitForm = (submission: string, input: CommandInputValue, guard?: FormGuard) => Promise<FormReceipt>;\n\nexport async function submitPublicForm(\n id: string,\n submission: string,\n input: CommandInputValue,\n via?: string,\n guard: FormGuard = {},\n): Promise<FormReceipt> {\n // `via` is the intake address the page was published with (a tenant App's);\n // the server alone decides what it means, and an ordinary App ignores it.\n let res: Response;\n try {\n res = await fetchServer(`/api/forms/${encodeURIComponent(id)}${via ? `?via=${encodeURIComponent(via)}` : ''}`, {\n method: 'POST',\n credentials: 'same-origin',\n signal: AbortSignal.timeout(30_000),\n headers: { 'content-type': 'application/json', ...(guard.challenge ? { 'x-mistri-challenge': guard.challenge } : {}) },\n body: JSON.stringify({ input, submission, ...(guard.trap ? { trap: guard.trap } : {}) }),\n });\n } catch {\n // No answer at all: \"Failed to fetch\", or the timeout's abort, is the browser's sentence, not the visitor's.\n throw new Error(say('couldNotReach'));\n }\n let data: Record<string, unknown> = {};\n try {\n data = await res.json();\n } catch {\n /* the status is the answer */\n }\n if (res.ok && typeof data.reference === 'string') return data as unknown as FormReceipt;\n const retryAfter = Number(res.headers.get('retry-after') ?? data.retryAfter);\n throw Object.assign(new Error(String(data.message || data.error || say('theFormCouldNotBeSubmitted', { status: res.status }))), {\n status: res.status,\n code: typeof data.code === 'string' ? data.code : undefined,\n field: typeof data.field === 'string' ? data.field : undefined,\n retryAfter: Number.isFinite(retryAfter) && retryAfter > 0 ? retryAfter : undefined,\n });\n}\n\ninterface Failure {\n message: string;\n code?: string;\n field?: string;\n retryAfter?: number;\n status?: number;\n}\n\n/* The platform's fixed refusals, in a visitor's words. Those are written for\n an integrator reading the API (\"The command input is invalid.\"); a form is\n read by the person filling it in. A code whose fixed words already read so\n (sign in, the account changed) keeps them; a handler's own reason is never\n replaced — it is the one sentence written for this reader. */\nconst REFUSED: Partial<Record<CommandRefusalCode, () => string>> = {\n invalid_input: () => say('refusedInvalidInput'),\n command_version_mismatch: () => say('refusedVersion'),\n not_found: () => say('refusedNotFound'),\n ineligible_state: () => say('refusedIneligible'),\n forbidden: () => say('refusedForbidden'),\n idempotency_conflict: () => say('refusedKeyReused'),\n duplicate_record: () => say('refusedDuplicate'),\n stale_record: () => say('refusedStale'),\n cancelled: () => say('refusedCancelled'),\n temporarily_unavailable: () => say('refusedUnavailable'),\n row_locked: () => say('refusedLocked'),\n invalid_result: () => say('refusedUnavailable'),\n};\n\n/** What a refusal says, twice over: `beside` its field when there is one, and `alone` on the form's own line, naming where. */\ninterface FormRefusal {\n field?: string;\n beside: string;\n alone: string;\n}\n\n/**\n * What the person reads for a refusal. A field the server names is said as\n * the form's own rules say it, where they find the same problem — the server\n * read it by the same rules; where they do not (the handler's own check), a\n * box left unchecked is asked to be checked, and any other answer to be\n * looked at again. Away from its field the sentence says where the field is:\n * its label, its section and row. A wait is said as a wait, a dropped\n * connection as one, never the browser's words for it.\n */\nexport function formRefusal(failure: Failure, fields: readonly AppCommandField[], values: CommandValues = {}): FormRefusal {\n if (failure.status === 429) {\n const said = say('tooManySubmissionsFromThisAddress', { retryAfter: failure.retryAfter ?? 60 });\n return { beside: said, alone: said };\n }\n const code = failure.code as CommandRefusalCode | undefined;\n const fixed = code !== undefined && Object.hasOwn(COMMAND_REFUSAL_MESSAGES, code) && failure.message === COMMAND_REFUSAL_MESSAGES[code];\n const where = failure.field ? commandPathLabel(fields, failure.field) : undefined;\n if (failure.field && where) {\n const names = new Set(fields.map((field) => field.name));\n const own = commandProblems(fields, Object.fromEntries(Object.entries(values).filter(([name]) => names.has(name))))[failure.field];\n const field = commandFieldAt(fields, failure.field);\n const unchecked = field?.type === 'boolean' && field.as !== 'buttons' && values[failure.field] !== true;\n const beside = own ?? (!fixed ? failure.message : unchecked ? say('checkThisBoxTo') : say('thisAnswerWasNot'));\n // A sentence that already names its field is not prefixed with the name again.\n return { field: failure.field, beside, alone: field && beside.includes(field.label) ? beside : `${where}: ${beside}` };\n }\n const said = fixed ? (REFUSED[code]?.() ?? failure.message) : failure.message;\n return { beside: said, alone: said };\n}\n\n/** The top-level names a set of fields draws: whether a refusal's field is on screen is whether its root is one. */\nexport const drawsField = (fields: readonly AppCommandField[], path: string | undefined): boolean =>\n path !== undefined && fields.some((field) => field.name === path.split(/[.[]/)[0]);\n\n/**\n * Where a form starts: blank, or — from a link that fills some in, as a car's\n * page does (`?stock_ref=FC-1049`) — those inputs set. Only the inputs the\n * form names `prefillable` are read, and only as typed text: the command\n * checks them as it checks anything typed, and the reader sees them and may\n * change them. Anything else in the address is ignored, and a form that\n * names none starts blank whatever its address says.\n */\nexport function startingValues(\n fields: readonly AppCommandField[],\n allowed: readonly string[] = [],\n search = typeof window === 'undefined' ? '' : window.location.search,\n initial: Readonly<Record<string, unknown>> = {},\n): CommandValues {\n const params = new URLSearchParams(search);\n // What the server prepared starts the form; the address's own words stand over it.\n const given: Record<string, unknown> = { ...initial };\n for (const field of fields) {\n if (!allowed.includes(field.name) || field.type === 'group' || field.type === 'boolean') continue;\n const value = params.get(field.name);\n if (value !== null && value.length <= 4000) given[field.name] = value;\n }\n return Object.keys(given).length ? prefilledCommandValues(fields, given) : blankCommandValues(fields);\n}\n\n/** The top-level field a path belongs to: `trade_ins[1].stock` is `trade_ins`'s. */\nconst rootOf = (path: string) => path.split(/[.[]/)[0];\n\nconst REVIEW = '#review';\n\n/** A review lists what was answered, and what had to be: a question that could be left empty and was is left out. */\nexport const shownOnReview = (field: AppCommandField, value: unknown) => answered(value) || ('required' in field && !!field.required);\n\nexport function FormSurface({\n form,\n appName,\n submit,\n connection,\n visitor,\n identityEpoch = 0,\n again = false,\n prefill,\n initial,\n questions,\n onDismiss,\n homeHref,\n review = false,\n attempt,\n inDialog = false,\n checkStep,\n}: {\n form: FormPresentation;\n appName: string;\n submit: SubmitForm;\n /** Optional placed-operation owner, loaded only by a placed public form. */\n attempt?: {\n submission: string;\n values?: CommandValues;\n receipt?: FormReceipt;\n locked: boolean;\n recovery?: ReactNode;\n capture(values: CommandValues): void;\n };\n /** A public form with steps: a last step reviewing every answer from this page's memory, and leaving guarded until it is sent.\n An intake form decides this itself (its own `review`, on unless it says false), signed in or not. */\n review?: boolean;\n /** Drawn in a dialog: the step's title is the dialog's heading and the actions stay at its foot. */\n inDialog?: boolean;\n /** The server's word on the steps so far, asked once the page's own check of a step passes: field path → what is\n wrong with it. A step with a problem marks its fields and does not go on. */\n checkStep?: (stepId: string, input: CommandInputValue, names: readonly string[]) => Promise<Record<string, string> | undefined>;\n /** Where the form starts, as a query string. The form's own page reads the\n address it was opened at; a form drawn over a record (FormDialog) is\n handed the same string instead, so both routes start the same way. */\n prefill?: string;\n /** A signed-in form's prepared starting values (`initial()`, `default: me`), under the address's own. */\n initial?: Readonly<Record<string, unknown>>;\n /** A signed-in form's questions defined in rows, as its prepare read them (`field.defined`). */\n questions?: CommandQuestions;\n /** Signed in: the connection a reference input's choices are read from. */\n connection?: string;\n /** A public form's App (and its intake address), where a reference input's choices are read signed out. */\n visitor?: { app: string; via?: string };\n identityEpoch?: number;\n /** Offer the form again after a receipt: a signed-in desk's next entry, never a public applicant's second application. */\n again?: boolean;\n /** Drawn in a dialog over the page the reader came from: Cancel beside the submit, and Done once received, each back to it. */\n onDismiss?: () => void;\n /** A public page's way back once received: the App's home, said as a quiet \"Back to <App>\" under the receipt. */\n homeHref?: string;\n}) {\n const id = useId();\n const fields = form.input;\n /* A rule is judged in the browser once the draft's logic is here (CommandFields.tsx); a `when` waits in CommandFields. */\n useArrived(draftLogic, !!form.rules?.length);\n const byName = useMemo(() => new Map(fields.map((field) => [field.name, field])), [fields]);\n const [values, setValues] = useState<CommandValues>(\n () => attempt?.values ?? startingValues(fields, form.prefillable, attempt?.locked ? '' : prefill, initial),\n );\n const [problems, setProblems] = useState<Record<string, string>>({});\n const [failure, setFailure] = useState('');\n /* A public form's guard (PublicGuard.tsx), held while it is drawn. */\n const guarded = useRef<GuardHandle | undefined>(undefined);\n const [pending, setPending] = useState(false);\n const [submittedReceipt, setReceipt] = useState<FormReceipt | null>(null);\n const receipt = attempt?.receipt ?? submittedReceipt;\n const surface = useRef<HTMLElement>(null);\n const focusIntent = useRef<'invalid' | 'first' | null>(null);\n const [focusRequest, setFocusRequest] = useState(0);\n const requestFocus = (intent: 'invalid' | 'first') => {\n focusIntent.current = intent;\n setFocusRequest((before) => before + 1);\n };\n useEffect(() => {\n if (pending) return;\n const root = surface.current;\n if (receipt) {\n root?.querySelector<HTMLElement>('h1')?.focus({ preventScroll: true });\n return;\n }\n const intent = attempt?.recovery ? 'invalid' : focusIntent.current;\n if (!intent) return;\n focusIntent.current = null;\n const controls = 'input:not([type=\"hidden\"]):not(:disabled), textarea:not(:disabled), select:not(:disabled), button:not(:disabled)';\n const invalid = root?.querySelector<HTMLElement>('[aria-invalid=\"true\"]');\n const target =\n intent === 'first'\n ? root?.querySelector('.command-fields')?.querySelector<HTMLElement>(controls)\n : invalid?.matches(controls)\n ? invalid\n : invalid?.querySelector<HTMLElement>(controls);\n // Off-step server errors still have a reachable summary; the stepper owns its own validation focus.\n // preventScroll: the focus must not move the page on its inline axis (rule 10); a step arrives at its top by its own scroll.\n (target ?? root?.querySelector<HTMLElement>('.form-page-failure:not([hidden])'))?.focus({ preventScroll: true });\n }, [focusRequest, receipt, pending, Boolean(attempt?.recovery)]);\n /* One key for one filling-in. A second click after a lost answer carries\n the same key, so the server answers with the same receipt instead of a\n second submission. In memory only. */\n const submission = useRef(attempt?.submission ?? crypto.randomUUID());\n const stepFields = (step: FormStep): AppCommandField[] => step.fields.flatMap((name) => byName.get(name) ?? []);\n const intake = form.style === 'intake' && !!form.steps;\n // An intake form decides its review itself; the stepper's is the public host's to ask for.\n const reviewing = !!form.steps && (intake ? form.review !== false : review);\n const steps = useMemo(\n () =>\n form.steps && reviewing\n ? [\n ...form.steps,\n intake\n ? { id: REVIEW, label: say('review'), fields: [], title: say('reviewTitle'), lead: say('reviewLead') }\n : { id: REVIEW, label: say('review'), fields: [] },\n ]\n : form.steps,\n [form.steps, reviewing, intake],\n );\n const [current, setCurrent] = useState(0);\n /* Once anything is typed, leaving asks first, until the receipt: what was\n typed lives in this page alone, and a reload loses it. */\n const holds = (field: AppCommandField | undefined, value: unknown): boolean =>\n field?.type === 'group'\n ? JSON.stringify(value) !== JSON.stringify(blankCommandValues([field])[field.name])\n : field?.type === 'lines'\n ? // A grid's blank line is where it starts; a line with anything in it is typed.\n Array.isArray(value) && value.some((row) => Object.values((row as { values?: object }).values ?? {}).some(Boolean))\n : value !== undefined && value !== null && value !== '' && value !== false && !(Array.isArray(value) && !value.length);\n const typed = reviewing && !receipt && Object.entries(values).some(([name, value]) => holds(byName.get(name), value));\n /* A sensitive answer on the review shows its last four; Change asks for it again. The names asked for again. */\n const [asked, setAsked] = useState<ReadonlySet<string>>(new Set());\n /* The review's steps opened by their Change, to be answered again in place. */\n const [opened, setOpened] = useState<ReadonlySet<string>>(new Set());\n useEffect(() => (typed ? armLeaveGuard(() => setValues(blankCommandValues(fields))) : undefined), [typed]);\n\n /** Mark every problem in these fields, groups and rows included, and clear what they no longer have. */\n const check = (checked: readonly AppCommandField[]): boolean => {\n const names = new Set(checked.map((field) => field.name));\n const found = commandProblems(checked, Object.fromEntries(Object.entries(values).filter(([name]) => names.has(name))), questions, {\n whole: { fields, values },\n ...(form.rules ? { rules: form.rules } : {}),\n });\n setProblems((before) => ({ ...Object.fromEntries(Object.entries(before).filter(([path]) => !names.has(rootOf(path)))), ...found }));\n if (!form.steps && Object.keys(found).length) requestFocus('invalid');\n return Object.keys(found).length === 0;\n };\n\n const change = (next: CommandValues, path: string) => {\n if (attempt?.locked) return;\n setValues(next);\n // A changed field, or a group whose rows moved, drops what was said about it and everything under it.\n setProblems((before) =>\n Object.fromEntries(\n Object.entries(before).filter(\n ([problem]) => problem !== path && !problem.startsWith(`${path}.`) && !problem.startsWith(`${path}[`),\n ),\n ),\n );\n };\n\n const complete = async () => {\n if (pending || attempt?.locked) return;\n setFailure('');\n let input: CommandInputValue;\n try {\n input = commandInput(fields, values, questions, form.rules ? { rules: form.rules } : {});\n } catch (error) {\n setFailure((error as Error).message);\n requestFocus('invalid');\n return;\n }\n setPending(true);\n attempt?.capture(values);\n try {\n /* Sent in the press's own turn unless a human check's token is still on its way (PublicGuard.tsx take): a form\n closed during its send has already sent. */\n const taken = guarded.current?.take() ?? {};\n const guard = taken instanceof Promise ? await taken : taken;\n setReceipt(await submit(submission.current, input, guard));\n } catch (error) {\n const refusal = formRefusal(error as Failure, fields, values);\n /* One place for each problem: beside its field when the field is on\n screen, else the form's own line, naming it. Kept on the field too,\n so a step opened to fix it shows it there. */\n const shown = drawsField(\n // An editable review draws every step's fields again, so a refusal is beside its field wherever the field is.\n steps && !(intake && reviewing) ? stepFields(steps[steps.length - 1]) : fields,\n refusal.field,\n );\n if (refusal.field) setProblems((before) => ({ ...before, [refusal.field!]: refusal.beside }));\n if (!shown) setFailure(refusal.alone);\n requestFocus('invalid');\n } finally {\n // A token is spent once: the widget is asked for a fresh one for the next send.\n guarded.current?.reset();\n setPending(false);\n }\n };\n\n const startAgain = () => {\n submission.current = crypto.randomUUID();\n // The next entry starts as the first did, from what the server prepared, and not from the address.\n setValues(initial ? startingValues(fields, [], '', initial) : blankCommandValues(fields));\n setProblems({});\n setFailure('');\n setReceipt(null);\n requestFocus('first');\n };\n\n if (receipt) {\n const message = receipt.message ?? form.done?.description ?? (receipt.reference ? say('keepThisReference') : undefined);\n return (\n <section ref={surface} className=\"form-page form-page-done\" aria-labelledby={`${id}-done`}>\n {!intake && <p className=\"eyebrow\">{appName}</p>}\n <h1 id={`${id}-done`} tabIndex={-1}>\n {form.done?.title ?? say('received')}\n </h1>\n {receipt.reference && (\n <>\n <p className=\"form-page-reference-label\">{say('yourReference')}</p>\n <p className=\"form-page-reference\">\n <strong>{receipt.reference}</strong>\n </p>\n </>\n )}\n {message && <p className=\"form-page-done-message\">{message}</p>}\n {again && !attempt && form.input.length > 0 && (\n <p>\n <Button intent=\"secondary\" onClick={startAgain}>\n {say('fillInAnother')}\n </Button>\n </p>\n )}\n {onDismiss && (\n <div className=\"form-actions\">\n <Button intent=\"primary\" onClick={onDismiss}>\n {say('common.done')}\n </Button>\n </div>\n )}\n {/* A page has nowhere to be dismissed to: the receipt ends in a quiet way back, never a dead end. */}\n {!onDismiss && homeHref && (\n <p className=\"form-page-done-home\">\n <a href={homeHref}>{say('backToApp', { name: appName })}</a>\n </p>\n )}\n </section>\n );\n }\n\n const controls = (list: readonly AppCommandField[]) => (\n <CommandFields\n fields={list}\n values={values}\n problems={problems}\n idPrefix={id}\n disabled={pending || attempt?.locked}\n identityEpoch={identityEpoch}\n isCurrent={() => true}\n onChange={change}\n presentation={intake ? 'intake' : 'stepper'}\n whole={{ fields, values }}\n inputs={form.inputs}\n {...(connection === undefined ? {} : { connection })}\n {...(visitor === undefined ? {} : { visitor })}\n {...(questions ? { questions } : {})}\n />\n );\n const submitLabel = form.submitLabel ?? say('submit');\n /* Where a reference's choices are read, and so its name: the reader's connection, or the visitor's signed-out read. */\n const source = connection !== undefined ? connection : visitor ? { visitor } : undefined;\n const from: ReviewSource | undefined = source === undefined ? undefined : { source, identityEpoch };\n /* The steps so far say a reference by the name its picker read for its key, never by the key. */\n const nameOf: NameOf = (field, value) => (source === undefined ? undefined : knownReferenceName(field, source, identityEpoch, value));\n /** A step's fields as it draws them: a row side by side, the rest one to a line. On the review, a sensitive answer\n is its last four and a way to ask for it again. */\n const body = (step: FormStep, onReview = false) =>\n (step.rows ?? step.fields.map((name) => [name])).map((row, index) => {\n const cells = row.map((name) => {\n const field = byName.get(name);\n if (!field) return null;\n if (onReview && sensitiveText(field) && holds(field, values[name]) && !asked.has(name))\n return (\n <div key={name} className=\"intake-masked\">\n <span className=\"intake-masked-label\">{field.label}</span>\n <span className=\"intake-masked-line\">\n <span className=\"intake-masked-value\">{maskedLast4(String(values[name]), field.mask)}</span>\n <Button\n intent=\"secondary\"\n size=\"compact\"\n disabled={pending}\n aria-label={say('change', { label: field.label })}\n onClick={() => {\n change({ ...values, [name]: '' }, name);\n setAsked((before) => new Set(before).add(name));\n }}\n >\n {say('changeStep')}\n </Button>\n </span>\n </div>\n );\n return <Fragment key={name}>{controls([field])}</Fragment>;\n });\n return cells.length > 1 ? <Columns key={index}>{cells}</Columns> : <Fragment key={index}>{cells}</Fragment>;\n });\n /** The intake style's review: every step's answers as a summary under its name, and a Change that opens that\n step's fields in place, live. A step holding a problem is open, so a refusal is drawn beside its field. */\n const editableReview = () => {\n const Heading = inDialog ? 'h3' : 'h2';\n const hiddenNow = draftHidden(fields, values);\n const troubled = (step: FormStep) =>\n stepFields(step).some((field) =>\n Object.keys(problems).some(\n (key) => problems[key] && (key === field.name || key.startsWith(`${field.name}.`) || key.startsWith(`${field.name}[`)),\n ),\n );\n return (\n <div className=\"intake-review\">\n {(form.steps ?? []).map((step, index) => {\n const open = opened.has(step.id) || troubled(step);\n return (\n <section key={step.id} className=\"intake-review-section\" aria-labelledby={`${id}-review-${index}`}>\n <div className=\"intake-review-head\">\n <Heading id={`${id}-review-${index}`}>{step.label}</Heading>\n {!open && (\n <Button\n intent=\"quiet\"\n disabled={pending}\n aria-label={say('change', { label: step.label })}\n onClick={() => setOpened((before) => new Set(before).add(step.id))}\n >\n {say('changeStep')}\n </Button>\n )}\n </div>\n {open ? (\n <fieldset className=\"command-fields\" disabled={pending}>\n {body(step, true)}\n </fieldset>\n ) : (\n <dl className=\"intake-summary\">\n {stepFields(step)\n .filter((field) => !hiddenNow.has(field.name) && shownOnReview(field, values[field.name]))\n .map((field) => (\n <div key={field.name}>\n <dt>{field.label}</dt>\n <dd>\n <ReviewValue field={field} value={values[field.name]} {...(from ? { from } : {})} />\n </dd>\n </div>\n ))}\n </dl>\n )}\n </section>\n );\n })}\n </div>\n );\n };\n /** Whether a step holds nothing yet, so its primary may say \"Skip\". */\n const stepEmpty = (step: FormStep) => step.id !== REVIEW && stepFields(step).every((field) => !holds(field, values[field.name]));\n /** The review: every answer as this page holds it, step by step, with a way back to each. */\n const answers = () => {\n // A question the answers hide is not on the review: it is not sent.\n const hiddenNow = draftHidden(fields, values);\n let said: Record<string, unknown> = values;\n try {\n said = commandInput(fields, values);\n } catch {\n /* each step was checked on its way here */\n }\n return (\n <div className=\"form-review\">\n {(form.steps ?? []).map((step, index) => (\n <section key={step.id} aria-labelledby={`${id}-review-${index}`}>\n <div className=\"form-review-head\">\n <h3 id={`${id}-review-${index}`}>{step.label}</h3>\n <Button intent=\"quiet\" size=\"compact\" onClick={() => setCurrent(index)} aria-label={say('change', { label: step.label })}>\n {say('changeStep')}\n </Button>\n </div>\n <dl>\n {stepFields(step)\n .filter((field) => !hiddenNow.has(field.name) && shownOnReview(field, said[field.name]))\n .map((field) => (\n <div key={field.name}>\n <dt>{field.label}</dt>\n <dd>\n <ReviewValue field={field} value={said[field.name]} {...(from ? { from } : {})} />\n </dd>\n </div>\n ))}\n </dl>\n </section>\n ))}\n </div>\n );\n };\n /** A step is left when the page's own check of it passes and, where the host asks the server, the server's too. On the\n editable review every step's fields are judged again, wherever they were typed. */\n const validateStep = async (step: FormStep): Promise<boolean> => {\n if (step.id === REVIEW) return !intake || check(fields);\n if (!check(stepFields(step))) return false;\n // A public form asks its own step check (formRoutes.ts) unless the host gives another way to ask.\n const ask =\n checkStep ??\n (visitor\n ? // A part of its own, fetched the first time a step is left: a form without steps never asks it.\n async (stepId: string, input: CommandInputValue) =>\n (await import('./formStepCheck.js')).checkPublicFormStep(form.id, stepId, input, visitor.via)\n : undefined);\n if (!ask) return true;\n const upTo = (form.steps ?? []).slice(0, (form.steps ?? []).findIndex((item) => item.id === step.id) + 1);\n const soFar = upTo.flatMap(stepFields);\n const found = await ask(\n step.id,\n commandInput(soFar, values, questions, { whole: { fields, values } }),\n soFar.map((field) => field.name),\n );\n if (!found || !Object.keys(found).length) return true;\n setProblems((before) => ({ ...before, ...found }));\n return false;\n };\n /* A public form's guard: the decoy a script fills and a person never meets, and the human check's slot. */\n const guard = visitor ? <PublicGuard handle={guarded} {...(form.challenge ? { widget: form.challenge } : {})} /> : null;\n /* The form's own line — what is not about a field on screen — above the\n actions, where the eye is before it presses, never under them. */\n const description = form.description ? <p className=\"form-page-description\">{form.description}</p> : null;\n const said = (\n <p className=\"form-page-failure\" tabIndex={-1} role=\"alert\" aria-live=\"assertive\" hidden={!failure}>\n {failure}\n </p>\n );\n return (\n <section\n ref={surface}\n className=\"form-page\"\n {...(intake ? { 'data-style': 'intake', 'aria-label': form.label } : { 'aria-labelledby': `${id}-title` })}\n >\n {/* An intake form has no heading of its own: the step's title is the room's h1 (the dialog's, in a dialog), the\n form's label is the trail's last step or the tab's title, and the App is the brand row's. */}\n {!intake && <p className=\"eyebrow\">{appName}</p>}\n {!intake && <h1 id={`${id}-title`}>{form.label}</h1>}\n {/* Said once: over a one-page form, and on a stepped form's first step only, under its title — over the bar on\n every step it was the same paragraph read again at each, pushing each question down. */}\n {!steps && description}\n {attempt?.recovery ? (\n <>\n <fieldset className=\"command-fields\" disabled>\n {controls(fields)}\n </fieldset>\n {attempt.recovery}\n </>\n ) : (\n <form\n noValidate\n onSubmit={(event) => {\n event.preventDefault();\n if (!pending && !attempt?.locked && !form.steps && check(fields)) void complete();\n }}\n >\n {steps ? (\n <MultiStepForm\n steps={steps}\n className=\"form-page-steps\"\n completeLabel={submitLabel}\n said={said}\n onStepChange={(index: number) => {\n setFailure('');\n if (reviewing) setCurrent(index);\n }}\n {...(reviewing ? { step: current } : {})}\n validateStep={validateStep}\n onComplete={complete}\n presentation={inDialog ? 'dialog' : 'page'}\n /* What each step said, beside a page's form; nothing on the review, which says it all. */\n summarize={(step: FormStep, active: FormStep) => {\n if (active.id === REVIEW) return undefined;\n // A question the answers hide is not asked, so it says nothing where the answers are read back.\n const hidden = draftHidden(fields, values);\n return stepSaid(\n stepFields(step).filter((field) => !hidden.has(field.name)),\n values,\n nameOf,\n );\n }}\n {...(intake ? { style: 'intake' as const, note: <IntakeNote note={form.note} />, isStepEmpty: stepEmpty } : {})}\n >\n {(step, index) =>\n step.id === REVIEW ? (\n intake ? (\n editableReview()\n ) : (\n answers()\n )\n ) : (\n <>\n {index === 0 && description}\n <fieldset className=\"command-fields\">{body(step)}</fieldset>\n </>\n )\n }\n </MultiStepForm>\n ) : (\n <>\n <fieldset className=\"command-fields\" disabled={pending}>\n {controls(fields)}\n </fieldset>\n {guard}\n {said}\n <div className=\"form-actions\">\n <Button intent=\"primary\" type=\"submit\" busy={pending || attempt?.locked} busyLabel={say('common.submitting')}>\n {submitLabel}\n </Button>\n {onDismiss && (\n <Button intent=\"secondary\" disabled={pending} onClick={onDismiss}>\n {say('common.cancel')}\n </Button>\n )}\n </div>\n </>\n )}\n {steps && guard}\n </form>\n )}\n </section>\n );\n}\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"shared-B4jgU8h9.js","names":["_Fragment","_Fragment"],"sources":["../../src/shared/commandRefusals.ts","../../src/client/components/formLeaveGuard.ts","../../src/client/components/IntakeNote.tsx","../../src/client/components/ReviewValue.tsx","../../src/client/copy/forms/components/FormSurface.ts","../../src/client/components/FormSurface.tsx"],"sourcesContent":["/**\n * A refused command's fixed words, by code: what the server says when the\n * platform refuses, or a handler refuses by code alone. Shared so a form can\n * tell the platform's fixed sentence — written for an integrator reading the\n * API — from a handler's own reason, written for the person, and say the\n * former in a visitor's words instead (FormSurface.tsx, `formRefusal`).\n */\nexport const COMMAND_REFUSAL_MESSAGES = {\n unauthenticated: 'Sign in to continue.',\n stale_account: 'The signed-in account changed. Reload before continuing.',\n invalid_input: 'The command input is invalid.',\n command_version_mismatch: 'This command version is unavailable. Keep the original request for reconciliation.',\n not_found: 'The record was not found.',\n ineligible_state: 'This record is not eligible for this command.',\n consumes_refused: 'There is not enough left of what this would use.',\n reviewer_unavailable: 'The selected reviewer is unavailable.',\n forbidden: 'This command is not available to this account.',\n idempotency_conflict: 'This request key was already used with different input.',\n duplicate_record: 'A record with this value already exists.',\n stale_record: 'The record has changed. Reload it before trying again.',\n cancelled: 'The command was cancelled.',\n temporarily_unavailable: 'The command could not be completed. Retry with the same request key.',\n row_locked: 'The record is locked by another transaction. Nothing was changed; retry in a moment.',\n invalid_result: 'The command did not produce a valid result.',\n} as const;\n\nexport type CommandRefusalCode = keyof typeof COMMAND_REFUSAL_MESSAGES;\n","/**\n * A form's leave guard, the platform's own: a surface probe that every in-App\n * exit asks (`allowMutationExit` in core.js), and the browser's generic\n * `beforeunload` prompt for a reload, a closed tab or an address typed over\n * it. Browsers ignore any text a page gives that prompt and show it only after\n * the person has interacted with the page; mobile Safari may not show it at\n * all, so `pagehide` is where the page drops its copy of the answers, best\n * effort, before it goes into the back-forward cache.\n *\n * A module of its own because FormSurface, on the first page, arms it; the\n * saved-form API (savedFormApi.ts) arrives with the surfaces that use it.\n */\nimport { registerSurfaceMutationPendingProbe } from '@mistriwork/kit/client/core.js';\nimport { addHostListener, removeHostListener } from '@mistriwork/kit/client/shellHost.js';\n\n/**\n * Arm the leave guard: every in-App exit is refused and the browser asks\n * before the page unloads. `onHide` runs on `pagehide`. The returned function\n * disarms it — on submit, and when the surface goes.\n */\nexport function armLeaveGuard(onHide: () => void): () => void {\n const beforeUnload = (event: BeforeUnloadEvent) => {\n event.preventDefault();\n // Older engines ask for a return value; its text is never shown.\n event.returnValue = '';\n };\n addHostListener(window, 'beforeunload', beforeUnload);\n addHostListener(window, 'pagehide', onHide);\n const release = registerSurfaceMutationPendingProbe(() => true);\n return () => {\n removeHostListener(window, 'beforeunload', beforeUnload);\n removeHostListener(window, 'pagehide', onHide);\n release();\n };\n}\n","/** The quiet line over an intake form's progress bar: an App icon and a sentence (\"Your information is stored securely\"). */\nimport type { AppIconName } from '@mistriwork/engine/shared/appIcons.js';\nimport { Icon } from '@mistriwork/kit/client/components/Icon.js';\n\nexport function IntakeNote({ note }: { note: { icon?: AppIconName; text: string } | undefined }) {\n if (!note) return null;\n return (\n <p className=\"intake-note\">\n {note.icon && <Icon name={note.icon} size={16} />}\n <span>{note.text}</span>\n </p>\n );\n}\n","/**\n * One answer on a review, as its `<dd>` holds it: the words sayInput gives, or — for a group — a short list, a line\n * per member by its label (\"Urgent: Yes\"), which reads on a phone where a comma-run of answers did not. Shared by the\n * one-submit form and the form saved on every step.\n *\n * A reference is the one answer the page cannot say from its own memory: what it holds is a key, and \"1\" names\n * nothing to the person confirming it (a field report: a payment's review said 1 and 2 for the two accounts its\n * pickers had named). Where the form reads its choices, an answer that holds one is said by its record's name, read\n * again by its key as the picker reads (CommandReference.tsx `ReviewNamed`), a part loaded with the picker.\n */\nimport type { AppCommandField } from '../../shared/command.js';\nimport { onDemand } from '@mistriwork/kit/client/components/onDemand.js';\nimport { reviewLines, sayInput } from './reviewValues.js';\nimport type { ChoiceSource } from './CommandReference.js';\n\nconst ReviewNamed = onDemand(() => import('./CommandReference.js'), 'ReviewNamed', { quiet: true });\n\n/** Where a review reads a reference's name: the form's own source, and the reader it reads for. */\nexport interface ReviewSource {\n source: ChoiceSource;\n identityEpoch: number;\n}\n\nexport function ReviewValue({ field, value, from }: { field: AppCommandField; value: unknown; from?: ReviewSource }) {\n if (\n from &&\n (field.type === 'reference'\n ? value !== '' && value != null\n : field.type === 'group' && field.fields.some((member) => member.type === 'reference'))\n )\n return <ReviewNamed field={field} value={value} from={from} />;\n if (field.type === 'group') {\n const lines = reviewLines(field, value);\n if (lines.length > 1)\n return (\n <ul className=\"review-lines\">\n {lines.map((line, index) => (\n <li key={index}>{line}</li>\n ))}\n </ul>\n );\n }\n return <>{sayInput(field, value)}</>;\n}\n","/** What FormSurface says, in the forms room (packages/kit/src/client/messages.ts says how the catalog is split). */\nimport { defineMessages } from '@mistriwork/kit/client/messages.js';\n\nexport const say = defineMessages({\n theFormCouldNotBeSubmitted: 'The form could not be submitted ({status}).',\n tooManySubmissionsFromThisAddress: 'Too many submissions from this address. Try again in {retryAfter} seconds.',\n review: 'Review',\n reviewTitle: 'Review your answers',\n reviewLead: 'Check each section. Change anything that is not right.',\n keepThisReference: 'Keep this reference.',\n received: 'Received',\n yourReference: 'Your reference',\n fillInAnother: 'Fill in another',\n backToApp: 'Back to {name}',\n submit: 'Submit',\n change: 'Change {label}',\n changeStep: 'Change',\n checkThisBoxTo: 'Check this box to continue.',\n thisAnswerWasNot: 'This answer was not accepted. Check it and try again.',\n couldNotReach: 'The form could not be sent. Check your connection and try again.',\n refusedInvalidInput: 'Some answers need another look.',\n refusedVersion: 'This form has changed since the page was opened. Reload the page to continue.',\n refusedNotFound: 'What this form was about is no longer here. Reload the page to continue.',\n refusedIneligible: 'This can’t be sent as it stands. Check your answers and try again.',\n refusedForbidden: 'This form can’t be sent from this page. Reload it and try again.',\n refusedKeyReused: 'This was already sent with different answers. Reload the page to start again.',\n refusedDuplicate: 'Something with these details already exists.',\n refusedStale: 'Something changed while you were filling this in. Reload the page and try again.',\n refusedCancelled: 'It was not sent.',\n refusedUnavailable: 'It could not be sent just now. Try again in a moment; it will not be sent twice.',\n refusedLocked: 'Someone else is changing this record right now. Nothing was sent; try again in a moment.',\n});\n","/**\n * A command form, drawn: one form running one command. The same surface\n * draws a public form — the whole page, in the App's name and dress, for\n * anyone — and a signed-in form, a room of the App with its menu beside\n * it; what differs is who submits (the `submit` the host passes) and,\n * signed in, the reference inputs a directory may fill. With steps it is a\n * stepper, each step checked by the same rules before it is left — a step\n * may name a group, which is then a section of that step; without, one\n * page. Either way the whole is submitted once under a submission key held\n * in memory: a retry after a lost answer replays the same receipt, and\n * nothing typed is ever written to browser storage.\n */\nimport { Fragment, useEffect, useId, useMemo, useRef, useState, type ReactNode } from 'react';\nimport type { AppCommandField } from '../../shared/command.js';\nimport type { FormStep, FormStyle } from '../../shared/formRules.js';\nimport type { AppIconName } from '@mistriwork/engine/shared/appIcons.js';\nimport type { CommandInputValue } from '../commandState.js';\nimport type { DraftRule } from '../../shared/commandDraft.js';\nimport {\n CommandFields,\n CommandLive,\n asksDraftLogic,\n blankCommandValues,\n commandInput,\n commandPathLabel,\n commandProblems,\n draftHidden,\n draftLogic,\n prefilledCommandValues,\n type CommandQuestions,\n type CommandValues,\n} from './CommandFields.js';\nimport { commandFieldAt } from '../../shared/commandInput.js';\nimport { COMMAND_REFUSAL_MESSAGES, type CommandRefusalCode } from '../../shared/commandRefusals.js';\nimport { onDemand, useArrived } from '@mistriwork/kit/client/components/onDemand.js';\nimport { Button } from '@mistriwork/ui/Button.js';\nimport { armLeaveGuard } from './formLeaveGuard.js';\nimport { IntakeNote } from './IntakeNote.js';\nimport { answered, maskedLast4, sensitiveText, stepSaid, type NameOf } from './reviewValues.js';\nimport { knownReferenceName } from './referenceNames.js';\nimport './FormSurface.css';\nimport { ReviewValue, type ReviewSource } from './ReviewValue.js';\nimport { say } from '../copy/forms/components/FormSurface.js';\nimport { fetchServer } from '@mistriwork/kit/client/transport.js';\nimport type { ChallengeWidget, FormGuard, GuardHandle } from './PublicGuard.js';\n\n/* The stepper, its parts and the intake style's sheets are a chunk fetched for a form with steps, never by a public\n page whose form has none (the landing, sign-in, a one-page form). A step's row of fields stands in Columns, which\n comes with the stepper, so a step is never drawn without it. Neither is imported here: what a part loaded on\n demand uses of a module the first page reaches is drawn into the first page's chunk. */\nconst stepping = () => import('@mistriwork/kit/client/components/MultiStepForm.js');\nconst Columns = onDemand(() => import('@mistriwork/ui/FormParts.js'), 'Columns');\n/* A public form's guard — its decoy and, where the App names one, its human check (PublicGuard.tsx) — fetched only\n by a public form, so neither a signed-in page nor a first paint carries it. */\nexport const PublicGuard = onDemand(() => import('./PublicGuard.js'), 'PublicGuard', { quiet: true });\nconst MultiStepForm = onDemand(() => Promise.all([stepping(), Columns.ready()]).then(([module]) => module), 'MultiStepForm');\n\n/**\n * Everything a form asks beyond the fields every form has, fetched before it is first drawn, so a public form's\n * first frame is whole: the stepper (and the intake style's sheets) for a form with steps, the draft's logic for a\n * `when` or a rule, the live lines for a number that has them. A form asking none of these fetches nothing.\n */\nexport async function formArrives(\n form: Pick<FormPresentation, 'input' | 'steps' | 'style' | 'rules' | 'challenge' | 'components'>,\n): Promise<void> {\n const fields = form.input ?? [];\n const lives = (list: readonly AppCommandField[]): boolean =>\n list.some(\n (field) => ((field.type === 'number' || field.type === 'money') && !!field.live) || (field.type === 'group' && lives(field.fields)),\n );\n await Promise.all([\n form.steps\n ? MultiStepForm.ready().then(() => (form.style === 'intake' ? stepping().then((module) => module.loadIntakeStyle()) : undefined))\n : undefined,\n asksDraftLogic(fields, form.rules) ? draftLogic.ready() : undefined,\n lives(fields) ? CommandLive.ready() : undefined,\n form.challenge ? PublicGuard.ready() : undefined,\n // The App's own input components it draws: where they are served, for the kit's slot; their code comes as drawn.\n form.components && Object.keys(form.components).length\n ? import('./sdk/publicInputs.js').then(({ installPublicInputs }) => installPublicInputs(form.components!))\n : undefined,\n ]).catch(() => {});\n}\n\nexport type { CommandValues } from './CommandFields.js';\n\n/** What the surface draws: a form's words, the inputs it asks, and its steps when it has them. */\nexport interface FormPresentation {\n id: string;\n label: string;\n description?: string;\n input: AppCommandField[];\n steps?: FormStep[];\n /** How the steps are drawn: the stepper (the default) or the intake style. */\n style?: FormStyle;\n /** Intake: the quiet line over the progress bar. */\n note?: { icon?: AppIconName; text: string };\n /** Intake: `false` leaves the review out; absent, the last page reviews every answer, editable. */\n review?: false;\n submitLabel?: string;\n done?: { title?: string; description?: string };\n /** The inputs a link's address may start filled. */\n prefillable?: string[];\n /** The inputs drawn by the App's own input components, by the form (`inputs`); a field may name its own (`input`). */\n inputs?: Readonly<Record<string, { id: string }>>;\n /** A public form: where each input component it draws is served (http/formRoutes.ts), loaded as it is drawn. */\n components?: Readonly<Record<string, { href: string; css?: string }>>;\n /** Saved on every step (SavedFormSurface.tsx): the inputs the submit itself asks, on the review. */\n save?: { submit: string[] };\n /** The command's rules over the draft: each is said at its field on the step that asks the last field it names. */\n rules?: readonly DraftRule[];\n /** A public form's human check (`auth.challenge`): the provider's widget, drawn in its slot (PublicGuard.tsx). */\n challenge?: ChallengeWidget;\n}\n/** What a submission answers: the handler's reference when it gave one, and the receipt. */\nexport interface FormReceipt {\n reference?: string;\n /** What the command's own result said it did, where it said one: shown in place of the form's static description. */\n message?: string;\n receipt: { id: string; status: string };\n}\ntype SubmitForm = (submission: string, input: CommandInputValue, guard?: FormGuard) => Promise<FormReceipt>;\n\nexport async function submitPublicForm(\n id: string,\n submission: string,\n input: CommandInputValue,\n via?: string,\n guard: FormGuard = {},\n): Promise<FormReceipt> {\n // `via` is the intake address the page was published with (a tenant App's);\n // the server alone decides what it means, and an ordinary App ignores it.\n let res: Response;\n try {\n res = await fetchServer(`/api/forms/${encodeURIComponent(id)}${via ? `?via=${encodeURIComponent(via)}` : ''}`, {\n method: 'POST',\n credentials: 'same-origin',\n signal: AbortSignal.timeout(30_000),\n headers: { 'content-type': 'application/json', ...(guard.challenge ? { 'x-mistri-challenge': guard.challenge } : {}) },\n body: JSON.stringify({ input, submission, ...(guard.trap ? { trap: guard.trap } : {}) }),\n });\n } catch {\n // No answer at all: \"Failed to fetch\", or the timeout's abort, is the browser's sentence, not the visitor's.\n throw new Error(say('couldNotReach'));\n }\n let data: Record<string, unknown> = {};\n try {\n data = await res.json();\n } catch {\n /* the status is the answer */\n }\n if (res.ok && typeof data.reference === 'string') return data as unknown as FormReceipt;\n const retryAfter = Number(res.headers.get('retry-after') ?? data.retryAfter);\n throw Object.assign(new Error(String(data.message || data.error || say('theFormCouldNotBeSubmitted', { status: res.status }))), {\n status: res.status,\n code: typeof data.code === 'string' ? data.code : undefined,\n field: typeof data.field === 'string' ? data.field : undefined,\n retryAfter: Number.isFinite(retryAfter) && retryAfter > 0 ? retryAfter : undefined,\n });\n}\n\ninterface Failure {\n message: string;\n code?: string;\n field?: string;\n retryAfter?: number;\n status?: number;\n}\n\n/* The platform's fixed refusals, in a visitor's words. Those are written for\n an integrator reading the API (\"The command input is invalid.\"); a form is\n read by the person filling it in. A code whose fixed words already read so\n (sign in, the account changed) keeps them; a handler's own reason is never\n replaced — it is the one sentence written for this reader. */\nconst REFUSED: Partial<Record<CommandRefusalCode, () => string>> = {\n invalid_input: () => say('refusedInvalidInput'),\n command_version_mismatch: () => say('refusedVersion'),\n not_found: () => say('refusedNotFound'),\n ineligible_state: () => say('refusedIneligible'),\n forbidden: () => say('refusedForbidden'),\n idempotency_conflict: () => say('refusedKeyReused'),\n duplicate_record: () => say('refusedDuplicate'),\n stale_record: () => say('refusedStale'),\n cancelled: () => say('refusedCancelled'),\n temporarily_unavailable: () => say('refusedUnavailable'),\n row_locked: () => say('refusedLocked'),\n invalid_result: () => say('refusedUnavailable'),\n};\n\n/** What a refusal says, twice over: `beside` its field when there is one, and `alone` on the form's own line, naming where. */\ninterface FormRefusal {\n field?: string;\n beside: string;\n alone: string;\n}\n\n/**\n * What the person reads for a refusal. A field the server names is said as\n * the form's own rules say it, where they find the same problem — the server\n * read it by the same rules; where they do not (the handler's own check), a\n * box left unchecked is asked to be checked, and any other answer to be\n * looked at again. Away from its field the sentence says where the field is:\n * its label, its section and row. A wait is said as a wait, a dropped\n * connection as one, never the browser's words for it.\n */\nexport function formRefusal(failure: Failure, fields: readonly AppCommandField[], values: CommandValues = {}): FormRefusal {\n if (failure.status === 429) {\n const said = say('tooManySubmissionsFromThisAddress', { retryAfter: failure.retryAfter ?? 60 });\n return { beside: said, alone: said };\n }\n const code = failure.code as CommandRefusalCode | undefined;\n const fixed = code !== undefined && Object.hasOwn(COMMAND_REFUSAL_MESSAGES, code) && failure.message === COMMAND_REFUSAL_MESSAGES[code];\n const where = failure.field ? commandPathLabel(fields, failure.field) : undefined;\n if (failure.field && where) {\n const names = new Set(fields.map((field) => field.name));\n const own = commandProblems(fields, Object.fromEntries(Object.entries(values).filter(([name]) => names.has(name))))[failure.field];\n const field = commandFieldAt(fields, failure.field);\n const unchecked = field?.type === 'boolean' && field.as !== 'buttons' && values[failure.field] !== true;\n const beside = own ?? (!fixed ? failure.message : unchecked ? say('checkThisBoxTo') : say('thisAnswerWasNot'));\n // A sentence that already names its field is not prefixed with the name again.\n return { field: failure.field, beside, alone: field && beside.includes(field.label) ? beside : `${where}: ${beside}` };\n }\n const said = fixed ? (REFUSED[code]?.() ?? failure.message) : failure.message;\n return { beside: said, alone: said };\n}\n\n/** The top-level names a set of fields draws: whether a refusal's field is on screen is whether its root is one. */\nexport const drawsField = (fields: readonly AppCommandField[], path: string | undefined): boolean =>\n path !== undefined && fields.some((field) => field.name === path.split(/[.[]/)[0]);\n\n/**\n * Where a form starts: blank, or — from a link that fills some in, as a car's\n * page does (`?stock_ref=FC-1049`) — those inputs set. Only the inputs the\n * form names `prefillable` are read, and only as typed text: the command\n * checks them as it checks anything typed, and the reader sees them and may\n * change them. Anything else in the address is ignored, and a form that\n * names none starts blank whatever its address says.\n */\nexport function startingValues(\n fields: readonly AppCommandField[],\n allowed: readonly string[] = [],\n search = typeof window === 'undefined' ? '' : window.location.search,\n initial: Readonly<Record<string, unknown>> = {},\n): CommandValues {\n const params = new URLSearchParams(search);\n // What the server prepared starts the form; the address's own words stand over it.\n const given: Record<string, unknown> = { ...initial };\n for (const field of fields) {\n if (!allowed.includes(field.name) || field.type === 'group' || field.type === 'boolean') continue;\n const value = params.get(field.name);\n if (value !== null && value.length <= 4000) given[field.name] = value;\n }\n return Object.keys(given).length ? prefilledCommandValues(fields, given) : blankCommandValues(fields);\n}\n\n/** The top-level field a path belongs to: `trade_ins[1].stock` is `trade_ins`'s. */\nconst rootOf = (path: string) => path.split(/[.[]/)[0];\n\nconst REVIEW = '#review';\n\n/** A review lists what was answered, and what had to be: a question that could be left empty and was is left out. */\nexport const shownOnReview = (field: AppCommandField, value: unknown) => answered(value) || ('required' in field && !!field.required);\n\nexport function FormSurface({\n form,\n appName,\n submit,\n connection,\n visitor,\n identityEpoch = 0,\n again = false,\n prefill,\n initial,\n questions,\n onDismiss,\n homeHref,\n review = false,\n attempt,\n inDialog = false,\n checkStep,\n}: {\n form: FormPresentation;\n appName: string;\n submit: SubmitForm;\n /** Optional placed-operation owner, loaded only by a placed public form. */\n attempt?: {\n submission: string;\n values?: CommandValues;\n receipt?: FormReceipt;\n locked: boolean;\n recovery?: ReactNode;\n capture(values: CommandValues): void;\n };\n /** A public form with steps: a last step reviewing every answer from this page's memory, and leaving guarded until it is sent.\n An intake form decides this itself (its own `review`, on unless it says false), signed in or not. */\n review?: boolean;\n /** Drawn in a dialog: the step's title is the dialog's heading and the actions stay at its foot. */\n inDialog?: boolean;\n /** The server's word on the steps so far, asked once the page's own check of a step passes: field path → what is\n wrong with it. A step with a problem marks its fields and does not go on. */\n checkStep?: (stepId: string, input: CommandInputValue, names: readonly string[]) => Promise<Record<string, string> | undefined>;\n /** Where the form starts, as a query string. The form's own page reads the\n address it was opened at; a form drawn over a record (FormDialog) is\n handed the same string instead, so both routes start the same way. */\n prefill?: string;\n /** A signed-in form's prepared starting values (`initial()`, `default: me`), under the address's own. */\n initial?: Readonly<Record<string, unknown>>;\n /** A signed-in form's questions defined in rows, as its prepare read them (`field.defined`). */\n questions?: CommandQuestions;\n /** Signed in: the connection a reference input's choices are read from. */\n connection?: string;\n /** A public form's App (and its intake address), where a reference input's choices are read signed out. */\n visitor?: { app: string; via?: string };\n identityEpoch?: number;\n /** Offer the form again after a receipt: a signed-in desk's next entry, never a public applicant's second application. */\n again?: boolean;\n /** Drawn in a dialog over the page the reader came from: Cancel beside the submit, and Done once received, each back to it. */\n onDismiss?: () => void;\n /** A public page's way back once received: the App's home, said as a quiet \"Back to <App>\" under the receipt. */\n homeHref?: string;\n}) {\n const id = useId();\n const fields = form.input;\n /* A rule is judged in the browser once the draft's logic is here (CommandFields.tsx); a `when` waits in CommandFields. */\n useArrived(draftLogic, !!form.rules?.length);\n const byName = useMemo(() => new Map(fields.map((field) => [field.name, field])), [fields]);\n const [values, setValues] = useState<CommandValues>(\n () => attempt?.values ?? startingValues(fields, form.prefillable, attempt?.locked ? '' : prefill, initial),\n );\n const [problems, setProblems] = useState<Record<string, string>>({});\n const [failure, setFailure] = useState('');\n /* A public form's guard (PublicGuard.tsx), held while it is drawn. */\n const guarded = useRef<GuardHandle | undefined>(undefined);\n const [pending, setPending] = useState(false);\n const [submittedReceipt, setReceipt] = useState<FormReceipt | null>(null);\n const receipt = attempt?.receipt ?? submittedReceipt;\n const surface = useRef<HTMLElement>(null);\n const focusIntent = useRef<'invalid' | 'first' | null>(null);\n const [focusRequest, setFocusRequest] = useState(0);\n const requestFocus = (intent: 'invalid' | 'first') => {\n focusIntent.current = intent;\n setFocusRequest((before) => before + 1);\n };\n useEffect(() => {\n if (pending) return;\n const root = surface.current;\n if (receipt) {\n root?.querySelector<HTMLElement>('h1')?.focus({ preventScroll: true });\n return;\n }\n const intent = attempt?.recovery ? 'invalid' : focusIntent.current;\n if (!intent) return;\n focusIntent.current = null;\n const controls = 'input:not([type=\"hidden\"]):not(:disabled), textarea:not(:disabled), select:not(:disabled), button:not(:disabled)';\n const invalid = root?.querySelector<HTMLElement>('[aria-invalid=\"true\"]');\n const target =\n intent === 'first'\n ? root?.querySelector('.command-fields')?.querySelector<HTMLElement>(controls)\n : invalid?.matches(controls)\n ? invalid\n : invalid?.querySelector<HTMLElement>(controls);\n // Off-step server errors still have a reachable summary; the stepper owns its own validation focus.\n // preventScroll: the focus must not move the page on its inline axis (rule 10); a step arrives at its top by its own scroll.\n (target ?? root?.querySelector<HTMLElement>('.form-page-failure:not([hidden])'))?.focus({ preventScroll: true });\n }, [focusRequest, receipt, pending, Boolean(attempt?.recovery)]);\n /* One key for one filling-in. A second click after a lost answer carries\n the same key, so the server answers with the same receipt instead of a\n second submission. In memory only. */\n const submission = useRef(attempt?.submission ?? crypto.randomUUID());\n const stepFields = (step: FormStep): AppCommandField[] => step.fields.flatMap((name) => byName.get(name) ?? []);\n const intake = form.style === 'intake' && !!form.steps;\n // An intake form decides its review itself; the stepper's is the public host's to ask for.\n const reviewing = !!form.steps && (intake ? form.review !== false : review);\n const steps = useMemo(\n () =>\n form.steps && reviewing\n ? [\n ...form.steps,\n intake\n ? { id: REVIEW, label: say('review'), fields: [], title: say('reviewTitle'), lead: say('reviewLead') }\n : { id: REVIEW, label: say('review'), fields: [] },\n ]\n : form.steps,\n [form.steps, reviewing, intake],\n );\n const [current, setCurrent] = useState(0);\n /* Once anything is typed, leaving asks first, until the receipt: what was\n typed lives in this page alone, and a reload loses it. */\n const holds = (field: AppCommandField | undefined, value: unknown): boolean =>\n field?.type === 'group'\n ? JSON.stringify(value) !== JSON.stringify(blankCommandValues([field])[field.name])\n : field?.type === 'lines'\n ? // A grid's blank line is where it starts; a line with anything in it is typed.\n Array.isArray(value) && value.some((row) => Object.values((row as { values?: object }).values ?? {}).some(Boolean))\n : value !== undefined && value !== null && value !== '' && value !== false && !(Array.isArray(value) && !value.length);\n const typed = reviewing && !receipt && Object.entries(values).some(([name, value]) => holds(byName.get(name), value));\n /* A sensitive answer on the review shows its last four; Change asks for it again. The names asked for again. */\n const [asked, setAsked] = useState<ReadonlySet<string>>(new Set());\n /* The review's steps opened by their Change, to be answered again in place. */\n const [opened, setOpened] = useState<ReadonlySet<string>>(new Set());\n useEffect(() => (typed ? armLeaveGuard(() => setValues(blankCommandValues(fields))) : undefined), [typed]);\n\n /** Mark every problem in these fields, groups and rows included, and clear what they no longer have. */\n const check = (checked: readonly AppCommandField[]): boolean => {\n const names = new Set(checked.map((field) => field.name));\n const found = commandProblems(checked, Object.fromEntries(Object.entries(values).filter(([name]) => names.has(name))), questions, {\n whole: { fields, values },\n ...(form.rules ? { rules: form.rules } : {}),\n });\n setProblems((before) => ({ ...Object.fromEntries(Object.entries(before).filter(([path]) => !names.has(rootOf(path)))), ...found }));\n if (!form.steps && Object.keys(found).length) requestFocus('invalid');\n return Object.keys(found).length === 0;\n };\n\n const change = (next: CommandValues, path: string) => {\n if (attempt?.locked) return;\n setValues(next);\n // A changed field, or a group whose rows moved, drops what was said about it and everything under it.\n setProblems((before) =>\n Object.fromEntries(\n Object.entries(before).filter(\n ([problem]) => problem !== path && !problem.startsWith(`${path}.`) && !problem.startsWith(`${path}[`),\n ),\n ),\n );\n };\n\n const complete = async () => {\n if (pending || attempt?.locked) return;\n setFailure('');\n let input: CommandInputValue;\n try {\n input = commandInput(fields, values, questions, form.rules ? { rules: form.rules } : {});\n } catch (error) {\n setFailure((error as Error).message);\n requestFocus('invalid');\n return;\n }\n setPending(true);\n attempt?.capture(values);\n try {\n /* Sent in the press's own turn unless a human check's token is still on its way (PublicGuard.tsx take): a form\n closed during its send has already sent. */\n const taken = guarded.current?.take() ?? {};\n const guard = taken instanceof Promise ? await taken : taken;\n setReceipt(await submit(submission.current, input, guard));\n } catch (error) {\n const refusal = formRefusal(error as Failure, fields, values);\n /* One place for each problem: beside its field when the field is on\n screen, else the form's own line, naming it. Kept on the field too,\n so a step opened to fix it shows it there. */\n const shown = drawsField(\n // An editable review draws every step's fields again, so a refusal is beside its field wherever the field is.\n steps && !(intake && reviewing) ? stepFields(steps[steps.length - 1]) : fields,\n refusal.field,\n );\n if (refusal.field) setProblems((before) => ({ ...before, [refusal.field!]: refusal.beside }));\n if (!shown) setFailure(refusal.alone);\n requestFocus('invalid');\n } finally {\n // A token is spent once: the widget is asked for a fresh one for the next send.\n guarded.current?.reset();\n setPending(false);\n }\n };\n\n const startAgain = () => {\n submission.current = crypto.randomUUID();\n // The next entry starts as the first did, from what the server prepared, and not from the address.\n setValues(initial ? startingValues(fields, [], '', initial) : blankCommandValues(fields));\n setProblems({});\n setFailure('');\n setReceipt(null);\n requestFocus('first');\n };\n\n if (receipt) {\n const message = receipt.message ?? form.done?.description ?? (receipt.reference ? say('keepThisReference') : undefined);\n return (\n <section ref={surface} className=\"form-page form-page-done\" aria-labelledby={`${id}-done`}>\n {!intake && <p className=\"eyebrow\">{appName}</p>}\n <h1 id={`${id}-done`} tabIndex={-1}>\n {form.done?.title ?? say('received')}\n </h1>\n {receipt.reference && (\n <>\n <p className=\"form-page-reference-label\">{say('yourReference')}</p>\n <p className=\"form-page-reference\">\n <strong>{receipt.reference}</strong>\n </p>\n </>\n )}\n {message && <p className=\"form-page-done-message\">{message}</p>}\n {again && !attempt && form.input.length > 0 && (\n <p>\n <Button intent=\"secondary\" onClick={startAgain}>\n {say('fillInAnother')}\n </Button>\n </p>\n )}\n {onDismiss && (\n <div className=\"form-actions\">\n <Button intent=\"primary\" onClick={onDismiss}>\n {say('common.done')}\n </Button>\n </div>\n )}\n {/* A page has nowhere to be dismissed to: the receipt ends in a quiet way back, never a dead end. */}\n {!onDismiss && homeHref && (\n <p className=\"form-page-done-home\">\n <a href={homeHref}>{say('backToApp', { name: appName })}</a>\n </p>\n )}\n </section>\n );\n }\n\n const controls = (list: readonly AppCommandField[]) => (\n <CommandFields\n fields={list}\n values={values}\n problems={problems}\n idPrefix={id}\n disabled={pending || attempt?.locked}\n identityEpoch={identityEpoch}\n isCurrent={() => true}\n onChange={change}\n presentation={intake ? 'intake' : 'stepper'}\n whole={{ fields, values }}\n inputs={form.inputs}\n {...(connection === undefined ? {} : { connection })}\n {...(visitor === undefined ? {} : { visitor })}\n {...(questions ? { questions } : {})}\n />\n );\n const submitLabel = form.submitLabel ?? say('submit');\n /* Where a reference's choices are read, and so its name: the reader's connection, or the visitor's signed-out read. */\n const source = connection !== undefined ? connection : visitor ? { visitor } : undefined;\n const from: ReviewSource | undefined = source === undefined ? undefined : { source, identityEpoch };\n /* The steps so far say a reference by the name its picker read for its key, never by the key. */\n const nameOf: NameOf = (field, value) => (source === undefined ? undefined : knownReferenceName(field, source, identityEpoch, value));\n /** A step's fields as it draws them: a row side by side, the rest one to a line. On the review, a sensitive answer\n is its last four and a way to ask for it again. */\n const body = (step: FormStep, onReview = false) =>\n (step.rows ?? step.fields.map((name) => [name])).map((row, index) => {\n const cells = row.map((name) => {\n const field = byName.get(name);\n if (!field) return null;\n if (onReview && sensitiveText(field) && holds(field, values[name]) && !asked.has(name))\n return (\n <div key={name} className=\"intake-masked\">\n <span className=\"intake-masked-label\">{field.label}</span>\n <span className=\"intake-masked-line\">\n <span className=\"intake-masked-value\">{maskedLast4(String(values[name]), field.mask)}</span>\n <Button\n intent=\"secondary\"\n size=\"compact\"\n disabled={pending}\n aria-label={say('change', { label: field.label })}\n onClick={() => {\n change({ ...values, [name]: '' }, name);\n setAsked((before) => new Set(before).add(name));\n }}\n >\n {say('changeStep')}\n </Button>\n </span>\n </div>\n );\n return <Fragment key={name}>{controls([field])}</Fragment>;\n });\n return cells.length > 1 ? <Columns key={index}>{cells}</Columns> : <Fragment key={index}>{cells}</Fragment>;\n });\n /** The intake style's review: every step's answers as a summary under its name, and a Change that opens that\n step's fields in place, live. A step holding a problem is open, so a refusal is drawn beside its field. */\n const editableReview = () => {\n const Heading = inDialog ? 'h3' : 'h2';\n const hiddenNow = draftHidden(fields, values);\n const troubled = (step: FormStep) =>\n stepFields(step).some((field) =>\n Object.keys(problems).some(\n (key) => problems[key] && (key === field.name || key.startsWith(`${field.name}.`) || key.startsWith(`${field.name}[`)),\n ),\n );\n return (\n <div className=\"intake-review\">\n {(form.steps ?? []).map((step, index) => {\n const open = opened.has(step.id) || troubled(step);\n return (\n <section key={step.id} className=\"intake-review-section\" aria-labelledby={`${id}-review-${index}`}>\n <div className=\"intake-review-head\">\n <Heading id={`${id}-review-${index}`}>{step.label}</Heading>\n {!open && (\n <Button\n intent=\"quiet\"\n disabled={pending}\n aria-label={say('change', { label: step.label })}\n onClick={() => setOpened((before) => new Set(before).add(step.id))}\n >\n {say('changeStep')}\n </Button>\n )}\n </div>\n {open ? (\n <fieldset className=\"command-fields\" disabled={pending}>\n {body(step, true)}\n </fieldset>\n ) : (\n <dl className=\"intake-summary\">\n {stepFields(step)\n .filter((field) => !hiddenNow.has(field.name) && shownOnReview(field, values[field.name]))\n .map((field) => (\n <div key={field.name}>\n <dt>{field.label}</dt>\n <dd>\n <ReviewValue field={field} value={values[field.name]} {...(from ? { from } : {})} />\n </dd>\n </div>\n ))}\n </dl>\n )}\n </section>\n );\n })}\n </div>\n );\n };\n /** Whether a step holds nothing yet, so its primary may say \"Skip\". */\n const stepEmpty = (step: FormStep) => step.id !== REVIEW && stepFields(step).every((field) => !holds(field, values[field.name]));\n /** The review: every answer as this page holds it, step by step, with a way back to each. */\n const answers = () => {\n // A question the answers hide is not on the review: it is not sent.\n const hiddenNow = draftHidden(fields, values);\n let said: Record<string, unknown> = values;\n try {\n said = commandInput(fields, values);\n } catch {\n /* each step was checked on its way here */\n }\n return (\n <div className=\"form-review\">\n {(form.steps ?? []).map((step, index) => (\n <section key={step.id} aria-labelledby={`${id}-review-${index}`}>\n <div className=\"form-review-head\">\n <h3 id={`${id}-review-${index}`}>{step.label}</h3>\n <Button intent=\"quiet\" size=\"compact\" onClick={() => setCurrent(index)} aria-label={say('change', { label: step.label })}>\n {say('changeStep')}\n </Button>\n </div>\n <dl>\n {stepFields(step)\n .filter((field) => !hiddenNow.has(field.name) && shownOnReview(field, said[field.name]))\n .map((field) => (\n <div key={field.name}>\n <dt>{field.label}</dt>\n <dd>\n <ReviewValue field={field} value={said[field.name]} {...(from ? { from } : {})} />\n </dd>\n </div>\n ))}\n </dl>\n </section>\n ))}\n </div>\n );\n };\n /** A step is left when the page's own check of it passes and, where the host asks the server, the server's too. On the\n editable review every step's fields are judged again, wherever they were typed. */\n const validateStep = async (step: FormStep): Promise<boolean> => {\n if (step.id === REVIEW) return !intake || check(fields);\n if (!check(stepFields(step))) return false;\n // A public form asks its own step check (formRoutes.ts) unless the host gives another way to ask.\n const ask =\n checkStep ??\n (visitor\n ? // A part of its own, fetched the first time a step is left: a form without steps never asks it.\n async (stepId: string, input: CommandInputValue) =>\n (await import('./formStepCheck.js')).checkPublicFormStep(form.id, stepId, input, visitor.via)\n : undefined);\n if (!ask) return true;\n const upTo = (form.steps ?? []).slice(0, (form.steps ?? []).findIndex((item) => item.id === step.id) + 1);\n const soFar = upTo.flatMap(stepFields);\n const found = await ask(\n step.id,\n commandInput(soFar, values, questions, { whole: { fields, values } }),\n soFar.map((field) => field.name),\n );\n if (!found || !Object.keys(found).length) return true;\n setProblems((before) => ({ ...before, ...found }));\n return false;\n };\n /* A public form's guard: the decoy a script fills and a person never meets, and the human check's slot. */\n const guard = visitor ? <PublicGuard handle={guarded} {...(form.challenge ? { widget: form.challenge } : {})} /> : null;\n /* The form's own line — what is not about a field on screen — above the\n actions, where the eye is before it presses, never under them. */\n const description = form.description ? <p className=\"form-page-description\">{form.description}</p> : null;\n const said = (\n <p className=\"form-page-failure\" tabIndex={-1} role=\"alert\" aria-live=\"assertive\" hidden={!failure}>\n {failure}\n </p>\n );\n return (\n <section\n ref={surface}\n className=\"form-page\"\n {...(intake ? { 'data-style': 'intake', 'aria-label': form.label } : { 'aria-labelledby': `${id}-title` })}\n >\n {/* An intake form has no heading of its own: the step's title is the room's h1 (the dialog's, in a dialog), the\n form's label is the trail's last step or the tab's title, and the App is the brand row's. */}\n {!intake && <p className=\"eyebrow\">{appName}</p>}\n {!intake && <h1 id={`${id}-title`}>{form.label}</h1>}\n {/* Said once: over a one-page form, and on a stepped form's first step only, under its title — over the bar on\n every step it was the same paragraph read again at each, pushing each question down. */}\n {!steps && description}\n {attempt?.recovery ? (\n <>\n <fieldset className=\"command-fields\" disabled>\n {controls(fields)}\n </fieldset>\n {attempt.recovery}\n </>\n ) : (\n <form\n noValidate\n onSubmit={(event) => {\n event.preventDefault();\n if (!pending && !attempt?.locked && !form.steps && check(fields)) void complete();\n }}\n >\n {steps ? (\n <MultiStepForm\n steps={steps}\n className=\"form-page-steps\"\n completeLabel={submitLabel}\n said={said}\n onStepChange={(index: number) => {\n setFailure('');\n if (reviewing) setCurrent(index);\n }}\n {...(reviewing ? { step: current } : {})}\n validateStep={validateStep}\n onComplete={complete}\n presentation={inDialog ? 'dialog' : 'page'}\n /* What each step said, beside a page's form; nothing on the review, which says it all. */\n summarize={(step: FormStep, active: FormStep) => {\n if (active.id === REVIEW) return undefined;\n // A question the answers hide is not asked, so it says nothing where the answers are read back.\n const hidden = draftHidden(fields, values);\n return stepSaid(\n stepFields(step).filter((field) => !hidden.has(field.name)),\n values,\n nameOf,\n );\n }}\n {...(intake ? { style: 'intake' as const, note: <IntakeNote note={form.note} />, isStepEmpty: stepEmpty } : {})}\n >\n {(step, index) =>\n step.id === REVIEW ? (\n intake ? (\n editableReview()\n ) : (\n answers()\n )\n ) : (\n <>\n {index === 0 && description}\n <fieldset className=\"command-fields\">{body(step)}</fieldset>\n </>\n )\n }\n </MultiStepForm>\n ) : (\n <>\n <fieldset className=\"command-fields\" disabled={pending}>\n {controls(fields)}\n </fieldset>\n {guard}\n {said}\n <div className=\"form-actions\">\n <Button intent=\"primary\" type=\"submit\" busy={pending || attempt?.locked} busyLabel={say('common.submitting')}>\n {submitLabel}\n </Button>\n {onDismiss && (\n <Button intent=\"secondary\" disabled={pending} onClick={onDismiss}>\n {say('common.cancel')}\n </Button>\n )}\n </div>\n </>\n )}\n {steps && guard}\n </form>\n )}\n </section>\n );\n}\n"],"mappings":"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"}
|
|
@@ -1,33 +1,33 @@
|
|
|
1
1
|
import { n as __exportAll } from "./shared-C-UrYobY.js";
|
|
2
2
|
import { E as sessionIdentity, I as quoteValue, N as andQuery, Q as Problem, Z as Empty, h as rowPart, ht as Icon, it as useQuery, n as GridSkeleton, tt as useMessageLanguage } from "./shared-poc11xxo.js";
|
|
3
3
|
import { D as columnKind, F as primaryKey, Ft as shellRoot, G as currencyPath, Gt as formatDayHeading, Jt as formatNumber, Lt as dayOf, Pn as useQueryClient, Tn as replaceEqualDeep, Vt as formatBytes, Wt as formatDateTime, Xt as formatRelativeDay, Zt as formatTimeOfDay, _t as message, b as withUnit, d as dressFor, f as groupLabel, gt as defineMessages, lt as assertNever, m as initialsOf, p as hueOf, rn as shell, ut as humanName, y as sayValue, yn as keepPreviousData } from "./shared-DJZjSi3J.js";
|
|
4
|
-
import { L as DropItem, R as DropMenu, a as canInsert, c as openRelatedRecord, l as countsChanged, ut as useQueries } from "./shared-
|
|
5
|
-
import { o as filesOnLease, s as saveFileOnLease } from "./shared-
|
|
6
|
-
import { B as toast, L as state, T as recordLabel, U as writeAllowed, Y as disclosure, _ as openRecord, c as columnLabel, d as findTable, f as go, i as api, j as rowLabel, m as labelPath, s as columnDisplay, st as ownedBy, u as emptyWord, w as quote, z as tableView } from "./shared-
|
|
4
|
+
import { L as DropItem, R as DropMenu, a as canInsert, c as openRelatedRecord, l as countsChanged, ut as useQueries } from "./shared-BHsjawAG.js";
|
|
5
|
+
import { o as filesOnLease, s as saveFileOnLease } from "./shared-CMjK-Ucd.js";
|
|
6
|
+
import { B as toast, L as state, T as recordLabel, U as writeAllowed, Y as disclosure, _ as openRecord, c as columnLabel, d as findTable, f as go, i as api, j as rowLabel, m as labelPath, s as columnDisplay, st as ownedBy, u as emptyWord, w as quote, z as tableView } from "./shared-BoLbc2WD.js";
|
|
7
7
|
import { a as served } from "./shared-sZ8B7ZTw.js";
|
|
8
|
-
import { n as useArrived, t as onDemand } from "./shared-
|
|
9
|
-
import { A as batchedBreakdown, B as figureSayer, E as PresentationSwitch, G as orderGroups, J as sayer, L as barShare, N as CurrencyFigures, P as EXACT, W as namedGroups, _t as wholeColumn, a as viewLink, c as RecordSummaries, dt as rowKeyString, n as formLink, o as ListEmpty, s as RowActions, t as DashboardNote, u as Grid, ut as RowTrailHosts, vt as presentationColumns } from "./shared-
|
|
8
|
+
import { n as useArrived, t as onDemand } from "./shared-B-BUF9fx.js";
|
|
9
|
+
import { A as batchedBreakdown, B as figureSayer, E as PresentationSwitch, G as orderGroups, J as sayer, L as barShare, N as CurrencyFigures, P as EXACT, W as namedGroups, _t as wholeColumn, a as viewLink, c as RecordSummaries, dt as rowKeyString, n as formLink, o as ListEmpty, s as RowActions, t as DashboardNote, u as Grid, ut as RowTrailHosts, vt as presentationColumns } from "./shared-XcSKDp6N.js";
|
|
10
10
|
import { a as ErrorBoundary, o as useListNavigation } from "./shared-C3MTHv9P.js";
|
|
11
|
-
import { c as updateAttempts, d as RefJump, f as Value, y as opensRecord } from "./shared-
|
|
11
|
+
import { c as updateAttempts, d as RefJump, f as Value, y as opensRecord } from "./shared-Chp88all.js";
|
|
12
12
|
import { n as pluralOf, r as recordNoun, t as headingOf } from "./shared-BZ8KfT9k.js";
|
|
13
13
|
import { n as pathEqualityFilter, r as recordKey } from "./shared-_IMKuuvy.js";
|
|
14
|
-
import { t as listColumn } from "./shared-
|
|
15
|
-
import { a as inlineFileAddress } from "./shared-
|
|
14
|
+
import { t as listColumn } from "./shared-DyKsJTZs.js";
|
|
15
|
+
import { a as inlineFileAddress } from "./shared-BOe4W2FI.js";
|
|
16
16
|
import { n as tabMatches } from "./shared-DVZ7wmSR.js";
|
|
17
|
-
import { n as mayRunAny } from "./shared-
|
|
18
|
-
import { a as withoutParent, n as recordViewKey, o as withoutParentName, r as recordViewLabel } from "./shared-
|
|
17
|
+
import { n as mayRunAny } from "./shared-eZ0SB_zm.js";
|
|
18
|
+
import { a as withoutParent, n as recordViewKey, o as withoutParentName, r as recordViewLabel } from "./shared-C9DZtSFH.js";
|
|
19
19
|
import { l as offeredBy, u as resourceOf$1 } from "./shared-DpVb48sM.js";
|
|
20
|
-
import { t as useTabFold } from "./shared-
|
|
21
|
-
import { l as rootMatches, s as pinnedBy, u as sectionClass } from "./shared-
|
|
20
|
+
import { t as useTabFold } from "./shared-CepLAhwm.js";
|
|
21
|
+
import { l as rootMatches, s as pinnedBy, u as sectionClass } from "./shared-Bf30ZLoS.js";
|
|
22
22
|
import { t as workflowLabel } from "./shared-DNccGrUo.js";
|
|
23
|
-
import { a as groupsBody, c as listView, f as appTargetFields, i as fieldsColumns, l as metricMeasure, n as defaultFieldPaths, r as definedThrough, u as timelineReads } from "./shared-
|
|
24
|
-
import { n as canEditRow } from "./shared-
|
|
25
|
-
import "./shared-
|
|
26
|
-
import { t as Editable } from "./shared-
|
|
23
|
+
import { a as groupsBody, c as listView, f as appTargetFields, i as fieldsColumns, l as metricMeasure, n as defaultFieldPaths, r as definedThrough, u as timelineReads } from "./shared-CZJE4Bmp.js";
|
|
24
|
+
import { n as canEditRow } from "./shared-BHCQ60yN.js";
|
|
25
|
+
import "./shared-Z4uBJU6I.js";
|
|
26
|
+
import { t as Editable } from "./shared-BumxsBlA.js";
|
|
27
27
|
import { n as formShownFields } from "./shared-CoarExWh.js";
|
|
28
|
-
import { i as sharedPrefix, n as groupFactPaths, r as groupTable, t as cardStem } from "./shared-
|
|
29
|
-
import { n as relatedRows } from "./shared-
|
|
30
|
-
import { b as relatedCreatePlan } from "./shared-
|
|
28
|
+
import { i as sharedPrefix, n as groupFactPaths, r as groupTable, t as cardStem } from "./shared-BdA3LPCB.js";
|
|
29
|
+
import { n as relatedRows } from "./shared-CuZt26rm.js";
|
|
30
|
+
import { b as relatedCreatePlan } from "./shared-CL3RLKDA.js";
|
|
31
31
|
import { createContext, useContext, useEffect, useId, useLayoutEffect, useMemo, useRef, useState } from "react";
|
|
32
32
|
import { Fragment as Fragment$1, jsx, jsxs } from "react/jsx-runtime";
|
|
33
33
|
// packages/kit/src/client/components/pageContext.ts
|
|
@@ -504,7 +504,7 @@ var say$5 = defineMessages({
|
|
|
504
504
|
* also names the record for the head and, in an App, hands the head the
|
|
505
505
|
* editor for the record's name.
|
|
506
506
|
*/
|
|
507
|
-
var DefinedFields = onDemand(() => import("./shared-
|
|
507
|
+
var DefinedFields = onDemand(() => import("./shared-cgXG7OgZ.js"), "DefinedFields", { quiet: true });
|
|
508
508
|
/** A property the reader cannot write but an action of theirs moves: the values it can reach, as a picker. The action is the
|
|
509
509
|
ordinary one — the server judges it again — so a refusal is said as the action's own would be. */
|
|
510
510
|
function ActionPick({ tableId, recordKey: recordKey$2, column, value, actions, caption, onDone, connection }) {
|
|
@@ -953,7 +953,7 @@ var say$4 = defineMessages({
|
|
|
953
953
|
* groups, biggest first, each group a way into its rows) and a chart (those
|
|
954
954
|
* groups measured and drawn). All read a plan the server compiled; none writes.
|
|
955
955
|
*/
|
|
956
|
-
var ChartFigure = onDemand(() => import("./shared-
|
|
956
|
+
var ChartFigure = onDemand(() => import("./shared-D_SkPtJ9.js").then((n) => n.n), "ChartFigure");
|
|
957
957
|
/** One number, and a way to see what it counted. */
|
|
958
958
|
function MetricSection({ section, plan }) {
|
|
959
959
|
const api = usePageApi();
|
|
@@ -1680,7 +1680,7 @@ function TimelineSection({ section, plan, base, recordKey }) {
|
|
|
1680
1680
|
] })
|
|
1681
1681
|
});
|
|
1682
1682
|
}
|
|
1683
|
-
onDemand(() => import("./shared-
|
|
1683
|
+
onDemand(() => import("./shared-B9H7_Pji.js"), "PrefsDialog", { quiet: true });
|
|
1684
1684
|
// packages/kit/src/client/copy/record/components/PageCurrent.ts
|
|
1685
1685
|
/** What PageCurrent says, in the record page room (packages/kit/src/client/messages.ts says how the catalog is split). */
|
|
1686
1686
|
var say$2 = defineMessages({});
|
|
@@ -1815,10 +1815,10 @@ var say$1 = defineMessages({
|
|
|
1815
1815
|
* attachments when the rows are files — with the create, upload and pager
|
|
1816
1816
|
* a list offers. Adding refreshes every list, timeline and count on the page.
|
|
1817
1817
|
*/
|
|
1818
|
-
var AttachmentList = onDemand(() => import("./shared-
|
|
1819
|
-
var CardsList = onDemand(() => import("./shared-
|
|
1820
|
-
var GroupedBody = onDemand(() => import("./shared-
|
|
1821
|
-
var Gallery = onDemand(() => import("./shared-
|
|
1818
|
+
var AttachmentList = onDemand(() => import("./shared-FO7vfI3F.js"), "AttachmentList");
|
|
1819
|
+
var CardsList = onDemand(() => import("./shared-Dh0nHtLZ.js"), "CardsList");
|
|
1820
|
+
var GroupedBody = onDemand(() => import("./shared-C_BhUL2I.js"), "GroupedBody");
|
|
1821
|
+
var Gallery = onDemand(() => import("./shared-D1KWuCg6.js"), "Gallery");
|
|
1822
1822
|
/** The App resource over this table, if there is one. */
|
|
1823
1823
|
function resourceOf(table) {
|
|
1824
1824
|
if (!table) return void 0;
|
|
@@ -2318,7 +2318,7 @@ function RelatedList({ section, plan, base, recordKey: recordKey$1, onEdit, coll
|
|
|
2318
2318
|
const send = async (picked) => {
|
|
2319
2319
|
if (!table || isCurrent && !isCurrent()) return say$1("thisPageHasMovedOnNothing");
|
|
2320
2320
|
try {
|
|
2321
|
-
const { fileToBase64 } = await import("./shared-
|
|
2321
|
+
const { fileToBase64 } = await import("./shared-FO7vfI3F.js");
|
|
2322
2322
|
const data = await api("/api/file/upload", {
|
|
2323
2323
|
table: table.id,
|
|
2324
2324
|
values: {
|
|
@@ -2734,8 +2734,8 @@ var PageSections_exports = /* @__PURE__ */ __exportAll({
|
|
|
2734
2734
|
Sections: () => Sections,
|
|
2735
2735
|
TabStrip: () => TabStrip
|
|
2736
2736
|
});
|
|
2737
|
-
var RecordHistory = onDemand(() => import("./shared-
|
|
2738
|
-
var RecordFlows = onDemand(() => import("./shared-
|
|
2737
|
+
var RecordHistory = onDemand(() => import("./shared-BAXr20S-.js"), "RecordHistory");
|
|
2738
|
+
var RecordFlows = onDemand(() => import("./shared-j_J16p2B.js"), "RecordFlows");
|
|
2739
2739
|
var FlowDiagram = onDemand(() => import("./shared-BRvtSr31.js"), "FlowDiagram");
|
|
2740
2740
|
function CustomSlot(props) {
|
|
2741
2741
|
const pageApi = usePageApi();
|
|
@@ -3155,4 +3155,4 @@ function MetricRun({ items, draw }) {
|
|
|
3155
3155
|
}
|
|
3156
3156
|
export { shareRecordSource as a, spoken as c, readRecordSource as i, usePageApi as l, Sections as n, PageRenderContext as o, canDelete as r, recordReadNames as s, PageSections_exports as t };
|
|
3157
3157
|
|
|
3158
|
-
//# sourceMappingURL=shared-
|
|
3158
|
+
//# sourceMappingURL=shared-B5aBCUi7.js.map
|