@arbidocs/blocks 0.5.107 → 0.5.108
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/{ConnectedCallDock-TDYRHPAK.js → ConnectedCallDock-DV4FU376.js} +8 -8
- package/dist/{ConnectedCallDock-TDYRHPAK.js.map → ConnectedCallDock-DV4FU376.js.map} +1 -1
- package/dist/{ConnectedCallDock-H3WWFGXF.cjs → ConnectedCallDock-EM2VVGZK.cjs} +10 -10
- package/dist/{ConnectedCallDock-H3WWFGXF.cjs.map → ConnectedCallDock-EM2VVGZK.cjs.map} +1 -1
- package/dist/{ConnectedCallRoom-55O5OUN7.cjs → ConnectedCallRoom-7WEPEWUJ.cjs} +9 -9
- package/dist/{ConnectedCallRoom-55O5OUN7.cjs.map → ConnectedCallRoom-7WEPEWUJ.cjs.map} +1 -1
- package/dist/{ConnectedCallRoom-Z6F6WCLH.js → ConnectedCallRoom-RYTZP34O.js} +8 -8
- package/dist/{ConnectedCallRoom-Z6F6WCLH.js.map → ConnectedCallRoom-RYTZP34O.js.map} +1 -1
- package/dist/{ConnectedNativeDocxComparison-NVZRVNOS.js → ConnectedNativeDocxComparison-2NDXXZLQ.js} +15 -15
- package/dist/{ConnectedNativeDocxComparison-NVZRVNOS.js.map → ConnectedNativeDocxComparison-2NDXXZLQ.js.map} +1 -1
- package/dist/{ConnectedNativeDocxComparison-DGBZJ4XA.cjs → ConnectedNativeDocxComparison-7HOY3AVI.cjs} +16 -16
- package/dist/{ConnectedNativeDocxComparison-DGBZJ4XA.cjs.map → ConnectedNativeDocxComparison-7HOY3AVI.cjs.map} +1 -1
- package/dist/{ConnectedNativeDocxEditor-R4WINUUB.cjs → ConnectedNativeDocxEditor-CUWDPHXN.cjs} +16 -16
- package/dist/{ConnectedNativeDocxEditor-R4WINUUB.cjs.map → ConnectedNativeDocxEditor-CUWDPHXN.cjs.map} +1 -1
- package/dist/{ConnectedNativeDocxEditor-RSVBN7DY.js → ConnectedNativeDocxEditor-SPZB6Y27.js} +14 -14
- package/dist/{ConnectedNativeDocxEditor-RSVBN7DY.js.map → ConnectedNativeDocxEditor-SPZB6Y27.js.map} +1 -1
- package/dist/{ConnectedProductionSetDialog-2DFBXE2X.js → ConnectedProductionSetDialog-N3EDG3SU.js} +4 -4
- package/dist/{ConnectedProductionSetDialog-2DFBXE2X.js.map → ConnectedProductionSetDialog-N3EDG3SU.js.map} +1 -1
- package/dist/{ConnectedProductionSetDialog-KYDPQ7SG.cjs → ConnectedProductionSetDialog-XAEFEN3N.cjs} +4 -4
- package/dist/{ConnectedProductionSetDialog-KYDPQ7SG.cjs.map → ConnectedProductionSetDialog-XAEFEN3N.cjs.map} +1 -1
- package/dist/{ConnectedStreamedWordArtifact-HLJ5IIOU.js → ConnectedStreamedWordArtifact-6LTGEAJO.js} +15 -15
- package/dist/ConnectedStreamedWordArtifact-6LTGEAJO.js.map +1 -0
- package/dist/{ConnectedStreamedWordArtifact-JQ34AOUU.cjs → ConnectedStreamedWordArtifact-HNCRKZTV.cjs} +16 -16
- package/dist/ConnectedStreamedWordArtifact-HNCRKZTV.cjs.map +1 -0
- package/dist/{DocumentReviewCard-7JSXRJZ2.js → DocumentReviewCard-RJD3CO32.js} +8 -8
- package/dist/{DocumentReviewCard-7JSXRJZ2.js.map → DocumentReviewCard-RJD3CO32.js.map} +1 -1
- package/dist/{DocumentReviewCard-C4HVT3WM.cjs → DocumentReviewCard-VON7LOOY.cjs} +8 -8
- package/dist/{DocumentReviewCard-C4HVT3WM.cjs.map → DocumentReviewCard-VON7LOOY.cjs.map} +1 -1
- package/dist/{FilesViewerDialog-IMQTZWKD.js → FilesViewerDialog-7SJGY72Q.js} +21 -21
- package/dist/{FilesViewerDialog-IMQTZWKD.js.map → FilesViewerDialog-7SJGY72Q.js.map} +1 -1
- package/dist/{FilesViewerDialog-UP7GFHYN.cjs → FilesViewerDialog-VIPTC6OT.cjs} +27 -27
- package/dist/{FilesViewerDialog-UP7GFHYN.cjs.map → FilesViewerDialog-VIPTC6OT.cjs.map} +1 -1
- package/dist/{RechartsRenderer-GIRCW7DB.cjs → RechartsRenderer-THES2SE5.cjs} +6 -5
- package/dist/RechartsRenderer-THES2SE5.cjs.map +1 -0
- package/dist/{RechartsRenderer-23OF4H6X.js → RechartsRenderer-XIZLV6GH.js} +6 -5
- package/dist/RechartsRenderer-XIZLV6GH.js.map +1 -0
- package/dist/{WorkspaceTableView-PJM47B5F.cjs → WorkspaceTableView-FNME7TL6.cjs} +9 -9
- package/dist/{WorkspaceTableView-PJM47B5F.cjs.map → WorkspaceTableView-FNME7TL6.cjs.map} +1 -1
- package/dist/{WorkspaceTableView-YDA7A4UJ.js → WorkspaceTableView-XQ6J2JKI.js} +7 -7
- package/dist/{WorkspaceTableView-YDA7A4UJ.js.map → WorkspaceTableView-XQ6J2JKI.js.map} +1 -1
- package/dist/agents/index.cjs +202 -202
- package/dist/agents/index.js +8 -8
- package/dist/{ai-ADS6YSS2.cjs → ai-3SAMEYBB.cjs} +20 -20
- package/dist/ai-3SAMEYBB.cjs.map +1 -0
- package/dist/{ai-KHWTGBT5.js → ai-OTQWSYVK.js} +12 -12
- package/dist/ai-OTQWSYVK.js.map +1 -0
- package/dist/calls/index.cjs +57 -57
- package/dist/calls/index.js +9 -9
- package/dist/chat/index.cjs +3 -3
- package/dist/chat/index.js +3 -3
- package/dist/{chunk-O27K7KTZ.cjs → chunk-2TBQBF4Y.cjs} +5 -5
- package/dist/{chunk-O27K7KTZ.cjs.map → chunk-2TBQBF4Y.cjs.map} +1 -1
- package/dist/{chunk-YJWAGXYM.js → chunk-4ZA2RSQH.js} +3 -3
- package/dist/{chunk-YJWAGXYM.js.map → chunk-4ZA2RSQH.js.map} +1 -1
- package/dist/{chunk-6A4GNM4T.cjs → chunk-5D2ZINOJ.cjs} +16 -16
- package/dist/{chunk-6A4GNM4T.cjs.map → chunk-5D2ZINOJ.cjs.map} +1 -1
- package/dist/{chunk-BFVCYBND.cjs → chunk-5HXQOM3I.cjs} +5 -5
- package/dist/{chunk-BFVCYBND.cjs.map → chunk-5HXQOM3I.cjs.map} +1 -1
- package/dist/{chunk-GSD5U553.cjs → chunk-5KKT65WU.cjs} +3 -3
- package/dist/{chunk-GSD5U553.cjs.map → chunk-5KKT65WU.cjs.map} +1 -1
- package/dist/{chunk-AVGHTUPE.js → chunk-5PWLXLHY.js} +5 -5
- package/dist/chunk-5PWLXLHY.js.map +1 -0
- package/dist/{chunk-BBWLFK3C.js → chunk-5XIMUQ63.js} +3 -3
- package/dist/{chunk-BBWLFK3C.js.map → chunk-5XIMUQ63.js.map} +1 -1
- package/dist/{chunk-AHMRYY7J.cjs → chunk-6DAJXQZZ.cjs} +13 -13
- package/dist/{chunk-AHMRYY7J.cjs.map → chunk-6DAJXQZZ.cjs.map} +1 -1
- package/dist/{chunk-3PV25ICC.js → chunk-6KKVJ2V6.js} +3 -3
- package/dist/{chunk-3PV25ICC.js.map → chunk-6KKVJ2V6.js.map} +1 -1
- package/dist/{chunk-OLAYDOPC.js → chunk-6LUHNFEE.js} +6 -6
- package/dist/{chunk-OLAYDOPC.js.map → chunk-6LUHNFEE.js.map} +1 -1
- package/dist/{chunk-FSXQHEFQ.cjs → chunk-7CDV7Y4U.cjs} +25 -25
- package/dist/{chunk-FSXQHEFQ.cjs.map → chunk-7CDV7Y4U.cjs.map} +1 -1
- package/dist/{chunk-OAIOOVFN.cjs → chunk-7SJXYEZI.cjs} +36 -36
- package/dist/chunk-7SJXYEZI.cjs.map +1 -0
- package/dist/{chunk-LFYKB7KF.cjs → chunk-7V6APLF7.cjs} +19 -19
- package/dist/{chunk-LFYKB7KF.cjs.map → chunk-7V6APLF7.cjs.map} +1 -1
- package/dist/{chunk-4WMGFGYP.cjs → chunk-AJZ66VJC.cjs} +4 -4
- package/dist/{chunk-4WMGFGYP.cjs.map → chunk-AJZ66VJC.cjs.map} +1 -1
- package/dist/{chunk-KCP42W67.cjs → chunk-ARGQ5YZ5.cjs} +3 -3
- package/dist/{chunk-KCP42W67.cjs.map → chunk-ARGQ5YZ5.cjs.map} +1 -1
- package/dist/{chunk-BH6IKGZ3.js → chunk-AUAHGQY6.js} +5 -5
- package/dist/{chunk-BH6IKGZ3.js.map → chunk-AUAHGQY6.js.map} +1 -1
- package/dist/{chunk-KIXFXCHL.js → chunk-CEOCA7ID.js} +3 -3
- package/dist/{chunk-KIXFXCHL.js.map → chunk-CEOCA7ID.js.map} +1 -1
- package/dist/{chunk-TNKPQ3EF.js → chunk-CIRSOYGK.js} +12 -12
- package/dist/{chunk-TNKPQ3EF.js.map → chunk-CIRSOYGK.js.map} +1 -1
- package/dist/{chunk-BAUZUIHB.js → chunk-COL2TJGO.js} +83 -83
- package/dist/chunk-COL2TJGO.js.map +1 -0
- package/dist/{chunk-XHN5KOI2.cjs → chunk-DRLD4P2C.cjs} +8 -8
- package/dist/{chunk-XHN5KOI2.cjs.map → chunk-DRLD4P2C.cjs.map} +1 -1
- package/dist/{chunk-5AC52BHL.cjs → chunk-DYPFNQTQ.cjs} +140 -140
- package/dist/chunk-DYPFNQTQ.cjs.map +1 -0
- package/dist/{chunk-SCLGUHLU.cjs → chunk-E7TGSOPR.cjs} +4 -4
- package/dist/{chunk-SCLGUHLU.cjs.map → chunk-E7TGSOPR.cjs.map} +1 -1
- package/dist/{chunk-CRLFLMTK.cjs → chunk-EOXA4VJH.cjs} +3 -3
- package/dist/{chunk-CRLFLMTK.cjs.map → chunk-EOXA4VJH.cjs.map} +1 -1
- package/dist/{chunk-DBKZANTC.js → chunk-GA47YVW5.js} +3 -3
- package/dist/{chunk-DBKZANTC.js.map → chunk-GA47YVW5.js.map} +1 -1
- package/dist/{chunk-RCZRI72J.cjs → chunk-GMODJT4N.cjs} +4 -4
- package/dist/{chunk-RCZRI72J.cjs.map → chunk-GMODJT4N.cjs.map} +1 -1
- package/dist/{chunk-22KAKJ3W.cjs → chunk-GS5MFUPC.cjs} +4 -4
- package/dist/{chunk-22KAKJ3W.cjs.map → chunk-GS5MFUPC.cjs.map} +1 -1
- package/dist/{chunk-62OMGQHS.js → chunk-H6W3VXHU.js} +3 -3
- package/dist/{chunk-62OMGQHS.js.map → chunk-H6W3VXHU.js.map} +1 -1
- package/dist/{chunk-DX3Z2COD.cjs → chunk-HUYKO2ES.cjs} +3 -3
- package/dist/{chunk-DX3Z2COD.cjs.map → chunk-HUYKO2ES.cjs.map} +1 -1
- package/dist/{chunk-U5F5P4YU.js → chunk-IK234EFX.js} +12 -12
- package/dist/{chunk-U5F5P4YU.js.map → chunk-IK234EFX.js.map} +1 -1
- package/dist/{chunk-UQ2OBHMV.js → chunk-JUGEFTRC.js} +1010 -1010
- package/dist/chunk-JUGEFTRC.js.map +1 -0
- package/dist/{chunk-CHQMVIHR.js → chunk-LPGBRMYS.js} +36 -36
- package/dist/chunk-LPGBRMYS.js.map +1 -0
- package/dist/{chunk-D35EHOK5.cjs → chunk-M23W7IID.cjs} +12 -12
- package/dist/chunk-M23W7IID.cjs.map +1 -0
- package/dist/{chunk-FPOKWML2.js → chunk-MIVNNQO3.js} +21 -4
- package/dist/chunk-MIVNNQO3.js.map +1 -0
- package/dist/{chunk-WI3BVKEC.cjs → chunk-MNFI66H5.cjs} +5 -5
- package/dist/{chunk-WI3BVKEC.cjs.map → chunk-MNFI66H5.cjs.map} +1 -1
- package/dist/{chunk-T5ZMG6MC.js → chunk-NF4M7PUB.js} +3 -3
- package/dist/{chunk-T5ZMG6MC.js.map → chunk-NF4M7PUB.js.map} +1 -1
- package/dist/{chunk-ZNY5W3VX.js → chunk-NPSFPBIB.js} +3 -3
- package/dist/{chunk-ZNY5W3VX.js.map → chunk-NPSFPBIB.js.map} +1 -1
- package/dist/{chunk-LYW5A35J.js → chunk-OMIYTUVR.js} +12 -12
- package/dist/{chunk-LYW5A35J.js.map → chunk-OMIYTUVR.js.map} +1 -1
- package/dist/{chunk-ZMVF7EYJ.cjs → chunk-PBPO54KZ.cjs} +21 -3
- package/dist/chunk-PBPO54KZ.cjs.map +1 -0
- package/dist/{chunk-7V4OCZS6.cjs → chunk-RA3EGF6K.cjs} +6 -6
- package/dist/{chunk-7V4OCZS6.cjs.map → chunk-RA3EGF6K.cjs.map} +1 -1
- package/dist/{chunk-PL7O3RJJ.cjs → chunk-RKBAY7GZ.cjs} +3 -3
- package/dist/{chunk-PL7O3RJJ.cjs.map → chunk-RKBAY7GZ.cjs.map} +1 -1
- package/dist/{chunk-J3E5CSSC.js → chunk-RKFWBIKS.js} +3 -3
- package/dist/{chunk-J3E5CSSC.js.map → chunk-RKFWBIKS.js.map} +1 -1
- package/dist/{chunk-YLKHTBYA.js → chunk-RRP7MQAO.js} +3 -3
- package/dist/{chunk-YLKHTBYA.js.map → chunk-RRP7MQAO.js.map} +1 -1
- package/dist/{chunk-U6LQ6Z3P.cjs → chunk-SP3IKIPA.cjs} +6 -6
- package/dist/{chunk-U6LQ6Z3P.cjs.map → chunk-SP3IKIPA.cjs.map} +1 -1
- package/dist/{chunk-GX75YCWJ.cjs → chunk-SQUOXOY3.cjs} +560 -560
- package/dist/chunk-SQUOXOY3.cjs.map +1 -0
- package/dist/{chunk-6ZYOUT73.js → chunk-T5LORFHL.js} +7 -7
- package/dist/{chunk-6ZYOUT73.js.map → chunk-T5LORFHL.js.map} +1 -1
- package/dist/{chunk-45OU2UAA.cjs → chunk-TEMTKBBL.cjs} +10 -10
- package/dist/{chunk-45OU2UAA.cjs.map → chunk-TEMTKBBL.cjs.map} +1 -1
- package/dist/{chunk-PHDUN4SG.cjs → chunk-THCMGAFX.cjs} +41 -41
- package/dist/{chunk-PHDUN4SG.cjs.map → chunk-THCMGAFX.cjs.map} +1 -1
- package/dist/{chunk-HTGEAQOA.js → chunk-TOMDMKOD.js} +7 -7
- package/dist/{chunk-HTGEAQOA.js.map → chunk-TOMDMKOD.js.map} +1 -1
- package/dist/{chunk-WJHRWXWJ.js → chunk-TXIAF4PX.js} +3 -3
- package/dist/{chunk-WJHRWXWJ.js.map → chunk-TXIAF4PX.js.map} +1 -1
- package/dist/{chunk-6M5NAAWX.js → chunk-UCSEE52D.js} +3 -3
- package/dist/{chunk-6M5NAAWX.js.map → chunk-UCSEE52D.js.map} +1 -1
- package/dist/{chunk-I7CJDF3V.cjs → chunk-UHMP6S7M.cjs} +104 -103
- package/dist/chunk-UHMP6S7M.cjs.map +1 -0
- package/dist/{chunk-PGCKTXYH.js → chunk-UHUI6A36.js} +3 -3
- package/dist/{chunk-PGCKTXYH.js.map → chunk-UHUI6A36.js.map} +1 -1
- package/dist/{chunk-6KQVTMRL.cjs → chunk-UOGXKHTJ.cjs} +3 -3
- package/dist/{chunk-6KQVTMRL.cjs.map → chunk-UOGXKHTJ.cjs.map} +1 -1
- package/dist/{chunk-7S7YVBFK.js → chunk-VDSDG4FR.js} +3 -3
- package/dist/{chunk-7S7YVBFK.js.map → chunk-VDSDG4FR.js.map} +1 -1
- package/dist/{chunk-3GFQNJYE.js → chunk-VGWCHX6G.js} +104 -103
- package/dist/chunk-VGWCHX6G.js.map +1 -0
- package/dist/{chunk-VY3HTT37.js → chunk-VUH547VQ.js} +3 -3
- package/dist/{chunk-VY3HTT37.js.map → chunk-VUH547VQ.js.map} +1 -1
- package/dist/{chunk-AZCMKGDG.js → chunk-W37PFYFL.js} +4 -4
- package/dist/{chunk-AZCMKGDG.js.map → chunk-W37PFYFL.js.map} +1 -1
- package/dist/{chunk-JGUM4EXE.cjs → chunk-W3IX3GZS.cjs} +8 -8
- package/dist/{chunk-JGUM4EXE.cjs.map → chunk-W3IX3GZS.cjs.map} +1 -1
- package/dist/{chunk-UCA4JLLJ.cjs → chunk-X7GT57KW.cjs} +3 -3
- package/dist/{chunk-UCA4JLLJ.cjs.map → chunk-X7GT57KW.cjs.map} +1 -1
- package/dist/{chunk-IXL2KJOZ.cjs → chunk-XBEGD33U.cjs} +40 -40
- package/dist/{chunk-IXL2KJOZ.cjs.map → chunk-XBEGD33U.cjs.map} +1 -1
- package/dist/{chunk-FDNIK5YS.cjs → chunk-XBKIFGBB.cjs} +8 -8
- package/dist/{chunk-FDNIK5YS.cjs.map → chunk-XBKIFGBB.cjs.map} +1 -1
- package/dist/{chunk-HZE5MHQO.js → chunk-XT7HKQ4H.js} +3 -3
- package/dist/{chunk-HZE5MHQO.js.map → chunk-XT7HKQ4H.js.map} +1 -1
- package/dist/{chunk-M3OK6KGR.js → chunk-ZGQKED5T.js} +3 -3
- package/dist/{chunk-M3OK6KGR.js.map → chunk-ZGQKED5T.js.map} +1 -1
- package/dist/{chunk-NWBCZ4PA.js → chunk-ZKBYG6MN.js} +4 -4
- package/dist/{chunk-NWBCZ4PA.js.map → chunk-ZKBYG6MN.js.map} +1 -1
- package/dist/collaboration/index.cjs +1 -1
- package/dist/collaboration/index.js +1 -1
- package/dist/connect/docx.cjs +19 -19
- package/dist/connect/docx.js +15 -15
- package/dist/connect/index.cjs +762 -762
- package/dist/connect/index.js +63 -63
- package/dist/connect/viewer.cjs +14 -14
- package/dist/connect/viewer.js +13 -13
- package/dist/connection/dashboards/ConnectedDashboardsPage.d.ts +6 -0
- package/dist/dashboards/chartModel.d.ts +12 -0
- package/dist/dashboards/index.cjs +113 -42
- package/dist/dashboards/index.cjs.map +1 -1
- package/dist/dashboards/index.js +95 -24
- package/dist/dashboards/index.js.map +1 -1
- package/dist/embed/index.cjs +29 -29
- package/dist/embed/index.js +23 -23
- package/dist/facts/index.cjs +43 -43
- package/dist/facts/index.js +2 -2
- package/dist/files/index.cjs +1 -1
- package/dist/files/index.js +1 -1
- package/dist/home/index.cjs +31 -31
- package/dist/home/index.js +3 -3
- package/dist/index.cjs +383 -383
- package/dist/index.js +21 -21
- package/dist/settings/index.cjs +153 -153
- package/dist/settings/index.js +4 -4
- package/dist/shell/index.cjs +36 -36
- package/dist/shell/index.js +4 -4
- package/dist/site/index.cjs +5 -5
- package/dist/site/index.js +1 -1
- package/dist/studio/index.cjs +19 -19
- package/dist/studio/index.js +14 -14
- package/dist/styles.css +1 -1
- package/dist/workflow-canvas/index.cjs +33 -33
- package/dist/workflow-canvas/index.js +22 -22
- package/node_modules/@arbidocs/coedit/package.json +2 -2
- package/node_modules/@docx-editor.dev/core/dist/automation.cjs +1 -1
- package/node_modules/@docx-editor.dev/core/dist/automation.d.ts +60 -13
- package/node_modules/@docx-editor.dev/core/dist/automation.js +1 -1
- package/node_modules/@docx-editor.dev/core/dist/binding.cjs +1 -1
- package/node_modules/@docx-editor.dev/core/dist/binding.d.ts +21 -13
- package/node_modules/@docx-editor.dev/core/dist/binding.js +1 -1
- package/node_modules/@docx-editor.dev/core/dist/{index-Bsg7oIKP.d.ts → chrome-print-CAs51cpq.d.ts} +31 -21
- package/node_modules/@docx-editor.dev/core/dist/{chunk-VDNNLG6X.js → chunk-236O4YQW.js} +1 -1
- package/node_modules/@docx-editor.dev/core/dist/chunk-4HENIAFG.js +1 -0
- package/node_modules/@docx-editor.dev/core/dist/{chunk-SRPILEWV.cjs → chunk-6JPL6ZAS.cjs} +5 -5
- package/node_modules/@docx-editor.dev/core/dist/{chunk-2RC2EPND.js → chunk-6ZQP4HQ7.js} +1 -1
- package/node_modules/@docx-editor.dev/core/dist/{chunk-ZUHOMK52.cjs → chunk-7WQ7AAHW.cjs} +1 -1
- package/node_modules/@docx-editor.dev/core/dist/{chunk-Z6WBFXJU.js → chunk-BCXH4BXB.js} +3 -3
- package/node_modules/@docx-editor.dev/core/dist/{chunk-QMLCVPCD.cjs → chunk-BY2ACZZ6.cjs} +1 -1
- package/node_modules/@docx-editor.dev/core/dist/chunk-CAJEXXVG.cjs +4 -0
- package/node_modules/@docx-editor.dev/core/dist/chunk-CPWLFPWC.js +30 -0
- package/node_modules/@docx-editor.dev/core/dist/{chunk-6APGXLBB.cjs → chunk-D7ZMDMPX.cjs} +2 -2
- package/node_modules/@docx-editor.dev/core/dist/chunk-DOHF6FA7.cjs +30 -0
- package/node_modules/@docx-editor.dev/core/dist/chunk-DVX32P2P.js +27 -0
- package/node_modules/@docx-editor.dev/core/dist/{chunk-6EYYL7FL.js → chunk-E4LOMDNL.js} +1 -1
- package/node_modules/@docx-editor.dev/core/dist/chunk-EKLM7NWB.cjs +7 -0
- package/node_modules/@docx-editor.dev/core/dist/chunk-G3K63G7P.cjs +27 -0
- package/node_modules/@docx-editor.dev/core/dist/{chunk-5CSUYANV.js → chunk-G4HOFIKJ.js} +1 -1
- package/node_modules/@docx-editor.dev/core/dist/{chunk-K5U2PLDP.cjs → chunk-JLVBDYVQ.cjs} +1 -1
- package/node_modules/@docx-editor.dev/core/dist/chunk-LQX36Z5P.js +7 -0
- package/node_modules/@docx-editor.dev/core/dist/{chunk-TSLBZ26X.js → chunk-LSZ6KPKK.js} +1 -1
- package/node_modules/@docx-editor.dev/core/dist/{chunk-O2AL2HSJ.cjs → chunk-MM5QBMTE.cjs} +1 -1
- package/node_modules/@docx-editor.dev/core/dist/{chunk-ETTO6GK3.js → chunk-OMCG63ZF.js} +1 -1
- package/node_modules/@docx-editor.dev/core/dist/chunk-OSFOJTHU.cjs +18 -0
- package/node_modules/@docx-editor.dev/core/dist/{chunk-E7BQA6UP.js → chunk-RCLZXP3B.js} +1 -1
- package/node_modules/@docx-editor.dev/core/dist/chunk-T6K2QYNZ.cjs +2 -0
- package/node_modules/@docx-editor.dev/core/dist/chunk-TRGAVV2Y.js +4 -0
- package/node_modules/@docx-editor.dev/core/dist/chunk-U4JZVSOE.js +2 -0
- package/node_modules/@docx-editor.dev/core/dist/{chunk-2GO5T2JU.cjs → chunk-UHHYFIDT.cjs} +1 -1
- package/node_modules/@docx-editor.dev/core/dist/chunk-V3N4SOAK.cjs +1 -0
- package/node_modules/@docx-editor.dev/core/dist/{chunk-6AWEKBLB.cjs → chunk-W35WTWAO.cjs} +1 -1
- package/node_modules/@docx-editor.dev/core/dist/chunk-YQ5G6LC7.js +18 -0
- package/node_modules/@docx-editor.dev/core/dist/collaboration/replication.cjs +1 -1
- package/node_modules/@docx-editor.dev/core/dist/collaboration/replication.d.ts +5 -5
- package/node_modules/@docx-editor.dev/core/dist/collaboration/replication.js +1 -1
- package/node_modules/@docx-editor.dev/core/dist/collaboration.d.ts +4 -4
- package/node_modules/@docx-editor.dev/core/dist/contracts/document.d.ts +3 -3
- package/node_modules/@docx-editor.dev/core/dist/contracts/editor.d.ts +9 -10
- package/node_modules/@docx-editor.dev/core/dist/contracts/interaction.d.ts +2 -2
- package/node_modules/@docx-editor.dev/core/dist/contracts/modules.cjs +1 -1
- package/node_modules/@docx-editor.dev/core/dist/contracts/modules.d.ts +33 -9
- package/node_modules/@docx-editor.dev/core/dist/contracts/modules.js +1 -1
- package/node_modules/@docx-editor.dev/core/dist/contracts/types.d.ts +2 -2
- package/node_modules/@docx-editor.dev/core/dist/{custom-node-writes-cvL5rhcD.d.ts → custom-node-writes-Bn6uciLb.d.ts} +2 -2
- package/node_modules/@docx-editor.dev/core/dist/diagnostic-context-B8M79cfK.d.ts +30 -0
- package/node_modules/@docx-editor.dev/core/dist/diagnostic-hints-BeVjfNOv.d.ts +113 -0
- package/node_modules/@docx-editor.dev/core/dist/{document-protection-BAGVGqaP.d.ts → document-protection-CUb55pl_.d.ts} +2 -2
- package/node_modules/@docx-editor.dev/core/dist/{editor-Ci7IZGmG.d.ts → editor-CZQZmTIU.d.ts} +386 -9
- package/node_modules/@docx-editor.dev/core/dist/{editor-scope-OHPwVQ5l.d.ts → editor-scope-7o9xweiJ.d.ts} +1 -1
- package/node_modules/@docx-editor.dev/core/dist/editor.cjs +1 -1
- package/node_modules/@docx-editor.dev/core/dist/editor.d.ts +54 -33
- package/node_modules/@docx-editor.dev/core/dist/editor.js +1 -1
- package/node_modules/@docx-editor.dev/core/dist/export.cjs +2 -2
- package/node_modules/@docx-editor.dev/core/dist/export.d.ts +13 -14
- package/node_modules/@docx-editor.dev/core/dist/export.js +1 -1
- package/node_modules/@docx-editor.dev/core/dist/{font-resolver-BVQB14qT.d.ts → font-resolver-lSBLirLR.d.ts} +3 -3
- package/node_modules/@docx-editor.dev/core/dist/{headless-document-view-qH331moE.d.ts → headless-document-view-pp3q7wIh.d.ts} +2 -2
- package/node_modules/@docx-editor.dev/core/dist/{image-resources-BN-hUgCn.d.ts → image-resources-tXLQShoC.d.ts} +2 -2
- package/node_modules/@docx-editor.dev/core/dist/index.cjs +1 -1
- package/node_modules/@docx-editor.dev/core/dist/index.d.ts +65 -20
- package/node_modules/@docx-editor.dev/core/dist/index.js +1 -1
- package/node_modules/@docx-editor.dev/core/dist/{layout-shaping-BEyuiQOk.d.ts → layout-shaping-BD-dF_rn.d.ts} +1 -1
- package/node_modules/@docx-editor.dev/core/dist/layout.cjs +1 -1
- package/node_modules/@docx-editor.dev/core/dist/layout.d.ts +17 -20
- package/node_modules/@docx-editor.dev/core/dist/layout.js +1 -1
- package/node_modules/@docx-editor.dev/core/dist/{note-properties-4Y9o6Gyk.d.ts → note-properties-qQUjO1GQ.d.ts} +3 -3
- package/node_modules/@docx-editor.dev/core/dist/{omml-equation-CuzBL5DD.d.ts → omml-equation-BUbU0utM.d.ts} +1 -1
- package/node_modules/@docx-editor.dev/core/dist/output.cjs +1 -1
- package/node_modules/@docx-editor.dev/core/dist/output.d.ts +8 -9
- package/node_modules/@docx-editor.dev/core/dist/output.js +1 -1
- package/node_modules/@docx-editor.dev/core/dist/{protocol-Bqk4Izjc.d.ts → protocol-DYzzz2ej.d.ts} +2 -2
- package/node_modules/@docx-editor.dev/core/dist/{review-paragraph-order-DT-n6ouC.d.ts → review-paragraph-order-CN_0l2Cb.d.ts} +1 -1
- package/node_modules/@docx-editor.dev/core/dist/{semantic-cell-selection-D9D1KSXq.d.ts → semantic-cell-selection-eYag3P47.d.ts} +4 -211
- package/node_modules/@docx-editor.dev/core/dist/{semantic-interaction-CIC-PooQ.d.ts → semantic-interaction-kR_QB845.d.ts} +1 -1
- package/node_modules/@docx-editor.dev/core/dist/{semantic-paint-BME37OMv.d.ts → semantic-paint-ZayFF3tD.d.ts} +17 -5
- package/node_modules/@docx-editor.dev/core/dist/{semantic-record-queries-CBlZqZNa.d.ts → semantic-record-queries-Bsgth6lv.d.ts} +1 -1
- package/node_modules/@docx-editor.dev/core/dist/{semantic-records-4B3WwFAi.d.ts → semantic-records-DQmumPgL.d.ts} +1279 -828
- package/node_modules/@docx-editor.dev/core/dist/store.cjs +1 -1
- package/node_modules/@docx-editor.dev/core/dist/store.d.ts +1466 -1464
- package/node_modules/@docx-editor.dev/core/dist/store.js +1 -1
- package/node_modules/@docx-editor.dev/core/dist/{tree-package-fragment-BeeKxDw8.d.ts → tree-package-store-CovjNARF.d.ts} +83 -83
- package/node_modules/@docx-editor.dev/core/dist/{tree-session-contract-CVbmlMlq.d.ts → tree-session-contract-CZVAGl51.d.ts} +6 -6
- package/node_modules/@docx-editor.dev/core/dist/{types-barrel-D3xCgQX6.d.ts → types-barrel-DuC5QBNC.d.ts} +548 -527
- package/node_modules/@docx-editor.dev/core/package.json +3 -3
- package/node_modules/@docx-editor.dev/react/dist/index.js +3 -3
- package/node_modules/@docx-editor.dev/react/dist/index.mjs +3 -3
- package/node_modules/@docx-editor.dev/react/package.json +4 -4
- package/package.json +8 -8
- package/dist/ConnectedStreamedWordArtifact-HLJ5IIOU.js.map +0 -1
- package/dist/ConnectedStreamedWordArtifact-JQ34AOUU.cjs.map +0 -1
- package/dist/RechartsRenderer-23OF4H6X.js.map +0 -1
- package/dist/RechartsRenderer-GIRCW7DB.cjs.map +0 -1
- package/dist/ai-ADS6YSS2.cjs.map +0 -1
- package/dist/ai-KHWTGBT5.js.map +0 -1
- package/dist/chunk-3GFQNJYE.js.map +0 -1
- package/dist/chunk-5AC52BHL.cjs.map +0 -1
- package/dist/chunk-AVGHTUPE.js.map +0 -1
- package/dist/chunk-BAUZUIHB.js.map +0 -1
- package/dist/chunk-CHQMVIHR.js.map +0 -1
- package/dist/chunk-D35EHOK5.cjs.map +0 -1
- package/dist/chunk-FPOKWML2.js.map +0 -1
- package/dist/chunk-GX75YCWJ.cjs.map +0 -1
- package/dist/chunk-I7CJDF3V.cjs.map +0 -1
- package/dist/chunk-OAIOOVFN.cjs.map +0 -1
- package/dist/chunk-UQ2OBHMV.js.map +0 -1
- package/dist/chunk-ZMVF7EYJ.cjs.map +0 -1
- package/node_modules/@docx-editor.dev/core/dist/chunk-4GBTELJV.cjs +0 -28
- package/node_modules/@docx-editor.dev/core/dist/chunk-4R3TEXMN.js +0 -18
- package/node_modules/@docx-editor.dev/core/dist/chunk-EO4C5QJW.cjs +0 -2
- package/node_modules/@docx-editor.dev/core/dist/chunk-FIJZIQXA.cjs +0 -18
- package/node_modules/@docx-editor.dev/core/dist/chunk-FRXAOVTB.js +0 -28
- package/node_modules/@docx-editor.dev/core/dist/chunk-J6BVWIDB.js +0 -2
- package/node_modules/@docx-editor.dev/core/dist/chunk-JGNVNT2A.cjs +0 -2
- package/node_modules/@docx-editor.dev/core/dist/chunk-KKIJG3C6.js +0 -2
- package/node_modules/@docx-editor.dev/core/dist/chunk-LWDSDCMO.js +0 -27
- package/node_modules/@docx-editor.dev/core/dist/chunk-NBCVVZOM.cjs +0 -1
- package/node_modules/@docx-editor.dev/core/dist/chunk-O5INAWZQ.js +0 -1
- package/node_modules/@docx-editor.dev/core/dist/chunk-RCHS4ZEH.cjs +0 -27
- package/node_modules/@docx-editor.dev/core/dist/chunk-VHAVHCQY.js +0 -7
- package/node_modules/@docx-editor.dev/core/dist/chunk-VX43VBAX.cjs +0 -7
- package/node_modules/@docx-editor.dev/core/dist/review-pane-D9jm8DcY.d.ts +0 -128
- package/node_modules/@docx-editor.dev/core/dist/revision-projection-DZ4kKVev.d.ts +0 -242
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/calls/connected/SaveTranscriptToThread.tsx","../src/calls/connected/RecordingCard.tsx","../src/calls/connected/ThreadCallLogCard.tsx"],"names":["jsx","Fragment","useMemo","jsxs","cn","useState","Button","useSaveToThread","useArbi","useCall"],"mappings":"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","file":"chunk-BAUZUIHB.js","sourcesContent":["/**\n * Host action \"Save transcript to thread\": the meeting chat's transcript is decrypted here, in the\n * host's browser, and posted as ONE attributed transcript comment (title, date, then\n * `Speaker [hh:mm:ss]: text` lines) into a workspace thread the host picks — a shared thread of the\n * current workspace they can post in, or a new one. The thread is encrypted with the workspace key\n * like any comment; the meeting chat itself is unchanged and nobody outside it gains access to it.\n */\n\nimport { useSaveToThread, useWorkspaces, type TranscriptExportLine } from '@arbidocs/react'\nimport { useMemo, useState, type ReactElement, type ReactNode } from 'react'\nimport { FileText } from 'lucide-react'\nimport {\n Button,\n cn,\n Dialog,\n DialogContent,\n DialogDescription,\n DialogFooter,\n DialogHeader,\n DialogTitle,\n} from '@arbidocs/react/ui'\nimport { useBlocksEnvironment } from '../../provider/environment'\nimport { useConnectedWorkspace } from '../../connection/ConnectionProvider'\nimport { useConnectedConversations } from '../../connection/workspaceData'\nimport { HeaderAction } from '../HeaderAction'\n\nconst NEW_THREAD = '__new__'\n\n/** The open workspace and my role in it (the threads I can post in are its shared ones). */\nfunction useCurrentWorkspace() {\n const { workspaceId, userId } = useConnectedWorkspace()\n const { data: workspaces } = useWorkspaces()\n const workspace = workspaces?.find((w) => w.external_id === workspaceId)\n const role = workspace?.users?.find((wu) => wu.user.external_id === userId)?.role ?? null\n return { workspace, role }\n}\n\nexport function SaveTranscriptToThread({\n title,\n lines,\n excludeConversationExtId,\n iconOnly = false,\n className,\n}: {\n /** The meeting's title (decrypted). */\n title: string | null | undefined\n lines: TranscriptExportLine[]\n /** Not offered as a target (the meeting thread itself). */\n excludeConversationExtId?: string | null\n /** Icon only, the label in a tooltip (a crowded header). */\n iconOnly?: boolean\n className?: string\n}): ReactElement | null {\n const [open, setOpen] = useState(false)\n if (!lines.length) return null\n return (\n <>\n <HeaderAction\n label=\"Save transcript to thread\"\n icon={<FileText className=\"size-3.5\" aria-hidden />}\n iconOnly={iconOnly}\n className={className}\n onClick={() => setOpen(true)}\n testId=\"save-transcript-to-thread\"\n />\n {open && (\n <SaveTranscriptDialog\n title={title}\n lines={lines}\n excludeConversationExtId={excludeConversationExtId ?? null}\n onClose={() => setOpen(false)}\n />\n )}\n </>\n )\n}\n\nfunction SaveTranscriptDialog({\n title,\n lines,\n excludeConversationExtId,\n onClose,\n}: {\n title: string | null | undefined\n lines: TranscriptExportLine[]\n excludeConversationExtId: string | null\n onClose(): void\n}): ReactElement {\n const { notify } = useBlocksEnvironment()\n const save = useSaveToThread()\n const { workspace } = useCurrentWorkspace()\n return (\n <PickThreadDialog\n heading=\"Save transcript to thread\"\n description={\n <>\n The transcript ({lines.length} {lines.length === 1 ? 'line' : 'lines'}) is posted as one\n comment in a thread of {workspace?.name ?? 'the current workspace'}. Only that thread’s\n members can read it there.\n </>\n }\n testIdPrefix=\"save-transcript\"\n excludeConversationExtId={excludeConversationExtId}\n onClose={onClose}\n onConfirm={async (target) => {\n await save.transcript({ conversationExtId: target, title, lines })\n notify('Transcript saved to the thread', 'success')\n }}\n />\n )\n}\n\n/**\n * Pick a shared thread of the current workspace I can post in (or a new one) and act on it: the\n * dialog behind \"Save transcript to thread\" and the recording's \"Save to thread\".\n */\nexport function PickThreadDialog({\n heading,\n description,\n testIdPrefix,\n excludeConversationExtId,\n confirmLabel = 'Save',\n busyLabel = 'Saving…',\n onConfirm,\n onClose,\n}: {\n heading: string\n description: ReactNode\n /** `<prefix>-dialog`, `<prefix>-target-<id>`, `<prefix>-confirm`. */\n testIdPrefix: string\n excludeConversationExtId?: string | null\n confirmLabel?: string\n busyLabel?: string\n /** `target` null: a new thread. Throwing keeps the dialog open and shows the error. */\n onConfirm(target: string | null): Promise<unknown>\n onClose(): void\n}): ReactElement {\n const { notify } = useBlocksEnvironment()\n const { role } = useCurrentWorkspace()\n const { data: conversations } = useConnectedConversations()\n const canPost = role === 'owner' || role === 'collaborator'\n const threads = useMemo(\n () =>\n canPost\n ? conversations\n .filter((c) => c.is_shared && c.external_id !== excludeConversationExtId)\n .sort((a, b) => Date.parse(b.updated_at) - Date.parse(a.updated_at))\n : [],\n [conversations, canPost, excludeConversationExtId]\n )\n const [target, setTarget] = useState<string>(NEW_THREAD)\n const [busy, setBusy] = useState(false)\n\n const save = async () => {\n setBusy(true)\n try {\n await onConfirm(target === NEW_THREAD ? null : target)\n onClose()\n } catch (err) {\n notify((err as Error).message, 'error')\n } finally {\n setBusy(false)\n }\n }\n\n return (\n <Dialog open onOpenChange={(o) => !o && !busy && onClose()}>\n <DialogContent className=\"sm:max-w-md\" data-testid={`${testIdPrefix}-dialog`}>\n <DialogHeader>\n <DialogTitle>{heading}</DialogTitle>\n <DialogDescription>{description}</DialogDescription>\n </DialogHeader>\n {!canPost ? (\n <p className=\"text-sm text-muted-foreground\">\n Open a workspace you can post in to save here.\n </p>\n ) : (\n <ul className=\"flex max-h-72 flex-col gap-1 overflow-y-auto\" role=\"radiogroup\">\n {[{ external_id: NEW_THREAD, title: 'New thread' }, ...threads].map((t) => (\n <li key={t.external_id}>\n <button\n type=\"button\"\n role=\"radio\"\n aria-checked={target === t.external_id}\n className={cn(\n 'w-full truncate rounded-md px-2 py-1.5 text-left text-sm hover:bg-muted',\n target === t.external_id && 'bg-muted font-medium'\n )}\n onClick={() => setTarget(t.external_id)}\n data-testid={`${testIdPrefix}-target-${t.external_id}`}\n >\n {t.title || 'Untitled thread'}\n </button>\n </li>\n ))}\n </ul>\n )}\n <DialogFooter>\n <Button variant=\"ghost\" onClick={onClose} disabled={busy}>\n Cancel\n </Button>\n <Button\n onClick={() => void save()}\n disabled={busy || !canPost}\n data-testid={`${testIdPrefix}-confirm`}\n >\n {busy ? busyLabel : confirmLabel}\n </Button>\n </DialogFooter>\n </DialogContent>\n </Dialog>\n )\n}\n","/**\n * The Recording card of a call (ARBI `docs/meeting-chats-plan.md` §6): a `kind = recording` chat\n * message in an E2E meeting chat, a `recording` activity event in a workspace meeting thread, and\n * each entry of a meeting chat's \"Recordings\" list.\n *\n * Everything that touches media happens in this browser: parts are downloaded as ciphertext and\n * decrypted with the track keys (unwrapped under the meeting chat's / workspace's key). Members of\n * the meeting chat can play, download and copy an in-app link; the host can also transcribe, delete\n * the media (keeping the transcript), set an expiry, save the files to a thread, or delete it.\n */\n\nimport { useCallback, useEffect, useMemo, useRef, useState, type ReactElement } from 'react'\nimport {\n Captions,\n Download,\n FileUp,\n Link2,\n Loader2,\n Mic,\n Pause,\n Play,\n Trash2,\n Video,\n} from 'lucide-react'\nimport { Button, cn } from '@arbidocs/react/ui'\nimport { downloadBlob } from '@arbidocs/react/document-tools/core'\nimport {\n useArbi,\n useCallRecording,\n useCallRecordings,\n useCall,\n useRecordingActions,\n useSaveToThread,\n meetingChatRefFrom,\n compositeFiles,\n compositeTrack,\n fetchPart,\n recordingFiles,\n speakerTracks,\n type OpenedRecording,\n PLAYBACK_LOOKAHEAD_MS,\n partKey,\n partsDue,\n playheadAt,\n schedulePart,\n standalone,\n timelineDurationMs,\n timelineOf,\n type TimelinePart,\n} from '@arbidocs/react'\nimport type { calls } from '@arbidocs/sdk/browser'\nimport { useBlocksEnvironment } from '../../provider/environment'\nimport { useConnectedWorkspace } from '../../connection/ConnectionProvider'\nimport { recordingLink, setPendingRecording, usePendingRecording } from '../recording-link'\nimport { formatCallDuration } from '../call-cards'\nimport { EXPIRY_DAYS, MODE_LABEL, expiryChoiceOf, expiryFor } from '../recording-labels'\nimport { PickThreadDialog } from './SaveTranscriptToThread'\nimport { CallUserPill } from './CallUserPill'\n\n/** A card for one recording (by id), or for each of the call's recordings when no id is known. */\nexport function RecordingCard({\n callExtId,\n recordingExtId,\n title,\n time,\n}: {\n callExtId: string\n recordingExtId?: string | null\n /** The meeting's title (decrypted), for file names. */\n title?: string | null\n time?: string\n}): ReactElement | null {\n const { data: call } = useCall(callExtId)\n const one = useCallRecording(callExtId, recordingExtId)\n const all = useCallRecordings(callExtId, !recordingExtId)\n if (!call) return null\n if (recordingExtId) {\n if (one.isError) return <RecordingUnavailable />\n return one.data ? (\n <RecordingCardBody call={call} recording={one.data} title={title} time={time} />\n ) : null\n }\n return (\n <>\n {(all.data ?? []).map((r) => (\n <RecordingCardBody\n key={r.external_id}\n call={call}\n recording={r}\n title={title}\n time={time}\n />\n ))}\n </>\n )\n}\n\n/** All of a call's recordings (the meeting chat's \"Recordings\" view), newest first. */\nexport function RecordingsList({\n callExtId,\n title,\n className,\n}: {\n callExtId: string\n title?: string | null\n className?: string\n}): ReactElement {\n const { data: call } = useCall(callExtId)\n const { data, isLoading, isError } = useCallRecordings(callExtId)\n const sorted = useMemo(\n () => [...(data ?? [])].sort((a, b) => Date.parse(b.started_at) - Date.parse(a.started_at)),\n [data]\n )\n return (\n <div className={cn('flex flex-col gap-2', className)} data-testid=\"recordings-list\">\n {isLoading && <Loader2 className=\"mx-auto size-4 animate-spin text-muted-foreground\" />}\n {isError && (\n <p className=\"text-center text-xs text-muted-foreground\">Could not load the recordings.</p>\n )}\n {!isLoading && !isError && !sorted.length && (\n <p className=\"text-center text-xs text-muted-foreground\">No recordings yet.</p>\n )}\n {call &&\n sorted.map((r) => (\n <RecordingCardBody key={r.external_id} call={call} recording={r} title={title} />\n ))}\n </div>\n )\n}\n\nfunction RecordingUnavailable(): ReactElement {\n return (\n <div\n className=\"mx-auto my-1 w-fit rounded-md border border-border bg-card px-3 py-2 text-xs text-muted-foreground\"\n data-testid=\"recording-card\"\n >\n Recording unavailable\n </div>\n )\n}\n\n/** A two-step destructive button: the first click asks, the second does. */\nfunction ConfirmButton({\n label,\n confirmLabel,\n testId,\n disabled,\n onConfirm,\n icon,\n}: {\n label: string\n confirmLabel: string\n testId: string\n disabled?: boolean\n onConfirm(): Promise<void>\n icon: ReactElement\n}): ReactElement {\n const [asking, setAsking] = useState(false)\n const [busy, setBusy] = useState(false)\n useEffect(() => {\n if (!asking) return\n const t = setTimeout(() => setAsking(false), 5000)\n return () => clearTimeout(t)\n }, [asking])\n return (\n <Button\n type=\"button\"\n size=\"sm\"\n variant={asking ? 'destructive' : 'outline'}\n className=\"h-7\"\n disabled={disabled || busy}\n onClick={() => {\n if (!asking) {\n setAsking(true)\n return\n }\n setAsking(false)\n setBusy(true)\n void onConfirm().finally(() => setBusy(false))\n }}\n data-testid={asking ? `${testId}-confirm` : testId}\n >\n {busy ? <Loader2 className=\"mr-1 size-3.5 animate-spin\" aria-hidden /> : icon}\n {asking ? confirmLabel : label}\n </Button>\n )\n}\n\nfunction RecordingCardBody({\n call,\n recording,\n title,\n time,\n}: {\n call: calls.CallResponse\n recording: calls.CallRecording\n title?: string | null\n time?: string\n}): ReactElement {\n const arbi = useArbi()\n const actions = useRecordingActions(call)\n const save = useSaveToThread()\n const { notify, runtimeConfig } = useBlocksEnvironment()\n const isHost = call.is_creator\n const mediaDeleted = !!recording.media_deleted_at\n const live = recording.state === 'recording' || (!recording.stopped_at && !mediaDeleted)\n const speakers = speakerTracks(recording)\n const timeline = useMemo(() => timelineOf(recording.tracks ?? []), [recording.tracks])\n const durationMs = timelineDurationMs(timeline)\n const hasMedia = !mediaDeleted && timeline.length > 0\n const [opened, setOpened] = useState<OpenedRecording | null>(null)\n const [playing, setPlaying] = useState(false)\n const [progress, setProgress] = useState<string | null>(null)\n const [saveOpen, setSaveOpen] = useState(false)\n const { workspaceId: selectedWorkspaceId } = useConnectedWorkspace()\n\n // A link asked to show this recording: bring it into view.\n const pending = usePendingRecording()\n const highlighted = pending === recording.external_id\n const cardRef = useRef<HTMLDivElement | null>(null)\n useEffect(() => {\n if (!highlighted) return\n cardRef.current?.scrollIntoView({ block: 'center', behavior: 'smooth' })\n const t = setTimeout(() => setPendingRecording(null), 4000)\n return () => clearTimeout(t)\n }, [highlighted])\n\n const { refresh } = actions\n\n const open = useCallback(async (): Promise<OpenedRecording> => {\n if (opened && opened.recording === recording) return opened\n const next = await actions.open(recording)\n setOpened(next)\n return next\n }, [actions, opened, recording])\n\n const run = async (label: string, task: () => Promise<void>) => {\n setProgress(label)\n try {\n await task()\n } catch (err) {\n console.warn('[calls] recording action failed', err)\n notify((err as Error).message, 'error')\n } finally {\n setProgress(null)\n }\n }\n\n const download = () =>\n run('Decrypting…', async () => {\n const files = await recordingFiles(arbi, await open(), title, (done, total) =>\n setProgress(`Decrypting ${done}/${total}…`)\n )\n if (!files.length) throw new Error('Nothing to download')\n for (const f of files) downloadBlob(f, f.name)\n })\n\n const transcribe = () =>\n run('Transcribing…', async () => {\n const { stored, failed } = await actions.transcribe(await open(), (done, total) =>\n setProgress(`Transcribing ${done}/${total}…`)\n )\n notify(\n failed\n ? `Transcribed ${stored} lines; ${failed} parts failed`\n : `Transcribed ${stored} lines into the meeting chat`,\n failed ? 'warning' : 'success'\n )\n })\n\n const copyLink = async () => {\n const ref = meetingChatRefFrom(call)\n if (!ref) {\n notify('This recording has no meeting chat to link to', 'error')\n return\n }\n try {\n await navigator.clipboard.writeText(\n recordingLink(ref, recording.external_id, runtimeConfig.deploymentDomain)\n )\n notify('Link copied: it opens for members of the meeting chat', 'success')\n } catch {\n notify('Could not copy the link', 'error')\n }\n }\n\n const saveToThread = async (target: string | null) => {\n if (!selectedWorkspaceId) throw new Error('Open a workspace first')\n const files = await recordingFiles(arbi, await open(), title, (done, total) =>\n setProgress(`Decrypting ${done}/${total}…`)\n )\n if (!files.length) throw new Error('Nothing to save')\n // Re-encrypted under the workspace key, as a direct document upload.\n try {\n await save.recording({\n workspaceExtId: selectedWorkspaceId,\n files,\n conversationExtId: target,\n title,\n onUploading: () => setProgress('Uploading…'),\n })\n } finally {\n setProgress(null)\n }\n notify('Recording saved to the thread', 'success')\n }\n\n const summary = [\n 'Recording',\n MODE_LABEL[recording.mode],\n formatCallDuration(durationMs / 1000),\n speakers.length ? `${speakers.length} ${speakers.length === 1 ? 'speaker' : 'speakers'}` : null,\n ]\n .filter(Boolean)\n .join(' · ')\n\n return (\n <div\n ref={cardRef}\n className={cn(\n 'mx-auto my-1 flex w-full max-w-xl flex-col gap-2 rounded-md border border-border bg-card px-3 py-2 text-xs',\n highlighted && 'ring-2 ring-primary'\n )}\n data-testid=\"recording-card\"\n data-recording={recording.external_id}\n >\n <div className=\"flex flex-wrap items-center gap-2\">\n {recording.mode === 'audio_video' ? (\n <Video className=\"size-4 text-red-500\" aria-hidden />\n ) : (\n <Mic className=\"size-4 text-red-500\" aria-hidden />\n )}\n <span className=\"font-medium\" data-testid=\"recording-summary\">\n {summary}\n </span>\n {time && <time className=\"text-muted-foreground\">{time}</time>}\n {live && <span className=\"text-red-500\">recording…</span>}\n {mediaDeleted && (\n <span className=\"text-muted-foreground\">Audio and video deleted — transcript kept</span>\n )}\n {!mediaDeleted && recording.expires_at && (\n <span className=\"text-muted-foreground\">\n Deleted after {new Date(recording.expires_at).toLocaleDateString()}\n </span>\n )}\n </div>\n {speakers.length > 0 && (\n <p className=\"flex flex-wrap items-center gap-1 text-muted-foreground\">\n {speakers.map((t, i) =>\n t.speaker_ext_id ? (\n <CallUserPill\n key={t.speaker_ext_id}\n identity={t.speaker_ext_id}\n name={t.speaker_name}\n />\n ) : (\n <span key={i}>{t.speaker_name || 'Someone'}</span>\n )\n )}\n </p>\n )}\n <div className=\"flex flex-wrap items-center gap-1.5\">\n {hasMedia && (\n <Button\n type=\"button\"\n size=\"sm\"\n variant=\"outline\"\n className=\"h-7\"\n aria-pressed={playing}\n onClick={() => setPlaying((p) => !p)}\n data-testid=\"recording-play\"\n >\n {playing ? (\n <Pause className=\"mr-1 size-3.5\" aria-hidden />\n ) : (\n <Play className=\"mr-1 size-3.5\" aria-hidden />\n )}\n {playing ? 'Close player' : 'Play'}\n </Button>\n )}\n {hasMedia && (\n <Button\n type=\"button\"\n size=\"sm\"\n variant=\"outline\"\n className=\"h-7\"\n disabled={!!progress}\n onClick={() => void download()}\n data-testid=\"recording-download\"\n >\n <Download className=\"mr-1 size-3.5\" aria-hidden />\n Download\n </Button>\n )}\n <Button\n type=\"button\"\n size=\"sm\"\n variant=\"outline\"\n className=\"h-7\"\n onClick={() => void copyLink()}\n title=\"Copy an in-app link (only members of the meeting chat can open it)\"\n data-testid=\"recording-copy-link\"\n >\n <Link2 className=\"mr-1 size-3.5\" aria-hidden />\n Copy link\n </Button>\n {isHost && hasMedia && (\n <Button\n type=\"button\"\n size=\"sm\"\n variant=\"outline\"\n className=\"h-7\"\n disabled={!!progress || live}\n onClick={() => void transcribe()}\n data-testid=\"recording-transcribe\"\n >\n <Captions className=\"mr-1 size-3.5\" aria-hidden />\n Transcribe\n </Button>\n )}\n {isHost && hasMedia && (\n <Button\n type=\"button\"\n size=\"sm\"\n variant=\"outline\"\n className=\"h-7\"\n disabled={!!progress || live}\n onClick={() => setSaveOpen(true)}\n data-testid=\"recording-save-to-thread\"\n >\n <FileUp className=\"mr-1 size-3.5\" aria-hidden />\n Save to thread\n </Button>\n )}\n {isHost && !mediaDeleted && (\n <ConfirmButton\n label=\"Keep transcript, delete audio/video\"\n confirmLabel=\"Delete audio/video now\"\n testId=\"recording-delete-media\"\n disabled={!!progress || live}\n icon={<Trash2 className=\"mr-1 size-3.5\" aria-hidden />}\n onConfirm={async () => {\n try {\n await arbi.calls.recording.deleteMedia(call.external_id, recording.external_id)\n setPlaying(false)\n setOpened(null)\n refresh()\n } catch (err) {\n notify((err as Error).message, 'error')\n }\n }}\n />\n )}\n {isHost && (\n <ConfirmButton\n label=\"Delete\"\n confirmLabel=\"Delete recording\"\n testId=\"recording-delete\"\n disabled={!!progress || live}\n icon={<Trash2 className=\"mr-1 size-3.5\" aria-hidden />}\n onConfirm={async () => {\n try {\n await arbi.calls.recording.delete(call.external_id, recording.external_id)\n refresh()\n } catch (err) {\n notify((err as Error).message, 'error')\n }\n }}\n />\n )}\n {isHost && !mediaDeleted && (\n <label className=\"flex items-center gap-1 text-muted-foreground\">\n Keep\n <select\n className=\"h-7 rounded-sm border border-border bg-background px-1 text-xs text-foreground\"\n value={expiryChoiceOf(recording.expires_at ?? null)}\n onChange={(e) => {\n const days = e.target.value === 'none' ? null : Number(e.target.value)\n void arbi.calls.recording\n .setExpiry(call.external_id, recording.external_id, expiryFor(days))\n .then(refresh)\n .catch((err: unknown) => notify((err as Error).message, 'error'))\n }}\n data-testid=\"recording-expiry\"\n aria-label=\"Keep the audio and video for\"\n >\n {EXPIRY_DAYS.map((d) => (\n <option key={d ?? 'none'} value={d ?? 'none'}>\n {d ? `${d} days` : 'until deleted'}\n </option>\n ))}\n </select>\n </label>\n )}\n {progress && (\n <span className=\"inline-flex items-center gap-1 text-muted-foreground\">\n <Loader2 className=\"size-3.5 animate-spin\" aria-hidden />\n {progress}\n </span>\n )}\n </div>\n {playing && hasMedia && (\n <RecordingPlayer recording={recording} open={open} durationMs={durationMs} />\n )}\n {saveOpen && (\n <PickThreadDialog\n heading=\"Save recording to thread\"\n description=\"The recording is decrypted here and uploaded as documents (one audio file per speaker, and the video) into a thread of the current workspace, encrypted under its key. Only that workspace’s members can read them there.\"\n testIdPrefix=\"save-recording\"\n confirmLabel=\"Save\"\n busyLabel=\"Saving…\"\n onClose={() => setSaveOpen(false)}\n onConfirm={saveToThread}\n />\n )}\n </div>\n )\n}\n\n/**\n * Plays a recording: the composite video when there is one (it carries the mixed audio the host\n * heard), otherwise the speaker tracks mixed in sync on one WebAudio timeline.\n */\nfunction RecordingPlayer({\n recording,\n open,\n durationMs,\n}: {\n recording: calls.CallRecording\n open(): Promise<OpenedRecording>\n durationMs: number\n}): ReactElement {\n const composite = compositeTrack(recording)\n const [view, setView] = useState<'video' | 'audio'>(composite?.parts?.length ? 'video' : 'audio')\n return (\n <div className=\"flex flex-col gap-2\" data-testid=\"recording-player\">\n {composite?.parts?.length ? (\n <div className=\"flex gap-1\" role=\"group\" aria-label=\"Play\">\n {(['video', 'audio'] as const).map((v) => (\n <button\n key={v}\n type=\"button\"\n className={cn(\n 'rounded-full px-2 py-0.5',\n view === v ? 'bg-muted font-medium' : 'text-muted-foreground hover:bg-muted'\n )}\n aria-pressed={view === v}\n onClick={() => setView(v)}\n >\n {v === 'video' ? 'Video' : 'Speakers'}\n </button>\n ))}\n </div>\n ) : null}\n {view === 'video' && composite ? (\n <CompositeVideo open={open} trackExtId={composite.external_id} />\n ) : (\n <MixPlayer recording={recording} open={open} durationMs={durationMs} />\n )}\n </div>\n )\n}\n\nfunction CompositeVideo({\n open,\n trackExtId,\n}: {\n open(): Promise<OpenedRecording>\n trackExtId: string\n}): ReactElement {\n const arbi = useArbi()\n const [urls, setUrls] = useState<string[] | null>(null)\n const [error, setError] = useState<string | null>(null)\n useEffect(() => {\n let cancelled = false\n let made: string[] = []\n void (async () => {\n try {\n const opened = await open()\n const track = (opened.recording.tracks ?? []).find((t) => t.external_id === trackExtId)\n const key = opened.keys.get(trackExtId)\n if (!track || !key) throw new Error('The video does not open with your key')\n const blobs = await compositeFiles(arbi, track, key)\n made = blobs.map((b) => URL.createObjectURL(b))\n if (cancelled) made.forEach((u) => URL.revokeObjectURL(u))\n else setUrls(made)\n } catch (err) {\n if (!cancelled) setError((err as Error).message)\n }\n })()\n return () => {\n cancelled = true\n made.forEach((u) => URL.revokeObjectURL(u))\n }\n }, [arbi, open, trackExtId])\n if (error) return <p className=\"text-destructive\">{error}</p>\n if (!urls) {\n return (\n <span className=\"inline-flex items-center gap-1 text-muted-foreground\">\n <Loader2 className=\"size-3.5 animate-spin\" aria-hidden />\n Decrypting the video…\n </span>\n )\n }\n return (\n <>\n {urls.map((u, i) => (\n <video\n key={u}\n src={u}\n controls\n className=\"w-full rounded-sm bg-black\"\n aria-label={`Video ${i + 1}`}\n />\n ))}\n </>\n )\n}\n\nconst fmt = (ms: number) => {\n const s = Math.max(0, Math.floor(ms / 1000))\n const h = Math.floor(s / 3600)\n const m = Math.floor((s % 3600) / 60)\n const sec = String(s % 60).padStart(2, '0')\n return h ? `${h}:${String(m).padStart(2, '0')}:${sec}` : `${m}:${sec}`\n}\n\n/**\n * The speaker tracks mixed in sync: parts are fetched, decrypted and decoded a little ahead of the\n * playhead and started on one AudioContext clock at their offsets (see `recording-playback.ts`).\n */\nfunction MixPlayer({\n recording,\n open,\n durationMs,\n}: {\n recording: calls.CallRecording\n open(): Promise<OpenedRecording>\n durationMs: number\n}): ReactElement {\n const arbi = useArbi()\n const { notify } = useBlocksEnvironment()\n const parts = useMemo(() => timelineOf(speakerTracks(recording)), [recording])\n const [position, setPosition] = useState(0)\n const [playing, setPlaying] = useState(false)\n const session = useRef<{\n ctx: AudioContext\n ctxStart: number\n seekMs: number\n scheduled: Set<string>\n timer: ReturnType<typeof setInterval>\n } | null>(null)\n\n const halt = useCallback(() => {\n const s = session.current\n session.current = null\n if (!s) return\n clearInterval(s.timer)\n void s.ctx.close().catch(() => undefined)\n }, [])\n\n useEffect(() => halt, [halt])\n\n const play = useCallback(\n async (fromMs: number) => {\n halt()\n const opened = await open()\n const ctx = new AudioContext()\n const s = {\n ctx,\n ctxStart: ctx.currentTime + 0.25,\n seekMs: fromMs,\n scheduled: new Set<string>(),\n timer: 0 as unknown as ReturnType<typeof setInterval>,\n }\n const schedule = async (part: TimelinePart) => {\n const track = (opened.recording.tracks ?? []).find((t) => t.external_id === part.trackExtId)\n const key = opened.keys.get(part.trackExtId)\n const raw = track?.parts?.find((p) => p.seq === part.seq)\n if (!track || !key || !raw) return\n try {\n const bytes = await fetchPart(arbi, raw, key)\n const buffer = await ctx.decodeAudioData(standalone(bytes).buffer)\n if (session.current !== s) return\n const at = schedulePart({\n partOffsetMs: part.offsetMs,\n bufferDurationS: buffer.duration,\n ctxStart: s.ctxStart,\n seekMs: s.seekMs,\n ctxNow: ctx.currentTime,\n })\n if (!at) return\n const source = ctx.createBufferSource()\n source.buffer = buffer\n source.connect(ctx.destination)\n source.start(at.when, at.offset)\n } catch (err) {\n console.warn('[calls] a recording part does not play', err)\n }\n }\n const tick = () => {\n if (session.current !== s) return\n const head = playheadAt(ctx.currentTime, s.ctxStart, s.seekMs)\n setPosition(Math.min(head, durationMs))\n if (head >= durationMs) {\n halt()\n setPlaying(false)\n return\n }\n for (const part of partsDue(parts, head, PLAYBACK_LOOKAHEAD_MS, s.scheduled)) {\n s.scheduled.add(partKey(part))\n void schedule(part)\n }\n }\n s.timer = setInterval(tick, 500)\n session.current = s\n setPlaying(true)\n tick()\n },\n [arbi, open, parts, durationMs, halt]\n )\n\n const toggle = () => {\n if (playing) {\n halt()\n setPlaying(false)\n } else {\n void play(position >= durationMs ? 0 : position).catch((err: unknown) => {\n setPlaying(false)\n notify((err as Error).message, 'error')\n })\n }\n }\n\n return (\n <div className=\"flex items-center gap-2\">\n <Button\n type=\"button\"\n size=\"icon\"\n variant=\"outline\"\n className=\"size-7\"\n aria-label={playing ? 'Pause' : 'Play'}\n onClick={toggle}\n data-testid=\"recording-mix-toggle\"\n >\n {playing ? <Pause className=\"size-3.5\" /> : <Play className=\"size-3.5\" />}\n </Button>\n <input\n type=\"range\"\n min={0}\n max={Math.max(1, durationMs)}\n step={1000}\n value={position}\n className=\"flex-1\"\n aria-label=\"Position\"\n onChange={(e) => {\n const ms = Number(e.target.value)\n setPosition(ms)\n if (playing) {\n void play(ms).catch((err: unknown) => notify((err as Error).message, 'error'))\n }\n }}\n />\n <span className=\"tabular-nums text-muted-foreground\">\n {fmt(position)} / {fmt(durationMs)}\n </span>\n </div>\n )\n}\n","/**\n * A thread call's log card in the thread transcript: the `convo_events` row of kind `call` the\n * server writes when the call starts and updates when it ends (plaintext ids and times only).\n *\n * live: \"Call started by Ada · invited Bob, Cy\" · Join\n * ended: \"Call · 12 min · joined Ada, Bob\" · Open meeting chat\n *\n * It re-reads on `call.started` / `call.ended` (see `refreshCallCards`).\n */\n\nimport { useArbi, useCallSession, useCall, useOpenCallMeetingChat, openCall } from '@arbidocs/react'\nimport { useState, type ReactElement } from 'react'\nimport { MessageSquare, Phone, PhoneOff } from 'lucide-react'\nimport { Button } from '@arbidocs/react/ui'\nimport { formatCallDuration, type CallLogDetail } from '../call-cards'\n\nfunction joinNames(people: string[], name: (id: string) => string): string {\n const names = people.map(name)\n return names.length > 4\n ? `${names.slice(0, 4).join(', ')} +${names.length - 4}`\n : names.join(', ')\n}\n\nexport function ThreadCallLogCard({\n detail,\n name,\n workspaceExtId,\n time,\n}: {\n detail: CallLogDetail\n /** A person's display name by user ext id. */\n name: (userExtId: string) => string\n /** The thread's workspace (the meeting thread lives there too). */\n workspaceExtId: string | null\n time?: string\n}): ReactElement {\n const arbi = useArbi()\n const openCallMeetingChat = useOpenCallMeetingChat()\n const live = !detail.ended_at\n const inThisCall = useCallSession((s) => s.active?.callExtId === detail.call_ext_id)\n const inAnotherCall = useCallSession(\n (s) => !!s.active && s.active.callExtId !== detail.call_ext_id\n )\n // Only people holding K (the creator and those rung) can join from the card.\n const { data: call } = useCall(live ? detail.call_ext_id : null)\n const invitedOnly = live && !!call && !call.my_sealed_key\n const [busy, setBusy] = useState(false)\n\n const summary = live\n ? [\n detail.started_by ? `Call started by ${name(detail.started_by)}` : 'Call started',\n detail.invited.length ? `invited ${joinNames(detail.invited, name)}` : null,\n ]\n : [\n 'Call',\n formatCallDuration(detail.duration_s),\n detail.joined.length ? `joined ${joinNames(detail.joined, name)}` : null,\n ]\n\n return (\n <div\n className=\"mx-auto my-1 flex w-fit max-w-full flex-wrap items-center justify-center gap-2 rounded-md border border-border bg-card px-3 py-2 text-xs\"\n data-testid=\"thread-call-log-card\"\n data-live={live || undefined}\n >\n {live ? (\n <Phone className=\"size-4 animate-pulse text-green-text\" aria-hidden />\n ) : (\n <PhoneOff className=\"size-4 text-muted-foreground\" aria-hidden />\n )}\n <span data-testid=\"thread-call-log-summary\">{summary.filter(Boolean).join(' · ')}</span>\n {time && <time className=\"text-muted-foreground\">{time}</time>}\n {live ? (\n <Button\n type=\"button\"\n size=\"sm\"\n className=\"h-7 bg-green-600 text-white hover:bg-green-700\"\n disabled={busy || inThisCall || inAnotherCall || invitedOnly}\n title={\n invitedOnly\n ? 'Only the people rung into this call can join'\n : inAnotherCall\n ? 'You are already in a call'\n : undefined\n }\n onClick={() => {\n setBusy(true)\n void openCall(arbi, { callExtId: detail.call_ext_id }).finally(() => setBusy(false))\n }}\n data-testid=\"thread-call-log-join\"\n >\n {inThisCall ? 'In call' : 'Join'}\n </Button>\n ) : (\n <Button\n type=\"button\"\n size=\"sm\"\n variant=\"outline\"\n className=\"h-7\"\n onClick={() =>\n void openCallMeetingChat({\n callExtId: detail.call_ext_id,\n meetingConversationExtId: detail.meeting_conversation_ext_id,\n workspaceExtId,\n })\n }\n data-testid=\"thread-call-log-open-chat\"\n >\n <MessageSquare className=\"mr-1 size-3.5\" aria-hidden />\n Open meeting chat\n </Button>\n )}\n </div>\n )\n}\n"]}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/calls/voice-levels.ts","../src/calls/call-status.ts"],"names":["prev","id","listeners","subscribe","useSyncExternalStore"],"mappings":"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","file":"chunk-CHQMVIHR.js","sourcesContent":["/**\n * Who is talking, fast: each participant's microphone level, measured in this browser from the\n * audio it already plays (WebAudio analysers, ~60 ms), not from the media server's slower\n * active-speaker events. One store for the whole app, so the call panel (rings, spotlight, live\n * speaker list) and the conversation beside it (the transcript line being spoken) agree.\n *\n * The store is plain data; `startVoiceLevels` (used by the call room) feeds it.\n */\n\nimport { useSyncExternalStore } from 'react'\nimport { INITIAL_SPOTLIGHT, SPEAKING_LEVEL, nextSpotlight, type SpotlightState } from './layout'\n\n/** Sampling period. */\nexport const LEVEL_TICK_MS = 60\n/** A voice stays \"speaking\" this long after it drops below the threshold (no flicker between words). */\nconst SPEAKING_RELEASE_MS = 350\n\ninterface Snapshot {\n /** identity → level 0..1, rounded to 0.05. */\n levels: Readonly<Record<string, number>>\n /** Talking now, loudest first. */\n speaking: readonly string[]\n /** The speaker view's spotlight (with hysteresis). */\n spotlight: string | null\n}\n\nconst EMPTY: Snapshot = { levels: {}, speaking: [], spotlight: null }\nlet snapshot: Snapshot = EMPTY\nconst listeners = new Set<() => void>()\n\nfunction publish(next: Snapshot) {\n snapshot = next\n listeners.forEach((fn) => fn())\n}\n\nfunction subscribe(fn: () => void): () => void {\n listeners.add(fn)\n return () => listeners.delete(fn)\n}\n\nconst get = () => snapshot\n\n/** My voice level (0..1, in 0.05 steps) — re-renders only when it changes. */\nexport function useVoiceLevel(identity: string | null | undefined): number {\n return useSyncExternalStore(\n subscribe,\n () => (identity ? (get().levels[identity] ?? 0) : 0),\n () => 0\n )\n}\n\n/** Everyone's level (re-renders at the level rate: for small lists). */\nexport function useVoiceLevels(): Readonly<Record<string, number>> {\n return useSyncExternalStore(\n subscribe,\n () => get().levels,\n () => EMPTY.levels\n )\n}\n\nexport function useIsSpeaking(identity: string | null | undefined): boolean {\n return useSyncExternalStore(\n subscribe,\n () => (identity ? get().speaking.includes(identity) : false),\n () => false\n )\n}\n\n/** Identities talking now, loudest first (a stable string key, split by the caller). */\nexport function useSpeakingIds(): string[] {\n const key = useSyncExternalStore(\n subscribe,\n () => get().speaking.join('\\n'),\n () => ''\n )\n return key ? key.split('\\n') : []\n}\n\nexport function useSpotlightId(): string | null {\n return useSyncExternalStore(\n subscribe,\n () => get().spotlight,\n () => null\n )\n}\n\n/** A track to measure: whose it is, and its audio. */\nexport interface VoiceSource {\n identity: string\n track: MediaStreamTrack | null\n /** Mic muted / off: level 0 without measuring. */\n muted: boolean\n /** Me: measured (my ring, \"Speaking: … (me)\") but never put in the spotlight. */\n local?: boolean\n}\n\ninterface Meter {\n track: MediaStreamTrack\n source: MediaStreamAudioSourceNode\n analyser: AnalyserNode\n buf: Float32Array<ArrayBuffer>\n}\n\n/**\n * Measure the given sources every {@link LEVEL_TICK_MS} until stopped. `sources()` is read each\n * tick, so the caller can hand over a ref to its current track list.\n */\nexport function startVoiceLevels(sources: () => VoiceSource[]): () => void {\n let ctx: AudioContext | null = null\n try {\n ctx = typeof AudioContext !== 'undefined' ? new AudioContext() : null\n } catch {\n ctx = null\n }\n const meters = new Map<string, Meter>()\n const smoothed = new Map<string, number>()\n const loudAt = new Map<string, number>()\n let spot: SpotlightState = INITIAL_SPOTLIGHT\n\n const meterFor = (s: VoiceSource): Meter | null => {\n if (!ctx || !s.track || s.track.readyState === 'ended') return null\n const have = meters.get(s.identity)\n if (have && have.track === s.track) return have\n have?.source.disconnect()\n try {\n const source = ctx.createMediaStreamSource(new MediaStream([s.track]))\n const analyser = ctx.createAnalyser()\n analyser.fftSize = 512\n source.connect(analyser)\n const m = { track: s.track, source, analyser, buf: new Float32Array(analyser.fftSize) }\n meters.set(s.identity, m)\n return m\n } catch {\n return null\n }\n }\n\n const tick = () => {\n if (ctx?.state === 'suspended') void ctx.resume().catch(() => undefined)\n const now = Date.now()\n const list = sources()\n const seen = new Set<string>()\n const levels: Record<string, number> = {}\n for (const s of list) {\n seen.add(s.identity)\n let raw = 0\n const m = s.muted ? null : meterFor(s)\n if (m) {\n m.analyser.getFloatTimeDomainData(m.buf)\n let sum = 0\n for (let i = 0; i < m.buf.length; i++) sum += m.buf[i] * m.buf[i]\n raw = Math.min(1, Math.sqrt(sum / m.buf.length) * 5)\n }\n // Fast attack, gentle release.\n const prev = smoothed.get(s.identity) ?? 0\n const level = raw >= prev ? raw : prev * 0.8 + raw * 0.2\n smoothed.set(s.identity, level)\n if (level >= SPEAKING_LEVEL) loudAt.set(s.identity, now)\n levels[s.identity] = Math.round(level * 20) / 20\n }\n for (const id of [...meters.keys()]) {\n if (!seen.has(id)) {\n meters.get(id)?.source.disconnect()\n meters.delete(id)\n smoothed.delete(id)\n loudAt.delete(id)\n }\n }\n const speaking = list\n .map((s) => s.identity)\n .filter((id) => now - (loudAt.get(id) ?? -Infinity) <= SPEAKING_RELEASE_MS)\n .sort((a, b) => (smoothed.get(b) ?? 0) - (smoothed.get(a) ?? 0))\n spot = nextSpotlight(spot, Object.fromEntries(smoothed), now, {\n exclude: list.filter((s) => s.local).map((s) => s.identity),\n })\n if (spot.id && !seen.has(spot.id)) spot = INITIAL_SPOTLIGHT\n const prev = snapshot\n const same =\n prev.spotlight === spot.id &&\n prev.speaking.join('\\n') === speaking.join('\\n') &&\n Object.keys(levels).length === Object.keys(prev.levels).length &&\n Object.entries(levels).every(([k, v]) => prev.levels[k] === v)\n if (!same) publish({ levels, speaking, spotlight: spot.id })\n }\n\n const id = setInterval(tick, LEVEL_TICK_MS)\n return () => {\n clearInterval(id)\n for (const m of meters.values()) m.source.disconnect()\n meters.clear()\n void ctx?.close().catch(() => undefined)\n publish(EMPTY)\n }\n}\n","/**\n * The call I am in, as the rest of the app needs it (its conversation's empty state and\n * provisional transcript rows): which call, and whether it is being transcribed. Published by the\n * call room; plain data, no LiveKit.\n */\n\nimport { useSyncExternalStore } from 'react'\n\ninterface CallStatus {\n callExtId: string | null\n transcribing: boolean\n}\n\nlet status: CallStatus = { callExtId: null, transcribing: false }\nconst listeners = new Set<() => void>()\n\nexport function publishCallStatus(next: CallStatus): void {\n if (next.callExtId === status.callExtId && next.transcribing === status.transcribing) return\n status = next\n listeners.forEach((fn) => fn())\n}\n\nfunction subscribe(fn: () => void): () => void {\n listeners.add(fn)\n return () => listeners.delete(fn)\n}\n\n/** Whether I am in this call, and whether it is transcribed. */\nexport function useMyCallStatus(callExtId: string | null | undefined): {\n inCall: boolean\n transcribing: boolean\n} {\n const inCall = useSyncExternalStore(\n subscribe,\n () => !!callExtId && status.callExtId === callExtId,\n () => false\n )\n const transcribing = useSyncExternalStore(\n subscribe,\n () => !!callExtId && status.callExtId === callExtId && status.transcribing,\n () => false\n )\n return { inCall, transcribing }\n}\n"]}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/dashboards/DashboardGrid.tsx","../src/dashboards/ChartRenderer.tsx","../src/dashboards/PanelView.tsx","../src/connection/dashboards/DashboardPanel.tsx","../src/connection/dashboards/PanelEditor.tsx"],"names":["jsx","cn","lazy","jsxs","sliceColors","useState","useId","Suspense","formatterOf","fmtDate","DataTable","AlertTriangle","ChartNoAxesColumn","MetricCard","Card","DEFAULT_UNIT_FORMATTERS","formatGbp","formatBytes","useBlocksEnvironment","usePanelDataset","useMemo","metricValueOf","chartModelOf","Button","useDataSources","Label","Select","SelectTrigger","SelectValue","SelectContent","SelectItem","Fragment","x","Switch","Input","X","Plus"],"mappings":"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","file":"chunk-D35EHOK5.cjs","sourcesContent":["/**\n * `DashboardGrid`: a responsive 12-column grid of panels. Each child spans `width` columns on a wide\n * screen and the full width on a phone, where panels stack in order.\n */\nimport type { ReactNode } from 'react'\nimport { cn } from '@arbidocs/react/ui'\n\n/** Literal classes (the stylesheet is generated from the source): `md:col-span-1…12`. */\nconst SPANS = [\n 'md:col-span-1',\n 'md:col-span-2',\n 'md:col-span-3',\n 'md:col-span-4',\n 'md:col-span-5',\n 'md:col-span-6',\n 'md:col-span-7',\n 'md:col-span-8',\n 'md:col-span-9',\n 'md:col-span-10',\n 'md:col-span-11',\n 'md:col-span-12',\n] as const\n\n/** A width in grid columns, kept within 1…12 (default 6, half the row). */\nexport function clampPanelWidth(width: number | undefined): number {\n return Math.min(12, Math.max(1, Math.round(width ?? 6)))\n}\n\nexport interface DashboardGridProps {\n children?: ReactNode\n className?: string\n testId?: string\n}\n\n/** The grid. Wrap each panel in a `DashboardCell`. */\nexport function DashboardGrid({ children, className, testId }: DashboardGridProps) {\n return (\n <div\n className={cn('grid grid-cols-1 gap-4 md:grid-cols-12', className)}\n data-slot=\"dashboard\"\n data-testid={testId}\n >\n {children}\n </div>\n )\n}\n\n/** One cell of the grid, `width` columns wide on a wide screen. */\nexport function DashboardCell({\n width,\n children,\n className,\n}: {\n width?: number\n children?: ReactNode\n className?: string\n}) {\n return (\n <div\n className={cn('col-span-1 min-w-0', SPANS[clampPanelWidth(width) - 1], className)}\n data-slot=\"dashboard-cell\"\n >\n {children}\n </div>\n )\n}\n","/**\n * `ChartRenderer`: draws a `ChartModel`. The drawing library is loaded on demand (a skeleton shows\n * meanwhile), so a page fetches it only when a chart is on screen. Beside the drawing: a legend in\n * the theme's text colours, and a table of the same values one click away (for screen readers,\n * copying, or when colours are hard to tell apart).\n */\nimport { lazy, Suspense, useId, useState } from 'react'\nimport { cn } from '@arbidocs/react/ui'\nimport { sliceColors, type ChartModel } from './chartModel'\n\nconst RechartsRenderer = lazy(() => import('./RechartsRenderer'))\n\nexport interface ChartRendererLabels {\n showTable: string\n showChart: string\n other: string\n}\n\nexport const DEFAULT_CHART_RENDERER_LABELS: ChartRendererLabels = {\n showTable: 'Show table',\n showChart: 'Show chart',\n other: 'Other',\n}\n\nexport interface ChartRendererProps {\n model: ChartModel\n ariaLabel: string\n /** The plot's height in px. Default 240. */\n height?: number\n /** Start on the table. */\n defaultView?: 'chart' | 'table'\n labels?: Partial<ChartRendererLabels>\n className?: string\n testId?: string\n}\n\n/** The values as a table: a row per category, a column per series. */\nexport function ChartTable({\n model,\n caption,\n id,\n}: {\n model: ChartModel\n caption: string\n id?: string\n}) {\n return (\n <div className=\"max-h-72 overflow-auto\">\n <table id={id} className=\"w-full text-left text-xs\" data-slot=\"chart-table\">\n <caption className=\"sr-only\">{caption}</caption>\n <thead>\n <tr className=\"border-b border-border text-muted-foreground\">\n <th scope=\"col\" className=\"py-1.5 pr-3 font-medium\">\n {model.xLabel}\n </th>\n {model.series.map((s) => (\n <th key={s.id} scope=\"col\" className=\"py-1.5 pr-3 text-right font-medium\">\n {s.label}\n </th>\n ))}\n </tr>\n </thead>\n <tbody>\n {model.categories.map((category, i) => (\n <tr key={`${category}-${i}`} className=\"border-b border-border/60 last:border-0\">\n <th scope=\"row\" className=\"py-1.5 pr-3 font-normal text-foreground\">\n {category}\n </th>\n {model.series.map((s) => (\n <td key={s.id} className=\"py-1.5 pr-3 text-right tabular-nums text-foreground\">\n {s.values[i] === null ? '–' : model.format(s.values[i] as number)}\n </td>\n ))}\n </tr>\n ))}\n </tbody>\n </table>\n </div>\n )\n}\n\nfunction Legend({ model, other }: { model: ChartModel; other: string }) {\n const pie = model.type === 'pie' || model.type === 'donut'\n const items = pie\n ? model.categories.map((label, i) => ({ label, color: sliceColors(model, other)[i] }))\n : model.series.map((s) => ({ label: s.label, color: s.color }))\n if (!pie && items.length < 2) return null\n return (\n <ul className=\"flex flex-wrap justify-center gap-x-4 gap-y-1 text-xs text-muted-foreground\">\n {items.map((item, i) => (\n <li key={`${item.label}-${i}`} className=\"inline-flex items-center gap-1.5\">\n <span\n aria-hidden=\"true\"\n className=\"inline-block size-2 rounded-full\"\n style={{ background: item.color }}\n />\n {item.label}\n </li>\n ))}\n </ul>\n )\n}\n\nexport function ChartRenderer({\n model,\n ariaLabel,\n height = 240,\n defaultView = 'chart',\n labels,\n className,\n testId,\n}: ChartRendererProps) {\n const l = { ...DEFAULT_CHART_RENDERER_LABELS, ...labels }\n const [view, setView] = useState(defaultView)\n const tableId = useId()\n return (\n <figure\n className={cn('flex min-w-0 max-w-full flex-col gap-2', className)}\n data-slot=\"dashboard-chart\"\n data-type={model.type}\n data-testid={testId}\n >\n {view === 'table' ? (\n <ChartTable model={model} caption={ariaLabel} id={tableId} />\n ) : (\n <div className=\"min-w-0\" style={{ height }} role=\"figure\" aria-label={ariaLabel}>\n <Suspense\n fallback={\n <div\n className=\"size-full animate-pulse rounded-md bg-muted\"\n data-slot=\"chart-loading\"\n />\n }\n >\n <RechartsRenderer\n model={model}\n ariaLabel={ariaLabel}\n height={height}\n otherLabel={l.other}\n />\n </Suspense>\n </div>\n )}\n <figcaption className=\"flex flex-wrap items-center justify-between gap-2\">\n <Legend model={model} other={l.other} />\n <button\n type=\"button\"\n className=\"ml-auto rounded-sm text-xs text-muted-foreground underline-offset-2 hover:text-foreground hover:underline focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring print:hidden\"\n aria-controls={view === 'table' ? tableId : undefined}\n aria-pressed={view === 'table'}\n onClick={() => setView(view === 'table' ? 'chart' : 'table')}\n >\n {view === 'table' ? l.showChart : l.showTable}\n </button>\n </figcaption>\n </figure>\n )\n}\n","/**\n * `PanelView`: one dashboard panel as it looks, from data already in hand: a metric tile, a chart\n * or a table, each with its loading, empty and error state. Presentational: `DashboardPanel` reads\n * the data and renders this.\n */\nimport type { ReactNode } from 'react'\nimport { AlertTriangle, ChartNoAxesColumn } from 'lucide-react'\nimport type { DatasetField, DatasetRow, DatasetValue } from '@arbidocs/react'\nimport { Card, cn } from '@arbidocs/react/ui'\nimport { DataTable, type Column } from '../components/DataTable'\nimport { MetricCard } from '../components/MetricCard'\nimport { fmtDate } from '../lib/format'\nimport { ChartRenderer, ChartTable, type ChartRendererLabels } from './ChartRenderer'\nimport { formatterOf, type ChartModel, type UnitFormatters } from './chartModel'\n\nexport type PanelState = 'loading' | 'empty' | 'error' | 'ready'\n\nexport interface PanelViewLabels extends ChartRendererLabels {\n empty: string\n error: string\n /** Under a table cut short: \"Showing 50 of 1,200 rows\". */\n showingRows: (shown: number, total: number) => string\n yes: string\n no: string\n}\n\nexport const DEFAULT_PANEL_VIEW_LABELS: PanelViewLabels = {\n showTable: 'Show table',\n showChart: 'Show chart',\n other: 'Other',\n empty: 'Nothing to show yet.',\n error: 'This panel could not be loaded.',\n showingRows: (shown, total) =>\n `Showing ${shown.toLocaleString('en-GB')} of ${total.toLocaleString('en-GB')} rows`,\n yes: 'Yes',\n no: 'No',\n}\n\n/** What a panel shows when ready. */\nexport type PanelBody =\n | { kind: 'metric'; value: number | null; format: (value: number) => string }\n | { kind: 'chart'; model: ChartModel }\n /** A table of groups (a chart model shown as a table). */\n | { kind: 'groups'; model: ChartModel }\n /** A table of records. */\n | { kind: 'records'; fields: readonly DatasetField[]; rows: readonly DatasetRow[] }\n\nexport interface PanelViewProps {\n /** What the panel is (it shows as one before its data is in). */\n kind: 'metric' | 'chart' | 'table'\n title: string\n description?: string\n state: PanelState\n body?: PanelBody\n /** The error's own words, shown under the panel's. */\n errorDetail?: string\n /** Shown in the empty state (a link to where data comes from). */\n emptyAction?: ReactNode\n /** Buttons in the panel's corner (edit, remove), for a dashboard being edited. */\n actions?: ReactNode\n /** A metric's tile, with the theme accent token of its icon. */\n metricAccent?: string\n /** `card` (default): a card with the title; `plain`: no card (a chart placed in a page). */\n variant?: 'card' | 'plain'\n /** Most records a table shows. Default 50. */\n maxRows?: number\n formatters?: UnitFormatters\n labels?: Partial<PanelViewLabels>\n className?: string\n testId?: string\n}\n\nfunction cellText(\n value: DatasetValue | undefined,\n field: DatasetField,\n l: PanelViewLabels,\n formatters?: UnitFormatters\n): string {\n if (value === null || value === undefined || value === '') return '–'\n if (Array.isArray(value)) return value.join(', ')\n if (typeof value === 'boolean') return value ? l.yes : l.no\n if (field.type === 'number' && typeof value === 'number')\n return formatterOf(field, formatters)(value)\n if (field.type === 'date' && typeof value === 'string') return fmtDate(value)\n return String(value)\n}\n\nfunction RecordsTable({\n fields,\n rows,\n maxRows,\n l,\n formatters,\n testId,\n}: {\n fields: readonly DatasetField[]\n rows: readonly DatasetRow[]\n maxRows: number\n l: PanelViewLabels\n formatters?: UnitFormatters\n testId?: string\n}) {\n const shown = rows.slice(0, maxRows).map((row, i) => ({ row, i }))\n const columns: Column<{ row: DatasetRow; i: number }>[] = fields.map((field) => ({\n key: field.id,\n header: field.label,\n align: field.type === 'number' ? 'right' : 'left',\n render: ({ row }) => cellText(row[field.id], field, l, formatters),\n className: field.type === 'number' ? 'tabular-nums' : undefined,\n }))\n return (\n <div className=\"space-y-1\">\n <div className=\"max-h-80 overflow-auto\">\n <DataTable\n columns={columns}\n rows={shown}\n getRowId={({ i }) => String(i)}\n area={testId ?? 'dashboard-panel'}\n emptyTitle={l.empty}\n className=\"border-0\"\n />\n </div>\n {rows.length > maxRows && (\n <p className=\"text-xs text-muted-foreground\">{l.showingRows(maxRows, rows.length)}</p>\n )}\n </div>\n )\n}\n\nfunction Message({\n tone,\n text,\n detail,\n action,\n testId,\n}: {\n tone: 'empty' | 'error'\n text: string\n detail?: string\n action?: ReactNode\n testId?: string\n}) {\n const Icon = tone === 'error' ? AlertTriangle : ChartNoAxesColumn\n return (\n <div\n className=\"flex min-h-40 flex-col items-center justify-center gap-2 py-6 text-center\"\n role={tone === 'error' ? 'alert' : undefined}\n data-testid={testId}\n >\n <Icon\n className={cn('size-6', tone === 'error' ? 'text-destructive' : 'text-muted-foreground/50')}\n />\n <p className={cn('text-sm', tone === 'error' ? 'text-destructive' : 'text-muted-foreground')}>\n {text}\n </p>\n {detail && <p className=\"max-w-sm text-xs text-muted-foreground\">{detail}</p>}\n {action}\n </div>\n )\n}\n\nexport function PanelView({\n kind,\n title,\n description,\n state,\n body,\n errorDetail,\n emptyAction,\n actions,\n metricAccent,\n variant = 'card',\n maxRows = 50,\n formatters,\n labels,\n className,\n testId,\n}: PanelViewProps) {\n const l = { ...DEFAULT_PANEL_VIEW_LABELS, ...labels }\n\n // A metric is the KPI tile itself.\n if (kind === 'metric') {\n const metric = body?.kind === 'metric' ? body : undefined\n const hint =\n state === 'error' ? (\n <span className=\"text-destructive\">\n {l.error}\n {errorDetail && ` ${errorDetail}`}\n </span>\n ) : state === 'empty' ? (\n l.empty\n ) : (\n description\n )\n return (\n <div className={cn('relative h-full', className)} data-slot=\"dashboard-panel\">\n <MetricCard\n label={title}\n value={\n metric && metric.value !== null && state === 'ready' ? metric.format(metric.value) : '—'\n }\n hint={hint}\n isLoading={state === 'loading'}\n accent={metricAccent}\n className=\"h-full\"\n testId={testId}\n />\n {actions && <div className=\"absolute right-2 top-2 flex gap-1\">{actions}</div>}\n </div>\n )\n }\n\n let content: ReactNode\n if (state === 'loading') {\n content = (\n <div className=\"h-60 animate-pulse rounded-md bg-muted\" data-slot=\"panel-loading\" aria-busy />\n )\n } else if (state === 'error') {\n content = (\n <Message\n tone=\"error\"\n text={l.error}\n detail={errorDetail}\n testId={testId && `${testId}-error`}\n />\n )\n } else if (state === 'empty' || !body || body.kind === 'metric') {\n content = (\n <Message\n tone=\"empty\"\n text={l.empty}\n action={emptyAction}\n testId={testId && `${testId}-empty`}\n />\n )\n } else if (body.kind === 'chart') {\n content = (\n <ChartRenderer\n model={body.model}\n ariaLabel={title}\n labels={l}\n testId={testId && `${testId}-chart`}\n />\n )\n } else if (body.kind === 'groups') {\n content = <ChartTable model={body.model} caption={title} />\n } else {\n content = (\n <RecordsTable\n fields={body.fields}\n rows={body.rows}\n maxRows={maxRows}\n l={l}\n formatters={formatters}\n testId={testId}\n />\n )\n }\n\n const header = (\n <div className=\"flex items-start justify-between gap-3\">\n <div className=\"min-w-0\">\n <h3 className=\"truncate text-sm font-semibold text-foreground\">{title}</h3>\n {description && <p className=\"mt-0.5 text-xs text-muted-foreground\">{description}</p>}\n </div>\n {actions && <div className=\"flex shrink-0 gap-1\">{actions}</div>}\n </div>\n )\n if (variant === 'plain') {\n return (\n <section\n className={cn('flex min-w-0 flex-col gap-3', className)}\n data-slot=\"dashboard-panel\"\n data-testid={testId}\n aria-busy={state === 'loading' || undefined}\n >\n {header}\n <div className=\"min-w-0\">{content}</div>\n </section>\n )\n }\n return (\n <Card\n variant=\"elevated\"\n className={cn('flex h-full min-w-0 flex-col gap-3 rounded-xl p-5', className)}\n data-slot=\"dashboard-panel\"\n data-testid={testId}\n aria-busy={state === 'loading' || undefined}\n >\n {header}\n <div className=\"min-w-0 flex-1\">{content}</div>\n </Card>\n )\n}\n","/**\n * `DashboardPanel`: one panel of a dashboard, from its `PanelSpec`. It looks its source up in the\n * host's registry (`useDataSources`), reads the dataset the spec asks for (`usePanelDataset`:\n * grouped and measured by the source) and shows it through `PanelView`.\n */\nimport { useMemo, type ReactNode } from 'react'\nimport {\n formatGbp,\n useDataSources,\n usePanelDataset,\n type DataSource,\n type PanelSpec,\n} from '@arbidocs/react'\nimport { Button } from '@arbidocs/react/ui'\nimport { useBlocksEnvironment } from '../../provider/environment'\nimport { formatBytes } from '../storage/storage-labels'\nimport {\n chartModelOf,\n DEFAULT_UNIT_FORMATTERS,\n formatterOf,\n metricValueOf,\n type DrawnChartType,\n type UnitFormatters,\n} from '../../dashboards/chartModel'\nimport { PanelView, type PanelBody, type PanelViewLabels } from '../../dashboards/PanelView'\n\n/** The package's formatters: the one £ formatter for AI usage, and file sizes. */\nexport const PANEL_FORMATTERS: UnitFormatters = {\n ...DEFAULT_UNIT_FORMATTERS,\n gbp: (v) => formatGbp(v),\n bytes: (v) => formatBytes(v),\n}\n\nexport interface DashboardPanelLabels extends PanelViewLabels {\n /** A panel whose source the host does not offer. */\n unknownSource: (id: string) => string\n /** The empty state's link to the databases (where data is created or imported). */\n openDatabases: string\n}\n\nexport const DEFAULT_DASHBOARD_PANEL_LABELS: Partial<DashboardPanelLabels> = {\n unknownSource: (id) => `This panel reads “${id}”, which is not available here.`,\n openDatabases: 'Open databases',\n}\n\nexport interface DashboardPanelProps {\n panel: PanelSpec\n /** Buttons in the panel's corner (a dashboard being edited). */\n actions?: ReactNode\n /** Don't read data (an editor showing the panel's frame only). */\n enabled?: boolean\n /** `plain`: no card around it (a chart placed in a page). */\n variant?: 'card' | 'plain'\n formatters?: UnitFormatters\n labels?: Partial<DashboardPanelLabels>\n className?: string\n testId?: string\n}\n\nconst DRAWN = new Set(['bar', 'line', 'area', 'pie', 'donut'])\n\nfunction kindOf(panel: PanelSpec): 'metric' | 'chart' | 'table' {\n return panel.chart.type === 'metric' ? 'metric' : panel.chart.type === 'table' ? 'table' : 'chart'\n}\n\nfunction SourcePanel({\n source,\n panel,\n actions,\n enabled,\n variant,\n formatters,\n labels,\n className,\n testId,\n}: DashboardPanelProps & { source: DataSource; labels: Partial<DashboardPanelLabels> }) {\n const environment = useBlocksEnvironment()\n const { chart } = panel\n const { dataset, fields, isLoading, error } = usePanelDataset(\n source,\n panel.source.params,\n chart,\n { enabled }\n )\n const body = useMemo((): PanelBody | undefined => {\n if (!dataset) return undefined\n const other = labels.other\n if (chart.type === 'metric') {\n const valueField = dataset.fields.find((f) => f.id === 'value')\n // Nothing matched: a count or a sum of nothing is 0; an average of nothing has no value.\n const op = chart.aggregate ?? 'count'\n return {\n kind: 'metric',\n value: metricValueOf(dataset) ?? (op === 'count' || op === 'sum' ? 0 : null),\n format: formatterOf(valueField, formatters),\n }\n }\n if (DRAWN.has(chart.type)) {\n return {\n kind: 'chart',\n model: chartModelOf({ ...chart, type: chart.type as DrawnChartType }, dataset, {\n fields,\n formatters,\n otherLabel: other,\n }),\n }\n }\n if (chart.x) {\n return {\n kind: 'groups',\n model: chartModelOf({ ...chart, type: 'bar' }, dataset, {\n fields,\n formatters,\n otherLabel: other,\n }),\n }\n }\n const shown = chart.columns?.length\n ? chart.columns.flatMap((id) => dataset.fields.filter((f) => f.id === id))\n : dataset.fields\n return { kind: 'records', fields: shown, rows: dataset.rows }\n }, [dataset, chart, fields, formatters, labels.other])\n\n const state = error\n ? 'error'\n : !dataset\n ? isLoading\n ? 'loading'\n : 'empty'\n : chart.type !== 'metric' && dataset.rows.length === 0\n ? 'empty'\n : 'ready'\n\n const emptyAction =\n source.id === 'database' && environment.openDatabases ? (\n <Button variant=\"outline\" size=\"sm\" onClick={() => environment.openDatabases?.()}>\n {labels.openDatabases}\n </Button>\n ) : undefined\n\n return (\n <PanelView\n kind={kindOf(panel)}\n title={panel.title}\n description={panel.description}\n state={state}\n body={body}\n errorDetail={error instanceof Error ? error.message : undefined}\n emptyAction={emptyAction}\n actions={actions}\n variant={variant}\n formatters={formatters}\n labels={labels}\n className={className}\n testId={testId}\n />\n )\n}\n\nexport function DashboardPanel({\n formatters = PANEL_FORMATTERS,\n labels,\n ...props\n}: DashboardPanelProps) {\n const registry = useDataSources()\n const l = { ...DEFAULT_DASHBOARD_PANEL_LABELS, ...labels }\n const source = registry.get(props.panel.source.id)\n if (!source) {\n return (\n <PanelView\n kind={kindOf(props.panel)}\n title={props.panel.title}\n state=\"error\"\n errorDetail={l.unknownSource?.(props.panel.source.id)}\n actions={props.actions}\n labels={l}\n className={props.className}\n testId={props.testId}\n />\n )\n }\n // Keyed by source: a source's hooks differ from another's, so a new source mounts afresh.\n return (\n <SourcePanel key={source.id} source={source} formatters={formatters} labels={l} {...props} />\n )\n}\n","/**\n * `PanelEditor`: build a panel without code. Pick a source (and its parameters: a database, one of\n * its saved views), how to show it, then what to group by, split by and measure, from the source's\n * own fields. Every choice is a field of the `PanelSpec`, previewed live underneath.\n */\nimport { useId, useMemo, type ReactNode } from 'react'\nimport { Plus, X } from 'lucide-react'\nimport {\n useDataSources,\n type AggregateOp,\n type ChartSpec,\n type ChartType,\n type DataSource,\n type DataSourceParam,\n type DataSourceParams,\n type DatasetField,\n type DatasetFilter,\n type DatasetSort,\n type FilterOp,\n type PanelSpec,\n type TimeBucket,\n} from '@arbidocs/react'\nimport {\n Button,\n cn,\n Input,\n Label,\n Select,\n SelectContent,\n SelectItem,\n SelectTrigger,\n SelectValue,\n Switch,\n} from '@arbidocs/react/ui'\nimport { clampPanelWidth } from '../../dashboards/DashboardGrid'\nimport { DashboardPanel } from './DashboardPanel'\n\nexport interface PanelEditorLabels {\n title: string\n description: string\n source: string\n showAs: string\n types: Record<ChartType, string>\n groupBy: string\n groupByNone: string\n /** A table without \"group by\" lists the records. */\n groupByRecords: string\n bucket: string\n buckets: Record<TimeBucket, string>\n splitBy: string\n splitByNone: string\n measure: string\n aggregates: Record<AggregateOp, string>\n ofField: string\n stacked: string\n sort: string\n sorts: Record<DatasetSort, string>\n limit: string\n /** A table of records: the fields shown. */\n columns: string\n orderBy: string\n orderNone: string\n directions: { asc: string; desc: string }\n width: string\n widths: Record<'3' | '4' | '6' | '8' | '12', string>\n filters: string\n addFilter: string\n removeFilter: string\n filterOps: Record<FilterOp, string>\n filterField: string\n filterOp: string\n filterValue: string\n noFields: string\n preview: string\n}\n\nexport const DEFAULT_PANEL_EDITOR_LABELS: PanelEditorLabels = {\n title: 'Title',\n description: 'Description',\n source: 'Data',\n showAs: 'Show as',\n types: {\n metric: 'Number',\n bar: 'Bar chart',\n line: 'Line chart',\n area: 'Area chart',\n pie: 'Pie chart',\n donut: 'Donut chart',\n table: 'Table',\n },\n groupBy: 'Group by',\n groupByNone: 'Choose a field',\n groupByRecords: 'Nothing: list the records',\n bucket: 'Per',\n buckets: { day: 'Day', week: 'Week', month: 'Month', quarter: 'Quarter', year: 'Year' },\n splitBy: 'Split by',\n splitByNone: 'Nothing',\n measure: 'Measure',\n aggregates: { count: 'Count', sum: 'Sum', avg: 'Average', min: 'Minimum', max: 'Maximum' },\n ofField: 'Of',\n stacked: 'Stack the series',\n sort: 'Order',\n sorts: { label: 'By name or date', 'value-desc': 'Largest first', 'value-asc': 'Smallest first' },\n limit: 'At most',\n columns: 'Columns',\n orderBy: 'Order by',\n orderNone: 'As read',\n directions: { asc: 'Ascending', desc: 'Descending' },\n width: 'Width',\n widths: { '3': 'Quarter', '4': 'Third', '6': 'Half', '8': 'Two thirds', '12': 'Full width' },\n filters: 'Only where',\n addFilter: 'Add a condition',\n removeFilter: 'Remove the condition',\n filterOps: {\n eq: 'is',\n neq: 'is not',\n contains: 'contains',\n gt: 'is above',\n gte: 'is at least',\n lt: 'is below',\n lte: 'is at most',\n empty: 'is empty',\n not_empty: 'is not empty',\n },\n filterField: 'Field',\n filterOp: 'Condition',\n filterValue: 'Value',\n noFields: 'Choose the data first.',\n preview: 'Preview',\n}\n\nexport interface PanelEditorProps {\n value: PanelSpec\n onChange: (panel: PanelSpec) => void\n /** Show the panel live under the form. Default true. */\n preview?: boolean\n /** Offer the width (a dashboard's grid). Default true. */\n showWidth?: boolean\n labels?: Partial<PanelEditorLabels>\n testId?: string\n}\n\n/** A select of the editor; `''` is \"nothing chosen\" (Radix items cannot take an empty value). */\nconst NONE = '__none'\n\nfunction Field({\n label,\n htmlFor,\n children,\n}: {\n label: string\n htmlFor?: string\n children: ReactNode\n}) {\n return (\n <div className=\"flex min-w-0 flex-col gap-1.5\">\n <Label htmlFor={htmlFor} className=\"text-xs font-medium text-muted-foreground\">\n {label}\n </Label>\n {children}\n </div>\n )\n}\n\nfunction EditorSelect({\n label,\n value,\n onChange,\n options,\n placeholder,\n none,\n testId,\n}: {\n label: string\n value: string | undefined\n onChange: (value: string | undefined) => void\n options: readonly { value: string; label: string }[]\n placeholder?: string\n /** Offer \"nothing\" with these words. */\n none?: string\n testId?: string\n}) {\n const id = useId()\n return (\n <Field label={label} htmlFor={id}>\n <div data-testid={testId}>\n <Select\n value={value ?? (none ? NONE : '')}\n onValueChange={(v) => onChange(v === NONE ? undefined : v)}\n >\n <SelectTrigger id={id} className=\"bg-card text-sm\" aria-label={label}>\n <SelectValue placeholder={placeholder} />\n </SelectTrigger>\n <SelectContent>\n {none && <SelectItem value={NONE}>{none}</SelectItem>}\n {options.map((o) => (\n <SelectItem key={o.value} value={o.value}>\n {o.label}\n </SelectItem>\n ))}\n </SelectContent>\n </Select>\n </div>\n </Field>\n )\n}\n\nfunction ParamField({\n param,\n params,\n onChange,\n testId,\n}: {\n param: DataSourceParam\n params: DataSourceParams\n onChange: (value: string | undefined) => void\n testId?: string\n}) {\n const { options } = param.useOptions(params)\n const value = params[param.id]\n return (\n <EditorSelect\n label={param.label}\n value={typeof value === 'string' && value ? value : undefined}\n onChange={onChange}\n options={options}\n placeholder={param.placeholder}\n none={param.required ? undefined : (param.placeholder ?? '—')}\n testId={testId}\n />\n )\n}\n\nconst WIDTHS = ['3', '4', '6', '8', '12'] as const\nconst NEEDS_VALUE = (op: FilterOp) => op !== 'empty' && op !== 'not_empty'\n\nfunction ChartFields({\n source,\n value,\n onChange,\n showWidth,\n l,\n testId,\n}: {\n source: DataSource\n value: PanelSpec\n onChange: (panel: PanelSpec) => void\n showWidth: boolean\n l: PanelEditorLabels\n testId?: string\n}) {\n const params = value.source.params ?? {}\n const { fields } = source.useFields(params)\n const chart = value.chart\n const setChart = (patch: Partial<ChartSpec>) =>\n onChange({ ...value, chart: { ...chart, ...patch } })\n const byId = useMemo(() => new Map(fields.map((f) => [f.id, f])), [fields])\n const groupable = fields.filter((f) => f.type !== 'number')\n const numbers = fields.filter((f) => f.type === 'number')\n const opts = (list: readonly DatasetField[]) => list.map((f) => ({ value: f.id, label: f.label }))\n const x = chart.x ? byId.get(chart.x) : undefined\n const aggregate = chart.aggregate ?? 'count'\n const isMetric = chart.type === 'metric'\n const isRecords = chart.type === 'table' && !chart.x\n const canSplit = chart.type === 'bar' || chart.type === 'line' || chart.type === 'area'\n const filters = chart.filters ?? []\n const setFilter = (i: number, patch: Partial<DatasetFilter>) =>\n setChart({ filters: filters.map((f, j) => (j === i ? { ...f, ...patch } : f)) })\n\n return (\n <>\n <EditorSelect\n label={l.showAs}\n value={chart.type}\n onChange={(type) => setChart({ type: (type ?? 'bar') as ChartType })}\n options={(Object.keys(l.types) as ChartType[]).map((t) => ({\n value: t,\n label: l.types[t],\n }))}\n testId={testId && `${testId}-type`}\n />\n {!isMetric && (\n <EditorSelect\n label={l.groupBy}\n value={chart.x}\n onChange={(x) => setChart({ x })}\n options={opts(groupable)}\n placeholder={l.groupByNone}\n none={chart.type === 'table' ? l.groupByRecords : undefined}\n testId={testId && `${testId}-x`}\n />\n )}\n {!isMetric && x?.type === 'date' && (\n <EditorSelect\n label={l.bucket}\n value={chart.bucket ?? 'month'}\n onChange={(bucket) => setChart({ bucket: (bucket ?? 'month') as TimeBucket })}\n options={(Object.keys(l.buckets) as TimeBucket[]).map((b) => ({\n value: b,\n label: l.buckets[b],\n }))}\n testId={testId && `${testId}-bucket`}\n />\n )}\n {canSplit && (\n <EditorSelect\n label={l.splitBy}\n value={chart.series}\n onChange={(series) => setChart({ series })}\n options={opts(groupable.filter((f) => f.id !== chart.x))}\n none={l.splitByNone}\n testId={testId && `${testId}-series`}\n />\n )}\n {!isRecords && (\n <div className=\"grid grid-cols-2 gap-3\">\n <EditorSelect\n label={l.measure}\n value={aggregate}\n onChange={(op) => {\n const next = (op ?? 'count') as AggregateOp\n setChart({\n aggregate: next,\n y: next === 'count' ? undefined : (chart.y ?? numbers[0]?.id),\n })\n }}\n options={(Object.keys(l.aggregates) as AggregateOp[])\n .filter((op) => op === 'count' || numbers.length > 0)\n .map((op) => ({ value: op, label: l.aggregates[op] }))}\n testId={testId && `${testId}-aggregate`}\n />\n {aggregate !== 'count' && (\n <EditorSelect\n label={l.ofField}\n value={chart.y}\n onChange={(y) => setChart({ y })}\n options={opts(numbers)}\n testId={testId && `${testId}-y`}\n />\n )}\n </div>\n )}\n {canSplit && chart.series && chart.type !== 'line' && (\n <label className=\"flex items-center gap-2 text-sm\">\n <Switch\n checked={Boolean(chart.stacked)}\n onCheckedChange={(stacked) => setChart({ stacked })}\n data-testid={testId && `${testId}-stacked`}\n />\n {l.stacked}\n </label>\n )}\n {!isMetric && !isRecords && (\n <div className=\"grid grid-cols-2 gap-3\">\n <EditorSelect\n label={l.sort}\n value={chart.sort ?? (x?.type === 'date' ? 'label' : 'value-desc')}\n onChange={(sort) => setChart({ sort: sort as DatasetSort })}\n options={(Object.keys(l.sorts) as DatasetSort[]).map((s) => ({\n value: s,\n label: l.sorts[s],\n }))}\n testId={testId && `${testId}-sort`}\n />\n <Field label={l.limit}>\n <Input\n type=\"number\"\n min={1}\n max={500}\n value={chart.limit ?? ''}\n placeholder=\"50\"\n onChange={(e) =>\n setChart({\n limit: e.target.value ? Math.max(1, Number(e.target.value)) : undefined,\n })\n }\n data-testid={testId && `${testId}-limit`}\n />\n </Field>\n </div>\n )}\n {isRecords && (\n <fieldset className=\"flex flex-col gap-1.5\" data-testid={testId && `${testId}-columns`}>\n <legend className=\"mb-1.5 text-xs font-medium text-muted-foreground\">{l.columns}</legend>\n {fields.map((field) => {\n const shown = chart.columns ?? fields.map((f) => f.id)\n const checked = shown.includes(field.id)\n return (\n <label key={field.id} className=\"flex items-center gap-2 text-sm\">\n <input\n type=\"checkbox\"\n checked={checked}\n onChange={() =>\n setChart({\n columns: checked\n ? shown.filter((id) => id !== field.id)\n : fields\n .map((f) => f.id)\n .filter((id) => id === field.id || shown.includes(id)),\n })\n }\n />\n {field.label}\n </label>\n )\n })}\n </fieldset>\n )}\n {isRecords && (\n <div className=\"grid grid-cols-2 gap-3\">\n <EditorSelect\n label={l.orderBy}\n value={chart.orderBy?.field}\n onChange={(field) =>\n setChart({\n orderBy: field\n ? { field, direction: chart.orderBy?.direction ?? 'asc' }\n : undefined,\n })\n }\n options={opts(fields)}\n none={l.orderNone}\n testId={testId && `${testId}-order`}\n />\n {chart.orderBy && (\n <EditorSelect\n label={l.orderBy}\n value={chart.orderBy.direction ?? 'asc'}\n onChange={(direction) =>\n setChart({\n orderBy: {\n field: chart.orderBy?.field ?? '',\n direction: direction === 'desc' ? 'desc' : 'asc',\n },\n })\n }\n options={[\n { value: 'asc', label: l.directions.asc },\n { value: 'desc', label: l.directions.desc },\n ]}\n testId={testId && `${testId}-direction`}\n />\n )}\n </div>\n )}\n <div className=\"flex flex-col gap-2\" data-testid={testId && `${testId}-filters`}>\n <span className=\"text-xs font-medium text-muted-foreground\">{l.filters}</span>\n {filters.map((filter, i) => (\n <div key={i} className=\"grid grid-cols-[1fr_1fr_1fr_auto] items-end gap-2\">\n <EditorSelect\n label={l.filterField}\n value={filter.field}\n onChange={(field) => setFilter(i, { field: field ?? '' })}\n options={opts(fields)}\n />\n <EditorSelect\n label={l.filterOp}\n value={filter.op}\n onChange={(op) => setFilter(i, { op: (op ?? 'eq') as FilterOp })}\n options={(Object.keys(l.filterOps) as FilterOp[]).map((op) => ({\n value: op,\n label: l.filterOps[op],\n }))}\n />\n {NEEDS_VALUE(filter.op) ? (\n <Field label={l.filterValue}>\n <Input\n value={\n filter.value === null || filter.value === undefined ? '' : String(filter.value)\n }\n type={byId.get(filter.field)?.type === 'number' ? 'number' : 'text'}\n onChange={(e) =>\n setFilter(i, {\n value:\n byId.get(filter.field)?.type === 'number' && e.target.value !== ''\n ? Number(e.target.value)\n : e.target.value,\n })\n }\n />\n </Field>\n ) : (\n <span />\n )}\n <Button\n variant=\"ghost\"\n size=\"icon\"\n aria-label={l.removeFilter}\n onClick={() => setChart({ filters: filters.filter((_, j) => j !== i) })}\n >\n <X className=\"size-4\" />\n </Button>\n </div>\n ))}\n <Button\n variant=\"outline\"\n size=\"sm\"\n className=\"self-start\"\n disabled={!fields.length}\n onClick={() =>\n setChart({ filters: [...filters, { field: fields[0]?.id ?? '', op: 'eq', value: '' }] })\n }\n >\n <Plus className=\"size-3.5\" /> {l.addFilter}\n </Button>\n </div>\n {showWidth && (\n <EditorSelect\n label={l.width}\n value={String(clampPanelWidth(value.width))}\n onChange={(w) => onChange({ ...value, width: Number(w ?? 6) })}\n options={WIDTHS.map((w) => ({ value: w, label: l.widths[w] }))}\n testId={testId && `${testId}-width`}\n />\n )}\n {!fields.length && <p className=\"text-sm text-muted-foreground\">{l.noFields}</p>}\n </>\n )\n}\n\nexport function PanelEditor({\n value,\n onChange,\n preview = true,\n showWidth = true,\n labels,\n testId,\n}: PanelEditorProps) {\n const l = { ...DEFAULT_PANEL_EDITOR_LABELS, ...labels }\n const registry = useDataSources()\n const source = registry.get(value.source.id)\n const params = value.source.params ?? {}\n const titleId = useId()\n const descriptionId = useId()\n\n return (\n <div\n className={cn(\n 'grid min-w-0 gap-6',\n preview && 'lg:grid-cols-[minmax(0,22rem)_minmax(0,1fr)]'\n )}\n data-testid={testId}\n >\n <div className=\"flex min-w-0 flex-col gap-4\">\n <Field label={l.title} htmlFor={titleId}>\n <Input\n id={titleId}\n value={value.title}\n onChange={(e) => onChange({ ...value, title: e.target.value })}\n data-testid={testId && `${testId}-title`}\n />\n </Field>\n <Field label={l.description} htmlFor={descriptionId}>\n <Input\n id={descriptionId}\n value={value.description ?? ''}\n onChange={(e) => onChange({ ...value, description: e.target.value || undefined })}\n />\n </Field>\n <EditorSelect\n label={l.source}\n value={value.source.id}\n onChange={(id) =>\n onChange({\n ...value,\n source: { id: id ?? value.source.id },\n // Another source has other fields: what was grouped and measured no longer applies.\n chart: { type: value.chart.type },\n })\n }\n options={registry.list.map((s) => ({ value: s.id, label: s.label }))}\n testId={testId && `${testId}-source`}\n />\n {source?.description && (\n <p className=\"-mt-2 text-xs text-muted-foreground\">{source.description}</p>\n )}\n {source?.params?.map((param) => (\n <ParamField\n key={`${source.id}-${param.id}`}\n param={param}\n params={params}\n testId={testId && `${testId}-param-${param.id}`}\n onChange={(v) =>\n onChange({\n ...value,\n source: { ...value.source, params: { ...params, [param.id]: v ?? null } },\n // A different database has other columns.\n ...(param.id === 'databaseId' || param.id === 'view'\n ? { chart: { type: value.chart.type } }\n : {}),\n })\n }\n />\n ))}\n {source && (\n <ChartFields\n key={source.id}\n source={source}\n value={value}\n onChange={onChange}\n showWidth={showWidth}\n l={l}\n testId={testId}\n />\n )}\n </div>\n {preview && (\n <div className=\"flex min-w-0 flex-col gap-2 self-start lg:sticky lg:top-0\">\n <span className=\"text-xs font-medium text-muted-foreground\">{l.preview}</span>\n <DashboardPanel panel={value} testId={testId && `${testId}-preview`} />\n </div>\n )}\n </div>\n )\n}\n"]}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/dashboards/chartModel.ts"],"names":["divisor"],"mappings":"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","file":"chunk-FPOKWML2.js","sourcesContent":["/**\n * The renderer adapter's first half: a `ChartSpec` and its aggregated `Dataset` (long form: a row\n * per group and series) become a `ChartModel`, the categories and series a drawing component plots.\n * Nothing here knows the drawing library, so it can change without touching specs or sources.\n */\nimport type {\n AGGREGATE_FIELDS,\n ChartSpec,\n Dataset,\n DatasetField,\n DatasetValue,\n TimeBucket,\n} from '@arbidocs/react'\n\n/** The aggregated dataset's field ids (`@arbidocs/react`'s `AGGREGATE_FIELDS`, checked). */\nconst F = {\n group: 'group',\n key: 'key',\n series: 'series',\n value: 'value',\n} as const satisfies typeof AGGREGATE_FIELDS\n\n/** The drawing types (a metric and a table are not drawn). */\nexport type DrawnChartType = 'bar' | 'line' | 'area' | 'pie' | 'donut'\n\nexport interface ChartModelSeries {\n id: string\n label: string\n /** One per category; `null` where the group has no value. */\n values: (number | null)[]\n /** The series' colour as a CSS value (a theme token). */\n color: string\n}\n\n/** What a chart plots, library-free. */\nexport interface ChartModel {\n type: DrawnChartType\n stacked: boolean\n /** Category labels, in order (x axis, or pie slices). */\n categories: string[]\n series: ChartModelSeries[]\n /** The x axis's name (the grouped field). */\n xLabel: string\n /** The value's name (\"count\", \"sum of Fee\"). */\n valueLabel: string\n /** Formats a value for ticks, the tooltip and the table. */\n format: (value: number) => string\n /** Short form of `format` for axis ticks. */\n formatTick: (value: number) => string\n}\n\n/** Formats by unit (`gbp`, `bytes`, `tokens`, …); a host passes its own (the SDK's £ formatter). */\nexport type UnitFormatters = Readonly<Record<string, (value: number) => string>>\n\n/** The theme's series colours, then a muted \"Other\". */\nexport const SERIES_COLORS = [1, 2, 3, 4, 5].map((i) => `hsl(var(--chart-${i}))`)\nexport const OTHER_COLOR = 'hsl(var(--muted-foreground))'\n\nconst MONTHS = ['Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec']\n\n/** A date bucket key as people read it: \"12 Jun 2026\", \"W24 2026\", \"Jun 2026\", \"Q2 2026\", \"2026\". */\nexport function formatBucketLabel(key: string, bucket: TimeBucket = 'month'): string {\n let m: RegExpMatchArray | null\n if (bucket === 'day' && (m = key.match(/^(\\d{4})-(\\d{2})-(\\d{2})$/)))\n return `${Number(m[3])} ${MONTHS[Number(m[2]) - 1]} ${m[1]}`\n if (bucket === 'week' && (m = key.match(/^(\\d{4})-W(\\d{2})$/))) return `W${Number(m[2])} ${m[1]}`\n if (bucket === 'month' && (m = key.match(/^(\\d{4})-(\\d{2})$/)))\n return `${MONTHS[Number(m[2]) - 1]} ${m[1]}`\n if (bucket === 'quarter' && (m = key.match(/^(\\d{4})-Q(\\d)$/))) return `Q${m[2]} ${m[1]}`\n return key\n}\n\nconst plain = new Intl.NumberFormat('en-GB', { maximumFractionDigits: 2 })\nconst oneDecimal = new Intl.NumberFormat('en-GB', { maximumFractionDigits: 1 })\nconst COMPACT_UNITS: readonly [number, string][] = [\n [1e12, 'T'],\n [1e9, 'B'],\n [1e6, 'M'],\n [1e3, 'K'],\n]\n\n/**\n * A number in fixed suffixes (950, 1.2K, 1.5M, 3B), the same in every browser and runtime:\n * `Intl`'s compact notation follows the ICU data, which writes \"1.5m\" in some versions.\n */\nfunction formatCompact(value: number): string {\n const size = Math.abs(value)\n const at = COMPACT_UNITS.findIndex(([divisor]) => size >= divisor)\n if (at === -1) return oneDecimal.format(value)\n // 999,950 rounds to \"1000K\": the next suffix up reads it.\n const [divisor, suffix] =\n at > 0 && Math.round((size / COMPACT_UNITS[at][0]) * 10) / 10 >= 1000\n ? COMPACT_UNITS[at - 1]\n : COMPACT_UNITS[at]\n return `${oneDecimal.format(value / divisor)}${suffix}`\n}\n\n/** The default formatters: £ with pence, bytes in KB/MB/GB, tokens compact. */\nexport const DEFAULT_UNIT_FORMATTERS: UnitFormatters = {\n gbp: (v) =>\n `${v < 0 ? '-' : ''}£${Math.abs(v).toLocaleString('en-GB', {\n minimumFractionDigits: Number.isInteger(v) ? 0 : 2,\n maximumFractionDigits: 2,\n })}`,\n bytes: (v) =>\n v < 1024\n ? `${v} B`\n : v < 1024 ** 2\n ? `${(v / 1024).toFixed(1)} KB`\n : v < 1024 ** 3\n ? `${(v / 1024 ** 2).toFixed(1)} MB`\n : `${(v / 1024 ** 3).toFixed(1)} GB`,\n tokens: formatCompact,\n}\n\n/** The formatter of a value field: by its unit, a suffix for any other unit, else a number. */\nexport function formatterOf(\n field: Pick<DatasetField, 'unit'> | undefined,\n formatters: UnitFormatters = DEFAULT_UNIT_FORMATTERS\n): (value: number) => string {\n const unit = field?.unit\n if (!unit) return (v) => plain.format(v)\n const known = formatters[unit] ?? DEFAULT_UNIT_FORMATTERS[unit]\n return known ?? ((v) => `${plain.format(v)} ${unit}`)\n}\n\n/** The most series (or pie slices) drawn in their own colour; the rest fold into \"Other\". */\nexport const MAX_COLORED = SERIES_COLORS.length\n\nconst additive = (spec: ChartSpec) =>\n (spec.aggregate ?? 'count') === 'count' || spec.aggregate === 'sum'\n\nconst num = (v: DatasetValue | undefined) => (typeof v === 'number' ? v : null)\n\nexport interface ChartModelOptions {\n /** The source's fields, for the x axis's name. */\n fields?: readonly DatasetField[]\n formatters?: UnitFormatters\n /** The words for the folded series and slices. Default \"Other\". */\n otherLabel?: string\n}\n\n/**\n * Turn an aggregated dataset into what a chart plots. Series (and pie slices) beyond the theme's\n * colours fold into \"Other\" when the values add up (count, sum); otherwise the smallest are left out.\n */\nexport function chartModelOf(\n spec: ChartSpec & { type: DrawnChartType },\n dataset: Dataset,\n options: ChartModelOptions = {}\n): ChartModel {\n const other = options.otherLabel ?? 'Other'\n const valueField = dataset.fields.find((f) => f.id === F.value)\n const xField = options.fields?.find((f) => f.id === spec.x)\n const isDate = xField?.type === 'date'\n const keys: string[] = []\n const labels = new Map<string, string>()\n const seriesIds: string[] = []\n const cells = new Map<string, number | null>()\n for (const row of dataset.rows) {\n const key = String(row[F.key] ?? row[F.group] ?? '')\n if (!labels.has(key)) {\n keys.push(key)\n const label = String(row[F.group] ?? key)\n labels.set(key, isDate && key ? formatBucketLabel(key, spec.bucket) : label)\n }\n const s = row[F.series] === undefined ? '' : String(row[F.series])\n if (!seriesIds.includes(s)) seriesIds.push(s)\n cells.set(`${key}\\u0000${s}`, num(row[F.value]))\n }\n const valueLabel = valueField?.label ?? 'value'\n let series = seriesIds.map((s) => ({\n id: s || F.value,\n label: s || valueLabel,\n values: keys.map((k) => cells.get(`${k}\\u0000${s}`) ?? null),\n }))\n let categories = keys.map((k) => labels.get(k) ?? k)\n const sum = (values: (number | null)[]) => values.reduce<number>((a, v) => a + (v ?? 0), 0)\n\n if (spec.type === 'pie' || spec.type === 'donut') {\n const values = series[0]?.values ?? []\n if (categories.length > MAX_COLORED) {\n const order = values.map((_, i) => i).sort((a, b) => (values[b] ?? 0) - (values[a] ?? 0))\n const kept = order.slice(0, MAX_COLORED - 1)\n const rest = order.slice(MAX_COLORED - 1)\n categories = [...kept.map((i) => categories[i]), ...(additive(spec) ? [other] : [])]\n const keptValues = kept.map((i) => values[i])\n series = [\n {\n ...series[0],\n values: additive(spec) ? [...keptValues, sum(rest.map((i) => values[i]))] : keptValues,\n },\n ]\n }\n } else if (series.length > MAX_COLORED) {\n const order = [...series].sort((a, b) => sum(b.values) - sum(a.values))\n const kept = order.slice(0, MAX_COLORED - 1)\n const rest = order.slice(MAX_COLORED - 1)\n series = [\n ...series.filter((s) => kept.includes(s)),\n ...(additive(spec)\n ? [\n {\n id: '__other',\n label: other,\n values: keys.map((_, i) =>\n rest.some((s) => s.values[i] !== null) ? sum(rest.map((s) => s.values[i])) : null\n ),\n },\n ]\n : []),\n ]\n }\n\n const format = formatterOf(valueField, options.formatters)\n return {\n type: spec.type,\n stacked: Boolean(spec.stacked) && (spec.type === 'bar' || spec.type === 'area'),\n categories,\n series: series.map((s, i) => ({\n ...s,\n color: s.id === '__other' ? OTHER_COLOR : SERIES_COLORS[i % SERIES_COLORS.length],\n })),\n xLabel: xField?.label ?? '',\n valueLabel,\n format,\n formatTick: valueField?.unit === 'gbp' || valueField?.unit === 'bytes' ? format : formatCompact,\n }\n}\n\n/** The pie slice colours (one per category; \"Other\" muted). */\nexport function sliceColors(model: Pick<ChartModel, 'categories'>, otherLabel = 'Other') {\n return model.categories.map((c, i) =>\n c === otherLabel && i === model.categories.length - 1 && i >= MAX_COLORED - 1\n ? OTHER_COLOR\n : SERIES_COLORS[i % SERIES_COLORS.length]\n )\n}\n\n/** The single value of a metric (an aggregated dataset with one group), or null. */\nexport function metricValueOf(dataset: Dataset | undefined): number | null {\n if (!dataset?.rows.length) return null\n return dataset.rows.reduce<number | null>((total, row) => {\n const v = num(row[F.value])\n return v === null ? total : (total ?? 0) + v\n }, null)\n}\n"]}
|