@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-CXyd7IKi.js","names":["sayCopy","say","_Fragment"],"sources":["../../../kit/src/client/chart.js","../../../kit/src/client/copy/dashboards/components/Chart.ts","../../../kit/src/client/components/Chart.tsx"],"sourcesContent":["/**\n * The one chart rule that is not drawing: which periods a bucketed\n * breakdown left out. The charts themselves are components now\n * (`components/Chart.tsx`); this stays a plain function because it is a rule\n * about time, tested on its own, with no DOM in it.\n */\n\n/**\n * The periods a bucketed breakdown left out, put back at zero.\n *\n * The grammar answers only the buckets that have rows: a month with no\n * bookings is not a row, and a line drawn point-to-index through the rows\n * that came back walked straight across the gap — 2025-12 sat beside\n * 2026-03 at the same spacing as any neighbours, and the axis lied about\n * time. Period labels are spelled the same on every engine (`2026-08`,\n * `2026-Q3`, `2026-08-14`, `2026`), so the missing ones can be named and\n * counted as what they are: zero. Keys that are not periods pass through.\n */\nexport function fillGaps(points) {\n if (points.length < 2) return points;\n const first = periodStep(points[0].key);\n if (!first || points.some((p) => periodStep(p.key) !== first)) return points;\n const step = first === 'day' && weekly(points.map((p) => p.key)) ? 'week' : first;\n /* Time runs left to right whatever order the answer came in: a record\n page's chart is read ranked by its measure, and a walk from the first\n key to the last found nothing to walk when the first was the newest. */\n points = [...points].sort((a, b) => (a.key < b.key ? -1 : a.key > b.key ? 1 : 0));\n const byKey = new Map(points.map((p) => [p.key, p]));\n const out = [];\n let key = points[0].key;\n const last = points[points.length - 1].key;\n for (let guard = 0; guard < 2000 && key <= last; guard++) {\n out.push(byKey.get(key) ?? { key, value: 0 });\n key = nextPeriod(key, step);\n }\n return out.length >= points.length ? out : points;\n}\n\n/** Whether every key is a period of one step, so the keys can be put in time order. */\nexport function isPeriodRun(keys) {\n if (!keys.length) return false;\n const step = periodStep(String(keys[0]));\n return Boolean(step) && keys.every((key) => key != null && periodStep(String(key)) === step);\n}\n\n/* A week bucket is said by its first day (`2026-10-05`), so its keys are days that all fall on one weekday: the\n gaps between them are weeks, and a missing one is a week at zero, never six days between. */\nfunction weekly(keys) {\n const weekday = (key) => new Date(`${key}T00:00:00Z`).getUTCDay();\n return keys.length > 1 && keys.every((key) => weekday(key) === weekday(keys[0]));\n}\n\nfunction periodStep(key) {\n if (/^\\d{4}-\\d{2}-\\d{2}$/.test(key)) return 'day';\n if (/^\\d{4}-\\d{2}$/.test(key)) return 'month';\n if (/^\\d{4}-Q[1-4]$/.test(key)) return 'quarter';\n if (/^\\d{4}$/.test(key)) return 'year';\n return null;\n}\n\nfunction nextPeriod(key, step) {\n const pad = (n) => String(n).padStart(2, '0');\n if (step === 'day' || step === 'week') {\n const d = new Date(\n Date.UTC(Number(key.slice(0, 4)), Number(key.slice(5, 7)) - 1, Number(key.slice(8, 10)) + (step === 'week' ? 7 : 1)),\n );\n return `${d.getUTCFullYear()}-${pad(d.getUTCMonth() + 1)}-${pad(d.getUTCDate())}`;\n }\n if (step === 'month') {\n const y = Number(key.slice(0, 4));\n const m = Number(key.slice(5, 7));\n return m === 12 ? `${y + 1}-01` : `${y}-${pad(m + 1)}`;\n }\n if (step === 'quarter') {\n const y = Number(key.slice(0, 4));\n const q = Number(key.slice(6));\n return q === 4 ? `${y + 1}-Q1` : `${y}-Q${q + 1}`;\n }\n return String(Number(key) + 1);\n}\n","/** What Chart says, in the dashboards room (packages/kit/src/client/messages.ts says how the catalog is split). */\nimport { defineMessages } from '../../../messages.js';\n\nexport const say = defineMessages({\n notEnoughPointsToDraw: 'Not enough points to draw a line.',\n target: 'Target {goal}',\n nothingToDraw: 'Nothing to draw.',\n nothingToDivide: 'Nothing to divide.',\n inAll: '{whole} in all — {map}',\n nothingToStack: 'Nothing to stack.',\n others: 'others ({restCount})',\n targetLabel: 'Target',\n lineSummary: { one: '{count} point, from {from} to {to}; peak {peak}', other: '{count} points, from {from} to {to}; peak {peak}' },\n barsSummary: { one: '{count} bar; highest {highest}; {last} {value}', other: '{count} bars; highest {highest}; {last} {value}' },\n barsBySeries: '{count} bars by {series}',\n targetAfter: '; target {goal}',\n showSeries: 'Show',\n allSeries: 'All series',\n linesSummary: { one: '{count} line over {points} points: {names}', other: '{count} lines over {points} points: {names}' },\n});\n","/**\n * Charts for dashboards: a line for how a number moved, bars for how much\n * each group holds, a donut for how a whole divides, stacked bars for how each of several wholes divides, a\n * spark for the shape inside a KPI card. Hand-drawn SVG and HTML, not a\n * dependency. A target is a rule in the ink, said in words beside it.\n *\n * Colour comes from theme tokens: the line uses the accent and categorical\n * slices share their series token with the matching legend swatch. Without\n * preset tokens, the original single-accent, stepped-opacity treatment remains.\n * Values are spoken through the caller's `say` so money charts\n * read \"$4.6M\" everywhere the number appears.\n */\nimport { useLayoutEffect, useRef, useState } from 'react';\nimport { viewportBox } from '../core.js';\nimport { fillGaps, isPeriodRun } from '../chart.js';\nimport { formatDate, formatPercent } from '../locale.js';\nimport { niceScale } from '@mistriwork/engine/shared/niceTicks.js';\n/* The charts' own sheet travels with the chunk that draws them (onDemand). */\nimport './Chart.css';\nimport { say as sayCopy } from '../copy/dashboards/components/Chart.js';\n\ninterface ChartRow {\n key: unknown;\n value: unknown;\n}\n/** How a figure is said; its `tick`, where it has one, is how an axis says a round level (\"$2K\", not \"$2,000.00\"). */\ntype Say = ((v: unknown) => string) & { tick?: ((v: unknown) => string) & { steps?: readonly number[] } };\n/** An axis's words for a level: the sayer's axis form, else the sayer itself. */\nconst tickSay = (say: Say) => say.tick ?? say;\n\ninterface Point {\n key: string;\n value: number;\n /** The row's key as it came, where a point drills: a gap-filled bucket has none. */\n raw?: unknown;\n}\n\nconst f1 = (n: number) => n.toFixed(1);\n\nconst MONTH = /^(\\d{4})-(\\d{2})$/;\nconst DAY = /^(\\d{4})-\\d{2}-\\d{2}$/;\n\n/**\n * A month bucket as a reader says it, in the App's locale: \"Jan 2026\" where\n * the year starts or changes from the tick before it, \"Feb\" after it. The\n * grammar spells a month `2026-01` on every engine, which is a key, not a\n * word; any other key is said as it came.\n */\nexport function periodTick(key: string, previous?: string): string {\n /* A day is said as a month's is, \"Sep 10, 2026\" then \"Sep 11\": a stacked\n bar over days read \"2026-09-10\", a key where every other chart said a date. */\n const day = DAY.exec(key);\n if (day) {\n const year = !previous || DAY.exec(previous)?.[1] !== day[1];\n return formatDate(key, year ? { month: 'short', day: 'numeric', year: 'numeric' } : { month: 'short', day: 'numeric' });\n }\n const month = MONTH.exec(key);\n if (!month) return key;\n const year = !previous || MONTH.exec(previous)?.[1] !== month[1];\n return formatDate(`${key}-01`, year ? { month: 'short', year: 'numeric' } : { month: 'short' });\n}\n\n/**\n * Step `i` of `n` along one hue, for series over a scale (a priority, a\n * severity, an age in days): categorical hues said Medium and High in two\n * greens a reader could not tell apart, and said nothing of which came\n * first. The first step is the lead series deepened toward the ink, the last\n * the same hue washed toward the surface, mixed in OKLab so the steps are\n * even to the eye; by night the ink is light and the surface dark, so the\n * first step is still the one that stands out. Tokens only: an App's accent\n * and its dark pair carry through.\n */\nfunction rampInk(i: number, n: number): string {\n const lead = 'var(--chart-1, var(--accent))';\n if (n <= 1) return lead;\n const strong = Math.round(100 * (1 - Math.min(Math.max(i / (n - 1), 0), 1)));\n return `color-mix(in oklab, color-mix(in oklab, ${lead}, var(--ink) 30%) ${strong}%, color-mix(in oklab, ${lead}, var(--surface) 55%))`;\n}\n\n/** The width a tick's words take at the axis's 11px, budgeted generously: a label that overlaps its neighbour is worse than one left out. */\nconst tickWidth = (text: string) => text.length * 6.6 + 4;\n\n/**\n * Which points the x axis names, and what it calls each: as many as fit the\n * width, evenly spaced, the first and the last always among them. A month\n * says its year only where the year turns from the mark before it, and a\n * mark is budgeted at what it will actually say — \"Oct\", not \"Oct 2025\" — so\n * a month that has room is not dropped for a year it would not have shown.\n *\n * A mark is budgeted where it is drawn: a line's first and last words stand\n * inside the plot, starting and ending at their points; a bar's are centred\n * under their bars, as every other mark is (`centered`). Budgeting a bar's\n * as a line's took a whole word's width twice, and a half-width bar chart\n * named only its first and last month.\n */\nexport function axisMarks(keys: string[], at: (i: number) => number, { centered = false } = {}): Array<{ index: number; text: string }> {\n const last = keys.length - 1;\n const said = (marks: number[]) => marks.map((index, k) => ({ index, text: periodTick(keys[index], k ? keys[marks[k - 1]] : undefined) }));\n const extent = ({ index, text }: { index: number; text: string }): [number, number] => {\n const p = at(index),\n w = tickWidth(text);\n return !centered && index === 0 ? [p, p + w] : !centered && index === last ? [p - w, p] : [p - w / 2, p + w / 2];\n };\n /* The first pair of neighbours too close to read apart, or -1. */\n const clash = (marks: Array<{ index: number; text: string }>) =>\n marks.findIndex((mark, k) => k > 0 && extent(mark)[0] - extent(marks[k - 1])[1] < 12);\n for (let stride = 1; stride <= Math.max(1, last); stride += 1) {\n const marks: number[] = [];\n for (let i = 0; i < last; i += stride) marks.push(i);\n /* The last point is always named; the evenly spaced mark before it gives\n way when those two would meet — and only then: a clash further in is\n a stride too short, and the next one is tried. */\n marks.push(last);\n let named = said(marks);\n if (marks.length > 2 && clash(named) === marks.length - 1) {\n marks.splice(marks.length - 2, 1);\n named = said(marks);\n }\n if (clash(named) < 0) return named;\n }\n return said([last]);\n}\n\n/**\n * A path through points: straight segments, or with `smooth` a monotone cubic\n * (Fritsch–Carlson) — a curve that never overshoots its points, so a smooth\n * line still never says a value the data did not reach.\n */\nfunction linePath(pts: ReadonlyArray<readonly [number, number]>, smooth = false): string {\n if (!smooth || pts.length < 3) return pts.map(([px, py], i) => `${i ? 'L' : 'M'}${f1(px)},${f1(py)}`).join(' ');\n const n = pts.length;\n const dx = (i: number) => pts[i + 1][0] - pts[i][0];\n const slope = Array.from({ length: n - 1 }, (_, i) => (pts[i + 1][1] - pts[i][1]) / (dx(i) || 1));\n const m = pts.map((_, i) =>\n i === 0 ? slope[0] : i === n - 1 ? slope[n - 2] : slope[i - 1] * slope[i] <= 0 ? 0 : (slope[i - 1] + slope[i]) / 2,\n );\n for (let i = 0; i < n - 1; i++) {\n if (slope[i] === 0) {\n m[i] = 0;\n m[i + 1] = 0;\n continue;\n }\n const a = m[i] / slope[i],\n b = m[i + 1] / slope[i];\n const h = a * a + b * b;\n if (h > 9) {\n const t = 3 / Math.sqrt(h);\n m[i] = t * a * slope[i];\n m[i + 1] = t * b * slope[i];\n }\n }\n let d = `M${f1(pts[0][0])},${f1(pts[0][1])}`;\n for (let i = 0; i < n - 1; i++) {\n const third = dx(i) / 3;\n d += ` C${f1(pts[i][0] + third)},${f1(pts[i][1] + m[i] * third)} ${f1(pts[i + 1][0] - third)},${f1(pts[i + 1][1] - m[i + 1] * third)} ${f1(pts[i + 1][0])},${f1(pts[i + 1][1])}`;\n }\n return d;\n}\n\n/**\n * A time-series line: keys along the bottom, values as an accent line over\n * a soft fill, three labelled gridlines, and a crosshair on hover drawn in\n * the chart rather than left to a native tooltip.\n *\n * Its words are set at their own size wherever it is drawn: the chart\n * measures the width it is given (on the zoom-aware ruler) and draws a\n * viewBox exactly that wide, so a phone does not shrink an 11px label to 6.\n * `wide` is the first guess, before there is a box to measure. The levels\n * are said on the left, in a gutter of their own, where the line cannot\n * run through them. Every point is also a row of a table that assistive\n * technology reads, since a picture's titles are not.\n */\nexport function LineChart({\n rows,\n say = String,\n wide = 600,\n high,\n target,\n smooth = false,\n dots = false,\n seriesLabel = String,\n seriesVocabulary,\n onPick,\n}: {\n /** With `series` on its rows, a line per series (MultiLine). */\n rows: Array<ChartRow & { series?: unknown }>;\n say?: Say;\n wide?: number;\n high?: number;\n target?: number;\n /** A monotone curve through the points instead of straight segments. */\n smooth?: boolean;\n /** Too few filled buckets to draw a line through: the points stand alone, solid where the bucket holds something, and the shape stays a line. */\n dots?: boolean;\n seriesLabel?: (key: unknown) => string;\n /** The series column's vocabulary: its order, and each value's color, are the vocabulary's. */\n seriesVocabulary?: readonly string[];\n /** Where a point goes when it drills, by its raw key: single-series lines only — a multi-series line takes no\n drill, since one pick cannot name both a series and a point. */\n onPick?: ((value: unknown) => void) | null;\n}) {\n if (rows.some((row) => row.series !== undefined))\n return (\n <MultiLine\n rows={rows}\n say={say}\n wide={wide}\n high={high}\n target={target}\n smooth={smooth}\n seriesLabel={seriesLabel}\n vocabulary={seriesVocabulary}\n />\n );\n return <OneLine rows={rows} say={say} wide={wide} high={high} target={target} smooth={smooth} dots={dots} onPick={onPick} />;\n}\n\nfunction OneLine({\n rows,\n say,\n wide,\n high,\n target,\n smooth,\n dots,\n onPick,\n}: {\n rows: ChartRow[];\n say: Say;\n wide: number;\n high?: number;\n target?: number;\n smooth: boolean;\n dots: boolean;\n onPick?: ((value: unknown) => void) | null;\n}) {\n const points = fillGaps(\n rows\n .map((r) => ({ key: r.key == null ? '—' : String(r.key), value: Number(r.value), raw: r.key }))\n .filter((p) => Number.isFinite(p.value)),\n ) as Point[];\n const svg = useRef<SVGSVGElement>(null);\n const [near, setNear] = useState<number | null>(null);\n const [measured, setMeasured] = useState(0);\n /* Roving tabindex for drillable points: one tab stop for the whole\n line, not one per point. The tabbable point is the roved-to one, or\n the first drillable one where the roved-to one stopped drilling;\n arrows move among drillable points only, Home and End take the\n first and last. */\n const drillableAt = points.map((p, i) => (onPick && p.raw != null ? i : -1)).filter((i) => i >= 0);\n const [roved, setRoved] = useState<number | null>(null);\n const tabbable = roved !== null && drillableAt.includes(roved) ? roved : drillableAt[0];\n const moveRoving = (at: number) => {\n setRoved(at);\n const el = svg.current?.querySelectorAll('.chart-point-drill')[drillableAt.indexOf(at)];\n (el as HTMLElement | undefined)?.focus?.();\n };\n /* Alone, a point has no line to join it to and no neighbour to space against: a dotted line draws even one. */\n const drawn = points.length >= 2 || (dots && points.length === 1);\n useLayoutEffect(() => {\n const element = svg.current?.parentElement;\n if (!element || typeof ResizeObserver === 'undefined') return;\n const measure = () => setMeasured(Math.max(0, Math.round(viewportBox(element).width)));\n measure();\n const observer = new ResizeObserver(measure);\n observer.observe(element);\n return () => observer.disconnect();\n }, [drawn]);\n if (!drawn) return <p className=\"note\">{sayCopy('notEnoughPointsToDraw')}</p>;\n\n /* The viewBox is the width the chart is drawn at, so text and strokes\n land at their own size. The height is the author's when given;\n otherwise, page-wide, a quarter of the width, capped: at a third a page-wide line stood in 220px of plot,\n most of it white over the line. */\n const W = measured > 0 ? measured : wide;\n /* Half a page wide (a pair, Dashboard.tsx) it keeps the third its neighbour has, so the two plots of a row\n stand the same height rather than one short over white. */\n const H = high\n ? Math.max(120, Math.round(high))\n : Math.max(120, W < 760 ? Math.min(Math.round(W / 3), 220) : Math.min(Math.round(W / 4), 180));\n /* A target is kept in view: a line far under its goal still shows the goal. */\n const goal = target !== undefined && Number.isFinite(target) ? target : undefined;\n const max = Math.max(...points.map((p) => p.value), 0, goal ?? 0);\n const min = Math.min(...points.map((p) => p.value), 0, goal ?? 0);\n const scale = niceScale(min, max, 2, say.tick?.steps);\n const levels = scale.levels;\n const span = scale.max - scale.min || 1;\n const gutter = Math.max(...levels.map((v) => tickWidth(tickSay(say)(v)))) + 6;\n const PAD = { top: 14, right: 14, bottom: 24, left: gutter };\n const x = (i: number) =>\n PAD.left + (points.length > 1 ? (i * (W - PAD.left - PAD.right)) / (points.length - 1) : (W - PAD.left - PAD.right) / 2);\n const y = (v: number) => PAD.top + (1 - (v - scale.min) / span) * (H - PAD.top - PAD.bottom);\n const line = linePath(\n points.map((p, i) => [x(i), y(p.value)] as const),\n smooth,\n );\n const area = `${line} L${f1(x(points.length - 1))},${f1(y(scale.min))} L${f1(x(0))},${f1(y(scale.min))} Z`;\n\n /* A point is named with its year wherever it stands alone — a dot's\n title, the crosshair, the table — and the axis drops the year a tick\n shares with the one before it. */\n const named = points.map((p) => periodTick(p.key));\n const marks = axisMarks(\n points.map((p) => p.key),\n x,\n );\n\n const onMove = (e: React.PointerEvent<SVGSVGElement>) => {\n // screen-px: clientX is a screen-pixel ruler too; the ratio maps it into viewBox units.\n const box = svg.current!.getBoundingClientRect();\n const px = ((e.clientX - box.left) / box.width) * W;\n let best = 0;\n for (let i = 1; i < points.length; i++) if (Math.abs(x(i) - px) < Math.abs(x(best) - px)) best = i;\n setNear(best);\n };\n const cx = near === null ? 0 : x(near);\n const cy = near === null ? 0 : y(points[near].value);\n const right = cx > W * 0.7;\n /* A picture must not hold buttons: where any point drills, the figure\n is a group holding buttons, not an image — axe's nested-interactive\n fails a button inside role=\"img\", as a donut's does. Where nothing\n drills it stays an image, as before. */\n const anyDrillable = onPick && points.some((p) => p.raw != null);\n return (\n <>\n <svg\n ref={svg}\n className=\"chart-line\"\n viewBox={`0 0 ${W} ${H}`}\n role={anyDrillable ? 'group' : 'img'}\n aria-label={`${sayCopy('lineSummary', { count: points.length, from: say(points[0].value), to: say(points[points.length - 1].value), peak: say(Math.max(...points.map((p) => p.value))) })}${goal === undefined ? '' : sayCopy('targetAfter', { goal: say(goal) })}`}\n onPointerMove={onMove}\n onPointerLeave={() => setNear(null)}\n >\n {levels.map((v) => (\n <line key={`g${v}`} className=\"chart-grid\" x1={PAD.left} x2={W - PAD.right} y1={f1(y(v))} y2={f1(y(v))} />\n ))}\n {levels.map((v) => (\n <text key={`t${v}`} className=\"chart-tick chart-y-tick\" x={f1(PAD.left - 6)} y={f1(y(v) + 4)} textAnchor=\"end\">\n {tickSay(say)(v)}\n </text>\n ))}\n {goal !== undefined && (\n <g className=\"chart-target\">\n <line className=\"chart-target-line\" x1={PAD.left} x2={W - PAD.right} y1={f1(y(goal))} y2={f1(y(goal))} />\n <text className=\"chart-target-label\" x={PAD.left + 4} y={f1(y(goal) - 4)}>\n {sayCopy('target', { goal: say(goal) })}\n </text>\n </g>\n )}\n {!dots && <path className=\"chart-area\" d={area} />}\n {!dots && <path className=\"chart-stroke\" d={line} />}\n {points.map((p, i) => {\n const dot = (\n <circle\n className={dots && p.value !== 0 ? 'chart-dot chart-dot-solid' : 'chart-dot'}\n cx={f1(x(i))}\n cy={f1(y(p.value))}\n r={dots ? 4 : 3}\n >\n <title>{`${named[i]}: ${say(p.value)}`}</title>\n </circle>\n );\n /* A point drills where a door is wanted: the same raw value a\n legend button would carry. A dot is too small a target to be\n the button itself, so a drillable point is a group holding the\n dot and a wider transparent hit disc — one tab stop, not two,\n and roving tabindex keeps the whole line to that one stop.\n Gap-filled buckets hold no raw key and are no door, as a\n donut's \"others\" slice is none. */\n const drillable = onPick && p.raw != null;\n if (!drillable) return <g key={i}>{dot}</g>;\n return (\n <g\n key={i}\n className=\"chart-point-drill\"\n role=\"button\"\n tabIndex={i === tabbable ? 0 : -1}\n aria-label={`${named[i]}: ${say(p.value)}`}\n onClick={() => onPick!(p.raw)}\n onKeyDown={(event: React.KeyboardEvent) => {\n if (event.key === 'Enter' || event.key === ' ') {\n event.preventDefault();\n onPick!(p.raw);\n } else if (event.key === 'ArrowRight') {\n const at = drillableAt[drillableAt.indexOf(i) + 1];\n if (at !== undefined) {\n event.preventDefault();\n moveRoving(at);\n }\n } else if (event.key === 'ArrowLeft') {\n const at = drillableAt[drillableAt.indexOf(i) - 1];\n if (at !== undefined) {\n event.preventDefault();\n moveRoving(at);\n }\n } else if (event.key === 'Home') {\n const at = drillableAt[0];\n if (at !== undefined) {\n event.preventDefault();\n moveRoving(at);\n }\n } else if (event.key === 'End') {\n const at = drillableAt[drillableAt.length - 1];\n if (at !== undefined) {\n event.preventDefault();\n moveRoving(at);\n }\n }\n }}\n >\n <circle className=\"chart-point-hit\" cx={f1(x(i))} cy={f1(y(p.value))} r={12} />\n {dot}\n </g>\n );\n })}\n {marks.map(({ index, text }) => (\n <text\n key={`m${index}`}\n className=\"chart-tick chart-x-tick\"\n x={f1(x(index))}\n y={H - 6}\n textAnchor={points.length > 1 && index === 0 ? 'start' : points.length > 1 && index === points.length - 1 ? 'end' : 'middle'}\n >\n {text}\n </text>\n ))}\n <g className=\"chart-cursor\" {...(near === null ? { hidden: true } : {})}>\n <line className=\"chart-cursor-line\" x1={f1(cx)} x2={f1(cx)} y1={PAD.top} y2={H - PAD.bottom} />\n <circle className=\"chart-cursor-dot\" cx={f1(cx)} cy={f1(cy)} r={4} />\n <text\n className=\"chart-cursor-text\"\n x={f1(right ? cx - 8 : cx + 8)}\n y={f1(Math.max(PAD.top + 10, cy - 10))}\n textAnchor={right ? 'end' : 'start'}\n >\n {near === null ? '' : `${named[near]} · ${say(points[near].value)}`}\n </text>\n </g>\n </svg>\n {/* The hider is a block round the table, not the table itself: a table is\n never shorter than its rows, so a hidden one of 700 days stood 16,000px\n tall and the pane scrolled into blank space under the dashboard. */}\n <div className=\"visually-hidden\">\n <table className=\"chart-data\">\n <tbody>\n {points.map((p, i) => (\n <tr key={i}>\n <th scope=\"row\">{named[i]}</th>\n <td>{say(p.value)}</td>\n </tr>\n ))}\n </tbody>\n </table>\n </div>\n </>\n );\n}\n\n/* A line chart's series past this many are gathered into one \"others\" line: more lines than that tangle. */\nconst MAX_LINES = 5;\n/* Up to this many lines are named at their ends; more names than that stack into a column of their own. */\nconst DIRECT_LINES = 3;\n/* Two names closer than a line of small text overlap: each is pushed apart from its neighbor, then the column is\n kept inside the plot. Returned in the order the ends were given. */\nexport function namesAtEnds(ends: readonly number[], top: number, bottom: number, gap = 14): number[] {\n const order = ends.map((at, i) => ({ at, i })).sort((a, b) => a.at - b.at);\n for (let k = 1; k < order.length; k++) order[k].at = Math.max(order[k].at, order[k - 1].at + gap);\n const over = order.length ? order[order.length - 1].at - bottom : 0;\n if (over > 0) for (const o of order) o.at -= over;\n for (let k = 0; k < order.length; k++) order[k].at = Math.max(order[k].at, top + k * gap);\n const out: number[] = [];\n for (const o of order) out[o.i] = o.at;\n return out;\n}\n\n/**\n * Several lines over one time axis, a series each: the line of a two-key\n * breakdown (\"month created_at, channel\"). Each series keeps one theme token\n * on its line, its legend dot and the hover card; the legend's picker shows\n * every line or one alone. On hover a card lists every shown series at the\n * point, so two lines are compared without chasing two tooltips.\n */\nfunction MultiLine({\n rows,\n say,\n wide,\n high,\n target,\n smooth,\n seriesLabel,\n vocabulary,\n}: {\n rows: Array<ChartRow & { series?: unknown }>;\n say: Say;\n wide: number;\n high?: number;\n target?: number;\n smooth: boolean;\n seriesLabel: (key: unknown) => string;\n vocabulary?: readonly string[];\n}) {\n const svg = useRef<SVGSVGElement>(null);\n const [near, setNear] = useState<number | null>(null);\n const [measured, setMeasured] = useState(0);\n const [only, setOnly] = useState<string>('');\n const keys = [...new Set(rows.map((r) => (r.key == null ? '—' : String(r.key))))];\n if (keys.every((key) => PERIOD.test(key))) keys.sort();\n const totals = new Map<string, number>();\n const named = new Map<string, unknown>();\n for (const r of rows) {\n const id = r.series == null ? '—' : String(r.series);\n named.set(id, r.series);\n totals.set(id, (totals.get(id) ?? 0) + (Number(r.value) || 0));\n }\n const ranked = [...totals.keys()].sort((a, b) => totals.get(b)! - totals.get(a)!);\n const kept = ranked.length > MAX_LINES ? ranked.slice(0, MAX_LINES - 1) : ranked;\n /* A vocabulary's values go in its order and keep its colors, so a source is the same color here as in a donut of\n the same column; the largest still decide which lines are kept. */\n const place = (id: string) => vocabulary?.indexOf(id) ?? -1;\n if (vocabulary && kept.every((id) => place(id) >= 0)) kept.sort((a, b) => place(a) - place(b));\n const OTHERS = '\\u0000others';\n const series = [...kept, ...(ranked.length > kept.length ? [OTHERS] : [])].map((id, i) => {\n const slot = place(id) >= 0 && place(id) < 8 ? place(id) : i;\n const values = keys.map(() => 0);\n for (const r of rows) {\n const own = r.series == null ? '—' : String(r.series);\n const lane = kept.includes(own) ? own : OTHERS;\n if (lane !== id) continue;\n const v = Number(r.value);\n if (Number.isFinite(v)) values[keys.indexOf(r.key == null ? '—' : String(r.key))] += v;\n }\n return {\n id,\n label: id === OTHERS ? sayCopy('others', { restCount: ranked.length - kept.length }) : seriesLabel(named.get(id)),\n color: `var(--chart-${slot + 1}, var(--accent))`,\n values,\n };\n });\n const shown = only && series.some((line) => line.id === only) ? series.filter((line) => line.id === only) : series;\n const drawn = keys.length >= 2;\n useLayoutEffect(() => {\n const element = svg.current?.parentElement;\n if (!element || typeof ResizeObserver === 'undefined') return;\n const measure = () => setMeasured(Math.max(0, Math.round(viewportBox(element).width)));\n measure();\n const observer = new ResizeObserver(measure);\n observer.observe(element);\n return () => observer.disconnect();\n }, [drawn]);\n if (!drawn) return <p className=\"note\">{sayCopy('notEnoughPointsToDraw')}</p>;\n const W = measured > 0 ? measured : wide;\n const H = high ? Math.max(120, Math.round(high)) : Math.max(120, Math.min(Math.round(W / 3), 220));\n const goal = target !== undefined && Number.isFinite(target) ? target : undefined;\n const all = shown.flatMap((line) => line.values);\n const max = Math.max(...all, 0, goal ?? 0);\n const min = Math.min(...all, 0, goal ?? 0);\n const scale = niceScale(min, max, 2, say.tick?.steps);\n const levels = scale.levels;\n const span = scale.max - scale.min || 1;\n const gutter = Math.max(...levels.map((v) => tickWidth(tickSay(say)(v)))) + 6;\n /* A few lines are named where they end, not in a key above them: the eye follows a line to its name instead of\n matching a color back to a list. Past three, or where the names would take more than a quarter of the width, the\n legend says them. */\n const nameRoom = Math.max(...shown.map((line) => tickWidth(line.label))) + 8;\n const direct = shown.length <= DIRECT_LINES && nameRoom <= W / 4;\n const PAD = { top: 14, right: direct ? nameRoom : 14, bottom: 24, left: gutter };\n const x = (i: number) => PAD.left + (i * (W - PAD.left - PAD.right)) / (keys.length - 1);\n const y = (v: number) => PAD.top + (1 - (v - scale.min) / span) * (H - PAD.top - PAD.bottom);\n const ends = direct\n ? namesAtEnds(\n shown.map((line) => y(line.values[line.values.length - 1])),\n PAD.top,\n H - PAD.bottom,\n )\n : [];\n const ticks = keys.map((key) => periodTick(key));\n const marks = axisMarks(keys, x);\n const onMove = (e: React.PointerEvent<SVGSVGElement>) => {\n // screen-px: clientX is a screen-pixel ruler too; the ratio maps it into viewBox units.\n const box = svg.current!.getBoundingClientRect();\n const px = ((e.clientX - box.left) / box.width) * W;\n let best = 0;\n for (let i = 1; i < keys.length; i++) if (Math.abs(x(i) - px) < Math.abs(x(best) - px)) best = i;\n setNear(best);\n };\n const cx = near === null ? 0 : x(near);\n const right = cx > W * 0.6;\n return (\n <div className=\"chart-multi\">\n <div className=\"chart-multi-head\">\n <ul className=\"chart-legend chart-multi-legend\" {...(direct ? { hidden: true } : {})}>\n {shown.map((line) => (\n <li key={line.id}>\n <span className=\"chart-dot-key\" style={{ background: line.color }} />\n <span className=\"chart-legend-key\">{line.label}</span>\n </li>\n ))}\n </ul>\n <select\n className=\"chart-series-pick\"\n aria-label={sayCopy('showSeries')}\n value={only}\n onChange={(event) => setOnly(event.target.value)}\n >\n <option value=\"\">{sayCopy('allSeries')}</option>\n {series.map((line) => (\n <option key={line.id} value={line.id}>\n {line.label}\n </option>\n ))}\n </select>\n </div>\n <div className=\"chart-multi-plot\">\n <svg\n ref={svg}\n className=\"chart-line\"\n viewBox={`0 0 ${W} ${H}`}\n role=\"img\"\n aria-label={sayCopy('linesSummary', {\n count: shown.length,\n points: keys.length,\n names: shown.map((line) => line.label).join(', '),\n })}\n onPointerMove={onMove}\n onPointerLeave={() => setNear(null)}\n >\n {levels.map((v) => (\n <line key={`g${v}`} className=\"chart-grid\" x1={PAD.left} x2={W - PAD.right} y1={f1(y(v))} y2={f1(y(v))} />\n ))}\n {levels.map((v) => (\n <text key={`t${v}`} className=\"chart-tick chart-y-tick\" x={f1(PAD.left - 6)} y={f1(y(v) + 4)} textAnchor=\"end\">\n {tickSay(say)(v)}\n </text>\n ))}\n {goal !== undefined && (\n <g className=\"chart-target\">\n <line className=\"chart-target-line\" x1={PAD.left} x2={W - PAD.right} y1={f1(y(goal))} y2={f1(y(goal))} />\n <text className=\"chart-target-label\" x={PAD.left + 4} y={f1(y(goal) - 4)}>\n {sayCopy('target', { goal: say(goal) })}\n </text>\n </g>\n )}\n {shown.map((line) => (\n <path\n key={line.id}\n className=\"chart-stroke chart-series-stroke\"\n style={{ stroke: line.color }}\n d={linePath(\n line.values.map((v, i) => [x(i), y(v)] as const),\n smooth,\n )}\n />\n ))}\n {direct &&\n shown.map((line, i) => {\n const last = line.values.length - 1;\n return (\n <g key={`n${line.id}`} className=\"chart-end\">\n <circle className=\"chart-end-dot\" style={{ fill: line.color }} cx={f1(x(last))} cy={f1(y(line.values[last]))} r={3} />\n <text className=\"chart-end-name\" x={f1(W - PAD.right + 8)} y={f1(ends[i] + 4)}>\n {line.label}\n </text>\n </g>\n );\n })}\n {marks.map(({ index, text }) => (\n <text\n key={`m${index}`}\n className=\"chart-tick chart-x-tick\"\n x={f1(x(index))}\n y={H - 6}\n textAnchor={index === 0 ? 'start' : index === keys.length - 1 ? 'end' : 'middle'}\n >\n {text}\n </text>\n ))}\n <g className=\"chart-cursor\" {...(near === null ? { hidden: true } : {})}>\n <line className=\"chart-cursor-line\" x1={f1(cx)} x2={f1(cx)} y1={PAD.top} y2={H - PAD.bottom} />\n {near !== null &&\n shown.map((line) => (\n <circle\n key={line.id}\n className=\"chart-cursor-dot\"\n style={{ fill: line.color }}\n cx={f1(cx)}\n cy={f1(y(line.values[near]))}\n r={4}\n />\n ))}\n </g>\n </svg>\n {near !== null && (\n /* The card stands beside the cursor, on the side with room, at a fixed top: it never moves the page. */\n <div\n className=\"chart-tip-card\"\n aria-hidden=\"true\"\n style={right ? { right: `${((W - cx) / W) * 100}%`, marginRight: 10 } : { left: `${(cx / W) * 100}%`, marginLeft: 10 }}\n >\n <div className=\"chart-tip-title\">{ticks[near]}</div>\n {shown.map((line) => (\n <div key={line.id} className=\"chart-tip-row\">\n <span className=\"chart-dot-key\" style={{ background: line.color }} />\n <span className=\"chart-tip-name\">{line.label}</span>\n <span className=\"chart-tip-value\">{say(line.values[near])}</span>\n </div>\n ))}\n </div>\n )}\n </div>\n <div className=\"visually-hidden\">\n <table className=\"chart-data\">\n <thead>\n <tr>\n <td />\n {shown.map((line) => (\n <th key={line.id} scope=\"col\">\n {line.label}\n </th>\n ))}\n </tr>\n </thead>\n <tbody>\n {keys.map((key, i) => (\n <tr key={key}>\n <th scope=\"row\">{ticks[i]}</th>\n {shown.map((line) => (\n <td key={line.id}>{say(line.values[i])}</td>\n ))}\n </tr>\n ))}\n </tbody>\n </table>\n </div>\n </div>\n );\n}\n\n/** Whether a key is a period the grammar buckets by (\"2026-08\", \"2026-Q3\"). */\nconst PERIOD = /^\\d{4}(-\\d{2}(-\\d{2})?|-Q[1-4])?$/;\n\n/**\n * Bars: one series, a bar per group — how much each week or each stage\n * holds, where a line says how a number moved. Over calendar buckets one bar\n * is the current one, drawn in the ink while the rest stay quiet: the last\n * (the period in hand) until the pointer names another. Its value is said in\n * a pill over it, and a guide runs from it across the levels, so the reader\n * can read it off the scale without a tooltip's delay; there the pill is\n * information, not a hover effect, so it is always there. Over categories (a\n * stage, a source) no bar is the one in hand — the last is only last in the\n * vocabulary — so at rest none is inked, with no pill and no guide, until the\n * pointer names one. Nothing moves (motion rule 8).\n *\n * Periods keep their order and gain their missing buckets at zero, as a\n * line's do; categories go in their vocabulary's order, else biggest first.\n * The levels are on the left, in a gutter of their own, and every bar is a\n * row of a table assistive technology reads, as a line's points are.\n */\nexport function BarChart({\n rows,\n say = String,\n label = String,\n wide = 600,\n high,\n target,\n tone,\n}: {\n rows: ChartRow[];\n say?: Say;\n label?: (key: unknown) => string;\n wide?: number;\n high?: number;\n target?: number;\n /** A category's display tone (a state's, a status's), where its column has them: each bar wears the ink its dot and badge wear. */\n tone?: (key: unknown) => string | undefined;\n}) {\n const periods = rows.length > 0 && rows.every((r) => r.key != null && PERIOD.test(String(r.key)));\n const bars = periods\n ? (fillGaps(rows.map((r) => ({ key: String(r.key), value: Number(r.value) })).filter((p) => Number.isFinite(p.value))) as Point[]).map(\n (p) => ({ raw: p.key as unknown, value: p.value }),\n )\n : rows.map((r) => ({ raw: r.key, value: Number(r.value) })).filter((p) => Number.isFinite(p.value));\n const svg = useRef<SVGSVGElement>(null);\n const [near, setNear] = useState<number | null>(null);\n const [measured, setMeasured] = useState(0);\n useLayoutEffect(() => {\n const element = svg.current?.parentElement;\n if (!element || typeof ResizeObserver === 'undefined') return;\n const measure = () => setMeasured(Math.max(0, Math.round(viewportBox(element).width)));\n measure();\n const observer = new ResizeObserver(measure);\n observer.observe(element);\n return () => observer.disconnect();\n }, [bars.length > 0]); // eslint-disable-line react-hooks/exhaustive-deps\n if (!bars.length) return <p className=\"note\">{sayCopy('nothingToDraw')}</p>;\n\n /* States are bars of the meaning they carry: where every category has a tone, each wears it (the same ink the status\n dot and badge draw), shared or not, since the axis names every bar. Periods and untoned columns keep the look's hue. */\n const inks = periods || !tone ? undefined : bars.map((b) => TONE_INK[tone(b.raw) ?? '']);\n const toned = !!inks && inks.every(Boolean);\n const named = bars.map((b, i) => (periods ? periodTick(String(b.raw), i ? String(bars[i - 1].raw) : undefined) : label(b.raw)));\n const whole = bars.map((b) => (periods ? periodTick(String(b.raw)) : label(b.raw)));\n const W = measured > 0 ? measured : wide;\n const H = high ? Math.max(120, Math.round(high)) : Math.max(160, Math.min(Math.round(W / 3), 240));\n const goal = target !== undefined && Number.isFinite(target) ? target : undefined;\n const max = Math.max(...bars.map((b) => b.value), 0, goal ?? 0);\n const min = Math.min(...bars.map((b) => b.value), 0);\n const scale = niceScale(min, max, 2, say.tick?.steps);\n const levels = scale.levels;\n const span = scale.max - scale.min || 1;\n const gutter = Math.max(...levels.map((v) => tickWidth(tickSay(say)(v)))) + 6;\n /* Room over the tallest bar for the pill that names it. */\n const PAD = { top: 30, right: 6, bottom: 24, left: gutter };\n const band = (W - PAD.left - PAD.right) / bars.length;\n const barWide = Math.max(2, Math.min(56, band * 0.64));\n const x = (i: number) => PAD.left + band * i + (band - barWide) / 2;\n const mid = (i: number) => PAD.left + band * (i + 0.5);\n const y = (v: number) => PAD.top + (1 - (v - scale.min) / span) * (H - PAD.top - PAD.bottom);\n const base = y(Math.max(scale.min, 0));\n const marks = axisMarks(\n named.map((text, i) => (periods ? String(bars[i].raw) : text)),\n mid,\n { centered: true },\n );\n /* A mark is centred under its bar, and kept inside the figure at either end. */\n const markAt = (index: number, text: string) => Math.min(Math.max(mid(index), tickWidth(text) / 2), W - tickWidth(text) / 2);\n const active: number | null = near ?? (periods ? bars.length - 1 : null);\n const tip = active === null ? '' : `${whole[active]} · ${say(bars[active].value)}`;\n const tipWide = tickWidth(tip) + 12;\n const tipLeft = active === null ? 0 : Math.min(Math.max(mid(active) - tipWide / 2, PAD.left), W - PAD.right - tipWide);\n const top = active === null ? 0 : y(Math.max(bars[active].value, 0));\n const tipTop = Math.max(2, top - 26);\n const at = (e: React.PointerEvent<SVGSVGElement>) => {\n // screen-px: clientX is a screen-pixel ruler too; the ratio maps it into viewBox units.\n const box = svg.current!.getBoundingClientRect();\n if (!box.width) return bars.length - 1;\n const px = ((e.clientX - box.left) / box.width) * W;\n return Math.min(bars.length - 1, Math.max(0, Math.floor((px - PAD.left) / band)));\n };\n return (\n <>\n <svg\n ref={svg}\n className=\"chart-bars\"\n viewBox={`0 0 ${W} ${H}`}\n role=\"img\"\n aria-label={`${sayCopy('barsSummary', { count: bars.length, highest: say(Math.max(...bars.map((b) => b.value))), last: whole[bars.length - 1], value: say(bars[bars.length - 1].value) })}${goal === undefined ? '' : sayCopy('targetAfter', { goal: say(goal) })}`}\n onPointerMove={(e) => setNear(at(e))}\n onPointerLeave={() => setNear(null)}\n >\n {levels.map((v) => (\n <line key={`g${v}`} className=\"chart-grid\" x1={PAD.left} x2={W - PAD.right} y1={f1(y(v))} y2={f1(y(v))} />\n ))}\n {levels.map((v) => (\n <text key={`t${v}`} className=\"chart-tick chart-y-tick\" x={f1(PAD.left - 6)} y={f1(y(v) + 4)} textAnchor=\"end\">\n {tickSay(say)(v)}\n </text>\n ))}\n {active !== null && <line className=\"chart-bar-guide\" x1={PAD.left} x2={W - PAD.right} y1={f1(top)} y2={f1(top)} />}\n {bars.map((b, i) => {\n const h = Math.abs(y(b.value) - base);\n return (\n <rect\n key={i}\n className={`chart-bar${toned ? ' is-toned' : ''}${i === active ? ' is-active' : ''}`}\n style={toned ? { ['--bar-ink' as string]: inks![i] } : undefined}\n x={f1(x(i))}\n y={f1(Math.min(y(b.value), base))}\n width={f1(barWide)}\n height={f1(Math.max(h, b.value ? 1 : 0))}\n >\n <title>{`${whole[i]}: ${say(b.value)}`}</title>\n </rect>\n );\n })}\n {goal !== undefined && (\n <g className=\"chart-target\">\n <line className=\"chart-target-line\" x1={PAD.left} x2={W - PAD.right} y1={f1(y(goal))} y2={f1(y(goal))} />\n <text className=\"chart-target-label\" x={PAD.left + 4} y={f1(y(goal) - 4)}>\n {sayCopy('target', { goal: say(goal) })}\n </text>\n </g>\n )}\n {marks.map(({ index, text }) => (\n <text\n key={`m${index}`}\n className={`chart-tick chart-x-tick${index === active ? ' is-active' : ''}`}\n x={f1(markAt(index, periods ? text : named[index]))}\n y={H - 6}\n textAnchor=\"middle\"\n >\n {periods ? text : named[index]}\n </text>\n ))}\n {active !== null && (\n <g className=\"chart-bar-tip\" aria-hidden=\"true\">\n <rect x={f1(tipLeft)} y={f1(tipTop)} width={f1(tipWide)} height={20} />\n <text x={f1(tipLeft + tipWide / 2)} y={f1(tipTop + 14)} textAnchor=\"middle\">\n {tip}\n </text>\n </g>\n )}\n </svg>\n {/* The hider is a block round the table, not the table itself: a table is\n never shorter than its rows, so a hidden one of 700 days stood 16,000px\n tall and the pane scrolled into blank space under the dashboard. */}\n <div className=\"visually-hidden\">\n <table className=\"chart-data\">\n <tbody>\n {bars.map((b, i) => (\n <tr key={i}>\n <th scope=\"row\">{whole[i]}</th>\n <td>{say(b.value)}</td>\n </tr>\n ))}\n </tbody>\n </table>\n </div>\n </>\n );\n}\n\n/**\n * Stacked columns: a column per period, divided by series — how much each day\n * held and what it was made of. The bars' grammar (Bars, above): levels on the\n * left in their own gutter, periods along the bottom with their empty buckets\n * at zero, and one current column whose total and parts are said in a pill\n * over it, with a guide across the levels; the last until the pointer names\n * another. While the pointer is over the chart the pill rides with it, just\n * above it, so it never sits over the column being read. Each series keeps one theme token in every column and in the\n * legend, which says each series' total. Every column is also a row of a\n * table assistive technology reads. Nothing moves (motion rule 8).\n */\nexport function StackedColumns({\n rows,\n series,\n say = String,\n wide = 600,\n high,\n}: {\n rows: Array<{ key: string; values: Record<string, number> }>;\n series: Array<{ key: string; label: string }>;\n say?: Say;\n wide?: number;\n high?: number;\n}) {\n const columns = rows\n .map((r) => ({ key: r.key, parts: series.map((s) => Math.max(0, Number(r.values[s.key]) || 0)) }))\n .map((c) => ({ ...c, total: c.parts.reduce((n, v) => n + v, 0) }));\n const svg = useRef<SVGSVGElement>(null);\n const [near, setNear] = useState<number | null>(null);\n const [pointer, setPointer] = useState<{ x: number; y: number } | null>(null);\n const [measured, setMeasured] = useState(0);\n useLayoutEffect(() => {\n const element = svg.current?.parentElement;\n if (!element || typeof ResizeObserver === 'undefined') return;\n const measure = () => setMeasured(Math.max(0, Math.round(viewportBox(element).width)));\n measure();\n const observer = new ResizeObserver(measure);\n observer.observe(element);\n return () => observer.disconnect();\n }, [columns.length > 0]); // eslint-disable-line react-hooks/exhaustive-deps\n if (!columns.length) return <p className=\"note\">{sayCopy('nothingToDraw')}</p>;\n const periods = columns.every((c) => PERIOD.test(c.key));\n const named = columns.map((c) => (periods ? periodTick(c.key) : c.key));\n const W = measured > 0 ? measured : wide;\n const H = high ? Math.max(120, Math.round(high)) : Math.max(160, Math.min(Math.round(W / 3.5), 220));\n const max = Math.max(...columns.map((c) => c.total), 1);\n const scale = niceScale(0, max, 2, say.tick?.steps);\n const levels = scale.levels;\n const gutter = Math.max(...levels.map((v) => tickWidth(tickSay(say)(v)))) + 6;\n const PAD = { top: 30, right: 6, bottom: 24, left: gutter };\n const band = (W - PAD.left - PAD.right) / columns.length;\n const colWide = Math.max(2, Math.min(40, band * 0.64));\n const x = (i: number) => PAD.left + band * i + (band - colWide) / 2;\n const mid = (i: number) => PAD.left + band * (i + 0.5);\n const y = (v: number) => PAD.top + (1 - v / scale.max) * (H - PAD.top - PAD.bottom);\n const marks = periods\n ? axisMarks(\n columns.map((c) => c.key),\n mid,\n { centered: true },\n )\n : columns.map((c, index) => ({ index, text: c.key }));\n const markAt = (index: number, text: string) => Math.min(Math.max(mid(index), tickWidth(text) / 2), W - tickWidth(text) / 2);\n const active = near ?? columns.length - 1;\n const parts = (i: number) => series.map((s, k) => `${s.label} ${say(columns[i].parts[k])}`).join(' · ');\n const tip = `${named[active]} · ${parts(active)}`;\n const tipWide = tickWidth(tip) + 12;\n const tipLeft = Math.min(Math.max((pointer?.x ?? mid(active)) - tipWide / 2, PAD.left), W - PAD.right - tipWide);\n const top = y(columns[active].total);\n const tipTop = pointer ? Math.min(Math.max(2, pointer.y - 30), H - PAD.bottom - 22) : Math.max(2, top - 26);\n const color = (k: number) => `var(--chart-${k + 1}, var(--accent))`;\n const at = (e: React.PointerEvent<SVGSVGElement>) => {\n // screen-px: clientX is a screen-pixel ruler too; the ratio maps it into viewBox units.\n const box = svg.current!.getBoundingClientRect();\n if (!box.width || !box.height) return;\n const px = ((e.clientX - box.left) / box.width) * W;\n setPointer({ x: px, y: ((e.clientY - box.top) / box.height) * H });\n setNear(Math.min(columns.length - 1, Math.max(0, Math.floor((px - PAD.left) / band))));\n };\n const totals = series.map((_, k) => columns.reduce((n, c) => n + c.parts[k], 0));\n return (\n <div className=\"chart-columns\">\n <svg\n ref={svg}\n className=\"chart-bars\"\n viewBox={`0 0 ${W} ${H}`}\n role=\"img\"\n aria-label={sayCopy('barsSummary', {\n count: columns.length,\n highest: say(max),\n last: named[columns.length - 1],\n value: say(columns[columns.length - 1].total),\n })}\n onPointerMove={at}\n onPointerLeave={() => {\n setNear(null);\n setPointer(null);\n }}\n >\n {levels.map((v) => (\n <line key={`g${v}`} className=\"chart-grid\" x1={PAD.left} x2={W - PAD.right} y1={f1(y(v))} y2={f1(y(v))} />\n ))}\n {levels.map((v) => (\n <text key={`t${v}`} className=\"chart-tick chart-y-tick\" x={f1(PAD.left - 6)} y={f1(y(v) + 4)} textAnchor=\"end\">\n {tickSay(say)(v)}\n </text>\n ))}\n <line className=\"chart-bar-guide\" x1={PAD.left} x2={W - PAD.right} y1={f1(top)} y2={f1(top)} />\n {columns.map((c, i) => {\n let base = 0;\n return (\n <g key={c.key} className={`chart-column${i === active ? ' is-active' : ''}`}>\n <title>{`${named[i]}: ${parts(i)}`}</title>\n {c.parts.map((v, k) => {\n const from = base;\n base += v;\n if (!v) return null;\n return (\n <rect\n key={k}\n className=\"chart-column-part\"\n x={f1(x(i))}\n y={f1(y(base))}\n width={f1(colWide)}\n height={f1(Math.max(1, y(from) - y(base)))}\n style={{ fill: color(k) }}\n />\n );\n })}\n </g>\n );\n })}\n {marks.map(({ index, text }) => (\n <text\n key={`m${index}`}\n className={`chart-tick chart-x-tick${index === active ? ' is-active' : ''}`}\n x={f1(markAt(index, text))}\n y={H - 6}\n textAnchor=\"middle\"\n >\n {text}\n </text>\n ))}\n <g className=\"chart-bar-tip\" aria-hidden=\"true\">\n <rect x={f1(tipLeft)} y={f1(tipTop)} width={f1(tipWide)} height={20} />\n <text x={f1(tipLeft + tipWide / 2)} y={f1(tipTop + 14)} textAnchor=\"middle\">\n {tip}\n </text>\n </g>\n </svg>\n <ul className=\"chart-legend chart-columns-legend\">\n {series.map((s, k) => (\n <li key={s.key}>\n <span className=\"chart-swatch\" style={{ background: color(k) }} />\n <span className=\"chart-legend-key\">{s.label}</span>\n <span className=\"chart-legend-value\">{say(totals[k])}</span>\n </li>\n ))}\n </ul>\n <div className=\"visually-hidden\">\n <table className=\"chart-data\">\n <tbody>\n {columns.map((c, i) => (\n <tr key={c.key}>\n <th scope=\"row\">{named[i]}</th>\n <td>{parts(i)}</td>\n </tr>\n ))}\n </tbody>\n </table>\n </div>\n </div>\n );\n}\n\n/**\n * The house ring round a donut's slice (design.md, Access): a shape takes no outline, so the ring is the outline of\n * the slice's own arc, `from` and `length` in hundredths of the circle from 3 o'clock, drawn 2px off its stroke, `width`\n * units wide as the look draws it (7, Lumen's line charts 4.5; the donut is 120px over 42 units; the ring's own 2px is a\n * non-scaling stroke). A widened stroke was the ring once: the drawing's edge cut it, and on a pale slice it could not\n * be told from the slice. Drawn off a 7-unit stroke round a 4.5-unit one, it stood 6px off the slice.\n */\nexport function sliceRing(center: number, radius: number, from: number, length: number, width = 7): string {\n const off = width / 2 + 1.05;\n const outer = radius + off;\n const inner = radius - off;\n const past = (100 * (1.05 / radius)) / (2 * Math.PI);\n const n = (value: number) => Number(value.toFixed(3));\n const point = (r: number, at: number) => {\n const angle = (2 * Math.PI * at) / 100;\n return `${n(center + r * Math.cos(angle))} ${n(center + r * Math.sin(angle))}`;\n };\n const circle = (r: number) =>\n `M ${n(center + r)} ${center} A ${n(r)} ${n(r)} 0 1 1 ${n(center - r)} ${center} A ${n(r)} ${n(r)} 0 1 1 ${n(center + r)} ${center} Z`;\n /* A slice that is (nearly) the whole circle has no ends: its ring is two circles. */\n if (length + 2 * past >= 100) return `${circle(outer)} ${circle(inner)}`;\n const start = from - past;\n const end = from + length + past;\n const large = end - start > 50 ? 1 : 0;\n return `M ${point(outer, start)} A ${n(outer)} ${n(outer)} 0 ${large} 1 ${point(outer, end)} L ${point(inner, end)} A ${n(inner)} ${n(inner)} 0 ${large} 0 ${point(inner, start)} Z`;\n}\n\n/**\n * A donut with its legend: how the whole divides, said twice — arc length\n * and a labelled figure. Past six slices the tail is gathered into \"others\".\n */\nexport function DonutChart({\n rows,\n say = String,\n label = String,\n onPick,\n total,\n ordered,\n tone,\n}: {\n rows: ChartRow[];\n say?: Say;\n label?: (key: unknown) => string;\n /** A slice's display tone, where its column has them: slices wear the ink their dot and badge wear when every one has its own. */\n tone?: (key: unknown) => string | undefined;\n onPick?: ((value: unknown) => void) | null;\n /** What the figure in the middle is: \"Total visitors\", said under it. */\n total?: string;\n /** The slices are steps of a scale, in its order: drawn in steps of one hue (rampInk), not in categorical ones. */\n ordered?: boolean;\n}) {\n /* The slice's stroke as the look draws it (.chart-slice: 7 units, 4.5 in Lumen's line charts), read as a slice takes\n the keyboard, the moment its ring is drawn: a look is picked while the page is open, and a stylesheet says it. */\n const [sliceWidth, setSliceWidth] = useState(7);\n const all = rows\n .map((r) => ({ key: r.key == null ? '—' : label(r.key), raw: r.key, value: Number(r.value) }))\n .filter((p) => Number.isFinite(p.value) && p.value > 0);\n if (!all.length) return <p className=\"note\">{sayCopy('nothingToDivide')}</p>;\n const MAX_SLICES = 6;\n const slices: Array<{ key: string; raw?: unknown; value: number }> = all.slice(0, MAX_SLICES);\n const rest = all.slice(MAX_SLICES);\n if (rest.length) slices.push({ key: `others (${rest.length})`, value: rest.reduce((n, p) => n + p.value, 0) });\n const whole = slices.reduce((n, p) => n + p.value, 0);\n const R = 15.9155; /* circumference 100, so dasharray speaks percent. */\n const C = 21;\n /* A step of the ramp rides in a property of its own, which the slice and its swatch both paint with. */\n /* A legend that names two slices in one ink says nothing, so slices wear their tones only where each is distinct. */\n const inks = ordered || rest.length || !tone ? undefined : slices.map((p) => TONE_INK[tone(p.raw) ?? '']);\n const toned = !!inks && inks.every(Boolean) && new Set(inks).size === inks.length;\n const color = (i: number) => (ordered ? 'var(--ramp)' : toned ? inks![i]! : `var(--chart-${i + 1}, var(--accent))`);\n const ramp = (i: number) => (ordered ? { ['--ramp' as string]: rampInk(i, slices.length) } : {});\n const opacity = (i: number) =>\n ordered || toned ? '1' : `var(--chart-series-opacity, ${(1 - i * (0.75 / Math.max(slices.length - 1, 1))).toFixed(2)})`;\n let at = 25; /* Start at 12 o'clock: dasharray's zero is 3 o'clock. */\n /* A hairline of the ground between slices, so neighbours of one hue read as two; a slice too thin to spare it keeps\n its whole arc. One slice is a ring, with nothing to part. */\n const GAP = slices.length > 1 ? 0.8 : 0;\n const rings = slices.map((p, i) => {\n const share = (100 * p.value) / whole;\n const drawn = share > GAP * 2 ? share - GAP : share;\n /* A slice is a door where the legend's button is: the same raw value,\n the same \"others\" exclusion. A circle is not a button by itself, so\n a drillable slice carries the button's role, name and keyboard\n behaviour, and the legend button stays as the second way in. */\n const drillable = onPick && p.raw != null && !(rest.length && i === slices.length - 1);\n const said = `${p.key}: ${say(p.value)} (${formatPercent(share, { maximumFractionDigits: 0 })})`;\n const arc = (\n <circle\n key={i}\n className={`chart-slice${drillable ? ' chart-slice-drill' : ''}`}\n cx={C}\n cy={C}\n r={R}\n strokeDasharray={`${drawn.toFixed(2)} ${(100 - drawn).toFixed(2)}`}\n strokeDashoffset={at.toFixed(2)}\n style={{ ...ramp(i), stroke: color(i), opacity: opacity(i) }}\n >\n {!drillable && <title>{said}</title>}\n </circle>\n );\n /* The door is the slice and its ring together: the ring is drawn (and read by grade) only while the door holds the\n keyboard's focus. The dash starts at -offset along a path that begins at 3 o'clock. */\n const door = drillable ? (\n <g\n key={i}\n className=\"chart-slice-door\"\n role=\"button\"\n tabIndex={0}\n aria-label={said}\n onClick={() => onPick!(p.raw)}\n onFocus={(event: React.FocusEvent<SVGGElement>) => {\n const slice = event.currentTarget.querySelector('.chart-slice');\n const width = slice ? parseFloat(getComputedStyle(slice).strokeWidth) : NaN;\n if (width > 0 && width !== sliceWidth) setSliceWidth(width);\n }}\n onKeyDown={(event: React.KeyboardEvent) => {\n if (event.key === 'Enter' || event.key === ' ') {\n event.preventDefault();\n onPick!(p.raw);\n }\n }}\n >\n <title>{said}</title>\n {arc}\n <path className=\"chart-slice-ring\" data-focus-ring=\"\" d={sliceRing(C, R, -at, drawn, sliceWidth)} />\n </g>\n ) : (\n arc\n );\n at -= share;\n return door;\n });\n /* A picture must not hold buttons: where any slice drills, the figure\n is a group holding buttons, not an image — axe's nested-interactive\n fails a button inside role=\"img\", and a screen reader would meet the\n slices as the picture's unnamed parts. Where nothing drills it stays\n an image, as before. */\n const anyDrillable = onPick && slices.some((p, i) => p.raw != null && !(rest.length && i === slices.length - 1));\n return (\n <div className={`chart-donut-wrap${ordered ? ' is-ordered' : ''}`}>\n <svg\n className=\"chart-donut\"\n viewBox={`0 0 ${C * 2} ${C * 2}`}\n role={anyDrillable ? 'group' : 'img'}\n aria-label={sayCopy('inAll', { whole: say(whole), map: slices.map((p) => `${p.key} ${say(p.value)}`).join(', ') })}\n >\n {rings}\n <text className=\"chart-donut-total\" x={C} y={total ? C : C + 1.5} textAnchor=\"middle\">\n {say(whole)}\n </text>\n {total && (\n <text className=\"chart-donut-caption\" x={C} y={C + 4.5} textAnchor=\"middle\">\n {total}\n </text>\n )}\n </svg>\n <ul className=\"chart-legend\">\n {slices.map((p, i) => {\n const parts = (\n <>\n <span className=\"chart-swatch\" style={{ ...ramp(i), background: color(i), opacity: opacity(i) }} />\n <span className=\"chart-legend-key\">{p.key}</span>\n <span className=\"chart-legend-value\">{say(p.value)}</span>\n <span className=\"chart-legend-share\">{formatPercent((100 * p.value) / whole, { maximumFractionDigits: 0 })}</span>\n </>\n );\n const drillable = onPick && p.raw != null && !(rest.length && i === slices.length - 1);\n return (\n <li key={i}>\n {drillable ? (\n <button type=\"button\" className=\"chart-legend-drill\" onClick={() => onPick!(p.raw)}>\n {parts}\n </button>\n ) : (\n parts\n )}\n </li>\n );\n })}\n </ul>\n </div>\n );\n}\n\n/** A display tone as the ink it is drawn in (the status tokens, so a look's and a dark mode's own are worn). */\nexport const TONE_INK: Record<string, string> = {\n good: 'var(--status-good)',\n warn: 'var(--status-warning)',\n bad: 'var(--status-critical)',\n info: 'var(--status-info)',\n neutral: 'var(--ink-subtle)',\n};\n\ninterface StackedRow {\n key: unknown;\n series: unknown;\n value: unknown;\n}\n\n/**\n * Stacked bars: each group of the first key a bar, divided by the second —\n * how each of several wholes divides, where a donut says how one does. The\n * bars share one scale (the longest total, or the target when it is past\n * it), each series keeps one theme token in every bar and in the legend,\n * and past seven series the tail is gathered into \"others\", the eighth\n * token. A target is a rule across every track and a word in the legend.\n */\nexport function StackedBars({\n rows,\n say = String,\n label = String,\n seriesLabel = String,\n target,\n limit = 10,\n onPick,\n seriesVocabulary,\n seriesOrdered,\n seriesTone,\n sayLegend,\n}: {\n rows: StackedRow[];\n say?: Say;\n label?: (key: unknown) => string;\n seriesLabel?: (key: unknown) => string;\n target?: number;\n limit?: number;\n onPick?: ((value: unknown) => void) | null;\n /** The second key's declared values: the series stand in their order, as a donut's slices of the same column do. */\n seriesVocabulary?: readonly string[];\n /** The second key is a scale: its series stand in its order and in steps of one hue (rampInk). */\n seriesOrdered?: boolean;\n /** A series' tone from its column's display map. Where every series has one, and no two share it, the bars wear the\n tones (Paid good, Open warning) rather than the palette, whose order says nothing about what a value means. */\n seriesTone?: (key: string) => string | undefined;\n /** The chart's visible figures (legend, each bar's total, the target) by one rule, given every one of them as stored\n (compact for all or exact for all); the titles and the hidden text stay exact. */\n sayLegend?: (figures: readonly number[]) => Say;\n}) {\n const MAX_SERIES = 7;\n const name = (v: unknown) => (v == null ? '—' : String(v));\n const bars = new Map<string, { raw: unknown; total: number; parts: Map<string, number> }>();\n const seriesTotals = new Map<string, { raw: unknown; total: number }>();\n for (const row of rows) {\n const value = Number(row.value);\n if (!Number.isFinite(value) || value <= 0) continue;\n const bar = bars.get(name(row.key)) ?? { raw: row.key, total: 0, parts: new Map() };\n bar.total += value;\n bar.parts.set(name(row.series), (bar.parts.get(name(row.series)) ?? 0) + value);\n bars.set(name(row.key), bar);\n const series = seriesTotals.get(name(row.series)) ?? { raw: row.series, total: 0 };\n series.total += value;\n seriesTotals.set(name(row.series), series);\n }\n if (!bars.size) return <p className=\"note\">{sayCopy('nothingToStack')}</p>;\n const ranked = [...seriesTotals.entries()].sort((a, b) => b[1].total - a[1].total);\n /* The largest series are kept; where the second key declares an order, they stand in it — Urgent to Planning, a\n week to a month — rather than by their totals. */\n const rank = new Map((seriesVocabulary ?? []).map((word, at) => [word, at]));\n const place = (key: string) => rank.get(key) ?? Number.POSITIVE_INFINITY;\n const step = (a: string, b: string) => {\n const x = Number(a),\n y = Number(b);\n return Number.isFinite(x) && Number.isFinite(y) ? x - y : a < b ? -1 : a > b ? 1 : 0;\n };\n const declared = rank.size > 0 || seriesOrdered;\n const kept = ranked\n .slice(0, MAX_SERIES)\n .sort(([a, x], [b, y]) => (declared ? place(a) - place(b) || (seriesOrdered ? step(a, b) : 0) : 0) || y.total - x.total)\n .map(([key, s]) => ({ key, label: seriesLabel(s.raw), total: s.total }));\n const rest = ranked.slice(MAX_SERIES);\n const series = rest.length\n ? [...kept, { key: '\u0000others', label: sayCopy('others', { restCount: rest.length }), total: rest.reduce((n, [, s]) => n + s.total, 0) }]\n : kept;\n const slot = (key: string) => {\n const at = kept.findIndex((s) => s.key === key);\n return at === -1 ? series.length - 1 : at;\n };\n /* Colour that means something where the column says what each value is; the palette's series colours, which are\n only distinct, stay for categories with no such tone. */\n const tones = seriesOrdered || rest.length ? undefined : series.map((s) => TONE_INK[seriesTone?.(s.key) ?? '']);\n const toned = !!tones && tones.every(Boolean) && new Set(tones).size === tones.length;\n const color = (i: number) => (seriesOrdered ? 'var(--ramp)' : toned ? tones![i]! : `var(--chart-${i + 1}, var(--accent))`);\n const ramp = (i: number) => (seriesOrdered ? { ['--ramp' as string]: rampInk(i, series.length) } : {});\n const opacity = (i: number) =>\n seriesOrdered || toned ? '1' : `var(--chart-series-opacity, ${(1 - i * (0.75 / Math.max(series.length - 1, 1))).toFixed(2)})`;\n /* Bars over periods stand in time order, the latest `limit` of them, as a\n bar chart's do; ranking them by total put Sep 10 over Aug 27 over Sep 14. */\n const timed = isPeriodRun([...bars.values()].map((bar) => bar.raw));\n const shown = timed\n ? [...bars.values()].sort((a, b) => (String(a.raw) < String(b.raw) ? -1 : 1)).slice(-limit)\n : [...bars.values()].sort((a, b) => b.total - a.total).slice(0, limit);\n const barLabel = (bar: { raw: unknown }, i: number) =>\n timed ? periodTick(String(bar.raw), i ? String(shown[i - 1].raw) : undefined) : label(bar.raw);\n const goal = target !== undefined && Number.isFinite(target) && target > 0 ? target : undefined;\n const scale = Math.max(...shown.map((bar) => bar.total), goal ?? 0);\n const share = (v: number) => `${((100 * v) / scale).toFixed(2)}%`;\n const sayTotal = sayLegend\n ? sayLegend([...series.map((s) => s.total), ...shown.map((bar) => bar.total), ...(goal === undefined ? [] : [goal])])\n : say;\n return (\n <div className=\"chart-stacked\">\n <ul className=\"chart-legend chart-stacked-legend\">\n {series.map((s, i) => (\n <li key={s.key}>\n <span className=\"chart-swatch\" style={{ ...ramp(i), background: color(i), opacity: opacity(i) }} />\n <span className=\"chart-legend-key\">{s.label}</span>\n <span className=\"chart-legend-value\">{sayTotal(s.total)}</span>\n </li>\n ))}\n {goal !== undefined && (\n <li className=\"chart-stacked-goal\">\n <span className=\"chart-target-swatch\" aria-hidden=\"true\" />\n <span className=\"chart-legend-key\">{sayCopy('targetLabel')}</span>\n <span className=\"chart-legend-value\">{sayTotal(goal)}</span>\n </li>\n )}\n </ul>\n <ul\n className=\"chart-stacked-rows\"\n aria-label={`${sayCopy('barsBySeries', { count: shown.length, series: series.map((s) => s.label).join(', ') })}${goal === undefined ? '' : sayCopy('targetAfter', { goal: say(goal) })}`}\n >\n {shown.map((bar, at) => {\n /* Each series in legend order, so a colour sits in the same place in every bar. */\n const parts = series\n .map((s, i) => ({\n s,\n i,\n value:\n s.key === '\u0000others'\n ? [...bar.parts.entries()]\n .filter(([key]) => slot(key) === series.length - 1 && !kept.some((k) => k.key === key))\n .reduce((n, [, v]) => n + v, 0)\n : (bar.parts.get(s.key) ?? 0),\n }))\n .filter((part) => part.value > 0);\n const words = (\n <>\n <span className=\"chart-stacked-label\">{barLabel(bar, at)}</span>\n <span className=\"chart-stacked-track\">\n <span className=\"chart-stacked-fill\" style={{ width: share(bar.total) }}>\n {parts.map(({ s, i, value }) => (\n <span\n key={s.key}\n className=\"chart-stacked-part\"\n title={`${s.label}: ${say(value)}`}\n style={{ ...ramp(i), flexGrow: value, background: color(i), opacity: opacity(i) }}\n />\n ))}\n </span>\n {goal !== undefined && <span className=\"chart-stacked-target\" style={{ left: share(goal) }} aria-hidden=\"true\" />}\n </span>\n <span className=\"chart-stacked-total\">{sayTotal(bar.total)}</span>\n <span className=\"visually-hidden\">{`: ${parts.map(({ s, value }) => `${s.label} ${say(value)}`).join(', ')}`}</span>\n </>\n );\n /* A bar that goes somewhere is a button; a null group, or no drill, stays text. */\n return (\n <li key={name(bar.raw)}>\n {onPick && bar.raw != null ? (\n <button type=\"button\" className=\"chart-stacked-row chart-stacked-drill\" onClick={() => onPick(bar.raw)}>\n {words}\n </button>\n ) : (\n <div className=\"chart-stacked-row\">{words}</div>\n )}\n </li>\n );\n })}\n </ul>\n </div>\n );\n}\n\n/**\n * A spark: the measure's shape inside a KPI card. No axes; the card's own\n * number is the label. It spans the card's width, stretched rather than\n * scaled, so a wide card draws a long trend instead of a 110px stub in its\n * corner; the stroke and the last point's dot keep their own size however\n * far it stretches (`non-scaling-stroke`, and the dot is a round cap on a\n * zero-length stroke). Under four points there is no shape to read, so\n * there is no spark.\n */\nexport function Sparkline({ rows, say = String }: { rows: ChartRow[]; say?: Say }) {\n const points = rows\n .map((r) => ({ key: r.key == null ? '' : String(r.key), value: Number(r.value) }))\n .filter((p) => Number.isFinite(p.value));\n if (points.length < 4) return null;\n const W = 100;\n const H = 28;\n const max = Math.max(...points.map((p) => p.value), 0);\n const min = Math.min(...points.map((p) => p.value), 0);\n const span = max - min || 1;\n const x = (i: number) => 1 + (i * (W - 2)) / (points.length - 1);\n const y = (v: number) => 3 + (1 - (v - min) / span) * (H - 6);\n const d = points.map((p, i) => `${i ? 'L' : 'M'}${f1(x(i))},${f1(y(p.value))}`).join(' ');\n const last = points[points.length - 1];\n return (\n <svg\n className=\"spark\"\n viewBox={`0 0 ${W} ${H}`}\n preserveAspectRatio=\"none\"\n role=\"img\"\n aria-label={`trend: ${points.map((p) => say(p.value)).join(', ')}`}\n >\n <title>{`${points[0].key} → ${last.key}`}</title>\n <path className=\"spark-area\" d={`${d} L${f1(x(points.length - 1))},${H} L${f1(x(0))},${H} Z`} />\n <path className=\"spark-stroke\" d={d} vectorEffect=\"non-scaling-stroke\" />\n <path className=\"spark-dot\" d={`M${f1(x(points.length - 1))},${f1(y(last.value))} h0`} vectorEffect=\"non-scaling-stroke\" />\n </svg>\n );\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"shared-DKEOMQ6l.js","names":["sayCopy","say","_Fragment"],"sources":["../../../kit/src/client/chart.js","../../../kit/src/client/copy/dashboards/components/Chart.ts","../../../kit/src/client/components/Chart.tsx"],"sourcesContent":["/**\n * The one chart rule that is not drawing: which periods a bucketed\n * breakdown left out. The charts themselves are components now\n * (`components/Chart.tsx`); this stays a plain function because it is a rule\n * about time, tested on its own, with no DOM in it.\n */\n\n/**\n * The periods a bucketed breakdown left out, put back at zero.\n *\n * The grammar answers only the buckets that have rows: a month with no\n * bookings is not a row, and a line drawn point-to-index through the rows\n * that came back walked straight across the gap — 2025-12 sat beside\n * 2026-03 at the same spacing as any neighbours, and the axis lied about\n * time. Period labels are spelled the same on every engine (`2026-08`,\n * `2026-Q3`, `2026-08-14`, `2026`), so the missing ones can be named and\n * counted as what they are: zero. Keys that are not periods pass through.\n */\nexport function fillGaps(points) {\n if (points.length < 2) return points;\n const first = periodStep(points[0].key);\n if (!first || points.some((p) => periodStep(p.key) !== first)) return points;\n const step = first === 'day' && weekly(points.map((p) => p.key)) ? 'week' : first;\n /* Time runs left to right whatever order the answer came in: a record\n page's chart is read ranked by its measure, and a walk from the first\n key to the last found nothing to walk when the first was the newest. */\n points = [...points].sort((a, b) => (a.key < b.key ? -1 : a.key > b.key ? 1 : 0));\n const byKey = new Map(points.map((p) => [p.key, p]));\n const out = [];\n let key = points[0].key;\n const last = points[points.length - 1].key;\n for (let guard = 0; guard < 2000 && key <= last; guard++) {\n out.push(byKey.get(key) ?? { key, value: 0 });\n key = nextPeriod(key, step);\n }\n return out.length >= points.length ? out : points;\n}\n\n/** Whether every key is a period of one step, so the keys can be put in time order. */\nexport function isPeriodRun(keys) {\n if (!keys.length) return false;\n const step = periodStep(String(keys[0]));\n return Boolean(step) && keys.every((key) => key != null && periodStep(String(key)) === step);\n}\n\n/* A week bucket is said by its first day (`2026-10-05`), so its keys are days that all fall on one weekday: the\n gaps between them are weeks, and a missing one is a week at zero, never six days between. */\nfunction weekly(keys) {\n const weekday = (key) => new Date(`${key}T00:00:00Z`).getUTCDay();\n return keys.length > 1 && keys.every((key) => weekday(key) === weekday(keys[0]));\n}\n\nfunction periodStep(key) {\n if (/^\\d{4}-\\d{2}-\\d{2}$/.test(key)) return 'day';\n if (/^\\d{4}-\\d{2}$/.test(key)) return 'month';\n if (/^\\d{4}-Q[1-4]$/.test(key)) return 'quarter';\n if (/^\\d{4}$/.test(key)) return 'year';\n return null;\n}\n\nfunction nextPeriod(key, step) {\n const pad = (n) => String(n).padStart(2, '0');\n if (step === 'day' || step === 'week') {\n const d = new Date(\n Date.UTC(Number(key.slice(0, 4)), Number(key.slice(5, 7)) - 1, Number(key.slice(8, 10)) + (step === 'week' ? 7 : 1)),\n );\n return `${d.getUTCFullYear()}-${pad(d.getUTCMonth() + 1)}-${pad(d.getUTCDate())}`;\n }\n if (step === 'month') {\n const y = Number(key.slice(0, 4));\n const m = Number(key.slice(5, 7));\n return m === 12 ? `${y + 1}-01` : `${y}-${pad(m + 1)}`;\n }\n if (step === 'quarter') {\n const y = Number(key.slice(0, 4));\n const q = Number(key.slice(6));\n return q === 4 ? `${y + 1}-Q1` : `${y}-Q${q + 1}`;\n }\n return String(Number(key) + 1);\n}\n","/** What Chart says, in the dashboards room (packages/kit/src/client/messages.ts says how the catalog is split). */\nimport { defineMessages } from '../../../messages.js';\n\nexport const say = defineMessages({\n notEnoughPointsToDraw: 'Not enough points to draw a line.',\n target: 'Target {goal}',\n nothingToDraw: 'Nothing to draw.',\n nothingToDivide: 'Nothing to divide.',\n inAll: '{whole} in all — {map}',\n nothingToStack: 'Nothing to stack.',\n others: 'others ({restCount})',\n targetLabel: 'Target',\n lineSummary: { one: '{count} point, from {from} to {to}; peak {peak}', other: '{count} points, from {from} to {to}; peak {peak}' },\n barsSummary: { one: '{count} bar; highest {highest}; {last} {value}', other: '{count} bars; highest {highest}; {last} {value}' },\n barsBySeries: '{count} bars by {series}',\n targetAfter: '; target {goal}',\n showSeries: 'Show',\n allSeries: 'All series',\n linesSummary: { one: '{count} line over {points} points: {names}', other: '{count} lines over {points} points: {names}' },\n});\n","/**\n * Charts for dashboards: a line for how a number moved, bars for how much\n * each group holds, a donut for how a whole divides, stacked bars for how each of several wholes divides, a\n * spark for the shape inside a KPI card. Hand-drawn SVG and HTML, not a\n * dependency. A target is a rule in the ink, said in words beside it.\n *\n * Colour comes from theme tokens: the line uses the accent and categorical\n * slices share their series token with the matching legend swatch. Without\n * preset tokens, the original single-accent, stepped-opacity treatment remains.\n * Values are spoken through the caller's `say` so money charts\n * read \"$4.6M\" everywhere the number appears.\n */\nimport { useLayoutEffect, useRef, useState } from 'react';\nimport { viewportBox } from '../core.js';\nimport { fillGaps, isPeriodRun } from '../chart.js';\nimport { formatDate, formatPercent } from '../locale.js';\nimport { niceScale } from '@mistriwork/engine/shared/niceTicks.js';\n/* The charts' own sheet travels with the chunk that draws them (onDemand). */\nimport './Chart.css';\nimport { say as sayCopy } from '../copy/dashboards/components/Chart.js';\n\ninterface ChartRow {\n key: unknown;\n value: unknown;\n}\n/** How a figure is said; its `tick`, where it has one, is how an axis says a round level (\"$2K\", not \"$2,000.00\"). */\ntype Say = ((v: unknown) => string) & { tick?: ((v: unknown) => string) & { steps?: readonly number[] } };\n/** An axis's words for a level: the sayer's axis form, else the sayer itself. */\nconst tickSay = (say: Say) => say.tick ?? say;\n\ninterface Point {\n key: string;\n value: number;\n /** The row's key as it came, where a point drills: a gap-filled bucket has none. */\n raw?: unknown;\n}\n\nconst f1 = (n: number) => n.toFixed(1);\n\nconst MONTH = /^(\\d{4})-(\\d{2})$/;\nconst DAY = /^(\\d{4})-\\d{2}-\\d{2}$/;\n\n/**\n * A month bucket as a reader says it, in the App's locale: \"Jan 2026\" where\n * the year starts or changes from the tick before it, \"Feb\" after it. The\n * grammar spells a month `2026-01` on every engine, which is a key, not a\n * word; any other key is said as it came.\n */\nexport function periodTick(key: string, previous?: string): string {\n /* A day is said as a month's is, \"Sep 10, 2026\" then \"Sep 11\": a stacked\n bar over days read \"2026-09-10\", a key where every other chart said a date. */\n const day = DAY.exec(key);\n if (day) {\n const year = !previous || DAY.exec(previous)?.[1] !== day[1];\n return formatDate(key, year ? { month: 'short', day: 'numeric', year: 'numeric' } : { month: 'short', day: 'numeric' });\n }\n const month = MONTH.exec(key);\n if (!month) return key;\n const year = !previous || MONTH.exec(previous)?.[1] !== month[1];\n return formatDate(`${key}-01`, year ? { month: 'short', year: 'numeric' } : { month: 'short' });\n}\n\n/**\n * Step `i` of `n` along one hue, for series over a scale (a priority, a\n * severity, an age in days): categorical hues said Medium and High in two\n * greens a reader could not tell apart, and said nothing of which came\n * first. The first step is the lead series deepened toward the ink, the last\n * the same hue washed toward the surface, mixed in OKLab so the steps are\n * even to the eye; by night the ink is light and the surface dark, so the\n * first step is still the one that stands out. Tokens only: an App's accent\n * and its dark pair carry through.\n */\nfunction rampInk(i: number, n: number): string {\n const lead = 'var(--chart-1, var(--accent))';\n if (n <= 1) return lead;\n const strong = Math.round(100 * (1 - Math.min(Math.max(i / (n - 1), 0), 1)));\n return `color-mix(in oklab, color-mix(in oklab, ${lead}, var(--ink) 30%) ${strong}%, color-mix(in oklab, ${lead}, var(--surface) 55%))`;\n}\n\n/** The width a tick's words take at the axis's 11px, budgeted generously: a label that overlaps its neighbour is worse than one left out. */\nconst tickWidth = (text: string) => text.length * 6.6 + 4;\n\n/**\n * Which points the x axis names, and what it calls each: as many as fit the\n * width, evenly spaced, the first and the last always among them. A month\n * says its year only where the year turns from the mark before it, and a\n * mark is budgeted at what it will actually say — \"Oct\", not \"Oct 2025\" — so\n * a month that has room is not dropped for a year it would not have shown.\n *\n * A mark is budgeted where it is drawn: a line's first and last words stand\n * inside the plot, starting and ending at their points; a bar's are centred\n * under their bars, as every other mark is (`centered`). Budgeting a bar's\n * as a line's took a whole word's width twice, and a half-width bar chart\n * named only its first and last month.\n */\nexport function axisMarks(keys: string[], at: (i: number) => number, { centered = false } = {}): Array<{ index: number; text: string }> {\n const last = keys.length - 1;\n const said = (marks: number[]) => marks.map((index, k) => ({ index, text: periodTick(keys[index], k ? keys[marks[k - 1]] : undefined) }));\n const extent = ({ index, text }: { index: number; text: string }): [number, number] => {\n const p = at(index),\n w = tickWidth(text);\n return !centered && index === 0 ? [p, p + w] : !centered && index === last ? [p - w, p] : [p - w / 2, p + w / 2];\n };\n /* The first pair of neighbours too close to read apart, or -1. */\n const clash = (marks: Array<{ index: number; text: string }>) =>\n marks.findIndex((mark, k) => k > 0 && extent(mark)[0] - extent(marks[k - 1])[1] < 12);\n for (let stride = 1; stride <= Math.max(1, last); stride += 1) {\n const marks: number[] = [];\n for (let i = 0; i < last; i += stride) marks.push(i);\n /* The last point is always named; the evenly spaced mark before it gives\n way when those two would meet — and only then: a clash further in is\n a stride too short, and the next one is tried. */\n marks.push(last);\n let named = said(marks);\n if (marks.length > 2 && clash(named) === marks.length - 1) {\n marks.splice(marks.length - 2, 1);\n named = said(marks);\n }\n if (clash(named) < 0) return named;\n }\n return said([last]);\n}\n\n/**\n * A path through points: straight segments, or with `smooth` a monotone cubic\n * (Fritsch–Carlson) — a curve that never overshoots its points, so a smooth\n * line still never says a value the data did not reach.\n */\nfunction linePath(pts: ReadonlyArray<readonly [number, number]>, smooth = false): string {\n if (!smooth || pts.length < 3) return pts.map(([px, py], i) => `${i ? 'L' : 'M'}${f1(px)},${f1(py)}`).join(' ');\n const n = pts.length;\n const dx = (i: number) => pts[i + 1][0] - pts[i][0];\n const slope = Array.from({ length: n - 1 }, (_, i) => (pts[i + 1][1] - pts[i][1]) / (dx(i) || 1));\n const m = pts.map((_, i) =>\n i === 0 ? slope[0] : i === n - 1 ? slope[n - 2] : slope[i - 1] * slope[i] <= 0 ? 0 : (slope[i - 1] + slope[i]) / 2,\n );\n for (let i = 0; i < n - 1; i++) {\n if (slope[i] === 0) {\n m[i] = 0;\n m[i + 1] = 0;\n continue;\n }\n const a = m[i] / slope[i],\n b = m[i + 1] / slope[i];\n const h = a * a + b * b;\n if (h > 9) {\n const t = 3 / Math.sqrt(h);\n m[i] = t * a * slope[i];\n m[i + 1] = t * b * slope[i];\n }\n }\n let d = `M${f1(pts[0][0])},${f1(pts[0][1])}`;\n for (let i = 0; i < n - 1; i++) {\n const third = dx(i) / 3;\n d += ` C${f1(pts[i][0] + third)},${f1(pts[i][1] + m[i] * third)} ${f1(pts[i + 1][0] - third)},${f1(pts[i + 1][1] - m[i + 1] * third)} ${f1(pts[i + 1][0])},${f1(pts[i + 1][1])}`;\n }\n return d;\n}\n\n/**\n * A time-series line: keys along the bottom, values as an accent line over\n * a soft fill, three labelled gridlines, and a crosshair on hover drawn in\n * the chart rather than left to a native tooltip.\n *\n * Its words are set at their own size wherever it is drawn: the chart\n * measures the width it is given (on the zoom-aware ruler) and draws a\n * viewBox exactly that wide, so a phone does not shrink an 11px label to 6.\n * `wide` is the first guess, before there is a box to measure. The levels\n * are said on the left, in a gutter of their own, where the line cannot\n * run through them. Every point is also a row of a table that assistive\n * technology reads, since a picture's titles are not.\n */\nexport function LineChart({\n rows,\n say = String,\n wide = 600,\n high,\n target,\n smooth = false,\n dots = false,\n seriesLabel = String,\n seriesVocabulary,\n onPick,\n}: {\n /** With `series` on its rows, a line per series (MultiLine). */\n rows: Array<ChartRow & { series?: unknown }>;\n say?: Say;\n wide?: number;\n high?: number;\n target?: number;\n /** A monotone curve through the points instead of straight segments. */\n smooth?: boolean;\n /** Too few filled buckets to draw a line through: the points stand alone, solid where the bucket holds something, and the shape stays a line. */\n dots?: boolean;\n seriesLabel?: (key: unknown) => string;\n /** The series column's vocabulary: its order, and each value's color, are the vocabulary's. */\n seriesVocabulary?: readonly string[];\n /** Where a point goes when it drills, by its raw key: single-series lines only — a multi-series line takes no\n drill, since one pick cannot name both a series and a point. */\n onPick?: ((value: unknown) => void) | null;\n}) {\n if (rows.some((row) => row.series !== undefined))\n return (\n <MultiLine\n rows={rows}\n say={say}\n wide={wide}\n high={high}\n target={target}\n smooth={smooth}\n seriesLabel={seriesLabel}\n vocabulary={seriesVocabulary}\n />\n );\n return <OneLine rows={rows} say={say} wide={wide} high={high} target={target} smooth={smooth} dots={dots} onPick={onPick} />;\n}\n\nfunction OneLine({\n rows,\n say,\n wide,\n high,\n target,\n smooth,\n dots,\n onPick,\n}: {\n rows: ChartRow[];\n say: Say;\n wide: number;\n high?: number;\n target?: number;\n smooth: boolean;\n dots: boolean;\n onPick?: ((value: unknown) => void) | null;\n}) {\n const points = fillGaps(\n rows\n .map((r) => ({ key: r.key == null ? '—' : String(r.key), value: Number(r.value), raw: r.key }))\n .filter((p) => Number.isFinite(p.value)),\n ) as Point[];\n const svg = useRef<SVGSVGElement>(null);\n const [near, setNear] = useState<number | null>(null);\n const [measured, setMeasured] = useState(0);\n /* Roving tabindex for drillable points: one tab stop for the whole\n line, not one per point. The tabbable point is the roved-to one, or\n the first drillable one where the roved-to one stopped drilling;\n arrows move among drillable points only, Home and End take the\n first and last. */\n const drillableAt = points.map((p, i) => (onPick && p.raw != null ? i : -1)).filter((i) => i >= 0);\n const [roved, setRoved] = useState<number | null>(null);\n const tabbable = roved !== null && drillableAt.includes(roved) ? roved : drillableAt[0];\n const moveRoving = (at: number) => {\n setRoved(at);\n const el = svg.current?.querySelectorAll('.chart-point-drill')[drillableAt.indexOf(at)];\n (el as HTMLElement | undefined)?.focus?.();\n };\n /* Alone, a point has no line to join it to and no neighbour to space against: a dotted line draws even one. */\n const drawn = points.length >= 2 || (dots && points.length === 1);\n useLayoutEffect(() => {\n const element = svg.current?.parentElement;\n if (!element || typeof ResizeObserver === 'undefined') return;\n const measure = () => setMeasured(Math.max(0, Math.round(viewportBox(element).width)));\n measure();\n const observer = new ResizeObserver(measure);\n observer.observe(element);\n return () => observer.disconnect();\n }, [drawn]);\n if (!drawn) return <p className=\"note\">{sayCopy('notEnoughPointsToDraw')}</p>;\n\n /* The viewBox is the width the chart is drawn at, so text and strokes\n land at their own size. The height is the author's when given;\n otherwise, page-wide, a quarter of the width, capped: at a third a page-wide line stood in 220px of plot,\n most of it white over the line. */\n const W = measured > 0 ? measured : wide;\n /* Half a page wide (a pair, Dashboard.tsx) it keeps the third its neighbour has, so the two plots of a row\n stand the same height rather than one short over white. */\n const H = high\n ? Math.max(120, Math.round(high))\n : Math.max(120, W < 760 ? Math.min(Math.round(W / 3), 220) : Math.min(Math.round(W / 4), 180));\n /* A target is kept in view: a line far under its goal still shows the goal. */\n const goal = target !== undefined && Number.isFinite(target) ? target : undefined;\n const max = Math.max(...points.map((p) => p.value), 0, goal ?? 0);\n const min = Math.min(...points.map((p) => p.value), 0, goal ?? 0);\n const scale = niceScale(min, max, 2, say.tick?.steps);\n const levels = scale.levels;\n const span = scale.max - scale.min || 1;\n const gutter = Math.max(...levels.map((v) => tickWidth(tickSay(say)(v)))) + 6;\n const PAD = { top: 14, right: 14, bottom: 24, left: gutter };\n const x = (i: number) =>\n PAD.left + (points.length > 1 ? (i * (W - PAD.left - PAD.right)) / (points.length - 1) : (W - PAD.left - PAD.right) / 2);\n const y = (v: number) => PAD.top + (1 - (v - scale.min) / span) * (H - PAD.top - PAD.bottom);\n const line = linePath(\n points.map((p, i) => [x(i), y(p.value)] as const),\n smooth,\n );\n const area = `${line} L${f1(x(points.length - 1))},${f1(y(scale.min))} L${f1(x(0))},${f1(y(scale.min))} Z`;\n\n /* A point is named with its year wherever it stands alone — a dot's\n title, the crosshair, the table — and the axis drops the year a tick\n shares with the one before it. */\n const named = points.map((p) => periodTick(p.key));\n const marks = axisMarks(\n points.map((p) => p.key),\n x,\n );\n\n const onMove = (e: React.PointerEvent<SVGSVGElement>) => {\n // screen-px: clientX is a screen-pixel ruler too; the ratio maps it into viewBox units.\n const box = svg.current!.getBoundingClientRect();\n const px = ((e.clientX - box.left) / box.width) * W;\n let best = 0;\n for (let i = 1; i < points.length; i++) if (Math.abs(x(i) - px) < Math.abs(x(best) - px)) best = i;\n setNear(best);\n };\n const cx = near === null ? 0 : x(near);\n const cy = near === null ? 0 : y(points[near].value);\n const right = cx > W * 0.7;\n /* A picture must not hold buttons: where any point drills, the figure\n is a group holding buttons, not an image — axe's nested-interactive\n fails a button inside role=\"img\", as a donut's does. Where nothing\n drills it stays an image, as before. */\n const anyDrillable = onPick && points.some((p) => p.raw != null);\n return (\n <>\n <svg\n ref={svg}\n className=\"chart-line\"\n viewBox={`0 0 ${W} ${H}`}\n role={anyDrillable ? 'group' : 'img'}\n aria-label={`${sayCopy('lineSummary', { count: points.length, from: say(points[0].value), to: say(points[points.length - 1].value), peak: say(Math.max(...points.map((p) => p.value))) })}${goal === undefined ? '' : sayCopy('targetAfter', { goal: say(goal) })}`}\n onPointerMove={onMove}\n onPointerLeave={() => setNear(null)}\n >\n {levels.map((v) => (\n <line key={`g${v}`} className=\"chart-grid\" x1={PAD.left} x2={W - PAD.right} y1={f1(y(v))} y2={f1(y(v))} />\n ))}\n {levels.map((v) => (\n <text key={`t${v}`} className=\"chart-tick chart-y-tick\" x={f1(PAD.left - 6)} y={f1(y(v) + 4)} textAnchor=\"end\">\n {tickSay(say)(v)}\n </text>\n ))}\n {goal !== undefined && (\n <g className=\"chart-target\">\n <line className=\"chart-target-line\" x1={PAD.left} x2={W - PAD.right} y1={f1(y(goal))} y2={f1(y(goal))} />\n <text className=\"chart-target-label\" x={PAD.left + 4} y={f1(y(goal) - 4)}>\n {sayCopy('target', { goal: say(goal) })}\n </text>\n </g>\n )}\n {!dots && <path className=\"chart-area\" d={area} />}\n {!dots && <path className=\"chart-stroke\" d={line} />}\n {points.map((p, i) => {\n const dot = (\n <circle\n className={dots && p.value !== 0 ? 'chart-dot chart-dot-solid' : 'chart-dot'}\n cx={f1(x(i))}\n cy={f1(y(p.value))}\n r={dots ? 4 : 3}\n >\n <title>{`${named[i]}: ${say(p.value)}`}</title>\n </circle>\n );\n /* A point drills where a door is wanted: the same raw value a\n legend button would carry. A dot is too small a target to be\n the button itself, so a drillable point is a group holding the\n dot and a wider transparent hit disc — one tab stop, not two,\n and roving tabindex keeps the whole line to that one stop.\n Gap-filled buckets hold no raw key and are no door, as a\n donut's \"others\" slice is none. */\n const drillable = onPick && p.raw != null;\n if (!drillable) return <g key={i}>{dot}</g>;\n return (\n <g\n key={i}\n className=\"chart-point-drill\"\n role=\"button\"\n tabIndex={i === tabbable ? 0 : -1}\n aria-label={`${named[i]}: ${say(p.value)}`}\n onClick={() => onPick!(p.raw)}\n onKeyDown={(event: React.KeyboardEvent) => {\n if (event.key === 'Enter' || event.key === ' ') {\n event.preventDefault();\n onPick!(p.raw);\n } else if (event.key === 'ArrowRight') {\n const at = drillableAt[drillableAt.indexOf(i) + 1];\n if (at !== undefined) {\n event.preventDefault();\n moveRoving(at);\n }\n } else if (event.key === 'ArrowLeft') {\n const at = drillableAt[drillableAt.indexOf(i) - 1];\n if (at !== undefined) {\n event.preventDefault();\n moveRoving(at);\n }\n } else if (event.key === 'Home') {\n const at = drillableAt[0];\n if (at !== undefined) {\n event.preventDefault();\n moveRoving(at);\n }\n } else if (event.key === 'End') {\n const at = drillableAt[drillableAt.length - 1];\n if (at !== undefined) {\n event.preventDefault();\n moveRoving(at);\n }\n }\n }}\n >\n <circle className=\"chart-point-hit\" cx={f1(x(i))} cy={f1(y(p.value))} r={12} />\n {dot}\n </g>\n );\n })}\n {marks.map(({ index, text }) => (\n <text\n key={`m${index}`}\n className=\"chart-tick chart-x-tick\"\n x={f1(x(index))}\n y={H - 6}\n textAnchor={points.length > 1 && index === 0 ? 'start' : points.length > 1 && index === points.length - 1 ? 'end' : 'middle'}\n >\n {text}\n </text>\n ))}\n <g className=\"chart-cursor\" {...(near === null ? { hidden: true } : {})}>\n <line className=\"chart-cursor-line\" x1={f1(cx)} x2={f1(cx)} y1={PAD.top} y2={H - PAD.bottom} />\n <circle className=\"chart-cursor-dot\" cx={f1(cx)} cy={f1(cy)} r={4} />\n <text\n className=\"chart-cursor-text\"\n x={f1(right ? cx - 8 : cx + 8)}\n y={f1(Math.max(PAD.top + 10, cy - 10))}\n textAnchor={right ? 'end' : 'start'}\n >\n {near === null ? '' : `${named[near]} · ${say(points[near].value)}`}\n </text>\n </g>\n </svg>\n {/* The hider is a block round the table, not the table itself: a table is\n never shorter than its rows, so a hidden one of 700 days stood 16,000px\n tall and the pane scrolled into blank space under the dashboard. */}\n <div className=\"visually-hidden\">\n <table className=\"chart-data\">\n <tbody>\n {points.map((p, i) => (\n <tr key={i}>\n <th scope=\"row\">{named[i]}</th>\n <td>{say(p.value)}</td>\n </tr>\n ))}\n </tbody>\n </table>\n </div>\n </>\n );\n}\n\n/* A line chart's series past this many are gathered into one \"others\" line: more lines than that tangle. */\nconst MAX_LINES = 5;\n/* Up to this many lines are named at their ends; more names than that stack into a column of their own. */\nconst DIRECT_LINES = 3;\n/* Two names closer than a line of small text overlap: each is pushed apart from its neighbor, then the column is\n kept inside the plot. Returned in the order the ends were given. */\nexport function namesAtEnds(ends: readonly number[], top: number, bottom: number, gap = 14): number[] {\n const order = ends.map((at, i) => ({ at, i })).sort((a, b) => a.at - b.at);\n for (let k = 1; k < order.length; k++) order[k].at = Math.max(order[k].at, order[k - 1].at + gap);\n const over = order.length ? order[order.length - 1].at - bottom : 0;\n if (over > 0) for (const o of order) o.at -= over;\n for (let k = 0; k < order.length; k++) order[k].at = Math.max(order[k].at, top + k * gap);\n const out: number[] = [];\n for (const o of order) out[o.i] = o.at;\n return out;\n}\n\n/**\n * Several lines over one time axis, a series each: the line of a two-key\n * breakdown (\"month created_at, channel\"). Each series keeps one theme token\n * on its line, its legend dot and the hover card; the legend's picker shows\n * every line or one alone. On hover a card lists every shown series at the\n * point, so two lines are compared without chasing two tooltips.\n */\nfunction MultiLine({\n rows,\n say,\n wide,\n high,\n target,\n smooth,\n seriesLabel,\n vocabulary,\n}: {\n rows: Array<ChartRow & { series?: unknown }>;\n say: Say;\n wide: number;\n high?: number;\n target?: number;\n smooth: boolean;\n seriesLabel: (key: unknown) => string;\n vocabulary?: readonly string[];\n}) {\n const svg = useRef<SVGSVGElement>(null);\n const [near, setNear] = useState<number | null>(null);\n const [measured, setMeasured] = useState(0);\n const [only, setOnly] = useState<string>('');\n const keys = [...new Set(rows.map((r) => (r.key == null ? '—' : String(r.key))))];\n if (keys.every((key) => PERIOD.test(key))) keys.sort();\n const totals = new Map<string, number>();\n const named = new Map<string, unknown>();\n for (const r of rows) {\n const id = r.series == null ? '—' : String(r.series);\n named.set(id, r.series);\n totals.set(id, (totals.get(id) ?? 0) + (Number(r.value) || 0));\n }\n const ranked = [...totals.keys()].sort((a, b) => totals.get(b)! - totals.get(a)!);\n const kept = ranked.length > MAX_LINES ? ranked.slice(0, MAX_LINES - 1) : ranked;\n /* A vocabulary's values go in its order and keep its colors, so a source is the same color here as in a donut of\n the same column; the largest still decide which lines are kept. */\n const place = (id: string) => vocabulary?.indexOf(id) ?? -1;\n if (vocabulary && kept.every((id) => place(id) >= 0)) kept.sort((a, b) => place(a) - place(b));\n const OTHERS = '\\u0000others';\n const series = [...kept, ...(ranked.length > kept.length ? [OTHERS] : [])].map((id, i) => {\n const slot = place(id) >= 0 && place(id) < 8 ? place(id) : i;\n const values = keys.map(() => 0);\n for (const r of rows) {\n const own = r.series == null ? '—' : String(r.series);\n const lane = kept.includes(own) ? own : OTHERS;\n if (lane !== id) continue;\n const v = Number(r.value);\n if (Number.isFinite(v)) values[keys.indexOf(r.key == null ? '—' : String(r.key))] += v;\n }\n return {\n id,\n label: id === OTHERS ? sayCopy('others', { restCount: ranked.length - kept.length }) : seriesLabel(named.get(id)),\n color: `var(--chart-${slot + 1}, var(--accent))`,\n values,\n };\n });\n const shown = only && series.some((line) => line.id === only) ? series.filter((line) => line.id === only) : series;\n const drawn = keys.length >= 2;\n useLayoutEffect(() => {\n const element = svg.current?.parentElement;\n if (!element || typeof ResizeObserver === 'undefined') return;\n const measure = () => setMeasured(Math.max(0, Math.round(viewportBox(element).width)));\n measure();\n const observer = new ResizeObserver(measure);\n observer.observe(element);\n return () => observer.disconnect();\n }, [drawn]);\n if (!drawn) return <p className=\"note\">{sayCopy('notEnoughPointsToDraw')}</p>;\n const W = measured > 0 ? measured : wide;\n const H = high ? Math.max(120, Math.round(high)) : Math.max(120, Math.min(Math.round(W / 3), 220));\n const goal = target !== undefined && Number.isFinite(target) ? target : undefined;\n const all = shown.flatMap((line) => line.values);\n const max = Math.max(...all, 0, goal ?? 0);\n const min = Math.min(...all, 0, goal ?? 0);\n const scale = niceScale(min, max, 2, say.tick?.steps);\n const levels = scale.levels;\n const span = scale.max - scale.min || 1;\n const gutter = Math.max(...levels.map((v) => tickWidth(tickSay(say)(v)))) + 6;\n /* A few lines are named where they end, not in a key above them: the eye follows a line to its name instead of\n matching a color back to a list. Past three, or where the names would take more than a quarter of the width, the\n legend says them. */\n const nameRoom = Math.max(...shown.map((line) => tickWidth(line.label))) + 8;\n const direct = shown.length <= DIRECT_LINES && nameRoom <= W / 4;\n const PAD = { top: 14, right: direct ? nameRoom : 14, bottom: 24, left: gutter };\n const x = (i: number) => PAD.left + (i * (W - PAD.left - PAD.right)) / (keys.length - 1);\n const y = (v: number) => PAD.top + (1 - (v - scale.min) / span) * (H - PAD.top - PAD.bottom);\n const ends = direct\n ? namesAtEnds(\n shown.map((line) => y(line.values[line.values.length - 1])),\n PAD.top,\n H - PAD.bottom,\n )\n : [];\n const ticks = keys.map((key) => periodTick(key));\n const marks = axisMarks(keys, x);\n const onMove = (e: React.PointerEvent<SVGSVGElement>) => {\n // screen-px: clientX is a screen-pixel ruler too; the ratio maps it into viewBox units.\n const box = svg.current!.getBoundingClientRect();\n const px = ((e.clientX - box.left) / box.width) * W;\n let best = 0;\n for (let i = 1; i < keys.length; i++) if (Math.abs(x(i) - px) < Math.abs(x(best) - px)) best = i;\n setNear(best);\n };\n const cx = near === null ? 0 : x(near);\n const right = cx > W * 0.6;\n return (\n <div className=\"chart-multi\">\n <div className=\"chart-multi-head\">\n <ul className=\"chart-legend chart-multi-legend\" {...(direct ? { hidden: true } : {})}>\n {shown.map((line) => (\n <li key={line.id}>\n <span className=\"chart-dot-key\" style={{ background: line.color }} />\n <span className=\"chart-legend-key\">{line.label}</span>\n </li>\n ))}\n </ul>\n <select\n className=\"chart-series-pick\"\n aria-label={sayCopy('showSeries')}\n value={only}\n onChange={(event) => setOnly(event.target.value)}\n >\n <option value=\"\">{sayCopy('allSeries')}</option>\n {series.map((line) => (\n <option key={line.id} value={line.id}>\n {line.label}\n </option>\n ))}\n </select>\n </div>\n <div className=\"chart-multi-plot\">\n <svg\n ref={svg}\n className=\"chart-line\"\n viewBox={`0 0 ${W} ${H}`}\n role=\"img\"\n aria-label={sayCopy('linesSummary', {\n count: shown.length,\n points: keys.length,\n names: shown.map((line) => line.label).join(', '),\n })}\n onPointerMove={onMove}\n onPointerLeave={() => setNear(null)}\n >\n {levels.map((v) => (\n <line key={`g${v}`} className=\"chart-grid\" x1={PAD.left} x2={W - PAD.right} y1={f1(y(v))} y2={f1(y(v))} />\n ))}\n {levels.map((v) => (\n <text key={`t${v}`} className=\"chart-tick chart-y-tick\" x={f1(PAD.left - 6)} y={f1(y(v) + 4)} textAnchor=\"end\">\n {tickSay(say)(v)}\n </text>\n ))}\n {goal !== undefined && (\n <g className=\"chart-target\">\n <line className=\"chart-target-line\" x1={PAD.left} x2={W - PAD.right} y1={f1(y(goal))} y2={f1(y(goal))} />\n <text className=\"chart-target-label\" x={PAD.left + 4} y={f1(y(goal) - 4)}>\n {sayCopy('target', { goal: say(goal) })}\n </text>\n </g>\n )}\n {shown.map((line) => (\n <path\n key={line.id}\n className=\"chart-stroke chart-series-stroke\"\n style={{ stroke: line.color }}\n d={linePath(\n line.values.map((v, i) => [x(i), y(v)] as const),\n smooth,\n )}\n />\n ))}\n {direct &&\n shown.map((line, i) => {\n const last = line.values.length - 1;\n return (\n <g key={`n${line.id}`} className=\"chart-end\">\n <circle className=\"chart-end-dot\" style={{ fill: line.color }} cx={f1(x(last))} cy={f1(y(line.values[last]))} r={3} />\n <text className=\"chart-end-name\" x={f1(W - PAD.right + 8)} y={f1(ends[i] + 4)}>\n {line.label}\n </text>\n </g>\n );\n })}\n {marks.map(({ index, text }) => (\n <text\n key={`m${index}`}\n className=\"chart-tick chart-x-tick\"\n x={f1(x(index))}\n y={H - 6}\n textAnchor={index === 0 ? 'start' : index === keys.length - 1 ? 'end' : 'middle'}\n >\n {text}\n </text>\n ))}\n <g className=\"chart-cursor\" {...(near === null ? { hidden: true } : {})}>\n <line className=\"chart-cursor-line\" x1={f1(cx)} x2={f1(cx)} y1={PAD.top} y2={H - PAD.bottom} />\n {near !== null &&\n shown.map((line) => (\n <circle\n key={line.id}\n className=\"chart-cursor-dot\"\n style={{ fill: line.color }}\n cx={f1(cx)}\n cy={f1(y(line.values[near]))}\n r={4}\n />\n ))}\n </g>\n </svg>\n {near !== null && (\n /* The card stands beside the cursor, on the side with room, at a fixed top: it never moves the page. */\n <div\n className=\"chart-tip-card\"\n aria-hidden=\"true\"\n style={right ? { right: `${((W - cx) / W) * 100}%`, marginRight: 10 } : { left: `${(cx / W) * 100}%`, marginLeft: 10 }}\n >\n <div className=\"chart-tip-title\">{ticks[near]}</div>\n {shown.map((line) => (\n <div key={line.id} className=\"chart-tip-row\">\n <span className=\"chart-dot-key\" style={{ background: line.color }} />\n <span className=\"chart-tip-name\">{line.label}</span>\n <span className=\"chart-tip-value\">{say(line.values[near])}</span>\n </div>\n ))}\n </div>\n )}\n </div>\n <div className=\"visually-hidden\">\n <table className=\"chart-data\">\n <thead>\n <tr>\n <td />\n {shown.map((line) => (\n <th key={line.id} scope=\"col\">\n {line.label}\n </th>\n ))}\n </tr>\n </thead>\n <tbody>\n {keys.map((key, i) => (\n <tr key={key}>\n <th scope=\"row\">{ticks[i]}</th>\n {shown.map((line) => (\n <td key={line.id}>{say(line.values[i])}</td>\n ))}\n </tr>\n ))}\n </tbody>\n </table>\n </div>\n </div>\n );\n}\n\n/** Whether a key is a period the grammar buckets by (\"2026-08\", \"2026-Q3\"). */\nconst PERIOD = /^\\d{4}(-\\d{2}(-\\d{2})?|-Q[1-4])?$/;\n\n/**\n * Bars: one series, a bar per group — how much each week or each stage\n * holds, where a line says how a number moved. Over calendar buckets one bar\n * is the current one, drawn in the ink while the rest stay quiet: the last\n * (the period in hand) until the pointer names another. Its value is said in\n * a pill over it, and a guide runs from it across the levels, so the reader\n * can read it off the scale without a tooltip's delay; there the pill is\n * information, not a hover effect, so it is always there. Over categories (a\n * stage, a source) no bar is the one in hand — the last is only last in the\n * vocabulary — so at rest none is inked, with no pill and no guide, until the\n * pointer names one. Nothing moves (motion rule 8).\n *\n * Periods keep their order and gain their missing buckets at zero, as a\n * line's do; categories go in their vocabulary's order, else biggest first.\n * The levels are on the left, in a gutter of their own, and every bar is a\n * row of a table assistive technology reads, as a line's points are.\n */\nexport function BarChart({\n rows,\n say = String,\n label = String,\n wide = 600,\n high,\n target,\n tone,\n}: {\n rows: ChartRow[];\n say?: Say;\n label?: (key: unknown) => string;\n wide?: number;\n high?: number;\n target?: number;\n /** A category's display tone (a state's, a status's), where its column has them: each bar wears the ink its dot and badge wear. */\n tone?: (key: unknown) => string | undefined;\n}) {\n const periods = rows.length > 0 && rows.every((r) => r.key != null && PERIOD.test(String(r.key)));\n const bars = periods\n ? (fillGaps(rows.map((r) => ({ key: String(r.key), value: Number(r.value) })).filter((p) => Number.isFinite(p.value))) as Point[]).map(\n (p) => ({ raw: p.key as unknown, value: p.value }),\n )\n : rows.map((r) => ({ raw: r.key, value: Number(r.value) })).filter((p) => Number.isFinite(p.value));\n const svg = useRef<SVGSVGElement>(null);\n const [near, setNear] = useState<number | null>(null);\n const [measured, setMeasured] = useState(0);\n useLayoutEffect(() => {\n const element = svg.current?.parentElement;\n if (!element || typeof ResizeObserver === 'undefined') return;\n const measure = () => setMeasured(Math.max(0, Math.round(viewportBox(element).width)));\n measure();\n const observer = new ResizeObserver(measure);\n observer.observe(element);\n return () => observer.disconnect();\n }, [bars.length > 0]); // eslint-disable-line react-hooks/exhaustive-deps\n if (!bars.length) return <p className=\"note\">{sayCopy('nothingToDraw')}</p>;\n\n /* States are bars of the meaning they carry: where every category has a tone, each wears it (the same ink the status\n dot and badge draw), shared or not, since the axis names every bar. Periods and untoned columns keep the look's hue. */\n const inks = periods || !tone ? undefined : bars.map((b) => TONE_INK[tone(b.raw) ?? '']);\n const toned = !!inks && inks.every(Boolean);\n const named = bars.map((b, i) => (periods ? periodTick(String(b.raw), i ? String(bars[i - 1].raw) : undefined) : label(b.raw)));\n const whole = bars.map((b) => (periods ? periodTick(String(b.raw)) : label(b.raw)));\n const W = measured > 0 ? measured : wide;\n const H = high ? Math.max(120, Math.round(high)) : Math.max(160, Math.min(Math.round(W / 3), 240));\n const goal = target !== undefined && Number.isFinite(target) ? target : undefined;\n const max = Math.max(...bars.map((b) => b.value), 0, goal ?? 0);\n const min = Math.min(...bars.map((b) => b.value), 0);\n const scale = niceScale(min, max, 2, say.tick?.steps);\n const levels = scale.levels;\n const span = scale.max - scale.min || 1;\n const gutter = Math.max(...levels.map((v) => tickWidth(tickSay(say)(v)))) + 6;\n /* Room over the tallest bar for the pill that names it. */\n const PAD = { top: 30, right: 6, bottom: 24, left: gutter };\n const band = (W - PAD.left - PAD.right) / bars.length;\n const barWide = Math.max(2, Math.min(56, band * 0.64));\n const x = (i: number) => PAD.left + band * i + (band - barWide) / 2;\n const mid = (i: number) => PAD.left + band * (i + 0.5);\n const y = (v: number) => PAD.top + (1 - (v - scale.min) / span) * (H - PAD.top - PAD.bottom);\n const base = y(Math.max(scale.min, 0));\n const marks = axisMarks(\n named.map((text, i) => (periods ? String(bars[i].raw) : text)),\n mid,\n { centered: true },\n );\n /* A mark is centred under its bar, and kept inside the figure at either end. */\n const markAt = (index: number, text: string) => Math.min(Math.max(mid(index), tickWidth(text) / 2), W - tickWidth(text) / 2);\n const active: number | null = near ?? (periods ? bars.length - 1 : null);\n const tip = active === null ? '' : `${whole[active]} · ${say(bars[active].value)}`;\n const tipWide = tickWidth(tip) + 12;\n const tipLeft = active === null ? 0 : Math.min(Math.max(mid(active) - tipWide / 2, PAD.left), W - PAD.right - tipWide);\n const top = active === null ? 0 : y(Math.max(bars[active].value, 0));\n const tipTop = Math.max(2, top - 26);\n const at = (e: React.PointerEvent<SVGSVGElement>) => {\n // screen-px: clientX is a screen-pixel ruler too; the ratio maps it into viewBox units.\n const box = svg.current!.getBoundingClientRect();\n if (!box.width) return bars.length - 1;\n const px = ((e.clientX - box.left) / box.width) * W;\n return Math.min(bars.length - 1, Math.max(0, Math.floor((px - PAD.left) / band)));\n };\n return (\n <>\n <svg\n ref={svg}\n className=\"chart-bars\"\n viewBox={`0 0 ${W} ${H}`}\n role=\"img\"\n aria-label={`${sayCopy('barsSummary', { count: bars.length, highest: say(Math.max(...bars.map((b) => b.value))), last: whole[bars.length - 1], value: say(bars[bars.length - 1].value) })}${goal === undefined ? '' : sayCopy('targetAfter', { goal: say(goal) })}`}\n onPointerMove={(e) => setNear(at(e))}\n onPointerLeave={() => setNear(null)}\n >\n {levels.map((v) => (\n <line key={`g${v}`} className=\"chart-grid\" x1={PAD.left} x2={W - PAD.right} y1={f1(y(v))} y2={f1(y(v))} />\n ))}\n {levels.map((v) => (\n <text key={`t${v}`} className=\"chart-tick chart-y-tick\" x={f1(PAD.left - 6)} y={f1(y(v) + 4)} textAnchor=\"end\">\n {tickSay(say)(v)}\n </text>\n ))}\n {active !== null && <line className=\"chart-bar-guide\" x1={PAD.left} x2={W - PAD.right} y1={f1(top)} y2={f1(top)} />}\n {bars.map((b, i) => {\n const h = Math.abs(y(b.value) - base);\n return (\n <rect\n key={i}\n className={`chart-bar${toned ? ' is-toned' : ''}${i === active ? ' is-active' : ''}`}\n style={toned ? { ['--bar-ink' as string]: inks![i] } : undefined}\n x={f1(x(i))}\n y={f1(Math.min(y(b.value), base))}\n width={f1(barWide)}\n height={f1(Math.max(h, b.value ? 1 : 0))}\n >\n <title>{`${whole[i]}: ${say(b.value)}`}</title>\n </rect>\n );\n })}\n {goal !== undefined && (\n <g className=\"chart-target\">\n <line className=\"chart-target-line\" x1={PAD.left} x2={W - PAD.right} y1={f1(y(goal))} y2={f1(y(goal))} />\n <text className=\"chart-target-label\" x={PAD.left + 4} y={f1(y(goal) - 4)}>\n {sayCopy('target', { goal: say(goal) })}\n </text>\n </g>\n )}\n {marks.map(({ index, text }) => (\n <text\n key={`m${index}`}\n className={`chart-tick chart-x-tick${index === active ? ' is-active' : ''}`}\n x={f1(markAt(index, periods ? text : named[index]))}\n y={H - 6}\n textAnchor=\"middle\"\n >\n {periods ? text : named[index]}\n </text>\n ))}\n {active !== null && (\n <g className=\"chart-bar-tip\" aria-hidden=\"true\">\n <rect x={f1(tipLeft)} y={f1(tipTop)} width={f1(tipWide)} height={20} />\n <text x={f1(tipLeft + tipWide / 2)} y={f1(tipTop + 14)} textAnchor=\"middle\">\n {tip}\n </text>\n </g>\n )}\n </svg>\n {/* The hider is a block round the table, not the table itself: a table is\n never shorter than its rows, so a hidden one of 700 days stood 16,000px\n tall and the pane scrolled into blank space under the dashboard. */}\n <div className=\"visually-hidden\">\n <table className=\"chart-data\">\n <tbody>\n {bars.map((b, i) => (\n <tr key={i}>\n <th scope=\"row\">{whole[i]}</th>\n <td>{say(b.value)}</td>\n </tr>\n ))}\n </tbody>\n </table>\n </div>\n </>\n );\n}\n\n/**\n * Stacked columns: a column per period, divided by series — how much each day\n * held and what it was made of. The bars' grammar (Bars, above): levels on the\n * left in their own gutter, periods along the bottom with their empty buckets\n * at zero, and one current column whose total and parts are said in a pill\n * over it, with a guide across the levels; the last until the pointer names\n * another. While the pointer is over the chart the pill rides with it, just\n * above it, so it never sits over the column being read. Each series keeps one theme token in every column and in the\n * legend, which says each series' total. Every column is also a row of a\n * table assistive technology reads. Nothing moves (motion rule 8).\n */\nexport function StackedColumns({\n rows,\n series,\n say = String,\n wide = 600,\n high,\n}: {\n rows: Array<{ key: string; values: Record<string, number> }>;\n series: Array<{ key: string; label: string }>;\n say?: Say;\n wide?: number;\n high?: number;\n}) {\n const columns = rows\n .map((r) => ({ key: r.key, parts: series.map((s) => Math.max(0, Number(r.values[s.key]) || 0)) }))\n .map((c) => ({ ...c, total: c.parts.reduce((n, v) => n + v, 0) }));\n const svg = useRef<SVGSVGElement>(null);\n const [near, setNear] = useState<number | null>(null);\n const [pointer, setPointer] = useState<{ x: number; y: number } | null>(null);\n const [measured, setMeasured] = useState(0);\n useLayoutEffect(() => {\n const element = svg.current?.parentElement;\n if (!element || typeof ResizeObserver === 'undefined') return;\n const measure = () => setMeasured(Math.max(0, Math.round(viewportBox(element).width)));\n measure();\n const observer = new ResizeObserver(measure);\n observer.observe(element);\n return () => observer.disconnect();\n }, [columns.length > 0]); // eslint-disable-line react-hooks/exhaustive-deps\n if (!columns.length) return <p className=\"note\">{sayCopy('nothingToDraw')}</p>;\n const periods = columns.every((c) => PERIOD.test(c.key));\n const named = columns.map((c) => (periods ? periodTick(c.key) : c.key));\n const W = measured > 0 ? measured : wide;\n const H = high ? Math.max(120, Math.round(high)) : Math.max(160, Math.min(Math.round(W / 3.5), 220));\n const max = Math.max(...columns.map((c) => c.total), 1);\n const scale = niceScale(0, max, 2, say.tick?.steps);\n const levels = scale.levels;\n const gutter = Math.max(...levels.map((v) => tickWidth(tickSay(say)(v)))) + 6;\n const PAD = { top: 30, right: 6, bottom: 24, left: gutter };\n const band = (W - PAD.left - PAD.right) / columns.length;\n const colWide = Math.max(2, Math.min(40, band * 0.64));\n const x = (i: number) => PAD.left + band * i + (band - colWide) / 2;\n const mid = (i: number) => PAD.left + band * (i + 0.5);\n const y = (v: number) => PAD.top + (1 - v / scale.max) * (H - PAD.top - PAD.bottom);\n const marks = periods\n ? axisMarks(\n columns.map((c) => c.key),\n mid,\n { centered: true },\n )\n : columns.map((c, index) => ({ index, text: c.key }));\n const markAt = (index: number, text: string) => Math.min(Math.max(mid(index), tickWidth(text) / 2), W - tickWidth(text) / 2);\n const active = near ?? columns.length - 1;\n const parts = (i: number) => series.map((s, k) => `${s.label} ${say(columns[i].parts[k])}`).join(' · ');\n const tip = `${named[active]} · ${parts(active)}`;\n const tipWide = tickWidth(tip) + 12;\n const tipLeft = Math.min(Math.max((pointer?.x ?? mid(active)) - tipWide / 2, PAD.left), W - PAD.right - tipWide);\n const top = y(columns[active].total);\n const tipTop = pointer ? Math.min(Math.max(2, pointer.y - 30), H - PAD.bottom - 22) : Math.max(2, top - 26);\n const color = (k: number) => `var(--chart-${k + 1}, var(--accent))`;\n const at = (e: React.PointerEvent<SVGSVGElement>) => {\n // screen-px: clientX is a screen-pixel ruler too; the ratio maps it into viewBox units.\n const box = svg.current!.getBoundingClientRect();\n if (!box.width || !box.height) return;\n const px = ((e.clientX - box.left) / box.width) * W;\n setPointer({ x: px, y: ((e.clientY - box.top) / box.height) * H });\n setNear(Math.min(columns.length - 1, Math.max(0, Math.floor((px - PAD.left) / band))));\n };\n const totals = series.map((_, k) => columns.reduce((n, c) => n + c.parts[k], 0));\n return (\n <div className=\"chart-columns\">\n <svg\n ref={svg}\n className=\"chart-bars\"\n viewBox={`0 0 ${W} ${H}`}\n role=\"img\"\n aria-label={sayCopy('barsSummary', {\n count: columns.length,\n highest: say(max),\n last: named[columns.length - 1],\n value: say(columns[columns.length - 1].total),\n })}\n onPointerMove={at}\n onPointerLeave={() => {\n setNear(null);\n setPointer(null);\n }}\n >\n {levels.map((v) => (\n <line key={`g${v}`} className=\"chart-grid\" x1={PAD.left} x2={W - PAD.right} y1={f1(y(v))} y2={f1(y(v))} />\n ))}\n {levels.map((v) => (\n <text key={`t${v}`} className=\"chart-tick chart-y-tick\" x={f1(PAD.left - 6)} y={f1(y(v) + 4)} textAnchor=\"end\">\n {tickSay(say)(v)}\n </text>\n ))}\n <line className=\"chart-bar-guide\" x1={PAD.left} x2={W - PAD.right} y1={f1(top)} y2={f1(top)} />\n {columns.map((c, i) => {\n let base = 0;\n return (\n <g key={c.key} className={`chart-column${i === active ? ' is-active' : ''}`}>\n <title>{`${named[i]}: ${parts(i)}`}</title>\n {c.parts.map((v, k) => {\n const from = base;\n base += v;\n if (!v) return null;\n return (\n <rect\n key={k}\n className=\"chart-column-part\"\n x={f1(x(i))}\n y={f1(y(base))}\n width={f1(colWide)}\n height={f1(Math.max(1, y(from) - y(base)))}\n style={{ fill: color(k) }}\n />\n );\n })}\n </g>\n );\n })}\n {marks.map(({ index, text }) => (\n <text\n key={`m${index}`}\n className={`chart-tick chart-x-tick${index === active ? ' is-active' : ''}`}\n x={f1(markAt(index, text))}\n y={H - 6}\n textAnchor=\"middle\"\n >\n {text}\n </text>\n ))}\n <g className=\"chart-bar-tip\" aria-hidden=\"true\">\n <rect x={f1(tipLeft)} y={f1(tipTop)} width={f1(tipWide)} height={20} />\n <text x={f1(tipLeft + tipWide / 2)} y={f1(tipTop + 14)} textAnchor=\"middle\">\n {tip}\n </text>\n </g>\n </svg>\n <ul className=\"chart-legend chart-columns-legend\">\n {series.map((s, k) => (\n <li key={s.key}>\n <span className=\"chart-swatch\" style={{ background: color(k) }} />\n <span className=\"chart-legend-key\">{s.label}</span>\n <span className=\"chart-legend-value\">{say(totals[k])}</span>\n </li>\n ))}\n </ul>\n <div className=\"visually-hidden\">\n <table className=\"chart-data\">\n <tbody>\n {columns.map((c, i) => (\n <tr key={c.key}>\n <th scope=\"row\">{named[i]}</th>\n <td>{parts(i)}</td>\n </tr>\n ))}\n </tbody>\n </table>\n </div>\n </div>\n );\n}\n\n/**\n * The house ring round a donut's slice (design.md, Access): a shape takes no outline, so the ring is the outline of\n * the slice's own arc, `from` and `length` in hundredths of the circle from 3 o'clock, drawn 2px off its stroke, `width`\n * units wide as the look draws it (7, Lumen's line charts 4.5; the donut is 120px over 42 units; the ring's own 2px is a\n * non-scaling stroke). A widened stroke was the ring once: the drawing's edge cut it, and on a pale slice it could not\n * be told from the slice. Drawn off a 7-unit stroke round a 4.5-unit one, it stood 6px off the slice.\n */\nexport function sliceRing(center: number, radius: number, from: number, length: number, width = 7): string {\n const off = width / 2 + 1.05;\n const outer = radius + off;\n const inner = radius - off;\n const past = (100 * (1.05 / radius)) / (2 * Math.PI);\n const n = (value: number) => Number(value.toFixed(3));\n const point = (r: number, at: number) => {\n const angle = (2 * Math.PI * at) / 100;\n return `${n(center + r * Math.cos(angle))} ${n(center + r * Math.sin(angle))}`;\n };\n const circle = (r: number) =>\n `M ${n(center + r)} ${center} A ${n(r)} ${n(r)} 0 1 1 ${n(center - r)} ${center} A ${n(r)} ${n(r)} 0 1 1 ${n(center + r)} ${center} Z`;\n /* A slice that is (nearly) the whole circle has no ends: its ring is two circles. */\n if (length + 2 * past >= 100) return `${circle(outer)} ${circle(inner)}`;\n const start = from - past;\n const end = from + length + past;\n const large = end - start > 50 ? 1 : 0;\n return `M ${point(outer, start)} A ${n(outer)} ${n(outer)} 0 ${large} 1 ${point(outer, end)} L ${point(inner, end)} A ${n(inner)} ${n(inner)} 0 ${large} 0 ${point(inner, start)} Z`;\n}\n\n/**\n * A donut with its legend: how the whole divides, said twice — arc length\n * and a labelled figure. Past six slices the tail is gathered into \"others\".\n */\nexport function DonutChart({\n rows,\n say = String,\n label = String,\n onPick,\n total,\n ordered,\n tone,\n}: {\n rows: ChartRow[];\n say?: Say;\n label?: (key: unknown) => string;\n /** A slice's display tone, where its column has them: slices wear the ink their dot and badge wear when every one has its own. */\n tone?: (key: unknown) => string | undefined;\n onPick?: ((value: unknown) => void) | null;\n /** What the figure in the middle is: \"Total visitors\", said under it. */\n total?: string;\n /** The slices are steps of a scale, in its order: drawn in steps of one hue (rampInk), not in categorical ones. */\n ordered?: boolean;\n}) {\n /* The slice's stroke as the look draws it (.chart-slice: 7 units, 4.5 in Lumen's line charts), read as a slice takes\n the keyboard, the moment its ring is drawn: a look is picked while the page is open, and a stylesheet says it. */\n const [sliceWidth, setSliceWidth] = useState(7);\n const all = rows\n .map((r) => ({ key: r.key == null ? '—' : label(r.key), raw: r.key, value: Number(r.value) }))\n .filter((p) => Number.isFinite(p.value) && p.value > 0);\n if (!all.length) return <p className=\"note\">{sayCopy('nothingToDivide')}</p>;\n const MAX_SLICES = 6;\n const slices: Array<{ key: string; raw?: unknown; value: number }> = all.slice(0, MAX_SLICES);\n const rest = all.slice(MAX_SLICES);\n if (rest.length) slices.push({ key: `others (${rest.length})`, value: rest.reduce((n, p) => n + p.value, 0) });\n const whole = slices.reduce((n, p) => n + p.value, 0);\n const R = 15.9155; /* circumference 100, so dasharray speaks percent. */\n const C = 21;\n /* A step of the ramp rides in a property of its own, which the slice and its swatch both paint with. */\n /* A legend that names two slices in one ink says nothing, so slices wear their tones only where each is distinct. */\n const inks = ordered || rest.length || !tone ? undefined : slices.map((p) => TONE_INK[tone(p.raw) ?? '']);\n const toned = !!inks && inks.every(Boolean) && new Set(inks).size === inks.length;\n const color = (i: number) => (ordered ? 'var(--ramp)' : toned ? inks![i]! : `var(--chart-${i + 1}, var(--accent))`);\n const ramp = (i: number) => (ordered ? { ['--ramp' as string]: rampInk(i, slices.length) } : {});\n const opacity = (i: number) =>\n ordered || toned ? '1' : `var(--chart-series-opacity, ${(1 - i * (0.75 / Math.max(slices.length - 1, 1))).toFixed(2)})`;\n let at = 25; /* Start at 12 o'clock: dasharray's zero is 3 o'clock. */\n /* A hairline of the ground between slices, so neighbours of one hue read as two; a slice too thin to spare it keeps\n its whole arc. One slice is a ring, with nothing to part. */\n const GAP = slices.length > 1 ? 0.8 : 0;\n const rings = slices.map((p, i) => {\n const share = (100 * p.value) / whole;\n const drawn = share > GAP * 2 ? share - GAP : share;\n /* A slice is a door where the legend's button is: the same raw value,\n the same \"others\" exclusion. A circle is not a button by itself, so\n a drillable slice carries the button's role, name and keyboard\n behaviour, and the legend button stays as the second way in. */\n const drillable = onPick && p.raw != null && !(rest.length && i === slices.length - 1);\n const said = `${p.key}: ${say(p.value)} (${formatPercent(share, { maximumFractionDigits: 0 })})`;\n const arc = (\n <circle\n key={i}\n className={`chart-slice${drillable ? ' chart-slice-drill' : ''}`}\n cx={C}\n cy={C}\n r={R}\n strokeDasharray={`${drawn.toFixed(2)} ${(100 - drawn).toFixed(2)}`}\n strokeDashoffset={at.toFixed(2)}\n style={{ ...ramp(i), stroke: color(i), opacity: opacity(i) }}\n >\n {!drillable && <title>{said}</title>}\n </circle>\n );\n /* The door is the slice and its ring together: the ring is drawn (and read by grade) only while the door holds the\n keyboard's focus. The dash starts at -offset along a path that begins at 3 o'clock. */\n const door = drillable ? (\n <g\n key={i}\n className=\"chart-slice-door\"\n role=\"button\"\n tabIndex={0}\n aria-label={said}\n onClick={() => onPick!(p.raw)}\n onFocus={(event: React.FocusEvent<SVGGElement>) => {\n const slice = event.currentTarget.querySelector('.chart-slice');\n const width = slice ? parseFloat(getComputedStyle(slice).strokeWidth) : NaN;\n if (width > 0 && width !== sliceWidth) setSliceWidth(width);\n }}\n onKeyDown={(event: React.KeyboardEvent) => {\n if (event.key === 'Enter' || event.key === ' ') {\n event.preventDefault();\n onPick!(p.raw);\n }\n }}\n >\n <title>{said}</title>\n {arc}\n <path className=\"chart-slice-ring\" data-focus-ring=\"\" d={sliceRing(C, R, -at, drawn, sliceWidth)} />\n </g>\n ) : (\n arc\n );\n at -= share;\n return door;\n });\n /* A picture must not hold buttons: where any slice drills, the figure\n is a group holding buttons, not an image — axe's nested-interactive\n fails a button inside role=\"img\", and a screen reader would meet the\n slices as the picture's unnamed parts. Where nothing drills it stays\n an image, as before. */\n const anyDrillable = onPick && slices.some((p, i) => p.raw != null && !(rest.length && i === slices.length - 1));\n return (\n <div className={`chart-donut-wrap${ordered ? ' is-ordered' : ''}`}>\n <svg\n className=\"chart-donut\"\n viewBox={`0 0 ${C * 2} ${C * 2}`}\n role={anyDrillable ? 'group' : 'img'}\n aria-label={sayCopy('inAll', { whole: say(whole), map: slices.map((p) => `${p.key} ${say(p.value)}`).join(', ') })}\n >\n {rings}\n <text className=\"chart-donut-total\" x={C} y={total ? C : C + 1.5} textAnchor=\"middle\">\n {say(whole)}\n </text>\n {total && (\n <text className=\"chart-donut-caption\" x={C} y={C + 4.5} textAnchor=\"middle\">\n {total}\n </text>\n )}\n </svg>\n <ul className=\"chart-legend\">\n {slices.map((p, i) => {\n const parts = (\n <>\n <span className=\"chart-swatch\" style={{ ...ramp(i), background: color(i), opacity: opacity(i) }} />\n <span className=\"chart-legend-key\">{p.key}</span>\n <span className=\"chart-legend-value\">{say(p.value)}</span>\n <span className=\"chart-legend-share\">{formatPercent((100 * p.value) / whole, { maximumFractionDigits: 0 })}</span>\n </>\n );\n const drillable = onPick && p.raw != null && !(rest.length && i === slices.length - 1);\n return (\n <li key={i}>\n {drillable ? (\n <button type=\"button\" className=\"chart-legend-drill\" onClick={() => onPick!(p.raw)}>\n {parts}\n </button>\n ) : (\n parts\n )}\n </li>\n );\n })}\n </ul>\n </div>\n );\n}\n\n/** A display tone as the ink it is drawn in (the status tokens, so a look's and a dark mode's own are worn). */\nexport const TONE_INK: Record<string, string> = {\n good: 'var(--status-good)',\n warn: 'var(--status-warning)',\n bad: 'var(--status-critical)',\n info: 'var(--status-info)',\n neutral: 'var(--ink-subtle)',\n};\n\ninterface StackedRow {\n key: unknown;\n series: unknown;\n value: unknown;\n}\n\n/**\n * Stacked bars: each group of the first key a bar, divided by the second —\n * how each of several wholes divides, where a donut says how one does. The\n * bars share one scale (the longest total, or the target when it is past\n * it), each series keeps one theme token in every bar and in the legend,\n * and past seven series the tail is gathered into \"others\", the eighth\n * token. A target is a rule across every track and a word in the legend.\n */\nexport function StackedBars({\n rows,\n say = String,\n label = String,\n seriesLabel = String,\n target,\n limit = 10,\n onPick,\n seriesVocabulary,\n seriesOrdered,\n seriesTone,\n sayLegend,\n}: {\n rows: StackedRow[];\n say?: Say;\n label?: (key: unknown) => string;\n seriesLabel?: (key: unknown) => string;\n target?: number;\n limit?: number;\n onPick?: ((value: unknown) => void) | null;\n /** The second key's declared values: the series stand in their order, as a donut's slices of the same column do. */\n seriesVocabulary?: readonly string[];\n /** The second key is a scale: its series stand in its order and in steps of one hue (rampInk). */\n seriesOrdered?: boolean;\n /** A series' tone from its column's display map. Where every series has one, and no two share it, the bars wear the\n tones (Paid good, Open warning) rather than the palette, whose order says nothing about what a value means. */\n seriesTone?: (key: string) => string | undefined;\n /** The chart's visible figures (legend, each bar's total, the target) by one rule, given every one of them as stored\n (compact for all or exact for all); the titles and the hidden text stay exact. */\n sayLegend?: (figures: readonly number[]) => Say;\n}) {\n const MAX_SERIES = 7;\n const name = (v: unknown) => (v == null ? '—' : String(v));\n const bars = new Map<string, { raw: unknown; total: number; parts: Map<string, number> }>();\n const seriesTotals = new Map<string, { raw: unknown; total: number }>();\n for (const row of rows) {\n const value = Number(row.value);\n if (!Number.isFinite(value) || value <= 0) continue;\n const bar = bars.get(name(row.key)) ?? { raw: row.key, total: 0, parts: new Map() };\n bar.total += value;\n bar.parts.set(name(row.series), (bar.parts.get(name(row.series)) ?? 0) + value);\n bars.set(name(row.key), bar);\n const series = seriesTotals.get(name(row.series)) ?? { raw: row.series, total: 0 };\n series.total += value;\n seriesTotals.set(name(row.series), series);\n }\n if (!bars.size) return <p className=\"note\">{sayCopy('nothingToStack')}</p>;\n const ranked = [...seriesTotals.entries()].sort((a, b) => b[1].total - a[1].total);\n /* The largest series are kept; where the second key declares an order, they stand in it — Urgent to Planning, a\n week to a month — rather than by their totals. */\n const rank = new Map((seriesVocabulary ?? []).map((word, at) => [word, at]));\n const place = (key: string) => rank.get(key) ?? Number.POSITIVE_INFINITY;\n const step = (a: string, b: string) => {\n const x = Number(a),\n y = Number(b);\n return Number.isFinite(x) && Number.isFinite(y) ? x - y : a < b ? -1 : a > b ? 1 : 0;\n };\n const declared = rank.size > 0 || seriesOrdered;\n const kept = ranked\n .slice(0, MAX_SERIES)\n .sort(([a, x], [b, y]) => (declared ? place(a) - place(b) || (seriesOrdered ? step(a, b) : 0) : 0) || y.total - x.total)\n .map(([key, s]) => ({ key, label: seriesLabel(s.raw), total: s.total }));\n const rest = ranked.slice(MAX_SERIES);\n const series = rest.length\n ? [...kept, { key: '\u0000others', label: sayCopy('others', { restCount: rest.length }), total: rest.reduce((n, [, s]) => n + s.total, 0) }]\n : kept;\n const slot = (key: string) => {\n const at = kept.findIndex((s) => s.key === key);\n return at === -1 ? series.length - 1 : at;\n };\n /* Colour that means something where the column says what each value is; the palette's series colours, which are\n only distinct, stay for categories with no such tone. */\n const tones = seriesOrdered || rest.length ? undefined : series.map((s) => TONE_INK[seriesTone?.(s.key) ?? '']);\n const toned = !!tones && tones.every(Boolean) && new Set(tones).size === tones.length;\n const color = (i: number) => (seriesOrdered ? 'var(--ramp)' : toned ? tones![i]! : `var(--chart-${i + 1}, var(--accent))`);\n const ramp = (i: number) => (seriesOrdered ? { ['--ramp' as string]: rampInk(i, series.length) } : {});\n const opacity = (i: number) =>\n seriesOrdered || toned ? '1' : `var(--chart-series-opacity, ${(1 - i * (0.75 / Math.max(series.length - 1, 1))).toFixed(2)})`;\n /* Bars over periods stand in time order, the latest `limit` of them, as a\n bar chart's do; ranking them by total put Sep 10 over Aug 27 over Sep 14. */\n const timed = isPeriodRun([...bars.values()].map((bar) => bar.raw));\n const shown = timed\n ? [...bars.values()].sort((a, b) => (String(a.raw) < String(b.raw) ? -1 : 1)).slice(-limit)\n : [...bars.values()].sort((a, b) => b.total - a.total).slice(0, limit);\n const barLabel = (bar: { raw: unknown }, i: number) =>\n timed ? periodTick(String(bar.raw), i ? String(shown[i - 1].raw) : undefined) : label(bar.raw);\n const goal = target !== undefined && Number.isFinite(target) && target > 0 ? target : undefined;\n const scale = Math.max(...shown.map((bar) => bar.total), goal ?? 0);\n const share = (v: number) => `${((100 * v) / scale).toFixed(2)}%`;\n const sayTotal = sayLegend\n ? sayLegend([...series.map((s) => s.total), ...shown.map((bar) => bar.total), ...(goal === undefined ? [] : [goal])])\n : say;\n return (\n <div className=\"chart-stacked\">\n <ul className=\"chart-legend chart-stacked-legend\">\n {series.map((s, i) => (\n <li key={s.key}>\n <span className=\"chart-swatch\" style={{ ...ramp(i), background: color(i), opacity: opacity(i) }} />\n <span className=\"chart-legend-key\">{s.label}</span>\n <span className=\"chart-legend-value\">{sayTotal(s.total)}</span>\n </li>\n ))}\n {goal !== undefined && (\n <li className=\"chart-stacked-goal\">\n <span className=\"chart-target-swatch\" aria-hidden=\"true\" />\n <span className=\"chart-legend-key\">{sayCopy('targetLabel')}</span>\n <span className=\"chart-legend-value\">{sayTotal(goal)}</span>\n </li>\n )}\n </ul>\n <ul\n className=\"chart-stacked-rows\"\n aria-label={`${sayCopy('barsBySeries', { count: shown.length, series: series.map((s) => s.label).join(', ') })}${goal === undefined ? '' : sayCopy('targetAfter', { goal: say(goal) })}`}\n >\n {shown.map((bar, at) => {\n /* Each series in legend order, so a colour sits in the same place in every bar. */\n const parts = series\n .map((s, i) => ({\n s,\n i,\n value:\n s.key === '\u0000others'\n ? [...bar.parts.entries()]\n .filter(([key]) => slot(key) === series.length - 1 && !kept.some((k) => k.key === key))\n .reduce((n, [, v]) => n + v, 0)\n : (bar.parts.get(s.key) ?? 0),\n }))\n .filter((part) => part.value > 0);\n const words = (\n <>\n <span className=\"chart-stacked-label\">{barLabel(bar, at)}</span>\n <span className=\"chart-stacked-track\">\n <span className=\"chart-stacked-fill\" style={{ width: share(bar.total) }}>\n {parts.map(({ s, i, value }) => (\n <span\n key={s.key}\n className=\"chart-stacked-part\"\n title={`${s.label}: ${say(value)}`}\n style={{ ...ramp(i), flexGrow: value, background: color(i), opacity: opacity(i) }}\n />\n ))}\n </span>\n {goal !== undefined && <span className=\"chart-stacked-target\" style={{ left: share(goal) }} aria-hidden=\"true\" />}\n </span>\n <span className=\"chart-stacked-total\">{sayTotal(bar.total)}</span>\n <span className=\"visually-hidden\">{`: ${parts.map(({ s, value }) => `${s.label} ${say(value)}`).join(', ')}`}</span>\n </>\n );\n /* A bar that goes somewhere is a button; a null group, or no drill, stays text. */\n return (\n <li key={name(bar.raw)}>\n {onPick && bar.raw != null ? (\n <button type=\"button\" className=\"chart-stacked-row chart-stacked-drill\" onClick={() => onPick(bar.raw)}>\n {words}\n </button>\n ) : (\n <div className=\"chart-stacked-row\">{words}</div>\n )}\n </li>\n );\n })}\n </ul>\n </div>\n );\n}\n\n/**\n * A spark: the measure's shape inside a KPI card. No axes; the card's own\n * number is the label. It spans the card's width, stretched rather than\n * scaled, so a wide card draws a long trend instead of a 110px stub in its\n * corner; the stroke and the last point's dot keep their own size however\n * far it stretches (`non-scaling-stroke`, and the dot is a round cap on a\n * zero-length stroke). Under four points there is no shape to read, so\n * there is no spark.\n */\nexport function Sparkline({ rows, say = String }: { rows: ChartRow[]; say?: Say }) {\n const points = rows\n .map((r) => ({ key: r.key == null ? '' : String(r.key), value: Number(r.value) }))\n .filter((p) => Number.isFinite(p.value));\n if (points.length < 4) return null;\n const W = 100;\n const H = 28;\n const max = Math.max(...points.map((p) => p.value), 0);\n const min = Math.min(...points.map((p) => p.value), 0);\n const span = max - min || 1;\n const x = (i: number) => 1 + (i * (W - 2)) / (points.length - 1);\n const y = (v: number) => 3 + (1 - (v - min) / span) * (H - 6);\n const d = points.map((p, i) => `${i ? 'L' : 'M'}${f1(x(i))},${f1(y(p.value))}`).join(' ');\n const last = points[points.length - 1];\n return (\n <svg\n className=\"spark\"\n viewBox={`0 0 ${W} ${H}`}\n preserveAspectRatio=\"none\"\n role=\"img\"\n aria-label={`trend: ${points.map((p) => say(p.value)).join(', ')}`}\n >\n <title>{`${points[0].key} → ${last.key}`}</title>\n <path className=\"spark-area\" d={`${d} L${f1(x(points.length - 1))},${H} L${f1(x(0))},${H} Z`} />\n <path className=\"spark-stroke\" d={d} vectorEffect=\"non-scaling-stroke\" />\n <path className=\"spark-dot\" d={`M${f1(x(points.length - 1))},${f1(y(last.value))} h0`} vectorEffect=\"non-scaling-stroke\" />\n </svg>\n );\n}\n"],"mappings":"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"}