@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.
Files changed (221) hide show
  1. package/README.md +4 -3
  2. package/dist/client/assets/LayoutBuilder-MPzkVU2e.js.map +1 -1
  3. package/dist/client/assets/index-D2dHI6hR.js.map +1 -1
  4. package/dist/client/assets/shell-TreN_uLs.js.map +1 -1
  5. package/dist/docs/access-model.md +1 -1
  6. package/dist/docs/build-and-deploy.md +0 -1
  7. package/dist/docs/cli.md +1 -1
  8. package/dist/docs/glossary.md +3 -3
  9. package/dist/docs/query.md +9 -21
  10. package/dist/docs/status.md +3 -3
  11. package/dist/embed/react/chunks/LayoutBuilder-Cbxa_wve.js.map +1 -1
  12. package/dist/embed/react/chunks/app-0UZ1Re1k.js.map +1 -1
  13. package/dist/embed/react/chunks/page-Bx4o1kpQ.js.map +1 -1
  14. package/dist/embed/react/chunks/palette-Bb7Lf6eo.js.map +1 -1
  15. package/dist/embed/react/chunks/shell-DZRACiB9.js.map +1 -1
  16. package/dist/embed/react/chunks/write-BQO4CFc9.js.map +1 -1
  17. package/dist/embed/react/index.js +1 -1
  18. package/dist/server/build/dockerfile.js +1 -1
  19. package/dist/server/cli/usage.js +2 -2
  20. package/dist/ui/index.js +2 -2
  21. package/dist/ui/page.js +2 -2
  22. package/dist/ui/{shared-N4Ej8yRD.js → shared-1PD7TOTJ.js} +5 -5
  23. package/dist/ui/{shared-N4Ej8yRD.js.map → shared-1PD7TOTJ.js.map} +1 -1
  24. package/dist/ui/{shared-D5m86-4o.js → shared-1gMnOu9J.js} +6 -6
  25. package/dist/ui/{shared-D5m86-4o.js.map → shared-1gMnOu9J.js.map} +1 -1
  26. package/dist/ui/{shared-Ctaj8mR2.js → shared-5RQMi4BR.js} +3 -3
  27. package/dist/ui/{shared-Ctaj8mR2.js.map → shared-5RQMi4BR.js.map} +1 -1
  28. package/dist/ui/{shared-DpLeIATZ.js → shared-B-BUF9fx.js} +2 -2
  29. package/dist/ui/{shared-DpLeIATZ.js.map → shared-B-BUF9fx.js.map} +1 -1
  30. package/dist/ui/{shared-DWYnjItP.js → shared-B-MhiPIN.js} +9 -9
  31. package/dist/ui/{shared-DWYnjItP.js.map → shared-B-MhiPIN.js.map} +1 -1
  32. package/dist/ui/{shared-0fNuhSbG.js → shared-B07qIMlE.js} +5 -5
  33. package/dist/ui/{shared-0fNuhSbG.js.map → shared-B07qIMlE.js.map} +1 -1
  34. package/dist/ui/{shared-lYtMadRU.js → shared-B1SAS_J-.js} +3 -3
  35. package/dist/ui/{shared-lYtMadRU.js.map → shared-B1SAS_J-.js.map} +1 -1
  36. package/dist/ui/{shared-CpI0Y8M5.js → shared-B4jgU8h9.js} +6 -6
  37. package/dist/ui/{shared-CpI0Y8M5.js.map → shared-B4jgU8h9.js.map} +1 -1
  38. package/dist/ui/{shared-Cxu1c35l.js → shared-B5aBCUi7.js} +30 -30
  39. package/dist/ui/{shared-Cxu1c35l.js.map → shared-B5aBCUi7.js.map} +1 -1
  40. package/dist/ui/{shared-CAe-US1q.js → shared-B9H7_Pji.js} +5 -5
  41. package/dist/ui/{shared-CAe-US1q.js.map → shared-B9H7_Pji.js.map} +1 -1
  42. package/dist/ui/{shared-Q2bgBaYo.js → shared-BAXr20S-.js} +4 -4
  43. package/dist/ui/{shared-Q2bgBaYo.js.map → shared-BAXr20S-.js.map} +1 -1
  44. package/dist/ui/{shared-CyEefFFb.js → shared-BDDUzH-f.js} +19 -19
  45. package/dist/ui/{shared-CyEefFFb.js.map → shared-BDDUzH-f.js.map} +1 -1
  46. package/dist/ui/{shared-BdhPI6dq.js → shared-BGmkeDeW.js} +3 -3
  47. package/dist/ui/{shared-BdhPI6dq.js.map → shared-BGmkeDeW.js.map} +1 -1
  48. package/dist/ui/{shared-DONIpq2q.js → shared-BHCQ60yN.js} +2 -2
  49. package/dist/ui/{shared-DONIpq2q.js.map → shared-BHCQ60yN.js.map} +1 -1
  50. package/dist/ui/{shared-CNmaAv64.js → shared-BHsjawAG.js} +8 -8
  51. package/dist/ui/{shared-CNmaAv64.js.map → shared-BHsjawAG.js.map} +1 -1
  52. package/dist/ui/{shared-DgjU9kOy.js → shared-BIQuK_nq.js} +4 -4
  53. package/dist/ui/{shared-DgjU9kOy.js.map → shared-BIQuK_nq.js.map} +1 -1
  54. package/dist/ui/{shared-icSQAj21.js → shared-BOe4W2FI.js} +3 -3
  55. package/dist/ui/{shared-icSQAj21.js.map → shared-BOe4W2FI.js.map} +1 -1
  56. package/dist/ui/{shared-BlxoOJSk.js → shared-BPpC08ip.js} +3 -3
  57. package/dist/ui/{shared-BlxoOJSk.js.map → shared-BPpC08ip.js.map} +1 -1
  58. package/dist/ui/{shared-BtiFL37J.js → shared-BdA3LPCB.js} +2 -2
  59. package/dist/ui/{shared-BtiFL37J.js.map → shared-BdA3LPCB.js.map} +1 -1
  60. package/dist/ui/{shared-CvR94vn4.js → shared-Be3nbWsd.js} +11 -11
  61. package/dist/ui/{shared-CvR94vn4.js.map → shared-Be3nbWsd.js.map} +1 -1
  62. package/dist/ui/{shared-Bl_nF_IH.js → shared-Bf30ZLoS.js} +8 -4
  63. package/dist/ui/shared-Bf30ZLoS.js.map +1 -0
  64. package/dist/ui/{shared-DijrJ_V-.js → shared-BguP_BaR.js} +7 -7
  65. package/dist/ui/{shared-DijrJ_V-.js.map → shared-BguP_BaR.js.map} +1 -1
  66. package/dist/ui/{shared-DPAVoWY0.js → shared-BoLbc2WD.js} +17 -2
  67. package/dist/ui/{shared-DPAVoWY0.js.map → shared-BoLbc2WD.js.map} +1 -1
  68. package/dist/ui/{shared-BkdBTYwx.js → shared-BttyOW4W.js} +3 -3
  69. package/dist/ui/{shared-BkdBTYwx.js.map → shared-BttyOW4W.js.map} +1 -1
  70. package/dist/ui/{shared-CQWLz8uT.js → shared-BumxsBlA.js} +10 -10
  71. package/dist/ui/{shared-CQWLz8uT.js.map → shared-BumxsBlA.js.map} +1 -1
  72. package/dist/ui/{shared-Dzu7tFiC.js → shared-Bw73ktBk.js} +3 -3
  73. package/dist/ui/{shared-Dzu7tFiC.js.map → shared-Bw73ktBk.js.map} +1 -1
  74. package/dist/ui/{shared-BhAYErSx.js → shared-C1B0GH0e.js} +4 -4
  75. package/dist/ui/{shared-BhAYErSx.js.map → shared-C1B0GH0e.js.map} +1 -1
  76. package/dist/ui/{shared-BQJQcGgj.js → shared-C2FsyYr7.js} +4 -4
  77. package/dist/ui/{shared-BQJQcGgj.js.map → shared-C2FsyYr7.js.map} +1 -1
  78. package/dist/ui/{shared-B9lw2Ryh.js → shared-C2RU1qjv.js} +4 -4
  79. package/dist/ui/{shared-B9lw2Ryh.js.map → shared-C2RU1qjv.js.map} +1 -1
  80. package/dist/ui/{shared-DQYNI9wO.js → shared-C42f07hJ.js} +5 -5
  81. package/dist/ui/{shared-DQYNI9wO.js.map → shared-C42f07hJ.js.map} +1 -1
  82. package/dist/ui/{shared-CqCZ8wMY.js → shared-C4LkPCU4.js} +3 -3
  83. package/dist/ui/{shared-CqCZ8wMY.js.map → shared-C4LkPCU4.js.map} +1 -1
  84. package/dist/ui/{shared-BhtpgOpa.js → shared-C4wSfz6k.js} +9 -9
  85. package/dist/ui/{shared-BhtpgOpa.js.map → shared-C4wSfz6k.js.map} +1 -1
  86. package/dist/ui/{shared-BHc2Izkj.js → shared-C9DZtSFH.js} +2 -2
  87. package/dist/ui/{shared-BHc2Izkj.js.map → shared-C9DZtSFH.js.map} +1 -1
  88. package/dist/ui/{shared-DW1YuiNS.js → shared-CA52ClGo.js} +2 -2
  89. package/dist/ui/{shared-DW1YuiNS.js.map → shared-CA52ClGo.js.map} +1 -1
  90. package/dist/ui/{shared-BbSbilkh.js → shared-CBciTwm6.js} +9 -9
  91. package/dist/ui/{shared-BbSbilkh.js.map → shared-CBciTwm6.js.map} +1 -1
  92. package/dist/ui/{shared-C-J32eBn.js → shared-CL3RLKDA.js} +16 -16
  93. package/dist/ui/{shared-C-J32eBn.js.map → shared-CL3RLKDA.js.map} +1 -1
  94. package/dist/ui/{shared-Ck8S4OxW.js → shared-CLq3-_hW.js} +3 -3
  95. package/dist/ui/{shared-Ck8S4OxW.js.map → shared-CLq3-_hW.js.map} +1 -1
  96. package/dist/ui/{shared-Q5WefT7G.js → shared-CMjK-Ucd.js} +3 -3
  97. package/dist/ui/{shared-Q5WefT7G.js.map → shared-CMjK-Ucd.js.map} +1 -1
  98. package/dist/ui/{shared-D3MAuEA3.js → shared-CPjpSFGh.js} +2 -2
  99. package/dist/ui/{shared-D3MAuEA3.js.map → shared-CPjpSFGh.js.map} +1 -1
  100. package/dist/ui/{shared-VshXGwXP.js → shared-CSPhENq3.js} +2 -2
  101. package/dist/ui/{shared-VshXGwXP.js.map → shared-CSPhENq3.js.map} +1 -1
  102. package/dist/ui/{shared-DJrJaE73.js → shared-CZJE4Bmp.js} +3 -3
  103. package/dist/ui/{shared-DJrJaE73.js.map → shared-CZJE4Bmp.js.map} +1 -1
  104. package/dist/ui/{shared-D7ONOwI7.js → shared-C_BhUL2I.js} +7 -7
  105. package/dist/ui/{shared-D7ONOwI7.js.map → shared-C_BhUL2I.js.map} +1 -1
  106. package/dist/ui/{shared-j-2peBIB.js → shared-CbeujwdU.js} +4 -4
  107. package/dist/ui/{shared-j-2peBIB.js.map → shared-CbeujwdU.js.map} +1 -1
  108. package/dist/ui/{shared-D5GrOEa2.js → shared-Cbf-o4Dt.js} +4 -4
  109. package/dist/ui/{shared-D5GrOEa2.js.map → shared-Cbf-o4Dt.js.map} +1 -1
  110. package/dist/ui/{shared-HwiPIajr.js → shared-CdNmeNHh.js} +3 -3
  111. package/dist/ui/{shared-HwiPIajr.js.map → shared-CdNmeNHh.js.map} +1 -1
  112. package/dist/ui/{shared-ZCFt-CPb.js → shared-CdQOMD8J.js} +3 -3
  113. package/dist/ui/{shared-ZCFt-CPb.js.map → shared-CdQOMD8J.js.map} +1 -1
  114. package/dist/ui/{shared-ClhXSGGK.js → shared-CdiPYlTh.js} +2 -2
  115. package/dist/ui/{shared-ClhXSGGK.js.map → shared-CdiPYlTh.js.map} +1 -1
  116. package/dist/ui/{shared-DA8_pVRZ.js → shared-CepLAhwm.js} +2 -2
  117. package/dist/ui/{shared-DA8_pVRZ.js.map → shared-CepLAhwm.js.map} +1 -1
  118. package/dist/ui/{shared-BrYKjrnM.js → shared-Ch82h_Fu.js} +6 -6
  119. package/dist/ui/{shared-BrYKjrnM.js.map → shared-Ch82h_Fu.js.map} +1 -1
  120. package/dist/ui/{shared-C4UrE8Fb.js → shared-Chp88all.js} +3 -3
  121. package/dist/ui/{shared-C4UrE8Fb.js.map → shared-Chp88all.js.map} +1 -1
  122. package/dist/ui/{shared-CWa80DTO.js → shared-Ci16s2rN.js} +9 -9
  123. package/dist/ui/{shared-CWa80DTO.js.map → shared-Ci16s2rN.js.map} +1 -1
  124. package/dist/ui/{shared-tksTLD6Q.js → shared-CiqNkoE1.js} +5 -5
  125. package/dist/ui/{shared-tksTLD6Q.js.map → shared-CiqNkoE1.js.map} +1 -1
  126. package/dist/ui/{shared-yt7DjSrq.js → shared-CpMhOq8F.js} +2 -2
  127. package/dist/ui/{shared-yt7DjSrq.js.map → shared-CpMhOq8F.js.map} +1 -1
  128. package/dist/ui/{shared-Dm0z5WUl.js → shared-CrWv5JKH.js} +6 -6
  129. package/dist/ui/{shared-Dm0z5WUl.js.map → shared-CrWv5JKH.js.map} +1 -1
  130. package/dist/ui/{shared-CQL3FGHc.js → shared-Csfi3Pti.js} +2 -2
  131. package/dist/ui/{shared-CQL3FGHc.js.map → shared-Csfi3Pti.js.map} +1 -1
  132. package/dist/ui/{shared-BKNRbm-V.js → shared-CuZt26rm.js} +2 -2
  133. package/dist/ui/{shared-BKNRbm-V.js.map → shared-CuZt26rm.js.map} +1 -1
  134. package/dist/ui/{shared-Guq3upiR.js → shared-Cws_z-TS.js} +2 -2
  135. package/dist/ui/{shared-Guq3upiR.js.map → shared-Cws_z-TS.js.map} +1 -1
  136. package/dist/ui/{shared-Bw_qZeIj.js → shared-D1KWuCg6.js} +2 -2
  137. package/dist/ui/{shared-Bw_qZeIj.js.map → shared-D1KWuCg6.js.map} +1 -1
  138. package/dist/ui/{shared-CuCZKwXW.js → shared-D66ju_Cb.js} +23 -23
  139. package/dist/ui/{shared-CuCZKwXW.js.map → shared-D66ju_Cb.js.map} +1 -1
  140. package/dist/ui/{shared-DYfX7NSM.js → shared-DGaQZXnw.js} +2 -2
  141. package/dist/ui/{shared-DYfX7NSM.js.map → shared-DGaQZXnw.js.map} +1 -1
  142. package/dist/ui/{shared-B3Hp8tOv.js → shared-DHy41sET.js} +6 -6
  143. package/dist/ui/{shared-B3Hp8tOv.js.map → shared-DHy41sET.js.map} +1 -1
  144. package/dist/ui/{shared-CXyd7IKi.js → shared-DKEOMQ6l.js} +2 -2
  145. package/dist/ui/{shared-CXyd7IKi.js.map → shared-DKEOMQ6l.js.map} +1 -1
  146. package/dist/ui/{shared-Ccmc8YO0.js → shared-DSUICuaJ.js} +33 -33
  147. package/dist/ui/{shared-Ccmc8YO0.js.map → shared-DSUICuaJ.js.map} +1 -1
  148. package/dist/ui/{shared-CL2iw_js.js → shared-DUPMRoO0.js} +13 -13
  149. package/dist/ui/{shared-CL2iw_js.js.map → shared-DUPMRoO0.js.map} +1 -1
  150. package/dist/ui/{shared-Dtp4eRul.js → shared-DVfdm6ah.js} +2 -2
  151. package/dist/ui/{shared-Dtp4eRul.js.map → shared-DVfdm6ah.js.map} +1 -1
  152. package/dist/ui/{shared-BJ5Ex32G.js → shared-DXM7d7lJ.js} +3 -3
  153. package/dist/ui/{shared-BJ5Ex32G.js.map → shared-DXM7d7lJ.js.map} +1 -1
  154. package/dist/ui/{shared-BFr6ld0e.js → shared-DXbMlcev.js} +2 -2
  155. package/dist/ui/{shared-BFr6ld0e.js.map → shared-DXbMlcev.js.map} +1 -1
  156. package/dist/ui/{shared-BUp3jv-N.js → shared-D_SkPtJ9.js} +6 -6
  157. package/dist/ui/{shared-BUp3jv-N.js.map → shared-D_SkPtJ9.js.map} +1 -1
  158. package/dist/ui/{shared-CdNomVzH.js → shared-Dd21k2ic.js} +4 -4
  159. package/dist/ui/{shared-CdNomVzH.js.map → shared-Dd21k2ic.js.map} +1 -1
  160. package/dist/ui/{shared-gRMbxmpu.js → shared-Dh0nHtLZ.js} +8 -8
  161. package/dist/ui/{shared-gRMbxmpu.js.map → shared-Dh0nHtLZ.js.map} +1 -1
  162. package/dist/ui/{shared-BKGJgjog.js → shared-DkOdSpSK.js} +3 -3
  163. package/dist/ui/{shared-BKGJgjog.js.map → shared-DkOdSpSK.js.map} +1 -1
  164. package/dist/ui/{shared-BMsh72Uq.js → shared-Dkph5ckT.js} +2 -2
  165. package/dist/ui/{shared-BMsh72Uq.js.map → shared-Dkph5ckT.js.map} +1 -1
  166. package/dist/ui/{shared-Be1HpDOB.js → shared-Dl1_Nx--.js} +3 -3
  167. package/dist/ui/{shared-Be1HpDOB.js.map → shared-Dl1_Nx--.js.map} +1 -1
  168. package/dist/ui/{shared-BQIZWOoJ.js → shared-Dm0IGbAf.js} +2 -2
  169. package/dist/ui/{shared-BQIZWOoJ.js.map → shared-Dm0IGbAf.js.map} +1 -1
  170. package/dist/ui/{shared-DSUtcU5S.js → shared-DnIkTpPr.js} +5 -5
  171. package/dist/ui/{shared-DSUtcU5S.js.map → shared-DnIkTpPr.js.map} +1 -1
  172. package/dist/ui/{shared-DsxGbYlV.js → shared-Docl_0tq.js} +3 -3
  173. package/dist/ui/{shared-DsxGbYlV.js.map → shared-Docl_0tq.js.map} +1 -1
  174. package/dist/ui/{shared-DZskrV26.js → shared-DprrHC72.js} +2 -2
  175. package/dist/ui/{shared-DZskrV26.js.map → shared-DprrHC72.js.map} +1 -1
  176. package/dist/ui/{shared-Bmw43Hwf.js → shared-DyKsJTZs.js} +2 -2
  177. package/dist/ui/{shared-Bmw43Hwf.js.map → shared-DyKsJTZs.js.map} +1 -1
  178. package/dist/ui/{shared-BLG88Pya.js → shared-FO7vfI3F.js} +4 -4
  179. package/dist/ui/{shared-BLG88Pya.js.map → shared-FO7vfI3F.js.map} +1 -1
  180. package/dist/ui/{shared-DLSd80D1.js → shared-HalAVHjv.js} +3 -3
  181. package/dist/ui/{shared-DLSd80D1.js.map → shared-HalAVHjv.js.map} +1 -1
  182. package/dist/ui/{shared-D1mMBLdj.js → shared-JvcI-LWp.js} +15 -15
  183. package/dist/ui/{shared-D1mMBLdj.js.map → shared-JvcI-LWp.js.map} +1 -1
  184. package/dist/ui/{shared-C6Hv_4O0.js → shared-K7Ym27yg.js} +2 -2
  185. package/dist/ui/{shared-C6Hv_4O0.js.map → shared-K7Ym27yg.js.map} +1 -1
  186. package/dist/ui/{shared-B39ln7oi.js → shared-SzlnwfJO.js} +3 -3
  187. package/dist/ui/{shared-B39ln7oi.js.map → shared-SzlnwfJO.js.map} +1 -1
  188. package/dist/ui/{shared-DgPn_Jll.js → shared-TrGbd1FY.js} +3 -3
  189. package/dist/ui/{shared-DgPn_Jll.js.map → shared-TrGbd1FY.js.map} +1 -1
  190. package/dist/ui/{shared-DrFb-XtA.js → shared-WhbuObEW.js} +2 -2
  191. package/dist/ui/{shared-DrFb-XtA.js.map → shared-WhbuObEW.js.map} +1 -1
  192. package/dist/ui/{shared-DiFQljcq.js → shared-XcSKDp6N.js} +11 -11
  193. package/dist/ui/{shared-DiFQljcq.js.map → shared-XcSKDp6N.js.map} +1 -1
  194. package/dist/ui/{shared-CMAg58rY.js → shared-Z4uBJU6I.js} +7 -6
  195. package/dist/ui/shared-Z4uBJU6I.js.map +1 -0
  196. package/dist/ui/{shared-BnUptuUp.js → shared-bAgeiRa5.js} +2 -2
  197. package/dist/ui/{shared-BnUptuUp.js.map → shared-bAgeiRa5.js.map} +1 -1
  198. package/dist/ui/{shared-BxMvSjey.js → shared-cgXG7OgZ.js} +5 -5
  199. package/dist/ui/{shared-BxMvSjey.js.map → shared-cgXG7OgZ.js.map} +1 -1
  200. package/dist/ui/{shared-u4CG2kQJ.js → shared-eZ0SB_zm.js} +2 -2
  201. package/dist/ui/{shared-u4CG2kQJ.js.map → shared-eZ0SB_zm.js.map} +1 -1
  202. package/dist/ui/{shared-L90bWW8e.js → shared-frKFb79C.js} +2 -2
  203. package/dist/ui/{shared-L90bWW8e.js.map → shared-frKFb79C.js.map} +1 -1
  204. package/dist/ui/{shared-Dd34nhkw.js → shared-hAayNSRA.js} +3 -3
  205. package/dist/ui/{shared-Dd34nhkw.js.map → shared-hAayNSRA.js.map} +1 -1
  206. package/dist/ui/{shared-DzC64cpp.js → shared-j_J16p2B.js} +2 -2
  207. package/dist/ui/{shared-DzC64cpp.js.map → shared-j_J16p2B.js.map} +1 -1
  208. package/dist/ui/{shared-DX7HRIV-.js → shared-tqpl5N3g.js} +6 -6
  209. package/dist/ui/{shared-DX7HRIV-.js.map → shared-tqpl5N3g.js.map} +1 -1
  210. package/dist/ui/{shared-BS5dBMpA.js → shared-y-6_ZDts.js} +2 -2
  211. package/dist/ui/{shared-BS5dBMpA.js.map → shared-y-6_ZDts.js.map} +1 -1
  212. package/dist/ui/{shared-Cv5v_MP1.js → shared-zG6e1Rhz.js} +13 -13
  213. package/dist/ui/{shared-Cv5v_MP1.js.map → shared-zG6e1Rhz.js.map} +1 -1
  214. package/dist/ui/testing.js +1 -1
  215. package/package.json +4 -4
  216. package/dist/docs/cli-browser.md +0 -232
  217. package/dist/docs/database-browser.md +0 -115
  218. package/dist/docs/keyboard.md +0 -63
  219. package/dist/docs/mcp.md +0 -86
  220. package/dist/ui/shared-Bl_nF_IH.js.map +0 -1
  221. package/dist/ui/shared-CMAg58rY.js.map +0 -1
@@ -1 +1 @@
1
- {"version":3,"file":"shared-DijrJ_V-.js","names":["_Fragment"],"sources":["../../src/client/components/sdk/componentKey.ts","../../src/client/copy/components/components/sdk/CustomSection.ts","../../src/client/components/sdk/CustomSection.tsx"],"sourcesContent":["/**\n * Which build of an App's component is current: its id and the hashed\n * address the App payload serves it at (`/{app}/_components/<id>-<hash>.js`).\n * A save that changes the component's code gives it a new address (server\n * appComponents.ts), so a cache keyed by this asks for the new code, where one\n * keyed by the id alone drew the old one for the page's life. A platform\n * input has no address, and is its id.\n */\nimport { useSyncExternalStore } from 'react';\nimport { pageBridge } from '@mistriwork/kit/client/uiBridge.js';\nimport { appPresentation, subscribeAppPresentation } from '@mistriwork/kit/client/connectionTransition.js';\n\nfunction componentKey(id: string): string {\n const components = (pageBridge.activeApp() as { components?: Record<string, { href: string }> } | null)?.components;\n const href = components && Object.hasOwn(components, id) ? components[id].href : '';\n return href ? `${id}\\n${href}` : id;\n}\n\nconst generation = () => appPresentation().generation;\n\n/** The same, read again whenever the App is replaced: a reload after a save is one (client appLive.ts). */\nexport function useComponentKey(id: string): string {\n useSyncExternalStore(subscribeAppPresentation, generation, generation);\n return componentKey(id);\n}\n","/** What sdk/CustomSection says, in the custom components 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 thisRecordCouldNotBeRead: 'This record could not be read.',\n theRowsCouldNotBeRead: 'The rows \"{name}\" could not be read.',\n});\n","/**\n * A custom section, on a page and on a dashboard: the platform reads what the\n * section declares — the record's fields, each named read of rows, planned\n * and narrowed like any list — and hands it to the author's component, which\n * only draws. Loading and a failed read are the section's to say, in the\n * words every section says them; the component is drawn once its data is\n * here, so it never paints a spinner of its own (docs/design.md, motion 8).\n *\n * Loaded on demand (onDemand.tsx) the first time a page holds one, with the\n * page's side of `@mistriwork/mistri/ui` (host.tsx): an App without custom sections\n * never fetches either. The section stands behind the boundary every section\n * has (ErrorBoundary.tsx), so a component that throws says so in its place.\n * A signed-out visitor meets one only where the public grant reads (the App\n * refused any other placement as it loaded), and each of its reads is the\n * public grant's on the server.\n */\nimport { ComponentStyleScope } from '@mistriwork/ui/internal/ComponentStyleScope.js';\nimport { useEffect, useLayoutEffect, useMemo, useRef, useState, type ComponentType, type ReactNode } from 'react';\nimport { keepPreviousData, useQuery } from '@tanstack/react-query';\nimport { api, primaryKey, state } from '@mistriwork/kit/client/core.js';\nimport { pathEqualityFilter } from '@mistriwork/kit/client/resourceRequests.js';\nimport { onDemand } from '@mistriwork/kit/client/components/onDemand.js';\nimport { Problem } from '@mistriwork/kit/client/components/Notes.js';\nimport type { CustomSectionFrame as PageFrame, SlotProps } from '@mistriwork/kit/client/components/pageContext.js';\nimport { picked, windowed, type Picks, type Section } from '@mistriwork/kit/client/components/dashboardModel.js';\nimport { COMPACT_BELOW, UiSizeContext, useUiHost, type UiPageFrame, type UiRow, type UiSize } from './context.js';\nimport { loadComponent } from './componentLoader.js';\nimport { useComponentKey } from './componentKey.js';\nimport { rowsByPath } from './rows.js';\nimport { batchedBreakdown } from '@mistriwork/kit/client/breakdownBatch.js';\nimport { breakdownText, measureText } from '@mistriwork/engine/shared/dashboardAsks.js';\nimport { groupsAsked } from '@mistriwork/engine/shared/appComponents.js';\nimport { totalFigure, totalGroups, type TotalGroup, type TotalValue } from '../../../shared/customTotals.js';\nimport { say } from '../../copy/components/components/sdk/CustomSection.js';\n\n/** What a section component receives: `SectionProps` in packages/mistri/schema/ui.d.ts; a free-form page's receives `PageProps` (packages/mistri/schema/page.d.ts). */\ntype SectionComponentProps =\n | {\n record: UiRow | undefined;\n rows: Record<string, UiRow[]>;\n /** Each aggregate read: one figure, or a group for each value of its `by`. */\n figures: Record<string, TotalValue | TotalGroup[]>;\n props: Record<string, unknown>;\n section: { title?: string; width: string; region: 'main' | 'aside' };\n state: 'ready' | 'empty';\n /** On a dashboard: the window its reads are over, in the query grammar's words. */\n period?: string;\n }\n | { props: Record<string, unknown>; data: unknown };\n\n/* One loader per build of a component (componentKey.ts), kept for the page's\n life: a part that has arrived draws at once on its next mount, one that\n could not be fetched offers the Reload every on-demand chunk does, and a\n save that changed its code is a new part. */\nconst parts = new Map<string, ComponentType<SectionComponentProps>>();\nfunction partFor(id: string, key: string): ComponentType<SectionComponentProps> {\n let part = parts.get(key);\n if (!part) {\n part = onDemand(\n () => loadComponent(id).then((component) => ({ component: component as ComponentType<SectionComponentProps> })),\n 'component',\n );\n parts.set(key, part);\n }\n return part;\n}\n\n/** The component's own element: what its scoped stylesheet is scoped to, and what `useSectionSize` measures. */\nexport function CustomBody({\n id,\n given,\n className = 'custom-section',\n onBlank,\n}: {\n id: string;\n given: SectionComponentProps;\n className?: string;\n /** Told whether the component draws nothing at all, as it changes. */\n onBlank?: (blank: boolean) => void;\n}) {\n const box = useRef<HTMLDivElement>(null);\n useLayoutEffect(() => {\n const node = box.current;\n if (!node || !onBlank) return;\n const look = () => onBlank(node.childNodes.length === 0);\n look();\n const observer = new MutationObserver(look);\n observer.observe(node, { childList: true });\n return () => observer.disconnect();\n }, [onBlank]);\n const [size, setSize] = useState<UiSize>({ width: 1024, compact: false });\n useEffect(() => {\n const node = box.current;\n if (!node || typeof ResizeObserver === 'undefined') return;\n const measure = () => {\n const width = node.clientWidth;\n setSize((before) => (before.width === width ? before : { width, compact: width < COMPACT_BELOW }));\n };\n measure();\n const observer = new ResizeObserver(measure);\n observer.observe(node);\n return () => observer.disconnect();\n }, []);\n const Part = partFor(id, useComponentKey(id));\n return (\n <div className={className} data-component={id} ref={box}>\n <ComponentStyleScope.Provider value={id}>\n <UiSizeContext.Provider value={size}>\n <Part {...given} />\n </UiSizeContext.Provider>\n </ComponentStyleScope.Provider>\n </div>\n );\n}\n\n/** What `/api/breakdown` answers, as far as a total reads it. */\ntype Reply = { rows?: Array<Record<string, unknown>> };\n\n/** A total's answer as its component receives it: the one figure, or each group (customTotals.ts). */\nconst figures = (reply: Reply, grouped: boolean): TotalValue | TotalGroup[] =>\n grouped ? totalGroups(reply.rows) : totalFigure(reply.rows);\n\nconst stateOf = (record: UiRow | undefined, rows: Record<string, UiRow[]>, declaredRecord: boolean): 'ready' | 'empty' => {\n const reads = Object.values(rows);\n const noRows = reads.length > 0 && reads.every((list) => !list.length);\n return noRows && (!declaredRecord || !record) ? 'empty' : 'ready';\n};\n\n/** A custom section on a record's page: its record fields and its planned reads, then the component. */\nexport function CustomPageSection({ page, section, index, plan, base, recordKey, frame }: SlotProps & { frame: PageFrame }) {\n const { pageApi, preview, Loading, SectionBox } = frame;\n /* A component that draws nothing (an author's section for a role this reader does not hold) takes no place:\n its heading, rule and margin go with it, and come back if it draws again. */\n const [blank, setBlank] = useState(false);\n const fields = section.record ?? [];\n const record = useQuery({\n queryKey: ['page-custom', 'record', page.id, base.id, recordKey, fields],\n enabled: fields.length > 0,\n staleTime: 0,\n queryFn: async () => {\n const key = Object.fromEntries((primaryKey(base) as string[]).map((column) => [column, recordKey[column]]));\n const got = await pageApi('/api/view/run', {\n count: 'none',\n view: {\n id: `page:${page.id}:${index}:record`,\n name: base.name,\n base: base.id,\n columns: fields.map((path) => ({ path })),\n filter: pathEqualityFilter(key),\n limit: 1,\n },\n });\n return rowsByPath(fields, got, say('thisRecordCouldNotBeRead'), { schema: state.schema, base: base.id })[0] ?? null;\n },\n });\n const reads = useQuery({\n queryKey: ['page-custom', 'reads', plan.reads],\n staleTime: 0,\n queryFn: async () =>\n Object.fromEntries(\n await Promise.all(\n Object.entries(plan.reads ?? {}).map(async ([name, read]) => {\n if (read.error) throw new Error(read.error);\n if (read.empty || !read.view) return [name, []] as const;\n const paths = (read.view.columns ?? []).map((column) => column.path);\n const got = await pageApi('/api/view/run', { view: read.view, offset: 0, count: 'none' });\n return [\n name,\n rowsByPath(paths, got, say('theRowsCouldNotBeRead', { name }), { schema: state.schema, base: read.view.base }),\n ] as const;\n }),\n ),\n ) as Record<string, UiRow[]>,\n });\n /* Asked as the page's own reads are (owned by its connection, first paint's answer used), one breakdown for each. */\n const totals = useQuery({\n queryKey: ['page-custom', 'totals', plan.aggregates],\n staleTime: 0,\n enabled: Object.keys(plan.aggregates ?? {}).length > 0,\n queryFn: async () =>\n Object.fromEntries(\n await Promise.all(\n Object.entries(plan.aggregates ?? {}).map(async ([name, total]) => {\n if (total.error) throw new Error(total.error);\n if (total.empty || !total.breakdown) return [name, figures({}, Boolean(section.aggregates?.[name]?.by))] as const;\n const reply = (await pageApi('/api/breakdown', { def: total.breakdown })) as Reply;\n return [name, figures(reply, Boolean(section.aggregates?.[name]?.by))] as const;\n }),\n ),\n ) as Record<string, TotalValue | TotalGroup[]>,\n });\n if (!section.component) return null;\n if ((fields.length && record.isPending) || reads.isPending || (totals.fetchStatus !== 'idle' && totals.isPending))\n return <Loading section={section} />;\n const failed = (fields.length ? record.error : null) ?? reads.error ?? totals.error;\n if (failed) return <SectionBox section={section} body={null} foldable={false} broken={(failed as Error).message} />;\n const rows = reads.data ?? {};\n const row = record.data ?? undefined;\n const given: SectionComponentProps = {\n record: row,\n rows,\n figures: totals.data ?? {},\n props: section.props ?? {},\n section: { title: section.title, width: section.width ?? 'full', region: section.region ?? 'main' },\n state: stateOf(row, rows, fields.length > 0),\n };\n const body = <CustomBody id={section.component.id} given={given} onBlank={setBlank} />;\n return <SectionBox section={section} foldable={false} hidden={blank} body={preview ? <div inert>{body}</div> : body} />;\n}\n\n/**\n * A free-form page's component, drawn inside its frame (definePage): with\n * its loader's result as `data` once the server has run it for this reader,\n * asked again as the page's place in the address changes. Loading and a\n * refusal are said here, in the words every section says them, so the\n * component is drawn once its data is here.\n */\nexport function CustomPageBody({ frame, section }: { frame: UiPageFrame; section: Section }) {\n const host = useUiHost();\n const place = Object.fromEntries(frame.params.flatMap((name) => (frame.get(name) === undefined ? [] : [[name, frame.get(name)!]])));\n const loaded = useQuery({\n queryKey: ['mistri-page', 'load', ...host.scope, frame.view, place],\n queryFn: async () => (await host.load(frame.view, place)) ?? null,\n enabled: frame.loader !== undefined,\n placeholderData: keepPreviousData,\n });\n if (!section.component) return null;\n if (frame.loader !== undefined) {\n if (loaded.isError) return <Problem text={loaded.error.message} retry={() => void loaded.refetch()} />;\n if (loaded.data === undefined) return <div className=\"sk-bar\" role=\"status\" aria-label={say('common.loading')} />;\n }\n return <CustomBody id={section.component.id} className=\"custom-room\" given={{ props: section.props ?? {}, data: loaded.data ?? null }} />;\n}\n\n/** The ops-board clock, as the dashboard's own sections keep it. */\nconst every = (refresh?: number) => (refresh ? Math.max(refresh, 5) * 1000 : false);\n\n/**\n * A custom section on a dashboard: each read is a rows section in all but\n * drawing, so the reader's window and picks narrow it exactly as they narrow\n * one, and the refresh clock refetches it. Titled like the others.\n */\nexport function CustomDashSection({\n section,\n windowNow,\n picks,\n refresh,\n aside = false,\n}: {\n section: Section;\n windowNow: string | null;\n picks: Picks;\n refresh?: number;\n /** Drawn in the dashboard's aside: the component is told its region, as a page's is. */\n aside?: boolean;\n}) {\n return <DashReads section={section} windowNow={windowNow} picks={picks} refresh={refresh} aside={aside} />;\n}\n\nfunction DashReads({\n section,\n windowNow,\n picks,\n refresh,\n aside,\n}: {\n section: Section;\n windowNow: string | null;\n picks: Picks;\n refresh?: number;\n aside: boolean;\n}) {\n const asked = useMemo(\n () =>\n Object.entries(section.reads ?? {}).map(([name, read]) => {\n const narrowed = picked(\n windowed({ kind: 'rows', table: read.table, query: read.query, over: read.over, windowBase: read.windowBase }, windowNow),\n picks,\n );\n return {\n name,\n base: read.table,\n show: read.show,\n query: [narrowed.query ?? '', read.sort ? `sort ${read.sort}` : ''].join(' ').trim(),\n limit: read.limit ?? 20,\n };\n }),\n [section.reads, windowNow, picks],\n );\n /* Each total is a metric or a breakdown in all but drawing: the window and the picks narrow it as they narrow one,\n and it is asked with the dashboard's other figures in one request (breakdownBatch.ts). */\n const askedTotals = useMemo(\n () =>\n Object.entries(section.aggregates ?? {}).map(([name, total]) => {\n const narrowed = picked(\n windowed({ kind: 'metric', table: total.table, query: total.query, over: total.over, windowBase: total.windowBase }, windowNow),\n picks,\n );\n const grouped = total.by !== undefined;\n const text = grouped\n ? breakdownText({ table: total.table, query: narrowed.query, measure: total.measure, by: total.by }, groupsAsked(total.limit))\n : measureText({ table: total.table, measure: total.measure }, narrowed.query);\n return { name, text, grouped };\n }),\n [section.aggregates, windowNow, picks],\n );\n const totals = useQuery({\n queryKey: ['dash-custom', 'totals', section.component?.id, askedTotals],\n refetchInterval: every(refresh),\n placeholderData: keepPreviousData,\n enabled: askedTotals.length > 0,\n queryFn: async () =>\n Object.fromEntries(\n await Promise.all(\n askedTotals.map(async ({ name, text, grouped }) => [name, figures(await batchedBreakdown<Reply>({ text }), grouped)] as const),\n ),\n ) as Record<string, TotalValue | TotalGroup[]>,\n });\n const reads = useQuery({\n queryKey: ['dash-custom', section.component?.id, asked],\n refetchInterval: every(refresh),\n placeholderData: keepPreviousData,\n queryFn: async () =>\n Object.fromEntries(\n await Promise.all(\n asked.map(async ({ name, base, show, query, limit }) => {\n const got = await api('/api/view/run', {\n count: 'none',\n ...(query ? { query } : {}),\n view: { id: `dash:custom:${name}`, name, base, columns: show.map((path) => ({ path })), limit },\n });\n return [name, rowsByPath(show, got, say('theRowsCouldNotBeRead', { name }), { schema: state.schema, base })] as const;\n }),\n ),\n ) as Record<string, UiRow[]>,\n });\n if (!section.component) return null;\n /* Loading and a failed read are said as a record page's section says them (PageSectionBox): its skeleton bar under\n the title, then the problem in place of the drawing, with a retry. */\n let body: ReactNode;\n if (reads.isPending || (askedTotals.length > 0 && totals.isPending))\n body = <div className=\"sk-bar\" role=\"status\" aria-label={say('common.loading')} />;\n else if (reads.isError || totals.isError) {\n const failed = (reads.isError ? reads : totals) as typeof reads;\n body = <Problem text={(failed.error as Error).message} retry={() => void failed.refetch()} />;\n } else {\n const rows = reads.data ?? {};\n body = (\n <CustomBody\n id={section.component.id}\n given={{\n record: undefined,\n rows,\n figures: totals.data ?? {},\n props: section.props ?? {},\n section: { title: section.title, width: section.width ?? 'full', region: aside ? 'aside' : 'main' },\n state: stateOf(undefined, rows, false),\n ...(windowNow ? { period: windowNow } : {}),\n }}\n />\n );\n }\n return (\n <>\n {section.title ? <h2 className=\"page-section-title\">{section.title}</h2> : null}\n {body}\n </>\n );\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"shared-BguP_BaR.js","names":["_Fragment"],"sources":["../../src/client/components/sdk/componentKey.ts","../../src/client/copy/components/components/sdk/CustomSection.ts","../../src/client/components/sdk/CustomSection.tsx"],"sourcesContent":["/**\n * Which build of an App's component is current: its id and the hashed\n * address the App payload serves it at (`/{app}/_components/<id>-<hash>.js`).\n * A save that changes the component's code gives it a new address (server\n * appComponents.ts), so a cache keyed by this asks for the new code, where one\n * keyed by the id alone drew the old one for the page's life. A platform\n * input has no address, and is its id.\n */\nimport { useSyncExternalStore } from 'react';\nimport { pageBridge } from '@mistriwork/kit/client/uiBridge.js';\nimport { appPresentation, subscribeAppPresentation } from '@mistriwork/kit/client/connectionTransition.js';\n\nfunction componentKey(id: string): string {\n const components = (pageBridge.activeApp() as { components?: Record<string, { href: string }> } | null)?.components;\n const href = components && Object.hasOwn(components, id) ? components[id].href : '';\n return href ? `${id}\\n${href}` : id;\n}\n\nconst generation = () => appPresentation().generation;\n\n/** The same, read again whenever the App is replaced: a reload after a save is one (client appLive.ts). */\nexport function useComponentKey(id: string): string {\n useSyncExternalStore(subscribeAppPresentation, generation, generation);\n return componentKey(id);\n}\n","/** What sdk/CustomSection says, in the custom components 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 thisRecordCouldNotBeRead: 'This record could not be read.',\n theRowsCouldNotBeRead: 'The rows \"{name}\" could not be read.',\n});\n","/**\n * A custom section, on a page and on a dashboard: the platform reads what the\n * section declares — the record's fields, each named read of rows, planned\n * and narrowed like any list — and hands it to the author's component, which\n * only draws. Loading and a failed read are the section's to say, in the\n * words every section says them; the component is drawn once its data is\n * here, so it never paints a spinner of its own (docs/design.md, motion 8).\n *\n * Loaded on demand (onDemand.tsx) the first time a page holds one, with the\n * page's side of `@mistriwork/mistri/ui` (host.tsx): an App without custom sections\n * never fetches either. The section stands behind the boundary every section\n * has (ErrorBoundary.tsx), so a component that throws says so in its place.\n * A signed-out visitor meets one only where the public grant reads (the App\n * refused any other placement as it loaded), and each of its reads is the\n * public grant's on the server.\n */\nimport { ComponentStyleScope } from '@mistriwork/ui/internal/ComponentStyleScope.js';\nimport { useEffect, useLayoutEffect, useMemo, useRef, useState, type ComponentType, type ReactNode } from 'react';\nimport { keepPreviousData, useQuery } from '@tanstack/react-query';\nimport { api, primaryKey, state } from '@mistriwork/kit/client/core.js';\nimport { pathEqualityFilter } from '@mistriwork/kit/client/resourceRequests.js';\nimport { onDemand } from '@mistriwork/kit/client/components/onDemand.js';\nimport { Problem } from '@mistriwork/kit/client/components/Notes.js';\nimport type { CustomSectionFrame as PageFrame, SlotProps } from '@mistriwork/kit/client/components/pageContext.js';\nimport { picked, windowed, type Picks, type Section } from '@mistriwork/kit/client/components/dashboardModel.js';\nimport { COMPACT_BELOW, UiSizeContext, useUiHost, type UiPageFrame, type UiRow, type UiSize } from './context.js';\nimport { loadComponent } from './componentLoader.js';\nimport { useComponentKey } from './componentKey.js';\nimport { rowsByPath } from './rows.js';\nimport { batchedBreakdown } from '@mistriwork/kit/client/breakdownBatch.js';\nimport { breakdownText, measureText } from '@mistriwork/engine/shared/dashboardAsks.js';\nimport { groupsAsked } from '@mistriwork/engine/shared/appComponents.js';\nimport { totalFigure, totalGroups, type TotalGroup, type TotalValue } from '../../../shared/customTotals.js';\nimport { say } from '../../copy/components/components/sdk/CustomSection.js';\n\n/** What a section component receives: `SectionProps` in packages/mistri/schema/ui.d.ts; a free-form page's receives `PageProps` (packages/mistri/schema/page.d.ts). */\ntype SectionComponentProps =\n | {\n record: UiRow | undefined;\n rows: Record<string, UiRow[]>;\n /** Each aggregate read: one figure, or a group for each value of its `by`. */\n figures: Record<string, TotalValue | TotalGroup[]>;\n props: Record<string, unknown>;\n section: { title?: string; width: string; region: 'main' | 'aside' };\n state: 'ready' | 'empty';\n /** On a dashboard: the window its reads are over, in the query grammar's words. */\n period?: string;\n }\n | { props: Record<string, unknown>; data: unknown };\n\n/* One loader per build of a component (componentKey.ts), kept for the page's\n life: a part that has arrived draws at once on its next mount, one that\n could not be fetched offers the Reload every on-demand chunk does, and a\n save that changed its code is a new part. */\nconst parts = new Map<string, ComponentType<SectionComponentProps>>();\nfunction partFor(id: string, key: string): ComponentType<SectionComponentProps> {\n let part = parts.get(key);\n if (!part) {\n part = onDemand(\n () => loadComponent(id).then((component) => ({ component: component as ComponentType<SectionComponentProps> })),\n 'component',\n );\n parts.set(key, part);\n }\n return part;\n}\n\n/** The component's own element: what its scoped stylesheet is scoped to, and what `useSectionSize` measures. */\nexport function CustomBody({\n id,\n given,\n className = 'custom-section',\n onBlank,\n}: {\n id: string;\n given: SectionComponentProps;\n className?: string;\n /** Told whether the component draws nothing at all, as it changes. */\n onBlank?: (blank: boolean) => void;\n}) {\n const box = useRef<HTMLDivElement>(null);\n useLayoutEffect(() => {\n const node = box.current;\n if (!node || !onBlank) return;\n const look = () => onBlank(node.childNodes.length === 0);\n look();\n const observer = new MutationObserver(look);\n observer.observe(node, { childList: true });\n return () => observer.disconnect();\n }, [onBlank]);\n const [size, setSize] = useState<UiSize>({ width: 1024, compact: false });\n useEffect(() => {\n const node = box.current;\n if (!node || typeof ResizeObserver === 'undefined') return;\n const measure = () => {\n const width = node.clientWidth;\n setSize((before) => (before.width === width ? before : { width, compact: width < COMPACT_BELOW }));\n };\n measure();\n const observer = new ResizeObserver(measure);\n observer.observe(node);\n return () => observer.disconnect();\n }, []);\n const Part = partFor(id, useComponentKey(id));\n return (\n <div className={className} data-component={id} ref={box}>\n <ComponentStyleScope.Provider value={id}>\n <UiSizeContext.Provider value={size}>\n <Part {...given} />\n </UiSizeContext.Provider>\n </ComponentStyleScope.Provider>\n </div>\n );\n}\n\n/** What `/api/breakdown` answers, as far as a total reads it. */\ntype Reply = { rows?: Array<Record<string, unknown>> };\n\n/** A total's answer as its component receives it: the one figure, or each group (customTotals.ts). */\nconst figures = (reply: Reply, grouped: boolean): TotalValue | TotalGroup[] =>\n grouped ? totalGroups(reply.rows) : totalFigure(reply.rows);\n\nconst stateOf = (record: UiRow | undefined, rows: Record<string, UiRow[]>, declaredRecord: boolean): 'ready' | 'empty' => {\n const reads = Object.values(rows);\n const noRows = reads.length > 0 && reads.every((list) => !list.length);\n return noRows && (!declaredRecord || !record) ? 'empty' : 'ready';\n};\n\n/** A custom section on a record's page: its record fields and its planned reads, then the component. */\nexport function CustomPageSection({ page, section, index, plan, base, recordKey, frame }: SlotProps & { frame: PageFrame }) {\n const { pageApi, preview, Loading, SectionBox } = frame;\n /* A component that draws nothing (an author's section for a role this reader does not hold) takes no place:\n its heading, rule and margin go with it, and come back if it draws again. */\n const [blank, setBlank] = useState(false);\n const fields = section.record ?? [];\n const record = useQuery({\n queryKey: ['page-custom', 'record', page.id, base.id, recordKey, fields],\n enabled: fields.length > 0,\n staleTime: 0,\n queryFn: async () => {\n const key = Object.fromEntries((primaryKey(base) as string[]).map((column) => [column, recordKey[column]]));\n const got = await pageApi('/api/view/run', {\n count: 'none',\n view: {\n id: `page:${page.id}:${index}:record`,\n name: base.name,\n base: base.id,\n columns: fields.map((path) => ({ path })),\n filter: pathEqualityFilter(key),\n limit: 1,\n },\n });\n return rowsByPath(fields, got, say('thisRecordCouldNotBeRead'), { schema: state.schema, base: base.id })[0] ?? null;\n },\n });\n const reads = useQuery({\n queryKey: ['page-custom', 'reads', plan.reads],\n staleTime: 0,\n queryFn: async () =>\n Object.fromEntries(\n await Promise.all(\n Object.entries(plan.reads ?? {}).map(async ([name, read]) => {\n if (read.error) throw new Error(read.error);\n if (read.empty || !read.view) return [name, []] as const;\n const paths = (read.view.columns ?? []).map((column) => column.path);\n const got = await pageApi('/api/view/run', { view: read.view, offset: 0, count: 'none' });\n return [\n name,\n rowsByPath(paths, got, say('theRowsCouldNotBeRead', { name }), { schema: state.schema, base: read.view.base }),\n ] as const;\n }),\n ),\n ) as Record<string, UiRow[]>,\n });\n /* Asked as the page's own reads are (owned by its connection, first paint's answer used), one breakdown for each. */\n const totals = useQuery({\n queryKey: ['page-custom', 'totals', plan.aggregates],\n staleTime: 0,\n enabled: Object.keys(plan.aggregates ?? {}).length > 0,\n queryFn: async () =>\n Object.fromEntries(\n await Promise.all(\n Object.entries(plan.aggregates ?? {}).map(async ([name, total]) => {\n if (total.error) throw new Error(total.error);\n if (total.empty || !total.breakdown) return [name, figures({}, Boolean(section.aggregates?.[name]?.by))] as const;\n const reply = (await pageApi('/api/breakdown', { def: total.breakdown })) as Reply;\n return [name, figures(reply, Boolean(section.aggregates?.[name]?.by))] as const;\n }),\n ),\n ) as Record<string, TotalValue | TotalGroup[]>,\n });\n if (!section.component) return null;\n if ((fields.length && record.isPending) || reads.isPending || (totals.fetchStatus !== 'idle' && totals.isPending))\n return <Loading section={section} />;\n const failed = (fields.length ? record.error : null) ?? reads.error ?? totals.error;\n if (failed) return <SectionBox section={section} body={null} foldable={false} broken={(failed as Error).message} />;\n const rows = reads.data ?? {};\n const row = record.data ?? undefined;\n const given: SectionComponentProps = {\n record: row,\n rows,\n figures: totals.data ?? {},\n props: section.props ?? {},\n section: { title: section.title, width: section.width ?? 'full', region: section.region ?? 'main' },\n state: stateOf(row, rows, fields.length > 0),\n };\n const body = <CustomBody id={section.component.id} given={given} onBlank={setBlank} />;\n return <SectionBox section={section} foldable={false} hidden={blank} body={preview ? <div inert>{body}</div> : body} />;\n}\n\n/**\n * A free-form page's component, drawn inside its frame (definePage): with\n * its loader's result as `data` once the server has run it for this reader,\n * asked again as the page's place in the address changes. Loading and a\n * refusal are said here, in the words every section says them, so the\n * component is drawn once its data is here.\n */\nexport function CustomPageBody({ frame, section }: { frame: UiPageFrame; section: Section }) {\n const host = useUiHost();\n const place = Object.fromEntries(frame.params.flatMap((name) => (frame.get(name) === undefined ? [] : [[name, frame.get(name)!]])));\n const loaded = useQuery({\n queryKey: ['mistri-page', 'load', ...host.scope, frame.view, place],\n queryFn: async () => (await host.load(frame.view, place)) ?? null,\n enabled: frame.loader !== undefined,\n placeholderData: keepPreviousData,\n });\n if (!section.component) return null;\n if (frame.loader !== undefined) {\n if (loaded.isError) return <Problem text={loaded.error.message} retry={() => void loaded.refetch()} />;\n if (loaded.data === undefined) return <div className=\"sk-bar\" role=\"status\" aria-label={say('common.loading')} />;\n }\n return <CustomBody id={section.component.id} className=\"custom-room\" given={{ props: section.props ?? {}, data: loaded.data ?? null }} />;\n}\n\n/** The ops-board clock, as the dashboard's own sections keep it. */\nconst every = (refresh?: number) => (refresh ? Math.max(refresh, 5) * 1000 : false);\n\n/**\n * A custom section on a dashboard: each read is a rows section in all but\n * drawing, so the reader's window and picks narrow it exactly as they narrow\n * one, and the refresh clock refetches it. Titled like the others.\n */\nexport function CustomDashSection({\n section,\n windowNow,\n picks,\n refresh,\n aside = false,\n}: {\n section: Section;\n windowNow: string | null;\n picks: Picks;\n refresh?: number;\n /** Drawn in the dashboard's aside: the component is told its region, as a page's is. */\n aside?: boolean;\n}) {\n return <DashReads section={section} windowNow={windowNow} picks={picks} refresh={refresh} aside={aside} />;\n}\n\nfunction DashReads({\n section,\n windowNow,\n picks,\n refresh,\n aside,\n}: {\n section: Section;\n windowNow: string | null;\n picks: Picks;\n refresh?: number;\n aside: boolean;\n}) {\n const asked = useMemo(\n () =>\n Object.entries(section.reads ?? {}).map(([name, read]) => {\n const narrowed = picked(\n windowed({ kind: 'rows', table: read.table, query: read.query, over: read.over, windowBase: read.windowBase }, windowNow),\n picks,\n );\n return {\n name,\n base: read.table,\n show: read.show,\n query: [narrowed.query ?? '', read.sort ? `sort ${read.sort}` : ''].join(' ').trim(),\n limit: read.limit ?? 20,\n };\n }),\n [section.reads, windowNow, picks],\n );\n /* Each total is a metric or a breakdown in all but drawing: the window and the picks narrow it as they narrow one,\n and it is asked with the dashboard's other figures in one request (breakdownBatch.ts). */\n const askedTotals = useMemo(\n () =>\n Object.entries(section.aggregates ?? {}).map(([name, total]) => {\n const narrowed = picked(\n windowed({ kind: 'metric', table: total.table, query: total.query, over: total.over, windowBase: total.windowBase }, windowNow),\n picks,\n );\n const grouped = total.by !== undefined;\n const text = grouped\n ? breakdownText({ table: total.table, query: narrowed.query, measure: total.measure, by: total.by }, groupsAsked(total.limit))\n : measureText({ table: total.table, measure: total.measure }, narrowed.query);\n return { name, text, grouped };\n }),\n [section.aggregates, windowNow, picks],\n );\n const totals = useQuery({\n queryKey: ['dash-custom', 'totals', section.component?.id, askedTotals],\n refetchInterval: every(refresh),\n placeholderData: keepPreviousData,\n enabled: askedTotals.length > 0,\n queryFn: async () =>\n Object.fromEntries(\n await Promise.all(\n askedTotals.map(async ({ name, text, grouped }) => [name, figures(await batchedBreakdown<Reply>({ text }), grouped)] as const),\n ),\n ) as Record<string, TotalValue | TotalGroup[]>,\n });\n const reads = useQuery({\n queryKey: ['dash-custom', section.component?.id, asked],\n refetchInterval: every(refresh),\n placeholderData: keepPreviousData,\n queryFn: async () =>\n Object.fromEntries(\n await Promise.all(\n asked.map(async ({ name, base, show, query, limit }) => {\n const got = await api('/api/view/run', {\n count: 'none',\n ...(query ? { query } : {}),\n view: { id: `dash:custom:${name}`, name, base, columns: show.map((path) => ({ path })), limit },\n });\n return [name, rowsByPath(show, got, say('theRowsCouldNotBeRead', { name }), { schema: state.schema, base })] as const;\n }),\n ),\n ) as Record<string, UiRow[]>,\n });\n if (!section.component) return null;\n /* Loading and a failed read are said as a record page's section says them (PageSectionBox): its skeleton bar under\n the title, then the problem in place of the drawing, with a retry. */\n let body: ReactNode;\n if (reads.isPending || (askedTotals.length > 0 && totals.isPending))\n body = <div className=\"sk-bar\" role=\"status\" aria-label={say('common.loading')} />;\n else if (reads.isError || totals.isError) {\n const failed = (reads.isError ? reads : totals) as typeof reads;\n body = <Problem text={(failed.error as Error).message} retry={() => void failed.refetch()} />;\n } else {\n const rows = reads.data ?? {};\n body = (\n <CustomBody\n id={section.component.id}\n given={{\n record: undefined,\n rows,\n figures: totals.data ?? {},\n props: section.props ?? {},\n section: { title: section.title, width: section.width ?? 'full', region: aside ? 'aside' : 'main' },\n state: stateOf(undefined, rows, false),\n ...(windowNow ? { period: windowNow } : {}),\n }}\n />\n );\n }\n return (\n <>\n {section.title ? <h2 className=\"page-section-title\">{section.title}</h2> : null}\n {body}\n </>\n );\n}\n"],"mappings":"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"}
@@ -1088,7 +1088,13 @@ function carryView(entry, mode) {
1088
1088
  if (mode === "reset" || !top?.view || !entry || "view" in entry || entry.table !== top.table) return;
1089
1089
  if (entry.kind === "row" || entry.kind === "table" && mode === "replace") entry.view = top.view;
1090
1090
  }
1091
- /** A table view, optionally filtered. The query text is what the bar shows. */
1091
+ /**
1092
+ * A table view, optionally filtered. The query text is what the bar shows.
1093
+ *
1094
+ * @param {*} tableId
1095
+ * @param {*} [query]
1096
+ * @param {*} [tab]
1097
+ */
1092
1098
  function tableView(tableId, query, tab) {
1093
1099
  return {
1094
1100
  kind: "table",
@@ -1112,6 +1118,11 @@ function rowView(tableId, key, label) {
1112
1118
  * `table` is the page's base rather than a table being browsed, so that the
1113
1119
  * sidebar highlights the right thing and a page can find its way back to a
1114
1120
  * suggested layout when the id names no configured page.
1121
+ *
1122
+ * @param {*} pageId
1123
+ * @param {*} [tableId]
1124
+ * @param {*} [key]
1125
+ * @param {*} [label]
1115
1126
  */
1116
1127
  function pageView(pageId, tableId, key, label) {
1117
1128
  return {
@@ -1338,6 +1349,10 @@ function quote(value) {
1338
1349
  * and sending them to a menu to find Undo wastes the seconds in which they
1339
1350
  * still remember what they did. Anything that needs more than one verb belongs
1340
1351
  * in a dialog rather than here.
1352
+ *
1353
+ * @param {*} message
1354
+ * @param {string} [tone]
1355
+ * @param {*} [action]
1341
1356
  */
1342
1357
  function toast(message, tone = "info", action) {
1343
1358
  const host = $("toast");
@@ -1363,4 +1378,4 @@ function saveJson(key, value) {
1363
1378
  }
1364
1379
  export { stepWithin as $, render as A, toast as B, prefersPages as C, refsFrom as D, refine as E, setRecordMutationPendingProbe as F, resolvePath as G, whenConnectionChanges as H, showErrors as I, rollupColumnMeta as J, tableAtPrefix as K, state as L, saveJson as M, setExplain as N, refsTo as O, setPageSize as P, stepTrail as Q, subscribeWalk as R, peekRecord as S, recordLabel as T, writeAllowed as U, walkVersion as V, hopName as W, el as X, disclosure as Y, canStep as Z, openRecord as _, beginNavigation as a, historyToken as at, pageSize as b, columnLabel as c, scopeApiRequest as ct, findTable as d, subscribeAppPresentation as dt, trailListFor as et, go as f, PAGE_LOAD_PATH as ft, looksLikeDateColumn as g, loadJson as h, api as i, setComposedReads as it, rowLabel as j, registerSurfaceMutationPendingProbe as k, currentEntry as l, appPresentation as lt, labelPath as m, PAGE_SIZES as n, setOwnWriteMarker as nt, captureNavigation as o, appRequestScope as ot, keyOf as p, tryResolvePath as q, allowMutationExit as r, composedConnection as rt, columnDisplay as s, ownedBy as st, $ as t, trailPosition as tt, emptyWord as u, connectionGeneration as ut, pageApi as v, quote as w, pageView as x, pageFor as y, tableView as z };
1365
1380
 
1366
- //# sourceMappingURL=shared-DPAVoWY0.js.map
1381
+ //# sourceMappingURL=shared-BoLbc2WD.js.map