@arbidocs/blocks 0.5.119 → 0.5.121
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/ClippingMediaViewer-B6WG7Q64.cjs +156 -0
- package/dist/ClippingMediaViewer-B6WG7Q64.cjs.map +1 -0
- package/dist/ClippingPdfViewer-6GCVTV3V.cjs +79 -0
- package/dist/ClippingPdfViewer-6GCVTV3V.cjs.map +1 -0
- package/dist/{ConnectedCallDock-WER7R222.cjs → ConnectedCallDock-DC5V5OUJ.cjs} +25 -23
- package/dist/ConnectedCallDock-DC5V5OUJ.cjs.map +1 -0
- package/dist/{ConnectedCallRoom-T7OBQTYP.cjs → ConnectedCallRoom-FQLXWTFB.cjs} +18 -16
- package/dist/{ConnectedCallRoom-T7OBQTYP.cjs.map → ConnectedCallRoom-FQLXWTFB.cjs.map} +1 -1
- package/dist/{ConnectedNativeDocxComparison-546ILGLW.cjs → ConnectedNativeDocxComparison-4Q5S7VLD.cjs} +17 -17
- package/dist/{ConnectedNativeDocxComparison-546ILGLW.cjs.map → ConnectedNativeDocxComparison-4Q5S7VLD.cjs.map} +1 -1
- package/dist/ConnectedPresentation-4HLDZDWV.cjs +183 -0
- package/dist/ConnectedPresentation-4HLDZDWV.cjs.map +1 -0
- package/dist/{ConnectedProductionSetDialog-LHB4VQWC.cjs → ConnectedProductionSetDialog-4EAY6KAZ.cjs} +3 -3
- package/dist/{ConnectedProductionSetDialog-LHB4VQWC.cjs.map → ConnectedProductionSetDialog-4EAY6KAZ.cjs.map} +1 -1
- package/dist/ConnectedSlidesTab-7QDE2CZD.cjs +234 -0
- package/dist/ConnectedSlidesTab-7QDE2CZD.cjs.map +1 -0
- package/dist/{ConnectedStreamedWordArtifact-S2ZFZLZQ.cjs → ConnectedStreamedWordArtifact-FFOQJBOI.cjs} +17 -17
- package/dist/{ConnectedStreamedWordArtifact-S2ZFZLZQ.cjs.map → ConnectedStreamedWordArtifact-FFOQJBOI.cjs.map} +1 -1
- package/dist/{DocumentReviewCard-ZSBZBGFK.cjs → DocumentReviewCard-SNWVEZ7S.cjs} +19 -18
- package/dist/DocumentReviewCard-SNWVEZ7S.cjs.map +1 -0
- package/dist/{FilesViewerDialog-6UKR5WEF.cjs → FilesViewerDialog-IZI63FOV.cjs} +54 -47
- package/dist/FilesViewerDialog-IZI63FOV.cjs.map +1 -0
- package/dist/{GridViewImpl-ZMJJWTOM.cjs → GridViewImpl-LTYET77Q.cjs} +3 -3
- package/dist/GridViewImpl-LTYET77Q.cjs.map +1 -0
- package/dist/{WorkspaceTableView-J3C6VH4T.cjs → WorkspaceTableView-TEIRB6VJ.cjs} +11 -10
- package/dist/WorkspaceTableView-TEIRB6VJ.cjs.map +1 -0
- package/dist/agents/index.cjs +297 -297
- package/dist/agents/tasks/ConversationListView.js +10 -2
- package/dist/agents/tasks/ConversationListView.js.map +2 -2
- package/dist/agents/tasks/TaskTable.js +5 -4
- package/dist/agents/tasks/TaskTable.js.map +2 -2
- package/dist/agents/tasks/WorkflowsTable.js +4 -5
- package/dist/agents/tasks/WorkflowsTable.js.map +2 -2
- package/dist/agents/tasks/taskColumns.js +1 -1
- package/dist/agents/tasks/taskColumns.js.map +1 -1
- package/dist/agents/tasks/taskTableLabels.js +1 -1
- package/dist/agents/tasks/taskTableLabels.js.map +1 -1
- package/dist/agents/tasks/workflowTableLabels.js +1 -1
- package/dist/agents/tasks/workflowTableLabels.js.map +1 -1
- package/dist/{ai-IM4A23YT.cjs → ai-KBYNRNZ6.cjs} +28 -26
- package/dist/ai-KBYNRNZ6.cjs.map +1 -0
- package/dist/calls/connected/CallControls.d.ts +2 -0
- package/dist/calls/connected/CallControls.js +71 -9
- package/dist/calls/connected/CallControls.js.map +2 -2
- package/dist/calls/connected/ShareDocumentDialog.d.ts +14 -0
- package/dist/calls/connected/ShareDocumentDialog.js +77 -0
- package/dist/calls/connected/ShareDocumentDialog.js.map +7 -0
- package/dist/calls/index.cjs +121 -121
- package/dist/chat/index.cjs +9 -8
- package/dist/{chunk-T23UTIRI.cjs → chunk-2PZT3J34.cjs} +6 -6
- package/dist/{chunk-T23UTIRI.cjs.map → chunk-2PZT3J34.cjs.map} +1 -1
- package/dist/{chunk-SGYSDABK.cjs → chunk-2W5E62EY.cjs} +6 -6
- package/dist/{chunk-SGYSDABK.cjs.map → chunk-2W5E62EY.cjs.map} +1 -1
- package/dist/{chunk-TDO5UWXF.cjs → chunk-3SCNXNHI.cjs} +5 -5
- package/dist/{chunk-TDO5UWXF.cjs.map → chunk-3SCNXNHI.cjs.map} +1 -1
- package/dist/{chunk-KTQOGT2L.cjs → chunk-474GPLCM.cjs} +7 -7
- package/dist/{chunk-KTQOGT2L.cjs.map → chunk-474GPLCM.cjs.map} +1 -1
- package/dist/{chunk-TP5PGWIO.cjs → chunk-4IOYQLKG.cjs} +3 -3
- package/dist/{chunk-TP5PGWIO.cjs.map → chunk-4IOYQLKG.cjs.map} +1 -1
- package/dist/{chunk-NY3YUCOW.cjs → chunk-4NPCDS2X.cjs} +3 -3
- package/dist/{chunk-NY3YUCOW.cjs.map → chunk-4NPCDS2X.cjs.map} +1 -1
- package/dist/{chunk-CPG7II4E.cjs → chunk-4RBQ44RY.cjs} +28 -28
- package/dist/chunk-4RBQ44RY.cjs.map +1 -0
- package/dist/{chunk-BQ5RIWWT.cjs → chunk-4VZZWYEC.cjs} +3 -3
- package/dist/{chunk-BQ5RIWWT.cjs.map → chunk-4VZZWYEC.cjs.map} +1 -1
- package/dist/{chunk-Y24V6HPR.cjs → chunk-52KGMAO5.cjs} +15 -15
- package/dist/{chunk-Y24V6HPR.cjs.map → chunk-52KGMAO5.cjs.map} +1 -1
- package/dist/{chunk-HB2O4THB.cjs → chunk-5534FYXP.cjs} +4 -4
- package/dist/{chunk-HB2O4THB.cjs.map → chunk-5534FYXP.cjs.map} +1 -1
- package/dist/chunk-5GCCUXMT.cjs +63 -0
- package/dist/chunk-5GCCUXMT.cjs.map +1 -0
- package/dist/chunk-5LTIZ44D.cjs +95 -0
- package/dist/chunk-5LTIZ44D.cjs.map +1 -0
- package/dist/{chunk-YGXOKB5Z.cjs → chunk-734NPQNR.cjs} +4 -4
- package/dist/{chunk-YGXOKB5Z.cjs.map → chunk-734NPQNR.cjs.map} +1 -1
- package/dist/{chunk-SB4M3ITT.cjs → chunk-7VUJGHMY.cjs} +444 -100
- package/dist/chunk-7VUJGHMY.cjs.map +1 -0
- package/dist/chunk-AFQTQC7A.cjs +35 -0
- package/dist/chunk-AFQTQC7A.cjs.map +1 -0
- package/dist/{chunk-XKVPSOKP.cjs → chunk-AY6EZSZB.cjs} +4 -4
- package/dist/{chunk-XKVPSOKP.cjs.map → chunk-AY6EZSZB.cjs.map} +1 -1
- package/dist/{chunk-TT4IF52H.cjs → chunk-BVAT4EVC.cjs} +40 -41
- package/dist/chunk-BVAT4EVC.cjs.map +1 -0
- package/dist/{chunk-VGCTYTEW.cjs → chunk-C2OICDMI.cjs} +10 -10
- package/dist/{chunk-VGCTYTEW.cjs.map → chunk-C2OICDMI.cjs.map} +1 -1
- package/dist/{chunk-CPR6EHG7.cjs → chunk-DR2AH7JL.cjs} +179 -55
- package/dist/chunk-DR2AH7JL.cjs.map +1 -0
- package/dist/{chunk-NJCK6V6U.cjs → chunk-EATIFPKP.cjs} +4 -60
- package/dist/chunk-EATIFPKP.cjs.map +1 -0
- package/dist/{chunk-B3LZITVF.cjs → chunk-EHP6OH5D.cjs} +11 -451
- package/dist/chunk-EHP6OH5D.cjs.map +1 -0
- package/dist/{chunk-DDIW4HLU.cjs → chunk-ENGL7P3I.cjs} +46 -37
- package/dist/chunk-ENGL7P3I.cjs.map +1 -0
- package/dist/{chunk-QHOHDNBU.cjs → chunk-FKFQCK3C.cjs} +4 -4
- package/dist/{chunk-QHOHDNBU.cjs.map → chunk-FKFQCK3C.cjs.map} +1 -1
- package/dist/{chunk-6UTKM5AB.cjs → chunk-GKVE5JGB.cjs} +76 -76
- package/dist/chunk-GKVE5JGB.cjs.map +1 -0
- package/dist/{chunk-B2HNNG25.cjs → chunk-GPX5VC57.cjs} +50 -50
- package/dist/{chunk-B2HNNG25.cjs.map → chunk-GPX5VC57.cjs.map} +1 -1
- package/dist/{chunk-WAV762GP.cjs → chunk-GQXPNIRE.cjs} +6 -6
- package/dist/{chunk-WAV762GP.cjs.map → chunk-GQXPNIRE.cjs.map} +1 -1
- package/dist/chunk-GX2EBMJW.cjs +133 -0
- package/dist/chunk-GX2EBMJW.cjs.map +1 -0
- package/dist/{chunk-7OPOPYV6.cjs → chunk-H5OLHP2U.cjs} +3 -3
- package/dist/{chunk-7OPOPYV6.cjs.map → chunk-H5OLHP2U.cjs.map} +1 -1
- package/dist/chunk-HYUKPHCT.cjs +66 -0
- package/dist/chunk-HYUKPHCT.cjs.map +1 -0
- package/dist/{chunk-NNUK5ZM7.cjs → chunk-JQLWKNJO.cjs} +29 -27
- package/dist/chunk-JQLWKNJO.cjs.map +1 -0
- package/dist/{chunk-OEREKAAP.cjs → chunk-JZEYHDWJ.cjs} +75 -75
- package/dist/{chunk-OEREKAAP.cjs.map → chunk-JZEYHDWJ.cjs.map} +1 -1
- package/dist/{chunk-PGJYD67F.cjs → chunk-KNGZZC4O.cjs} +7 -6
- package/dist/chunk-KNGZZC4O.cjs.map +1 -0
- package/dist/{chunk-NIE3N6OM.cjs → chunk-KP5AITQ4.cjs} +10 -10
- package/dist/{chunk-NIE3N6OM.cjs.map → chunk-KP5AITQ4.cjs.map} +1 -1
- package/dist/{chunk-YYPZOEED.cjs → chunk-LHWOKOMP.cjs} +23 -2
- package/dist/chunk-LHWOKOMP.cjs.map +1 -0
- package/dist/{chunk-57NHXEU2.cjs → chunk-MXBXZXXQ.cjs} +5 -5
- package/dist/{chunk-57NHXEU2.cjs.map → chunk-MXBXZXXQ.cjs.map} +1 -1
- package/dist/{chunk-WXUU3COI.cjs → chunk-MZ2KZXNU.cjs} +3 -3
- package/dist/{chunk-WXUU3COI.cjs.map → chunk-MZ2KZXNU.cjs.map} +1 -1
- package/dist/chunk-NAJN32MF.cjs +154 -0
- package/dist/chunk-NAJN32MF.cjs.map +1 -0
- package/dist/{chunk-557MJ4IH.cjs → chunk-NLOETJCB.cjs} +17 -154
- package/dist/chunk-NLOETJCB.cjs.map +1 -0
- package/dist/{chunk-4XJEHKVZ.cjs → chunk-PIYYBPHH.cjs} +4 -4
- package/dist/{chunk-4XJEHKVZ.cjs.map → chunk-PIYYBPHH.cjs.map} +1 -1
- package/dist/chunk-Q3XJUXID.cjs +4774 -0
- package/dist/chunk-Q3XJUXID.cjs.map +1 -0
- package/dist/{chunk-325GVZE6.cjs → chunk-Q6DQGGP4.cjs} +3 -3
- package/dist/{chunk-325GVZE6.cjs.map → chunk-Q6DQGGP4.cjs.map} +1 -1
- package/dist/chunk-QFXILJMJ.cjs +458 -0
- package/dist/chunk-QFXILJMJ.cjs.map +1 -0
- package/dist/{chunk-R7CJEIA5.cjs → chunk-RYVZDFVO.cjs} +8 -9
- package/dist/chunk-RYVZDFVO.cjs.map +1 -0
- package/dist/{chunk-VLCY46K6.cjs → chunk-TG2GM7WJ.cjs} +4 -3
- package/dist/chunk-TG2GM7WJ.cjs.map +1 -0
- package/dist/{chunk-EOG6OT5I.cjs → chunk-TXP2N3DC.cjs} +4 -4
- package/dist/{chunk-EOG6OT5I.cjs.map → chunk-TXP2N3DC.cjs.map} +1 -1
- package/dist/{chunk-KXIRVKCJ.cjs → chunk-UUENH4BJ.cjs} +3 -3
- package/dist/{chunk-KXIRVKCJ.cjs.map → chunk-UUENH4BJ.cjs.map} +1 -1
- package/dist/chunk-VJ5ZLRBD.cjs +27 -0
- package/dist/chunk-VJ5ZLRBD.cjs.map +1 -0
- package/dist/{chunk-P77YTTJ3.cjs → chunk-W6B3RYTX.cjs} +4 -4
- package/dist/{chunk-P77YTTJ3.cjs.map → chunk-W6B3RYTX.cjs.map} +1 -1
- package/dist/chunk-WOOOMTTA.cjs +19 -0
- package/dist/chunk-WOOOMTTA.cjs.map +1 -0
- package/dist/{chunk-ZPPMAL5P.cjs → chunk-WQMR3O2D.cjs} +6 -10
- package/dist/chunk-WQMR3O2D.cjs.map +1 -0
- package/dist/{chunk-CJYWHUZR.cjs → chunk-XCKHOXRP.cjs} +4 -4
- package/dist/{chunk-CJYWHUZR.cjs.map → chunk-XCKHOXRP.cjs.map} +1 -1
- package/dist/{chunk-6WMMZLEV.cjs → chunk-XJEXFEWG.cjs} +2 -27
- package/dist/chunk-XJEXFEWG.cjs.map +1 -0
- package/dist/chunk-XK4TVJKD.cjs +73 -0
- package/dist/chunk-XK4TVJKD.cjs.map +1 -0
- package/dist/chunk-XTR26TNE.cjs +1358 -0
- package/dist/chunk-XTR26TNE.cjs.map +1 -0
- package/dist/{chunk-E7TE2WVT.cjs → chunk-ZVEW3JBT.cjs} +3 -3
- package/dist/{chunk-E7TE2WVT.cjs.map → chunk-ZVEW3JBT.cjs.map} +1 -1
- package/dist/collaboration/index.cjs +73 -73
- package/dist/collaboration/sharing/ShareControl.js +10 -2
- package/dist/collaboration/sharing/ShareControl.js.map +2 -2
- package/dist/components/SharedCell.d.ts +2 -4
- package/dist/components/SharedCell.js +4 -8
- package/dist/components/SharedCell.js.map +2 -2
- package/dist/components/ZoomSlider.d.ts +25 -0
- package/dist/components/ZoomSlider.js +59 -0
- package/dist/components/ZoomSlider.js.map +7 -0
- package/dist/connect/docx.cjs +20 -20
- package/dist/connect/index.cjs +1210 -1264
- package/dist/connect/index.cjs.map +1 -1
- package/dist/connect/viewer.cjs +42 -36
- package/dist/connection/ai.d.ts +1 -1
- package/dist/connection/facts/factPageColumns.js +3 -9
- package/dist/connection/facts/factPageColumns.js.map +2 -2
- package/dist/connection/files/ConnectedNewFileMenu.d.ts +2 -1
- package/dist/connection/files/ConnectedNewFileMenu.js +9 -3
- package/dist/connection/files/ConnectedNewFileMenu.js.map +2 -2
- package/dist/connection/files/explorer/ConnectedFilesExplorer.js +1 -1
- package/dist/connection/files/explorer/ConnectedFilesExplorer.js.map +2 -2
- package/dist/connection/files/explorer/FileTiles.js +1 -1
- package/dist/connection/files/explorer/FileTiles.js.map +2 -2
- package/dist/connection/files/fields/documentField.js +1 -1
- package/dist/connection/files/fields/documentField.js.map +2 -2
- package/dist/connection/files/grid/cells.js +1 -3
- package/dist/connection/files/grid/cells.js.map +2 -2
- package/dist/connection/files/grid/documentColumns.js +4 -3
- package/dist/connection/files/grid/documentColumns.js.map +2 -2
- package/dist/connection/files/page/DocumentsFilterBarActions.js +17 -28
- package/dist/connection/files/page/DocumentsFilterBarActions.js.map +2 -2
- package/dist/connection/mail/useMailboxDefaults.js +1 -1
- package/dist/connection/mail/useMailboxDefaults.js.map +2 -2
- package/dist/connection/panels/useSessionPanelMode.js +3 -2
- package/dist/connection/panels/useSessionPanelMode.js.map +2 -2
- package/dist/connection/presentation/ClippingMediaViewer.d.ts +12 -0
- package/dist/connection/presentation/ClippingMediaViewer.js +153 -0
- package/dist/connection/presentation/ClippingMediaViewer.js.map +7 -0
- package/dist/connection/presentation/ClippingPdfViewer.d.ts +22 -0
- package/dist/connection/presentation/ClippingPdfViewer.js +75 -0
- package/dist/connection/presentation/ClippingPdfViewer.js.map +7 -0
- package/dist/connection/presentation/ConnectedPresentation.d.ts +12 -0
- package/dist/connection/presentation/ConnectedPresentation.js +100 -0
- package/dist/connection/presentation/ConnectedPresentation.js.map +7 -0
- package/dist/connection/presentation/ConnectedSlidesTab.d.ts +20 -0
- package/dist/connection/presentation/ConnectedSlidesTab.js +220 -0
- package/dist/connection/presentation/ConnectedSlidesTab.js.map +7 -0
- package/dist/connection/presentation/CropClipDialog.d.ts +11 -0
- package/dist/connection/presentation/CropClipDialog.js +86 -0
- package/dist/connection/presentation/CropClipDialog.js.map +7 -0
- package/dist/connection/presentation/GenerateTile.d.ts +4 -0
- package/dist/connection/presentation/GenerateTile.js +24 -0
- package/dist/connection/presentation/GenerateTile.js.map +7 -0
- package/dist/connection/presentation/LabelColumnMenu.d.ts +8 -0
- package/dist/connection/presentation/LabelColumnMenu.js +38 -0
- package/dist/connection/presentation/LabelColumnMenu.js.map +7 -0
- package/dist/connection/presentation/PresentationDialogs.d.ts +39 -0
- package/dist/connection/presentation/PresentationDialogs.js +295 -0
- package/dist/connection/presentation/PresentationDialogs.js.map +7 -0
- package/dist/connection/presentation/PresentationFileCard.d.ts +10 -0
- package/dist/connection/presentation/PresentationFileCard.js +35 -0
- package/dist/connection/presentation/PresentationFileCard.js.map +7 -0
- package/dist/connection/presentation/PresentationPill.d.ts +8 -0
- package/dist/connection/presentation/PresentationPill.js +44 -0
- package/dist/connection/presentation/PresentationPill.js.map +7 -0
- package/dist/connection/presentation/PresentationSlot.d.ts +7 -0
- package/dist/connection/presentation/PresentationSlot.js +35 -0
- package/dist/connection/presentation/PresentationSlot.js.map +7 -0
- package/dist/connection/presentation/requests.d.ts +16 -0
- package/dist/connection/presentation/requests.js +20 -0
- package/dist/connection/presentation/requests.js.map +7 -0
- package/dist/connection/presentation/useImageGeneration.d.ts +11 -0
- package/dist/connection/presentation/useImageGeneration.js +66 -0
- package/dist/connection/presentation/useImageGeneration.js.map +7 -0
- package/dist/connection/presentation/useLabelColumns.d.ts +15 -0
- package/dist/connection/presentation/useLabelColumns.js +33 -0
- package/dist/connection/presentation/useLabelColumns.js.map +7 -0
- package/dist/connection/presentation/usePresentationController.d.ts +15 -0
- package/dist/connection/presentation/usePresentationController.js +118 -0
- package/dist/connection/presentation/usePresentationController.js.map +7 -0
- package/dist/connection/presentation/usePresentationFiles.d.ts +44 -0
- package/dist/connection/presentation/usePresentationFiles.js +307 -0
- package/dist/connection/presentation/usePresentationFiles.js.map +7 -0
- package/dist/connection/presentation/useViewerClipping.d.ts +14 -0
- package/dist/connection/presentation/useViewerClipping.js +18 -0
- package/dist/connection/presentation/useViewerClipping.js.map +7 -0
- package/dist/connection/sharing/WorkspaceMembersList.d.ts +4 -0
- package/dist/connection/sharing/WorkspaceMembersList.js +34 -0
- package/dist/connection/sharing/WorkspaceMembersList.js.map +7 -0
- package/dist/connection/shell/ConnectedAppShell.js +9 -1
- package/dist/connection/shell/ConnectedAppShell.js.map +2 -2
- package/dist/connection/viewer/CleanViewControl.d.ts +8 -0
- package/dist/connection/viewer/CleanViewControl.js +76 -0
- package/dist/connection/viewer/CleanViewControl.js.map +7 -0
- package/dist/connection/viewer/ConnectedDocumentViewer.js +31 -31
- package/dist/connection/viewer/ConnectedDocumentViewer.js.map +2 -2
- package/dist/connection/viewer/ViewerCropModal.d.ts +5 -0
- package/dist/connection/viewer/ViewerCropModal.js +22 -0
- package/dist/connection/viewer/ViewerCropModal.js.map +7 -0
- package/dist/connection/viewer/ViewerPdfPane.d.ts +3 -1
- package/dist/connection/viewer/ViewerPdfPane.js +57 -2
- package/dist/connection/viewer/ViewerPdfPane.js.map +2 -2
- package/dist/connection/viewer/drafts.js +6 -4
- package/dist/connection/viewer/drafts.js.map +2 -2
- package/dist/connection/viewer/pdf/PdfPassageHighlights.d.ts +12 -0
- package/dist/connection/viewer/pdf/PdfPassageHighlights.js +36 -0
- package/dist/connection/viewer/pdf/PdfPassageHighlights.js.map +7 -0
- package/dist/connection/viewer/pdf/passageHighlights.d.ts +26 -0
- package/dist/connection/viewer/pdf/passageHighlights.js +40 -0
- package/dist/connection/viewer/pdf/passageHighlights.js.map +7 -0
- package/dist/connection/viewer/pdf/usePdfPassageHighlights.d.ts +9 -0
- package/dist/connection/viewer/pdf/usePdfPassageHighlights.js +47 -0
- package/dist/connection/viewer/pdf/usePdfPassageHighlights.js.map +7 -0
- package/dist/connection/viewer/shareDocument.d.ts +11 -0
- package/dist/connection/viewer/shareDocument.js +11 -0
- package/dist/connection/viewer/shareDocument.js.map +7 -0
- package/dist/connection/viewer/slidesTabChunk.d.ts +2 -0
- package/dist/connection/viewer/slidesTabChunk.js +9 -0
- package/dist/connection/viewer/slidesTabChunk.js.map +7 -0
- package/dist/connection/viewer/useCleanView.d.ts +14 -0
- package/dist/connection/viewer/useCleanView.js +29 -0
- package/dist/connection/viewer/useCleanView.js.map +7 -0
- package/dist/connection/viewer/useViewedDocument.d.ts +1 -0
- package/dist/connection/viewer/useViewedDocument.js +9 -1
- package/dist/connection/viewer/useViewedDocument.js.map +2 -2
- package/dist/connection/viewer/useViewerTabs.js +18 -4
- package/dist/connection/viewer/useViewerTabs.js.map +2 -2
- package/dist/connection/workflows/ConnectedWorkflowStart.d.ts +14 -2
- package/dist/connection/workflows/ConnectedWorkflowStart.js +5 -2
- package/dist/connection/workflows/ConnectedWorkflowStart.js.map +2 -2
- package/dist/connection/workflows/workflowsPageLabels.js +1 -1
- package/dist/connection/workflows/workflowsPageLabels.js.map +1 -1
- package/dist/dashboards/index.cjs +1 -1
- package/dist/databases/index.cjs +49 -49
- package/dist/document-tools/DocumentToolButtons.d.ts +2 -0
- package/dist/document-tools/DocumentToolButtons.js +22 -1
- package/dist/document-tools/DocumentToolButtons.js.map +2 -2
- package/dist/document-tools/index.cjs +16 -12
- package/dist/document-tools/index.d.ts +1 -1
- package/dist/document-tools/index.js +2 -0
- package/dist/document-tools/index.js.map +2 -2
- package/dist/embed/index.cjs +43 -41
- package/dist/facts/factColumns.js +3 -3
- package/dist/facts/factColumns.js.map +1 -1
- package/dist/facts/index.cjs +42 -42
- package/dist/files/GridViewImpl.js +1 -1
- package/dist/files/GridViewImpl.js.map +2 -2
- package/dist/files/HtmlViewerParts.js +7 -15
- package/dist/files/HtmlViewerParts.js.map +2 -2
- package/dist/files/ViewerChrome.d.ts +5 -1
- package/dist/files/ViewerChrome.js +16 -6
- package/dist/files/ViewerChrome.js.map +2 -2
- package/dist/files/index.cjs +226 -226
- package/dist/files/navigator/DocumentSearchList.js +1 -1
- package/dist/files/navigator/DocumentSearchList.js.map +2 -2
- package/dist/index.cjs +1668 -1666
- package/dist/index.cjs.map +1 -1
- package/dist/presentation/BoxActionBar.d.ts +11 -0
- package/dist/presentation/BoxActionBar.js +182 -0
- package/dist/presentation/BoxActionBar.js.map +7 -0
- package/dist/presentation/ClipActionBar.d.ts +26 -0
- package/dist/presentation/ClipActionBar.js +103 -0
- package/dist/presentation/ClipActionBar.js.map +7 -0
- package/dist/presentation/ClipCaptureOverlay.d.ts +14 -0
- package/dist/presentation/ClipCaptureOverlay.js +69 -0
- package/dist/presentation/ClipCaptureOverlay.js.map +7 -0
- package/dist/presentation/ClipImage.d.ts +21 -0
- package/dist/presentation/ClipImage.js +119 -0
- package/dist/presentation/ClipImage.js.map +7 -0
- package/dist/presentation/ClipTray.d.ts +11 -0
- package/dist/presentation/ClipTray.js +152 -0
- package/dist/presentation/ClipTray.js.map +7 -0
- package/dist/presentation/ClipViewControls.d.ts +11 -0
- package/dist/presentation/ClipViewControls.js +142 -0
- package/dist/presentation/ClipViewControls.js.map +7 -0
- package/dist/presentation/DesignMenu.d.ts +8 -0
- package/dist/presentation/DesignMenu.js +199 -0
- package/dist/presentation/DesignMenu.js.map +7 -0
- package/dist/presentation/LayoutMenu.d.ts +17 -0
- package/dist/presentation/LayoutMenu.js +122 -0
- package/dist/presentation/LayoutMenu.js.map +7 -0
- package/dist/presentation/MediaClip.d.ts +15 -0
- package/dist/presentation/MediaClip.js +67 -0
- package/dist/presentation/MediaClip.js.map +7 -0
- package/dist/presentation/Notice.d.ts +6 -0
- package/dist/presentation/Notice.js +43 -0
- package/dist/presentation/Notice.js.map +7 -0
- package/dist/presentation/PresentationStage.d.ts +32 -0
- package/dist/presentation/PresentationStage.js +232 -0
- package/dist/presentation/PresentationStage.js.map +7 -0
- package/dist/presentation/PresenterView.d.ts +16 -0
- package/dist/presentation/PresenterView.js +69 -0
- package/dist/presentation/PresenterView.js.map +7 -0
- package/dist/presentation/SlideDecor.d.ts +25 -0
- package/dist/presentation/SlideDecor.js +189 -0
- package/dist/presentation/SlideDecor.js.map +7 -0
- package/dist/presentation/SlidesEditor.d.ts +25 -0
- package/dist/presentation/SlidesEditor.js +359 -0
- package/dist/presentation/SlidesEditor.js.map +7 -0
- package/dist/presentation/StageBox.d.ts +30 -0
- package/dist/presentation/StageBox.js +281 -0
- package/dist/presentation/StageBox.js.map +7 -0
- package/dist/presentation/StageItem.d.ts +37 -0
- package/dist/presentation/StageItem.js +211 -0
- package/dist/presentation/StageItem.js.map +7 -0
- package/dist/presentation/box-style.d.ts +6 -0
- package/dist/presentation/box-style.js +19 -0
- package/dist/presentation/box-style.js.map +7 -0
- package/dist/presentation/boxes.d.ts +105 -0
- package/dist/presentation/boxes.js +103 -0
- package/dist/presentation/boxes.js.map +7 -0
- package/dist/presentation/draw-boxes.d.ts +8 -0
- package/dist/presentation/draw-boxes.js +130 -0
- package/dist/presentation/draw-boxes.js.map +7 -0
- package/dist/presentation/export-boxes.d.ts +10 -0
- package/dist/presentation/export-boxes.js +74 -0
- package/dist/presentation/export-boxes.js.map +7 -0
- package/dist/presentation/export-pptx.d.ts +16 -0
- package/dist/presentation/export-pptx.js +194 -0
- package/dist/presentation/export-pptx.js.map +7 -0
- package/dist/presentation/import-pptx.d.ts +35 -0
- package/dist/presentation/import-pptx.js +659 -0
- package/dist/presentation/import-pptx.js.map +7 -0
- package/dist/presentation/merge-outside-edits.d.ts +12 -0
- package/dist/presentation/merge-outside-edits.js +35 -0
- package/dist/presentation/merge-outside-edits.js.map +7 -0
- package/dist/presentation/model.d.ts +201 -0
- package/dist/presentation/model.js +271 -0
- package/dist/presentation/model.js.map +7 -0
- package/dist/presentation/panel-id.d.ts +34 -0
- package/dist/presentation/panel-id.js +24 -0
- package/dist/presentation/panel-id.js.map +7 -0
- package/dist/presentation/persistence.d.ts +121 -0
- package/dist/presentation/persistence.js +141 -0
- package/dist/presentation/persistence.js.map +7 -0
- package/dist/presentation/pptx-data.d.ts +22 -0
- package/dist/presentation/pptx-data.js +83 -0
- package/dist/presentation/pptx-data.js.map +7 -0
- package/dist/presentation/pptx-xml.d.ts +90 -0
- package/dist/presentation/pptx-xml.js +333 -0
- package/dist/presentation/pptx-xml.js.map +7 -0
- package/dist/presentation/render-slides.d.ts +58 -0
- package/dist/presentation/render-slides.js +309 -0
- package/dist/presentation/render-slides.js.map +7 -0
- package/dist/presentation/saved-boxes.d.ts +11 -0
- package/dist/presentation/saved-boxes.js +80 -0
- package/dist/presentation/saved-boxes.js.map +7 -0
- package/dist/presentation/slide-layout.d.ts +54 -0
- package/dist/presentation/slide-layout.js +117 -0
- package/dist/presentation/slide-layout.js.map +7 -0
- package/dist/presentation/stage-videos.d.ts +5 -0
- package/dist/presentation/stage-videos.js +19 -0
- package/dist/presentation/stage-videos.js.map +7 -0
- package/dist/presentation/store.d.ts +203 -0
- package/dist/presentation/store.js +429 -0
- package/dist/presentation/store.js.map +7 -0
- package/dist/presentation/theme.d.ts +102 -0
- package/dist/presentation/theme.js +276 -0
- package/dist/presentation/theme.js.map +7 -0
- package/dist/presentation/useClipDrag.d.ts +26 -0
- package/dist/presentation/useClipDrag.js +65 -0
- package/dist/presentation/useClipDrag.js.map +7 -0
- package/dist/presentation/useObjectUrl.d.ts +6 -0
- package/dist/presentation/useObjectUrl.js +15 -0
- package/dist/presentation/useObjectUrl.js.map +7 -0
- package/dist/presentation/usePresenterKeys.d.ts +13 -0
- package/dist/presentation/usePresenterKeys.js +62 -0
- package/dist/presentation/usePresenterKeys.js.map +7 -0
- package/dist/settings/index.cjs +151 -150
- package/dist/shell/PanelPortal.js +1 -0
- package/dist/shell/PanelPortal.js.map +2 -2
- package/dist/shell/index.cjs +112 -110
- package/dist/shell/panel-windows.d.ts +2 -0
- package/dist/shell/panel-windows.js +7 -2
- package/dist/shell/panel-windows.js.map +2 -2
- package/dist/studio/index.cjs +28 -26
- package/dist/studio/index.cjs.map +1 -1
- package/dist/styles.css +1 -1
- package/dist/workflow-canvas/index.cjs +58 -57
- package/dist/workflow-canvas/index.cjs.map +1 -1
- package/node_modules/@arbidocs/coedit/package.json +1 -1
- package/package.json +6 -5
- package/dist/ConnectedCallDock-WER7R222.cjs.map +0 -1
- package/dist/DocumentReviewCard-ZSBZBGFK.cjs.map +0 -1
- package/dist/FilesViewerDialog-6UKR5WEF.cjs.map +0 -1
- package/dist/GridViewImpl-ZMJJWTOM.cjs.map +0 -1
- package/dist/WorkspaceTableView-J3C6VH4T.cjs.map +0 -1
- package/dist/ai-IM4A23YT.cjs.map +0 -1
- package/dist/chunk-557MJ4IH.cjs.map +0 -1
- package/dist/chunk-6UTKM5AB.cjs.map +0 -1
- package/dist/chunk-6WMMZLEV.cjs.map +0 -1
- package/dist/chunk-B3LZITVF.cjs.map +0 -1
- package/dist/chunk-CPG7II4E.cjs.map +0 -1
- package/dist/chunk-CPR6EHG7.cjs.map +0 -1
- package/dist/chunk-DDIW4HLU.cjs.map +0 -1
- package/dist/chunk-NJCK6V6U.cjs.map +0 -1
- package/dist/chunk-NNUK5ZM7.cjs.map +0 -1
- package/dist/chunk-PGJYD67F.cjs.map +0 -1
- package/dist/chunk-R7CJEIA5.cjs.map +0 -1
- package/dist/chunk-SB4M3ITT.cjs.map +0 -1
- package/dist/chunk-TT4IF52H.cjs.map +0 -1
- package/dist/chunk-VLCY46K6.cjs.map +0 -1
- package/dist/chunk-YYPZOEED.cjs.map +0 -1
- package/dist/chunk-ZPPMAL5P.cjs.map +0 -1
|
@@ -0,0 +1,76 @@
|
|
|
1
|
+
"use client";
|
|
2
|
+
import { jsx, jsxs } from "react/jsx-runtime";
|
|
3
|
+
import { useCallback, useEffect, useState } from "react";
|
|
4
|
+
import { Maximize, PanelTop } from "lucide-react";
|
|
5
|
+
import { Button, cn } from "@arbidocs/react/ui";
|
|
6
|
+
import { toggleFullscreen } from "../../presentation/usePresenterKeys.js";
|
|
7
|
+
const IDLE_MS = 2e3;
|
|
8
|
+
function CleanViewControl({ onExit }) {
|
|
9
|
+
const [view, setView] = useState(null);
|
|
10
|
+
const [shown, setShown] = useState(true);
|
|
11
|
+
const ref = useCallback((node) => {
|
|
12
|
+
setView(node?.ownerDocument.defaultView ?? null);
|
|
13
|
+
}, []);
|
|
14
|
+
useEffect(() => {
|
|
15
|
+
if (!view) return;
|
|
16
|
+
let timer = view.setTimeout(() => setShown(false), IDLE_MS);
|
|
17
|
+
const wake = () => {
|
|
18
|
+
setShown(true);
|
|
19
|
+
view.clearTimeout(timer);
|
|
20
|
+
timer = view.setTimeout(() => setShown(false), IDLE_MS);
|
|
21
|
+
};
|
|
22
|
+
view.addEventListener("pointermove", wake);
|
|
23
|
+
view.addEventListener("keydown", wake);
|
|
24
|
+
return () => {
|
|
25
|
+
view.clearTimeout(timer);
|
|
26
|
+
view.removeEventListener("pointermove", wake);
|
|
27
|
+
view.removeEventListener("keydown", wake);
|
|
28
|
+
};
|
|
29
|
+
}, [view]);
|
|
30
|
+
return /* @__PURE__ */ jsxs(
|
|
31
|
+
"div",
|
|
32
|
+
{
|
|
33
|
+
ref,
|
|
34
|
+
className: cn(
|
|
35
|
+
"absolute right-3 top-3 z-20 flex gap-1 rounded-md bg-background/90 p-1 shadow-md transition-opacity",
|
|
36
|
+
shown ? "opacity-100" : "pointer-events-none opacity-0"
|
|
37
|
+
),
|
|
38
|
+
"data-testid": "viewer-clean-control",
|
|
39
|
+
children: [
|
|
40
|
+
/* @__PURE__ */ jsxs(
|
|
41
|
+
Button,
|
|
42
|
+
{
|
|
43
|
+
type: "button",
|
|
44
|
+
size: "sm",
|
|
45
|
+
variant: "ghost",
|
|
46
|
+
className: "h-7",
|
|
47
|
+
onClick: () => view && toggleFullscreen(view),
|
|
48
|
+
children: [
|
|
49
|
+
/* @__PURE__ */ jsx(Maximize, { className: "size-3.5" }),
|
|
50
|
+
"Full screen"
|
|
51
|
+
]
|
|
52
|
+
}
|
|
53
|
+
),
|
|
54
|
+
/* @__PURE__ */ jsxs(
|
|
55
|
+
Button,
|
|
56
|
+
{
|
|
57
|
+
type: "button",
|
|
58
|
+
size: "sm",
|
|
59
|
+
variant: "ghost",
|
|
60
|
+
className: "h-7",
|
|
61
|
+
onClick: onExit,
|
|
62
|
+
"data-testid": "viewer-clean-exit",
|
|
63
|
+
children: [
|
|
64
|
+
/* @__PURE__ */ jsx(PanelTop, { className: "size-3.5" }),
|
|
65
|
+
"Show controls"
|
|
66
|
+
]
|
|
67
|
+
}
|
|
68
|
+
)
|
|
69
|
+
]
|
|
70
|
+
}
|
|
71
|
+
);
|
|
72
|
+
}
|
|
73
|
+
export {
|
|
74
|
+
CleanViewControl
|
|
75
|
+
};
|
|
76
|
+
//# sourceMappingURL=CleanViewControl.js.map
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../../../src/connection/viewer/CleanViewControl.tsx"],
|
|
4
|
+
"sourcesContent": ["import { useCallback, useEffect, useState } from 'react'\nimport { Maximize, PanelTop } from 'lucide-react'\nimport { Button, cn } from '@arbidocs/react/ui'\nimport { toggleFullscreen } from '../../presentation/usePresenterKeys'\n\nconst IDLE_MS = 2000\n\n/**\n * Over the viewer's clean view: Full screen, and Show controls (leave the clean view). It shows\n * while the pointer moves or a key is pressed and fades after a moment, so a share rarely\n * catches it.\n */\nexport function CleanViewControl({ onExit }: { onExit: () => void }) {\n const [view, setView] = useState<Window | null>(null)\n const [shown, setShown] = useState(true)\n const ref = useCallback((node: HTMLDivElement | null) => {\n setView(node?.ownerDocument.defaultView ?? null)\n }, [])\n\n useEffect(() => {\n if (!view) return\n let timer = view.setTimeout(() => setShown(false), IDLE_MS)\n const wake = () => {\n setShown(true)\n view.clearTimeout(timer)\n timer = view.setTimeout(() => setShown(false), IDLE_MS)\n }\n view.addEventListener('pointermove', wake)\n view.addEventListener('keydown', wake)\n return () => {\n view.clearTimeout(timer)\n view.removeEventListener('pointermove', wake)\n view.removeEventListener('keydown', wake)\n }\n }, [view])\n\n return (\n <div\n ref={ref}\n className={cn(\n 'absolute right-3 top-3 z-20 flex gap-1 rounded-md bg-background/90 p-1 shadow-md transition-opacity',\n shown ? 'opacity-100' : 'pointer-events-none opacity-0'\n )}\n data-testid=\"viewer-clean-control\"\n >\n <Button\n type=\"button\"\n size=\"sm\"\n variant=\"ghost\"\n className=\"h-7\"\n onClick={() => view && toggleFullscreen(view)}\n >\n <Maximize className=\"size-3.5\" />\n Full screen\n </Button>\n <Button\n type=\"button\"\n size=\"sm\"\n variant=\"ghost\"\n className=\"h-7\"\n onClick={onExit}\n data-testid=\"viewer-clean-exit\"\n >\n <PanelTop className=\"size-3.5\" />\n Show controls\n </Button>\n </div>\n )\n}\n"],
|
|
5
|
+
"mappings": ";AA6CM,SAOE,KAPF;AA7CN,SAAS,aAAa,WAAW,gBAAgB;AACjD,SAAS,UAAU,gBAAgB;AACnC,SAAS,QAAQ,UAAU;AAC3B,SAAS,wBAAwB;AAEjC,MAAM,UAAU;AAOT,SAAS,iBAAiB,EAAE,OAAO,GAA2B;AACnE,QAAM,CAAC,MAAM,OAAO,IAAI,SAAwB,IAAI;AACpD,QAAM,CAAC,OAAO,QAAQ,IAAI,SAAS,IAAI;AACvC,QAAM,MAAM,YAAY,CAAC,SAAgC;AACvD,YAAQ,MAAM,cAAc,eAAe,IAAI;AAAA,EACjD,GAAG,CAAC,CAAC;AAEL,YAAU,MAAM;AACd,QAAI,CAAC,KAAM;AACX,QAAI,QAAQ,KAAK,WAAW,MAAM,SAAS,KAAK,GAAG,OAAO;AAC1D,UAAM,OAAO,MAAM;AACjB,eAAS,IAAI;AACb,WAAK,aAAa,KAAK;AACvB,cAAQ,KAAK,WAAW,MAAM,SAAS,KAAK,GAAG,OAAO;AAAA,IACxD;AACA,SAAK,iBAAiB,eAAe,IAAI;AACzC,SAAK,iBAAiB,WAAW,IAAI;AACrC,WAAO,MAAM;AACX,WAAK,aAAa,KAAK;AACvB,WAAK,oBAAoB,eAAe,IAAI;AAC5C,WAAK,oBAAoB,WAAW,IAAI;AAAA,IAC1C;AAAA,EACF,GAAG,CAAC,IAAI,CAAC;AAET,SACE;AAAA,IAAC;AAAA;AAAA,MACC;AAAA,MACA,WAAW;AAAA,QACT;AAAA,QACA,QAAQ,gBAAgB;AAAA,MAC1B;AAAA,MACA,eAAY;AAAA,MAEZ;AAAA;AAAA,UAAC;AAAA;AAAA,YACC,MAAK;AAAA,YACL,MAAK;AAAA,YACL,SAAQ;AAAA,YACR,WAAU;AAAA,YACV,SAAS,MAAM,QAAQ,iBAAiB,IAAI;AAAA,YAE5C;AAAA,kCAAC,YAAS,WAAU,YAAW;AAAA,cAAE;AAAA;AAAA;AAAA,QAEnC;AAAA,QACA;AAAA,UAAC;AAAA;AAAA,YACC,MAAK;AAAA,YACL,MAAK;AAAA,YACL,SAAQ;AAAA,YACR,WAAU;AAAA,YACV,SAAS;AAAA,YACT,eAAY;AAAA,YAEZ;AAAA,kCAAC,YAAS,WAAU,YAAW;AAAA,cAAE;AAAA;AAAA;AAAA,QAEnC;AAAA;AAAA;AAAA,EACF;AAEJ;",
|
|
6
|
+
"names": []
|
|
7
|
+
}
|
|
@@ -10,13 +10,7 @@ import {
|
|
|
10
10
|
PenLine,
|
|
11
11
|
Users
|
|
12
12
|
} from "lucide-react";
|
|
13
|
-
import {
|
|
14
|
-
DEFAULT_ASPECT_OPTIONS,
|
|
15
|
-
ImageCropModal,
|
|
16
|
-
useArbi,
|
|
17
|
-
useArbiSessionState,
|
|
18
|
-
useArbiSessionStore
|
|
19
|
-
} from "@arbidocs/react";
|
|
13
|
+
import { useArbi, useArbiSessionState, useArbiSessionStore } from "@arbidocs/react";
|
|
20
14
|
import { findVersion, parseVersionRef, versionLabel } from "@arbidocs/react/artifacts";
|
|
21
15
|
import {
|
|
22
16
|
SIGNED_LOCKED_REASON,
|
|
@@ -32,7 +26,8 @@ import {
|
|
|
32
26
|
DropdownMenuContent,
|
|
33
27
|
DropdownMenuItem,
|
|
34
28
|
DropdownMenuTrigger,
|
|
35
|
-
getEntityLabel
|
|
29
|
+
getEntityLabel,
|
|
30
|
+
SharingEntity
|
|
36
31
|
} from "@arbidocs/react/ui";
|
|
37
32
|
import {
|
|
38
33
|
ArtifactCodeView,
|
|
@@ -62,6 +57,8 @@ import {
|
|
|
62
57
|
SignatureStatus,
|
|
63
58
|
VersionSnapshotBar
|
|
64
59
|
} from "../../document-tools/index.js";
|
|
60
|
+
import { useViewerClipping } from "../presentation/useViewerClipping.js";
|
|
61
|
+
import { useCleanView } from "./useCleanView.js";
|
|
65
62
|
import {
|
|
66
63
|
DocumentLabelBar,
|
|
67
64
|
PdfPageNav,
|
|
@@ -88,6 +85,7 @@ import { ConnectedDocumentToolsProvider } from "./ConnectedDocumentToolsProvider
|
|
|
88
85
|
import { FinaliseTranslationButton } from "./FinaliseTranslationButton.js";
|
|
89
86
|
import { useDocumentViewerSupport } from "./support.js";
|
|
90
87
|
import { useImageCrop } from "./useImageCrop.js";
|
|
88
|
+
import { ViewerCropModal } from "./ViewerCropModal.js";
|
|
91
89
|
import { useViewedDocument } from "./useViewedDocument.js";
|
|
92
90
|
import { useViewerBlobs } from "./useViewerBlobs.js";
|
|
93
91
|
import { useViewerTabs } from "./useViewerTabs.js";
|
|
@@ -97,6 +95,7 @@ import { ParsedTextView } from "./parsed/ParsedTextView.js";
|
|
|
97
95
|
import { ViewerPdfPane } from "./ViewerPdfPane.js";
|
|
98
96
|
import { ConnectedNativeDocxEditor as NativeDocxEditor } from "../docx/ConnectedNativeDocxEditor.js";
|
|
99
97
|
import { canChangeVisibility } from "../../files/permissions.js";
|
|
98
|
+
import { SlidesTab } from "./slidesTabChunk.js";
|
|
100
99
|
const StreamedWordArtifact = lazy(
|
|
101
100
|
() => import("../docx/ConnectedStreamedWordArtifact.js").then((m) => ({
|
|
102
101
|
default: m.ConnectedStreamedWordArtifact
|
|
@@ -178,6 +177,7 @@ function DocumentViewerContent({
|
|
|
178
177
|
streamingDoc,
|
|
179
178
|
isStreaming,
|
|
180
179
|
draftDoc,
|
|
180
|
+
isPresentation,
|
|
181
181
|
isDraft,
|
|
182
182
|
isCaptureDraft,
|
|
183
183
|
labelSummaries,
|
|
@@ -297,7 +297,7 @@ function DocumentViewerContent({
|
|
|
297
297
|
signatureDocumentId,
|
|
298
298
|
!isDraft && !liveKind
|
|
299
299
|
);
|
|
300
|
-
const isCoEditing = !snapshotDocumentId && !compareDocumentId && !isDraft && (activeTab === "docx" && isDocx || activeTab === "edit" && isArtifact && !liveKind && !isStreaming);
|
|
300
|
+
const isCoEditing = !snapshotDocumentId && !compareDocumentId && !isDraft && (activeTab === "docx" && isDocx || activeTab === "slides" && isPresentation || activeTab === "edit" && isArtifact && !liveKind && !isStreaming);
|
|
301
301
|
const currentVersionLabel = isCoEditing ? void 0 : !snapshotDocumentId && !compareDocumentId && (isDocx || isArtifact && !liveKind) ? "Live" : versionLabel(versions, snapshotDocumentId || documentId);
|
|
302
302
|
const compareVersionLabel = versionLabel(versions, compareDocumentId);
|
|
303
303
|
const snapshotNumber = findVersion(versions, snapshotDocumentId)?.number;
|
|
@@ -363,7 +363,7 @@ function DocumentViewerContent({
|
|
|
363
363
|
shrink: !!liveKind || isCompact
|
|
364
364
|
}
|
|
365
365
|
),
|
|
366
|
-
isCompact && !isDraft && documentData?.shared && /* @__PURE__ */ jsx(
|
|
366
|
+
isCompact && !isDraft && documentData?.shared && /* @__PURE__ */ jsx(SharingEntity, { shared: true, variant: "icon", "data-testid": "document-shared-status" }),
|
|
367
367
|
isCompact && activeTab === "pdf" && pdfBlob && markup.hasMarkup && !annotating && !placingSignature && /* @__PURE__ */ jsx(
|
|
368
368
|
MarkupViewNote,
|
|
369
369
|
{
|
|
@@ -421,6 +421,8 @@ function DocumentViewerContent({
|
|
|
421
421
|
isSnapshot: !!snapshotDocumentId,
|
|
422
422
|
isComparing
|
|
423
423
|
});
|
|
424
|
+
const clip = useViewerClipping(annotatable || !!pdfBlob && (isImage || isVideo), isCompact);
|
|
425
|
+
const clean = useCleanView();
|
|
424
426
|
const signatureBanner = !isDraft && !liveKind && !snapshotDocumentId && /* @__PURE__ */ jsx(
|
|
425
427
|
SignatureRequestBanner,
|
|
426
428
|
{
|
|
@@ -459,11 +461,13 @@ function DocumentViewerContent({
|
|
|
459
461
|
compact: isCompact,
|
|
460
462
|
onClick: () => {
|
|
461
463
|
setPlacingSignature(false);
|
|
464
|
+
clip.stop();
|
|
462
465
|
markup.setShowOriginal(false);
|
|
463
466
|
setAnnotating((on) => !on);
|
|
464
467
|
}
|
|
465
468
|
}
|
|
466
469
|
),
|
|
470
|
+
clip.button,
|
|
467
471
|
activeTab === "pdf" && pdfBlob && !placingSignature && (markup.hasMarkup || annotating) && /* @__PURE__ */ jsx(
|
|
468
472
|
ShowOriginalButton,
|
|
469
473
|
{
|
|
@@ -724,22 +728,8 @@ function DocumentViewerContent({
|
|
|
724
728
|
)
|
|
725
729
|
] }),
|
|
726
730
|
compareRow: isComparing ? compareIndicator || void 0 : void 0,
|
|
727
|
-
|
|
728
|
-
|
|
729
|
-
/* @__PURE__ */ jsx(
|
|
730
|
-
ImageCropModal,
|
|
731
|
-
{
|
|
732
|
-
open: crop.cropImageUrl !== null,
|
|
733
|
-
image: crop.cropImageUrl,
|
|
734
|
-
title: "Crop image",
|
|
735
|
-
saveLabel: "Save as a copy",
|
|
736
|
-
aspectOptions: DEFAULT_ASPECT_OPTIONS,
|
|
737
|
-
output: { mimeType: "image/png" },
|
|
738
|
-
onComplete: crop.handleCropComplete,
|
|
739
|
-
onCancel: crop.closeCrop
|
|
740
|
-
}
|
|
741
|
-
)
|
|
742
|
-
),
|
|
731
|
+
...clean.frame,
|
|
732
|
+
footer: /* @__PURE__ */ jsx(ViewerCropModal, { crop }),
|
|
743
733
|
children: [
|
|
744
734
|
isComparing && /* @__PURE__ */ jsx(Suspense, { fallback: /* @__PURE__ */ jsx(ViewerMessage, { children: "Loading comparison\u2026" }), children: /* @__PURE__ */ jsx(
|
|
745
735
|
NativeDocxComparison,
|
|
@@ -751,14 +741,14 @@ function DocumentViewerContent({
|
|
|
751
741
|
) }),
|
|
752
742
|
isCaptureDraft && /* @__PURE__ */ jsx(ViewerCaptureDraft, { documentId }),
|
|
753
743
|
!isCaptureDraft && (activeTab === "pdf" || isMedia && activeTab === "html") && (!isArtifact || isDocx && !isDraft && !isStreaming && !liveKind) && !isComparing && /* @__PURE__ */ jsxs(ViewerPane, { hidden: activeTab !== "pdf", children: [
|
|
754
|
-
/* @__PURE__ */ jsx(DocumentLabelBar, { summaries: labelSummaries }),
|
|
755
|
-
!isMedia && !isImage && signatureBanner,
|
|
756
|
-
activeTab === "pdf" && pdfBlob && !pdfVerified && /* @__PURE__ */ jsxs(ViewerMessage, { children: [
|
|
744
|
+
!clean.on && /* @__PURE__ */ jsx(DocumentLabelBar, { summaries: labelSummaries }),
|
|
745
|
+
!clean.on && !isMedia && !isImage && signatureBanner,
|
|
746
|
+
!clean.on && activeTab === "pdf" && pdfBlob && !pdfVerified && /* @__PURE__ */ jsxs(ViewerMessage, { children: [
|
|
757
747
|
"Offline copy: its version cannot be verified. Reconnect before signing.",
|
|
758
748
|
" ",
|
|
759
749
|
/* @__PURE__ */ jsx("button", { type: "button", onClick: () => void blobs.retryPdf(), className: "underline", children: "Retry loading the current PDF" })
|
|
760
750
|
] }),
|
|
761
|
-
activeTab === "pdf" && !isMedia && !isImage && /* @__PURE__ */ jsx(
|
|
751
|
+
!clean.on && activeTab === "pdf" && !isMedia && !isImage && /* @__PURE__ */ jsx(
|
|
762
752
|
MarkupNotices,
|
|
763
753
|
{
|
|
764
754
|
legacyPrompt: markup.legacyPrompt,
|
|
@@ -766,7 +756,7 @@ function DocumentViewerContent({
|
|
|
766
756
|
onOpenVersion: (n) => setSnapshotDocumentId(`${documentId}@v${n}`)
|
|
767
757
|
}
|
|
768
758
|
),
|
|
769
|
-
/* @__PURE__ */ jsx(ViewerControlBar, { controls: activeTab === "pdf" && pageNav, children: /* @__PURE__ */ jsx(
|
|
759
|
+
/* @__PURE__ */ jsx(ViewerControlBar, { controls: !clean.on && activeTab === "pdf" && pageNav, children: /* @__PURE__ */ jsx(
|
|
770
760
|
ViewerPdfPane,
|
|
771
761
|
{
|
|
772
762
|
documentId,
|
|
@@ -787,6 +777,7 @@ function DocumentViewerContent({
|
|
|
787
777
|
setIsSignOpen(true);
|
|
788
778
|
},
|
|
789
779
|
annotating,
|
|
780
|
+
clipping: clip.clipping,
|
|
790
781
|
markup,
|
|
791
782
|
pdfSnapshotNumber,
|
|
792
783
|
isSigned,
|
|
@@ -850,6 +841,15 @@ function DocumentViewerContent({
|
|
|
850
841
|
}
|
|
851
842
|
),
|
|
852
843
|
activeTab === "xlsx" && isXlsx && (xlsxBlob ? /* @__PURE__ */ jsx(XlsxViewer, { blob: xlsxBlob }) : /* @__PURE__ */ jsx(ViewerMessage, { children: xlsxError ? "Failed to load spreadsheet" : "Loading spreadsheet..." })),
|
|
844
|
+
activeTab === "slides" && isPresentation && /* @__PURE__ */ jsx(Suspense, { fallback: /* @__PURE__ */ jsx(ViewerMessage, { children: "Loading slides\u2026" }), children: /* @__PURE__ */ jsx(
|
|
845
|
+
SlidesTab,
|
|
846
|
+
{
|
|
847
|
+
documentId,
|
|
848
|
+
version: snapshotDocumentId ? snapshotNumber : void 0,
|
|
849
|
+
currentVersion: documentData?.current_version ?? void 0,
|
|
850
|
+
draftTitle: isDraft ? draftDoc?.title ?? "" : void 0
|
|
851
|
+
}
|
|
852
|
+
) }),
|
|
853
853
|
activeTab === "docx" && isDocx && !isComparing && /* @__PURE__ */ jsxs(Suspense, { fallback: /* @__PURE__ */ jsx(ViewerMessage, { children: "Loading editor\u2026" }), children: [
|
|
854
854
|
signatureBanner,
|
|
855
855
|
isSigned && !snapshotDocumentId && /* @__PURE__ */ jsx(SignedEditNote, {}),
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../../../src/connection/viewer/ConnectedDocumentViewer.tsx"],
|
|
4
|
-
"sourcesContent": ["/**\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 { VersionDropdown } from './VersionDropdown'\nimport { ParsedTextView } from './parsed/ParsedTextView'\nimport { ViewerPdfPane, type SignatureFlow } from './ViewerPdfPane'\n// The Word editor itself is its own chunk (`docxEditorChunk`), loaded when a Word document shows.\nimport { ConnectedNativeDocxEditor as NativeDocxEditor } from '../docx/ConnectedNativeDocxEditor'\nimport { canChangeVisibility } from '../../files/permissions'\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-\u2026@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-\u2026@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 && (!isArtifact || isDocx) ? 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 [minimumPdfVersion, setMinimumPdfVersion] = useState<number | null>(null)\n useEffect(() => setMinimumPdfVersion(null), [documentId])\n const versionReady =\n !!pdfSnapshotId ||\n minimumPdfVersion === null ||\n (documentData?.current_version ?? 0) >= minimumPdfVersion\n const { xlsxBlob, xlsxError, handleDirectDownload } = blobs\n const pdfBlob = versionReady ? blobs.pdfBlob : null\n const pdfVerified = !!pdfBlob && blobs.pdfVerified !== false\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 {\n activeTab,\n handleTabChange: changeTab,\n viewerTabs,\n } = useViewerTabs(doc, isCompact, hasHistory)\n const saveWordRef = useRef<(() => Promise<boolean | number>) | null>(null)\n const transitionPending = useRef(false)\n const transitionKey = JSON.stringify([openedId, doc.workspaceId])\n const transitionScope = useRef({ key: transitionKey, generation: 0 })\n if (transitionScope.current.key !== transitionKey) {\n transitionScope.current = {\n key: transitionKey,\n generation: transitionScope.current.generation + 1,\n }\n }\n useEffect(\n () => () => {\n transitionScope.current.generation += 1\n },\n []\n )\n const requestViewerTransition = async (transition: () => void): Promise<boolean> => {\n if (transitionPending.current) return false\n const leavingWord =\n isDocx &&\n !isDraft &&\n !isStreaming &&\n !snapshotDocumentId &&\n (activeTab === 'docx' || (isArtifact && !liveKind && activeTab === 'edit'))\n if (leavingWord) {\n transitionPending.current = true\n const generation = transitionScope.current.generation\n try {\n const saved = saveWordRef.current && (await saveWordRef.current())\n if (!saved) {\n notify('Could not save the current document. Stay in the editor and try again.', 'error')\n return false\n }\n if (generation !== transitionScope.current.generation) return false\n if (typeof saved === 'number') setMinimumPdfVersion(saved)\n } finally {\n transitionPending.current = false\n }\n }\n transition()\n return true\n }\n const handleTabChange = (tab: string) => {\n if (tab === activeTab) return\n void requestViewerTransition(() => changeTab(tab))\n }\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 const signingScope = JSON.stringify([\n documentId,\n snapshotDocumentId,\n documentData?.current_version,\n ])\n const signingScopeRef = useRef(signingScope)\n const signingScopeMatches = signingScopeRef.current === signingScope\n // Leaving the placement when another version opens or returns: it belongs to the copy on screen.\n useEffect(() => {\n setPlacingSignature(false)\n setIsSignOpen(false)\n setSignAppearance(undefined)\n signingScopeRef.current = signingScope\n }, [signingScope])\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), [signingScope])\n const signatureDocumentId =\n pdfSnapshotId ||\n (documentData?.current_version ? `${documentId}@v${documentData.current_version}` : documentId)\n const { data: signatureStatus } = useDocumentSignatures(\n signatureDocumentId,\n !isDraft && !liveKind\n )\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\n ? (parseVersionRef(pdfSnapshotId).version ?? undefined)\n : 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 \u2014 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 <>\n <ViewerTabBar\n tabs={viewerTabs.filter((tab) => tab.id !== 'versions')}\n activeId={activeTab}\n onChange={handleTabChange}\n />\n {(isArtifact || isDocx || hasHistory) && !liveKind && !isComparing && (\n <VersionDropdown\n versions={versions}\n activeId={\n snapshotDocumentId ??\n (currentVersionId === documentId && documentData?.current_version\n ? `${documentId}@v${documentData.current_version}`\n : currentVersionId)\n }\n isSnapshot={!!snapshotDocumentId}\n onOpen={(id) => {\n void requestViewerTransition(() => {\n setSnapshotDocumentId(id === currentVersionId ? null : id)\n if (activeTab === 'versions')\n setActiveTab(isArtifact ? 'edit' : isDocx ? 'docx' : 'pdf')\n })\n }}\n onHistory={() => handleTabChange('versions')}\n />\n )}\n </>\n )}\n {!isCompact && titleBlock}\n </ViewerHeaderStart>\n )\n\n const annotatable = canAnnotate({\n activeTab,\n hasPdf: pdfVerified,\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 void requestViewerTransition(() => {\n setAnnotating(false)\n setPlacingSignature(false)\n if (activeTab !== 'pdf') changeTab('pdf')\n setSignatureFlow({ kind: 'sign', request })\n })\n }}\n onEditDraft={(draft) => {\n void requestViewerTransition(() => {\n if (activeTab !== 'pdf') changeTab('pdf')\n setSignatureFlow({ kind: 'prepare', draft })\n })\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 \u2014 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 && pdfVerified && signingScopeMatches && (\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\u2026</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 || (isDocx && !isDraft && !isStreaming && !liveKind)) &&\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' && pdfBlob && !pdfVerified && (\n <ViewerMessage>\n Offline copy: its version cannot be verified. Reconnect before signing.{' '}\n <button type=\"button\" onClick={() => void blobs.retryPdf()} className=\"underline\">\n Retry loading the current PDF\n </button>\n </ViewerMessage>\n )}\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={!versionReady || blobs.isPdfLoading}\n pdfError={blobs.pdfError}\n onDownload={() => void handleDirectDownload()}\n viewerProps={viewerProps}\n signatureFlow={pdfVerified && signingScopeMatches ? signatureFlow : null}\n onSignatureFlow={setSignatureFlow}\n currentUserId={currentUserId}\n placingSignature={pdfVerified && signingScopeMatches && 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\u2026</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 saveRef={saveWordRef}\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\u2026</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 saveRef={saveWordRef}\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\u2026</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"],
|
|
5
|
-
"mappings": "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",
|
|
4
|
+
"sourcesContent": ["/**\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 { useArbi, useArbiSessionState, useArbiSessionStore } 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 SharingEntity,\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 { useViewerClipping } from '../presentation/useViewerClipping'\nimport { useCleanView } from './useCleanView'\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 { ViewerCropModal } from './ViewerCropModal'\nimport { useViewedDocument } from './useViewedDocument'\nimport { useViewerBlobs } from './useViewerBlobs'\nimport { useViewerTabs } from './useViewerTabs'\nimport { useViewerVersions } from './useViewerVersions'\nimport { VersionDropdown } from './VersionDropdown'\nimport { ParsedTextView } from './parsed/ParsedTextView'\nimport { ViewerPdfPane, type SignatureFlow } from './ViewerPdfPane'\n// The Word editor itself is its own chunk (`docxEditorChunk`), loaded when a Word document shows.\nimport { ConnectedNativeDocxEditor as NativeDocxEditor } from '../docx/ConnectedNativeDocxEditor'\nimport { canChangeVisibility } from '../../files/permissions'\nimport { SlidesTab } from './slidesTabChunk'\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-\u2026@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-\u2026@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 isPresentation,\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 && (!isArtifact || isDocx) ? 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 [minimumPdfVersion, setMinimumPdfVersion] = useState<number | null>(null)\n useEffect(() => setMinimumPdfVersion(null), [documentId])\n const versionReady =\n !!pdfSnapshotId ||\n minimumPdfVersion === null ||\n (documentData?.current_version ?? 0) >= minimumPdfVersion\n const { xlsxBlob, xlsxError, handleDirectDownload } = blobs\n const pdfBlob = versionReady ? blobs.pdfBlob : null\n const pdfVerified = !!pdfBlob && blobs.pdfVerified !== false\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 {\n activeTab,\n handleTabChange: changeTab,\n viewerTabs,\n } = useViewerTabs(doc, isCompact, hasHistory)\n const saveWordRef = useRef<(() => Promise<boolean | number>) | null>(null)\n const transitionPending = useRef(false)\n const transitionKey = JSON.stringify([openedId, doc.workspaceId])\n const transitionScope = useRef({ key: transitionKey, generation: 0 })\n if (transitionScope.current.key !== transitionKey) {\n transitionScope.current = {\n key: transitionKey,\n generation: transitionScope.current.generation + 1,\n }\n }\n useEffect(\n () => () => {\n transitionScope.current.generation += 1\n },\n []\n )\n const requestViewerTransition = async (transition: () => void): Promise<boolean> => {\n if (transitionPending.current) return false\n const leavingWord =\n isDocx &&\n !isDraft &&\n !isStreaming &&\n !snapshotDocumentId &&\n (activeTab === 'docx' || (isArtifact && !liveKind && activeTab === 'edit'))\n if (leavingWord) {\n transitionPending.current = true\n const generation = transitionScope.current.generation\n try {\n const saved = saveWordRef.current && (await saveWordRef.current())\n if (!saved) {\n notify('Could not save the current document. Stay in the editor and try again.', 'error')\n return false\n }\n if (generation !== transitionScope.current.generation) return false\n if (typeof saved === 'number') setMinimumPdfVersion(saved)\n } finally {\n transitionPending.current = false\n }\n }\n transition()\n return true\n }\n const handleTabChange = (tab: string) => {\n if (tab === activeTab) return\n void requestViewerTransition(() => changeTab(tab))\n }\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 const signingScope = JSON.stringify([\n documentId,\n snapshotDocumentId,\n documentData?.current_version,\n ])\n const signingScopeRef = useRef(signingScope)\n const signingScopeMatches = signingScopeRef.current === signingScope\n // Leaving the placement when another version opens or returns: it belongs to the copy on screen.\n useEffect(() => {\n setPlacingSignature(false)\n setIsSignOpen(false)\n setSignAppearance(undefined)\n signingScopeRef.current = signingScope\n }, [signingScope])\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), [signingScope])\n const signatureDocumentId =\n pdfSnapshotId ||\n (documentData?.current_version ? `${documentId}@v${documentData.current_version}` : documentId)\n const { data: signatureStatus } = useDocumentSignatures(\n signatureDocumentId,\n !isDraft && !liveKind\n )\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 === 'slides' && isPresentation) ||\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\n ? (parseVersionRef(pdfSnapshotId).version ?? undefined)\n : 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 <SharingEntity shared variant=\"icon\" data-testid=\"document-shared-status\" />\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 \u2014 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 <>\n <ViewerTabBar\n tabs={viewerTabs.filter((tab) => tab.id !== 'versions')}\n activeId={activeTab}\n onChange={handleTabChange}\n />\n {(isArtifact || isDocx || hasHistory) && !liveKind && !isComparing && (\n <VersionDropdown\n versions={versions}\n activeId={\n snapshotDocumentId ??\n (currentVersionId === documentId && documentData?.current_version\n ? `${documentId}@v${documentData.current_version}`\n : currentVersionId)\n }\n isSnapshot={!!snapshotDocumentId}\n onOpen={(id) => {\n void requestViewerTransition(() => {\n setSnapshotDocumentId(id === currentVersionId ? null : id)\n if (activeTab === 'versions')\n setActiveTab(isArtifact ? 'edit' : isDocx ? 'docx' : 'pdf')\n })\n }}\n onHistory={() => handleTabChange('versions')}\n />\n )}\n </>\n )}\n {!isCompact && titleBlock}\n </ViewerHeaderStart>\n )\n\n const annotatable = canAnnotate({\n activeTab,\n hasPdf: pdfVerified,\n isImage,\n isVideo,\n isAudio,\n isDownloadOnly,\n isDraft,\n isStreaming,\n isSnapshot: !!snapshotDocumentId,\n isComparing,\n })\n const clip = useViewerClipping(annotatable || (!!pdfBlob && (isImage || isVideo)), isCompact)\n const clean = useCleanView()\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 void requestViewerTransition(() => {\n setAnnotating(false)\n setPlacingSignature(false)\n if (activeTab !== 'pdf') changeTab('pdf')\n setSignatureFlow({ kind: 'sign', request })\n })\n }}\n onEditDraft={(draft) => {\n void requestViewerTransition(() => {\n if (activeTab !== 'pdf') changeTab('pdf')\n setSignatureFlow({ kind: 'prepare', draft })\n })\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 clip.stop()\n markup.setShowOriginal(false)\n setAnnotating((on) => !on)\n }}\n />\n )}\n {clip.button}\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 \u2014 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 && pdfVerified && signingScopeMatches && (\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 {...clean.frame}\n footer={<ViewerCropModal crop={crop} />}\n >\n {isComparing && (\n <Suspense fallback={<ViewerMessage>Loading comparison\u2026</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 || (isDocx && !isDraft && !isStreaming && !liveKind)) &&\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 {!clean.on && <DocumentLabelBar summaries={labelSummaries} />}\n {!clean.on && !isMedia && !isImage && signatureBanner}\n {!clean.on && activeTab === 'pdf' && pdfBlob && !pdfVerified && (\n <ViewerMessage>\n Offline copy: its version cannot be verified. Reconnect before signing.{' '}\n <button type=\"button\" onClick={() => void blobs.retryPdf()} className=\"underline\">\n Retry loading the current PDF\n </button>\n </ViewerMessage>\n )}\n {!clean.on && 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={!clean.on && activeTab === 'pdf' && pageNav}>\n <ViewerPdfPane\n documentId={documentId}\n doc={doc}\n pdfBlob={pdfBlob}\n isPdfLoading={!versionReady || blobs.isPdfLoading}\n pdfError={blobs.pdfError}\n onDownload={() => void handleDirectDownload()}\n viewerProps={viewerProps}\n signatureFlow={pdfVerified && signingScopeMatches ? signatureFlow : null}\n onSignatureFlow={setSignatureFlow}\n currentUserId={currentUserId}\n placingSignature={pdfVerified && signingScopeMatches && placingSignature}\n onPlacingDone={(appearance) => {\n setPlacingSignature(false)\n if (!appearance) return\n setSignAppearance(appearance)\n setIsSignOpen(true)\n }}\n annotating={annotating}\n clipping={clip.clipping}\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\u2026</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 saveRef={saveWordRef}\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 === 'slides' && isPresentation && (\n <Suspense fallback={<ViewerMessage>Loading slides\u2026</ViewerMessage>}>\n <SlidesTab\n documentId={documentId}\n version={snapshotDocumentId ? snapshotNumber : undefined}\n currentVersion={documentData?.current_version ?? undefined}\n draftTitle={isDraft ? (draftDoc?.title ?? '') : undefined}\n />\n </Suspense>\n )}\n {activeTab === 'docx' && isDocx && !isComparing && (\n <Suspense fallback={<ViewerMessage>Loading editor\u2026</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 saveRef={saveWordRef}\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\u2026</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"],
|
|
5
|
+
"mappings": "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",
|
|
6
6
|
"names": []
|
|
7
7
|
}
|
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
import type { useImageCrop } from './useImageCrop';
|
|
2
|
+
/** The viewer's image crop: to a new document, at full resolution (a crop frames, it never downscales). */
|
|
3
|
+
export declare function ViewerCropModal({ crop }: {
|
|
4
|
+
crop: ReturnType<typeof useImageCrop>;
|
|
5
|
+
}): import("react").JSX.Element;
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
"use client";
|
|
2
|
+
import { jsx } from "react/jsx-runtime";
|
|
3
|
+
import { DEFAULT_ASPECT_OPTIONS, ImageCropModal } from "@arbidocs/react";
|
|
4
|
+
function ViewerCropModal({ crop }) {
|
|
5
|
+
return /* @__PURE__ */ jsx(
|
|
6
|
+
ImageCropModal,
|
|
7
|
+
{
|
|
8
|
+
open: crop.cropImageUrl !== null,
|
|
9
|
+
image: crop.cropImageUrl,
|
|
10
|
+
title: "Crop image",
|
|
11
|
+
saveLabel: "Save as a copy",
|
|
12
|
+
aspectOptions: DEFAULT_ASPECT_OPTIONS,
|
|
13
|
+
output: { mimeType: "image/png" },
|
|
14
|
+
onComplete: crop.handleCropComplete,
|
|
15
|
+
onCancel: crop.closeCrop
|
|
16
|
+
}
|
|
17
|
+
);
|
|
18
|
+
}
|
|
19
|
+
export {
|
|
20
|
+
ViewerCropModal
|
|
21
|
+
};
|
|
22
|
+
//# sourceMappingURL=ViewerCropModal.js.map
|