@arbidocs/blocks 0.5.120 → 0.5.122
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-IEIBT74X.cjs +156 -0
- package/dist/ClippingMediaViewer-IEIBT74X.cjs.map +1 -0
- package/dist/ClippingPdfViewer-OGYLMVCE.cjs +79 -0
- package/dist/ClippingPdfViewer-OGYLMVCE.cjs.map +1 -0
- package/dist/{ConnectedCallDock-WER7R222.cjs → ConnectedCallDock-XJOYVVAH.cjs} +9 -7
- package/dist/ConnectedCallDock-XJOYVVAH.cjs.map +1 -0
- package/dist/{ConnectedCallRoom-T7OBQTYP.cjs → ConnectedCallRoom-CUDYAPQK.cjs} +9 -7
- package/dist/{ConnectedCallRoom-T7OBQTYP.cjs.map → ConnectedCallRoom-CUDYAPQK.cjs.map} +1 -1
- package/dist/{ConnectedNativeDocxComparison-SGE4R3M4.cjs → ConnectedNativeDocxComparison-QKHCYD6W.cjs} +7 -7
- package/dist/{ConnectedNativeDocxComparison-SGE4R3M4.cjs.map → ConnectedNativeDocxComparison-QKHCYD6W.cjs.map} +1 -1
- package/dist/ConnectedPresentation-AU25OW25.cjs +321 -0
- package/dist/ConnectedPresentation-AU25OW25.cjs.map +1 -0
- package/dist/ConnectedSlidesTab-I75LKKN7.cjs +236 -0
- package/dist/ConnectedSlidesTab-I75LKKN7.cjs.map +1 -0
- package/dist/{ConnectedStreamedWordArtifact-6MCLJRIT.cjs → ConnectedStreamedWordArtifact-AG62232A.cjs} +7 -7
- package/dist/{ConnectedStreamedWordArtifact-6MCLJRIT.cjs.map → ConnectedStreamedWordArtifact-AG62232A.cjs.map} +1 -1
- package/dist/{DocumentReviewCard-BPIAJJED.cjs → DocumentReviewCard-M53XFLI2.cjs} +15 -14
- package/dist/DocumentReviewCard-M53XFLI2.cjs.map +1 -0
- package/dist/{FilesViewerDialog-67WK3TZC.cjs → FilesViewerDialog-4352KIOG.cjs} +30 -22
- package/dist/FilesViewerDialog-4352KIOG.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-3XYAV4BV.cjs} +9 -8
- package/dist/WorkspaceTableView-3XYAV4BV.cjs.map +1 -0
- package/dist/agents/index.cjs +186 -186
- package/dist/{ai-IM4A23YT.cjs → ai-IEIR7SC2.cjs} +17 -15
- package/dist/ai-IEIR7SC2.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 +2 -2
- package/dist/chat/index.cjs +8 -7
- package/dist/{chunk-557MJ4IH.cjs → chunk-2F57IO7S.cjs} +9 -146
- package/dist/chunk-2F57IO7S.cjs.map +1 -0
- package/dist/chunk-2RLA6QO2.cjs +174 -0
- package/dist/chunk-2RLA6QO2.cjs.map +1 -0
- package/dist/chunk-4TTX6ZNS.cjs +1374 -0
- package/dist/chunk-4TTX6ZNS.cjs.map +1 -0
- package/dist/chunk-5GCCUXMT.cjs +63 -0
- package/dist/chunk-5GCCUXMT.cjs.map +1 -0
- package/dist/{chunk-BUVIBHFU.cjs → chunk-5QERK4PK.cjs} +38 -38
- package/dist/chunk-5QERK4PK.cjs.map +1 -0
- package/dist/chunk-6OK7ESTL.cjs +134 -0
- package/dist/chunk-6OK7ESTL.cjs.map +1 -0
- package/dist/{chunk-ECLUFKYR.cjs → chunk-7557LDAN.cjs} +4 -4
- package/dist/{chunk-ECLUFKYR.cjs.map → chunk-7557LDAN.cjs.map} +1 -1
- package/dist/{chunk-KTQOGT2L.cjs → chunk-7L4X6QN2.cjs} +7 -7
- package/dist/{chunk-KTQOGT2L.cjs.map → chunk-7L4X6QN2.cjs.map} +1 -1
- package/dist/{chunk-BP3IJ34D.cjs → chunk-7NLO7ASW.cjs} +4 -4
- package/dist/{chunk-BP3IJ34D.cjs.map → chunk-7NLO7ASW.cjs.map} +1 -1
- package/dist/{chunk-3GWWOYGS.cjs → chunk-7PN3YENO.cjs} +4 -4
- package/dist/{chunk-3GWWOYGS.cjs.map → chunk-7PN3YENO.cjs.map} +1 -1
- package/dist/{chunk-DFBDQKGE.cjs → chunk-ADDQKZ5I.cjs} +4 -4
- package/dist/{chunk-DFBDQKGE.cjs.map → chunk-ADDQKZ5I.cjs.map} +1 -1
- package/dist/chunk-AFQTQC7A.cjs +35 -0
- package/dist/chunk-AFQTQC7A.cjs.map +1 -0
- package/dist/{chunk-NLSWDP42.cjs → chunk-ALK3PUUB.cjs} +21 -11
- package/dist/chunk-ALK3PUUB.cjs.map +1 -0
- package/dist/{chunk-775S43W7.cjs → chunk-CQQQIZU4.cjs} +8 -8
- package/dist/{chunk-775S43W7.cjs.map → chunk-CQQQIZU4.cjs.map} +1 -1
- package/dist/{chunk-TDO5UWXF.cjs → chunk-E3L5DB5F.cjs} +5 -5
- package/dist/{chunk-TDO5UWXF.cjs.map → chunk-E3L5DB5F.cjs.map} +1 -1
- package/dist/chunk-GFUOCGY6.cjs +32 -0
- package/dist/chunk-GFUOCGY6.cjs.map +1 -0
- package/dist/chunk-HYUKPHCT.cjs +66 -0
- package/dist/chunk-HYUKPHCT.cjs.map +1 -0
- package/dist/{chunk-QQWHG3KF.cjs → chunk-JJZOL5MG.cjs} +4 -4
- package/dist/{chunk-QQWHG3KF.cjs.map → chunk-JJZOL5MG.cjs.map} +1 -1
- package/dist/chunk-K4763GD5.cjs +301 -0
- package/dist/chunk-K4763GD5.cjs.map +1 -0
- package/dist/{chunk-B3LZITVF.cjs → chunk-KA3F6TIH.cjs} +2 -442
- package/dist/chunk-KA3F6TIH.cjs.map +1 -0
- package/dist/{chunk-PGJYD67F.cjs → chunk-KNGZZC4O.cjs} +7 -6
- package/dist/chunk-KNGZZC4O.cjs.map +1 -0
- package/dist/{chunk-YYPZOEED.cjs → chunk-LHWOKOMP.cjs} +23 -2
- package/dist/chunk-LHWOKOMP.cjs.map +1 -0
- package/dist/{chunk-HA66DHW6.cjs → chunk-MLA2BJ2Y.cjs} +28 -28
- package/dist/chunk-MLA2BJ2Y.cjs.map +1 -0
- package/dist/{chunk-CPR6EHG7.cjs → chunk-NG2EE7HR.cjs} +134 -10
- package/dist/chunk-NG2EE7HR.cjs.map +1 -0
- package/dist/{chunk-CKCG4NDB.cjs → chunk-OHHKBURG.cjs} +29 -29
- package/dist/chunk-OHHKBURG.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-YYSBWMDJ.cjs → chunk-QG2U2JGX.cjs} +4 -4
- package/dist/{chunk-YYSBWMDJ.cjs.map → chunk-QG2U2JGX.cjs.map} +1 -1
- package/dist/{chunk-5IZFSAEZ.cjs → chunk-SDRYSLOX.cjs} +4 -4
- package/dist/{chunk-5IZFSAEZ.cjs.map → chunk-SDRYSLOX.cjs.map} +1 -1
- package/dist/{chunk-NJCK6V6U.cjs → chunk-T73BHNQX.cjs} +2 -58
- package/dist/chunk-T73BHNQX.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-6UTKM5AB.cjs → chunk-UFT22LAB.cjs} +75 -75
- package/dist/chunk-UFT22LAB.cjs.map +1 -0
- package/dist/chunk-USNTRL22.cjs +4790 -0
- package/dist/chunk-USNTRL22.cjs.map +1 -0
- package/dist/{chunk-X36UR4A7.cjs → chunk-UTJ223TI.cjs} +413 -90
- package/dist/chunk-UTJ223TI.cjs.map +1 -0
- package/dist/{chunk-VZCPMXWC.cjs → chunk-V6MW7B4B.cjs} +4 -4
- package/dist/{chunk-VZCPMXWC.cjs.map → chunk-V6MW7B4B.cjs.map} +1 -1
- package/dist/{chunk-T23UTIRI.cjs → chunk-VWBYE3XY.cjs} +5 -5
- package/dist/{chunk-T23UTIRI.cjs.map → chunk-VWBYE3XY.cjs.map} +1 -1
- package/dist/chunk-WFMWKPGY.cjs +102 -0
- package/dist/chunk-WFMWKPGY.cjs.map +1 -0
- package/dist/chunk-WOOOMTTA.cjs +19 -0
- package/dist/chunk-WOOOMTTA.cjs.map +1 -0
- package/dist/{chunk-W6INT5GS.cjs → chunk-WRLGLZIA.cjs} +8 -8
- package/dist/{chunk-W6INT5GS.cjs.map → chunk-WRLGLZIA.cjs.map} +1 -1
- 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-XF355M7O.cjs +154 -0
- package/dist/chunk-XF355M7O.cjs.map +1 -0
- package/dist/{chunk-Q6CLWOP2.cjs → chunk-XGM4VVNV.cjs} +34 -34
- package/dist/{chunk-Q6CLWOP2.cjs.map → chunk-XGM4VVNV.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-E7TE2WVT.cjs → chunk-ZVEW3JBT.cjs} +3 -3
- package/dist/{chunk-E7TE2WVT.cjs.map → chunk-ZVEW3JBT.cjs.map} +1 -1
- package/dist/collaboration/index.cjs +70 -70
- 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 +10 -10
- package/dist/connect/index.cjs +1066 -1147
- package/dist/connect/index.cjs.map +1 -1
- package/dist/connect/viewer.cjs +19 -12
- package/dist/connection/ai.d.ts +1 -1
- package/dist/connection/conversation/ConnectedMessage.js +1 -1
- package/dist/connection/conversation/ConnectedMessage.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/documentColumns.js +1 -1
- 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 +222 -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 +39 -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 +21 -0
- package/dist/connection/presentation/requests.js +27 -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/shell/ConnectedAppShell.js +5 -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 +28 -29
- 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 +41 -1
- package/dist/connection/viewer/ViewerPdfPane.js.map +2 -2
- package/dist/connection/viewer/documentPlace.d.ts +5 -4
- package/dist/connection/viewer/documentPlace.js +2 -2
- package/dist/connection/viewer/documentPlace.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/PdfClipOutlines.d.ts +11 -0
- package/dist/connection/viewer/pdf/PdfClipOutlines.js +42 -0
- package/dist/connection/viewer/pdf/PdfClipOutlines.js.map +7 -0
- package/dist/connection/viewer/pdf/clipOutlines.d.ts +17 -0
- package/dist/connection/viewer/pdf/clipOutlines.js +24 -0
- package/dist/connection/viewer/pdf/clipOutlines.js.map +7 -0
- package/dist/connection/viewer/pdf/passageHighlights.d.ts +2 -0
- package/dist/connection/viewer/pdf/passageHighlights.js +12 -1
- package/dist/connection/viewer/pdf/passageHighlights.js.map +2 -2
- package/dist/connection/viewer/pdf/usePdfClipOutlines.d.ts +7 -0
- package/dist/connection/viewer/pdf/usePdfClipOutlines.js +36 -0
- package/dist/connection/viewer/pdf/usePdfClipOutlines.js.map +7 -0
- package/dist/connection/viewer/pdf/usePdfPassageHighlights.js +11 -2
- package/dist/connection/viewer/pdf/usePdfPassageHighlights.js.map +2 -2
- 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/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 +17 -15
- package/dist/files/GridViewImpl.js +1 -1
- package/dist/files/GridViewImpl.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 +224 -224
- package/dist/files/navigator/DocumentSearchList.js +1 -1
- package/dist/files/navigator/DocumentSearchList.js.map +2 -2
- package/dist/index.cjs +359 -356
- 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/PresentControls.d.ts +11 -0
- package/dist/presentation/PresentControls.js +117 -0
- package/dist/presentation/PresentControls.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 +100 -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 +375 -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 +44 -0
- package/dist/presentation/panel-id.js +29 -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 +58 -0
- package/dist/presentation/slide-layout.js +133 -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 +149 -148
- package/dist/shell/PanelPortal.js +13 -3
- package/dist/shell/PanelPortal.js.map +2 -2
- package/dist/shell/index.cjs +49 -46
- package/dist/shell/panel-windows.d.ts +2 -0
- package/dist/shell/panel-windows.js +8 -2
- package/dist/shell/panel-windows.js.map +2 -2
- package/dist/studio/index.cjs +8 -6
- package/dist/studio/index.cjs.map +1 -1
- package/dist/styles.css +1 -1
- package/dist/workflow-canvas/index.cjs +26 -25
- 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-BPIAJJED.cjs.map +0 -1
- package/dist/FilesViewerDialog-67WK3TZC.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-BUVIBHFU.cjs.map +0 -1
- package/dist/chunk-CKCG4NDB.cjs.map +0 -1
- package/dist/chunk-CPR6EHG7.cjs.map +0 -1
- package/dist/chunk-HA66DHW6.cjs.map +0 -1
- package/dist/chunk-NJCK6V6U.cjs.map +0 -1
- package/dist/chunk-NLSWDP42.cjs.map +0 -1
- package/dist/chunk-PGJYD67F.cjs.map +0 -1
- package/dist/chunk-X36UR4A7.cjs.map +0 -1
- package/dist/chunk-YYPZOEED.cjs.map +0 -1
|
@@ -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,
|
|
@@ -63,6 +57,8 @@ import {
|
|
|
63
57
|
SignatureStatus,
|
|
64
58
|
VersionSnapshotBar
|
|
65
59
|
} from "../../document-tools/index.js";
|
|
60
|
+
import { useViewerClipping } from "../presentation/useViewerClipping.js";
|
|
61
|
+
import { useCleanView } from "./useCleanView.js";
|
|
66
62
|
import {
|
|
67
63
|
DocumentLabelBar,
|
|
68
64
|
PdfPageNav,
|
|
@@ -89,6 +85,7 @@ import { ConnectedDocumentToolsProvider } from "./ConnectedDocumentToolsProvider
|
|
|
89
85
|
import { FinaliseTranslationButton } from "./FinaliseTranslationButton.js";
|
|
90
86
|
import { useDocumentViewerSupport } from "./support.js";
|
|
91
87
|
import { useImageCrop } from "./useImageCrop.js";
|
|
88
|
+
import { ViewerCropModal } from "./ViewerCropModal.js";
|
|
92
89
|
import { useViewedDocument } from "./useViewedDocument.js";
|
|
93
90
|
import { useViewerBlobs } from "./useViewerBlobs.js";
|
|
94
91
|
import { useViewerTabs } from "./useViewerTabs.js";
|
|
@@ -98,6 +95,7 @@ import { ParsedTextView } from "./parsed/ParsedTextView.js";
|
|
|
98
95
|
import { ViewerPdfPane } from "./ViewerPdfPane.js";
|
|
99
96
|
import { ConnectedNativeDocxEditor as NativeDocxEditor } from "../docx/ConnectedNativeDocxEditor.js";
|
|
100
97
|
import { canChangeVisibility } from "../../files/permissions.js";
|
|
98
|
+
import { SlidesTab } from "./slidesTabChunk.js";
|
|
101
99
|
const StreamedWordArtifact = lazy(
|
|
102
100
|
() => import("../docx/ConnectedStreamedWordArtifact.js").then((m) => ({
|
|
103
101
|
default: m.ConnectedStreamedWordArtifact
|
|
@@ -179,6 +177,7 @@ function DocumentViewerContent({
|
|
|
179
177
|
streamingDoc,
|
|
180
178
|
isStreaming,
|
|
181
179
|
draftDoc,
|
|
180
|
+
isPresentation,
|
|
182
181
|
isDraft,
|
|
183
182
|
isCaptureDraft,
|
|
184
183
|
labelSummaries,
|
|
@@ -298,7 +297,7 @@ function DocumentViewerContent({
|
|
|
298
297
|
signatureDocumentId,
|
|
299
298
|
!isDraft && !liveKind
|
|
300
299
|
);
|
|
301
|
-
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);
|
|
302
301
|
const currentVersionLabel = isCoEditing ? void 0 : !snapshotDocumentId && !compareDocumentId && (isDocx || isArtifact && !liveKind) ? "Live" : versionLabel(versions, snapshotDocumentId || documentId);
|
|
303
302
|
const compareVersionLabel = versionLabel(versions, compareDocumentId);
|
|
304
303
|
const snapshotNumber = findVersion(versions, snapshotDocumentId)?.number;
|
|
@@ -422,6 +421,8 @@ function DocumentViewerContent({
|
|
|
422
421
|
isSnapshot: !!snapshotDocumentId,
|
|
423
422
|
isComparing
|
|
424
423
|
});
|
|
424
|
+
const clip = useViewerClipping(annotatable || !!pdfBlob && (isImage || isVideo), isCompact);
|
|
425
|
+
const clean = useCleanView();
|
|
425
426
|
const signatureBanner = !isDraft && !liveKind && !snapshotDocumentId && /* @__PURE__ */ jsx(
|
|
426
427
|
SignatureRequestBanner,
|
|
427
428
|
{
|
|
@@ -460,11 +461,13 @@ function DocumentViewerContent({
|
|
|
460
461
|
compact: isCompact,
|
|
461
462
|
onClick: () => {
|
|
462
463
|
setPlacingSignature(false);
|
|
464
|
+
clip.stop();
|
|
463
465
|
markup.setShowOriginal(false);
|
|
464
466
|
setAnnotating((on) => !on);
|
|
465
467
|
}
|
|
466
468
|
}
|
|
467
469
|
),
|
|
470
|
+
clip.button,
|
|
468
471
|
activeTab === "pdf" && pdfBlob && !placingSignature && (markup.hasMarkup || annotating) && /* @__PURE__ */ jsx(
|
|
469
472
|
ShowOriginalButton,
|
|
470
473
|
{
|
|
@@ -725,22 +728,8 @@ function DocumentViewerContent({
|
|
|
725
728
|
)
|
|
726
729
|
] }),
|
|
727
730
|
compareRow: isComparing ? compareIndicator || void 0 : void 0,
|
|
728
|
-
|
|
729
|
-
|
|
730
|
-
/* @__PURE__ */ jsx(
|
|
731
|
-
ImageCropModal,
|
|
732
|
-
{
|
|
733
|
-
open: crop.cropImageUrl !== null,
|
|
734
|
-
image: crop.cropImageUrl,
|
|
735
|
-
title: "Crop image",
|
|
736
|
-
saveLabel: "Save as a copy",
|
|
737
|
-
aspectOptions: DEFAULT_ASPECT_OPTIONS,
|
|
738
|
-
output: { mimeType: "image/png" },
|
|
739
|
-
onComplete: crop.handleCropComplete,
|
|
740
|
-
onCancel: crop.closeCrop
|
|
741
|
-
}
|
|
742
|
-
)
|
|
743
|
-
),
|
|
731
|
+
...clean.frame,
|
|
732
|
+
footer: /* @__PURE__ */ jsx(ViewerCropModal, { crop }),
|
|
744
733
|
children: [
|
|
745
734
|
isComparing && /* @__PURE__ */ jsx(Suspense, { fallback: /* @__PURE__ */ jsx(ViewerMessage, { children: "Loading comparison\u2026" }), children: /* @__PURE__ */ jsx(
|
|
746
735
|
NativeDocxComparison,
|
|
@@ -752,14 +741,14 @@ function DocumentViewerContent({
|
|
|
752
741
|
) }),
|
|
753
742
|
isCaptureDraft && /* @__PURE__ */ jsx(ViewerCaptureDraft, { documentId }),
|
|
754
743
|
!isCaptureDraft && (activeTab === "pdf" || isMedia && activeTab === "html") && (!isArtifact || isDocx && !isDraft && !isStreaming && !liveKind) && !isComparing && /* @__PURE__ */ jsxs(ViewerPane, { hidden: activeTab !== "pdf", children: [
|
|
755
|
-
/* @__PURE__ */ jsx(DocumentLabelBar, { summaries: labelSummaries }),
|
|
756
|
-
!isMedia && !isImage && signatureBanner,
|
|
757
|
-
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: [
|
|
758
747
|
"Offline copy: its version cannot be verified. Reconnect before signing.",
|
|
759
748
|
" ",
|
|
760
749
|
/* @__PURE__ */ jsx("button", { type: "button", onClick: () => void blobs.retryPdf(), className: "underline", children: "Retry loading the current PDF" })
|
|
761
750
|
] }),
|
|
762
|
-
activeTab === "pdf" && !isMedia && !isImage && /* @__PURE__ */ jsx(
|
|
751
|
+
!clean.on && activeTab === "pdf" && !isMedia && !isImage && /* @__PURE__ */ jsx(
|
|
763
752
|
MarkupNotices,
|
|
764
753
|
{
|
|
765
754
|
legacyPrompt: markup.legacyPrompt,
|
|
@@ -767,7 +756,7 @@ function DocumentViewerContent({
|
|
|
767
756
|
onOpenVersion: (n) => setSnapshotDocumentId(`${documentId}@v${n}`)
|
|
768
757
|
}
|
|
769
758
|
),
|
|
770
|
-
/* @__PURE__ */ jsx(ViewerControlBar, { controls: activeTab === "pdf" && pageNav, children: /* @__PURE__ */ jsx(
|
|
759
|
+
/* @__PURE__ */ jsx(ViewerControlBar, { controls: !clean.on && activeTab === "pdf" && pageNav, children: /* @__PURE__ */ jsx(
|
|
771
760
|
ViewerPdfPane,
|
|
772
761
|
{
|
|
773
762
|
documentId,
|
|
@@ -788,6 +777,7 @@ function DocumentViewerContent({
|
|
|
788
777
|
setIsSignOpen(true);
|
|
789
778
|
},
|
|
790
779
|
annotating,
|
|
780
|
+
clipping: clip.clipping,
|
|
791
781
|
markup,
|
|
792
782
|
pdfSnapshotNumber,
|
|
793
783
|
isSigned,
|
|
@@ -851,6 +841,15 @@ function DocumentViewerContent({
|
|
|
851
841
|
}
|
|
852
842
|
),
|
|
853
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
|
+
) }),
|
|
854
853
|
activeTab === "docx" && isDocx && !isComparing && /* @__PURE__ */ jsxs(Suspense, { fallback: /* @__PURE__ */ jsx(ViewerMessage, { children: "Loading editor\u2026" }), children: [
|
|
855
854
|
signatureBanner,
|
|
856
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 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 {\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 <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\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
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../../../src/connection/viewer/ViewerCropModal.tsx"],
|
|
4
|
+
"sourcesContent": ["import { DEFAULT_ASPECT_OPTIONS, ImageCropModal } from '@arbidocs/react'\nimport type { useImageCrop } from './useImageCrop'\n\n/** The viewer's image crop: to a new document, at full resolution (a crop frames, it never downscales). */\nexport function ViewerCropModal({ crop }: { crop: ReturnType<typeof useImageCrop> }) {\n return (\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"],
|
|
5
|
+
"mappings": ";AAMI;AANJ,SAAS,wBAAwB,sBAAsB;AAIhD,SAAS,gBAAgB,EAAE,KAAK,GAA8C;AACnF,SACE;AAAA,IAAC;AAAA;AAAA,MACC,MAAM,KAAK,iBAAiB;AAAA,MAC5B,OAAO,KAAK;AAAA,MACZ,OAAM;AAAA,MACN,WAAU;AAAA,MACV,eAAe;AAAA,MACf,QAAQ,EAAE,UAAU,YAAY;AAAA,MAChC,YAAY,KAAK;AAAA,MACjB,UAAU,KAAK;AAAA;AAAA,EACjB;AAEJ;",
|
|
6
|
+
"names": []
|
|
7
|
+
}
|
|
@@ -34,6 +34,8 @@ export interface ViewerPdfPaneProps {
|
|
|
34
34
|
placingSignature: boolean;
|
|
35
35
|
onPlacingDone: (appearance?: SignatureAppearance) => void;
|
|
36
36
|
annotating: boolean;
|
|
37
|
+
/** Clip mode: dragging over a page adds that area to the presentation. */
|
|
38
|
+
clipping?: boolean;
|
|
37
39
|
markup: ReturnType<typeof useDocumentMarkup>;
|
|
38
40
|
pdfSnapshotNumber: number | undefined;
|
|
39
41
|
isSigned: boolean;
|
|
@@ -44,4 +46,4 @@ export interface ViewerPdfPaneProps {
|
|
|
44
46
|
key: number;
|
|
45
47
|
} | null;
|
|
46
48
|
}
|
|
47
|
-
export declare function ViewerPdfPane({ documentId, doc, pdfBlob, isPdfLoading, pdfError, onDownload, viewerProps, signatureFlow, onSignatureFlow, currentUserId, placingSignature, onPlacingDone, annotating, markup, pdfSnapshotNumber, isSigned, placeMark, }: ViewerPdfPaneProps): import("react").JSX.Element;
|
|
49
|
+
export declare function ViewerPdfPane({ documentId, doc, pdfBlob, isPdfLoading, pdfError, onDownload, viewerProps, signatureFlow, onSignatureFlow, currentUserId, placingSignature, onPlacingDone, annotating, clipping, markup, pdfSnapshotNumber, isSigned, placeMark, }: ViewerPdfPaneProps): import("react").JSX.Element;
|