@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 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/connection/viewer/drafts.tsx","../src/connection/viewer/FinaliseTranslationButton.tsx","../src/connection/viewer/useImageCrop.ts","../src/connection/viewer/useViewedDocument.ts","../src/connection/viewer/useViewerBlobs.ts","../src/connection/viewer/useViewerTabs.tsx","../src/connection/viewer/useViewerVersions.ts","../src/connection/viewer/parsed/document-tags.ts","../src/connection/viewer/parsed/useChunkTagging.ts","../src/connection/viewer/parsed/PassageTagPanel.tsx","../src/connection/viewer/parsed/ParsedPassage.tsx","../src/connection/viewer/parsed/citation-line.ts","../src/connection/viewer/parsed/usePassageCopy.ts","../src/connection/viewer/parsed/useDocumentLabels.ts","../src/connection/viewer/parsed/useCitationSelection.ts","../src/connection/viewer/parsed/usePageScrollSync.ts","../src/connection/viewer/parsed/useLazyPages.ts","../src/connection/viewer/parsed/ParsedTextView.tsx","../src/connection/viewer/ViewerPdfPane.tsx","../src/connection/viewer/ConnectedDocumentViewer.tsx"],"names":["jsx","FileText","Mic","VideoIcon","Camera","useArbiSessionState","useArbiSessionStore","DropdownMenu","DropdownMenuTrigger","DropdownMenuContent","jsxs","DropdownMenuItem","Check","useUserSettings","useConfig","useSaveConfigField","DraftTitleControls","useArbi","useDictateContext","useBlocksEnvironment","useUploadDocuments","logger","VoiceNoteRecorder","PhotoCapture","VideoCapture","document","isPanelOpen","DOCUMENT_VIEWER_PANEL","useMemo","compareDocumentsIn","RelatedDocumentsCell","useFilesDialogs","useFinaliseTranslation","useDocumentTools","Button","FileCheck2","useState","useCallback","useEffect","useViewerStreamingDocument","useConnectedWorkspace","useDocument","useConnectedTags","summariseDocTags","isDocumentLabel","isImageFile","isVideoFile","isAudioFile","artifactKindFromMode","artifactKindFromFileName","savedDocumentIdFor","useArtifactSource","useParsedDocument","isDownloadOnlyFile","parseVersionRef","loadOfflineDocument","useDocumentBytes","hasVideoTrack","fetchDocumentFile","friendlyFileType","useIsPhone","useRef","VidIcon","AudIcon","ImgIcon","EmlIcon","PdfIcon","History","MonitorPlay","Code","DocIcon","XlsIcon","HtmlIcon","useConnectedDocuments","useDocumentVersionList","documentVersions","toArtifactVersions","useAssignDocTags","useUpdateDocTag","useRemoveDocTags","useDocumentViewerSupport","groups","getEntityColor","TagEntity","TagPassagePanel","memo","ParsedPassage","HtmlPassage","LabelMark","NoteMark","PassageMark","ConnectedMarkdown","buildDeepLinkUrl","React","PassagePill","useViewerPassageCitation","computeSelectionRuns","viewingDocumentPage","usePageIntersectionObserver","useProcessedChunks","useScrollAnchor","usePinchZoom","ViewerMessage","HtmlViewerRoot","DocumentLabelBar","CitedRunNav","HtmlViewerSurface","HtmlPage","HtmlViewerEmpty","lazy","useViewerIsDetached","KitPdfViewer","ViewerPreviewUnavailable","ViewerLoadError","VideoViewer","AudioViewer","ImageViewer","Suspense","ErrorBoundary","ConnectedDocumentToolsProvider","fmtDate","useConnectedConversations","useRegisterOpenDocument","latestThreadOfDocument","useDocumentSignatures","versionLabel","findVersion","useDocumentMarkup","Fragment","ViewerZoomControl","cycleZoom","PdfPageNav","ViewerPageCounter","ArtifactCompareBar","ViewerTitle","ViewerStatusNote","MarkupViewNote","SignatureStatus","ViewerHeaderStart","ViewerTabBar","canAnnotate","SignatureRequestBanner","ViewerHeaderEnd","AnnotateButton","ShowOriginalButton","DownloadMarkupButton","SIGNED_LOCKED_REASON","ViewerImageActions","MessageSquare","FileShareDialog","MessageSquarePlus","ShareControl","canChangeVisibility","getEntityLabel","Mail","Languages","PenLine","ChevronDown","PlaceMySignatureMenuItems","Users","SignDocumentDialog","ViewerFrame","TabHeader","VersionSnapshotBar","ImageCropModal","DEFAULT_ASPECT_OPTIONS","ViewerPane","MarkupNotices","ViewerControlBar","ArtifactPreview","ArtifactCodeView","SignedEditNote","VersionTimeline","XlsxViewer"],"mappings":"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","file":"chunk-AHMRYY7J.cjs","sourcesContent":["/**\n * The viewer's unsaved drafts (the session's `draftDocuments`, started with `startDraftDocument`)\n * and its related documents. A draft has no backend record until it is saved: its kind (Doc,\n * Voice, Photo, Video) replaces the tabs, its editable name replaces the title, and a capture\n * draft's recorder is the whole body. A capture saves straight to the workspace as its own\n * document (`useUploadDocuments`), with the user's active configuration, so the backend can name it\n * from its content.\n */\n\nimport { useMemo, type FocusEvent, type ReactNode } from 'react'\nimport { Camera, Check, FileText, Mic, Video as VideoIcon } from 'lucide-react'\nimport {\n DOCUMENT_VIEWER_PANEL,\n DraftTitleControls,\n PhotoCapture,\n VideoCapture,\n VoiceNoteRecorder,\n isPanelOpen,\n useArbi,\n useArbiSessionState,\n useArbiSessionStore,\n useConfig,\n useSaveConfigField,\n useUploadDocuments,\n useUserSettings,\n type ArbiDraftDocument,\n type ArbiDraftKind,\n type WorkspaceDocument,\n} from '@arbidocs/react'\nimport {\n useDictateContext,\n DropdownMenu,\n DropdownMenuContent,\n DropdownMenuItem,\n DropdownMenuTrigger,\n} from '@arbidocs/react/ui'\nimport { logger } from '@arbidocs/client'\nimport { useBlocksEnvironment } from '../../provider/environment'\nimport { RelatedDocumentsCell } from '../files/grid/cells'\nimport { useFilesDialogs } from '../files/store'\nimport type { ViewerDocumentRecord } from './support'\nimport { compareDocumentsIn } from './compareDocuments'\n\nconst KIND_OPTIONS: { value: ArbiDraftKind; icon: ReactNode; label: string }[] = [\n { value: 'text', icon: <FileText className=\"w-4 h-4\" />, label: 'Doc' },\n { value: 'audio', icon: <Mic className=\"w-4 h-4\" />, label: 'Voice' },\n { value: 'video', icon: <VideoIcon className=\"w-4 h-4\" />, label: 'Video' },\n { value: 'photo', icon: <Camera className=\"w-4 h-4\" />, label: 'Photo' },\n]\n\nconst useDraft = (documentId: string): ArbiDraftDocument | undefined =>\n useArbiSessionState((state) => state.draftDocuments[documentId])\n\n/**\n * A draft's kind, in place of the tabs: the icon of its kind opens the four kinds, so the user can\n * switch before capturing or typing anything.\n */\nexport function ViewerDraftKind({ documentId }: { documentId: string }) {\n const draft = useDraft(documentId)\n const session = useArbiSessionStore()\n if (!draft) return null\n const current = KIND_OPTIONS.find((option) => option.value === draft.kind) ?? KIND_OPTIONS[0]\n return (\n <DropdownMenu>\n <DropdownMenuTrigger asChild>\n <button\n type=\"button\"\n title={`Draft kind: ${current.label}. Click to change.`}\n aria-label={`Draft kind: ${current.label}. Click to change.`}\n className=\"px-3 py-2 transition-all duration-200 font-medium border-b-2 border-transparent text-muted-foreground hover:text-foreground hover:border-border flex-shrink-0 flex items-center\"\n data-testid=\"draft-kind-trigger\"\n >\n {current.icon}\n </button>\n </DropdownMenuTrigger>\n <DropdownMenuContent align=\"start\" sideOffset={4} className=\"w-40\">\n {KIND_OPTIONS.map((option) => (\n <DropdownMenuItem\n key={option.value}\n onSelect={() => session.setDraftDocumentKind(documentId, option.value)}\n data-testid={`draft-kind-option-${option.value}`}\n >\n {option.icon}\n <span>{option.label}</span>\n {option.value === draft.kind && <Check className=\"ml-auto w-4 h-4\" />}\n </DropdownMenuItem>\n ))}\n </DropdownMenuContent>\n </DropdownMenu>\n )\n}\n\nconst TITLE_PLACEHOLDER: Record<ArbiDraftKind, string> = {\n text: 'New Doc',\n audio: 'New Audio',\n photo: 'New Photo',\n video: 'New Video',\n}\n\n// The draft starts with a real default name (\"New Doc\"), not a placeholder, so focusing the field\n// selects it: typing then replaces it instead of appending to it.\nfunction selectTitleOnFocus(event: FocusEvent<HTMLDivElement>) {\n if (event.target instanceof HTMLInputElement) event.target.select()\n}\n\n/**\n * A draft's editable name, in place of the title, with the auto-name switch: the active\n * configuration's `DoctagLLM.AUTO_RENAME`, the same setting as the upload dialog's.\n */\nexport function ViewerDraftTitle({ documentId }: { documentId: string }) {\n const draft = useDraft(documentId)\n const session = useArbiSessionStore()\n const { data: userSettings } = useUserSettings()\n const { data: activeConfig } = useConfig(userSettings?.last_config || 'default')\n const configField = useSaveConfigField()\n const config = activeConfig as { DoctagLLM?: { AUTO_RENAME?: boolean } } | undefined\n const autoRename = config?.DoctagLLM?.AUTO_RENAME ?? false\n\n if (!draft) return null\n return (\n <div className=\"contents\" onFocus={selectTitleOnFocus}>\n <DraftTitleControls\n title={draft.title}\n onTitleChange={(title) => session.updateDraftDocument(documentId, { title })}\n placeholder={TITLE_PLACEHOLDER[draft.kind] ?? TITLE_PLACEHOLDER.text}\n autoRename={autoRename}\n onAutoRenameChange={(value) => configField.save('DoctagLLM', 'AUTO_RENAME', value)}\n />\n </div>\n )\n}\n\n/** Each capture's file name and the type used when the recorder reports none. */\nconst CAPTURE_FILE: Record<\n 'audio' | 'photo' | 'video',\n { name: string; fallbackType: string; saved: string; label: string }\n> = {\n audio: {\n name: 'voice-note.webm',\n fallbackType: 'audio/webm',\n saved: 'Voice note saved — transcribing…',\n label: 'voice note',\n },\n photo: { name: 'photo.png', fallbackType: 'image/png', saved: 'Photo saved', label: 'photo' },\n video: { name: 'video.webm', fallbackType: 'video/webm', saved: 'Video saved', label: 'video' },\n}\n\n/**\n * A capture draft's recorder (voice, photo or video), the whole body of the viewer. The finished\n * capture is kept in the draft first, so it survives the viewer closing even if the save fails;\n * the draft is cleared once the saved document's id is known and the viewer moves to it.\n */\nexport function ViewerCaptureDraft({ documentId }: { documentId: string }) {\n const draft = useDraft(documentId)\n const session = useArbiSessionStore()\n const arbi = useArbi()\n const dictate = useDictateContext()\n const { notify } = useBlocksEnvironment()\n const upload = useUploadDocuments()\n const { data: userSettings } = useUserSettings()\n\n if (!draft || draft.kind === 'text') return null\n const kind = draft.kind\n const file = CAPTURE_FILE[kind]\n\n const discard = () => {\n session.clearDraftDocument(documentId)\n session.setViewingDocument(null)\n }\n const save = async (blob: Blob, mimeType: string | null) => {\n session.updateDraftDocument(documentId, { mediaBlob: blob })\n try {\n const response = await upload.mutateAsync({\n files: [new File([blob], file.name, { type: mimeType || file.fallbackType })],\n options: { configExtId: userSettings?.last_config ?? undefined },\n })\n // The id often arrives later (on the realtime channel): only leave the draft for a real one.\n const newDocId = response.doc_ext_ids?.[0]\n if (newDocId) {\n session.clearDraftDocument(documentId)\n session.setViewingDocument({ id: newDocId, page: null })\n }\n notify(file.saved, 'success')\n } catch (err) {\n logger.error(`[ViewerCaptureDraft] Saving the ${file.label} failed`, err)\n notify(`Could not save the ${file.label}. Please try again.`, 'error')\n }\n }\n const onError = (message: string) => notify(message, 'error')\n\n return (\n <div className=\"h-full overflow-hidden\" data-testid=\"media-capture-recorder\">\n {kind === 'audio' && (\n <VoiceNoteRecorder\n title={draft.title}\n isSaving={upload.isPending}\n onSave={save}\n onDiscard={discard}\n onError={onError}\n // A rough transcript while reviewing (the host's dictation, else the session's); the real\n // one comes with the saved document.\n transcribe={(blob) =>\n dictate ? dictate.transcribe(blob) : arbi.assistant.transcribe(blob)\n }\n />\n )}\n {kind === 'photo' && (\n <PhotoCapture\n onSave={save}\n onDiscard={discard}\n onError={onError}\n isSaving={upload.isPending}\n />\n )}\n {kind === 'video' && (\n <VideoCapture\n onSave={save}\n onDiscard={discard}\n onError={onError}\n isSaving={upload.isPending}\n />\n )}\n </div>\n )\n}\n\n/**\n * The documents related to the open one (its email family, copies, near duplicates), beside its\n * name: one opens in the viewer, and each can be deleted or compared with it.\n */\nexport function ViewerRelatedDocuments({ document }: { document: ViewerDocumentRecord }) {\n const session = useArbiSessionStore()\n const related = useArbiSessionState((state) => state.relatedDocuments.get(document.external_id))\n const viewerOpen = useArbiSessionState((state) => isPanelOpen(state, DOCUMENT_VIEWER_PANEL))\n const viewingId = useArbiSessionState((state) => state.viewingDocument?.id ?? null)\n const onCompare = useMemo(\n () => (id: string, otherId: string) => compareDocumentsIn(session, id, otherId),\n [session]\n )\n if (!related) return null\n return (\n <RelatedDocumentsCell\n currentDoc={document as WorkspaceDocument}\n related={related}\n viewingDocumentId={viewerOpen ? viewingId : null}\n onDocumentClick={(id) => session.setViewingDocument({ id, page: null })}\n onDelete={(doc) => useFilesDialogs.getState().requestDelete(doc)}\n onCompare={onCompare}\n />\n )\n}\n","import { FileCheck2 } from 'lucide-react'\nimport { useFinaliseTranslation } from '@arbidocs/react'\nimport { useDocumentTools } from '@arbidocs/react/document-tools'\nimport { Button } from '@arbidocs/react/ui'\nimport { useBlocksEnvironment } from '../../provider/environment'\n\ninterface TranslationDocument {\n external_id: string\n derived_from?: ReadonlyArray<{ role?: string | null }> | null\n}\n\n/** A translation made by ARBI that is not itself a final PDF: the editable draft to finalise. */\nconst isTranslationDraft = (doc: TranslationDocument | undefined): boolean =>\n !!doc?.derived_from?.some((d) => d.role === 'translation') &&\n !doc.derived_from.some((d) => d.role === 'final')\n\n/**\n * Finalise: save the translation's current version as a new PDF document, labelled \"Translation\" and\n * linked to the original. The editable translation stays as it is; the new PDF opens.\n */\nexport function FinaliseTranslationButton({\n document,\n isCompact,\n}: {\n document: TranslationDocument | undefined\n isCompact: boolean\n}): React.ReactElement | null {\n // The new PDF joins the documents list with its links (draft, original), so the original's\n // Translations list shows it at once.\n const finalise = useFinaliseTranslation()\n const { openDocument } = useDocumentTools()\n const { notify } = useBlocksEnvironment()\n if (!document || !isTranslationDraft(document)) return null\n const pending = finalise.isPending\n const onClick = async () => {\n try {\n const { document_ext_id: finalId } = await finalise.mutateAsync(document.external_id)\n notify('Saved the final PDF of this translation', 'success')\n openDocument?.(finalId)\n } catch (error) {\n const detail = (error as { detail?: unknown })?.detail\n notify(\n typeof detail === 'string' ? detail : 'The final PDF could not be saved. Try again.',\n 'error'\n )\n }\n }\n return (\n <Button\n type=\"button\"\n variant=\"outline\"\n size={isCompact ? 'icon' : 'sm'}\n title=\"Finalise: save this translation as a new PDF, labelled Translation and linked to the original\"\n aria-label=\"Finalise\"\n data-testid=\"finalise-translation-button\"\n className=\"pointer-coarse:min-h-11\"\n disabled={pending}\n onClick={() => void onClick()}\n >\n <FileCheck2 className=\"size-4\" />\n {!isCompact && <span className=\"ml-1\">{pending ? 'Finalising…' : 'Finalise'}</span>}\n </Button>\n )\n}\n","/**\n * Cropping an image in the viewer: the crop is saved as a NEW document made from the image\n * (`derived_from`, role `crop`) in the image's own workspace, named on the upload; the original is\n * never touched. The new document opens once its id is back (otherwise it arrives through the\n * documents list).\n */\n\nimport { useCallback, useState } from 'react'\nimport { useDocumentTools } from '@arbidocs/react/document-tools'\nimport { useBlocksEnvironment } from '../../provider/environment'\n\nexport function useImageCrop(\n documentId: string,\n fileName: string | null | undefined,\n imageBlob: Blob | null,\n /** The image's workspace, where the crop goes (never whichever one is open when it is saved). */\n workspaceId: string | null | undefined\n) {\n const { uploadDocument, onDocumentsChanged, openDocument } = useDocumentTools()\n const { notify } = useBlocksEnvironment()\n const [cropImageUrl, setCropImageUrl] = useState<string | null>(null)\n\n const handleOpenCrop = useCallback(() => {\n if (!imageBlob) return\n setCropImageUrl(URL.createObjectURL(imageBlob))\n }, [imageBlob])\n\n const closeCrop = useCallback(() => {\n setCropImageUrl((url) => {\n if (url) URL.revokeObjectURL(url)\n return null\n })\n }, [])\n\n const handleCropComplete = useCallback(\n async (result: { blob: Blob }) => {\n const baseName = (fileName || 'image').replace(/\\.[^.]+$/, '')\n const file = new File([result.blob], `${baseName} (cropped).png`, { type: 'image/png' })\n try {\n const response = await uploadDocument({\n file,\n query: {\n derived_from: [documentId],\n derived_role: 'crop',\n ...(workspaceId ? { workspace_ext_id: workspaceId } : {}),\n },\n })\n const newDocId = response?.doc_ext_ids?.[0]\n if (newDocId) {\n await onDocumentsChanged?.([newDocId], 'copy')\n openDocument?.(newDocId)\n }\n notify('Cropped image saved', 'success')\n } catch {\n notify('Failed to save the cropped image', 'error')\n } finally {\n closeCrop()\n }\n },\n [\n fileName,\n documentId,\n workspaceId,\n uploadDocument,\n onDocumentsChanged,\n openDocument,\n notify,\n closeCrop,\n ]\n )\n\n return { cropImageUrl, handleOpenCrop, closeCrop, handleCropComplete }\n}\n","/**\n * What the document viewer is looking at: the document record, the streaming / draft overlay,\n * the kind of content (artifact, live artifact, media, Word, sheet, ...) and whether it has parsed\n * text.\n */\n\nimport { useEffect, useMemo, useState } from 'react'\nimport {\n useArbiSessionState,\n useDocument,\n useParsedDocument,\n type ArbiDraftDocument,\n} from '@arbidocs/react'\nimport {\n artifactKindFromFileName,\n artifactKindFromMode,\n useArtifactSource,\n} from '@arbidocs/react/artifacts'\nimport { isAudioFile, isDownloadOnlyFile, isImageFile, isVideoFile } from '@arbidocs/react/ui'\nimport { savedDocumentIdFor } from '@arbidocs/react/shell'\nimport { isDocumentLabel, summariseDocTags } from '../../files/doc-labels'\nimport { useConnectedWorkspace } from '../ConnectionProvider'\nimport { useConnectedTags } from '../workspaceData'\nimport { useViewerStreamingDocument } from './support'\n\nconst DOCX_EXTENSIONS = new Set(['.docx', '.doc'])\nconst XLSX_EXTENSIONS = new Set(['.xlsx', '.xls'])\nconst EMAIL_EXTENSIONS = new Set(['.eml', '.msg'])\n\n/** Lower-cased extension with its dot (`.pdf`), or `''`. */\nexport function fileExtension(fileName: string | null | undefined): string {\n if (!fileName) return ''\n return fileName.substring(fileName.lastIndexOf('.')).toLowerCase()\n}\n\nexport function useViewedDocument(documentId: string) {\n // `.webm` is ambiguous by extension alone (audio-only recordings use the same container as\n // video). Resolved once the bytes are here; null = not yet, and the extension's guess stands.\n const [webmHasVideoTrack, setWebmHasVideoTrack] = useState<boolean | null>(null)\n useEffect(() => setWebmHasVideoTrack(null), [documentId])\n\n // An artifact being generated in a chat.\n const streamingDoc = useViewerStreamingDocument(documentId)\n const isStreaming = !!streamingDoc && !streamingDoc.isComplete\n // A draft the user started (blank document, voice note) with no backend record yet.\n const draftDoc = useArbiSessionState<ArbiDraftDocument | undefined>(\n (state) => state.draftDocuments[documentId]\n )\n const isDraft = !!draftDoc\n // A capture draft (photo/video/audio) is its recorder; a text draft opens in the Word editor.\n const isCaptureDraft =\n draftDoc?.kind === 'audio' || draftDoc?.kind === 'photo' || draftDoc?.kind === 'video'\n const isTextDraft = draftDoc?.kind === 'text'\n\n const { workspaceId, live } = useConnectedWorkspace()\n const { data: record } = useDocument(documentId, {\n enabled: live && !!workspaceId && !isStreaming && !isDraft,\n // A new version (Save version, a signed copy) is processed before its PDF exists: keep\n // re-reading until it is done, so the PDF tab and the signing tools come back on their own.\n pollWhileProcessing: true,\n })\n // A record of the previously viewed document is not this one.\n const documentData = record?.external_id === documentId ? record : undefined\n\n // Labels for the bar the PDF view carries (the text view derives its own).\n const { data: tags } = useConnectedTags()\n const labelSummaries = useMemo(\n () => summariseDocTags(documentData?.doctags ?? [], tags.filter(isDocumentLabel)),\n [documentData, tags]\n )\n\n // A document renders on the artifact path (Word editor or live preview, and Versions) rather\n // than the PDF path when (1) an artifact is streaming, (2) it is an artifact (AI drafts are\n // stored as .docx, html/react artifacts as .html/.jsx), or (3) it is an uploaded `*.md` (editing\n // and history are its own view; the PDF is a fallback).\n const fileName = documentData?.file_name\n const isMarkdown = fileExtension(fileName) === '.md'\n const isImage = isImageFile(fileName)\n const isWebmFile = fileExtension(fileName) === '.webm'\n // A resolved \"no video track\" wins over the extension's guess (always video for .webm).\n const isVideo = isWebmFile && webmHasVideoTrack === false ? false : isVideoFile(fileName)\n const isAudio = isWebmFile && webmHasVideoTrack === false ? true : isAudioFile(fileName)\n // Generated artifacts carried as a blob (image/audio/video) render in the media viewer.\n const isBlobArtifact =\n streamingDoc?.mode === 'image' ||\n (documentData?.wp_type === 'artifact' && (isImage || isVideo || isAudio))\n const isArtifact =\n (!!streamingDoc || isTextDraft || documentData?.wp_type === 'artifact' || isMarkdown) &&\n !isBlobArtifact\n // html/react artifacts render live in a sandbox; the streaming mode or the saved extension says.\n const liveKind = isArtifact\n ? (artifactKindFromMode(streamingDoc?.mode ?? undefined) ?? artifactKindFromFileName(fileName))\n : null\n\n // The saved document a chat drafts in while it is open here: a saved artifact or Word document.\n const savedDocumentId = savedDocumentIdFor({\n documentId,\n isDraft,\n isStreaming,\n isBlobArtifact,\n documentData,\n })\n\n // Parsed text is stripped of markup: a live artifact needs its stored source.\n const { data: liveSourceFetched } = useArtifactSource(\n documentId,\n !!liveKind && !streamingDoc && !!documentData && !isDraft\n )\n const liveSource = streamingDoc ? streamingDoc.content : (liveSourceFetched ?? '')\n\n // The text view exists whenever there is parsed content, for any file (a recording's\n // transcript too). `low-content` is a terminal status with indexed passages, just sparse.\n const hasParsedDocStatus =\n documentData?.status === 'completed' || documentData?.status === 'low-content'\n const wantsParsedDoc =\n !!documentId && live && !isStreaming && !isDraft && !isBlobArtifact && hasParsedDocStatus\n const { data: parsedDoc, isPending: isParsedDocPending } = useParsedDocument(\n documentId,\n 'final',\n { enabled: wantsParsedDoc }\n )\n // Loading until the text is read, including while the query still waits for the workspace to\n // open: on a reload the record comes back from the saved query cache before the session has\n // opened the workspace, and the text view a passage link asked for must not be given up then.\n // A document with no text to read (or no workspace at all) is settled at once.\n const isParsedDocLoading = wantsParsedDoc && !!workspaceId && isParsedDocPending\n const hasParsedContent =\n ((parsedDoc as { chunks?: unknown[] } | undefined)?.chunks?.length ?? 0) > 0\n\n return {\n workspaceId,\n documentData,\n streamingDoc,\n isStreaming,\n draftDoc,\n isDraft,\n isCaptureDraft,\n isTextDraft,\n labelSummaries,\n isImage,\n isWebmFile,\n setWebmHasVideoTrack,\n isVideo,\n isAudio,\n isMedia: isVideo || isAudio,\n isBlobArtifact,\n savedDocumentId,\n isArtifact,\n liveKind,\n liveSource,\n isDocx: DOCX_EXTENSIONS.has(fileExtension(fileName)),\n isXlsx: XLSX_EXTENSIONS.has(fileExtension(fileName)),\n isEmail: EMAIL_EXTENSIONS.has(fileExtension(fileName)),\n isDownloadOnly: isDownloadOnlyFile(fileName),\n isParsedDocLoading,\n hasParsedContent,\n }\n}\n\nexport type ViewedDocument = ReturnType<typeof useViewedDocument>\n","/**\n * The bytes the document viewer shows: the PDF (or, for media, the stored file), with the host's\n * copy kept on the device when the network is down; the stored sheet; the `.webm` track probe; and\n * downloading the stored file.\n */\n\nimport { useCallback, useEffect, useState } from 'react'\nimport { hasVideoTrack, loadOfflineDocument } from '@arbidocs/react'\nimport { parseVersionRef } from '@arbidocs/react/artifacts'\nimport {\n fetchDocumentFile,\n useDocumentBytes,\n useDocumentTools,\n} from '@arbidocs/react/document-tools'\nimport { isAudioFile, isImageFile, isVideoFile } from '@arbidocs/react/ui'\nimport { useBlocksEnvironment } from '../../provider/environment'\nimport type { ViewedDocument } from './useViewedDocument'\n\n/** `documentId` may be a version reference (`doc-…@v2`). */\nexport function useViewerBlobs(documentId: string, doc: ViewedDocument) {\n const { documentData, isArtifact, isDocx, isXlsx, isDownloadOnly, isWebmFile } = doc\n const { setWebmHasVideoTrack } = doc\n const { client, saveFile } = useDocumentTools()\n const { notify } = useBlocksEnvironment()\n const currentVersion = documentData?.current_version ?? 1\n\n // Images, video and audio show the stored file; everything else its PDF.\n const name = documentData?.file_name\n const original = isImageFile(name) || isVideoFile(name) || isAudioFile(name)\n // The pinned offline copy is the current version's; an earlier version has none.\n const fallback =\n documentData && !parseVersionRef(documentId).version\n ? () => loadOfflineDocument(documentData.external_id)\n : undefined\n const pdf = useDocumentBytes(documentId, {\n version: currentVersion,\n kind: original ? 'original' : 'pdf',\n enabled:\n !isArtifact &&\n !!documentData &&\n !isDownloadOnly &&\n (!isDocx || documentData.status === 'completed' || documentData.status === 'low-content'),\n fallback,\n })\n // Keep the last bytes on screen while a new version of the same document loads; another\n // document (or version) starts empty, never showing the previous one's pages.\n const [pdfBlob, setPdfBlob] = useState<Blob | null>(null)\n useEffect(() => setPdfBlob(null), [documentId])\n useEffect(() => {\n if (pdf.data) setPdfBlob(pdf.data)\n }, [pdf.data])\n\n // Resolve the ambiguous .webm case once the bytes are here.\n useEffect(() => {\n if (!isWebmFile || !pdfBlob) return\n let cancelled = false\n void hasVideoTrack(pdfBlob).then((result) => {\n if (!cancelled) setWebmHasVideoTrack(result)\n })\n return () => {\n cancelled = true\n }\n }, [isWebmFile, pdfBlob, setWebmHasVideoTrack])\n\n // The stored sheet (all its sheets).\n const xlsx = useDocumentBytes(documentId, {\n version: currentVersion,\n kind: 'original',\n enabled: !isArtifact && !!documentData && isXlsx,\n })\n\n const handleDirectDownload = useCallback(async () => {\n try {\n saveFile(await fetchDocumentFile(client, documentId), documentData?.file_name || 'download')\n } catch {\n notify('Failed to download file', 'error')\n }\n }, [client, saveFile, notify, documentId, documentData?.file_name])\n\n return {\n pdfBlob,\n isPdfLoading: pdf.isLoading,\n pdfError: pdf.error,\n xlsxBlob: xlsx.data ?? null,\n xlsxError: xlsx.error,\n handleDirectDownload,\n }\n}\n","/**\n * Tabs of the document viewer: which tabs a document has, the automatic switches when the\n * document's type or parsed content changes, and switching (which ends a comparison when leaving\n * the tab that hosts it). The open tab is the session state's, so whatever opens a document can\n * open it on a tab.\n */\n\nimport { useEffect, useRef } from 'react'\nimport { Code, FileText, History, MonitorPlay } from 'lucide-react'\nimport { friendlyFileType } from '@arbidocs/react/ui'\nimport {\n AudIcon,\n DocIcon,\n EmlIcon,\n HtmlIcon,\n ImgIcon,\n PdfIcon,\n VidIcon,\n XlsIcon,\n useArbiSessionState,\n useArbiSessionStore,\n type ArbiViewerTab,\n} from '@arbidocs/react'\nimport type { ViewerTab } from '../../files/ViewerParts'\nimport { useIsPhone } from '../../lib/use-media-query'\nimport type { ViewedDocument } from './useViewedDocument'\n\n/**\n * @param hasHistory The document has earlier versions (a signed copy, a re-upload): PDF and text\n * documents then get a Versions tab too. Artifacts and Word documents always have one.\n */\nexport function useViewerTabs(doc: ViewedDocument, isCompact: boolean, hasHistory = false) {\n const {\n documentData,\n isArtifact,\n isDocx,\n isXlsx,\n isEmail,\n isVideo,\n isAudio,\n isImage,\n liveKind,\n hasParsedContent,\n isParsedDocLoading,\n } = doc\n const session = useArbiSessionStore()\n const {\n tab: activeTab,\n compareId,\n tabRequest,\n phonePdfChosen,\n } = useArbiSessionState((s) => s.documentViewer)\n const setActiveTab = (tab: ArbiViewerTab) => session.setDocumentViewer({ tab })\n // A plain-text file is still shown as a generated PDF, but the tab names the file the user\n // opened (\"Text\", as the Fields panel does), not the rendering format.\n const isTextFile = friendlyFileType(documentData?.file_type, documentData?.file_name) === 'Text'\n const isPhone = useIsPhone()\n const phoneDefaultDecidedFor = useRef<string | null>(null)\n\n // Switch to the tab that fits the document type. Only on type changes: never over the user's own\n // choice. Keyed on the document and its kind, not on the record: a refreshed record (a new\n // version finishing processing) must not send a user on the PDF tab of a Word document back to\n // the editor.\n const hasDocumentData = !!documentData\n const documentKey = documentData?.external_id\n useEffect(() => {\n // A Word artifact (an AI draft, stored as .docx) has one Word tab, 'edit', not a DOCX tab.\n if (isArtifact && (activeTab === 'pdf' || (!liveKind && activeTab === 'docx'))) {\n setActiveTab(liveKind ? 'preview' : 'edit')\n } else if (isDocx && activeTab === 'pdf') {\n setActiveTab('docx')\n } else if (!liveKind && activeTab === 'preview') {\n setActiveTab(isArtifact ? 'edit' : 'pdf')\n } else if (!isArtifact && documentData && activeTab === 'edit') {\n setActiveTab(isDocx ? 'docx' : isXlsx ? 'xlsx' : 'pdf')\n } else if (\n !isArtifact &&\n !isDocx &&\n !isXlsx &&\n documentData &&\n (activeTab === 'docx' || activeTab === 'xlsx')\n ) {\n setActiveTab('pdf')\n }\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [hasDocumentData, documentKey, isArtifact, isDocx, isXlsx, liveKind])\n\n // A tab asked for when the document was opened (a signature request opens on the PDF, where it\n // is signed) wins over the type's own tab once that document has loaded, and over the phone's\n // text default. Declared after the type switch above so it has the last word.\n useEffect(() => {\n if (!tabRequest || !documentKey || tabRequest.documentId !== documentKey) return\n phoneDefaultDecidedFor.current = documentKey\n session.setDocumentViewer({ tabRequest: null, tab: tabRequest.tab })\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [documentKey, tabRequest])\n\n // Versions of a PDF or text document exist only with history: leave the tab when there is none\n // (another document opened while it was active).\n const hasVersionsTab = isArtifact || isDocx || hasHistory\n useEffect(() => {\n if (activeTab === 'versions' && documentData && !hasVersionsTab) {\n setActiveTab(isXlsx ? 'xlsx' : 'pdf')\n }\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [activeTab, documentData, hasVersionsTab])\n\n // The text tab exists only with parsed content. When it is open without any (a recording with\n // no transcript, a failed parse), fall back to the natural default once the parsed query\n // settles. Not during a comparison, which uses the text tab. Waits for the record: until it is\n // here the parsed query has not started, so it is not loading yet.\n useEffect(() => {\n if (\n activeTab === 'html' &&\n documentData !== undefined &&\n !isParsedDocLoading &&\n !hasParsedContent &&\n !compareId\n ) {\n setActiveTab(isArtifact ? 'edit' : isDocx ? 'docx' : isXlsx ? 'xlsx' : 'pdf')\n }\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [\n activeTab,\n documentData,\n isParsedDocLoading,\n hasParsedContent,\n compareId,\n isArtifact,\n isDocx,\n isXlsx,\n ])\n\n // Phones open a document on the readable reflowed (text) view: a fit-width PDF on a 390px\n // screen is footnote-sized. Decided once per document, after the parsed query settles, and only\n // over the PDF default (Word, sheets, artifacts and media keep their own tab). A PDF the user\n // picked by hand this session wins.\n useEffect(() => {\n if (!isPhone || !documentKey || isParsedDocLoading) return\n if (phoneDefaultDecidedFor.current === documentKey) return\n phoneDefaultDecidedFor.current = documentKey\n const opensOnPdf =\n !isArtifact && !isDocx && !isXlsx && !isVideo && !isAudio && !isImage && !isEmail\n if (opensOnPdf && hasParsedContent && !compareId && !phonePdfChosen && activeTab === 'pdf') {\n setActiveTab('html')\n }\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [isPhone, documentKey, isParsedDocLoading, hasParsedContent])\n\n const handleTabChange = (tabId: string) => {\n // A comparison is shown on the text tab: leaving it ends the comparison.\n const change: Parameters<typeof session.setDocumentViewer>[0] = { tab: tabId as ArbiViewerTab }\n if (tabId !== 'html' && compareId) change.compareId = null\n // A phone user who goes back to the PDF wants it: stop opening documents on the text view\n // until they pick it again.\n if (isPhone && (tabId === 'pdf' || tabId === 'html')) change.phonePdfChosen = tabId === 'pdf'\n session.setDocumentViewer(change)\n }\n\n const mediaTab = isVideo\n ? { icon: <VidIcon size={20} />, tooltip: 'Video' }\n : isAudio\n ? { icon: <AudIcon size={20} />, tooltip: 'Audio' }\n : isImage\n ? { icon: <ImgIcon size={20} />, tooltip: 'Image' }\n : isEmail\n ? { icon: <EmlIcon size={20} />, tooltip: 'Email' }\n : isTextFile\n ? { icon: <FileText className=\"size-5\" />, tooltip: 'Text' }\n : documentData\n ? { icon: <PdfIcon size={20} />, tooltip: 'PDF' }\n : // The file type is unknown until the record loads: name no guess (a text file\n // would flip from PDF to Text once it arrives).\n { icon: <FileText className=\"size-5\" />, tooltip: 'Document' }\n // Tabs say what they are: in a narrow panel or on a phone only the open tab keeps its name, plus\n // the text view, whose icon is not recognisable. Labelling every tab there would crowd the header.\n const tabLabel = (id: string, label: string) =>\n !isCompact || activeTab === id || id === 'html' ? label : undefined\n\n const versionsTab: ViewerTab = {\n id: 'versions',\n icon: <History className=\"size-5\" />,\n tooltip: 'Versions',\n label: tabLabel('versions', 'Versions'),\n }\n const viewerTabs: ViewerTab[] = [\n ...(isArtifact\n ? [\n ...(liveKind\n ? [\n {\n id: 'preview',\n icon: <MonitorPlay className=\"size-5\" />,\n tooltip: 'Preview',\n label: tabLabel('preview', 'Preview'),\n },\n ]\n : []),\n {\n id: 'edit',\n icon: liveKind ? <Code className=\"size-5\" /> : <FileText className=\"size-5\" />,\n tooltip: liveKind ? 'Code' : 'Editor',\n label: tabLabel('edit', liveKind ? 'Code' : 'Document'),\n },\n versionsTab,\n ]\n : [\n ...(isDocx\n ? [\n {\n id: 'docx',\n icon: <DocIcon size={20} />,\n tooltip: 'DOCX (with track changes & comments)',\n label: tabLabel('docx', 'DOCX'),\n },\n ]\n : []),\n ...(isXlsx\n ? [\n {\n id: 'xlsx',\n icon: <XlsIcon size={20} />,\n tooltip: 'Spreadsheet',\n label: tabLabel('xlsx', 'Sheet'),\n },\n ]\n : []),\n { id: 'pdf', ...mediaTab, label: tabLabel('pdf', mediaTab.tooltip) },\n ...(hasVersionsTab ? [versionsTab] : []),\n ]),\n ...((hasParsedContent || compareId) && !liveKind\n ? [\n {\n id: 'html',\n icon: compareId ? <FileText className=\"size-5\" /> : <HtmlIcon size={20} />,\n tooltip: compareId ? 'Word redline' : 'HTML',\n label: tabLabel('html', compareId ? 'Compare' : 'HTML'),\n },\n ]\n : []),\n ]\n\n return { activeTab, handleTabChange, viewerTabs }\n}\n","/**\n * A document's versions (oldest first; every row's `id` is a version reference) and its\n * translations (each its own document, made from one of its versions). A listed document carries\n * its versions, so it costs no request; one that is not in the workspace list asks for them.\n */\n\nimport { useMemo } from 'react'\nimport { useDocumentVersionList } from '@arbidocs/react'\nimport {\n documentVersions,\n parseVersionRef,\n toArtifactVersions,\n type ArtifactVersion,\n} from '@arbidocs/react/artifacts'\nimport type { TranslationEntry } from '../../artifacts/VersionTimeline'\nimport { useConnectedDocuments } from '../workspaceData'\n\nexport function useViewerVersions(docId: string | null | undefined): {\n versions: ArtifactVersion[]\n translations: TranslationEntry[]\n} {\n const plainId = docId ? parseVersionRef(docId).docId : ''\n const { data: documents } = useConnectedDocuments()\n const listed = useMemo(\n () => (plainId ? documents.find((d) => d.external_id === plainId) : undefined),\n [documents, plainId]\n )\n const { data: history } = useDocumentVersionList(plainId, { enabled: !!plainId && !listed })\n const versions = useMemo(\n () => (listed ? documentVersions(listed) : toArtifactVersions(plainId || null, history)),\n [listed, history, plainId]\n )\n // A translation is its own document (with its own versions), never a version of the source, so\n // opening the source always opens the source.\n const translations = useMemo<TranslationEntry[]>(() => {\n if (!plainId) return []\n return documents\n .flatMap((doc) => {\n const link = doc.derived_from?.find(\n (d) => d.role === 'translation' && d.doc_ext_id === plainId\n )\n return link\n ? [\n {\n id: doc.external_id,\n name: doc.doc_metadata?.title || doc.file_name || doc.external_id,\n createdAt: doc.created_at,\n sourceVersion: link.version ?? null,\n final: !!doc.derived_from?.some((d) => d.role === 'final'),\n },\n ]\n : []\n })\n .sort((a, b) => a.createdAt.localeCompare(b.createdAt))\n }, [documents, plainId])\n return { versions, translations }\n}\n","import type { components } from '@arbidocs/client'\n\ntype ScopedTag = Pick<\n components['schemas']['TagResponse'],\n 'kind' | 'doctag_count' | 'facttag_count'\n>\n\n/**\n * A tag of the documents' vocabulary: not a saved search, and used on documents or not used\n * anywhere yet (a tag used only on facts belongs to the facts').\n */\nexport function isDocumentTag(tag: ScopedTag): boolean {\n if (tag.kind === 'search') return false\n const onDocs = (tag.doctag_count ?? 0) > 0\n const onFacts = (tag.facttag_count ?? 0) > 0\n return onDocs || !onFacts\n}\n","/**\n * Hook for managing chunk-level tagging\n *\n * Provides utilities for applying/removing tags to specific chunks\n * within a document, and determining which tags apply to a chunk.\n *\n * Citations format: CitedDocument[] — a doc-first, best-first list of the\n * documents (each with its cited chunks) backing the doctag's note. A doctag\n * is grounded in passages, so a document that loses its last chunk drops out,\n * and the doctag itself becomes ungrounded (null) once no documents remain.\n */\n\nimport { useCallback } from 'react'\nimport type { components } from '@arbidocs/client'\nimport { useAssignDocTags, useRemoveDocTags, useUpdateDocTag } from '@arbidocs/react'\n\ntype CitationSources = components['schemas']['CitationSources']\ntype DocTag = components['schemas']['DocTagResponse']\ntype Tag = Pick<components['schemas']['TagResponse'], 'external_id'>\n\ntype Citations = CitationSources | null | undefined\n\ninterface UseChunkTaggingProps {\n documentId: string\n documentDoctags: DocTag[]\n}\n\ninterface ChunkTagState {\n /** Tags that are applied to this specific chunk */\n appliedTags: DocTag[]\n /** Check if a specific tag is applied to this chunk */\n isTagApplied: (tagExtId: string) => boolean\n /** Get the doctag for a specific tag if it applies to this chunk */\n getDoctagForChunk: (tagExtId: string) => DocTag | undefined\n}\n\n/** Whether this chunk is among the passages backing the doctag. */\nfunction hasChunkInCitations(citations: Citations, chunkExtId: string): boolean {\n return (citations ?? []).some((d) => d.chunks?.some((c) => c.chunk_id === chunkExtId))\n}\n\n/** Every passage backing the doctag, document order then chunk order. */\nexport function getAllChunkIdsFromCitations(citations: Citations): string[] {\n return (citations ?? []).flatMap((d) => (d.chunks ?? []).map((c) => c.chunk_id))\n}\n\n/**\n * Drop a passage. A doctag is grounded in passages, not whole documents, so a\n * document that loses its last passage goes too; null once none remain, so an\n * emptied doctag is ungrounded rather than grounded-in-nothing.\n */\nexport function removeChunkFromCitations(citations: Citations, chunkExtId: string): Citations {\n if (!citations) return null\n const next = citations\n .map((d) => ({ ...d, chunks: (d.chunks ?? []).filter((c) => c.chunk_id !== chunkExtId) }))\n .filter((d) => d.chunks.length > 0)\n return next.length ? next : null\n}\n\n/** Add a passage under its document, ignoring duplicates. Order is the ranking. */\nexport function addChunkToCitations(\n citations: Citations,\n documentId: string,\n chunkExtId: string\n): CitationSources {\n // Hand-added passages carry no page: the viewer knows the chunk id, and the\n // page is resolved from it at render time.\n const chunk = { chunk_id: chunkExtId, page: null }\n const list = citations ?? []\n const idx = list.findIndex((d) => d.doc_ext_id === documentId)\n if (idx === -1) return [...list, { doc_ext_id: documentId, chunks: [chunk] }]\n const doc = list[idx]\n if ((doc.chunks ?? []).some((c) => c.chunk_id === chunkExtId)) return list\n const next = [...list]\n next[idx] = { ...doc, chunks: [...(doc.chunks ?? []), chunk] }\n return next\n}\n\nexport function useChunkTagging({ documentId, documentDoctags }: UseChunkTaggingProps) {\n const createDocTag = useAssignDocTags()\n const updateDocTag = useUpdateDocTag()\n const deleteDocTag = useRemoveDocTags()\n\n /**\n * Get the tagging state for a specific chunk\n */\n const getChunkTagState = useCallback(\n (chunkExtId: string): ChunkTagState => {\n // Find doctags that apply to this specific chunk (check citations)\n const appliedTags = documentDoctags.filter((dt) =>\n hasChunkInCitations(dt.citations, chunkExtId)\n )\n\n const isTagApplied = (tagExtId: string): boolean => {\n return appliedTags.some((dt) => dt.tag_ext_id === tagExtId)\n }\n\n const getDoctagForChunk = (tagExtId: string): DocTag | undefined => {\n return appliedTags.find((dt) => dt.tag_ext_id === tagExtId)\n }\n\n return {\n appliedTags,\n isTagApplied,\n getDoctagForChunk,\n }\n },\n [documentDoctags]\n )\n\n /**\n * Toggle a tag on/off for a specific chunk\n */\n const toggleChunkTag = useCallback(\n async (chunkExtId: string, tag: Tag, note?: string): Promise<void> => {\n const existingDoctag = documentDoctags.find((dt) => dt.tag_ext_id === tag.external_id)\n const isChunkTagged = hasChunkInCitations(existingDoctag?.citations, chunkExtId)\n\n if (isChunkTagged) {\n // Remove chunk from this doctag's citations\n const updatedCitations = removeChunkFromCitations(existingDoctag!.citations, chunkExtId)\n\n if (!updatedCitations) {\n // No citations remain - delete the entire doctag\n await deleteDocTag.mutateAsync({\n tagId: tag.external_id,\n docIds: [documentId],\n })\n } else {\n // Update doctag with remaining citations\n await updateDocTag.mutateAsync({\n tagId: tag.external_id,\n docId: documentId,\n citations: updatedCitations,\n note: existingDoctag!.note,\n })\n }\n } else {\n // Add chunk to tag\n if (existingDoctag) {\n // Doctag exists - add this chunk to citations\n const updatedCitations = addChunkToCitations(\n existingDoctag.citations,\n documentId,\n chunkExtId\n )\n await updateDocTag.mutateAsync({\n tagId: tag.external_id,\n docId: documentId,\n citations: updatedCitations,\n note: note ?? existingDoctag.note,\n })\n } else {\n // Create new doctag with this chunk\n const newCitations = addChunkToCitations(null, documentId, chunkExtId)\n await createDocTag.mutateAsync({\n tagId: tag.external_id,\n docIds: [documentId],\n citations: newCitations,\n note: note,\n })\n }\n }\n },\n [documentId, documentDoctags, createDocTag, updateDocTag, deleteDocTag]\n )\n\n /**\n * Update the note for a chunk tag\n */\n const updateChunkTagNote = useCallback(\n async (_chunkExtId: string, tag: Tag, note: string | null): Promise<void> => {\n const existingDoctag = documentDoctags.find((dt) => dt.tag_ext_id === tag.external_id)\n if (!existingDoctag) return\n\n await updateDocTag.mutateAsync({\n tagId: tag.external_id,\n docId: documentId,\n citations: existingDoctag.citations,\n note: note,\n })\n },\n [documentId, documentDoctags, updateDocTag]\n )\n\n /**\n * Get all unique tag external IDs applied to a chunk (for accent bar display)\n */\n const getChunkTagColors = useCallback(\n (chunkExtId: string, workspaceTags: Tag[]): string[] => {\n const { appliedTags } = getChunkTagState(chunkExtId)\n return appliedTags\n .map((dt) => {\n const tag = workspaceTags.find((t) => t.external_id === dt.tag_ext_id)\n return tag?.external_id\n })\n .filter((id): id is string => !!id)\n },\n [getChunkTagState]\n )\n\n const isLoading = createDocTag.isPending || updateDocTag.isPending || deleteDocTag.isPending\n\n return {\n getChunkTagState,\n toggleChunkTag,\n updateChunkTagNote,\n getChunkTagColors,\n isLoading,\n }\n}\n","/**\n * The passage tagging panel: the `TagPassagePanel` block bound to the passage's labels and fields\n * (apply, remove, a note per passage).\n */\n\nimport { useState, useMemo, useCallback } from 'react'\nimport type { components } from '@arbidocs/client'\nimport { TagEntity, getEntityColor } from '@arbidocs/react/ui'\nimport { TagPassagePanel, type PassageTagGroupView } from '../../../files/TagPassagePanel'\nimport { useConnectedTags, type ConnectedTag } from '../../workspaceData'\nimport { useDocumentViewerSupport } from '../support'\nimport { isDocumentTag } from './document-tags'\nimport { useChunkTagging } from './useChunkTagging'\n\ntype DocTag = components['schemas']['DocTagResponse']\ntype Tag = ConnectedTag\n\n/** The panel's group headings, by format: labels, then the fields' value types. */\nconst GROUP_TITLES: Record<string, string> = {\n checkbox: 'Label',\n select: 'Choice',\n text: 'Text',\n number: 'Number',\n}\n\ninterface PassageTagPanelProps {\n documentId: string\n chunkExtId: string\n chunkContent: string\n pageNumber?: number\n documentDoctags: DocTag[]\n onClose: () => void\n /** Called when a tag is selected to show all chunks with that tag */\n onViewTaggedChunks?: (tagExtId: string) => void\n}\n\nexport function PassageTagPanel({\n documentId,\n chunkExtId,\n chunkContent,\n pageNumber,\n documentDoctags,\n onClose,\n onViewTaggedChunks,\n}: PassageTagPanelProps) {\n const { createTag } = useDocumentViewerSupport()\n\n // Track which tag's note is being edited\n const [editingNoteTagId, setEditingNoteTagId] = useState<string | null>(null)\n const [noteValue, setNoteValue] = useState('')\n\n // Get workspace tags (filtered to exclude search tags)\n const { data: allTags } = useConnectedTags()\n const workspaceTags = useMemo(() => allTags.filter(isDocumentTag), [allTags])\n\n // Chunk tagging utilities\n const { getChunkTagState, toggleChunkTag, updateChunkTagNote, isLoading } = useChunkTagging({\n documentId,\n documentDoctags,\n })\n\n const chunkState = useMemo(() => getChunkTagState(chunkExtId), [getChunkTagState, chunkExtId])\n\n // Group tags by type for organized display\n const groupedTags = useMemo(() => {\n const groups: Record<string, Tag[]> = {\n checkbox: [],\n select: [],\n text: [],\n number: [],\n }\n\n workspaceTags.forEach((tag) => {\n // Labels (and issues) under `checkbox`; annotations by their format.\n const group =\n tag.kind === 'label' ? 'checkbox' : tag.kind === 'annotation' ? tag.tag_type.type : null\n if (group && groups[group]) {\n groups[group].push(tag)\n }\n })\n\n return groups\n }, [workspaceTags])\n\n const handleToggleTag = useCallback(\n async (tag: Tag) => {\n try {\n await toggleChunkTag(chunkExtId, tag)\n } catch (error) {\n console.error('Failed to toggle chunk tag:', error)\n }\n },\n [chunkExtId, toggleChunkTag]\n )\n\n const handleStartEditNote = useCallback(\n (tagExtId: string) => {\n const doctag = chunkState.getDoctagForChunk(tagExtId)\n setNoteValue(doctag?.note || '')\n setEditingNoteTagId(tagExtId)\n },\n [chunkState]\n )\n\n const handleSaveNote = useCallback(\n async (tag: Tag) => {\n try {\n await updateChunkTagNote(chunkExtId, tag, noteValue || null)\n } catch (error) {\n console.error('Failed to save note:', error)\n }\n setEditingNoteTagId(null)\n setNoteValue('')\n },\n [chunkExtId, noteValue, updateChunkTagNote]\n )\n\n const preview = useMemo(() => {\n const maxLength = 200\n if (chunkContent.length <= maxLength) return chunkContent\n return chunkContent.slice(0, maxLength) + '...'\n }, [chunkContent])\n\n const groups = useMemo<PassageTagGroupView[]>(\n () =>\n Object.entries(groupedTags)\n .filter(([, tags]) => tags.length > 0)\n .map(([type, tags]) => ({\n id: type,\n title: GROUP_TITLES[type] ?? type,\n tags: tags.map((tag) => ({\n id: tag.external_id,\n color: getEntityColor(tag.external_id, 'medium'),\n isApplied: chunkState.isTagApplied(tag.external_id),\n note: chunkState.getDoctagForChunk(tag.external_id)?.note,\n badge: <TagEntity tag={tag} size=\"sm\" showTooltip={false} />,\n })),\n })),\n [groupedTags, chunkState]\n )\n const tagById = useMemo(\n () => new Map(workspaceTags.map((tag) => [tag.external_id, tag])),\n [workspaceTags]\n )\n\n return (\n <TagPassagePanel\n pageNumber={pageNumber}\n preview={preview}\n groups={groups}\n isEmpty={workspaceTags.length === 0}\n isBusy={isLoading}\n editingNoteTagId={editingNoteTagId}\n noteValue={noteValue}\n onNoteChange={setNoteValue}\n onToggle={(id) => {\n const tag = tagById.get(id)\n if (tag) void handleToggleTag(tag)\n }}\n onViewTagged={onViewTaggedChunks}\n onStartNote={handleStartEditNote}\n onSaveNote={(id) => {\n const tag = tagById.get(id)\n if (tag) void handleSaveNote(tag)\n }}\n onCancelNote={() => {\n setEditingNoteTagId(null)\n setNoteValue('')\n }}\n onCreate={createTag}\n onClose={onClose}\n />\n )\n}\n","/**\n * ParsedPassage: binds one parsed chunk to the `HtmlPassage` block (markdown body, citation\n * entity pills, copy/link/label/navigator actions). Memoized so selecting one passage does not\n * re-parse the markdown of the others. The body is the conversation's markdown (`ConnectedMarkdown`),\n * so a passage's links and bookmarks are the same quiet marks as an answer's, with their menu.\n */\n\nimport { memo } from 'react'\nimport type { MarkMenuItem } from '@arbidocs/react/ui'\nimport type { ProcessedChunk } from '@arbidocs/react/viewers'\nimport { LabelMark, NoteMark, PassageMark } from '../../../citations/QuietMarks'\nimport { HtmlPassage } from '../../../files'\nimport { ConnectedMarkdown } from '../../conversation/ConnectedMarkdown'\nimport type { PassageLabel } from './useDocumentLabels'\n\nexport interface ParsedPassageProps {\n chunk: ProcessedChunk\n pageNumber: number | null\n isHighlighted: boolean\n isSelected: boolean\n /** One of a fact's cited passages, listed in an open Citation popover. */\n isCitationHighlight: boolean\n /** The cited passage currently being read from the Citation popover. */\n isActiveCitation: boolean\n /** A fact's Citation popover drives the highlights; its shades win over the selection fill. */\n factCitationActive: boolean\n isCitationMode: boolean\n runIsStart: boolean\n runIsEnd: boolean\n /** Last passage index of the run; set only on the run's first member. */\n runEndIndex: number | undefined\n onChunkClick: ((chunkId: string, extendFromAnchor: boolean) => void) | undefined\n formatChunkWithCitation: (\n content: string,\n pageNumber: number | undefined,\n chunkExtId: string | undefined\n ) => string\n getPassageDeepLink: (chunkExtId: string | undefined) => string | null\n copyToClipboard: (\n text: string,\n metadata: {\n type: 'passage' | 'link'\n documentTitle: string\n pageNumber: number | undefined\n passageIndex: number | undefined\n passageContent: string\n href?: string\n }\n ) => void\n /** Open the document's passages in the host's navigator. Absent: not offered. */\n onOpenNavigator: (() => void) | undefined\n /** Labels applied to this passage. */\n labels: PassageLabel[]\n /** The label currently being walked, when it marks this passage. */\n activeTagColor: string | undefined\n /** Open the tagging panel for this passage. */\n onTagPassage: ((chunkExtId: string) => void) | undefined\n /** Walk a label's passages (the label mark's Show row). */\n onShowLabel: ((tagExtId: string) => void) | undefined\n /** Take a label off this passage (the label mark's Remove row). */\n onRemoveLabel: ((chunkExtId: string, tagExtId: string) => void) | undefined\n}\n\nexport const ParsedPassage = memo(function ParsedPassage({\n chunk,\n pageNumber,\n isHighlighted,\n isSelected,\n isCitationHighlight,\n isActiveCitation,\n factCitationActive,\n isCitationMode,\n runIsStart,\n runIsEnd,\n runEndIndex,\n labels,\n activeTagColor,\n onTagPassage,\n onShowLabel,\n onRemoveLabel,\n onChunkClick,\n formatChunkWithCitation,\n getPassageDeepLink,\n copyToClipboard,\n onOpenNavigator,\n}: ParsedPassageProps) {\n const chunkId = chunk.chunkExtId\n const formattedContent = chunkId\n ? formatChunkWithCitation(chunk.content, pageNumber || undefined, chunkId)\n : ''\n\n // While a fact's Citation popover drives the view, its cited set (light) and the passage being\n // read (strong) take precedence over the citation-mode selection.\n const isStrong = isActiveCitation || (!factCitationActive && isSelected)\n const isLight = isCitationHighlight || (!factCitationActive && isHighlighted)\n\n // One label per run, on its first member: \"¶4\" or \"¶4-9\".\n const ownIndex = chunk.chunkIndex !== undefined ? chunk.chunkIndex + 1 : undefined\n const runLabel =\n runEndIndex !== undefined && ownIndex !== undefined && runEndIndex > ownIndex\n ? `¶${ownIndex}–${runEndIndex}`\n : `¶${ownIndex ?? ''}`\n const showLabel = !!chunkId && (!isSelected || runIsStart)\n\n const copyPassage = (type: 'passage' | 'link', text: string, href?: string) =>\n copyToClipboard(text, {\n type,\n documentTitle: chunk.docTitle || 'Document',\n pageNumber: pageNumber || undefined,\n passageIndex: chunk.chunkIndex,\n passageContent: formattedContent,\n href,\n })\n\n // ONE menu for the passage: every action that used to be a button in a column beside it.\n const passageItems: MarkMenuItem[] = chunkId\n ? [\n {\n id: 'copy-passage',\n label: 'Copy passage with citation',\n primary: true,\n testId: 'passage-copy',\n onSelect: () =>\n copyPassage('passage', formattedContent, getPassageDeepLink(chunkId) || undefined),\n },\n {\n id: 'copy-link',\n label: 'Copy passage link',\n testId: 'passage-copy-link',\n onSelect: () => {\n const link = getPassageDeepLink(chunkId)\n if (link) copyPassage('link', link, link)\n },\n },\n ...(onTagPassage\n ? [\n {\n id: 'label',\n label: 'Label this passage',\n testId: 'passage-label',\n onSelect: () => onTagPassage(chunkId),\n },\n ]\n : []),\n ...(onOpenNavigator\n ? [\n {\n id: 'navigator',\n label: 'Open in navigator',\n testId: 'passage-navigator',\n onSelect: onOpenNavigator,\n },\n ]\n : []),\n ]\n : []\n\n const labelItems: MarkMenuItem[] = chunkId\n ? labels.flatMap((l, i) => {\n const suffix = labels.length > 1 ? ` “${l.name}”` : ' label'\n return [\n ...(onShowLabel\n ? [\n {\n id: `show-${l.tagExtId}`,\n label: `Show${suffix}`,\n primary: i === 0,\n testId: 'label-show',\n onSelect: () => onShowLabel(l.tagExtId),\n },\n ]\n : []),\n ...(onRemoveLabel\n ? [\n {\n id: `remove-${l.tagExtId}`,\n label: `Remove${suffix}`,\n destructive: true,\n testId: 'label-remove',\n onSelect: () => onRemoveLabel(chunkId, l.tagExtId),\n },\n ]\n : []),\n ]\n })\n : []\n\n return (\n <HtmlPassage\n chunkId={chunkId}\n highlight={isStrong ? 'strong' : isLight ? 'light' : undefined}\n isHit={isHighlighted}\n isSelected={isSelected}\n runIsStart={runIsStart}\n runIsEnd={runIsEnd}\n isClickable={isCitationMode}\n onSelect={onChunkClick && chunkId ? (extend) => onChunkClick(chunkId, extend) : undefined}\n isTagged={labels.length > 0}\n activeTagColor={activeTagColor}\n tagMark={\n labels.length > 0 ? (\n <LabelMark\n colors={labels.map((l) => l.color)}\n name={`Labels: ${labels.map((l) => l.name).join(', ')}`}\n menuLabel=\"Label actions\"\n testId={`passage-tag-dots-${chunkId}`}\n preview={\n <span className=\"block font-medium\">{labels.map((l) => l.name).join(', ')}</span>\n }\n items={labelItems}\n />\n ) : undefined\n }\n runMarker={\n isSelected && runIsStart ? (\n <NoteMark\n label={runLabel}\n title=\"Cited by this note — click a passage to add, shift-click for a range\"\n testId={`note-marker-${chunkId}`}\n />\n ) : undefined\n }\n mark={\n showLabel && chunkId ? (\n <PassageMark\n label={runLabel}\n menuLabel=\"Passage actions\"\n testId={`passage-mark-${chunkId}`}\n items={passageItems}\n />\n ) : undefined\n }\n >\n <ConnectedMarkdown>{chunk.content}</ConnectedMarkdown>\n </HtmlPassage>\n )\n})\n","/**\n * Utility functions for formatting citations\n */\n\ninterface ChunkCopyData {\n content: string\n documentTitle?: string\n documentDate?: string\n pageNumber?: number\n chunkId?: string\n}\n\n/**\n * Formats a citation in basic academic format\n * @param data - The chunk and document data\n * @returns Formatted citation string\n */\nexport function formatCitation(data: ChunkCopyData): string {\n const { documentTitle, documentDate, pageNumber } = data\n\n let citation = ''\n\n if (documentTitle) {\n citation += `${documentTitle}`\n }\n\n if (documentDate) {\n citation += documentTitle ? `, ${documentDate}` : documentDate\n }\n\n if (pageNumber) {\n citation += citation ? `, p. ${pageNumber}` : `p. ${pageNumber}`\n }\n\n return citation\n}\n","/**\n * Passage Copy Hook\n *\n * Handles citation formatting and clipboard operations for document passages.\n */\n\nimport React, { useCallback } from 'react'\nimport { HtmlIcon } from '@arbidocs/react'\nimport { buildDeepLinkUrl } from '../../../lib/deep-link'\nimport { PassagePill } from '../../../citations/PassagePill'\nimport { useBlocksEnvironment } from '../../../provider/environment'\nimport type { ViewerDocumentRecord } from '../support'\nimport { formatCitation } from './citation-line'\n\ninterface PassageInfo {\n type: 'link' | 'passage'\n documentTitle: string\n pageNumber?: number\n passageIndex?: number\n passageContent: string\n href?: string\n}\n\ninterface UsePassageCopyProps {\n documentId: string\n documentData: ViewerDocumentRecord | null | undefined\n selectedWorkspaceId: string | null\n}\n\nexport function usePassageCopy({\n documentId,\n documentData,\n selectedWorkspaceId,\n}: UsePassageCopyProps) {\n const { notify, runtimeConfig } = useBlocksEnvironment()\n const deploymentDomain = runtimeConfig.deploymentDomain\n /**\n * Format chunk content with citation and deep link\n */\n const formatChunkWithCitation = useCallback(\n (chunkContent: string, pageNumber?: number, chunkExtId?: string) => {\n const docDate = documentData?.doc_metadata?.doc_date\n const citation = formatCitation({\n content: chunkContent,\n documentTitle: documentData?.doc_metadata?.title || documentData?.file_name || '',\n documentDate: docDate ? new Date(docDate).toISOString().split('T')[0] : undefined,\n pageNumber,\n })\n\n // Build deep link URL\n const deepLinkUrl =\n selectedWorkspaceId && documentId && chunkExtId\n ? buildDeepLinkUrl(\n { workspaceId: selectedWorkspaceId, documentId, chunkId: chunkExtId },\n deploymentDomain\n )\n : ''\n\n let result = `\"${chunkContent.trim()}\"`\n if (citation) {\n result += `\\n\\n— ${citation}`\n }\n if (deepLinkUrl) {\n result += `\\n[ARBI Docs link](${deepLinkUrl})`\n }\n return result\n },\n [documentData, selectedWorkspaceId, documentId, deploymentDomain]\n )\n\n /**\n * Get the passage deep link URL\n */\n const getPassageDeepLink = useCallback(\n (chunkExtId?: string) => {\n if (!selectedWorkspaceId || !documentId || !chunkExtId) {\n return ''\n }\n return buildDeepLinkUrl(\n { workspaceId: selectedWorkspaceId, documentId, chunkId: chunkExtId },\n deploymentDomain\n )\n },\n [selectedWorkspaceId, documentId, deploymentDomain]\n )\n\n /**\n * Copy text to clipboard with dual format (HTML + plain text)\n */\n const copyToClipboard = useCallback(\n async (text: string, passageInfo?: PassageInfo) => {\n try {\n if (passageInfo?.href) {\n const isLink = passageInfo.type === 'link'\n const { documentTitle, pageNumber, passageIndex, href } = passageInfo\n\n // Build citation text: \"Document Title, p.X(Y)\"\n const pageNotation = pageNumber ? `p.${pageNumber}` : ''\n const passageNotation = passageIndex !== undefined ? `(${passageIndex})` : ''\n const citation = `${documentTitle}${pageNotation ? `, ${pageNotation}${passageNotation}` : ''}`\n\n let html: string\n let plainText: string\n\n if (isLink) {\n // Link only: clickable link\n html = `<a href=\"${href}\" target=\"_blank\" rel=\"noopener noreferrer\">${citation}</a>`\n plainText = href\n } else {\n // Passage: link first, then content\n const linkHtml = `<p><a href=\"${href}\" target=\"_blank\" rel=\"noopener noreferrer\">${citation}</a></p>`\n html = `${linkHtml}<blockquote style=\"margin: 8px 0; padding-left: 12px; border-left: 3px solid #ccc;\">${text}</blockquote>`\n plainText = `${href}\\n\\n${text}\\n\\n— ${citation}`\n }\n\n const clipboardItem = new ClipboardItem({\n 'text/html': new Blob([html], { type: 'text/html' }),\n 'text/plain': new Blob([plainText], { type: 'text/plain' }),\n })\n\n await navigator.clipboard.write([clipboardItem])\n\n // Show notification\n const prefix = isLink ? 'Link copied:' : 'Passage copied:'\n const notificationElement = React.createElement(\n 'span',\n { className: 'inline-flex items-center gap-2' },\n prefix,\n React.createElement(PassagePill, {\n icon: React.createElement(HtmlIcon, { size: 16, className: 'flex-shrink-0' }),\n documentTitle: passageInfo.documentTitle,\n pageNumber: passageInfo.pageNumber,\n passageIndex: passageInfo.passageIndex,\n href: passageInfo.href,\n onClick: (e: React.MouseEvent) => e.stopPropagation(),\n })\n )\n\n notify(notificationElement, 'success', {\n workspaceId: selectedWorkspaceId || undefined,\n // The bell entry deep-links back to the copied passage.\n href: passageInfo.href,\n })\n } else {\n // Fallback: plain text only\n await navigator.clipboard.writeText(text)\n notify('Copied to clipboard', 'success')\n }\n } catch (err) {\n console.error('Clipboard copy failed:', err)\n notify('Failed to copy to clipboard.', 'error')\n }\n },\n [selectedWorkspaceId, notify]\n )\n\n return {\n formatChunkWithCitation,\n getPassageDeepLink,\n copyToClipboard,\n }\n}\n","/**\n * Labels (doctags) on the parsed document: summaries, per-passage colours, the label being\n * walked, and the passage being labelled. A doctag is anchored to the document, so its passages\n * come with the document itself; no reverse lookup.\n */\n\nimport { useCallback, useEffect, useMemo, useState } from 'react'\nimport type { components } from '@arbidocs/client'\nimport { getEntityColor } from '@arbidocs/react/ui'\nimport { isDocumentLabel, summariseDocTags } from '../../../files/doc-labels'\nimport { useConnectedTags, type ConnectedTag } from '../../workspaceData'\nimport { isDocumentTag } from './document-tags'\nimport { useChunkTagging } from './useChunkTagging'\n\ntype DocTag = components['schemas']['DocTagResponse']\n\n/** One label marking a passage. */\nexport interface PassageLabel {\n tagExtId: string\n name: string\n color: string\n}\n\nexport function useDocumentLabels(\n documentId: string,\n doctags: DocTag[] | undefined,\n orderedChunkIds: string[]\n) {\n const { data: allTags } = useConnectedTags()\n const workspaceTags = useMemo<ConnectedTag[]>(() => allTags.filter(isDocumentTag), [allTags])\n const documentDoctags = useMemo<DocTag[]>(() => doctags ?? [], [doctags])\n const tagSummaries = useMemo(\n () => summariseDocTags(documentDoctags, workspaceTags),\n [documentDoctags, workspaceTags]\n )\n // The chip bar carries labels only; annotations are per-document answers, not filters.\n const labelSummaries = useMemo(\n () => summariseDocTags(documentDoctags, workspaceTags.filter(isDocumentLabel)),\n [documentDoctags, workspaceTags]\n )\n\n /** chunk id -> every label marking it (name + colour). */\n const labelsByChunk = useMemo(() => {\n const map = new Map<string, PassageLabel[]>()\n for (const s of tagSummaries) {\n const label = {\n tagExtId: s.tagExtId,\n name: s.name,\n color: getEntityColor(s.tagExtId, 'medium'),\n }\n for (const id of s.chunkIds) {\n const list = map.get(id)\n if (list) list.push(label)\n else map.set(id, [label])\n }\n }\n return map\n }, [tagSummaries])\n\n const { toggleChunkTag } = useChunkTagging({ documentId, documentDoctags })\n /** Take one label off one passage (the label mark's Remove row). */\n const removeLabel = useCallback(\n async (chunkExtId: string, tagExtId: string) => {\n const tag = workspaceTags.find((t) => t.external_id === tagExtId)\n if (!tag) return\n try {\n await toggleChunkTag(chunkExtId, tag)\n } catch (error) {\n console.error('Failed to remove passage label', error)\n }\n },\n [workspaceTags, toggleChunkTag]\n )\n\n // One label at a time: two washes on one paragraph say nothing.\n const [activeTagExtId, setActiveTagExtId] = useState<string | null>(null)\n const [tagCursor, setTagCursor] = useState(0)\n /** The passage being labelled; opens the tagging panel. */\n const [taggingChunkId, setTaggingChunkId] = useState<string | null>(null)\n\n const activeTagSummary = tagSummaries.find((t) => t.tagExtId === activeTagExtId)\n const activeTagColor = activeTagExtId ? getEntityColor(activeTagExtId, 'medium') : undefined\n const activeChunkIds = useMemo(\n () => new Set(activeTagSummary?.chunkIds ?? []),\n [activeTagSummary]\n )\n\n /** Walk the active label's passages in document order, not citation order. */\n const orderedActiveIds = useMemo(\n () => orderedChunkIds.filter((id) => activeChunkIds.has(id)),\n [orderedChunkIds, activeChunkIds]\n )\n const gotoTagged = useCallback(\n (delta: number) => {\n if (orderedActiveIds.length === 0) return\n const next = (tagCursor + delta + orderedActiveIds.length) % orderedActiveIds.length\n setTagCursor(next)\n document\n .getElementById(orderedActiveIds[next])\n ?.scrollIntoView({ behavior: 'smooth', block: 'center' })\n },\n [tagCursor, orderedActiveIds]\n )\n const selectTag = useCallback((tagExtId: string | null) => {\n setActiveTagExtId(tagExtId)\n setTagCursor(0)\n }, [])\n // Selecting a label jumps to its first passage, or the highlight may be off-screen.\n useEffect(() => {\n if (!activeTagExtId || orderedActiveIds.length === 0) return\n document\n .getElementById(orderedActiveIds[0])\n ?.scrollIntoView({ behavior: 'smooth', block: 'center' })\n // Only when the label changes, not as the cursor moves.\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [activeTagExtId])\n\n return {\n documentDoctags,\n labelSummaries,\n labelsByChunk,\n removeLabel,\n activeTagExtId,\n activeTagColor,\n activeChunkIds,\n tagCursor,\n gotoTagged,\n selectTag,\n taggingChunkId,\n setTaggingChunkId,\n }\n}\n","/**\n * Passage selection for citations in the parsed viewer: drag-to-select, click / shift-click\n * ranges, contiguous runs, the cited-run stepper, and the fact-citation highlight set.\n */\n\nimport { useCallback, useEffect, useMemo, useRef, useState } from 'react'\nimport type { RefObject } from 'react'\nimport { useArbiSessionState } from '@arbidocs/react'\nimport { computeSelectionRuns } from '@arbidocs/react/viewers'\nimport type { ProcessedPage } from '@arbidocs/react/viewers'\nimport { useViewerPassageCitation } from '../support'\n\nconst NONE: readonly string[] = []\nconst noop = () => {}\n\ninterface Options {\n documentId: string\n containerRef: RefObject<HTMLDivElement | null>\n processedChunks: ProcessedPage[]\n orderedChunkIds: string[]\n pageOf: (id: string) => number | undefined\n}\n\nexport function useCitationSelection({\n documentId,\n containerRef,\n processedChunks,\n orderedChunkIds,\n pageOf,\n}: Options) {\n // A citation being edited (a fact's, a field's) picks its passages here, through the host.\n const passageCitation = useViewerPassageCitation()\n const activeCitationContext = passageCitation?.active ?? null\n const setPendingPassagesForCitation = passageCitation?.pick ?? noop\n const setUnselectedPassagesForCitation = passageCitation?.unpick ?? noop\n const viewingPassageId = useArbiSessionState((s) => s.viewingDocument?.passageId ?? null)\n\n // Multi-select: persists across selections.\n const [selectedChunks, setSelectedChunks] = useState<Set<string>>(new Set())\n // Latest selection readable inside handlers without churning the memoized passage rows. Lets a\n // click decide add-vs-remove and fire the store update OUTSIDE the setState updater.\n const selectedChunksRef = useRef(selectedChunks)\n selectedChunksRef.current = selectedChunks\n // Anchor for shift-click range selection: the last plainly-clicked passage.\n const selectionAnchorRef = useRef<string | null>(null)\n\n // Fact source-citation highlight: while a fact's Citation popover is open its listed passages\n // are washed light and the one being read (`viewingPassageId`) is stronger. Gated on the set\n // being non-empty so only that flow lights passages this way.\n const factCitationChunkIds = passageCitation?.highlighted ?? NONE\n const factCitationSet = useMemo(() => new Set(factCitationChunkIds), [factCitationChunkIds])\n const factCitationActive = factCitationSet.size > 0\n const factCitationSetRef = useRef(factCitationSet)\n factCitationSetRef.current = factCitationSet\n\n const isCitationMode = !!activeCitationContext && activeCitationContext.documentId === documentId\n\n // Contiguous runs read as ONE citation (\"p.3(4-9)\"), keyed by the run's first passage.\n const selectionRuns = useMemo(\n () => computeSelectionRuns(processedChunks, selectedChunks),\n [processedChunks, selectedChunks]\n )\n\n // Step between runs, not passages: \"next\" lands on the next MARK.\n const runStartIds = useMemo(\n () => orderedChunkIds.filter((id) => selectionRuns.get(id)?.isStart),\n [orderedChunkIds, selectionRuns]\n )\n const [runCursor, setRunCursor] = useState(0)\n const gotoRun = useCallback(\n (delta: number) => {\n if (runStartIds.length === 0) return\n const next = (runCursor + delta + runStartIds.length) % runStartIds.length\n setRunCursor(next)\n document\n .getElementById(runStartIds[next])\n ?.scrollIntoView({ behavior: 'smooth', block: 'center' })\n },\n [runCursor, runStartIds]\n )\n useEffect(() => {\n if (runCursor >= runStartIds.length) setRunCursor(0)\n }, [runStartIds.length, runCursor])\n\n // Clear selections when the citation context changes (new citation or cleared).\n useEffect(() => {\n setSelectedChunks(new Set())\n }, [activeCitationContext?.key, activeCitationContext?.documentId])\n\n // Text selection end: expand to whole chunks and accumulate.\n const handleSelectionEnd = useCallback(() => {\n if (!activeCitationContext || activeCitationContext.documentId !== documentId) return\n\n const selection = window.getSelection()\n if (!selection || selection.isCollapsed || selection.rangeCount === 0) return\n\n const container = containerRef.current\n if (!container) return\n\n const newSelectedChunks = new Set<string>()\n container.querySelectorAll('[data-chunk-id]').forEach((el) => {\n const chunkId = el.getAttribute('data-chunk-id')\n if (!chunkId) return\n // partial=true: robust intersection with nested elements and text nodes.\n if (selection.containsNode(el, true)) newSelectedChunks.add(chunkId)\n })\n\n if (newSelectedChunks.size > 0) {\n setSelectedChunks((prev) => new Set([...prev, ...newSelectedChunks]))\n setPendingPassagesForCitation(\n Array.from(newSelectedChunks).map((id) => ({ chunk_id: id, page: pageOf(id) }))\n )\n }\n\n // Chunks are highlighted instead of the raw text selection.\n selection.removeAllRanges()\n }, [activeCitationContext, documentId, containerRef, setPendingPassagesForCitation, pageOf])\n\n // A plain click toggles a passage AND sets the anchor; shift-click selects every passage\n // between the anchor and the target in document order. The stored citation is explicit chunk\n // ids (opaque ids survive a re-parse; an ordinal range would silently re-point).\n const handleChunkClick = useCallback(\n (chunkId: string, extendFromAnchor: boolean) => {\n if (!activeCitationContext || activeCitationContext.documentId !== documentId) return\n\n const anchorId = selectionAnchorRef.current\n const anchorIdx = anchorId ? orderedChunkIds.indexOf(anchorId) : -1\n const targetIdx = orderedChunkIds.indexOf(chunkId)\n\n if (extendFromAnchor && anchorIdx !== -1 && targetIdx !== -1) {\n const [from, to] = anchorIdx <= targetIdx ? [anchorIdx, targetIdx] : [targetIdx, anchorIdx]\n const range = orderedChunkIds.slice(from, to + 1)\n setSelectedChunks((prev) => new Set([...prev, ...range]))\n setPendingPassagesForCitation(range.map((id) => ({ chunk_id: id, page: pageOf(id) })))\n // Anchor stays put so a further shift-click can grow or shrink the run.\n return\n }\n\n selectionAnchorRef.current = chunkId\n // While a fact's Citation popover drives things, decide against the fact's ACTUAL cited set\n // (clicking an already-cited passage REMOVES it), not the session-local selection.\n const wasSelected = factCitationSetRef.current.size\n ? factCitationSetRef.current.has(chunkId)\n : selectedChunksRef.current.has(chunkId)\n setSelectedChunks((prev) => {\n const next = new Set(prev)\n if (wasSelected) next.delete(chunkId)\n else next.add(chunkId)\n return next\n })\n if (wasSelected) setUnselectedPassagesForCitation([chunkId])\n else setPendingPassagesForCitation([{ chunk_id: chunkId, page: pageOf(chunkId) }])\n },\n [\n activeCitationContext,\n documentId,\n orderedChunkIds,\n setPendingPassagesForCitation,\n setUnselectedPassagesForCitation,\n pageOf,\n ]\n )\n\n return {\n isCitationMode,\n selectedChunks,\n selectionRuns,\n runStartIds,\n runCursor,\n gotoRun,\n handleSelectionEnd,\n handleChunkClick,\n factCitationSet,\n factCitationActive,\n viewingPassageId,\n }\n}\n","/**\n * Page Scroll Sync Hook\n *\n * Handles bidirectional page synchronization between HTML viewer and page controls.\n * Manages tab switch scrolling, passage highlighting, and manual page navigation.\n */\n\nimport { useEffect, useRef, useCallback, useState } from 'react'\nimport { useArbiSessionState, useArbiSessionStore } from '@arbidocs/react'\nimport { usePageIntersectionObserver } from '@arbidocs/react/viewers'\n\n/** Scroll a passage to the middle of the view once it is painted (a lazy page may still render). */\nfunction scrollToChunk(chunkId: string) {\n requestAnimationFrame(() => {\n const element = document.getElementById(chunkId)\n if (element) {\n element.scrollIntoView({ behavior: 'auto', block: 'center' })\n return\n }\n // Not painted yet: one retry after a short delay.\n setTimeout(() => {\n document.getElementById(chunkId)?.scrollIntoView({ behavior: 'auto', block: 'center' })\n }, 100)\n })\n}\n\ninterface UsePageScrollSyncProps {\n containerRef: React.RefObject<HTMLDivElement | null>\n processedChunksLength: number\n scrollTrigger?: number\n /** Optional callback with visibility data for lazy loading */\n onVisibilityUpdate?: (visibilityMap: Map<number, number>) => void\n}\n\nexport function usePageScrollSync({\n containerRef,\n processedChunksLength,\n scrollTrigger,\n onVisibilityUpdate,\n}: UsePageScrollSyncProps) {\n const session = useArbiSessionStore()\n const viewingId = useArbiSessionState((s) => s.viewingDocument?.id)\n const viewingDocumentPage = useArbiSessionState((s) => s.viewingDocument?.page ?? null)\n const viewingPassageId = useArbiSessionState((s) => s.viewingDocument?.passageId ?? null)\n const activeTab = useArbiSessionState((s) => s.documentViewer.tab)\n const setViewingDocumentPage = useCallback(\n (page: number) => {\n if (viewingId) session.setViewingDocument({ id: viewingId, page })\n },\n [session, viewingId]\n )\n\n // The passage a citation opened the document at, lit until another one is.\n const [highlighted, setHighlighted] = useState<string | null>(null)\n const isChunkHighlighted = useCallback(\n (chunkId: string) => chunkId === highlighted,\n [highlighted]\n )\n\n // Track whether initial scroll has completed to prevent feedback loop\n const scrollCompleteRef = useRef(false)\n // Read the current passage inside the tab-switch effect without adding it\n // to that effect's deps (see the note on its dependency list).\n const viewingPassageIdRef = useRef(viewingPassageId)\n viewingPassageIdRef.current = viewingPassageId\n\n // Reset scroll gate when tab switches away from HTML\n useEffect(() => {\n if (activeTab !== 'html') {\n scrollCompleteRef.current = false\n }\n }, [activeTab])\n\n // Scroll to page ONLY on tab switch - not when page number updates from scrolling\n useEffect(() => {\n // Only run when tab switches to HTML\n if (activeTab !== 'html' || processedChunksLength === 0) return\n\n // If we already scrolled, don't scroll again\n if (scrollCompleteRef.current) return\n\n // A targeted passage owns the scroll (HtmlViewer centres it once its chunk\n // has rendered); scrolling to the page top here would land on top of that\n // and leave the passage out of view when it sits lower on the page.\n if (viewingPassageIdRef.current) {\n scrollCompleteRef.current = true\n return\n }\n\n // Wait for DOM update, then scroll to current page\n requestAnimationFrame(() => {\n if (viewingDocumentPage) {\n const pageElement = document.getElementById(`page-${viewingDocumentPage}`)\n if (pageElement) {\n pageElement.scrollIntoView({ behavior: 'auto', block: 'start' })\n // Only mark complete once we actually scrolled — if the element wasn't\n // rendered yet (lazy loading), leave scrollCompleteRef false so the\n // HtmlViewer post-render effect can scroll after pre-rendering the page.\n setTimeout(() => {\n scrollCompleteRef.current = true\n }, 100)\n }\n // else: element not in DOM yet — HtmlViewer will pre-render it and\n // the renderedPages-watching effect will scroll after render\n } else {\n scrollCompleteRef.current = true\n }\n })\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [activeTab, processedChunksLength]) // Note: viewingDocumentPage is intentionally NOT a dependency to prevent feedback loop\n\n // Only scroll to a passage when it actually changes (new citation selection),\n // not on every tab switch back to HTML. This preserves scroll position when\n // the user navigates PDF ↔ HTML without selecting a new citation.\n const lastScrolledPassageRef = useRef<string | null>(null)\n\n // Reset when passage is cleared (popover closed) so re-opening the same\n // citation still triggers a scroll.\n useEffect(() => {\n if (!viewingPassageId) {\n lastScrolledPassageRef.current = null\n // The citation closed: its passage is no longer lit.\n setHighlighted(null)\n }\n }, [viewingPassageId])\n\n // Effect to highlight and scroll to passage when viewingPassageId changes\n useEffect(() => {\n if (!viewingPassageId || activeTab !== 'html' || processedChunksLength === 0) return\n // Skip scroll if we already scrolled to this passage (e.g. tab switch without new selection)\n if (lastScrolledPassageRef.current === viewingPassageId) return\n lastScrolledPassageRef.current = viewingPassageId\n setHighlighted(viewingPassageId)\n scrollToChunk(viewingPassageId)\n }, [viewingPassageId, activeTab, processedChunksLength])\n\n // The page the last explicit request asked for. Read when the trigger fires: scrolling itself\n // changes `viewingDocumentPage`, and re-running the scroll for that would pull the view back to\n // the top of every page the user scrolls past.\n const viewingPageRef = useRef(viewingDocumentPage)\n viewingPageRef.current = viewingDocumentPage\n\n // Scroll to page when scrollTrigger changes (user entered a page number)\n useEffect(() => {\n const viewingDocumentPage = viewingPageRef.current\n if (!scrollTrigger || processedChunksLength === 0 || !viewingDocumentPage) return\n\n // Temporarily disable observer updates during manual scroll\n scrollCompleteRef.current = false\n\n requestAnimationFrame(() => {\n const pageElement = document.getElementById(`page-${viewingDocumentPage}`)\n if (pageElement) {\n pageElement.scrollIntoView({ behavior: 'smooth', block: 'start' })\n }\n // Re-enable observer after scroll completes\n setTimeout(() => {\n scrollCompleteRef.current = true\n }, 500)\n })\n }, [scrollTrigger, processedChunksLength])\n\n // Get page elements callback for IntersectionObserver\n const getPageElements = useCallback(\n () => Array.from(document.querySelectorAll<HTMLDivElement>('[id^=\"page-\"]')),\n []\n )\n\n // Get page number from element\n const getPageNumber = useCallback((element: Element) => {\n const pageMatch = element.id.match(/page-(\\d+)/)\n return pageMatch ? parseInt(pageMatch[1], 10) : 0\n }, [])\n\n // Use IntersectionObserver to track visible pages\n usePageIntersectionObserver({\n containerRef,\n scrollCompleteRef,\n isEnabled: activeTab === 'html' && processedChunksLength > 0,\n getPageElements,\n getPageNumber,\n onPageChange: setViewingDocumentPage,\n onVisibilityUpdate,\n observeKey: processedChunksLength,\n })\n\n return {\n isChunkHighlighted,\n }\n}\n","/**\n * Lazy page rendering for the parsed viewer: only pages near the viewport render their chunks;\n * the rest idle-fill, and a target page/passage (deep link, search, citation) is pre-rendered and\n * scrolled into view.\n */\n\nimport { useCallback, useEffect, useRef, useState } from 'react'\nimport type { RefObject } from 'react'\nimport { useArbiSessionState } from '@arbidocs/react'\nimport { usePageScrollSync } from './usePageScrollSync'\nimport type { ProcessedPage } from '@arbidocs/react/viewers'\n\n// Matches PdfViewer constants.\nconst LAZY_LOAD_BUFFER_BEFORE = 2\nconst LAZY_LOAD_BUFFER_AFTER = 5\nconst INITIAL_PAGES_TO_RENDER = 3\n// Aspect ratio of placeholder pages (A4-ish).\nconst PAGE_ASPECT_RATIO = 1.3\n\ninterface Options {\n containerRef: RefObject<HTMLDivElement | null>\n processedChunks: ProcessedPage[]\n scrollTrigger?: number\n}\n\nexport function useLazyPages({ containerRef, processedChunks, scrollTrigger }: Options) {\n const [containerWidth, setContainerWidth] = useState(0)\n useEffect(() => {\n const el = containerRef.current\n if (!el) return\n const observer = new ResizeObserver((entries) => {\n setContainerWidth(entries[0]?.contentRect.width ?? 0)\n })\n observer.observe(el)\n return () => observer.disconnect()\n }, [containerRef])\n\n const [renderedPages, setRenderedPages] = useState<Set<number>>(\n () => new Set(Array.from({ length: INITIAL_PAGES_TO_RENDER }, (_, i) => i))\n )\n\n // After the initial pages render, queue the rest during browser idle time.\n useEffect(() => {\n if (processedChunks.length === 0) return\n const renderAll = () => {\n setRenderedPages((prev) => {\n if (prev.size === processedChunks.length) return prev\n return new Set(Array.from({ length: processedChunks.length }, (_, i) => i))\n })\n }\n // Safari has no requestIdleCallback: fall back to a short timeout.\n if (typeof window.requestIdleCallback !== 'function') {\n const timer = setTimeout(renderAll, 200)\n return () => clearTimeout(timer)\n }\n const id = window.requestIdleCallback(renderAll)\n return () => window.cancelIdleCallback(id)\n }, [processedChunks.length])\n\n const handleVisibilityUpdate = useCallback(\n (visibilityMap: Map<number, number>) => {\n const visiblePageNumbers = Array.from(visibilityMap.entries())\n .filter(([, ratio]) => ratio > 0)\n .map(([pageNum]) => pageNum)\n if (visiblePageNumbers.length === 0) return\n\n const visibleIndices: number[] = []\n processedChunks.forEach((page, index) => {\n if (page.pageNumber !== null && visiblePageNumbers.includes(page.pageNumber)) {\n visibleIndices.push(index)\n }\n })\n if (visibleIndices.length === 0) return\n\n const minIndex = Math.min(...visibleIndices)\n const maxIndex = Math.max(...visibleIndices)\n const pagesToRender = new Set<number>()\n for (\n let i = Math.max(0, minIndex - LAZY_LOAD_BUFFER_BEFORE);\n i <= Math.min(processedChunks.length - 1, maxIndex + LAZY_LOAD_BUFFER_AFTER);\n i++\n ) {\n pagesToRender.add(i)\n }\n setRenderedPages((prev) => {\n // Same pages: return the old set so scrolling does not re-render the viewer every tick.\n for (const i of pagesToRender) if (!prev.has(i)) return new Set([...prev, ...pagesToRender])\n return prev\n })\n },\n [processedChunks]\n )\n\n // Ensure the target page is rendered when a passage is selected or the HTML tab is entered;\n // otherwise getElementById returns null and the scroll silently fails.\n const viewingDocumentPage = useArbiSessionState((s) => s.viewingDocument?.page ?? null)\n const viewingPassageId = useArbiSessionState((s) => s.viewingDocument?.passageId ?? null)\n const activeTab = useArbiSessionState((s) => s.documentViewer.tab)\n\n useEffect(() => {\n if (!viewingDocumentPage || processedChunks.length === 0) return\n if (!viewingPassageId && activeTab !== 'html') return\n\n const targetIndex = processedChunks.findIndex((p) => p.pageNumber === viewingDocumentPage)\n if (targetIndex === -1) return\n\n setRenderedPages((prev) => {\n if (prev.has(targetIndex)) return prev\n const next = new Set(prev)\n for (\n let i = Math.max(0, targetIndex - LAZY_LOAD_BUFFER_BEFORE);\n i <= Math.min(processedChunks.length - 1, targetIndex + LAZY_LOAD_BUFFER_AFTER);\n i++\n ) {\n next.add(i)\n }\n return next\n })\n }, [viewingPassageId, viewingDocumentPage, processedChunks, activeTab])\n\n // After pre-rendering the target, scroll to it. usePageScrollSync only fires on\n // activeTab/length changes and misses an element that was not in the DOM yet. The page scroll\n // is gated to once per tab switch; a passage (centred, not the page top) gets its own scroll,\n // retried frame by frame (bounded) until its lazy page has rendered.\n const tabSwitchScrolledRef = useRef(false)\n const passageScrolledRef = useRef<string | null>(null)\n useEffect(() => {\n if (activeTab !== 'html') tabSwitchScrolledRef.current = false\n }, [activeTab])\n useEffect(() => {\n if (!viewingPassageId) passageScrolledRef.current = null\n }, [viewingPassageId])\n useEffect(() => {\n if (activeTab !== 'html' || !viewingDocumentPage) return\n if (viewingPassageId && passageScrolledRef.current !== viewingPassageId) {\n const target = viewingPassageId\n const deadline = performance.now() + 3000\n let raf = 0\n const tick = () => {\n const el = document.getElementById(target)\n if (el) {\n passageScrolledRef.current = target\n tabSwitchScrolledRef.current = true\n el.scrollIntoView({ behavior: 'auto', block: 'center' })\n // Re-assert next frame so a competing scroll from the same commit cannot win.\n raf = requestAnimationFrame(() =>\n el.scrollIntoView({ behavior: 'auto', block: 'center' })\n )\n return\n }\n if (performance.now() < deadline) raf = requestAnimationFrame(tick)\n }\n raf = requestAnimationFrame(tick)\n return () => cancelAnimationFrame(raf)\n }\n if (tabSwitchScrolledRef.current) return\n const pageElement = document.getElementById(`page-${viewingDocumentPage}`)\n if (!pageElement) return\n tabSwitchScrolledRef.current = true\n requestAnimationFrame(() => {\n pageElement.scrollIntoView({ behavior: 'auto', block: 'start' })\n })\n // renderedPages is the key dep: it fires after pre-render adds the target page.\n }, [renderedPages, activeTab, viewingDocumentPage, viewingPassageId])\n\n const { isChunkHighlighted } = usePageScrollSync({\n containerRef,\n processedChunksLength: processedChunks.length,\n scrollTrigger,\n onVisibilityUpdate: handleVisibilityUpdate,\n })\n\n return {\n renderedPages,\n isChunkHighlighted,\n placeholderHeight: containerWidth ? containerWidth * PAGE_ASPECT_RATIO : 500,\n }\n}\n","/**\n * The text view of a document: its parsed passages, page by page, with labels, citation picking,\n * passage links and copying, and the passage a citation opened it at. Data and behaviour live in\n * the hooks (labels, citation selection, lazy pages); the markup is the blocks HtmlViewer parts.\n */\n\nimport { useCallback, useEffect, useMemo, useRef } from 'react'\nimport { useDocument, useParsedDocument } from '@arbidocs/react'\nimport { parseVersionRef } from '@arbidocs/react/artifacts'\nimport { usePinchZoom, useProcessedChunks, useScrollAnchor } from '@arbidocs/react/viewers'\nimport {\n CitedRunNav,\n DocumentLabelBar,\n HtmlPage,\n HtmlViewerEmpty,\n HtmlViewerRoot,\n HtmlViewerSurface,\n ViewerMessage,\n} from '../../../files'\nimport { useConnectedWorkspace } from '../../ConnectionProvider'\nimport { useDocumentViewerSupport } from '../support'\nimport { PassageTagPanel } from './PassageTagPanel'\nimport { ParsedPassage } from './ParsedPassage'\nimport { usePassageCopy } from './usePassageCopy'\nimport { useDocumentLabels, type PassageLabel } from './useDocumentLabels'\nimport { useCitationSelection } from './useCitationSelection'\nimport { useLazyPages } from './useLazyPages'\n\nconst EMPTY_LABELS: PassageLabel[] = []\n\nexport interface ParsedTextViewProps {\n documentId: string\n stage?: 'marker' | 'subchunk' | 'final'\n onLoadSuccess?: (totalPages: number) => void\n /** Incremented to trigger scroll to current page */\n scrollTrigger?: number\n /** Text zoom, a multiplier of the normal size (1 = 100%). */\n zoom?: number\n /** Called by pinch and double-tap. */\n onZoomChange?: (zoom: number) => void\n}\n\nexport function ParsedTextView({\n documentId,\n stage = 'final',\n onLoadSuccess,\n scrollTrigger,\n zoom = 1,\n onZoomChange,\n}: ParsedTextViewProps) {\n const { workspaceId } = useConnectedWorkspace()\n const { openInNavigator } = useDocumentViewerSupport()\n const containerRef = useRef<HTMLDivElement>(null)\n\n // Document metadata for citation formatting.\n // The document's record (a version reference names its document), for a copied passage's\n // citation line.\n const { data: documentRecord } = useDocument(parseVersionRef(documentId).docId, {\n enabled: !!documentId && !!workspaceId,\n })\n const documentData = documentRecord ?? undefined\n\n const { data: parsedDoc, isLoading, error } = useParsedDocument(documentId, stage)\n const { processedChunks, maxPageNumber } = useProcessedChunks(\n parsedDoc?.chunks,\n parsedDoc?.footnotes || {}\n )\n\n /** A chunk's page: the viewer is the only place this is known. */\n const pageByChunk = useMemo(() => {\n const map = new Map<string, number | undefined>()\n for (const page of processedChunks) {\n for (const chunk of page.chunks) {\n if (chunk.chunkExtId) map.set(chunk.chunkExtId, page.pageNumber ?? undefined)\n }\n }\n return map\n }, [processedChunks])\n const pageOf = useCallback((id: string) => pageByChunk.get(id), [pageByChunk])\n\n // Every passage id in document order: the axis a shift-click range walks.\n const orderedChunkIds = useMemo(\n () =>\n processedChunks.flatMap((page) =>\n page.chunks.map((c) => c.chunkExtId).filter((id): id is string => !!id)\n ),\n [processedChunks]\n )\n const totalPages = useMemo(\n () => processedChunks.filter((p) => p.pageNumber !== null).length,\n [processedChunks]\n )\n\n const labels = useDocumentLabels(documentId, documentData?.doctags, orderedChunkIds)\n const citation = useCitationSelection({\n documentId,\n containerRef,\n processedChunks,\n orderedChunkIds,\n pageOf,\n })\n const { renderedPages, isChunkHighlighted, placeholderHeight } = useLazyPages({\n containerRef,\n processedChunks,\n scrollTrigger,\n })\n // Lazy pages change height as they render: keep the reading position on every engine.\n useScrollAnchor(containerRef, processedChunks.length)\n usePinchZoom({ containerRef, zoom, onZoomChange })\n const { formatChunkWithCitation, getPassageDeepLink, copyToClipboard } = usePassageCopy({\n documentId,\n documentData,\n selectedWorkspaceId: workspaceId,\n })\n\n const handleOpenNavigator = useMemo(\n () => (openInNavigator ? () => openInNavigator(documentId) : undefined),\n [openInNavigator, documentId]\n )\n\n // Notify the parent of the total pages in an effect to avoid setState during render.\n useEffect(() => {\n if (maxPageNumber > 0 && onLoadSuccess) {\n try {\n onLoadSuccess(maxPageNumber)\n } catch (err) {\n console.error('Error in onLoadSuccess callback:', err)\n }\n }\n }, [maxPageNumber, onLoadSuccess])\n\n if (isLoading) return <ViewerMessage>Loading parsed document...</ViewerMessage>\n if (error) {\n return (\n <ViewerMessage>\n <span className=\"text-red-text\">Failed to load parsed document</span>\n </ViewerMessage>\n )\n }\n\n const taggingChunk = labels.taggingChunkId\n ? processedChunks\n .flatMap((page) => page.chunks)\n .find((c) => c.chunkExtId === labels.taggingChunkId)\n : undefined\n\n return (\n <HtmlViewerRoot>\n <DocumentLabelBar\n summaries={labels.labelSummaries}\n activeTagExtId={labels.activeTagExtId}\n cursor={labels.tagCursor}\n onSelect={labels.selectTag}\n onStep={labels.gotoTagged}\n />\n\n {labels.taggingChunkId && (\n <PassageTagPanel\n documentId={documentId}\n chunkExtId={labels.taggingChunkId}\n chunkContent={taggingChunk?.content ?? ''}\n pageNumber={pageOf(labels.taggingChunkId)}\n documentDoctags={labels.documentDoctags}\n onClose={() => labels.setTaggingChunkId(null)}\n onViewTaggedChunks={(tagExtId) => {\n labels.selectTag(tagExtId)\n labels.setTaggingChunkId(null)\n }}\n />\n )}\n\n {/* Hidden while a fact's Citation popover drives the view: that popover already lists and\n navigates the cited passages. */}\n {!citation.factCitationActive && citation.runStartIds.length > 0 && (\n <CitedRunNav\n position={citation.runCursor + 1}\n total={citation.runStartIds.length}\n onStep={citation.gotoRun}\n />\n )}\n <HtmlViewerSurface surfaceRef={containerRef} onMouseUp={citation.handleSelectionEnd}>\n {processedChunks.length > 0 ? (\n processedChunks.map((page, pageIndex) => (\n <HtmlPage\n key={pageIndex}\n pageNumber={page.pageNumber}\n totalPages={totalPages}\n isRendered={renderedPages.has(pageIndex)}\n placeholderHeight={placeholderHeight}\n zoom={zoom}\n >\n {page.chunks.map((chunk, chunkIndex) => {\n const id = chunk.chunkExtId\n const run = id ? citation.selectionRuns.get(id) : undefined\n return (\n <ParsedPassage\n key={chunkIndex}\n chunk={chunk}\n pageNumber={page.pageNumber}\n isHighlighted={!!(id && isChunkHighlighted(id))}\n isSelected={!!(id && citation.selectedChunks.has(id))}\n isCitationHighlight={!!(id && citation.factCitationSet.has(id))}\n isActiveCitation={\n !!(\n id &&\n citation.factCitationActive &&\n citation.viewingPassageId === id &&\n // Only while it is STILL cited: clicking it off must clear it.\n citation.factCitationSet.has(id)\n )\n }\n factCitationActive={citation.factCitationActive}\n isCitationMode={citation.isCitationMode}\n runIsStart={!!run?.isStart}\n runIsEnd={!!run?.isEnd}\n runEndIndex={run?.endIndex}\n onChunkClick={citation.isCitationMode ? citation.handleChunkClick : undefined}\n formatChunkWithCitation={formatChunkWithCitation}\n getPassageDeepLink={getPassageDeepLink}\n copyToClipboard={copyToClipboard}\n onOpenNavigator={handleOpenNavigator}\n labels={id ? (labels.labelsByChunk.get(id) ?? EMPTY_LABELS) : EMPTY_LABELS}\n activeTagColor={\n id && labels.activeChunkIds.has(id) ? labels.activeTagColor : undefined\n }\n onTagPassage={labels.setTaggingChunkId}\n onShowLabel={labels.selectTag}\n onRemoveLabel={labels.removeLabel}\n />\n )\n })}\n </HtmlPage>\n ))\n ) : (\n <HtmlViewerEmpty />\n )}\n </HtmlViewerSurface>\n </HtmlViewerRoot>\n )\n}\n","/**\n * The PDF (or media) body of the document viewer: loading and failure states, the image, audio and\n * video players, and the PDF with its tools — the markup layer, signature placement, a signature\n * request being prepared or signed.\n */\n\nimport { lazy, Suspense, useCallback } from 'react'\nimport { useArbiSessionState, useArbiSessionStore } from '@arbidocs/react'\nimport type {\n SignatureAppearance,\n SignatureRequest,\n useDocumentMarkup,\n} from '@arbidocs/react/document-tools'\nimport {\n AudioViewer,\n ImageViewer,\n PdfViewer as KitPdfViewer,\n VideoViewer,\n type PdfViewerProps,\n} from '@arbidocs/react/viewers'\nimport { friendlyFileType } from '@arbidocs/react/ui'\nimport { ViewerLoadError, ViewerMessage, ViewerPreviewUnavailable } from '../../files'\nimport { useViewerIsDetached } from './support'\nimport { fileExtension, type ViewedDocument } from './useViewedDocument'\n\n// The markup viewer brings in pdf-lib, which nothing else needs: load it only when it is shown.\nconst AnnotatedPdfViewer = lazy(() =>\n import('../../document-tools/viewer').then((m) => ({ default: m.AnnotatedPdfViewer }))\n)\nconst SignaturePlacementViewer = lazy(() =>\n import('../../document-tools/viewer').then((m) => ({ default: m.SignaturePlacementViewer }))\n)\n// Signature requests: placing fields for signers, and a signer's guided signing.\nconst SignatureRequestEditor = lazy(() =>\n import('../../document-tools/viewer').then((m) => ({ default: m.SignatureRequestEditor }))\n)\nconst GuidedSigningViewer = lazy(() =>\n import('../../document-tools/viewer').then((m) => ({ default: m.GuidedSigningViewer }))\n)\n\n/** A signature request: the author placing fields, or a signer walked through theirs. */\nexport type SignatureFlow =\n | { kind: 'prepare'; draft?: SignatureRequest; self?: boolean }\n | { kind: 'sign'; request: SignatureRequest }\n | null\n\n/**\n * The kit PDF viewer, reporting the page read into the session state; in a detached window its\n * pages render without the opener's web fonts (canvas text in another document cannot use them).\n */\nfunction SessionPdfViewer(props: Omit<PdfViewerProps, 'onPageChange' | 'disableFontFace'>) {\n const session = useArbiSessionStore()\n const viewingId = useArbiSessionState((s) => s.viewingDocument?.id)\n const isDetached = useViewerIsDetached()\n const onPageChange = useCallback(\n (page: number) => {\n if (viewingId) session.setViewingDocument({ id: viewingId, page })\n },\n [session, viewingId]\n )\n return <KitPdfViewer {...props} onPageChange={onPageChange} disableFontFace={!!isDetached} />\n}\n\nexport interface ViewerPdfPaneProps {\n documentId: string\n doc: ViewedDocument\n pdfBlob: Blob | null\n isPdfLoading: boolean\n pdfError: unknown\n onDownload: () => void\n viewerProps: {\n currentPage: number | undefined\n onLoadSuccess: (pages: number) => void\n scrollTrigger: number\n zoom: number\n onZoomChange: (zoom: number) => void\n }\n signatureFlow: SignatureFlow\n onSignatureFlow: (flow: SignatureFlow) => void\n currentUserId: string | undefined\n placingSignature: boolean\n onPlacingDone: (appearance?: SignatureAppearance) => void\n annotating: boolean\n markup: ReturnType<typeof useDocumentMarkup>\n pdfSnapshotNumber: number | undefined\n isSigned: boolean\n /** One's saved signature or initials to place as a picture stamp (PDF tab › My signature). */\n placeMark?: { image: string; label: string; key: number } | null\n}\n\nexport function ViewerPdfPane({\n documentId,\n doc,\n pdfBlob,\n isPdfLoading,\n pdfError,\n onDownload,\n viewerProps,\n signatureFlow,\n onSignatureFlow,\n currentUserId,\n placingSignature,\n onPlacingDone,\n annotating,\n markup,\n pdfSnapshotNumber,\n isSigned,\n placeMark = null,\n}: ViewerPdfPaneProps) {\n const { documentData, isDownloadOnly, isVideo, isAudio, isImage, isDocx } = doc\n const showMarkup = markup.hasMarkup && !markup.showOriginal\n\n // Files that cannot be previewed in the browser: the download, at once.\n if (isDownloadOnly) {\n return (\n <ViewerPreviewUnavailable\n extension={fileExtension(documentData?.file_name)}\n onDownload={onDownload}\n />\n )\n }\n\n // Text files are rendered to a PDF too, so name what the user opened, not the rendering.\n const loadingLabel = isVideo\n ? 'Loading video...'\n : isAudio\n ? 'Loading audio...'\n : isImage\n ? 'Loading image...'\n : !documentData\n ? 'Loading document...'\n : friendlyFileType(documentData.file_type, documentData.file_name) === 'Text'\n ? 'Loading text...'\n : 'Loading PDF...'\n const errorLabel = isVideo\n ? 'Failed to load video'\n : isAudio\n ? 'Failed to load audio'\n : isImage\n ? 'Failed to load image'\n : 'Failed to load PDF'\n\n if (\n isDocx &&\n documentData &&\n !['completed', 'low-content', 'failed'].includes(documentData.status || '')\n ) {\n return (\n <ViewerMessage>\n PDF and search indexing are processing. Open the DOCX tab to edit now.\n </ViewerMessage>\n )\n }\n if (isPdfLoading) return <ViewerMessage>{loadingLabel}</ViewerMessage>\n if (pdfError) {\n return (\n <ViewerLoadError\n message={\n isVideo || isAudio || isImage\n ? `${errorLabel} — download it instead.`\n : \"Couldn't display the PDF — download it instead.\"\n }\n onDownload={onDownload}\n />\n )\n }\n // Nothing is fetched yet: the PDF is read once the document record has loaded, so the viewer\n // would otherwise sit empty for that first stretch.\n if (!pdfBlob) return <ViewerMessage>{loadingLabel}</ViewerMessage>\n\n if (isVideo) return <VideoViewer blob={pdfBlob} title={documentData?.file_name || 'Video'} />\n if (isAudio) return <AudioViewer blob={pdfBlob} title={documentData?.file_name || 'Audio'} />\n if (isImage) {\n return <ImageViewer blob={pdfBlob} alt={documentData?.file_name || 'Document image'} />\n }\n if (signatureFlow?.kind === 'prepare') {\n return (\n <Suspense fallback={<ViewerMessage>Loading…</ViewerMessage>}>\n <SignatureRequestEditor\n {...viewerProps}\n file={pdfBlob}\n documentId={documentId}\n version={pdfSnapshotNumber ?? documentData?.current_version ?? undefined}\n selfSigning={signatureFlow.self}\n draft={signatureFlow.draft}\n shareFile={!signatureFlow.draft}\n viewer={SessionPdfViewer}\n onCancel={() => onSignatureFlow(null)}\n onSaved={() => onSignatureFlow(null)}\n />\n </Suspense>\n )\n }\n if (signatureFlow?.kind === 'sign' && currentUserId) {\n const { currentPage: _page, scrollTrigger: _trigger, ...guidedProps } = viewerProps\n return (\n <Suspense fallback={<ViewerMessage>Loading…</ViewerMessage>}>\n <GuidedSigningViewer\n {...guidedProps}\n file={pdfBlob}\n request={signatureFlow.request}\n signer={currentUserId}\n viewer={SessionPdfViewer}\n onClose={() => onSignatureFlow(null)}\n onSigned={() => onSignatureFlow(null)}\n />\n </Suspense>\n )\n }\n if (placingSignature) {\n return (\n <Suspense fallback={<ViewerMessage>Loading…</ViewerMessage>}>\n <SignaturePlacementViewer\n {...viewerProps}\n file={pdfBlob}\n documentId={documentId}\n viewer={SessionPdfViewer}\n onCancel={() => onPlacingDone()}\n onContinue={(appearance) => onPlacingDone(appearance)}\n />\n </Suspense>\n )\n }\n // Annotate mode, or the markup as the reading view: one viewer, so leaving annotate mode keeps\n // (and saves) what was just drawn.\n if (annotating || showMarkup) {\n return (\n <Suspense\n fallback={\n <ViewerMessage>\n {annotating ? 'Loading annotation tools…' : 'Loading markup…'}\n </ViewerMessage>\n }\n >\n <AnnotatedPdfViewer\n key={`${documentId}@${pdfSnapshotNumber ?? 'current'}`}\n {...viewerProps}\n file={pdfBlob}\n documentId={documentId}\n version={pdfSnapshotNumber}\n editing={annotating}\n onMarkupChange={markup.onMarkupChange}\n fileName={documentData?.file_name}\n shared={documentData?.shared ?? false}\n folder={documentData?.folder}\n workspaceId={documentData?.workspace_ext_id}\n viewer={SessionPdfViewer}\n signed={isSigned}\n placeStamp={placeMark}\n />\n </Suspense>\n )\n }\n return <SessionPdfViewer {...viewerProps} file={pdfBlob} />\n}\n","/**\n * The whole document viewer on the signed-in session: a document (or one of its versions, read\n * only) as its PDF, its text, the Word editor, a sheet, an image, a recording or a live artifact;\n * its versions and comparisons; markup, signing and signature requests; sharing, Email, Translate\n * and Finalise. Runs under any host (`useConnectedWorkspace`): the open document, tab and comparison\n * are the session state's, navigation the `BlocksEnvironment`'s, and what only the host knows comes\n * as its host config's `viewer`.\n */\n\nimport { lazy, Suspense, useCallback, useEffect, useRef, useState, type ReactNode } from 'react'\nimport {\n ChevronDown,\n Languages,\n Mail,\n MessageSquare,\n MessageSquarePlus,\n PenLine,\n Users,\n} from 'lucide-react'\nimport {\n DEFAULT_ASPECT_OPTIONS,\n ImageCropModal,\n useArbi,\n useArbiSessionState,\n useArbiSessionStore,\n} from '@arbidocs/react'\nimport { findVersion, parseVersionRef, versionLabel } from '@arbidocs/react/artifacts'\nimport {\n SIGNED_LOCKED_REASON,\n canAnnotate,\n useDocumentMarkup,\n useDocumentSignatures,\n useDocumentTools,\n type SignatureAppearance,\n} from '@arbidocs/react/document-tools'\nimport { XlsxViewer, cycleZoom } from '@arbidocs/react/viewers'\nimport {\n Button,\n DropdownMenu,\n DropdownMenuContent,\n DropdownMenuItem,\n DropdownMenuTrigger,\n getEntityLabel,\n} from '@arbidocs/react/ui'\nimport {\n ArtifactCodeView,\n ArtifactCompareBar,\n ArtifactPreview,\n VersionTimeline,\n} from '../../artifacts'\nimport { latestThreadOfDocument, useRegisterOpenDocument } from '@arbidocs/react/shell'\nimport { ShareControl } from '../../collaboration/sharing/ShareControl'\nimport {\n ViewerCaptureDraft,\n ViewerDraftKind,\n ViewerDraftTitle,\n ViewerRelatedDocuments,\n} from './drafts'\nimport {\n AnnotateButton,\n DownloadMarkupButton,\n FileShareDialog,\n MarkupNotices,\n MarkupViewNote,\n PlaceMySignatureMenuItems,\n ShowOriginalButton,\n SignDocumentDialog,\n SignedEditNote,\n SignatureRequestBanner,\n SignatureStatus,\n VersionSnapshotBar,\n} from '../../document-tools'\nimport {\n DocumentLabelBar,\n PdfPageNav,\n ViewerControlBar,\n ViewerFrame,\n ViewerHeaderEnd,\n ViewerHeaderStart,\n ViewerImageActions,\n ViewerMessage,\n ViewerPageCounter,\n ViewerPane,\n ViewerStatusNote,\n ViewerTabBar,\n ViewerTitle,\n ViewerZoomControl,\n} from '../../files'\nimport { ErrorBoundary } from '../../components/ErrorBoundary'\nimport { fmtDate } from '../../lib/format'\nimport { useBlocksEnvironment } from '../../provider/environment'\nimport { TabHeader } from '../../shell'\nimport { useConnectedWorkspace } from '../ConnectionProvider'\nimport { useConnectedConversations } from '../workspaceData'\nimport { ConnectedDocumentToolsProvider } from './ConnectedDocumentToolsProvider'\nimport { FinaliseTranslationButton } from './FinaliseTranslationButton'\nimport { useDocumentViewerSupport } from './support'\nimport { useImageCrop } from './useImageCrop'\nimport { useViewedDocument } from './useViewedDocument'\nimport { useViewerBlobs } from './useViewerBlobs'\nimport { useViewerTabs } from './useViewerTabs'\nimport { useViewerVersions } from './useViewerVersions'\nimport { ParsedTextView } from './parsed/ParsedTextView'\nimport { ViewerPdfPane, type SignatureFlow } from './ViewerPdfPane'\nimport { canChangeVisibility } from '../../files/permissions'\n\n// The Word editor loads only when a Word document is shown.\nconst NativeDocxEditor = lazy(() =>\n import('../docx/ConnectedNativeDocxEditor').then((m) => ({\n default: m.ConnectedNativeDocxEditor,\n }))\n)\nconst StreamedWordArtifact = lazy(() =>\n import('../docx/ConnectedStreamedWordArtifact').then((m) => ({\n default: m.ConnectedStreamedWordArtifact,\n }))\n)\nconst NativeDocxComparison = lazy(() =>\n import('../docx/ConnectedNativeDocxComparison').then((m) => ({\n default: m.ConnectedNativeDocxComparison,\n }))\n)\n\nconst UPLOADED_NO_VERSIONS =\n 'No earlier versions yet. Replacing, editing or signing this file adds a new version here.'\n\nexport interface ConnectedDocumentViewerProps {\n /**\n * The document, or a version reference `doc-…@v{n}` (a citation, a \"made from v2\" link): an\n * earlier version opens read-only. Default: the session state's viewing document.\n */\n documentId?: string\n /** Controls at the right end of the header (a panel's dock / pop-out switcher). */\n headerActions?: ReactNode\n /** Where html/react artifacts load their sandbox runtime from. */\n artifactRuntimeUrl?: string\n}\n\nexport function ConnectedDocumentViewer(props: ConnectedDocumentViewerProps) {\n const viewing = useArbiSessionState((s) => s.viewingDocument?.id)\n const openedId = props.documentId ?? viewing\n if (!openedId) return null\n // A viewer that throws (a PDF the browser cannot render, say) shows the error here, in the\n // viewer's place, instead of unmounting the whole app.\n return (\n <ErrorBoundary\n resetKey={openedId}\n labels={{ title: \"This document couldn't be displayed\" }}\n testId=\"document-viewer-error\"\n >\n <ConnectedDocumentToolsProvider>\n <DocumentViewerContent {...props} openedId={openedId} />\n </ConnectedDocumentToolsProvider>\n </ErrorBoundary>\n )\n}\n\nfunction DocumentViewerContent({\n openedId,\n headerActions,\n artifactRuntimeUrl = '/artifact-runtime/',\n}: ConnectedDocumentViewerProps & { openedId: string }) {\n const arbi = useArbi()\n const session = useArbiSessionStore()\n const support = useDocumentViewerSupport()\n const formatDate = support.formatDate ?? fmtDate\n const tools = useDocumentTools()\n const { openConversation, openNewConversation, notify } = useBlocksEnvironment()\n const { userId: currentUserId } = useConnectedWorkspace()\n // A document keeps one id for its whole life; its versions are inside it.\n const documentId = parseVersionRef(openedId).docId\n const [totalPages, setTotalPages] = useState<number>(0)\n const [isCompact, setIsCompact] = useState(false)\n // Zoom of the PDF (canvas scale) / text, as a multiplier of fit width; pinch, double-tap and the\n // zoom button all drive it. The text view's size is a reading preference for every document.\n const [pdfZoom, setPdfZoom] = useState(1)\n const {\n tab: zoomTab,\n textScale,\n compareId: compareDocumentId,\n } = useArbiSessionState((s) => s.documentViewer)\n const zoom = zoomTab === 'html' ? textScale : pdfZoom\n const setZoom = useCallback(\n (next: number | ((z: number) => number)) => {\n const value = typeof next === 'function' ? next(zoom) : next\n if (zoomTab === 'html') session.setDocumentViewer({ textScale: value })\n else setPdfZoom(value)\n },\n [zoomTab, session, zoom]\n )\n const [scrollTrigger, setScrollTrigger] = useState(0) // Incremented to scroll the viewers\n const containerRef = useRef<HTMLDivElement>(null)\n\n const viewingDocumentPage = useArbiSessionState((s) => s.viewingDocument?.page ?? null)\n const setViewingDocumentPage = (page: number) =>\n session.setViewingDocument({ id: openedId, page })\n const setViewingDocumentId = (id: string) => session.setViewingDocument({ id })\n const setActiveTab = (tab: Parameters<typeof session.setDocumentViewer>[0]['tab']) =>\n session.setDocumentViewer({ tab })\n const setCompareDocumentId = (id: string | null) => session.setDocumentViewer({ compareId: id })\n const { data: conversations } = useConnectedConversations()\n\n // An earlier version opened read-only (`doc-…@v{n}`) from the Versions tab, a citation or a\n // \"made from\" link. Word documents show it in the Word editor, artifacts in theirs, everything\n // else as its PDF. The version on screen is the session's viewing id, not local state: the\n // viewer remounts when its panel moves to a new window, and the version must come along.\n const snapshotRef = parseVersionRef(openedId).version ? openedId : null\n // Every version of the document, oldest first. Every version of an artifact shares one name, so\n // both sides of a comparison get the timeline's \"v1/v2/v3\" label.\n const { versions, translations } = useViewerVersions(documentId)\n const currentVersionId = versions.find((v) => v.isCurrent)?.id ?? documentId\n // Opening the current version is the live document itself, not a read-only copy of it.\n const snapshotDocumentId = snapshotRef && snapshotRef !== currentVersionId ? snapshotRef : null\n const doc = useViewedDocument(documentId)\n const setSnapshotDocumentId = (ref: string | null) => setViewingDocumentId(ref ?? documentId)\n // Drafting mode: a thread bound to the open document (or the one it was made in) drafts in it,\n // also while an earlier version of it is on screen; a turn sent then brings the live document\n // back, where the assistant's edits appear. Being open binds no chat to it.\n useRegisterOpenDocument({\n documentId: doc.savedDocumentId,\n shownId: openedId,\n showLive: () => setViewingDocumentId(documentId),\n workspaceId: doc.workspaceId,\n conversationId: doc.documentData?.conversation_ext_id ?? null,\n })\n const {\n documentData,\n streamingDoc,\n isStreaming,\n draftDoc,\n isDraft,\n isCaptureDraft,\n labelSummaries,\n isImage,\n isVideo,\n isAudio,\n isMedia,\n isArtifact,\n liveKind,\n liveSource,\n isDocx,\n isXlsx,\n isDownloadOnly,\n } = doc\n // The thread bound to this document: its latest one, else a new chat bound to it. The document\n // stays on screen beside it.\n const chatAboutDocument = () => {\n const savedId = doc.savedDocumentId\n if (!savedId) return\n const latest = latestThreadOfDocument(conversations, savedId)\n if (latest) {\n openConversation(latest, { keepDocumentOpen: true })\n return\n }\n // Opening a new chat starts it unbound; it is bound after.\n openNewConversation({ keepDocumentOpen: true })\n session.setNewChatDocumentId(savedId)\n }\n // A thread by its title, for the threads a document (and each version) was made in.\n const threadTitle = (id: string) =>\n conversations.find((c) => c.external_id === id)?.title?.trim() || 'Its thread'\n // The thread a generated document was made in (none for an upload).\n const madeInId = documentData?.conversation_ext_id ?? null\n const madeIn = madeInId ? { id: madeInId, title: threadTitle(madeInId) } : null\n const pdfSnapshotId = snapshotDocumentId && !isDocx && !isArtifact ? snapshotDocumentId : null\n // The document on screen: an earlier version when one is open, else the current one.\n const shownDocumentId = pdfSnapshotId || documentId\n const blobs = useViewerBlobs(shownDocumentId, doc)\n const { pdfBlob, xlsxBlob, xlsxError, handleDirectDownload } = blobs\n // Annotation mode for the PDF view; off for every newly opened document.\n const [annotating, setAnnotating] = useState(false)\n const [sharingFile, setSharingFile] = useState(false)\n useEffect(() => setAnnotating(false), [documentId])\n // My signature: one's saved signature or initials, to place as a picture stamp in the markup.\n const [placeMark, setPlaceMark] = useState<{ image: string; label: string; key: number } | null>(\n null\n )\n // Translations are listed with the versions (each is its own document), so they open the tab too.\n const hasHistory =\n versions.length > 1 || (documentData?.current_version ?? 1) > 1 || translations.length > 0\n const { activeTab, handleTabChange, viewerTabs } = useViewerTabs(doc, isCompact, hasHistory)\n const crop = useImageCrop(\n documentId,\n documentData?.file_name,\n pdfBlob,\n documentData?.workspace_ext_id\n )\n // Signing: choose where the signature goes (placing), then the Sign dialog.\n const [placingSignature, setPlacingSignature] = useState(false)\n const [signAppearance, setSignAppearance] = useState<SignatureAppearance | undefined>()\n const [isSignOpen, setIsSignOpen] = useState(false)\n // Leaving the placement when another version opens or returns: it belongs to the copy on screen.\n useEffect(() => setPlacingSignature(false), [documentId, snapshotDocumentId])\n // A signature request: the author placing fields ('prepare'), or a signer walked through theirs.\n const [signatureFlow, setSignatureFlow] = useState<SignatureFlow>(null)\n useEffect(() => setSignatureFlow(null), [documentId, snapshotDocumentId])\n const { data: signatureStatus } = useDocumentSignatures(shownDocumentId, !isDraft && !liveKind)\n\n // The Word editor on the current version: the editor's own ribbon says \"Co-edit mode\", so the\n // header carries no version label and, when narrow, no title row above the ribbon.\n const isCoEditing =\n !snapshotDocumentId &&\n !compareDocumentId &&\n !isDraft &&\n ((activeTab === 'docx' && isDocx) ||\n (activeTab === 'edit' && isArtifact && !liveKind && !isStreaming))\n const currentVersionLabel = isCoEditing\n ? undefined\n : !snapshotDocumentId && !compareDocumentId && (isDocx || (isArtifact && !liveKind))\n ? 'Live'\n : versionLabel(versions, snapshotDocumentId || documentId)\n const compareVersionLabel = versionLabel(versions, compareDocumentId)\n const snapshotNumber = findVersion(versions, snapshotDocumentId)?.number\n // The markup of the version on screen: the default view when it has any (\"Show original\" hides).\n const pdfSnapshotNumber = pdfSnapshotId ? snapshotNumber : undefined\n // A signed version is locked: only a further signature changes it. Its marks stay in the markup\n // layer (never in its PDF), and editing its content saves a new, unsigned version.\n const isSigned = !!signatureStatus?.signed\n const markup = useDocumentMarkup(documentData, pdfSnapshotNumber, isSigned)\n\n // Detect container width changes (640px = the sm: breakpoint).\n useEffect(() => {\n const container = containerRef.current\n if (!container) return\n const resizeObserver = new ResizeObserver((entries) => {\n for (const entry of entries) setIsCompact(entry.contentRect.width < 640)\n })\n resizeObserver.observe(container)\n return () => resizeObserver.disconnect()\n }, [])\n\n const handleLoadSuccess = useCallback((numPages: number) => setTotalPages(numPages), [])\n\n // Go to a page: the counter, or one step from the arrows.\n const goToPage = (page: number) => {\n setViewingDocumentPage(page)\n setScrollTrigger((prev) => prev + 1)\n }\n const stepPage = (delta: number) => {\n const next = (viewingDocumentPage || 1) + delta\n if (next >= 1 && next <= totalPages) goToPage(next)\n }\n\n const documentTitle =\n streamingDoc?.title ||\n draftDoc?.title ||\n documentData?.doc_metadata?.title ||\n documentData?.file_name ||\n 'Document'\n\n // The page / zoom controls, shared by the PDF and the text view. They sit in the control bar\n // under the body, so they never cover the text being read.\n const pageNav = totalPages > 0 && (\n <>\n <ViewerZoomControl zoom={zoom} onCycle={() => setZoom(cycleZoom(zoom))} />\n <PdfPageNav\n canPrev={(viewingDocumentPage || 1) > 1}\n canNext={(viewingDocumentPage || 1) < totalPages}\n onPrev={() => stepPage(-1)}\n onNext={() => stepPage(1)}\n counter={\n <ViewerPageCounter page={viewingDocumentPage || 1} total={totalPages} onGoTo={goToPage} />\n }\n />\n </>\n )\n\n // Compare: a \"Compare vs. [doc]\" row of its own below the tab/title bar (a docked panel is\n // narrow), with the flip-direction arrow and the way out.\n const isComparing = !!compareDocumentId\n const compareTarget = compareDocumentId ? parseVersionRef(compareDocumentId).docId : null\n const compareIndicator = isComparing && compareTarget && (\n <ArtifactCompareBar\n compareTarget={support.renderDocumentPill?.(compareTarget) ?? compareTarget}\n versionLabel={compareVersionLabel}\n mode=\"flip\"\n showTrackChanges={false}\n onToggleTrackChanges={() => {}}\n onFlip={() => {\n setViewingDocumentId(compareDocumentId!)\n setCompareDocumentId(documentId)\n }}\n onStop={() => setCompareDocumentId(null)}\n />\n )\n\n // Document name block: the name, related documents and status notes. Roomy headers keep it on\n // the tab row; a narrow (phone / docked) header gives it a row of its own so the name is never\n // cut down to a couple of letters by the tabs and actions.\n const titleBlock = (\n <>\n {/* A draft gets an editable name + auto-name toggle instead of the plain read-only name. */}\n {isDraft ? (\n <ViewerDraftTitle documentId={documentId} />\n ) : (\n <ViewerTitle\n title={documentTitle}\n versionLabel={currentVersionLabel}\n shrink={!!liveKind || isCompact}\n />\n )}\n {/* The narrow header's Share is icon-only, so the state is spelled out here as text. */}\n {isCompact && !isDraft && documentData?.shared && (\n <ViewerStatusNote testId=\"document-shared-status\">\n Shared with the workspace\n </ViewerStatusNote>\n )}\n {/* Likewise \"Show original\" is a bare page icon there: say which view is on screen. */}\n {isCompact &&\n activeTab === 'pdf' &&\n pdfBlob &&\n markup.hasMarkup &&\n !annotating &&\n !placingSignature && (\n <MarkupViewNote\n showOriginal={markup.showOriginal}\n onToggle={() => markup.setShowOriginal((on) => !on)}\n />\n )}\n {/* Related documents, except during a comparison (its own row says which). */}\n {!isComparing && !liveKind && documentData && (\n <ViewerRelatedDocuments document={documentData} />\n )}\n {isStreaming && <ViewerStatusNote pulse>streaming...</ViewerStatusNote>}\n {/* Nothing is generating: this document simply does not exist on the backend yet. */}\n {isDraft && (\n <ViewerStatusNote testId=\"draft-unsaved-indicator\">Draft — not saved</ViewerStatusNote>\n )}\n {signatureStatus?.signed && (\n <SignatureStatus status={signatureStatus} formatDate={formatDate} />\n )}\n </>\n )\n\n const leftContent = (\n <ViewerHeaderStart>\n {isDraft ? (\n // A draft's kind replaces the tabs: neither Versions nor the text view means anything\n // before the first save.\n <ViewerDraftKind documentId={documentId} />\n ) : (\n <ViewerTabBar tabs={viewerTabs} activeId={activeTab} onChange={handleTabChange} />\n )}\n {!isCompact && titleBlock}\n </ViewerHeaderStart>\n )\n\n const annotatable = canAnnotate({\n activeTab,\n hasPdf: !!pdfBlob,\n isImage,\n isVideo,\n isAudio,\n isDownloadOnly,\n isDraft,\n isStreaming,\n isSnapshot: !!snapshotDocumentId,\n isComparing,\n })\n\n // A request waiting for this user's signature, or their own in flight: shown over the PDF and\n // the Word editor alike; signing happens on the PDF.\n const signatureBanner = !isDraft && !liveKind && !snapshotDocumentId && (\n <SignatureRequestBanner\n documentId={documentId}\n hidden={!!signatureFlow}\n onSign={(request) => {\n setAnnotating(false)\n setPlacingSignature(false)\n if (activeTab !== 'pdf') handleTabChange('pdf')\n setSignatureFlow({ kind: 'sign', request })\n }}\n onEditDraft={(draft) => {\n if (activeTab !== 'pdf') handleTabChange('pdf')\n setSignatureFlow({ kind: 'prepare', draft })\n }}\n />\n )\n\n const share = () => {\n const name = (liveKind ? documentTitle : documentData?.file_name) || undefined\n if (support.share) {\n support.share({ id: documentId, name, isPrivate: !documentData?.shared })\n return\n }\n void arbi.documents\n .update([{ external_id: documentId, shared: !documentData?.shared }])\n .then(() => tools.onDocumentsChanged?.([documentId], 'markup'))\n .catch(() => notify(\"Couldn't change who can see this document\", 'error'))\n }\n const shownRef = snapshotDocumentId || documentId\n\n const rightContent = (\n <ViewerHeaderEnd isCompact={isCompact}>\n {/* Annotate: only for a PDF on screen (text and Word files are shown as a PDF too). Marks\n sit in a layer beside the document; Freeze saves a separate copy with them built in. */}\n {annotatable && (\n <AnnotateButton\n active={annotating}\n compact={isCompact}\n onClick={() => {\n setPlacingSignature(false)\n markup.setShowOriginal(false)\n setAnnotating((on) => !on)\n }}\n />\n )}\n {/* The markup is the default view; \"Show original\" shows the untouched file. */}\n {activeTab === 'pdf' && pdfBlob && !placingSignature && (markup.hasMarkup || annotating) && (\n <ShowOriginalButton\n active={markup.showOriginal}\n compact={isCompact}\n onClick={() => {\n setAnnotating(false)\n markup.setShowOriginal((on) => !on)\n }}\n />\n )}\n {activeTab === 'pdf' && markup.hasMarkup && !annotating && (\n <DownloadMarkupButton\n onClick={() => void markup.downloadMarkup()}\n // A signed version is locked: Download serves the signed file as it is.\n disabledReason={isSigned ? SIGNED_LOCKED_REASON : undefined}\n />\n )}\n {/* Image actions: start a generation from this image, or crop it into a new document. */}\n {activeTab === 'pdf' && isImage && pdfBlob && (\n <ViewerImageActions\n compact={isCompact}\n onUseAsReference={\n support.useImageAsReference ? () => support.useImageAsReference!(documentId) : undefined\n }\n onCrop={crop.handleOpenCrop}\n />\n )}\n {/* The thread it was made in: open it at the answer that made it. */}\n {madeIn && (\n <Button\n type=\"button\"\n variant=\"outline\"\n size={isCompact ? 'icon' : 'sm'}\n onClick={() =>\n openConversation(madeIn.id, {\n messageId: documentData?.source_message_ext_id ?? undefined,\n })\n }\n title={`Open the thread it was made in: ${madeIn.title}`}\n aria-label={`Open the thread it was made in: ${madeIn.title}`}\n data-testid=\"document-open-thread\"\n >\n <MessageSquare className=\"size-4\" />\n {!isCompact && <span className=\"max-w-[10rem] truncate\">{madeIn.title}</span>}\n </Button>\n )}\n {documentId && documentData && !isDraft && !isStreaming && (\n <>\n <Button\n type=\"button\"\n variant=\"outline\"\n size=\"sm\"\n onClick={() => setSharingFile(true)}\n data-testid=\"share-file-button\"\n >\n Share file\n </Button>\n <FileShareDialog\n open={sharingFile}\n onOpenChange={setSharingFile}\n documentId={documentId}\n version={pdfSnapshotNumber ?? documentData.current_version ?? 1}\n />\n </>\n )}\n {/* Chat about this document: the thread bound to it (its questions edit it), the latest one\n or a new one. Only such a thread drafts in a document: one merely open binds no chat. */}\n {doc.savedDocumentId && !snapshotDocumentId && (\n <Button\n type=\"button\"\n variant=\"outline\"\n size={isCompact ? 'icon' : 'sm'}\n onClick={chatAboutDocument}\n title=\"Chat about this document: a thread that works in it, with edits as tracked changes\"\n aria-label=\"Chat about this document\"\n data-testid=\"document-chat-about\"\n className=\"pointer-coarse:min-h-11\"\n >\n <MessageSquarePlus className=\"size-4\" />\n {!isCompact && <span className=\"ml-1\">Chat</span>}\n </Button>\n )}\n {/* Share always asks first (the host's share dialog), so a click never changes who can see\n the file by surprise. */}\n {documentId && doc.workspaceId && (\n <ShareControl\n state={documentData?.shared ? 'shared' : 'private'}\n onToggle={share}\n disabled={!canChangeVisibility(documentData, currentUserId)}\n disabledTooltip=\"Only the owner can change visibility\"\n tooltip={\n documentData?.shared\n ? 'Shared with the workspace — click to share with specific people'\n : 'Share with the workspace, then optionally notify specific people by email'\n }\n variant=\"outline\"\n compact={isCompact}\n showState={!isCompact}\n labels={{\n shared: getEntityLabel('WORKSPACE'),\n private: 'Only you',\n mixed: 'Partly shared',\n }}\n testId=\"share-document-button\"\n stateTestId=\"document-title-shared-indicator\"\n />\n )}\n {/* Email: the host's mail composer with the document on screen attached. The divider keeps\n it apart from Share, which changes who can see the file rather than sending it. */}\n {tools.emailDocument && !isDraft && !isStreaming && documentData?.file_name && (\n <>\n <span className=\"mx-1 h-5 w-px bg-border\" aria-hidden=\"true\" />\n <Button\n type=\"button\"\n variant=\"outline\"\n size={isCompact ? 'icon' : 'sm'}\n title=\"Email this document\"\n aria-label=\"Email\"\n data-testid=\"email-document-button\"\n className=\"pointer-coarse:min-h-11\"\n onClick={() => tools.emailDocument?.(shownRef)}\n >\n <Mail className=\"size-4\" />\n {!isCompact && <span className=\"ml-1\">Email</span>}\n </Button>\n </>\n )}\n {/* Translate: a new, editable document with the original and translation side by side. */}\n {support.translate &&\n !isDraft &&\n !isStreaming &&\n !liveKind &&\n !isImage &&\n documentData?.file_name && (\n <Button\n type=\"button\"\n variant=\"outline\"\n size={isCompact ? 'icon' : 'sm'}\n title=\"Translate into another language: a new editable document, original and translation side by side\"\n aria-label=\"Translate\"\n data-testid=\"translate-document-button\"\n className=\"pointer-coarse:min-h-11\"\n onClick={() => support.translate!(shownRef)}\n >\n <Languages className=\"size-4\" />\n {!isCompact && <span className=\"ml-1\">Translate</span>}\n </Button>\n )}\n {/* Finalise (a translation): its current version saved as a new labelled PDF. */}\n {!isStreaming && !snapshotDocumentId && (\n <FinaliseTranslationButton document={documentData ?? undefined} isCompact={isCompact} />\n )}\n {/* Every signing action starts in one menu: sign yourself, save/place a mark, or request\n signatures from others. */}\n {annotatable && (\n <DropdownMenu>\n <DropdownMenuTrigger asChild>\n <Button\n type=\"button\"\n variant={\n placingSignature || signatureFlow?.kind === 'prepare' ? 'default' : 'outline'\n }\n size={isCompact ? 'icon' : 'sm'}\n aria-label=\"Sign\"\n title=\"Sign or request signatures\"\n data-testid=\"signing-menu-trigger\"\n className=\"pointer-coarse:min-h-11\"\n >\n <PenLine className=\"size-4\" />\n {!isCompact && <span className=\"ml-1\">Sign</span>}\n <ChevronDown className=\"ml-1 size-3\" />\n </Button>\n </DropdownMenuTrigger>\n <DropdownMenuContent align=\"end\" forceMount>\n <DropdownMenuItem\n data-testid=\"sign-document-button\"\n onSelect={() => {\n setAnnotating(false)\n if (isSigned) {\n setSignatureFlow(null)\n setPlacingSignature((on) => !on)\n } else {\n setPlacingSignature(false)\n setSignatureFlow({ kind: 'prepare', self: true })\n }\n }}\n >\n <PenLine className=\"mr-2 size-4\" /> Sign this document\n </DropdownMenuItem>\n {!isSigned && (\n <>\n <PlaceMySignatureMenuItems\n onPlace={(mark) => {\n setPlacingSignature(false)\n setSignatureFlow(null)\n markup.setShowOriginal(false)\n setAnnotating(true)\n setPlaceMark({ ...mark, key: Date.now() })\n }}\n />\n <DropdownMenuItem\n data-testid=\"request-signatures-button\"\n onSelect={() => {\n setAnnotating(false)\n setPlacingSignature(false)\n setSignatureFlow(signatureFlow?.kind === 'prepare' ? null : { kind: 'prepare' })\n }}\n >\n <Users className=\"mr-2 size-4\" /> Ask someone to sign\n </DropdownMenuItem>\n </>\n )}\n </DropdownMenuContent>\n </DropdownMenu>\n )}\n {isSignOpen && pdfBlob && (\n <SignDocumentDialog\n open={isSignOpen}\n onOpenChange={setIsSignOpen}\n documentId={documentId}\n pdfBlob={pdfBlob}\n // The PDF on screen is the current version's (an earlier one cannot be signed): the\n // server refuses if another version has landed since.\n version={documentData?.current_version ?? undefined}\n appearance={signAppearance}\n />\n )}\n {headerActions}\n </ViewerHeaderEnd>\n )\n\n const viewerProps = {\n currentPage: viewingDocumentPage || undefined,\n onLoadSuccess: handleLoadSuccess,\n scrollTrigger,\n zoom,\n onZoomChange: setZoom,\n }\n\n return (\n <ViewerFrame\n frameRef={containerRef}\n contentId={documentId}\n header={\n <>\n <TabHeader\n tabs={[]}\n activeTabId={activeTab}\n onTabChange={handleTabChange}\n leftContent={leftContent}\n rightContent={rightContent}\n variant=\"underline\"\n />\n {isCompact && !isCoEditing && (\n <div data-slot=\"viewer-title-row\" className=\"flex min-w-0 items-center gap-2 px-3 pb-2\">\n {titleBlock}\n </div>\n )}\n {/* In the sticky header, not the content area: the PDF view scrolls its first page into\n view, which scrolls a bar above it out of sight. */}\n {snapshotDocumentId && (\n <VersionSnapshotBar\n versionNumber={snapshotNumber}\n live={isDocx || isArtifact}\n onAsk={\n support.askAboutVersion\n ? () => support.askAboutVersion!(snapshotDocumentId)\n : undefined\n }\n onReturn={() => setSnapshotDocumentId(null)}\n />\n )}\n </>\n }\n compareRow={isComparing ? compareIndicator || undefined : undefined}\n footer={\n // Crop to a new document. Full resolution (no maxSize): a crop frames, it never downscales.\n <ImageCropModal\n open={crop.cropImageUrl !== null}\n image={crop.cropImageUrl}\n title=\"Crop image\"\n saveLabel=\"Save as a copy\"\n aspectOptions={DEFAULT_ASPECT_OPTIONS}\n output={{ mimeType: 'image/png' }}\n onComplete={crop.handleCropComplete}\n onCancel={crop.closeCrop}\n />\n }\n >\n {isComparing && (\n <Suspense fallback={<ViewerMessage>Loading comparison…</ViewerMessage>}>\n <NativeDocxComparison\n baseId={compareDocumentId!}\n revisedId={documentId}\n title={documentTitle}\n />\n </Suspense>\n )}\n {/* A capture draft (photo/video/audio) has no backend document at all until it is saved:\n its recorder takes over the whole content area. */}\n {isCaptureDraft && <ViewerCaptureDraft documentId={documentId} />}\n\n {/* Media stay mounted (hidden) on the text tab, so playback goes on while reading the\n transcript. */}\n {!isCaptureDraft &&\n (activeTab === 'pdf' || (isMedia && activeTab === 'html')) &&\n !isArtifact &&\n !isComparing && (\n <ViewerPane hidden={activeTab !== 'pdf'}>\n {/* The labels are the document's, whichever view it is read in: the PDF gets the\n chips without the passage stepper (no parsed passages to walk here). */}\n <DocumentLabelBar summaries={labelSummaries} />\n {!isMedia && !isImage && signatureBanner}\n {activeTab === 'pdf' && !isMedia && !isImage && (\n <MarkupNotices\n legacyPrompt={markup.legacyPrompt}\n olderNote={markup.olderNote}\n onOpenVersion={(n) => setSnapshotDocumentId(`${documentId}@v${n}`)}\n />\n )}\n <ViewerControlBar controls={activeTab === 'pdf' && pageNav}>\n <ViewerPdfPane\n documentId={documentId}\n doc={doc}\n pdfBlob={pdfBlob}\n isPdfLoading={blobs.isPdfLoading}\n pdfError={blobs.pdfError}\n onDownload={() => void handleDirectDownload()}\n viewerProps={viewerProps}\n signatureFlow={signatureFlow}\n onSignatureFlow={setSignatureFlow}\n currentUserId={currentUserId}\n placingSignature={placingSignature}\n onPlacingDone={(appearance) => {\n setPlacingSignature(false)\n if (!appearance) return\n setSignAppearance(appearance)\n setIsSignOpen(true)\n }}\n annotating={annotating}\n markup={markup}\n pdfSnapshotNumber={pdfSnapshotNumber}\n isSigned={isSigned}\n placeMark={placeMark}\n />\n </ViewerControlBar>\n </ViewerPane>\n )}\n\n {activeTab === 'preview' && isArtifact && liveKind && (\n // The preview loads its JSX compiler on first use, so it stays out of the main bundle.\n <ArtifactPreview\n kind={liveKind}\n source={liveSource}\n isStreaming={isStreaming}\n runtimeUrl={artifactRuntimeUrl}\n />\n )}\n\n {activeTab === 'edit' && isArtifact && liveKind && (\n <ArtifactCodeView source={liveSource} fileName={documentData?.file_name ?? undefined} />\n )}\n\n {/* A document draft is stored as DOCX: once generation ends the Word editor opens the stored\n document. Only a draft still being generated shows the streamed preview. */}\n {activeTab === 'edit' && isArtifact && !liveKind && !isStreaming && !isComparing && (\n <Suspense fallback={<ViewerMessage>Loading editor…</ViewerMessage>}>\n {isSigned && !snapshotDocumentId && <SignedEditNote />}\n <NativeDocxEditor\n key={`${snapshotDocumentId || documentId}-${snapshotDocumentId ? 'snapshot' : 'live'}`}\n documentId={snapshotDocumentId || documentId}\n title={documentTitle}\n draftContent={isDraft ? draftDoc?.content || '' : undefined}\n snapshot={!!snapshotDocumentId}\n onSaved={(id) => {\n if (!isDraft) return\n session.clearDraftDocument(documentId)\n setViewingDocumentId(id)\n }}\n />\n </Suspense>\n )}\n\n {activeTab === 'versions' && (isArtifact || isDocx || hasHistory) && !isComparing && (\n <VersionTimeline\n // Each version made in a thread names it and opens it at the turn that made it.\n versions={versions.map((v) => ({\n ...v,\n madeIn: v.thread\n ? {\n label: threadTitle(v.thread.conversationId),\n onOpen: () =>\n openConversation(v.thread!.conversationId, {\n messageId: v.thread!.messageId ?? undefined,\n }),\n }\n : null,\n }))}\n currentId={currentVersionId}\n live={!!liveKind}\n // An uploaded file is not a draft: its versions come from replacing, editing or signing.\n labels={isArtifact ? undefined : { emptyDocument: UPLOADED_NO_VERSIONS }}\n formatDate={formatDate}\n onOpen={(id) => {\n // The current version is the live document itself, not a read-only copy of it.\n setSnapshotDocumentId(id === currentVersionId ? null : id)\n setActiveTab(isArtifact ? 'edit' : isDocx ? 'docx' : 'pdf')\n }}\n onCompare={(id) => session.setDocumentViewer({ compareId: id, tab: 'html' })}\n translations={translations}\n onOpenTranslation={(id) => setViewingDocumentId(id)}\n />\n )}\n\n {activeTab === 'xlsx' &&\n isXlsx &&\n (xlsxBlob ? (\n <XlsxViewer blob={xlsxBlob} />\n ) : (\n <ViewerMessage>\n {xlsxError ? 'Failed to load spreadsheet' : 'Loading spreadsheet...'}\n </ViewerMessage>\n ))}\n\n {activeTab === 'docx' && isDocx && !isComparing && (\n <Suspense fallback={<ViewerMessage>Loading editor…</ViewerMessage>}>\n {signatureBanner}\n {isSigned && !snapshotDocumentId && <SignedEditNote />}\n <NativeDocxEditor\n key={`${snapshotDocumentId || documentId}-${snapshotDocumentId ? 'snapshot' : 'live'}`}\n documentId={snapshotDocumentId || documentId}\n title={documentTitle}\n snapshot={!!snapshotDocumentId}\n />\n </Suspense>\n )}\n\n {streamingDoc &&\n isStreaming &&\n isArtifact &&\n !liveKind &&\n !isComparing &&\n (activeTab === 'html' || activeTab === 'edit') && (\n <Suspense fallback={<ViewerMessage>Opening draft…</ViewerMessage>}>\n <StreamedWordArtifact\n key={documentId}\n documentId={documentId.startsWith('doc-') ? documentId : undefined}\n title={documentTitle}\n content={streamingDoc.content}\n busy={isStreaming}\n />\n </Suspense>\n )}\n\n {!isCaptureDraft &&\n !isComparing &&\n activeTab === 'html' &&\n !(isStreaming && isArtifact && !liveKind) && (\n <ViewerPane>\n <ViewerControlBar controls={pageNav}>\n <ParsedTextView\n documentId={pdfSnapshotId || documentId}\n onLoadSuccess={handleLoadSuccess}\n scrollTrigger={scrollTrigger}\n zoom={zoom}\n onZoomChange={setZoom}\n />\n </ViewerControlBar>\n </ViewerPane>\n )}\n </ViewerFrame>\n )\n}\n"]}
|
|
1
|
+
{"version":3,"sources":["../src/connection/viewer/drafts.tsx","../src/connection/viewer/FinaliseTranslationButton.tsx","../src/connection/viewer/useImageCrop.ts","../src/connection/viewer/useViewedDocument.ts","../src/connection/viewer/useViewerBlobs.ts","../src/connection/viewer/useViewerTabs.tsx","../src/connection/viewer/useViewerVersions.ts","../src/connection/viewer/parsed/document-tags.ts","../src/connection/viewer/parsed/useChunkTagging.ts","../src/connection/viewer/parsed/PassageTagPanel.tsx","../src/connection/viewer/parsed/ParsedPassage.tsx","../src/connection/viewer/parsed/citation-line.ts","../src/connection/viewer/parsed/usePassageCopy.ts","../src/connection/viewer/parsed/useDocumentLabels.ts","../src/connection/viewer/parsed/useCitationSelection.ts","../src/connection/viewer/parsed/usePageScrollSync.ts","../src/connection/viewer/parsed/useLazyPages.ts","../src/connection/viewer/parsed/ParsedTextView.tsx","../src/connection/viewer/ViewerPdfPane.tsx","../src/connection/viewer/ConnectedDocumentViewer.tsx"],"names":["jsx","FileText","Mic","VideoIcon","Camera","useArbiSessionState","useArbiSessionStore","DropdownMenu","DropdownMenuTrigger","DropdownMenuContent","jsxs","DropdownMenuItem","Check","useUserSettings","useConfig","useSaveConfigField","DraftTitleControls","useArbi","useDictateContext","useBlocksEnvironment","useUploadDocuments","logger","VoiceNoteRecorder","PhotoCapture","VideoCapture","document","isPanelOpen","DOCUMENT_VIEWER_PANEL","useMemo","compareDocumentsIn","RelatedDocumentsCell","useFilesDialogs","useFinaliseTranslation","useDocumentTools","Button","FileCheck2","useState","useCallback","useEffect","useViewerStreamingDocument","useConnectedWorkspace","useDocument","useConnectedTags","summariseDocTags","isDocumentLabel","isImageFile","isVideoFile","isAudioFile","artifactKindFromMode","artifactKindFromFileName","savedDocumentIdFor","useArtifactSource","useParsedDocument","isDownloadOnlyFile","parseVersionRef","loadOfflineDocument","useDocumentBytes","hasVideoTrack","fetchDocumentFile","friendlyFileType","useIsPhone","useRef","VidIcon","AudIcon","ImgIcon","EmlIcon","PdfIcon","History","MonitorPlay","Code","DocIcon","XlsIcon","HtmlIcon","useConnectedDocuments","useDocumentVersionList","documentVersions","toArtifactVersions","useAssignDocTags","useUpdateDocTag","useRemoveDocTags","useDocumentViewerSupport","groups","getEntityColor","TagEntity","TagPassagePanel","memo","ParsedPassage","HtmlPassage","LabelMark","NoteMark","PassageMark","ConnectedMarkdown","buildDeepLinkUrl","React","PassagePill","useViewerPassageCitation","computeSelectionRuns","viewingDocumentPage","usePageIntersectionObserver","useProcessedChunks","useScrollAnchor","usePinchZoom","ViewerMessage","HtmlViewerRoot","DocumentLabelBar","CitedRunNav","HtmlViewerSurface","HtmlPage","HtmlViewerEmpty","lazy","useViewerIsDetached","KitPdfViewer","ViewerPreviewUnavailable","ViewerLoadError","VideoViewer","AudioViewer","ImageViewer","Suspense","ErrorBoundary","ConnectedDocumentToolsProvider","fmtDate","useConnectedConversations","useRegisterOpenDocument","latestThreadOfDocument","useDocumentSignatures","versionLabel","findVersion","useDocumentMarkup","Fragment","ViewerZoomControl","cycleZoom","PdfPageNav","ViewerPageCounter","ArtifactCompareBar","ViewerTitle","ViewerStatusNote","MarkupViewNote","SignatureStatus","ViewerHeaderStart","ViewerTabBar","canAnnotate","SignatureRequestBanner","ViewerHeaderEnd","AnnotateButton","ShowOriginalButton","DownloadMarkupButton","SIGNED_LOCKED_REASON","ViewerImageActions","MessageSquare","FileShareDialog","MessageSquarePlus","ShareControl","canChangeVisibility","getEntityLabel","Mail","Languages","PenLine","ChevronDown","PlaceMySignatureMenuItems","Users","SignDocumentDialog","ViewerFrame","TabHeader","VersionSnapshotBar","ImageCropModal","DEFAULT_ASPECT_OPTIONS","ViewerPane","MarkupNotices","ViewerControlBar","ArtifactPreview","ArtifactCodeView","SignedEditNote","VersionTimeline","XlsxViewer"],"mappings":"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","file":"chunk-6DAJXQZZ.cjs","sourcesContent":["/**\n * The viewer's unsaved drafts (the session's `draftDocuments`, started with `startDraftDocument`)\n * and its related documents. A draft has no backend record until it is saved: its kind (Doc,\n * Voice, Photo, Video) replaces the tabs, its editable name replaces the title, and a capture\n * draft's recorder is the whole body. A capture saves straight to the workspace as its own\n * document (`useUploadDocuments`), with the user's active configuration, so the backend can name it\n * from its content.\n */\n\nimport { useMemo, type FocusEvent, type ReactNode } from 'react'\nimport { Camera, Check, FileText, Mic, Video as VideoIcon } from 'lucide-react'\nimport {\n DOCUMENT_VIEWER_PANEL,\n DraftTitleControls,\n PhotoCapture,\n VideoCapture,\n VoiceNoteRecorder,\n isPanelOpen,\n useArbi,\n useArbiSessionState,\n useArbiSessionStore,\n useConfig,\n useSaveConfigField,\n useUploadDocuments,\n useUserSettings,\n type ArbiDraftDocument,\n type ArbiDraftKind,\n type WorkspaceDocument,\n} from '@arbidocs/react'\nimport {\n useDictateContext,\n DropdownMenu,\n DropdownMenuContent,\n DropdownMenuItem,\n DropdownMenuTrigger,\n} from '@arbidocs/react/ui'\nimport { logger } from '@arbidocs/client'\nimport { useBlocksEnvironment } from '../../provider/environment'\nimport { RelatedDocumentsCell } from '../files/grid/cells'\nimport { useFilesDialogs } from '../files/store'\nimport type { ViewerDocumentRecord } from './support'\nimport { compareDocumentsIn } from './compareDocuments'\n\nconst KIND_OPTIONS: { value: ArbiDraftKind; icon: ReactNode; label: string }[] = [\n { value: 'text', icon: <FileText className=\"w-4 h-4\" />, label: 'Doc' },\n { value: 'audio', icon: <Mic className=\"w-4 h-4\" />, label: 'Voice' },\n { value: 'video', icon: <VideoIcon className=\"w-4 h-4\" />, label: 'Video' },\n { value: 'photo', icon: <Camera className=\"w-4 h-4\" />, label: 'Photo' },\n]\n\nconst useDraft = (documentId: string): ArbiDraftDocument | undefined =>\n useArbiSessionState((state) => state.draftDocuments[documentId])\n\n/**\n * A draft's kind, in place of the tabs: the icon of its kind opens the four kinds, so the user can\n * switch before capturing or typing anything.\n */\nexport function ViewerDraftKind({ documentId }: { documentId: string }) {\n const draft = useDraft(documentId)\n const session = useArbiSessionStore()\n if (!draft) return null\n const current = KIND_OPTIONS.find((option) => option.value === draft.kind) ?? KIND_OPTIONS[0]\n return (\n <DropdownMenu>\n <DropdownMenuTrigger asChild>\n <button\n type=\"button\"\n title={`Draft kind: ${current.label}. Click to change.`}\n aria-label={`Draft kind: ${current.label}. Click to change.`}\n className=\"px-3 py-2 transition-all duration-200 font-medium border-b-2 border-transparent text-muted-foreground hover:text-foreground hover:border-border flex-shrink-0 flex items-center\"\n data-testid=\"draft-kind-trigger\"\n >\n {current.icon}\n </button>\n </DropdownMenuTrigger>\n <DropdownMenuContent align=\"start\" sideOffset={4} className=\"w-40\">\n {KIND_OPTIONS.map((option) => (\n <DropdownMenuItem\n key={option.value}\n onSelect={() => session.setDraftDocumentKind(documentId, option.value)}\n data-testid={`draft-kind-option-${option.value}`}\n >\n {option.icon}\n <span>{option.label}</span>\n {option.value === draft.kind && <Check className=\"ml-auto w-4 h-4\" />}\n </DropdownMenuItem>\n ))}\n </DropdownMenuContent>\n </DropdownMenu>\n )\n}\n\nconst TITLE_PLACEHOLDER: Record<ArbiDraftKind, string> = {\n text: 'New Doc',\n audio: 'New Audio',\n photo: 'New Photo',\n video: 'New Video',\n}\n\n// The draft starts with a real default name (\"New Doc\"), not a placeholder, so focusing the field\n// selects it: typing then replaces it instead of appending to it.\nfunction selectTitleOnFocus(event: FocusEvent<HTMLDivElement>) {\n if (event.target instanceof HTMLInputElement) event.target.select()\n}\n\n/**\n * A draft's editable name, in place of the title, with the auto-name switch: the active\n * configuration's `DoctagLLM.AUTO_RENAME`, the same setting as the upload dialog's.\n */\nexport function ViewerDraftTitle({ documentId }: { documentId: string }) {\n const draft = useDraft(documentId)\n const session = useArbiSessionStore()\n const { data: userSettings } = useUserSettings()\n const { data: activeConfig } = useConfig(userSettings?.last_config || 'default')\n const configField = useSaveConfigField()\n const config = activeConfig as { DoctagLLM?: { AUTO_RENAME?: boolean } } | undefined\n const autoRename = config?.DoctagLLM?.AUTO_RENAME ?? false\n\n if (!draft) return null\n return (\n <div className=\"contents\" onFocus={selectTitleOnFocus}>\n <DraftTitleControls\n title={draft.title}\n onTitleChange={(title) => session.updateDraftDocument(documentId, { title })}\n placeholder={TITLE_PLACEHOLDER[draft.kind] ?? TITLE_PLACEHOLDER.text}\n autoRename={autoRename}\n onAutoRenameChange={(value) => configField.save('DoctagLLM', 'AUTO_RENAME', value)}\n />\n </div>\n )\n}\n\n/** Each capture's file name and the type used when the recorder reports none. */\nconst CAPTURE_FILE: Record<\n 'audio' | 'photo' | 'video',\n { name: string; fallbackType: string; saved: string; label: string }\n> = {\n audio: {\n name: 'voice-note.webm',\n fallbackType: 'audio/webm',\n saved: 'Voice note saved — transcribing…',\n label: 'voice note',\n },\n photo: { name: 'photo.png', fallbackType: 'image/png', saved: 'Photo saved', label: 'photo' },\n video: { name: 'video.webm', fallbackType: 'video/webm', saved: 'Video saved', label: 'video' },\n}\n\n/**\n * A capture draft's recorder (voice, photo or video), the whole body of the viewer. The finished\n * capture is kept in the draft first, so it survives the viewer closing even if the save fails;\n * the draft is cleared once the saved document's id is known and the viewer moves to it.\n */\nexport function ViewerCaptureDraft({ documentId }: { documentId: string }) {\n const draft = useDraft(documentId)\n const session = useArbiSessionStore()\n const arbi = useArbi()\n const dictate = useDictateContext()\n const { notify } = useBlocksEnvironment()\n const upload = useUploadDocuments()\n const { data: userSettings } = useUserSettings()\n\n if (!draft || draft.kind === 'text') return null\n const kind = draft.kind\n const file = CAPTURE_FILE[kind]\n\n const discard = () => {\n session.clearDraftDocument(documentId)\n session.setViewingDocument(null)\n }\n const save = async (blob: Blob, mimeType: string | null) => {\n session.updateDraftDocument(documentId, { mediaBlob: blob })\n try {\n const response = await upload.mutateAsync({\n files: [new File([blob], file.name, { type: mimeType || file.fallbackType })],\n options: { configExtId: userSettings?.last_config ?? undefined },\n })\n // The id often arrives later (on the realtime channel): only leave the draft for a real one.\n const newDocId = response.doc_ext_ids?.[0]\n if (newDocId) {\n session.clearDraftDocument(documentId)\n session.setViewingDocument({ id: newDocId, page: null })\n }\n notify(file.saved, 'success')\n } catch (err) {\n logger.error(`[ViewerCaptureDraft] Saving the ${file.label} failed`, err)\n notify(`Could not save the ${file.label}. Please try again.`, 'error')\n }\n }\n const onError = (message: string) => notify(message, 'error')\n\n return (\n <div className=\"h-full overflow-hidden\" data-testid=\"media-capture-recorder\">\n {kind === 'audio' && (\n <VoiceNoteRecorder\n title={draft.title}\n isSaving={upload.isPending}\n onSave={save}\n onDiscard={discard}\n onError={onError}\n // A rough transcript while reviewing (the host's dictation, else the session's); the real\n // one comes with the saved document.\n transcribe={(blob) =>\n dictate ? dictate.transcribe(blob) : arbi.assistant.transcribe(blob)\n }\n />\n )}\n {kind === 'photo' && (\n <PhotoCapture\n onSave={save}\n onDiscard={discard}\n onError={onError}\n isSaving={upload.isPending}\n />\n )}\n {kind === 'video' && (\n <VideoCapture\n onSave={save}\n onDiscard={discard}\n onError={onError}\n isSaving={upload.isPending}\n />\n )}\n </div>\n )\n}\n\n/**\n * The documents related to the open one (its email family, copies, near duplicates), beside its\n * name: one opens in the viewer, and each can be deleted or compared with it.\n */\nexport function ViewerRelatedDocuments({ document }: { document: ViewerDocumentRecord }) {\n const session = useArbiSessionStore()\n const related = useArbiSessionState((state) => state.relatedDocuments.get(document.external_id))\n const viewerOpen = useArbiSessionState((state) => isPanelOpen(state, DOCUMENT_VIEWER_PANEL))\n const viewingId = useArbiSessionState((state) => state.viewingDocument?.id ?? null)\n const onCompare = useMemo(\n () => (id: string, otherId: string) => compareDocumentsIn(session, id, otherId),\n [session]\n )\n if (!related) return null\n return (\n <RelatedDocumentsCell\n currentDoc={document as WorkspaceDocument}\n related={related}\n viewingDocumentId={viewerOpen ? viewingId : null}\n onDocumentClick={(id) => session.setViewingDocument({ id, page: null })}\n onDelete={(doc) => useFilesDialogs.getState().requestDelete(doc)}\n onCompare={onCompare}\n />\n )\n}\n","import { FileCheck2 } from 'lucide-react'\nimport { useFinaliseTranslation } from '@arbidocs/react'\nimport { useDocumentTools } from '@arbidocs/react/document-tools'\nimport { Button } from '@arbidocs/react/ui'\nimport { useBlocksEnvironment } from '../../provider/environment'\n\ninterface TranslationDocument {\n external_id: string\n derived_from?: ReadonlyArray<{ role?: string | null }> | null\n}\n\n/** A translation made by ARBI that is not itself a final PDF: the editable draft to finalise. */\nconst isTranslationDraft = (doc: TranslationDocument | undefined): boolean =>\n !!doc?.derived_from?.some((d) => d.role === 'translation') &&\n !doc.derived_from.some((d) => d.role === 'final')\n\n/**\n * Finalise: save the translation's current version as a new PDF document, labelled \"Translation\" and\n * linked to the original. The editable translation stays as it is; the new PDF opens.\n */\nexport function FinaliseTranslationButton({\n document,\n isCompact,\n}: {\n document: TranslationDocument | undefined\n isCompact: boolean\n}): React.ReactElement | null {\n // The new PDF joins the documents list with its links (draft, original), so the original's\n // Translations list shows it at once.\n const finalise = useFinaliseTranslation()\n const { openDocument } = useDocumentTools()\n const { notify } = useBlocksEnvironment()\n if (!document || !isTranslationDraft(document)) return null\n const pending = finalise.isPending\n const onClick = async () => {\n try {\n const { document_ext_id: finalId } = await finalise.mutateAsync(document.external_id)\n notify('Saved the final PDF of this translation', 'success')\n openDocument?.(finalId)\n } catch (error) {\n const detail = (error as { detail?: unknown })?.detail\n notify(\n typeof detail === 'string' ? detail : 'The final PDF could not be saved. Try again.',\n 'error'\n )\n }\n }\n return (\n <Button\n type=\"button\"\n variant=\"outline\"\n size={isCompact ? 'icon' : 'sm'}\n title=\"Finalise: save this translation as a new PDF, labelled Translation and linked to the original\"\n aria-label=\"Finalise\"\n data-testid=\"finalise-translation-button\"\n className=\"pointer-coarse:min-h-11\"\n disabled={pending}\n onClick={() => void onClick()}\n >\n <FileCheck2 className=\"size-4\" />\n {!isCompact && <span className=\"ml-1\">{pending ? 'Finalising…' : 'Finalise'}</span>}\n </Button>\n )\n}\n","/**\n * Cropping an image in the viewer: the crop is saved as a NEW document made from the image\n * (`derived_from`, role `crop`) in the image's own workspace, named on the upload; the original is\n * never touched. The new document opens once its id is back (otherwise it arrives through the\n * documents list).\n */\n\nimport { useCallback, useState } from 'react'\nimport { useDocumentTools } from '@arbidocs/react/document-tools'\nimport { useBlocksEnvironment } from '../../provider/environment'\n\nexport function useImageCrop(\n documentId: string,\n fileName: string | null | undefined,\n imageBlob: Blob | null,\n /** The image's workspace, where the crop goes (never whichever one is open when it is saved). */\n workspaceId: string | null | undefined\n) {\n const { uploadDocument, onDocumentsChanged, openDocument } = useDocumentTools()\n const { notify } = useBlocksEnvironment()\n const [cropImageUrl, setCropImageUrl] = useState<string | null>(null)\n\n const handleOpenCrop = useCallback(() => {\n if (!imageBlob) return\n setCropImageUrl(URL.createObjectURL(imageBlob))\n }, [imageBlob])\n\n const closeCrop = useCallback(() => {\n setCropImageUrl((url) => {\n if (url) URL.revokeObjectURL(url)\n return null\n })\n }, [])\n\n const handleCropComplete = useCallback(\n async (result: { blob: Blob }) => {\n const baseName = (fileName || 'image').replace(/\\.[^.]+$/, '')\n const file = new File([result.blob], `${baseName} (cropped).png`, { type: 'image/png' })\n try {\n const response = await uploadDocument({\n file,\n query: {\n derived_from: [documentId],\n derived_role: 'crop',\n ...(workspaceId ? { workspace_ext_id: workspaceId } : {}),\n },\n })\n const newDocId = response?.doc_ext_ids?.[0]\n if (newDocId) {\n await onDocumentsChanged?.([newDocId], 'copy')\n openDocument?.(newDocId)\n }\n notify('Cropped image saved', 'success')\n } catch {\n notify('Failed to save the cropped image', 'error')\n } finally {\n closeCrop()\n }\n },\n [\n fileName,\n documentId,\n workspaceId,\n uploadDocument,\n onDocumentsChanged,\n openDocument,\n notify,\n closeCrop,\n ]\n )\n\n return { cropImageUrl, handleOpenCrop, closeCrop, handleCropComplete }\n}\n","/**\n * What the document viewer is looking at: the document record, the streaming / draft overlay,\n * the kind of content (artifact, live artifact, media, Word, sheet, ...) and whether it has parsed\n * text.\n */\n\nimport { useEffect, useMemo, useState } from 'react'\nimport {\n useArbiSessionState,\n useDocument,\n useParsedDocument,\n type ArbiDraftDocument,\n} from '@arbidocs/react'\nimport {\n artifactKindFromFileName,\n artifactKindFromMode,\n useArtifactSource,\n} from '@arbidocs/react/artifacts'\nimport { isAudioFile, isDownloadOnlyFile, isImageFile, isVideoFile } from '@arbidocs/react/ui'\nimport { savedDocumentIdFor } from '@arbidocs/react/shell'\nimport { isDocumentLabel, summariseDocTags } from '../../files/doc-labels'\nimport { useConnectedWorkspace } from '../ConnectionProvider'\nimport { useConnectedTags } from '../workspaceData'\nimport { useViewerStreamingDocument } from './support'\n\nconst DOCX_EXTENSIONS = new Set(['.docx', '.doc'])\nconst XLSX_EXTENSIONS = new Set(['.xlsx', '.xls'])\nconst EMAIL_EXTENSIONS = new Set(['.eml', '.msg'])\n\n/** Lower-cased extension with its dot (`.pdf`), or `''`. */\nexport function fileExtension(fileName: string | null | undefined): string {\n if (!fileName) return ''\n return fileName.substring(fileName.lastIndexOf('.')).toLowerCase()\n}\n\nexport function useViewedDocument(documentId: string) {\n // `.webm` is ambiguous by extension alone (audio-only recordings use the same container as\n // video). Resolved once the bytes are here; null = not yet, and the extension's guess stands.\n const [webmHasVideoTrack, setWebmHasVideoTrack] = useState<boolean | null>(null)\n useEffect(() => setWebmHasVideoTrack(null), [documentId])\n\n // An artifact being generated in a chat.\n const streamingDoc = useViewerStreamingDocument(documentId)\n const isStreaming = !!streamingDoc && !streamingDoc.isComplete\n // A draft the user started (blank document, voice note) with no backend record yet.\n const draftDoc = useArbiSessionState<ArbiDraftDocument | undefined>(\n (state) => state.draftDocuments[documentId]\n )\n const isDraft = !!draftDoc\n // A capture draft (photo/video/audio) is its recorder; a text draft opens in the Word editor.\n const isCaptureDraft =\n draftDoc?.kind === 'audio' || draftDoc?.kind === 'photo' || draftDoc?.kind === 'video'\n const isTextDraft = draftDoc?.kind === 'text'\n\n const { workspaceId, live } = useConnectedWorkspace()\n const { data: record } = useDocument(documentId, {\n enabled: live && !!workspaceId && !isStreaming && !isDraft,\n // A new version (Save version, a signed copy) is processed before its PDF exists: keep\n // re-reading until it is done, so the PDF tab and the signing tools come back on their own.\n pollWhileProcessing: true,\n })\n // A record of the previously viewed document is not this one.\n const documentData = record?.external_id === documentId ? record : undefined\n\n // Labels for the bar the PDF view carries (the text view derives its own).\n const { data: tags } = useConnectedTags()\n const labelSummaries = useMemo(\n () => summariseDocTags(documentData?.doctags ?? [], tags.filter(isDocumentLabel)),\n [documentData, tags]\n )\n\n // A document renders on the artifact path (Word editor or live preview, and Versions) rather\n // than the PDF path when (1) an artifact is streaming, (2) it is an artifact (AI drafts are\n // stored as .docx, html/react artifacts as .html/.jsx), or (3) it is an uploaded `*.md` (editing\n // and history are its own view; the PDF is a fallback).\n const fileName = documentData?.file_name\n const isMarkdown = fileExtension(fileName) === '.md'\n const isImage = isImageFile(fileName)\n const isWebmFile = fileExtension(fileName) === '.webm'\n // A resolved \"no video track\" wins over the extension's guess (always video for .webm).\n const isVideo = isWebmFile && webmHasVideoTrack === false ? false : isVideoFile(fileName)\n const isAudio = isWebmFile && webmHasVideoTrack === false ? true : isAudioFile(fileName)\n // Generated artifacts carried as a blob (image/audio/video) render in the media viewer.\n const isBlobArtifact =\n streamingDoc?.mode === 'image' ||\n (documentData?.wp_type === 'artifact' && (isImage || isVideo || isAudio))\n const isArtifact =\n (!!streamingDoc || isTextDraft || documentData?.wp_type === 'artifact' || isMarkdown) &&\n !isBlobArtifact\n // html/react artifacts render live in a sandbox; the streaming mode or the saved extension says.\n const liveKind = isArtifact\n ? (artifactKindFromMode(streamingDoc?.mode ?? undefined) ?? artifactKindFromFileName(fileName))\n : null\n\n // The saved document a chat drafts in while it is open here: a saved artifact or Word document.\n const savedDocumentId = savedDocumentIdFor({\n documentId,\n isDraft,\n isStreaming,\n isBlobArtifact,\n documentData,\n })\n\n // Parsed text is stripped of markup: a live artifact needs its stored source.\n const { data: liveSourceFetched } = useArtifactSource(\n documentId,\n !!liveKind && !streamingDoc && !!documentData && !isDraft\n )\n const liveSource = streamingDoc ? streamingDoc.content : (liveSourceFetched ?? '')\n\n // The text view exists whenever there is parsed content, for any file (a recording's\n // transcript too). `low-content` is a terminal status with indexed passages, just sparse.\n const hasParsedDocStatus =\n documentData?.status === 'completed' || documentData?.status === 'low-content'\n const wantsParsedDoc =\n !!documentId && live && !isStreaming && !isDraft && !isBlobArtifact && hasParsedDocStatus\n const { data: parsedDoc, isPending: isParsedDocPending } = useParsedDocument(\n documentId,\n 'final',\n { enabled: wantsParsedDoc }\n )\n // Loading until the text is read, including while the query still waits for the workspace to\n // open: on a reload the record comes back from the saved query cache before the session has\n // opened the workspace, and the text view a passage link asked for must not be given up then.\n // A document with no text to read (or no workspace at all) is settled at once.\n const isParsedDocLoading = wantsParsedDoc && !!workspaceId && isParsedDocPending\n const hasParsedContent =\n ((parsedDoc as { chunks?: unknown[] } | undefined)?.chunks?.length ?? 0) > 0\n\n return {\n workspaceId,\n documentData,\n streamingDoc,\n isStreaming,\n draftDoc,\n isDraft,\n isCaptureDraft,\n isTextDraft,\n labelSummaries,\n isImage,\n isWebmFile,\n setWebmHasVideoTrack,\n isVideo,\n isAudio,\n isMedia: isVideo || isAudio,\n isBlobArtifact,\n savedDocumentId,\n isArtifact,\n liveKind,\n liveSource,\n isDocx: DOCX_EXTENSIONS.has(fileExtension(fileName)),\n isXlsx: XLSX_EXTENSIONS.has(fileExtension(fileName)),\n isEmail: EMAIL_EXTENSIONS.has(fileExtension(fileName)),\n isDownloadOnly: isDownloadOnlyFile(fileName),\n isParsedDocLoading,\n hasParsedContent,\n }\n}\n\nexport type ViewedDocument = ReturnType<typeof useViewedDocument>\n","/**\n * The bytes the document viewer shows: the PDF (or, for media, the stored file), with the host's\n * copy kept on the device when the network is down; the stored sheet; the `.webm` track probe; and\n * downloading the stored file.\n */\n\nimport { useCallback, useEffect, useState } from 'react'\nimport { hasVideoTrack, loadOfflineDocument } from '@arbidocs/react'\nimport { parseVersionRef } from '@arbidocs/react/artifacts'\nimport {\n fetchDocumentFile,\n useDocumentBytes,\n useDocumentTools,\n} from '@arbidocs/react/document-tools'\nimport { isAudioFile, isImageFile, isVideoFile } from '@arbidocs/react/ui'\nimport { useBlocksEnvironment } from '../../provider/environment'\nimport type { ViewedDocument } from './useViewedDocument'\n\n/** `documentId` may be a version reference (`doc-…@v2`). */\nexport function useViewerBlobs(documentId: string, doc: ViewedDocument) {\n const { documentData, isArtifact, isDocx, isXlsx, isDownloadOnly, isWebmFile } = doc\n const { setWebmHasVideoTrack } = doc\n const { client, saveFile } = useDocumentTools()\n const { notify } = useBlocksEnvironment()\n const currentVersion = documentData?.current_version ?? 1\n\n // Images, video and audio show the stored file; everything else its PDF.\n const name = documentData?.file_name\n const original = isImageFile(name) || isVideoFile(name) || isAudioFile(name)\n // The pinned offline copy is the current version's; an earlier version has none.\n const fallback =\n documentData && !parseVersionRef(documentId).version\n ? () => loadOfflineDocument(documentData.external_id)\n : undefined\n const pdf = useDocumentBytes(documentId, {\n version: currentVersion,\n kind: original ? 'original' : 'pdf',\n enabled:\n !isArtifact &&\n !!documentData &&\n !isDownloadOnly &&\n (!isDocx || documentData.status === 'completed' || documentData.status === 'low-content'),\n fallback,\n })\n // Keep the last bytes on screen while a new version of the same document loads; another\n // document (or version) starts empty, never showing the previous one's pages.\n const [pdfBlob, setPdfBlob] = useState<Blob | null>(null)\n useEffect(() => setPdfBlob(null), [documentId])\n useEffect(() => {\n if (pdf.data) setPdfBlob(pdf.data)\n }, [pdf.data])\n\n // Resolve the ambiguous .webm case once the bytes are here.\n useEffect(() => {\n if (!isWebmFile || !pdfBlob) return\n let cancelled = false\n void hasVideoTrack(pdfBlob).then((result) => {\n if (!cancelled) setWebmHasVideoTrack(result)\n })\n return () => {\n cancelled = true\n }\n }, [isWebmFile, pdfBlob, setWebmHasVideoTrack])\n\n // The stored sheet (all its sheets).\n const xlsx = useDocumentBytes(documentId, {\n version: currentVersion,\n kind: 'original',\n enabled: !isArtifact && !!documentData && isXlsx,\n })\n\n const handleDirectDownload = useCallback(async () => {\n try {\n saveFile(await fetchDocumentFile(client, documentId), documentData?.file_name || 'download')\n } catch {\n notify('Failed to download file', 'error')\n }\n }, [client, saveFile, notify, documentId, documentData?.file_name])\n\n return {\n pdfBlob,\n isPdfLoading: pdf.isLoading,\n pdfError: pdf.error,\n xlsxBlob: xlsx.data ?? null,\n xlsxError: xlsx.error,\n handleDirectDownload,\n }\n}\n","/**\n * Tabs of the document viewer: which tabs a document has, the automatic switches when the\n * document's type or parsed content changes, and switching (which ends a comparison when leaving\n * the tab that hosts it). The open tab is the session state's, so whatever opens a document can\n * open it on a tab.\n */\n\nimport { useEffect, useRef } from 'react'\nimport { Code, FileText, History, MonitorPlay } from 'lucide-react'\nimport { friendlyFileType } from '@arbidocs/react/ui'\nimport {\n AudIcon,\n DocIcon,\n EmlIcon,\n HtmlIcon,\n ImgIcon,\n PdfIcon,\n VidIcon,\n XlsIcon,\n useArbiSessionState,\n useArbiSessionStore,\n type ArbiViewerTab,\n} from '@arbidocs/react'\nimport type { ViewerTab } from '../../files/ViewerParts'\nimport { useIsPhone } from '../../lib/use-media-query'\nimport type { ViewedDocument } from './useViewedDocument'\n\n/**\n * @param hasHistory The document has earlier versions (a signed copy, a re-upload): PDF and text\n * documents then get a Versions tab too. Artifacts and Word documents always have one.\n */\nexport function useViewerTabs(doc: ViewedDocument, isCompact: boolean, hasHistory = false) {\n const {\n documentData,\n isArtifact,\n isDocx,\n isXlsx,\n isEmail,\n isVideo,\n isAudio,\n isImage,\n liveKind,\n hasParsedContent,\n isParsedDocLoading,\n } = doc\n const session = useArbiSessionStore()\n const {\n tab: activeTab,\n compareId,\n tabRequest,\n phonePdfChosen,\n } = useArbiSessionState((s) => s.documentViewer)\n const setActiveTab = (tab: ArbiViewerTab) => session.setDocumentViewer({ tab })\n // A plain-text file is still shown as a generated PDF, but the tab names the file the user\n // opened (\"Text\", as the Fields panel does), not the rendering format.\n const isTextFile = friendlyFileType(documentData?.file_type, documentData?.file_name) === 'Text'\n const isPhone = useIsPhone()\n const phoneDefaultDecidedFor = useRef<string | null>(null)\n\n // Switch to the tab that fits the document type. Only on type changes: never over the user's own\n // choice. Keyed on the document and its kind, not on the record: a refreshed record (a new\n // version finishing processing) must not send a user on the PDF tab of a Word document back to\n // the editor.\n const hasDocumentData = !!documentData\n const documentKey = documentData?.external_id\n useEffect(() => {\n // A Word artifact (an AI draft, stored as .docx) has one Word tab, 'edit', not a DOCX tab.\n if (isArtifact && (activeTab === 'pdf' || (!liveKind && activeTab === 'docx'))) {\n setActiveTab(liveKind ? 'preview' : 'edit')\n } else if (isDocx && activeTab === 'pdf') {\n setActiveTab('docx')\n } else if (!liveKind && activeTab === 'preview') {\n setActiveTab(isArtifact ? 'edit' : 'pdf')\n } else if (!isArtifact && documentData && activeTab === 'edit') {\n setActiveTab(isDocx ? 'docx' : isXlsx ? 'xlsx' : 'pdf')\n } else if (\n !isArtifact &&\n !isDocx &&\n !isXlsx &&\n documentData &&\n (activeTab === 'docx' || activeTab === 'xlsx')\n ) {\n setActiveTab('pdf')\n }\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [hasDocumentData, documentKey, isArtifact, isDocx, isXlsx, liveKind])\n\n // A tab asked for when the document was opened (a signature request opens on the PDF, where it\n // is signed) wins over the type's own tab once that document has loaded, and over the phone's\n // text default. Declared after the type switch above so it has the last word.\n useEffect(() => {\n if (!tabRequest || !documentKey || tabRequest.documentId !== documentKey) return\n phoneDefaultDecidedFor.current = documentKey\n session.setDocumentViewer({ tabRequest: null, tab: tabRequest.tab })\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [documentKey, tabRequest])\n\n // Versions of a PDF or text document exist only with history: leave the tab when there is none\n // (another document opened while it was active).\n const hasVersionsTab = isArtifact || isDocx || hasHistory\n useEffect(() => {\n if (activeTab === 'versions' && documentData && !hasVersionsTab) {\n setActiveTab(isXlsx ? 'xlsx' : 'pdf')\n }\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [activeTab, documentData, hasVersionsTab])\n\n // The text tab exists only with parsed content. When it is open without any (a recording with\n // no transcript, a failed parse), fall back to the natural default once the parsed query\n // settles. Not during a comparison, which uses the text tab. Waits for the record: until it is\n // here the parsed query has not started, so it is not loading yet.\n useEffect(() => {\n if (\n activeTab === 'html' &&\n documentData !== undefined &&\n !isParsedDocLoading &&\n !hasParsedContent &&\n !compareId\n ) {\n setActiveTab(isArtifact ? 'edit' : isDocx ? 'docx' : isXlsx ? 'xlsx' : 'pdf')\n }\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [\n activeTab,\n documentData,\n isParsedDocLoading,\n hasParsedContent,\n compareId,\n isArtifact,\n isDocx,\n isXlsx,\n ])\n\n // Phones open a document on the readable reflowed (text) view: a fit-width PDF on a 390px\n // screen is footnote-sized. Decided once per document, after the parsed query settles, and only\n // over the PDF default (Word, sheets, artifacts and media keep their own tab). A PDF the user\n // picked by hand this session wins.\n useEffect(() => {\n if (!isPhone || !documentKey || isParsedDocLoading) return\n if (phoneDefaultDecidedFor.current === documentKey) return\n phoneDefaultDecidedFor.current = documentKey\n const opensOnPdf =\n !isArtifact && !isDocx && !isXlsx && !isVideo && !isAudio && !isImage && !isEmail\n if (opensOnPdf && hasParsedContent && !compareId && !phonePdfChosen && activeTab === 'pdf') {\n setActiveTab('html')\n }\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [isPhone, documentKey, isParsedDocLoading, hasParsedContent])\n\n const handleTabChange = (tabId: string) => {\n // A comparison is shown on the text tab: leaving it ends the comparison.\n const change: Parameters<typeof session.setDocumentViewer>[0] = { tab: tabId as ArbiViewerTab }\n if (tabId !== 'html' && compareId) change.compareId = null\n // A phone user who goes back to the PDF wants it: stop opening documents on the text view\n // until they pick it again.\n if (isPhone && (tabId === 'pdf' || tabId === 'html')) change.phonePdfChosen = tabId === 'pdf'\n session.setDocumentViewer(change)\n }\n\n const mediaTab = isVideo\n ? { icon: <VidIcon size={20} />, tooltip: 'Video' }\n : isAudio\n ? { icon: <AudIcon size={20} />, tooltip: 'Audio' }\n : isImage\n ? { icon: <ImgIcon size={20} />, tooltip: 'Image' }\n : isEmail\n ? { icon: <EmlIcon size={20} />, tooltip: 'Email' }\n : isTextFile\n ? { icon: <FileText className=\"size-5\" />, tooltip: 'Text' }\n : documentData\n ? { icon: <PdfIcon size={20} />, tooltip: 'PDF' }\n : // The file type is unknown until the record loads: name no guess (a text file\n // would flip from PDF to Text once it arrives).\n { icon: <FileText className=\"size-5\" />, tooltip: 'Document' }\n // Tabs say what they are: in a narrow panel or on a phone only the open tab keeps its name, plus\n // the text view, whose icon is not recognisable. Labelling every tab there would crowd the header.\n const tabLabel = (id: string, label: string) =>\n !isCompact || activeTab === id || id === 'html' ? label : undefined\n\n const versionsTab: ViewerTab = {\n id: 'versions',\n icon: <History className=\"size-5\" />,\n tooltip: 'Versions',\n label: tabLabel('versions', 'Versions'),\n }\n const viewerTabs: ViewerTab[] = [\n ...(isArtifact\n ? [\n ...(liveKind\n ? [\n {\n id: 'preview',\n icon: <MonitorPlay className=\"size-5\" />,\n tooltip: 'Preview',\n label: tabLabel('preview', 'Preview'),\n },\n ]\n : []),\n {\n id: 'edit',\n icon: liveKind ? <Code className=\"size-5\" /> : <FileText className=\"size-5\" />,\n tooltip: liveKind ? 'Code' : 'Editor',\n label: tabLabel('edit', liveKind ? 'Code' : 'Document'),\n },\n versionsTab,\n ]\n : [\n ...(isDocx\n ? [\n {\n id: 'docx',\n icon: <DocIcon size={20} />,\n tooltip: 'DOCX (with track changes & comments)',\n label: tabLabel('docx', 'DOCX'),\n },\n ]\n : []),\n ...(isXlsx\n ? [\n {\n id: 'xlsx',\n icon: <XlsIcon size={20} />,\n tooltip: 'Spreadsheet',\n label: tabLabel('xlsx', 'Sheet'),\n },\n ]\n : []),\n { id: 'pdf', ...mediaTab, label: tabLabel('pdf', mediaTab.tooltip) },\n ...(hasVersionsTab ? [versionsTab] : []),\n ]),\n ...((hasParsedContent || compareId) && !liveKind\n ? [\n {\n id: 'html',\n icon: compareId ? <FileText className=\"size-5\" /> : <HtmlIcon size={20} />,\n tooltip: compareId ? 'Word redline' : 'HTML',\n label: tabLabel('html', compareId ? 'Compare' : 'HTML'),\n },\n ]\n : []),\n ]\n\n return { activeTab, handleTabChange, viewerTabs }\n}\n","/**\n * A document's versions (oldest first; every row's `id` is a version reference) and its\n * translations (each its own document, made from one of its versions). A listed document carries\n * its versions, so it costs no request; one that is not in the workspace list asks for them.\n */\n\nimport { useMemo } from 'react'\nimport { useDocumentVersionList } from '@arbidocs/react'\nimport {\n documentVersions,\n parseVersionRef,\n toArtifactVersions,\n type ArtifactVersion,\n} from '@arbidocs/react/artifacts'\nimport type { TranslationEntry } from '../../artifacts/VersionTimeline'\nimport { useConnectedDocuments } from '../workspaceData'\n\nexport function useViewerVersions(docId: string | null | undefined): {\n versions: ArtifactVersion[]\n translations: TranslationEntry[]\n} {\n const plainId = docId ? parseVersionRef(docId).docId : ''\n const { data: documents } = useConnectedDocuments()\n const listed = useMemo(\n () => (plainId ? documents.find((d) => d.external_id === plainId) : undefined),\n [documents, plainId]\n )\n const { data: history } = useDocumentVersionList(plainId, { enabled: !!plainId && !listed })\n const versions = useMemo(\n () => (listed ? documentVersions(listed) : toArtifactVersions(plainId || null, history)),\n [listed, history, plainId]\n )\n // A translation is its own document (with its own versions), never a version of the source, so\n // opening the source always opens the source.\n const translations = useMemo<TranslationEntry[]>(() => {\n if (!plainId) return []\n return documents\n .flatMap((doc) => {\n const link = doc.derived_from?.find(\n (d) => d.role === 'translation' && d.doc_ext_id === plainId\n )\n return link\n ? [\n {\n id: doc.external_id,\n name: doc.doc_metadata?.title || doc.file_name || doc.external_id,\n createdAt: doc.created_at,\n sourceVersion: link.version ?? null,\n final: !!doc.derived_from?.some((d) => d.role === 'final'),\n },\n ]\n : []\n })\n .sort((a, b) => a.createdAt.localeCompare(b.createdAt))\n }, [documents, plainId])\n return { versions, translations }\n}\n","import type { components } from '@arbidocs/client'\n\ntype ScopedTag = Pick<\n components['schemas']['TagResponse'],\n 'kind' | 'doctag_count' | 'facttag_count'\n>\n\n/**\n * A tag of the documents' vocabulary: not a saved search, and used on documents or not used\n * anywhere yet (a tag used only on facts belongs to the facts').\n */\nexport function isDocumentTag(tag: ScopedTag): boolean {\n if (tag.kind === 'search') return false\n const onDocs = (tag.doctag_count ?? 0) > 0\n const onFacts = (tag.facttag_count ?? 0) > 0\n return onDocs || !onFacts\n}\n","/**\n * Hook for managing chunk-level tagging\n *\n * Provides utilities for applying/removing tags to specific chunks\n * within a document, and determining which tags apply to a chunk.\n *\n * Citations format: CitedDocument[] — a doc-first, best-first list of the\n * documents (each with its cited chunks) backing the doctag's note. A doctag\n * is grounded in passages, so a document that loses its last chunk drops out,\n * and the doctag itself becomes ungrounded (null) once no documents remain.\n */\n\nimport { useCallback } from 'react'\nimport type { components } from '@arbidocs/client'\nimport { useAssignDocTags, useRemoveDocTags, useUpdateDocTag } from '@arbidocs/react'\n\ntype CitationSources = components['schemas']['CitationSources']\ntype DocTag = components['schemas']['DocTagResponse']\ntype Tag = Pick<components['schemas']['TagResponse'], 'external_id'>\n\ntype Citations = CitationSources | null | undefined\n\ninterface UseChunkTaggingProps {\n documentId: string\n documentDoctags: DocTag[]\n}\n\ninterface ChunkTagState {\n /** Tags that are applied to this specific chunk */\n appliedTags: DocTag[]\n /** Check if a specific tag is applied to this chunk */\n isTagApplied: (tagExtId: string) => boolean\n /** Get the doctag for a specific tag if it applies to this chunk */\n getDoctagForChunk: (tagExtId: string) => DocTag | undefined\n}\n\n/** Whether this chunk is among the passages backing the doctag. */\nfunction hasChunkInCitations(citations: Citations, chunkExtId: string): boolean {\n return (citations ?? []).some((d) => d.chunks?.some((c) => c.chunk_id === chunkExtId))\n}\n\n/** Every passage backing the doctag, document order then chunk order. */\nexport function getAllChunkIdsFromCitations(citations: Citations): string[] {\n return (citations ?? []).flatMap((d) => (d.chunks ?? []).map((c) => c.chunk_id))\n}\n\n/**\n * Drop a passage. A doctag is grounded in passages, not whole documents, so a\n * document that loses its last passage goes too; null once none remain, so an\n * emptied doctag is ungrounded rather than grounded-in-nothing.\n */\nexport function removeChunkFromCitations(citations: Citations, chunkExtId: string): Citations {\n if (!citations) return null\n const next = citations\n .map((d) => ({ ...d, chunks: (d.chunks ?? []).filter((c) => c.chunk_id !== chunkExtId) }))\n .filter((d) => d.chunks.length > 0)\n return next.length ? next : null\n}\n\n/** Add a passage under its document, ignoring duplicates. Order is the ranking. */\nexport function addChunkToCitations(\n citations: Citations,\n documentId: string,\n chunkExtId: string\n): CitationSources {\n // Hand-added passages carry no page: the viewer knows the chunk id, and the\n // page is resolved from it at render time.\n const chunk = { chunk_id: chunkExtId, page: null }\n const list = citations ?? []\n const idx = list.findIndex((d) => d.doc_ext_id === documentId)\n if (idx === -1) return [...list, { doc_ext_id: documentId, chunks: [chunk] }]\n const doc = list[idx]\n if ((doc.chunks ?? []).some((c) => c.chunk_id === chunkExtId)) return list\n const next = [...list]\n next[idx] = { ...doc, chunks: [...(doc.chunks ?? []), chunk] }\n return next\n}\n\nexport function useChunkTagging({ documentId, documentDoctags }: UseChunkTaggingProps) {\n const createDocTag = useAssignDocTags()\n const updateDocTag = useUpdateDocTag()\n const deleteDocTag = useRemoveDocTags()\n\n /**\n * Get the tagging state for a specific chunk\n */\n const getChunkTagState = useCallback(\n (chunkExtId: string): ChunkTagState => {\n // Find doctags that apply to this specific chunk (check citations)\n const appliedTags = documentDoctags.filter((dt) =>\n hasChunkInCitations(dt.citations, chunkExtId)\n )\n\n const isTagApplied = (tagExtId: string): boolean => {\n return appliedTags.some((dt) => dt.tag_ext_id === tagExtId)\n }\n\n const getDoctagForChunk = (tagExtId: string): DocTag | undefined => {\n return appliedTags.find((dt) => dt.tag_ext_id === tagExtId)\n }\n\n return {\n appliedTags,\n isTagApplied,\n getDoctagForChunk,\n }\n },\n [documentDoctags]\n )\n\n /**\n * Toggle a tag on/off for a specific chunk\n */\n const toggleChunkTag = useCallback(\n async (chunkExtId: string, tag: Tag, note?: string): Promise<void> => {\n const existingDoctag = documentDoctags.find((dt) => dt.tag_ext_id === tag.external_id)\n const isChunkTagged = hasChunkInCitations(existingDoctag?.citations, chunkExtId)\n\n if (isChunkTagged) {\n // Remove chunk from this doctag's citations\n const updatedCitations = removeChunkFromCitations(existingDoctag!.citations, chunkExtId)\n\n if (!updatedCitations) {\n // No citations remain - delete the entire doctag\n await deleteDocTag.mutateAsync({\n tagId: tag.external_id,\n docIds: [documentId],\n })\n } else {\n // Update doctag with remaining citations\n await updateDocTag.mutateAsync({\n tagId: tag.external_id,\n docId: documentId,\n citations: updatedCitations,\n note: existingDoctag!.note,\n })\n }\n } else {\n // Add chunk to tag\n if (existingDoctag) {\n // Doctag exists - add this chunk to citations\n const updatedCitations = addChunkToCitations(\n existingDoctag.citations,\n documentId,\n chunkExtId\n )\n await updateDocTag.mutateAsync({\n tagId: tag.external_id,\n docId: documentId,\n citations: updatedCitations,\n note: note ?? existingDoctag.note,\n })\n } else {\n // Create new doctag with this chunk\n const newCitations = addChunkToCitations(null, documentId, chunkExtId)\n await createDocTag.mutateAsync({\n tagId: tag.external_id,\n docIds: [documentId],\n citations: newCitations,\n note: note,\n })\n }\n }\n },\n [documentId, documentDoctags, createDocTag, updateDocTag, deleteDocTag]\n )\n\n /**\n * Update the note for a chunk tag\n */\n const updateChunkTagNote = useCallback(\n async (_chunkExtId: string, tag: Tag, note: string | null): Promise<void> => {\n const existingDoctag = documentDoctags.find((dt) => dt.tag_ext_id === tag.external_id)\n if (!existingDoctag) return\n\n await updateDocTag.mutateAsync({\n tagId: tag.external_id,\n docId: documentId,\n citations: existingDoctag.citations,\n note: note,\n })\n },\n [documentId, documentDoctags, updateDocTag]\n )\n\n /**\n * Get all unique tag external IDs applied to a chunk (for accent bar display)\n */\n const getChunkTagColors = useCallback(\n (chunkExtId: string, workspaceTags: Tag[]): string[] => {\n const { appliedTags } = getChunkTagState(chunkExtId)\n return appliedTags\n .map((dt) => {\n const tag = workspaceTags.find((t) => t.external_id === dt.tag_ext_id)\n return tag?.external_id\n })\n .filter((id): id is string => !!id)\n },\n [getChunkTagState]\n )\n\n const isLoading = createDocTag.isPending || updateDocTag.isPending || deleteDocTag.isPending\n\n return {\n getChunkTagState,\n toggleChunkTag,\n updateChunkTagNote,\n getChunkTagColors,\n isLoading,\n }\n}\n","/**\n * The passage tagging panel: the `TagPassagePanel` block bound to the passage's labels and fields\n * (apply, remove, a note per passage).\n */\n\nimport { useState, useMemo, useCallback } from 'react'\nimport type { components } from '@arbidocs/client'\nimport { TagEntity, getEntityColor } from '@arbidocs/react/ui'\nimport { TagPassagePanel, type PassageTagGroupView } from '../../../files/TagPassagePanel'\nimport { useConnectedTags, type ConnectedTag } from '../../workspaceData'\nimport { useDocumentViewerSupport } from '../support'\nimport { isDocumentTag } from './document-tags'\nimport { useChunkTagging } from './useChunkTagging'\n\ntype DocTag = components['schemas']['DocTagResponse']\ntype Tag = ConnectedTag\n\n/** The panel's group headings, by format: labels, then the fields' value types. */\nconst GROUP_TITLES: Record<string, string> = {\n checkbox: 'Label',\n select: 'Choice',\n text: 'Text',\n number: 'Number',\n}\n\ninterface PassageTagPanelProps {\n documentId: string\n chunkExtId: string\n chunkContent: string\n pageNumber?: number\n documentDoctags: DocTag[]\n onClose: () => void\n /** Called when a tag is selected to show all chunks with that tag */\n onViewTaggedChunks?: (tagExtId: string) => void\n}\n\nexport function PassageTagPanel({\n documentId,\n chunkExtId,\n chunkContent,\n pageNumber,\n documentDoctags,\n onClose,\n onViewTaggedChunks,\n}: PassageTagPanelProps) {\n const { createTag } = useDocumentViewerSupport()\n\n // Track which tag's note is being edited\n const [editingNoteTagId, setEditingNoteTagId] = useState<string | null>(null)\n const [noteValue, setNoteValue] = useState('')\n\n // Get workspace tags (filtered to exclude search tags)\n const { data: allTags } = useConnectedTags()\n const workspaceTags = useMemo(() => allTags.filter(isDocumentTag), [allTags])\n\n // Chunk tagging utilities\n const { getChunkTagState, toggleChunkTag, updateChunkTagNote, isLoading } = useChunkTagging({\n documentId,\n documentDoctags,\n })\n\n const chunkState = useMemo(() => getChunkTagState(chunkExtId), [getChunkTagState, chunkExtId])\n\n // Group tags by type for organized display\n const groupedTags = useMemo(() => {\n const groups: Record<string, Tag[]> = {\n checkbox: [],\n select: [],\n text: [],\n number: [],\n }\n\n workspaceTags.forEach((tag) => {\n // Labels (and issues) under `checkbox`; annotations by their format.\n const group =\n tag.kind === 'label' ? 'checkbox' : tag.kind === 'annotation' ? tag.tag_type.type : null\n if (group && groups[group]) {\n groups[group].push(tag)\n }\n })\n\n return groups\n }, [workspaceTags])\n\n const handleToggleTag = useCallback(\n async (tag: Tag) => {\n try {\n await toggleChunkTag(chunkExtId, tag)\n } catch (error) {\n console.error('Failed to toggle chunk tag:', error)\n }\n },\n [chunkExtId, toggleChunkTag]\n )\n\n const handleStartEditNote = useCallback(\n (tagExtId: string) => {\n const doctag = chunkState.getDoctagForChunk(tagExtId)\n setNoteValue(doctag?.note || '')\n setEditingNoteTagId(tagExtId)\n },\n [chunkState]\n )\n\n const handleSaveNote = useCallback(\n async (tag: Tag) => {\n try {\n await updateChunkTagNote(chunkExtId, tag, noteValue || null)\n } catch (error) {\n console.error('Failed to save note:', error)\n }\n setEditingNoteTagId(null)\n setNoteValue('')\n },\n [chunkExtId, noteValue, updateChunkTagNote]\n )\n\n const preview = useMemo(() => {\n const maxLength = 200\n if (chunkContent.length <= maxLength) return chunkContent\n return chunkContent.slice(0, maxLength) + '...'\n }, [chunkContent])\n\n const groups = useMemo<PassageTagGroupView[]>(\n () =>\n Object.entries(groupedTags)\n .filter(([, tags]) => tags.length > 0)\n .map(([type, tags]) => ({\n id: type,\n title: GROUP_TITLES[type] ?? type,\n tags: tags.map((tag) => ({\n id: tag.external_id,\n color: getEntityColor(tag.external_id, 'medium'),\n isApplied: chunkState.isTagApplied(tag.external_id),\n note: chunkState.getDoctagForChunk(tag.external_id)?.note,\n badge: <TagEntity tag={tag} size=\"sm\" showTooltip={false} />,\n })),\n })),\n [groupedTags, chunkState]\n )\n const tagById = useMemo(\n () => new Map(workspaceTags.map((tag) => [tag.external_id, tag])),\n [workspaceTags]\n )\n\n return (\n <TagPassagePanel\n pageNumber={pageNumber}\n preview={preview}\n groups={groups}\n isEmpty={workspaceTags.length === 0}\n isBusy={isLoading}\n editingNoteTagId={editingNoteTagId}\n noteValue={noteValue}\n onNoteChange={setNoteValue}\n onToggle={(id) => {\n const tag = tagById.get(id)\n if (tag) void handleToggleTag(tag)\n }}\n onViewTagged={onViewTaggedChunks}\n onStartNote={handleStartEditNote}\n onSaveNote={(id) => {\n const tag = tagById.get(id)\n if (tag) void handleSaveNote(tag)\n }}\n onCancelNote={() => {\n setEditingNoteTagId(null)\n setNoteValue('')\n }}\n onCreate={createTag}\n onClose={onClose}\n />\n )\n}\n","/**\n * ParsedPassage: binds one parsed chunk to the `HtmlPassage` block (markdown body, citation\n * entity pills, copy/link/label/navigator actions). Memoized so selecting one passage does not\n * re-parse the markdown of the others. The body is the conversation's markdown (`ConnectedMarkdown`),\n * so a passage's links and bookmarks are the same quiet marks as an answer's, with their menu.\n */\n\nimport { memo } from 'react'\nimport type { MarkMenuItem } from '@arbidocs/react/ui'\nimport type { ProcessedChunk } from '@arbidocs/react/viewers'\nimport { LabelMark, NoteMark, PassageMark } from '../../../citations/QuietMarks'\nimport { HtmlPassage } from '../../../files'\nimport { ConnectedMarkdown } from '../../conversation/ConnectedMarkdown'\nimport type { PassageLabel } from './useDocumentLabels'\n\nexport interface ParsedPassageProps {\n chunk: ProcessedChunk\n pageNumber: number | null\n isHighlighted: boolean\n isSelected: boolean\n /** One of a fact's cited passages, listed in an open Citation popover. */\n isCitationHighlight: boolean\n /** The cited passage currently being read from the Citation popover. */\n isActiveCitation: boolean\n /** A fact's Citation popover drives the highlights; its shades win over the selection fill. */\n factCitationActive: boolean\n isCitationMode: boolean\n runIsStart: boolean\n runIsEnd: boolean\n /** Last passage index of the run; set only on the run's first member. */\n runEndIndex: number | undefined\n onChunkClick: ((chunkId: string, extendFromAnchor: boolean) => void) | undefined\n formatChunkWithCitation: (\n content: string,\n pageNumber: number | undefined,\n chunkExtId: string | undefined\n ) => string\n getPassageDeepLink: (chunkExtId: string | undefined) => string | null\n copyToClipboard: (\n text: string,\n metadata: {\n type: 'passage' | 'link'\n documentTitle: string\n pageNumber: number | undefined\n passageIndex: number | undefined\n passageContent: string\n href?: string\n }\n ) => void\n /** Open the document's passages in the host's navigator. Absent: not offered. */\n onOpenNavigator: (() => void) | undefined\n /** Labels applied to this passage. */\n labels: PassageLabel[]\n /** The label currently being walked, when it marks this passage. */\n activeTagColor: string | undefined\n /** Open the tagging panel for this passage. */\n onTagPassage: ((chunkExtId: string) => void) | undefined\n /** Walk a label's passages (the label mark's Show row). */\n onShowLabel: ((tagExtId: string) => void) | undefined\n /** Take a label off this passage (the label mark's Remove row). */\n onRemoveLabel: ((chunkExtId: string, tagExtId: string) => void) | undefined\n}\n\nexport const ParsedPassage = memo(function ParsedPassage({\n chunk,\n pageNumber,\n isHighlighted,\n isSelected,\n isCitationHighlight,\n isActiveCitation,\n factCitationActive,\n isCitationMode,\n runIsStart,\n runIsEnd,\n runEndIndex,\n labels,\n activeTagColor,\n onTagPassage,\n onShowLabel,\n onRemoveLabel,\n onChunkClick,\n formatChunkWithCitation,\n getPassageDeepLink,\n copyToClipboard,\n onOpenNavigator,\n}: ParsedPassageProps) {\n const chunkId = chunk.chunkExtId\n const formattedContent = chunkId\n ? formatChunkWithCitation(chunk.content, pageNumber || undefined, chunkId)\n : ''\n\n // While a fact's Citation popover drives the view, its cited set (light) and the passage being\n // read (strong) take precedence over the citation-mode selection.\n const isStrong = isActiveCitation || (!factCitationActive && isSelected)\n const isLight = isCitationHighlight || (!factCitationActive && isHighlighted)\n\n // One label per run, on its first member: \"¶4\" or \"¶4-9\".\n const ownIndex = chunk.chunkIndex !== undefined ? chunk.chunkIndex + 1 : undefined\n const runLabel =\n runEndIndex !== undefined && ownIndex !== undefined && runEndIndex > ownIndex\n ? `¶${ownIndex}–${runEndIndex}`\n : `¶${ownIndex ?? ''}`\n const showLabel = !!chunkId && (!isSelected || runIsStart)\n\n const copyPassage = (type: 'passage' | 'link', text: string, href?: string) =>\n copyToClipboard(text, {\n type,\n documentTitle: chunk.docTitle || 'Document',\n pageNumber: pageNumber || undefined,\n passageIndex: chunk.chunkIndex,\n passageContent: formattedContent,\n href,\n })\n\n // ONE menu for the passage: every action that used to be a button in a column beside it.\n const passageItems: MarkMenuItem[] = chunkId\n ? [\n {\n id: 'copy-passage',\n label: 'Copy passage with citation',\n primary: true,\n testId: 'passage-copy',\n onSelect: () =>\n copyPassage('passage', formattedContent, getPassageDeepLink(chunkId) || undefined),\n },\n {\n id: 'copy-link',\n label: 'Copy passage link',\n testId: 'passage-copy-link',\n onSelect: () => {\n const link = getPassageDeepLink(chunkId)\n if (link) copyPassage('link', link, link)\n },\n },\n ...(onTagPassage\n ? [\n {\n id: 'label',\n label: 'Label this passage',\n testId: 'passage-label',\n onSelect: () => onTagPassage(chunkId),\n },\n ]\n : []),\n ...(onOpenNavigator\n ? [\n {\n id: 'navigator',\n label: 'Open in navigator',\n testId: 'passage-navigator',\n onSelect: onOpenNavigator,\n },\n ]\n : []),\n ]\n : []\n\n const labelItems: MarkMenuItem[] = chunkId\n ? labels.flatMap((l, i) => {\n const suffix = labels.length > 1 ? ` “${l.name}”` : ' label'\n return [\n ...(onShowLabel\n ? [\n {\n id: `show-${l.tagExtId}`,\n label: `Show${suffix}`,\n primary: i === 0,\n testId: 'label-show',\n onSelect: () => onShowLabel(l.tagExtId),\n },\n ]\n : []),\n ...(onRemoveLabel\n ? [\n {\n id: `remove-${l.tagExtId}`,\n label: `Remove${suffix}`,\n destructive: true,\n testId: 'label-remove',\n onSelect: () => onRemoveLabel(chunkId, l.tagExtId),\n },\n ]\n : []),\n ]\n })\n : []\n\n return (\n <HtmlPassage\n chunkId={chunkId}\n highlight={isStrong ? 'strong' : isLight ? 'light' : undefined}\n isHit={isHighlighted}\n isSelected={isSelected}\n runIsStart={runIsStart}\n runIsEnd={runIsEnd}\n isClickable={isCitationMode}\n onSelect={onChunkClick && chunkId ? (extend) => onChunkClick(chunkId, extend) : undefined}\n isTagged={labels.length > 0}\n activeTagColor={activeTagColor}\n tagMark={\n labels.length > 0 ? (\n <LabelMark\n colors={labels.map((l) => l.color)}\n name={`Labels: ${labels.map((l) => l.name).join(', ')}`}\n menuLabel=\"Label actions\"\n testId={`passage-tag-dots-${chunkId}`}\n preview={\n <span className=\"block font-medium\">{labels.map((l) => l.name).join(', ')}</span>\n }\n items={labelItems}\n />\n ) : undefined\n }\n runMarker={\n isSelected && runIsStart ? (\n <NoteMark\n label={runLabel}\n title=\"Cited by this note — click a passage to add, shift-click for a range\"\n testId={`note-marker-${chunkId}`}\n />\n ) : undefined\n }\n mark={\n showLabel && chunkId ? (\n <PassageMark\n label={runLabel}\n menuLabel=\"Passage actions\"\n testId={`passage-mark-${chunkId}`}\n items={passageItems}\n />\n ) : undefined\n }\n >\n <ConnectedMarkdown>{chunk.content}</ConnectedMarkdown>\n </HtmlPassage>\n )\n})\n","/**\n * Utility functions for formatting citations\n */\n\ninterface ChunkCopyData {\n content: string\n documentTitle?: string\n documentDate?: string\n pageNumber?: number\n chunkId?: string\n}\n\n/**\n * Formats a citation in basic academic format\n * @param data - The chunk and document data\n * @returns Formatted citation string\n */\nexport function formatCitation(data: ChunkCopyData): string {\n const { documentTitle, documentDate, pageNumber } = data\n\n let citation = ''\n\n if (documentTitle) {\n citation += `${documentTitle}`\n }\n\n if (documentDate) {\n citation += documentTitle ? `, ${documentDate}` : documentDate\n }\n\n if (pageNumber) {\n citation += citation ? `, p. ${pageNumber}` : `p. ${pageNumber}`\n }\n\n return citation\n}\n","/**\n * Passage Copy Hook\n *\n * Handles citation formatting and clipboard operations for document passages.\n */\n\nimport React, { useCallback } from 'react'\nimport { HtmlIcon } from '@arbidocs/react'\nimport { buildDeepLinkUrl } from '../../../lib/deep-link'\nimport { PassagePill } from '../../../citations/PassagePill'\nimport { useBlocksEnvironment } from '../../../provider/environment'\nimport type { ViewerDocumentRecord } from '../support'\nimport { formatCitation } from './citation-line'\n\ninterface PassageInfo {\n type: 'link' | 'passage'\n documentTitle: string\n pageNumber?: number\n passageIndex?: number\n passageContent: string\n href?: string\n}\n\ninterface UsePassageCopyProps {\n documentId: string\n documentData: ViewerDocumentRecord | null | undefined\n selectedWorkspaceId: string | null\n}\n\nexport function usePassageCopy({\n documentId,\n documentData,\n selectedWorkspaceId,\n}: UsePassageCopyProps) {\n const { notify, runtimeConfig } = useBlocksEnvironment()\n const deploymentDomain = runtimeConfig.deploymentDomain\n /**\n * Format chunk content with citation and deep link\n */\n const formatChunkWithCitation = useCallback(\n (chunkContent: string, pageNumber?: number, chunkExtId?: string) => {\n const docDate = documentData?.doc_metadata?.doc_date\n const citation = formatCitation({\n content: chunkContent,\n documentTitle: documentData?.doc_metadata?.title || documentData?.file_name || '',\n documentDate: docDate ? new Date(docDate).toISOString().split('T')[0] : undefined,\n pageNumber,\n })\n\n // Build deep link URL\n const deepLinkUrl =\n selectedWorkspaceId && documentId && chunkExtId\n ? buildDeepLinkUrl(\n { workspaceId: selectedWorkspaceId, documentId, chunkId: chunkExtId },\n deploymentDomain\n )\n : ''\n\n let result = `\"${chunkContent.trim()}\"`\n if (citation) {\n result += `\\n\\n— ${citation}`\n }\n if (deepLinkUrl) {\n result += `\\n[ARBI Docs link](${deepLinkUrl})`\n }\n return result\n },\n [documentData, selectedWorkspaceId, documentId, deploymentDomain]\n )\n\n /**\n * Get the passage deep link URL\n */\n const getPassageDeepLink = useCallback(\n (chunkExtId?: string) => {\n if (!selectedWorkspaceId || !documentId || !chunkExtId) {\n return ''\n }\n return buildDeepLinkUrl(\n { workspaceId: selectedWorkspaceId, documentId, chunkId: chunkExtId },\n deploymentDomain\n )\n },\n [selectedWorkspaceId, documentId, deploymentDomain]\n )\n\n /**\n * Copy text to clipboard with dual format (HTML + plain text)\n */\n const copyToClipboard = useCallback(\n async (text: string, passageInfo?: PassageInfo) => {\n try {\n if (passageInfo?.href) {\n const isLink = passageInfo.type === 'link'\n const { documentTitle, pageNumber, passageIndex, href } = passageInfo\n\n // Build citation text: \"Document Title, p.X(Y)\"\n const pageNotation = pageNumber ? `p.${pageNumber}` : ''\n const passageNotation = passageIndex !== undefined ? `(${passageIndex})` : ''\n const citation = `${documentTitle}${pageNotation ? `, ${pageNotation}${passageNotation}` : ''}`\n\n let html: string\n let plainText: string\n\n if (isLink) {\n // Link only: clickable link\n html = `<a href=\"${href}\" target=\"_blank\" rel=\"noopener noreferrer\">${citation}</a>`\n plainText = href\n } else {\n // Passage: link first, then content\n const linkHtml = `<p><a href=\"${href}\" target=\"_blank\" rel=\"noopener noreferrer\">${citation}</a></p>`\n html = `${linkHtml}<blockquote style=\"margin: 8px 0; padding-left: 12px; border-left: 3px solid #ccc;\">${text}</blockquote>`\n plainText = `${href}\\n\\n${text}\\n\\n— ${citation}`\n }\n\n const clipboardItem = new ClipboardItem({\n 'text/html': new Blob([html], { type: 'text/html' }),\n 'text/plain': new Blob([plainText], { type: 'text/plain' }),\n })\n\n await navigator.clipboard.write([clipboardItem])\n\n // Show notification\n const prefix = isLink ? 'Link copied:' : 'Passage copied:'\n const notificationElement = React.createElement(\n 'span',\n { className: 'inline-flex items-center gap-2' },\n prefix,\n React.createElement(PassagePill, {\n icon: React.createElement(HtmlIcon, { size: 16, className: 'flex-shrink-0' }),\n documentTitle: passageInfo.documentTitle,\n pageNumber: passageInfo.pageNumber,\n passageIndex: passageInfo.passageIndex,\n href: passageInfo.href,\n onClick: (e: React.MouseEvent) => e.stopPropagation(),\n })\n )\n\n notify(notificationElement, 'success', {\n workspaceId: selectedWorkspaceId || undefined,\n // The bell entry deep-links back to the copied passage.\n href: passageInfo.href,\n })\n } else {\n // Fallback: plain text only\n await navigator.clipboard.writeText(text)\n notify('Copied to clipboard', 'success')\n }\n } catch (err) {\n console.error('Clipboard copy failed:', err)\n notify('Failed to copy to clipboard.', 'error')\n }\n },\n [selectedWorkspaceId, notify]\n )\n\n return {\n formatChunkWithCitation,\n getPassageDeepLink,\n copyToClipboard,\n }\n}\n","/**\n * Labels (doctags) on the parsed document: summaries, per-passage colours, the label being\n * walked, and the passage being labelled. A doctag is anchored to the document, so its passages\n * come with the document itself; no reverse lookup.\n */\n\nimport { useCallback, useEffect, useMemo, useState } from 'react'\nimport type { components } from '@arbidocs/client'\nimport { getEntityColor } from '@arbidocs/react/ui'\nimport { isDocumentLabel, summariseDocTags } from '../../../files/doc-labels'\nimport { useConnectedTags, type ConnectedTag } from '../../workspaceData'\nimport { isDocumentTag } from './document-tags'\nimport { useChunkTagging } from './useChunkTagging'\n\ntype DocTag = components['schemas']['DocTagResponse']\n\n/** One label marking a passage. */\nexport interface PassageLabel {\n tagExtId: string\n name: string\n color: string\n}\n\nexport function useDocumentLabels(\n documentId: string,\n doctags: DocTag[] | undefined,\n orderedChunkIds: string[]\n) {\n const { data: allTags } = useConnectedTags()\n const workspaceTags = useMemo<ConnectedTag[]>(() => allTags.filter(isDocumentTag), [allTags])\n const documentDoctags = useMemo<DocTag[]>(() => doctags ?? [], [doctags])\n const tagSummaries = useMemo(\n () => summariseDocTags(documentDoctags, workspaceTags),\n [documentDoctags, workspaceTags]\n )\n // The chip bar carries labels only; annotations are per-document answers, not filters.\n const labelSummaries = useMemo(\n () => summariseDocTags(documentDoctags, workspaceTags.filter(isDocumentLabel)),\n [documentDoctags, workspaceTags]\n )\n\n /** chunk id -> every label marking it (name + colour). */\n const labelsByChunk = useMemo(() => {\n const map = new Map<string, PassageLabel[]>()\n for (const s of tagSummaries) {\n const label = {\n tagExtId: s.tagExtId,\n name: s.name,\n color: getEntityColor(s.tagExtId, 'medium'),\n }\n for (const id of s.chunkIds) {\n const list = map.get(id)\n if (list) list.push(label)\n else map.set(id, [label])\n }\n }\n return map\n }, [tagSummaries])\n\n const { toggleChunkTag } = useChunkTagging({ documentId, documentDoctags })\n /** Take one label off one passage (the label mark's Remove row). */\n const removeLabel = useCallback(\n async (chunkExtId: string, tagExtId: string) => {\n const tag = workspaceTags.find((t) => t.external_id === tagExtId)\n if (!tag) return\n try {\n await toggleChunkTag(chunkExtId, tag)\n } catch (error) {\n console.error('Failed to remove passage label', error)\n }\n },\n [workspaceTags, toggleChunkTag]\n )\n\n // One label at a time: two washes on one paragraph say nothing.\n const [activeTagExtId, setActiveTagExtId] = useState<string | null>(null)\n const [tagCursor, setTagCursor] = useState(0)\n /** The passage being labelled; opens the tagging panel. */\n const [taggingChunkId, setTaggingChunkId] = useState<string | null>(null)\n\n const activeTagSummary = tagSummaries.find((t) => t.tagExtId === activeTagExtId)\n const activeTagColor = activeTagExtId ? getEntityColor(activeTagExtId, 'medium') : undefined\n const activeChunkIds = useMemo(\n () => new Set(activeTagSummary?.chunkIds ?? []),\n [activeTagSummary]\n )\n\n /** Walk the active label's passages in document order, not citation order. */\n const orderedActiveIds = useMemo(\n () => orderedChunkIds.filter((id) => activeChunkIds.has(id)),\n [orderedChunkIds, activeChunkIds]\n )\n const gotoTagged = useCallback(\n (delta: number) => {\n if (orderedActiveIds.length === 0) return\n const next = (tagCursor + delta + orderedActiveIds.length) % orderedActiveIds.length\n setTagCursor(next)\n document\n .getElementById(orderedActiveIds[next])\n ?.scrollIntoView({ behavior: 'smooth', block: 'center' })\n },\n [tagCursor, orderedActiveIds]\n )\n const selectTag = useCallback((tagExtId: string | null) => {\n setActiveTagExtId(tagExtId)\n setTagCursor(0)\n }, [])\n // Selecting a label jumps to its first passage, or the highlight may be off-screen.\n useEffect(() => {\n if (!activeTagExtId || orderedActiveIds.length === 0) return\n document\n .getElementById(orderedActiveIds[0])\n ?.scrollIntoView({ behavior: 'smooth', block: 'center' })\n // Only when the label changes, not as the cursor moves.\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [activeTagExtId])\n\n return {\n documentDoctags,\n labelSummaries,\n labelsByChunk,\n removeLabel,\n activeTagExtId,\n activeTagColor,\n activeChunkIds,\n tagCursor,\n gotoTagged,\n selectTag,\n taggingChunkId,\n setTaggingChunkId,\n }\n}\n","/**\n * Passage selection for citations in the parsed viewer: drag-to-select, click / shift-click\n * ranges, contiguous runs, the cited-run stepper, and the fact-citation highlight set.\n */\n\nimport { useCallback, useEffect, useMemo, useRef, useState } from 'react'\nimport type { RefObject } from 'react'\nimport { useArbiSessionState } from '@arbidocs/react'\nimport { computeSelectionRuns } from '@arbidocs/react/viewers'\nimport type { ProcessedPage } from '@arbidocs/react/viewers'\nimport { useViewerPassageCitation } from '../support'\n\nconst NONE: readonly string[] = []\nconst noop = () => {}\n\ninterface Options {\n documentId: string\n containerRef: RefObject<HTMLDivElement | null>\n processedChunks: ProcessedPage[]\n orderedChunkIds: string[]\n pageOf: (id: string) => number | undefined\n}\n\nexport function useCitationSelection({\n documentId,\n containerRef,\n processedChunks,\n orderedChunkIds,\n pageOf,\n}: Options) {\n // A citation being edited (a fact's, a field's) picks its passages here, through the host.\n const passageCitation = useViewerPassageCitation()\n const activeCitationContext = passageCitation?.active ?? null\n const setPendingPassagesForCitation = passageCitation?.pick ?? noop\n const setUnselectedPassagesForCitation = passageCitation?.unpick ?? noop\n const viewingPassageId = useArbiSessionState((s) => s.viewingDocument?.passageId ?? null)\n\n // Multi-select: persists across selections.\n const [selectedChunks, setSelectedChunks] = useState<Set<string>>(new Set())\n // Latest selection readable inside handlers without churning the memoized passage rows. Lets a\n // click decide add-vs-remove and fire the store update OUTSIDE the setState updater.\n const selectedChunksRef = useRef(selectedChunks)\n selectedChunksRef.current = selectedChunks\n // Anchor for shift-click range selection: the last plainly-clicked passage.\n const selectionAnchorRef = useRef<string | null>(null)\n\n // Fact source-citation highlight: while a fact's Citation popover is open its listed passages\n // are washed light and the one being read (`viewingPassageId`) is stronger. Gated on the set\n // being non-empty so only that flow lights passages this way.\n const factCitationChunkIds = passageCitation?.highlighted ?? NONE\n const factCitationSet = useMemo(() => new Set(factCitationChunkIds), [factCitationChunkIds])\n const factCitationActive = factCitationSet.size > 0\n const factCitationSetRef = useRef(factCitationSet)\n factCitationSetRef.current = factCitationSet\n\n const isCitationMode = !!activeCitationContext && activeCitationContext.documentId === documentId\n\n // Contiguous runs read as ONE citation (\"p.3(4-9)\"), keyed by the run's first passage.\n const selectionRuns = useMemo(\n () => computeSelectionRuns(processedChunks, selectedChunks),\n [processedChunks, selectedChunks]\n )\n\n // Step between runs, not passages: \"next\" lands on the next MARK.\n const runStartIds = useMemo(\n () => orderedChunkIds.filter((id) => selectionRuns.get(id)?.isStart),\n [orderedChunkIds, selectionRuns]\n )\n const [runCursor, setRunCursor] = useState(0)\n const gotoRun = useCallback(\n (delta: number) => {\n if (runStartIds.length === 0) return\n const next = (runCursor + delta + runStartIds.length) % runStartIds.length\n setRunCursor(next)\n document\n .getElementById(runStartIds[next])\n ?.scrollIntoView({ behavior: 'smooth', block: 'center' })\n },\n [runCursor, runStartIds]\n )\n useEffect(() => {\n if (runCursor >= runStartIds.length) setRunCursor(0)\n }, [runStartIds.length, runCursor])\n\n // Clear selections when the citation context changes (new citation or cleared).\n useEffect(() => {\n setSelectedChunks(new Set())\n }, [activeCitationContext?.key, activeCitationContext?.documentId])\n\n // Text selection end: expand to whole chunks and accumulate.\n const handleSelectionEnd = useCallback(() => {\n if (!activeCitationContext || activeCitationContext.documentId !== documentId) return\n\n const selection = window.getSelection()\n if (!selection || selection.isCollapsed || selection.rangeCount === 0) return\n\n const container = containerRef.current\n if (!container) return\n\n const newSelectedChunks = new Set<string>()\n container.querySelectorAll('[data-chunk-id]').forEach((el) => {\n const chunkId = el.getAttribute('data-chunk-id')\n if (!chunkId) return\n // partial=true: robust intersection with nested elements and text nodes.\n if (selection.containsNode(el, true)) newSelectedChunks.add(chunkId)\n })\n\n if (newSelectedChunks.size > 0) {\n setSelectedChunks((prev) => new Set([...prev, ...newSelectedChunks]))\n setPendingPassagesForCitation(\n Array.from(newSelectedChunks).map((id) => ({ chunk_id: id, page: pageOf(id) }))\n )\n }\n\n // Chunks are highlighted instead of the raw text selection.\n selection.removeAllRanges()\n }, [activeCitationContext, documentId, containerRef, setPendingPassagesForCitation, pageOf])\n\n // A plain click toggles a passage AND sets the anchor; shift-click selects every passage\n // between the anchor and the target in document order. The stored citation is explicit chunk\n // ids (opaque ids survive a re-parse; an ordinal range would silently re-point).\n const handleChunkClick = useCallback(\n (chunkId: string, extendFromAnchor: boolean) => {\n if (!activeCitationContext || activeCitationContext.documentId !== documentId) return\n\n const anchorId = selectionAnchorRef.current\n const anchorIdx = anchorId ? orderedChunkIds.indexOf(anchorId) : -1\n const targetIdx = orderedChunkIds.indexOf(chunkId)\n\n if (extendFromAnchor && anchorIdx !== -1 && targetIdx !== -1) {\n const [from, to] = anchorIdx <= targetIdx ? [anchorIdx, targetIdx] : [targetIdx, anchorIdx]\n const range = orderedChunkIds.slice(from, to + 1)\n setSelectedChunks((prev) => new Set([...prev, ...range]))\n setPendingPassagesForCitation(range.map((id) => ({ chunk_id: id, page: pageOf(id) })))\n // Anchor stays put so a further shift-click can grow or shrink the run.\n return\n }\n\n selectionAnchorRef.current = chunkId\n // While a fact's Citation popover drives things, decide against the fact's ACTUAL cited set\n // (clicking an already-cited passage REMOVES it), not the session-local selection.\n const wasSelected = factCitationSetRef.current.size\n ? factCitationSetRef.current.has(chunkId)\n : selectedChunksRef.current.has(chunkId)\n setSelectedChunks((prev) => {\n const next = new Set(prev)\n if (wasSelected) next.delete(chunkId)\n else next.add(chunkId)\n return next\n })\n if (wasSelected) setUnselectedPassagesForCitation([chunkId])\n else setPendingPassagesForCitation([{ chunk_id: chunkId, page: pageOf(chunkId) }])\n },\n [\n activeCitationContext,\n documentId,\n orderedChunkIds,\n setPendingPassagesForCitation,\n setUnselectedPassagesForCitation,\n pageOf,\n ]\n )\n\n return {\n isCitationMode,\n selectedChunks,\n selectionRuns,\n runStartIds,\n runCursor,\n gotoRun,\n handleSelectionEnd,\n handleChunkClick,\n factCitationSet,\n factCitationActive,\n viewingPassageId,\n }\n}\n","/**\n * Page Scroll Sync Hook\n *\n * Handles bidirectional page synchronization between HTML viewer and page controls.\n * Manages tab switch scrolling, passage highlighting, and manual page navigation.\n */\n\nimport { useEffect, useRef, useCallback, useState } from 'react'\nimport { useArbiSessionState, useArbiSessionStore } from '@arbidocs/react'\nimport { usePageIntersectionObserver } from '@arbidocs/react/viewers'\n\n/** Scroll a passage to the middle of the view once it is painted (a lazy page may still render). */\nfunction scrollToChunk(chunkId: string) {\n requestAnimationFrame(() => {\n const element = document.getElementById(chunkId)\n if (element) {\n element.scrollIntoView({ behavior: 'auto', block: 'center' })\n return\n }\n // Not painted yet: one retry after a short delay.\n setTimeout(() => {\n document.getElementById(chunkId)?.scrollIntoView({ behavior: 'auto', block: 'center' })\n }, 100)\n })\n}\n\ninterface UsePageScrollSyncProps {\n containerRef: React.RefObject<HTMLDivElement | null>\n processedChunksLength: number\n scrollTrigger?: number\n /** Optional callback with visibility data for lazy loading */\n onVisibilityUpdate?: (visibilityMap: Map<number, number>) => void\n}\n\nexport function usePageScrollSync({\n containerRef,\n processedChunksLength,\n scrollTrigger,\n onVisibilityUpdate,\n}: UsePageScrollSyncProps) {\n const session = useArbiSessionStore()\n const viewingId = useArbiSessionState((s) => s.viewingDocument?.id)\n const viewingDocumentPage = useArbiSessionState((s) => s.viewingDocument?.page ?? null)\n const viewingPassageId = useArbiSessionState((s) => s.viewingDocument?.passageId ?? null)\n const activeTab = useArbiSessionState((s) => s.documentViewer.tab)\n const setViewingDocumentPage = useCallback(\n (page: number) => {\n if (viewingId) session.setViewingDocument({ id: viewingId, page })\n },\n [session, viewingId]\n )\n\n // The passage a citation opened the document at, lit until another one is.\n const [highlighted, setHighlighted] = useState<string | null>(null)\n const isChunkHighlighted = useCallback(\n (chunkId: string) => chunkId === highlighted,\n [highlighted]\n )\n\n // Track whether initial scroll has completed to prevent feedback loop\n const scrollCompleteRef = useRef(false)\n // Read the current passage inside the tab-switch effect without adding it\n // to that effect's deps (see the note on its dependency list).\n const viewingPassageIdRef = useRef(viewingPassageId)\n viewingPassageIdRef.current = viewingPassageId\n\n // Reset scroll gate when tab switches away from HTML\n useEffect(() => {\n if (activeTab !== 'html') {\n scrollCompleteRef.current = false\n }\n }, [activeTab])\n\n // Scroll to page ONLY on tab switch - not when page number updates from scrolling\n useEffect(() => {\n // Only run when tab switches to HTML\n if (activeTab !== 'html' || processedChunksLength === 0) return\n\n // If we already scrolled, don't scroll again\n if (scrollCompleteRef.current) return\n\n // A targeted passage owns the scroll (HtmlViewer centres it once its chunk\n // has rendered); scrolling to the page top here would land on top of that\n // and leave the passage out of view when it sits lower on the page.\n if (viewingPassageIdRef.current) {\n scrollCompleteRef.current = true\n return\n }\n\n // Wait for DOM update, then scroll to current page\n requestAnimationFrame(() => {\n if (viewingDocumentPage) {\n const pageElement = document.getElementById(`page-${viewingDocumentPage}`)\n if (pageElement) {\n pageElement.scrollIntoView({ behavior: 'auto', block: 'start' })\n // Only mark complete once we actually scrolled — if the element wasn't\n // rendered yet (lazy loading), leave scrollCompleteRef false so the\n // HtmlViewer post-render effect can scroll after pre-rendering the page.\n setTimeout(() => {\n scrollCompleteRef.current = true\n }, 100)\n }\n // else: element not in DOM yet — HtmlViewer will pre-render it and\n // the renderedPages-watching effect will scroll after render\n } else {\n scrollCompleteRef.current = true\n }\n })\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [activeTab, processedChunksLength]) // Note: viewingDocumentPage is intentionally NOT a dependency to prevent feedback loop\n\n // Only scroll to a passage when it actually changes (new citation selection),\n // not on every tab switch back to HTML. This preserves scroll position when\n // the user navigates PDF ↔ HTML without selecting a new citation.\n const lastScrolledPassageRef = useRef<string | null>(null)\n\n // Reset when passage is cleared (popover closed) so re-opening the same\n // citation still triggers a scroll.\n useEffect(() => {\n if (!viewingPassageId) {\n lastScrolledPassageRef.current = null\n // The citation closed: its passage is no longer lit.\n setHighlighted(null)\n }\n }, [viewingPassageId])\n\n // Effect to highlight and scroll to passage when viewingPassageId changes\n useEffect(() => {\n if (!viewingPassageId || activeTab !== 'html' || processedChunksLength === 0) return\n // Skip scroll if we already scrolled to this passage (e.g. tab switch without new selection)\n if (lastScrolledPassageRef.current === viewingPassageId) return\n lastScrolledPassageRef.current = viewingPassageId\n setHighlighted(viewingPassageId)\n scrollToChunk(viewingPassageId)\n }, [viewingPassageId, activeTab, processedChunksLength])\n\n // The page the last explicit request asked for. Read when the trigger fires: scrolling itself\n // changes `viewingDocumentPage`, and re-running the scroll for that would pull the view back to\n // the top of every page the user scrolls past.\n const viewingPageRef = useRef(viewingDocumentPage)\n viewingPageRef.current = viewingDocumentPage\n\n // Scroll to page when scrollTrigger changes (user entered a page number)\n useEffect(() => {\n const viewingDocumentPage = viewingPageRef.current\n if (!scrollTrigger || processedChunksLength === 0 || !viewingDocumentPage) return\n\n // Temporarily disable observer updates during manual scroll\n scrollCompleteRef.current = false\n\n requestAnimationFrame(() => {\n const pageElement = document.getElementById(`page-${viewingDocumentPage}`)\n if (pageElement) {\n pageElement.scrollIntoView({ behavior: 'smooth', block: 'start' })\n }\n // Re-enable observer after scroll completes\n setTimeout(() => {\n scrollCompleteRef.current = true\n }, 500)\n })\n }, [scrollTrigger, processedChunksLength])\n\n // Get page elements callback for IntersectionObserver\n const getPageElements = useCallback(\n () => Array.from(document.querySelectorAll<HTMLDivElement>('[id^=\"page-\"]')),\n []\n )\n\n // Get page number from element\n const getPageNumber = useCallback((element: Element) => {\n const pageMatch = element.id.match(/page-(\\d+)/)\n return pageMatch ? parseInt(pageMatch[1], 10) : 0\n }, [])\n\n // Use IntersectionObserver to track visible pages\n usePageIntersectionObserver({\n containerRef,\n scrollCompleteRef,\n isEnabled: activeTab === 'html' && processedChunksLength > 0,\n getPageElements,\n getPageNumber,\n onPageChange: setViewingDocumentPage,\n onVisibilityUpdate,\n observeKey: processedChunksLength,\n })\n\n return {\n isChunkHighlighted,\n }\n}\n","/**\n * Lazy page rendering for the parsed viewer: only pages near the viewport render their chunks;\n * the rest idle-fill, and a target page/passage (deep link, search, citation) is pre-rendered and\n * scrolled into view.\n */\n\nimport { useCallback, useEffect, useRef, useState } from 'react'\nimport type { RefObject } from 'react'\nimport { useArbiSessionState } from '@arbidocs/react'\nimport { usePageScrollSync } from './usePageScrollSync'\nimport type { ProcessedPage } from '@arbidocs/react/viewers'\n\n// Matches PdfViewer constants.\nconst LAZY_LOAD_BUFFER_BEFORE = 2\nconst LAZY_LOAD_BUFFER_AFTER = 5\nconst INITIAL_PAGES_TO_RENDER = 3\n// Aspect ratio of placeholder pages (A4-ish).\nconst PAGE_ASPECT_RATIO = 1.3\n\ninterface Options {\n containerRef: RefObject<HTMLDivElement | null>\n processedChunks: ProcessedPage[]\n scrollTrigger?: number\n}\n\nexport function useLazyPages({ containerRef, processedChunks, scrollTrigger }: Options) {\n const [containerWidth, setContainerWidth] = useState(0)\n useEffect(() => {\n const el = containerRef.current\n if (!el) return\n const observer = new ResizeObserver((entries) => {\n setContainerWidth(entries[0]?.contentRect.width ?? 0)\n })\n observer.observe(el)\n return () => observer.disconnect()\n }, [containerRef])\n\n const [renderedPages, setRenderedPages] = useState<Set<number>>(\n () => new Set(Array.from({ length: INITIAL_PAGES_TO_RENDER }, (_, i) => i))\n )\n\n // After the initial pages render, queue the rest during browser idle time.\n useEffect(() => {\n if (processedChunks.length === 0) return\n const renderAll = () => {\n setRenderedPages((prev) => {\n if (prev.size === processedChunks.length) return prev\n return new Set(Array.from({ length: processedChunks.length }, (_, i) => i))\n })\n }\n // Safari has no requestIdleCallback: fall back to a short timeout.\n if (typeof window.requestIdleCallback !== 'function') {\n const timer = setTimeout(renderAll, 200)\n return () => clearTimeout(timer)\n }\n const id = window.requestIdleCallback(renderAll)\n return () => window.cancelIdleCallback(id)\n }, [processedChunks.length])\n\n const handleVisibilityUpdate = useCallback(\n (visibilityMap: Map<number, number>) => {\n const visiblePageNumbers = Array.from(visibilityMap.entries())\n .filter(([, ratio]) => ratio > 0)\n .map(([pageNum]) => pageNum)\n if (visiblePageNumbers.length === 0) return\n\n const visibleIndices: number[] = []\n processedChunks.forEach((page, index) => {\n if (page.pageNumber !== null && visiblePageNumbers.includes(page.pageNumber)) {\n visibleIndices.push(index)\n }\n })\n if (visibleIndices.length === 0) return\n\n const minIndex = Math.min(...visibleIndices)\n const maxIndex = Math.max(...visibleIndices)\n const pagesToRender = new Set<number>()\n for (\n let i = Math.max(0, minIndex - LAZY_LOAD_BUFFER_BEFORE);\n i <= Math.min(processedChunks.length - 1, maxIndex + LAZY_LOAD_BUFFER_AFTER);\n i++\n ) {\n pagesToRender.add(i)\n }\n setRenderedPages((prev) => {\n // Same pages: return the old set so scrolling does not re-render the viewer every tick.\n for (const i of pagesToRender) if (!prev.has(i)) return new Set([...prev, ...pagesToRender])\n return prev\n })\n },\n [processedChunks]\n )\n\n // Ensure the target page is rendered when a passage is selected or the HTML tab is entered;\n // otherwise getElementById returns null and the scroll silently fails.\n const viewingDocumentPage = useArbiSessionState((s) => s.viewingDocument?.page ?? null)\n const viewingPassageId = useArbiSessionState((s) => s.viewingDocument?.passageId ?? null)\n const activeTab = useArbiSessionState((s) => s.documentViewer.tab)\n\n useEffect(() => {\n if (!viewingDocumentPage || processedChunks.length === 0) return\n if (!viewingPassageId && activeTab !== 'html') return\n\n const targetIndex = processedChunks.findIndex((p) => p.pageNumber === viewingDocumentPage)\n if (targetIndex === -1) return\n\n setRenderedPages((prev) => {\n if (prev.has(targetIndex)) return prev\n const next = new Set(prev)\n for (\n let i = Math.max(0, targetIndex - LAZY_LOAD_BUFFER_BEFORE);\n i <= Math.min(processedChunks.length - 1, targetIndex + LAZY_LOAD_BUFFER_AFTER);\n i++\n ) {\n next.add(i)\n }\n return next\n })\n }, [viewingPassageId, viewingDocumentPage, processedChunks, activeTab])\n\n // After pre-rendering the target, scroll to it. usePageScrollSync only fires on\n // activeTab/length changes and misses an element that was not in the DOM yet. The page scroll\n // is gated to once per tab switch; a passage (centred, not the page top) gets its own scroll,\n // retried frame by frame (bounded) until its lazy page has rendered.\n const tabSwitchScrolledRef = useRef(false)\n const passageScrolledRef = useRef<string | null>(null)\n useEffect(() => {\n if (activeTab !== 'html') tabSwitchScrolledRef.current = false\n }, [activeTab])\n useEffect(() => {\n if (!viewingPassageId) passageScrolledRef.current = null\n }, [viewingPassageId])\n useEffect(() => {\n if (activeTab !== 'html' || !viewingDocumentPage) return\n if (viewingPassageId && passageScrolledRef.current !== viewingPassageId) {\n const target = viewingPassageId\n const deadline = performance.now() + 3000\n let raf = 0\n const tick = () => {\n const el = document.getElementById(target)\n if (el) {\n passageScrolledRef.current = target\n tabSwitchScrolledRef.current = true\n el.scrollIntoView({ behavior: 'auto', block: 'center' })\n // Re-assert next frame so a competing scroll from the same commit cannot win.\n raf = requestAnimationFrame(() =>\n el.scrollIntoView({ behavior: 'auto', block: 'center' })\n )\n return\n }\n if (performance.now() < deadline) raf = requestAnimationFrame(tick)\n }\n raf = requestAnimationFrame(tick)\n return () => cancelAnimationFrame(raf)\n }\n if (tabSwitchScrolledRef.current) return\n const pageElement = document.getElementById(`page-${viewingDocumentPage}`)\n if (!pageElement) return\n tabSwitchScrolledRef.current = true\n requestAnimationFrame(() => {\n pageElement.scrollIntoView({ behavior: 'auto', block: 'start' })\n })\n // renderedPages is the key dep: it fires after pre-render adds the target page.\n }, [renderedPages, activeTab, viewingDocumentPage, viewingPassageId])\n\n const { isChunkHighlighted } = usePageScrollSync({\n containerRef,\n processedChunksLength: processedChunks.length,\n scrollTrigger,\n onVisibilityUpdate: handleVisibilityUpdate,\n })\n\n return {\n renderedPages,\n isChunkHighlighted,\n placeholderHeight: containerWidth ? containerWidth * PAGE_ASPECT_RATIO : 500,\n }\n}\n","/**\n * The text view of a document: its parsed passages, page by page, with labels, citation picking,\n * passage links and copying, and the passage a citation opened it at. Data and behaviour live in\n * the hooks (labels, citation selection, lazy pages); the markup is the blocks HtmlViewer parts.\n */\n\nimport { useCallback, useEffect, useMemo, useRef } from 'react'\nimport { useDocument, useParsedDocument } from '@arbidocs/react'\nimport { parseVersionRef } from '@arbidocs/react/artifacts'\nimport { usePinchZoom, useProcessedChunks, useScrollAnchor } from '@arbidocs/react/viewers'\nimport {\n CitedRunNav,\n DocumentLabelBar,\n HtmlPage,\n HtmlViewerEmpty,\n HtmlViewerRoot,\n HtmlViewerSurface,\n ViewerMessage,\n} from '../../../files'\nimport { useConnectedWorkspace } from '../../ConnectionProvider'\nimport { useDocumentViewerSupport } from '../support'\nimport { PassageTagPanel } from './PassageTagPanel'\nimport { ParsedPassage } from './ParsedPassage'\nimport { usePassageCopy } from './usePassageCopy'\nimport { useDocumentLabels, type PassageLabel } from './useDocumentLabels'\nimport { useCitationSelection } from './useCitationSelection'\nimport { useLazyPages } from './useLazyPages'\n\nconst EMPTY_LABELS: PassageLabel[] = []\n\nexport interface ParsedTextViewProps {\n documentId: string\n stage?: 'marker' | 'subchunk' | 'final'\n onLoadSuccess?: (totalPages: number) => void\n /** Incremented to trigger scroll to current page */\n scrollTrigger?: number\n /** Text zoom, a multiplier of the normal size (1 = 100%). */\n zoom?: number\n /** Called by pinch and double-tap. */\n onZoomChange?: (zoom: number) => void\n}\n\nexport function ParsedTextView({\n documentId,\n stage = 'final',\n onLoadSuccess,\n scrollTrigger,\n zoom = 1,\n onZoomChange,\n}: ParsedTextViewProps) {\n const { workspaceId } = useConnectedWorkspace()\n const { openInNavigator } = useDocumentViewerSupport()\n const containerRef = useRef<HTMLDivElement>(null)\n\n // Document metadata for citation formatting.\n // The document's record (a version reference names its document), for a copied passage's\n // citation line.\n const { data: documentRecord } = useDocument(parseVersionRef(documentId).docId, {\n enabled: !!documentId && !!workspaceId,\n })\n const documentData = documentRecord ?? undefined\n\n const { data: parsedDoc, isLoading, error } = useParsedDocument(documentId, stage)\n const { processedChunks, maxPageNumber } = useProcessedChunks(\n parsedDoc?.chunks,\n parsedDoc?.footnotes || {}\n )\n\n /** A chunk's page: the viewer is the only place this is known. */\n const pageByChunk = useMemo(() => {\n const map = new Map<string, number | undefined>()\n for (const page of processedChunks) {\n for (const chunk of page.chunks) {\n if (chunk.chunkExtId) map.set(chunk.chunkExtId, page.pageNumber ?? undefined)\n }\n }\n return map\n }, [processedChunks])\n const pageOf = useCallback((id: string) => pageByChunk.get(id), [pageByChunk])\n\n // Every passage id in document order: the axis a shift-click range walks.\n const orderedChunkIds = useMemo(\n () =>\n processedChunks.flatMap((page) =>\n page.chunks.map((c) => c.chunkExtId).filter((id): id is string => !!id)\n ),\n [processedChunks]\n )\n const totalPages = useMemo(\n () => processedChunks.filter((p) => p.pageNumber !== null).length,\n [processedChunks]\n )\n\n const labels = useDocumentLabels(documentId, documentData?.doctags, orderedChunkIds)\n const citation = useCitationSelection({\n documentId,\n containerRef,\n processedChunks,\n orderedChunkIds,\n pageOf,\n })\n const { renderedPages, isChunkHighlighted, placeholderHeight } = useLazyPages({\n containerRef,\n processedChunks,\n scrollTrigger,\n })\n // Lazy pages change height as they render: keep the reading position on every engine.\n useScrollAnchor(containerRef, processedChunks.length)\n usePinchZoom({ containerRef, zoom, onZoomChange })\n const { formatChunkWithCitation, getPassageDeepLink, copyToClipboard } = usePassageCopy({\n documentId,\n documentData,\n selectedWorkspaceId: workspaceId,\n })\n\n const handleOpenNavigator = useMemo(\n () => (openInNavigator ? () => openInNavigator(documentId) : undefined),\n [openInNavigator, documentId]\n )\n\n // Notify the parent of the total pages in an effect to avoid setState during render.\n useEffect(() => {\n if (maxPageNumber > 0 && onLoadSuccess) {\n try {\n onLoadSuccess(maxPageNumber)\n } catch (err) {\n console.error('Error in onLoadSuccess callback:', err)\n }\n }\n }, [maxPageNumber, onLoadSuccess])\n\n if (isLoading) return <ViewerMessage>Loading parsed document...</ViewerMessage>\n if (error) {\n return (\n <ViewerMessage>\n <span className=\"text-red-text\">Failed to load parsed document</span>\n </ViewerMessage>\n )\n }\n\n const taggingChunk = labels.taggingChunkId\n ? processedChunks\n .flatMap((page) => page.chunks)\n .find((c) => c.chunkExtId === labels.taggingChunkId)\n : undefined\n\n return (\n <HtmlViewerRoot>\n <DocumentLabelBar\n summaries={labels.labelSummaries}\n activeTagExtId={labels.activeTagExtId}\n cursor={labels.tagCursor}\n onSelect={labels.selectTag}\n onStep={labels.gotoTagged}\n />\n\n {labels.taggingChunkId && (\n <PassageTagPanel\n documentId={documentId}\n chunkExtId={labels.taggingChunkId}\n chunkContent={taggingChunk?.content ?? ''}\n pageNumber={pageOf(labels.taggingChunkId)}\n documentDoctags={labels.documentDoctags}\n onClose={() => labels.setTaggingChunkId(null)}\n onViewTaggedChunks={(tagExtId) => {\n labels.selectTag(tagExtId)\n labels.setTaggingChunkId(null)\n }}\n />\n )}\n\n {/* Hidden while a fact's Citation popover drives the view: that popover already lists and\n navigates the cited passages. */}\n {!citation.factCitationActive && citation.runStartIds.length > 0 && (\n <CitedRunNav\n position={citation.runCursor + 1}\n total={citation.runStartIds.length}\n onStep={citation.gotoRun}\n />\n )}\n <HtmlViewerSurface surfaceRef={containerRef} onMouseUp={citation.handleSelectionEnd}>\n {processedChunks.length > 0 ? (\n processedChunks.map((page, pageIndex) => (\n <HtmlPage\n key={pageIndex}\n pageNumber={page.pageNumber}\n totalPages={totalPages}\n isRendered={renderedPages.has(pageIndex)}\n placeholderHeight={placeholderHeight}\n zoom={zoom}\n >\n {page.chunks.map((chunk, chunkIndex) => {\n const id = chunk.chunkExtId\n const run = id ? citation.selectionRuns.get(id) : undefined\n return (\n <ParsedPassage\n key={chunkIndex}\n chunk={chunk}\n pageNumber={page.pageNumber}\n isHighlighted={!!(id && isChunkHighlighted(id))}\n isSelected={!!(id && citation.selectedChunks.has(id))}\n isCitationHighlight={!!(id && citation.factCitationSet.has(id))}\n isActiveCitation={\n !!(\n id &&\n citation.factCitationActive &&\n citation.viewingPassageId === id &&\n // Only while it is STILL cited: clicking it off must clear it.\n citation.factCitationSet.has(id)\n )\n }\n factCitationActive={citation.factCitationActive}\n isCitationMode={citation.isCitationMode}\n runIsStart={!!run?.isStart}\n runIsEnd={!!run?.isEnd}\n runEndIndex={run?.endIndex}\n onChunkClick={citation.isCitationMode ? citation.handleChunkClick : undefined}\n formatChunkWithCitation={formatChunkWithCitation}\n getPassageDeepLink={getPassageDeepLink}\n copyToClipboard={copyToClipboard}\n onOpenNavigator={handleOpenNavigator}\n labels={id ? (labels.labelsByChunk.get(id) ?? EMPTY_LABELS) : EMPTY_LABELS}\n activeTagColor={\n id && labels.activeChunkIds.has(id) ? labels.activeTagColor : undefined\n }\n onTagPassage={labels.setTaggingChunkId}\n onShowLabel={labels.selectTag}\n onRemoveLabel={labels.removeLabel}\n />\n )\n })}\n </HtmlPage>\n ))\n ) : (\n <HtmlViewerEmpty />\n )}\n </HtmlViewerSurface>\n </HtmlViewerRoot>\n )\n}\n","/**\n * The PDF (or media) body of the document viewer: loading and failure states, the image, audio and\n * video players, and the PDF with its tools — the markup layer, signature placement, a signature\n * request being prepared or signed.\n */\n\nimport { lazy, Suspense, useCallback } from 'react'\nimport { useArbiSessionState, useArbiSessionStore } from '@arbidocs/react'\nimport type {\n SignatureAppearance,\n SignatureRequest,\n useDocumentMarkup,\n} from '@arbidocs/react/document-tools'\nimport {\n AudioViewer,\n ImageViewer,\n PdfViewer as KitPdfViewer,\n VideoViewer,\n type PdfViewerProps,\n} from '@arbidocs/react/viewers'\nimport { friendlyFileType } from '@arbidocs/react/ui'\nimport { ViewerLoadError, ViewerMessage, ViewerPreviewUnavailable } from '../../files'\nimport { useViewerIsDetached } from './support'\nimport { fileExtension, type ViewedDocument } from './useViewedDocument'\n\n// The markup viewer brings in pdf-lib, which nothing else needs: load it only when it is shown.\nconst AnnotatedPdfViewer = lazy(() =>\n import('../../document-tools/viewer').then((m) => ({ default: m.AnnotatedPdfViewer }))\n)\nconst SignaturePlacementViewer = lazy(() =>\n import('../../document-tools/viewer').then((m) => ({ default: m.SignaturePlacementViewer }))\n)\n// Signature requests: placing fields for signers, and a signer's guided signing.\nconst SignatureRequestEditor = lazy(() =>\n import('../../document-tools/viewer').then((m) => ({ default: m.SignatureRequestEditor }))\n)\nconst GuidedSigningViewer = lazy(() =>\n import('../../document-tools/viewer').then((m) => ({ default: m.GuidedSigningViewer }))\n)\n\n/** A signature request: the author placing fields, or a signer walked through theirs. */\nexport type SignatureFlow =\n | { kind: 'prepare'; draft?: SignatureRequest; self?: boolean }\n | { kind: 'sign'; request: SignatureRequest }\n | null\n\n/**\n * The kit PDF viewer, reporting the page read into the session state; in a detached window its\n * pages render without the opener's web fonts (canvas text in another document cannot use them).\n */\nfunction SessionPdfViewer(props: Omit<PdfViewerProps, 'onPageChange' | 'disableFontFace'>) {\n const session = useArbiSessionStore()\n const viewingId = useArbiSessionState((s) => s.viewingDocument?.id)\n const isDetached = useViewerIsDetached()\n const onPageChange = useCallback(\n (page: number) => {\n if (viewingId) session.setViewingDocument({ id: viewingId, page })\n },\n [session, viewingId]\n )\n return <KitPdfViewer {...props} onPageChange={onPageChange} disableFontFace={!!isDetached} />\n}\n\nexport interface ViewerPdfPaneProps {\n documentId: string\n doc: ViewedDocument\n pdfBlob: Blob | null\n isPdfLoading: boolean\n pdfError: unknown\n onDownload: () => void\n viewerProps: {\n currentPage: number | undefined\n onLoadSuccess: (pages: number) => void\n scrollTrigger: number\n zoom: number\n onZoomChange: (zoom: number) => void\n }\n signatureFlow: SignatureFlow\n onSignatureFlow: (flow: SignatureFlow) => void\n currentUserId: string | undefined\n placingSignature: boolean\n onPlacingDone: (appearance?: SignatureAppearance) => void\n annotating: boolean\n markup: ReturnType<typeof useDocumentMarkup>\n pdfSnapshotNumber: number | undefined\n isSigned: boolean\n /** One's saved signature or initials to place as a picture stamp (PDF tab › My signature). */\n placeMark?: { image: string; label: string; key: number } | null\n}\n\nexport function ViewerPdfPane({\n documentId,\n doc,\n pdfBlob,\n isPdfLoading,\n pdfError,\n onDownload,\n viewerProps,\n signatureFlow,\n onSignatureFlow,\n currentUserId,\n placingSignature,\n onPlacingDone,\n annotating,\n markup,\n pdfSnapshotNumber,\n isSigned,\n placeMark = null,\n}: ViewerPdfPaneProps) {\n const { documentData, isDownloadOnly, isVideo, isAudio, isImage, isDocx } = doc\n const showMarkup = markup.hasMarkup && !markup.showOriginal\n\n // Files that cannot be previewed in the browser: the download, at once.\n if (isDownloadOnly) {\n return (\n <ViewerPreviewUnavailable\n extension={fileExtension(documentData?.file_name)}\n onDownload={onDownload}\n />\n )\n }\n\n // Text files are rendered to a PDF too, so name what the user opened, not the rendering.\n const loadingLabel = isVideo\n ? 'Loading video...'\n : isAudio\n ? 'Loading audio...'\n : isImage\n ? 'Loading image...'\n : !documentData\n ? 'Loading document...'\n : friendlyFileType(documentData.file_type, documentData.file_name) === 'Text'\n ? 'Loading text...'\n : 'Loading PDF...'\n const errorLabel = isVideo\n ? 'Failed to load video'\n : isAudio\n ? 'Failed to load audio'\n : isImage\n ? 'Failed to load image'\n : 'Failed to load PDF'\n\n if (\n isDocx &&\n documentData &&\n !['completed', 'low-content', 'failed'].includes(documentData.status || '')\n ) {\n return (\n <ViewerMessage>\n PDF and search indexing are processing. Open the DOCX tab to edit now.\n </ViewerMessage>\n )\n }\n if (isPdfLoading) return <ViewerMessage>{loadingLabel}</ViewerMessage>\n if (pdfError) {\n return (\n <ViewerLoadError\n message={\n isVideo || isAudio || isImage\n ? `${errorLabel} — download it instead.`\n : \"Couldn't display the PDF — download it instead.\"\n }\n onDownload={onDownload}\n />\n )\n }\n // Nothing is fetched yet: the PDF is read once the document record has loaded, so the viewer\n // would otherwise sit empty for that first stretch.\n if (!pdfBlob) return <ViewerMessage>{loadingLabel}</ViewerMessage>\n\n if (isVideo) return <VideoViewer blob={pdfBlob} title={documentData?.file_name || 'Video'} />\n if (isAudio) return <AudioViewer blob={pdfBlob} title={documentData?.file_name || 'Audio'} />\n if (isImage) {\n return <ImageViewer blob={pdfBlob} alt={documentData?.file_name || 'Document image'} />\n }\n if (signatureFlow?.kind === 'prepare') {\n return (\n <Suspense fallback={<ViewerMessage>Loading…</ViewerMessage>}>\n <SignatureRequestEditor\n {...viewerProps}\n file={pdfBlob}\n documentId={documentId}\n version={pdfSnapshotNumber ?? documentData?.current_version ?? undefined}\n selfSigning={signatureFlow.self}\n draft={signatureFlow.draft}\n shareFile={!signatureFlow.draft}\n viewer={SessionPdfViewer}\n onCancel={() => onSignatureFlow(null)}\n onSaved={() => onSignatureFlow(null)}\n />\n </Suspense>\n )\n }\n if (signatureFlow?.kind === 'sign' && currentUserId) {\n const { currentPage: _page, scrollTrigger: _trigger, ...guidedProps } = viewerProps\n return (\n <Suspense fallback={<ViewerMessage>Loading…</ViewerMessage>}>\n <GuidedSigningViewer\n {...guidedProps}\n file={pdfBlob}\n request={signatureFlow.request}\n signer={currentUserId}\n viewer={SessionPdfViewer}\n onClose={() => onSignatureFlow(null)}\n onSigned={() => onSignatureFlow(null)}\n />\n </Suspense>\n )\n }\n if (placingSignature) {\n return (\n <Suspense fallback={<ViewerMessage>Loading…</ViewerMessage>}>\n <SignaturePlacementViewer\n {...viewerProps}\n file={pdfBlob}\n documentId={documentId}\n viewer={SessionPdfViewer}\n onCancel={() => onPlacingDone()}\n onContinue={(appearance) => onPlacingDone(appearance)}\n />\n </Suspense>\n )\n }\n // Annotate mode, or the markup as the reading view: one viewer, so leaving annotate mode keeps\n // (and saves) what was just drawn.\n if (annotating || showMarkup) {\n return (\n <Suspense\n fallback={\n <ViewerMessage>\n {annotating ? 'Loading annotation tools…' : 'Loading markup…'}\n </ViewerMessage>\n }\n >\n <AnnotatedPdfViewer\n key={`${documentId}@${pdfSnapshotNumber ?? 'current'}`}\n {...viewerProps}\n file={pdfBlob}\n documentId={documentId}\n version={pdfSnapshotNumber}\n editing={annotating}\n onMarkupChange={markup.onMarkupChange}\n fileName={documentData?.file_name}\n shared={documentData?.shared ?? false}\n folder={documentData?.folder}\n workspaceId={documentData?.workspace_ext_id}\n viewer={SessionPdfViewer}\n signed={isSigned}\n placeStamp={placeMark}\n />\n </Suspense>\n )\n }\n return <SessionPdfViewer {...viewerProps} file={pdfBlob} />\n}\n","/**\n * The whole document viewer on the signed-in session: a document (or one of its versions, read\n * only) as its PDF, its text, the Word editor, a sheet, an image, a recording or a live artifact;\n * its versions and comparisons; markup, signing and signature requests; sharing, Email, Translate\n * and Finalise. Runs under any host (`useConnectedWorkspace`): the open document, tab and comparison\n * are the session state's, navigation the `BlocksEnvironment`'s, and what only the host knows comes\n * as its host config's `viewer`.\n */\n\nimport { lazy, Suspense, useCallback, useEffect, useRef, useState, type ReactNode } from 'react'\nimport {\n ChevronDown,\n Languages,\n Mail,\n MessageSquare,\n MessageSquarePlus,\n PenLine,\n Users,\n} from 'lucide-react'\nimport {\n DEFAULT_ASPECT_OPTIONS,\n ImageCropModal,\n useArbi,\n useArbiSessionState,\n useArbiSessionStore,\n} from '@arbidocs/react'\nimport { findVersion, parseVersionRef, versionLabel } from '@arbidocs/react/artifacts'\nimport {\n SIGNED_LOCKED_REASON,\n canAnnotate,\n useDocumentMarkup,\n useDocumentSignatures,\n useDocumentTools,\n type SignatureAppearance,\n} from '@arbidocs/react/document-tools'\nimport { XlsxViewer, cycleZoom } from '@arbidocs/react/viewers'\nimport {\n Button,\n DropdownMenu,\n DropdownMenuContent,\n DropdownMenuItem,\n DropdownMenuTrigger,\n getEntityLabel,\n} from '@arbidocs/react/ui'\nimport {\n ArtifactCodeView,\n ArtifactCompareBar,\n ArtifactPreview,\n VersionTimeline,\n} from '../../artifacts'\nimport { latestThreadOfDocument, useRegisterOpenDocument } from '@arbidocs/react/shell'\nimport { ShareControl } from '../../collaboration/sharing/ShareControl'\nimport {\n ViewerCaptureDraft,\n ViewerDraftKind,\n ViewerDraftTitle,\n ViewerRelatedDocuments,\n} from './drafts'\nimport {\n AnnotateButton,\n DownloadMarkupButton,\n FileShareDialog,\n MarkupNotices,\n MarkupViewNote,\n PlaceMySignatureMenuItems,\n ShowOriginalButton,\n SignDocumentDialog,\n SignedEditNote,\n SignatureRequestBanner,\n SignatureStatus,\n VersionSnapshotBar,\n} from '../../document-tools'\nimport {\n DocumentLabelBar,\n PdfPageNav,\n ViewerControlBar,\n ViewerFrame,\n ViewerHeaderEnd,\n ViewerHeaderStart,\n ViewerImageActions,\n ViewerMessage,\n ViewerPageCounter,\n ViewerPane,\n ViewerStatusNote,\n ViewerTabBar,\n ViewerTitle,\n ViewerZoomControl,\n} from '../../files'\nimport { ErrorBoundary } from '../../components/ErrorBoundary'\nimport { fmtDate } from '../../lib/format'\nimport { useBlocksEnvironment } from '../../provider/environment'\nimport { TabHeader } from '../../shell'\nimport { useConnectedWorkspace } from '../ConnectionProvider'\nimport { useConnectedConversations } from '../workspaceData'\nimport { ConnectedDocumentToolsProvider } from './ConnectedDocumentToolsProvider'\nimport { FinaliseTranslationButton } from './FinaliseTranslationButton'\nimport { useDocumentViewerSupport } from './support'\nimport { useImageCrop } from './useImageCrop'\nimport { useViewedDocument } from './useViewedDocument'\nimport { useViewerBlobs } from './useViewerBlobs'\nimport { useViewerTabs } from './useViewerTabs'\nimport { useViewerVersions } from './useViewerVersions'\nimport { ParsedTextView } from './parsed/ParsedTextView'\nimport { ViewerPdfPane, type SignatureFlow } from './ViewerPdfPane'\nimport { canChangeVisibility } from '../../files/permissions'\n\n// The Word editor loads only when a Word document is shown.\nconst NativeDocxEditor = lazy(() =>\n import('../docx/ConnectedNativeDocxEditor').then((m) => ({\n default: m.ConnectedNativeDocxEditor,\n }))\n)\nconst StreamedWordArtifact = lazy(() =>\n import('../docx/ConnectedStreamedWordArtifact').then((m) => ({\n default: m.ConnectedStreamedWordArtifact,\n }))\n)\nconst NativeDocxComparison = lazy(() =>\n import('../docx/ConnectedNativeDocxComparison').then((m) => ({\n default: m.ConnectedNativeDocxComparison,\n }))\n)\n\nconst UPLOADED_NO_VERSIONS =\n 'No earlier versions yet. Replacing, editing or signing this file adds a new version here.'\n\nexport interface ConnectedDocumentViewerProps {\n /**\n * The document, or a version reference `doc-…@v{n}` (a citation, a \"made from v2\" link): an\n * earlier version opens read-only. Default: the session state's viewing document.\n */\n documentId?: string\n /** Controls at the right end of the header (a panel's dock / pop-out switcher). */\n headerActions?: ReactNode\n /** Where html/react artifacts load their sandbox runtime from. */\n artifactRuntimeUrl?: string\n}\n\nexport function ConnectedDocumentViewer(props: ConnectedDocumentViewerProps) {\n const viewing = useArbiSessionState((s) => s.viewingDocument?.id)\n const openedId = props.documentId ?? viewing\n if (!openedId) return null\n // A viewer that throws (a PDF the browser cannot render, say) shows the error here, in the\n // viewer's place, instead of unmounting the whole app.\n return (\n <ErrorBoundary\n resetKey={openedId}\n labels={{ title: \"This document couldn't be displayed\" }}\n testId=\"document-viewer-error\"\n >\n <ConnectedDocumentToolsProvider>\n <DocumentViewerContent {...props} openedId={openedId} />\n </ConnectedDocumentToolsProvider>\n </ErrorBoundary>\n )\n}\n\nfunction DocumentViewerContent({\n openedId,\n headerActions,\n artifactRuntimeUrl = '/artifact-runtime/',\n}: ConnectedDocumentViewerProps & { openedId: string }) {\n const arbi = useArbi()\n const session = useArbiSessionStore()\n const support = useDocumentViewerSupport()\n const formatDate = support.formatDate ?? fmtDate\n const tools = useDocumentTools()\n const { openConversation, openNewConversation, notify } = useBlocksEnvironment()\n const { userId: currentUserId } = useConnectedWorkspace()\n // A document keeps one id for its whole life; its versions are inside it.\n const documentId = parseVersionRef(openedId).docId\n const [totalPages, setTotalPages] = useState<number>(0)\n const [isCompact, setIsCompact] = useState(false)\n // Zoom of the PDF (canvas scale) / text, as a multiplier of fit width; pinch, double-tap and the\n // zoom button all drive it. The text view's size is a reading preference for every document.\n const [pdfZoom, setPdfZoom] = useState(1)\n const {\n tab: zoomTab,\n textScale,\n compareId: compareDocumentId,\n } = useArbiSessionState((s) => s.documentViewer)\n const zoom = zoomTab === 'html' ? textScale : pdfZoom\n const setZoom = useCallback(\n (next: number | ((z: number) => number)) => {\n const value = typeof next === 'function' ? next(zoom) : next\n if (zoomTab === 'html') session.setDocumentViewer({ textScale: value })\n else setPdfZoom(value)\n },\n [zoomTab, session, zoom]\n )\n const [scrollTrigger, setScrollTrigger] = useState(0) // Incremented to scroll the viewers\n const containerRef = useRef<HTMLDivElement>(null)\n\n const viewingDocumentPage = useArbiSessionState((s) => s.viewingDocument?.page ?? null)\n const setViewingDocumentPage = (page: number) =>\n session.setViewingDocument({ id: openedId, page })\n const setViewingDocumentId = (id: string) => session.setViewingDocument({ id })\n const setActiveTab = (tab: Parameters<typeof session.setDocumentViewer>[0]['tab']) =>\n session.setDocumentViewer({ tab })\n const setCompareDocumentId = (id: string | null) => session.setDocumentViewer({ compareId: id })\n const { data: conversations } = useConnectedConversations()\n\n // An earlier version opened read-only (`doc-…@v{n}`) from the Versions tab, a citation or a\n // \"made from\" link. Word documents show it in the Word editor, artifacts in theirs, everything\n // else as its PDF. The version on screen is the session's viewing id, not local state: the\n // viewer remounts when its panel moves to a new window, and the version must come along.\n const snapshotRef = parseVersionRef(openedId).version ? openedId : null\n // Every version of the document, oldest first. Every version of an artifact shares one name, so\n // both sides of a comparison get the timeline's \"v1/v2/v3\" label.\n const { versions, translations } = useViewerVersions(documentId)\n const currentVersionId = versions.find((v) => v.isCurrent)?.id ?? documentId\n // Opening the current version is the live document itself, not a read-only copy of it.\n const snapshotDocumentId = snapshotRef && snapshotRef !== currentVersionId ? snapshotRef : null\n const doc = useViewedDocument(documentId)\n const setSnapshotDocumentId = (ref: string | null) => setViewingDocumentId(ref ?? documentId)\n // Drafting mode: a thread bound to the open document (or the one it was made in) drafts in it,\n // also while an earlier version of it is on screen; a turn sent then brings the live document\n // back, where the assistant's edits appear. Being open binds no chat to it.\n useRegisterOpenDocument({\n documentId: doc.savedDocumentId,\n shownId: openedId,\n showLive: () => setViewingDocumentId(documentId),\n workspaceId: doc.workspaceId,\n conversationId: doc.documentData?.conversation_ext_id ?? null,\n })\n const {\n documentData,\n streamingDoc,\n isStreaming,\n draftDoc,\n isDraft,\n isCaptureDraft,\n labelSummaries,\n isImage,\n isVideo,\n isAudio,\n isMedia,\n isArtifact,\n liveKind,\n liveSource,\n isDocx,\n isXlsx,\n isDownloadOnly,\n } = doc\n // The thread bound to this document: its latest one, else a new chat bound to it. The document\n // stays on screen beside it.\n const chatAboutDocument = () => {\n const savedId = doc.savedDocumentId\n if (!savedId) return\n const latest = latestThreadOfDocument(conversations, savedId)\n if (latest) {\n openConversation(latest, { keepDocumentOpen: true })\n return\n }\n // Opening a new chat starts it unbound; it is bound after.\n openNewConversation({ keepDocumentOpen: true })\n session.setNewChatDocumentId(savedId)\n }\n // A thread by its title, for the threads a document (and each version) was made in.\n const threadTitle = (id: string) =>\n conversations.find((c) => c.external_id === id)?.title?.trim() || 'Its thread'\n // The thread a generated document was made in (none for an upload).\n const madeInId = documentData?.conversation_ext_id ?? null\n const madeIn = madeInId ? { id: madeInId, title: threadTitle(madeInId) } : null\n const pdfSnapshotId = snapshotDocumentId && !isDocx && !isArtifact ? snapshotDocumentId : null\n // The document on screen: an earlier version when one is open, else the current one.\n const shownDocumentId = pdfSnapshotId || documentId\n const blobs = useViewerBlobs(shownDocumentId, doc)\n const { pdfBlob, xlsxBlob, xlsxError, handleDirectDownload } = blobs\n // Annotation mode for the PDF view; off for every newly opened document.\n const [annotating, setAnnotating] = useState(false)\n const [sharingFile, setSharingFile] = useState(false)\n useEffect(() => setAnnotating(false), [documentId])\n // My signature: one's saved signature or initials, to place as a picture stamp in the markup.\n const [placeMark, setPlaceMark] = useState<{ image: string; label: string; key: number } | null>(\n null\n )\n // Translations are listed with the versions (each is its own document), so they open the tab too.\n const hasHistory =\n versions.length > 1 || (documentData?.current_version ?? 1) > 1 || translations.length > 0\n const { activeTab, handleTabChange, viewerTabs } = useViewerTabs(doc, isCompact, hasHistory)\n const crop = useImageCrop(\n documentId,\n documentData?.file_name,\n pdfBlob,\n documentData?.workspace_ext_id\n )\n // Signing: choose where the signature goes (placing), then the Sign dialog.\n const [placingSignature, setPlacingSignature] = useState(false)\n const [signAppearance, setSignAppearance] = useState<SignatureAppearance | undefined>()\n const [isSignOpen, setIsSignOpen] = useState(false)\n // Leaving the placement when another version opens or returns: it belongs to the copy on screen.\n useEffect(() => setPlacingSignature(false), [documentId, snapshotDocumentId])\n // A signature request: the author placing fields ('prepare'), or a signer walked through theirs.\n const [signatureFlow, setSignatureFlow] = useState<SignatureFlow>(null)\n useEffect(() => setSignatureFlow(null), [documentId, snapshotDocumentId])\n const { data: signatureStatus } = useDocumentSignatures(shownDocumentId, !isDraft && !liveKind)\n\n // The Word editor on the current version: the editor's own ribbon says \"Co-edit mode\", so the\n // header carries no version label and, when narrow, no title row above the ribbon.\n const isCoEditing =\n !snapshotDocumentId &&\n !compareDocumentId &&\n !isDraft &&\n ((activeTab === 'docx' && isDocx) ||\n (activeTab === 'edit' && isArtifact && !liveKind && !isStreaming))\n const currentVersionLabel = isCoEditing\n ? undefined\n : !snapshotDocumentId && !compareDocumentId && (isDocx || (isArtifact && !liveKind))\n ? 'Live'\n : versionLabel(versions, snapshotDocumentId || documentId)\n const compareVersionLabel = versionLabel(versions, compareDocumentId)\n const snapshotNumber = findVersion(versions, snapshotDocumentId)?.number\n // The markup of the version on screen: the default view when it has any (\"Show original\" hides).\n const pdfSnapshotNumber = pdfSnapshotId ? snapshotNumber : undefined\n // A signed version is locked: only a further signature changes it. Its marks stay in the markup\n // layer (never in its PDF), and editing its content saves a new, unsigned version.\n const isSigned = !!signatureStatus?.signed\n const markup = useDocumentMarkup(documentData, pdfSnapshotNumber, isSigned)\n\n // Detect container width changes (640px = the sm: breakpoint).\n useEffect(() => {\n const container = containerRef.current\n if (!container) return\n const resizeObserver = new ResizeObserver((entries) => {\n for (const entry of entries) setIsCompact(entry.contentRect.width < 640)\n })\n resizeObserver.observe(container)\n return () => resizeObserver.disconnect()\n }, [])\n\n const handleLoadSuccess = useCallback((numPages: number) => setTotalPages(numPages), [])\n\n // Go to a page: the counter, or one step from the arrows.\n const goToPage = (page: number) => {\n setViewingDocumentPage(page)\n setScrollTrigger((prev) => prev + 1)\n }\n const stepPage = (delta: number) => {\n const next = (viewingDocumentPage || 1) + delta\n if (next >= 1 && next <= totalPages) goToPage(next)\n }\n\n const documentTitle =\n streamingDoc?.title ||\n draftDoc?.title ||\n documentData?.doc_metadata?.title ||\n documentData?.file_name ||\n 'Document'\n\n // The page / zoom controls, shared by the PDF and the text view. They sit in the control bar\n // under the body, so they never cover the text being read.\n const pageNav = totalPages > 0 && (\n <>\n <ViewerZoomControl zoom={zoom} onCycle={() => setZoom(cycleZoom(zoom))} />\n <PdfPageNav\n canPrev={(viewingDocumentPage || 1) > 1}\n canNext={(viewingDocumentPage || 1) < totalPages}\n onPrev={() => stepPage(-1)}\n onNext={() => stepPage(1)}\n counter={\n <ViewerPageCounter page={viewingDocumentPage || 1} total={totalPages} onGoTo={goToPage} />\n }\n />\n </>\n )\n\n // Compare: a \"Compare vs. [doc]\" row of its own below the tab/title bar (a docked panel is\n // narrow), with the flip-direction arrow and the way out.\n const isComparing = !!compareDocumentId\n const compareTarget = compareDocumentId ? parseVersionRef(compareDocumentId).docId : null\n const compareIndicator = isComparing && compareTarget && (\n <ArtifactCompareBar\n compareTarget={support.renderDocumentPill?.(compareTarget) ?? compareTarget}\n versionLabel={compareVersionLabel}\n mode=\"flip\"\n showTrackChanges={false}\n onToggleTrackChanges={() => {}}\n onFlip={() => {\n setViewingDocumentId(compareDocumentId!)\n setCompareDocumentId(documentId)\n }}\n onStop={() => setCompareDocumentId(null)}\n />\n )\n\n // Document name block: the name, related documents and status notes. Roomy headers keep it on\n // the tab row; a narrow (phone / docked) header gives it a row of its own so the name is never\n // cut down to a couple of letters by the tabs and actions.\n const titleBlock = (\n <>\n {/* A draft gets an editable name + auto-name toggle instead of the plain read-only name. */}\n {isDraft ? (\n <ViewerDraftTitle documentId={documentId} />\n ) : (\n <ViewerTitle\n title={documentTitle}\n versionLabel={currentVersionLabel}\n shrink={!!liveKind || isCompact}\n />\n )}\n {/* The narrow header's Share is icon-only, so the state is spelled out here as text. */}\n {isCompact && !isDraft && documentData?.shared && (\n <ViewerStatusNote testId=\"document-shared-status\">\n Shared with the workspace\n </ViewerStatusNote>\n )}\n {/* Likewise \"Show original\" is a bare page icon there: say which view is on screen. */}\n {isCompact &&\n activeTab === 'pdf' &&\n pdfBlob &&\n markup.hasMarkup &&\n !annotating &&\n !placingSignature && (\n <MarkupViewNote\n showOriginal={markup.showOriginal}\n onToggle={() => markup.setShowOriginal((on) => !on)}\n />\n )}\n {/* Related documents, except during a comparison (its own row says which). */}\n {!isComparing && !liveKind && documentData && (\n <ViewerRelatedDocuments document={documentData} />\n )}\n {isStreaming && <ViewerStatusNote pulse>streaming...</ViewerStatusNote>}\n {/* Nothing is generating: this document simply does not exist on the backend yet. */}\n {isDraft && (\n <ViewerStatusNote testId=\"draft-unsaved-indicator\">Draft — not saved</ViewerStatusNote>\n )}\n {signatureStatus?.signed && (\n <SignatureStatus status={signatureStatus} formatDate={formatDate} />\n )}\n </>\n )\n\n const leftContent = (\n <ViewerHeaderStart>\n {isDraft ? (\n // A draft's kind replaces the tabs: neither Versions nor the text view means anything\n // before the first save.\n <ViewerDraftKind documentId={documentId} />\n ) : (\n <ViewerTabBar tabs={viewerTabs} activeId={activeTab} onChange={handleTabChange} />\n )}\n {!isCompact && titleBlock}\n </ViewerHeaderStart>\n )\n\n const annotatable = canAnnotate({\n activeTab,\n hasPdf: !!pdfBlob,\n isImage,\n isVideo,\n isAudio,\n isDownloadOnly,\n isDraft,\n isStreaming,\n isSnapshot: !!snapshotDocumentId,\n isComparing,\n })\n\n // A request waiting for this user's signature, or their own in flight: shown over the PDF and\n // the Word editor alike; signing happens on the PDF.\n const signatureBanner = !isDraft && !liveKind && !snapshotDocumentId && (\n <SignatureRequestBanner\n documentId={documentId}\n hidden={!!signatureFlow}\n onSign={(request) => {\n setAnnotating(false)\n setPlacingSignature(false)\n if (activeTab !== 'pdf') handleTabChange('pdf')\n setSignatureFlow({ kind: 'sign', request })\n }}\n onEditDraft={(draft) => {\n if (activeTab !== 'pdf') handleTabChange('pdf')\n setSignatureFlow({ kind: 'prepare', draft })\n }}\n />\n )\n\n const share = () => {\n const name = (liveKind ? documentTitle : documentData?.file_name) || undefined\n if (support.share) {\n support.share({ id: documentId, name, isPrivate: !documentData?.shared })\n return\n }\n void arbi.documents\n .update([{ external_id: documentId, shared: !documentData?.shared }])\n .then(() => tools.onDocumentsChanged?.([documentId], 'markup'))\n .catch(() => notify(\"Couldn't change who can see this document\", 'error'))\n }\n const shownRef = snapshotDocumentId || documentId\n\n const rightContent = (\n <ViewerHeaderEnd isCompact={isCompact}>\n {/* Annotate: only for a PDF on screen (text and Word files are shown as a PDF too). Marks\n sit in a layer beside the document; Freeze saves a separate copy with them built in. */}\n {annotatable && (\n <AnnotateButton\n active={annotating}\n compact={isCompact}\n onClick={() => {\n setPlacingSignature(false)\n markup.setShowOriginal(false)\n setAnnotating((on) => !on)\n }}\n />\n )}\n {/* The markup is the default view; \"Show original\" shows the untouched file. */}\n {activeTab === 'pdf' && pdfBlob && !placingSignature && (markup.hasMarkup || annotating) && (\n <ShowOriginalButton\n active={markup.showOriginal}\n compact={isCompact}\n onClick={() => {\n setAnnotating(false)\n markup.setShowOriginal((on) => !on)\n }}\n />\n )}\n {activeTab === 'pdf' && markup.hasMarkup && !annotating && (\n <DownloadMarkupButton\n onClick={() => void markup.downloadMarkup()}\n // A signed version is locked: Download serves the signed file as it is.\n disabledReason={isSigned ? SIGNED_LOCKED_REASON : undefined}\n />\n )}\n {/* Image actions: start a generation from this image, or crop it into a new document. */}\n {activeTab === 'pdf' && isImage && pdfBlob && (\n <ViewerImageActions\n compact={isCompact}\n onUseAsReference={\n support.useImageAsReference ? () => support.useImageAsReference!(documentId) : undefined\n }\n onCrop={crop.handleOpenCrop}\n />\n )}\n {/* The thread it was made in: open it at the answer that made it. */}\n {madeIn && (\n <Button\n type=\"button\"\n variant=\"outline\"\n size={isCompact ? 'icon' : 'sm'}\n onClick={() =>\n openConversation(madeIn.id, {\n messageId: documentData?.source_message_ext_id ?? undefined,\n })\n }\n title={`Open the thread it was made in: ${madeIn.title}`}\n aria-label={`Open the thread it was made in: ${madeIn.title}`}\n data-testid=\"document-open-thread\"\n >\n <MessageSquare className=\"size-4\" />\n {!isCompact && <span className=\"max-w-[10rem] truncate\">{madeIn.title}</span>}\n </Button>\n )}\n {documentId && documentData && !isDraft && !isStreaming && (\n <>\n <Button\n type=\"button\"\n variant=\"outline\"\n size=\"sm\"\n onClick={() => setSharingFile(true)}\n data-testid=\"share-file-button\"\n >\n Share file\n </Button>\n <FileShareDialog\n open={sharingFile}\n onOpenChange={setSharingFile}\n documentId={documentId}\n version={pdfSnapshotNumber ?? documentData.current_version ?? 1}\n />\n </>\n )}\n {/* Chat about this document: the thread bound to it (its questions edit it), the latest one\n or a new one. Only such a thread drafts in a document: one merely open binds no chat. */}\n {doc.savedDocumentId && !snapshotDocumentId && (\n <Button\n type=\"button\"\n variant=\"outline\"\n size={isCompact ? 'icon' : 'sm'}\n onClick={chatAboutDocument}\n title=\"Chat about this document: a thread that works in it, with edits as tracked changes\"\n aria-label=\"Chat about this document\"\n data-testid=\"document-chat-about\"\n className=\"pointer-coarse:min-h-11\"\n >\n <MessageSquarePlus className=\"size-4\" />\n {!isCompact && <span className=\"ml-1\">Chat</span>}\n </Button>\n )}\n {/* Share always asks first (the host's share dialog), so a click never changes who can see\n the file by surprise. */}\n {documentId && doc.workspaceId && (\n <ShareControl\n state={documentData?.shared ? 'shared' : 'private'}\n onToggle={share}\n disabled={!canChangeVisibility(documentData, currentUserId)}\n disabledTooltip=\"Only the owner can change visibility\"\n tooltip={\n documentData?.shared\n ? 'Shared with the workspace — click to share with specific people'\n : 'Share with the workspace, then optionally notify specific people by email'\n }\n variant=\"outline\"\n compact={isCompact}\n showState={!isCompact}\n labels={{\n shared: getEntityLabel('WORKSPACE'),\n private: 'Only you',\n mixed: 'Partly shared',\n }}\n testId=\"share-document-button\"\n stateTestId=\"document-title-shared-indicator\"\n />\n )}\n {/* Email: the host's mail composer with the document on screen attached. The divider keeps\n it apart from Share, which changes who can see the file rather than sending it. */}\n {tools.emailDocument && !isDraft && !isStreaming && documentData?.file_name && (\n <>\n <span className=\"mx-1 h-5 w-px bg-border\" aria-hidden=\"true\" />\n <Button\n type=\"button\"\n variant=\"outline\"\n size={isCompact ? 'icon' : 'sm'}\n title=\"Email this document\"\n aria-label=\"Email\"\n data-testid=\"email-document-button\"\n className=\"pointer-coarse:min-h-11\"\n onClick={() => tools.emailDocument?.(shownRef)}\n >\n <Mail className=\"size-4\" />\n {!isCompact && <span className=\"ml-1\">Email</span>}\n </Button>\n </>\n )}\n {/* Translate: a new, editable document with the original and translation side by side. */}\n {support.translate &&\n !isDraft &&\n !isStreaming &&\n !liveKind &&\n !isImage &&\n documentData?.file_name && (\n <Button\n type=\"button\"\n variant=\"outline\"\n size={isCompact ? 'icon' : 'sm'}\n title=\"Translate into another language: a new editable document, original and translation side by side\"\n aria-label=\"Translate\"\n data-testid=\"translate-document-button\"\n className=\"pointer-coarse:min-h-11\"\n onClick={() => support.translate!(shownRef)}\n >\n <Languages className=\"size-4\" />\n {!isCompact && <span className=\"ml-1\">Translate</span>}\n </Button>\n )}\n {/* Finalise (a translation): its current version saved as a new labelled PDF. */}\n {!isStreaming && !snapshotDocumentId && (\n <FinaliseTranslationButton document={documentData ?? undefined} isCompact={isCompact} />\n )}\n {/* Every signing action starts in one menu: sign yourself, save/place a mark, or request\n signatures from others. */}\n {annotatable && (\n <DropdownMenu>\n <DropdownMenuTrigger asChild>\n <Button\n type=\"button\"\n variant={\n placingSignature || signatureFlow?.kind === 'prepare' ? 'default' : 'outline'\n }\n size={isCompact ? 'icon' : 'sm'}\n aria-label=\"Sign\"\n title=\"Sign or request signatures\"\n data-testid=\"signing-menu-trigger\"\n className=\"pointer-coarse:min-h-11\"\n >\n <PenLine className=\"size-4\" />\n {!isCompact && <span className=\"ml-1\">Sign</span>}\n <ChevronDown className=\"ml-1 size-3\" />\n </Button>\n </DropdownMenuTrigger>\n <DropdownMenuContent align=\"end\" forceMount>\n <DropdownMenuItem\n data-testid=\"sign-document-button\"\n onSelect={() => {\n setAnnotating(false)\n if (isSigned) {\n setSignatureFlow(null)\n setPlacingSignature((on) => !on)\n } else {\n setPlacingSignature(false)\n setSignatureFlow({ kind: 'prepare', self: true })\n }\n }}\n >\n <PenLine className=\"mr-2 size-4\" /> Sign this document\n </DropdownMenuItem>\n {!isSigned && (\n <>\n <PlaceMySignatureMenuItems\n onPlace={(mark) => {\n setPlacingSignature(false)\n setSignatureFlow(null)\n markup.setShowOriginal(false)\n setAnnotating(true)\n setPlaceMark({ ...mark, key: Date.now() })\n }}\n />\n <DropdownMenuItem\n data-testid=\"request-signatures-button\"\n onSelect={() => {\n setAnnotating(false)\n setPlacingSignature(false)\n setSignatureFlow(signatureFlow?.kind === 'prepare' ? null : { kind: 'prepare' })\n }}\n >\n <Users className=\"mr-2 size-4\" /> Ask someone to sign\n </DropdownMenuItem>\n </>\n )}\n </DropdownMenuContent>\n </DropdownMenu>\n )}\n {isSignOpen && pdfBlob && (\n <SignDocumentDialog\n open={isSignOpen}\n onOpenChange={setIsSignOpen}\n documentId={documentId}\n pdfBlob={pdfBlob}\n // The PDF on screen is the current version's (an earlier one cannot be signed): the\n // server refuses if another version has landed since.\n version={documentData?.current_version ?? undefined}\n appearance={signAppearance}\n />\n )}\n {headerActions}\n </ViewerHeaderEnd>\n )\n\n const viewerProps = {\n currentPage: viewingDocumentPage || undefined,\n onLoadSuccess: handleLoadSuccess,\n scrollTrigger,\n zoom,\n onZoomChange: setZoom,\n }\n\n return (\n <ViewerFrame\n frameRef={containerRef}\n contentId={documentId}\n header={\n <>\n <TabHeader\n tabs={[]}\n activeTabId={activeTab}\n onTabChange={handleTabChange}\n leftContent={leftContent}\n rightContent={rightContent}\n variant=\"underline\"\n />\n {isCompact && !isCoEditing && (\n <div data-slot=\"viewer-title-row\" className=\"flex min-w-0 items-center gap-2 px-3 pb-2\">\n {titleBlock}\n </div>\n )}\n {/* In the sticky header, not the content area: the PDF view scrolls its first page into\n view, which scrolls a bar above it out of sight. */}\n {snapshotDocumentId && (\n <VersionSnapshotBar\n versionNumber={snapshotNumber}\n live={isDocx || isArtifact}\n onAsk={\n support.askAboutVersion\n ? () => support.askAboutVersion!(snapshotDocumentId)\n : undefined\n }\n onReturn={() => setSnapshotDocumentId(null)}\n />\n )}\n </>\n }\n compareRow={isComparing ? compareIndicator || undefined : undefined}\n footer={\n // Crop to a new document. Full resolution (no maxSize): a crop frames, it never downscales.\n <ImageCropModal\n open={crop.cropImageUrl !== null}\n image={crop.cropImageUrl}\n title=\"Crop image\"\n saveLabel=\"Save as a copy\"\n aspectOptions={DEFAULT_ASPECT_OPTIONS}\n output={{ mimeType: 'image/png' }}\n onComplete={crop.handleCropComplete}\n onCancel={crop.closeCrop}\n />\n }\n >\n {isComparing && (\n <Suspense fallback={<ViewerMessage>Loading comparison…</ViewerMessage>}>\n <NativeDocxComparison\n baseId={compareDocumentId!}\n revisedId={documentId}\n title={documentTitle}\n />\n </Suspense>\n )}\n {/* A capture draft (photo/video/audio) has no backend document at all until it is saved:\n its recorder takes over the whole content area. */}\n {isCaptureDraft && <ViewerCaptureDraft documentId={documentId} />}\n\n {/* Media stay mounted (hidden) on the text tab, so playback goes on while reading the\n transcript. */}\n {!isCaptureDraft &&\n (activeTab === 'pdf' || (isMedia && activeTab === 'html')) &&\n !isArtifact &&\n !isComparing && (\n <ViewerPane hidden={activeTab !== 'pdf'}>\n {/* The labels are the document's, whichever view it is read in: the PDF gets the\n chips without the passage stepper (no parsed passages to walk here). */}\n <DocumentLabelBar summaries={labelSummaries} />\n {!isMedia && !isImage && signatureBanner}\n {activeTab === 'pdf' && !isMedia && !isImage && (\n <MarkupNotices\n legacyPrompt={markup.legacyPrompt}\n olderNote={markup.olderNote}\n onOpenVersion={(n) => setSnapshotDocumentId(`${documentId}@v${n}`)}\n />\n )}\n <ViewerControlBar controls={activeTab === 'pdf' && pageNav}>\n <ViewerPdfPane\n documentId={documentId}\n doc={doc}\n pdfBlob={pdfBlob}\n isPdfLoading={blobs.isPdfLoading}\n pdfError={blobs.pdfError}\n onDownload={() => void handleDirectDownload()}\n viewerProps={viewerProps}\n signatureFlow={signatureFlow}\n onSignatureFlow={setSignatureFlow}\n currentUserId={currentUserId}\n placingSignature={placingSignature}\n onPlacingDone={(appearance) => {\n setPlacingSignature(false)\n if (!appearance) return\n setSignAppearance(appearance)\n setIsSignOpen(true)\n }}\n annotating={annotating}\n markup={markup}\n pdfSnapshotNumber={pdfSnapshotNumber}\n isSigned={isSigned}\n placeMark={placeMark}\n />\n </ViewerControlBar>\n </ViewerPane>\n )}\n\n {activeTab === 'preview' && isArtifact && liveKind && (\n // The preview loads its JSX compiler on first use, so it stays out of the main bundle.\n <ArtifactPreview\n kind={liveKind}\n source={liveSource}\n isStreaming={isStreaming}\n runtimeUrl={artifactRuntimeUrl}\n />\n )}\n\n {activeTab === 'edit' && isArtifact && liveKind && (\n <ArtifactCodeView source={liveSource} fileName={documentData?.file_name ?? undefined} />\n )}\n\n {/* A document draft is stored as DOCX: once generation ends the Word editor opens the stored\n document. Only a draft still being generated shows the streamed preview. */}\n {activeTab === 'edit' && isArtifact && !liveKind && !isStreaming && !isComparing && (\n <Suspense fallback={<ViewerMessage>Loading editor…</ViewerMessage>}>\n {isSigned && !snapshotDocumentId && <SignedEditNote />}\n <NativeDocxEditor\n key={`${snapshotDocumentId || documentId}-${snapshotDocumentId ? 'snapshot' : 'live'}`}\n documentId={snapshotDocumentId || documentId}\n title={documentTitle}\n draftContent={isDraft ? draftDoc?.content || '' : undefined}\n snapshot={!!snapshotDocumentId}\n onSaved={(id) => {\n if (!isDraft) return\n session.clearDraftDocument(documentId)\n setViewingDocumentId(id)\n }}\n />\n </Suspense>\n )}\n\n {activeTab === 'versions' && (isArtifact || isDocx || hasHistory) && !isComparing && (\n <VersionTimeline\n // Each version made in a thread names it and opens it at the turn that made it.\n versions={versions.map((v) => ({\n ...v,\n madeIn: v.thread\n ? {\n label: threadTitle(v.thread.conversationId),\n onOpen: () =>\n openConversation(v.thread!.conversationId, {\n messageId: v.thread!.messageId ?? undefined,\n }),\n }\n : null,\n }))}\n currentId={currentVersionId}\n live={!!liveKind}\n // An uploaded file is not a draft: its versions come from replacing, editing or signing.\n labels={isArtifact ? undefined : { emptyDocument: UPLOADED_NO_VERSIONS }}\n formatDate={formatDate}\n onOpen={(id) => {\n // The current version is the live document itself, not a read-only copy of it.\n setSnapshotDocumentId(id === currentVersionId ? null : id)\n setActiveTab(isArtifact ? 'edit' : isDocx ? 'docx' : 'pdf')\n }}\n onCompare={(id) => session.setDocumentViewer({ compareId: id, tab: 'html' })}\n translations={translations}\n onOpenTranslation={(id) => setViewingDocumentId(id)}\n />\n )}\n\n {activeTab === 'xlsx' &&\n isXlsx &&\n (xlsxBlob ? (\n <XlsxViewer blob={xlsxBlob} />\n ) : (\n <ViewerMessage>\n {xlsxError ? 'Failed to load spreadsheet' : 'Loading spreadsheet...'}\n </ViewerMessage>\n ))}\n\n {activeTab === 'docx' && isDocx && !isComparing && (\n <Suspense fallback={<ViewerMessage>Loading editor…</ViewerMessage>}>\n {signatureBanner}\n {isSigned && !snapshotDocumentId && <SignedEditNote />}\n <NativeDocxEditor\n key={`${snapshotDocumentId || documentId}-${snapshotDocumentId ? 'snapshot' : 'live'}`}\n documentId={snapshotDocumentId || documentId}\n title={documentTitle}\n snapshot={!!snapshotDocumentId}\n />\n </Suspense>\n )}\n\n {streamingDoc &&\n isStreaming &&\n isArtifact &&\n !liveKind &&\n !isComparing &&\n (activeTab === 'html' || activeTab === 'edit') && (\n <Suspense fallback={<ViewerMessage>Opening draft…</ViewerMessage>}>\n <StreamedWordArtifact\n key={documentId}\n documentId={documentId.startsWith('doc-') ? documentId : undefined}\n title={documentTitle}\n content={streamingDoc.content}\n busy={isStreaming}\n />\n </Suspense>\n )}\n\n {!isCaptureDraft &&\n !isComparing &&\n activeTab === 'html' &&\n !(isStreaming && isArtifact && !liveKind) && (\n <ViewerPane>\n <ViewerControlBar controls={pageNav}>\n <ParsedTextView\n documentId={pdfSnapshotId || documentId}\n onLoadSuccess={handleLoadSuccess}\n scrollTrigger={scrollTrigger}\n zoom={zoom}\n onZoomChange={setZoom}\n />\n </ViewerControlBar>\n </ViewerPane>\n )}\n </ViewerFrame>\n )\n}\n"]}
|