@arbidocs/blocks 0.5.123 → 0.5.125
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 → ClippingMediaViewer-ZFEX5A3U.cjs} +11 -10
- package/dist/ClippingMediaViewer-ZFEX5A3U.cjs.map +1 -0
- package/dist/{ClippingPdfViewer-OGYLMVCE.cjs → ClippingPdfViewer-3LRTEPHV.cjs} +45 -11
- package/dist/ClippingPdfViewer-3LRTEPHV.cjs.map +1 -0
- package/dist/ConnectedCallDock-XJOYVVAH.cjs +6 -6
- package/dist/ConnectedCallRoom-CUDYAPQK.cjs +6 -6
- package/dist/{ConnectedNativeDocxComparison-QKHCYD6W.cjs → ConnectedNativeDocxComparison-7QQ55JIO.cjs} +13 -13
- package/dist/{ConnectedNativeDocxComparison-QKHCYD6W.cjs.map → ConnectedNativeDocxComparison-7QQ55JIO.cjs.map} +1 -1
- package/dist/{ConnectedPresentation-5DOJ35XL.cjs → ConnectedPresentation-L32JPRFI.cjs} +30 -156
- package/dist/ConnectedPresentation-L32JPRFI.cjs.map +1 -0
- package/dist/{ConnectedProductionSetDialog-LHB4VQWC.cjs → ConnectedProductionSetDialog-4EAY6KAZ.cjs} +3 -3
- package/dist/{ConnectedProductionSetDialog-LHB4VQWC.cjs.map → ConnectedProductionSetDialog-4EAY6KAZ.cjs.map} +1 -1
- package/dist/{ConnectedSlidesTab-7YMEDGUU.cjs → ConnectedSlidesTab-P7GGNUTO.cjs} +31 -29
- package/dist/ConnectedSlidesTab-P7GGNUTO.cjs.map +1 -0
- package/dist/{ConnectedStreamedWordArtifact-AG62232A.cjs → ConnectedStreamedWordArtifact-7NJ3N52V.cjs} +13 -13
- package/dist/{ConnectedStreamedWordArtifact-AG62232A.cjs.map → ConnectedStreamedWordArtifact-7NJ3N52V.cjs.map} +1 -1
- package/dist/{DocumentReviewCard-M53XFLI2.cjs → DocumentReviewCard-BFPOFQXI.cjs} +16 -16
- package/dist/{DocumentReviewCard-M53XFLI2.cjs.map → DocumentReviewCard-BFPOFQXI.cjs.map} +1 -1
- package/dist/{FilesViewerDialog-2QCCRWF2.cjs → FilesViewerDialog-MHUVEZ7M.cjs} +35 -32
- package/dist/FilesViewerDialog-MHUVEZ7M.cjs.map +1 -0
- package/dist/{NativeDocxEditor-2LQY2CTV.cjs → NativeDocxEditor-SIRYPMBN.cjs} +6 -6
- package/dist/{NativeDocxEditor-2LQY2CTV.cjs.map → NativeDocxEditor-SIRYPMBN.cjs.map} +1 -1
- package/dist/SpotlightStrip-ED22UYTM.cjs +398 -0
- package/dist/SpotlightStrip-ED22UYTM.cjs.map +1 -0
- package/dist/{WorkspaceTableView-3XYAV4BV.cjs → WorkspaceTableView-MIFYXV3G.cjs} +8 -8
- package/dist/{WorkspaceTableView-3XYAV4BV.cjs.map → WorkspaceTableView-MIFYXV3G.cjs.map} +1 -1
- package/dist/agents/index.cjs +216 -216
- package/dist/ai-IEIR7SC2.cjs +3 -3
- package/dist/auth/index.cjs +1 -1
- package/dist/calls/index.cjs +2 -2
- package/dist/chat/index.cjs +6 -6
- package/dist/{chunk-GNZAH6UI.cjs → chunk-2K6IMIVL.cjs} +3 -3
- package/dist/{chunk-GNZAH6UI.cjs.map → chunk-2K6IMIVL.cjs.map} +1 -1
- package/dist/{chunk-NQML7IUC.cjs → chunk-3UP32FM3.cjs} +6 -6
- package/dist/{chunk-NQML7IUC.cjs.map → chunk-3UP32FM3.cjs.map} +1 -1
- package/dist/chunk-3ZZZO4F7.cjs +145 -0
- package/dist/chunk-3ZZZO4F7.cjs.map +1 -0
- package/dist/{chunk-L4CIFLCU.cjs → chunk-4LP5MJGQ.cjs} +4 -4
- package/dist/{chunk-L4CIFLCU.cjs.map → chunk-4LP5MJGQ.cjs.map} +1 -1
- package/dist/{chunk-JD2HX2BR.cjs → chunk-6JMW3IJ2.cjs} +152 -155
- package/dist/chunk-6JMW3IJ2.cjs.map +1 -0
- package/dist/{chunk-WV7BCGCK.cjs → chunk-7RJZIPLE.cjs} +33 -33
- package/dist/{chunk-WV7BCGCK.cjs.map → chunk-7RJZIPLE.cjs.map} +1 -1
- package/dist/{chunk-WFMWKPGY.cjs → chunk-ADPRIBSH.cjs} +9 -33
- package/dist/chunk-ADPRIBSH.cjs.map +1 -0
- package/dist/{chunk-7NLO7ASW.cjs → chunk-AISYXX4M.cjs} +4 -4
- package/dist/{chunk-7NLO7ASW.cjs.map → chunk-AISYXX4M.cjs.map} +1 -1
- package/dist/{chunk-5QERK4PK.cjs → chunk-AS6QZETU.cjs} +35 -35
- package/dist/{chunk-5QERK4PK.cjs.map → chunk-AS6QZETU.cjs.map} +1 -1
- package/dist/{chunk-V6MW7B4B.cjs → chunk-B3R62764.cjs} +6 -6
- package/dist/{chunk-V6MW7B4B.cjs.map → chunk-B3R62764.cjs.map} +1 -1
- package/dist/{chunk-VKH3BEZE.cjs → chunk-BLIO3B7Z.cjs} +3 -3
- package/dist/{chunk-VKH3BEZE.cjs.map → chunk-BLIO3B7Z.cjs.map} +1 -1
- package/dist/{chunk-46P7IDBX.cjs → chunk-CQ2RJYE2.cjs} +4 -4
- package/dist/chunk-CQ2RJYE2.cjs.map +1 -0
- package/dist/{chunk-MXBXZXXQ.cjs → chunk-ENOPKX7E.cjs} +3 -3
- package/dist/{chunk-MXBXZXXQ.cjs.map → chunk-ENOPKX7E.cjs.map} +1 -1
- package/dist/{chunk-2CSLFAGF.cjs → chunk-GAMRVB3I.cjs} +4 -3
- package/dist/chunk-GAMRVB3I.cjs.map +1 -0
- package/dist/chunk-IRGRMJPP.cjs +18 -0
- package/dist/{chunk-SDRYSLOX.cjs.map → chunk-IRGRMJPP.cjs.map} +1 -1
- package/dist/{chunk-ADDQKZ5I.cjs → chunk-J3FFSEKO.cjs} +4 -4
- package/dist/{chunk-ADDQKZ5I.cjs.map → chunk-J3FFSEKO.cjs.map} +1 -1
- package/dist/chunk-JITYC4OS.cjs +66 -0
- package/dist/chunk-JITYC4OS.cjs.map +1 -0
- package/dist/chunk-JY7UUZQG.cjs +1513 -0
- package/dist/chunk-JY7UUZQG.cjs.map +1 -0
- package/dist/{chunk-ALK3PUUB.cjs → chunk-L6HTZIBD.cjs} +3 -3
- package/dist/{chunk-ALK3PUUB.cjs.map → chunk-L6HTZIBD.cjs.map} +1 -1
- package/dist/chunk-MVXHTAJ4.cjs +111 -0
- package/dist/chunk-MVXHTAJ4.cjs.map +1 -0
- package/dist/{chunk-OHHKBURG.cjs → chunk-OGK377NL.cjs} +33 -33
- package/dist/{chunk-OHHKBURG.cjs.map → chunk-OGK377NL.cjs.map} +1 -1
- package/dist/{chunk-T73BHNQX.cjs → chunk-OHWHYVKG.cjs} +3 -3
- package/dist/{chunk-T73BHNQX.cjs.map → chunk-OHWHYVKG.cjs.map} +1 -1
- package/dist/{chunk-4TTX6ZNS.cjs → chunk-ORNLCBNE.cjs} +24 -2
- package/dist/chunk-ORNLCBNE.cjs.map +1 -0
- package/dist/{chunk-MLA2BJ2Y.cjs → chunk-PSB64T43.cjs} +28 -28
- package/dist/{chunk-MLA2BJ2Y.cjs.map → chunk-PSB64T43.cjs.map} +1 -1
- package/dist/{chunk-COD5ENHK.cjs → chunk-PVJ5ODDB.cjs} +4 -4
- package/dist/{chunk-COD5ENHK.cjs.map → chunk-PVJ5ODDB.cjs.map} +1 -1
- package/dist/{chunk-7557LDAN.cjs → chunk-PWBRE7JA.cjs} +5 -5
- package/dist/{chunk-7557LDAN.cjs.map → chunk-PWBRE7JA.cjs.map} +1 -1
- package/dist/{chunk-7PN3YENO.cjs → chunk-QIK7E6VF.cjs} +4 -4
- package/dist/{chunk-7PN3YENO.cjs.map → chunk-QIK7E6VF.cjs.map} +1 -1
- package/dist/{chunk-DWMWEALB.cjs → chunk-TSFNLY3K.cjs} +143 -1634
- package/dist/chunk-TSFNLY3K.cjs.map +1 -0
- package/dist/{chunk-YGBHY67W.cjs → chunk-UA7HOLAZ.cjs} +5 -5
- package/dist/{chunk-YGBHY67W.cjs.map → chunk-UA7HOLAZ.cjs.map} +1 -1
- package/dist/{chunk-KXIRVKCJ.cjs → chunk-UUENH4BJ.cjs} +3 -3
- package/dist/{chunk-KXIRVKCJ.cjs.map → chunk-UUENH4BJ.cjs.map} +1 -1
- package/dist/chunk-WVZLAAIZ.cjs +31 -0
- package/dist/chunk-WVZLAAIZ.cjs.map +1 -0
- package/dist/{chunk-E3L5DB5F.cjs → chunk-YOEP3I4V.cjs} +5 -5
- package/dist/{chunk-E3L5DB5F.cjs.map → chunk-YOEP3I4V.cjs.map} +1 -1
- package/dist/{chunk-SNPK3R3O.cjs → chunk-YVO6Z5BS.cjs} +10 -10
- package/dist/{chunk-SNPK3R3O.cjs.map → chunk-YVO6Z5BS.cjs.map} +1 -1
- package/dist/chunk-ZZZITHGK.cjs +119 -0
- package/dist/chunk-ZZZITHGK.cjs.map +1 -0
- package/dist/connect/docx.cjs +17 -17
- package/dist/connect/index.cjs +994 -994
- package/dist/connect/viewer.cjs +28 -25
- package/dist/connection/presentation/ClippingMediaViewer.js +3 -3
- package/dist/connection/presentation/ClippingMediaViewer.js.map +2 -2
- package/dist/connection/presentation/ClippingPdfViewer.d.ts +4 -3
- package/dist/connection/presentation/ClippingPdfViewer.js +48 -9
- package/dist/connection/presentation/ClippingPdfViewer.js.map +2 -2
- package/dist/connection/presentation/SpotlightLayer.d.ts +5 -0
- package/dist/connection/presentation/SpotlightLayer.js +19 -0
- package/dist/connection/presentation/SpotlightLayer.js.map +7 -0
- package/dist/connection/presentation/SpotlightStrip.d.ts +10 -0
- package/dist/connection/presentation/SpotlightStrip.js +237 -0
- package/dist/connection/presentation/SpotlightStrip.js.map +7 -0
- package/dist/connection/presentation/useViewerClipping.d.ts +4 -3
- package/dist/connection/presentation/useViewerClipping.js +8 -4
- package/dist/connection/presentation/useViewerClipping.js.map +2 -2
- package/dist/connection/viewer/ConnectedDocumentViewer.js +1 -1
- package/dist/connection/viewer/ConnectedDocumentViewer.js.map +2 -2
- package/dist/connection/viewer/VersionDropdown.js +1 -1
- package/dist/connection/viewer/VersionDropdown.js.map +1 -1
- package/dist/connection/viewer/ViewerPdfPane.js +2 -0
- package/dist/connection/viewer/ViewerPdfPane.js.map +2 -2
- package/dist/connection/viewer/pdf/passageHighlights.d.ts +5 -0
- package/dist/connection/viewer/pdf/passageHighlights.js +14 -1
- package/dist/connection/viewer/pdf/passageHighlights.js.map +2 -2
- package/dist/connection/viewer/pdf/usePassageTextFallback.d.ts +12 -0
- package/dist/connection/viewer/pdf/usePassageTextFallback.js +30 -0
- package/dist/connection/viewer/pdf/usePassageTextFallback.js.map +7 -0
- package/dist/connection/viewer/pdf/usePdfPassageHighlights.js +2 -11
- package/dist/connection/viewer/pdf/usePdfPassageHighlights.js.map +2 -2
- package/dist/connection/viewer/useCleanView.d.ts +3 -1
- package/dist/connection/viewer/useCleanView.js +6 -3
- package/dist/connection/viewer/useCleanView.js.map +2 -2
- package/dist/connection/viewer/useViewerTabs.js +13 -1
- package/dist/connection/viewer/useViewerTabs.js.map +2 -2
- package/dist/document-tools/DocumentToolButtons.js +1 -1
- package/dist/document-tools/DocumentToolButtons.js.map +1 -1
- package/dist/document-tools/index.cjs +20 -20
- package/dist/docx/DocxCommandMenu.js +2 -1
- package/dist/docx/DocxCommandMenu.js.map +2 -2
- package/dist/docx/index.cjs +38 -38
- package/dist/embed/index.cjs +20 -20
- package/dist/facts/index.cjs +64 -64
- package/dist/files/index.cjs +223 -223
- package/dist/index.cjs +521 -521
- package/dist/presentation/ClipCaptureOverlay.d.ts +7 -3
- package/dist/presentation/ClipCaptureOverlay.js +43 -14
- package/dist/presentation/ClipCaptureOverlay.js.map +2 -2
- package/dist/presentation/PresentControls.d.ts +8 -0
- package/dist/presentation/PresentControls.js +1 -0
- package/dist/presentation/PresentControls.js.map +2 -2
- package/dist/presentation/PresentationStage.d.ts +10 -2
- package/dist/presentation/PresentationStage.js +6 -3
- package/dist/presentation/PresentationStage.js.map +2 -2
- package/dist/presentation/PresenterView.js +1 -22
- package/dist/presentation/PresenterView.js.map +2 -2
- package/dist/presentation/SpotlightView.d.ts +19 -0
- package/dist/presentation/SpotlightView.js +180 -0
- package/dist/presentation/SpotlightView.js.map +7 -0
- package/dist/presentation/passage-clip.d.ts +17 -0
- package/dist/presentation/passage-clip.js +25 -0
- package/dist/presentation/passage-clip.js.map +7 -0
- package/dist/presentation/spotlight.d.ts +58 -0
- package/dist/presentation/spotlight.js +110 -0
- package/dist/presentation/spotlight.js.map +7 -0
- package/dist/presentation/store.d.ts +5 -0
- package/dist/presentation/store.js +19 -0
- package/dist/presentation/store.js.map +2 -2
- package/dist/presentation/usePointerActive.d.ts +2 -0
- package/dist/presentation/usePointerActive.js +28 -0
- package/dist/presentation/usePointerActive.js.map +7 -0
- package/dist/settings/index.cjs +146 -146
- package/dist/site/index.cjs +6 -6
- package/dist/studio/index.cjs +9 -9
- package/dist/styles.css +1 -1
- package/dist/workflow-canvas/index.cjs +35 -35
- package/node_modules/@arbidocs/coedit/package.json +1 -1
- package/package.json +5 -5
- package/dist/ClippingMediaViewer-IEIBT74X.cjs.map +0 -1
- package/dist/ClippingPdfViewer-OGYLMVCE.cjs.map +0 -1
- package/dist/ConnectedPresentation-5DOJ35XL.cjs.map +0 -1
- package/dist/ConnectedSlidesTab-7YMEDGUU.cjs.map +0 -1
- package/dist/FilesViewerDialog-2QCCRWF2.cjs.map +0 -1
- package/dist/chunk-2CSLFAGF.cjs.map +0 -1
- package/dist/chunk-46P7IDBX.cjs.map +0 -1
- package/dist/chunk-4TTX6ZNS.cjs.map +0 -1
- package/dist/chunk-DWMWEALB.cjs.map +0 -1
- package/dist/chunk-JD2HX2BR.cjs.map +0 -1
- package/dist/chunk-SDRYSLOX.cjs +0 -18
- package/dist/chunk-WFMWKPGY.cjs.map +0 -1
- package/dist/chunk-XK4TVJKD.cjs +0 -73
- package/dist/chunk-XK4TVJKD.cjs.map +0 -1
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/connection/viewer/drafts.tsx","../src/connection/presentation/PresentationPill.tsx","../src/connection/presentation/SpotlightLayer.tsx","../src/connection/presentation/useViewerClipping.tsx","../src/connection/viewer/CleanViewControl.tsx","../src/connection/viewer/useCleanView.tsx","../src/connection/viewer/FinaliseTranslationButton.tsx","../src/connection/viewer/useImageCrop.ts","../src/connection/viewer/ViewerCropModal.tsx","../src/connection/viewer/ViewerMoreMenu.tsx","../src/connection/viewer/useViewedDocument.ts","../src/connection/viewer/useViewerBlobs.ts","../src/connection/viewer/useViewerTabs.tsx","../src/connection/viewer/useViewerVersions.ts","../src/connection/viewer/VersionDropdown.tsx","../src/connection/viewer/parsed/document-tags.ts","../src/connection/viewer/parsed/useChunkTagging.ts","../src/connection/viewer/parsed/PassageTagPanel.tsx","../src/connection/viewer/parsed/ParsedPassage.tsx","../src/connection/viewer/parsed/citation-line.ts","../src/connection/viewer/parsed/usePassageCopy.ts","../src/connection/viewer/parsed/useDocumentLabels.ts","../src/connection/viewer/parsed/useCitationSelection.ts","../src/connection/viewer/parsed/usePageScrollSync.ts","../src/connection/viewer/parsed/useLazyPages.ts","../src/connection/viewer/parsed/ParsedTextView.tsx","../src/connection/viewer/pdf/PdfClipOutlines.tsx","../src/connection/viewer/pdf/clipOutlines.ts","../src/connection/viewer/pdf/usePdfClipOutlines.tsx","../src/connection/viewer/pdf/PdfPassageHighlights.tsx","../src/connection/viewer/pdf/usePdfPassageHighlights.tsx","../src/connection/viewer/pdf/usePassageTextFallback.ts","../src/connection/presentation/PresentationFileCard.tsx","../src/connection/viewer/ViewerPdfPane.tsx","../src/connection/viewer/slidesTabChunk.ts","../src/connection/viewer/ConnectedDocumentViewer.tsx"],"names":["jsx","FileText","Mic","VideoIcon","Camera","Presentation","useArbiSessionState","useArbiSessionStore","DropdownMenu","DropdownMenuTrigger","DropdownMenuContent","jsxs","DropdownMenuItem","Check","useUserSettings","useConfig","useSaveConfigField","DraftTitleControls","useArbi","useDictateContext","useBlocksEnvironment","useUploadDocuments","logger","VoiceNoteRecorder","PhotoCapture","VideoCapture","document","isPanelOpen","DOCUMENT_VIEWER_PANEL","useMemo","compareDocumentsIn","RelatedDocumentsCell","useFilesDialogs","usePresentation","showPresentation","Button","lazy","useConnectedWorkspace","useSpotlight","useEffect","Suspense","useCallback","Fragment","ClipButton","useState","cn","toggleFullscreen","Maximize","PanelTop","useRef","useFinaliseTranslation","useDocumentTools","FileCheck2","ImageCropModal","DEFAULT_ASPECT_OPTIONS","MoreHorizontal","useViewerStreamingDocument","useDocument","useConnectedTags","summariseDocTags","isDocumentLabel","isImageFile","isVideoFile","isAudioFile","isPresentationFileName","artifactKindFromMode","artifactKindFromFileName","savedDocumentIdFor","useArtifactSource","useParsedDocument","isDownloadOnlyFile","parseVersionRef","loadOfflineDocument","useDocumentBytes","hasVideoTrack","fetchDocumentFile","friendlyFileType","useIsPhone","VidIcon","AudIcon","ImgIcon","EmlIcon","PdfIcon","History","MonitorPlay","Code","DocIcon","XlsIcon","HtmlIcon","useConnectedDocuments","useDocumentVersionList","documentVersions","toArtifactVersions","useAssignDocTags","useUpdateDocTag","useRemoveDocTags","useDocumentViewerSupport","groups","getEntityColor","TagEntity","TagPassagePanel","memo","ParsedPassage","HtmlPassage","LabelMark","NoteMark","PassageMark","ConnectedMarkdown","buildDeepLinkUrl","React","PassagePill","useViewerPassageCitation","computeSelectionRuns","viewingDocumentPage","usePageIntersectionObserver","useProcessedChunks","useScrollAnchor","usePinchZoom","ViewerMessage","HtmlViewerRoot","DocumentLabelBar","CitedRunNav","HtmlViewerSurface","HtmlPage","HtmlViewerEmpty","NONE","passageBoxesByPage","NO_FOOTNOTES","passagePlaced","EmptyState","presentationTitle","editPresentation","Pencil","useViewerIsDetached","KitPdfViewer","isLegacyPresentationFile","ViewerPreviewUnavailable","ViewerLoadError","VideoViewer","AudioViewer","ImageViewer","ErrorBoundary","ConnectedDocumentToolsProvider","fmtDate","useConnectedConversations","useRegisterOpenDocument","latestThreadOfDocument","useDocumentSignatures","versionLabel","findVersion","useDocumentMarkup","ViewerZoomControl","cycleZoom","PdfPageNav","ViewerPageCounter","ArtifactCompareBar","ViewerTitle","SharingEntity","MarkupViewNote","ViewerStatusNote","SignatureStatus","ViewerHeaderStart","ViewerTabBar","canAnnotate","SignatureRequestBanner","ViewerHeaderEnd","AnnotateButton","ShowOriginalButton","DownloadMarkupButton","SIGNED_LOCKED_REASON","ViewerImageActions","MessageSquare","FileShareDialog","MessageSquarePlus","ShareControl","canChangeVisibility","getEntityLabel","Signature","ChevronDown","PenLine","PlaceMySignatureMenuItems","Users","SignDocumentDialog","Link2","Mail","Languages","ViewerFrame","TabHeader","VersionSnapshotBar","ViewerPane","MarkupNotices","ViewerControlBar","ArtifactPreview","ArtifactCodeView","SignedEditNote","ConnectedNativeDocxEditor","VersionTimeline","XlsxViewer"],"mappings":"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","file":"chunk-6JMW3IJ2.cjs","sourcesContent":["/**\n * The viewer's unsaved drafts (the session's `draftDocuments`, started with `startDraftDocument`)\n * and its related documents. A draft has no backend record until it is saved: its kind (Doc,\n * Voice, Photo, Video) replaces the tabs, its editable name replaces the title, and a capture\n * draft's recorder is the whole body. A capture saves straight to the workspace as its own\n * document (`useUploadDocuments`), with the user's active configuration, so the backend can name it\n * from its content.\n */\n\nimport { useMemo, type FocusEvent, type ReactNode } from 'react'\nimport { Camera, Check, FileText, Mic, Presentation, Video as VideoIcon } from 'lucide-react'\nimport {\n DOCUMENT_VIEWER_PANEL,\n DraftTitleControls,\n PhotoCapture,\n VideoCapture,\n VoiceNoteRecorder,\n isPanelOpen,\n useArbi,\n useArbiSessionState,\n useArbiSessionStore,\n useConfig,\n useSaveConfigField,\n useUploadDocuments,\n useUserSettings,\n type ArbiDraftDocument,\n type ArbiDraftKind,\n type WorkspaceDocument,\n} from '@arbidocs/react'\nimport {\n useDictateContext,\n DropdownMenu,\n DropdownMenuContent,\n DropdownMenuItem,\n DropdownMenuTrigger,\n} from '@arbidocs/react/ui'\nimport { logger } from '@arbidocs/client'\nimport { useBlocksEnvironment } from '../../provider/environment'\nimport { RelatedDocumentsCell } from '../files/grid/cells'\nimport { useFilesDialogs } from '../files/store'\nimport type { ViewerDocumentRecord } from './support'\nimport { compareDocumentsIn } from './compareDocuments'\n\nconst KIND_OPTIONS: { value: ArbiDraftKind; icon: ReactNode; label: string }[] = [\n { value: 'text', icon: <FileText className=\"w-4 h-4\" />, label: 'Doc' },\n { value: 'audio', icon: <Mic className=\"w-4 h-4\" />, label: 'Voice' },\n { value: 'video', icon: <VideoIcon className=\"w-4 h-4\" />, label: 'Video' },\n { value: 'photo', icon: <Camera className=\"w-4 h-4\" />, label: 'Photo' },\n { value: 'presentation', icon: <Presentation className=\"w-4 h-4\" />, label: 'Presentation' },\n]\n\nconst useDraft = (documentId: string): ArbiDraftDocument | undefined =>\n useArbiSessionState((state) => state.draftDocuments[documentId])\n\n/**\n * A draft's kind, in place of the tabs: the icon of its kind opens the four kinds, so the user can\n * switch before capturing or typing anything.\n */\nexport function ViewerDraftKind({ documentId }: { documentId: string }) {\n const draft = useDraft(documentId)\n const session = useArbiSessionStore()\n if (!draft) return null\n const current = KIND_OPTIONS.find((option) => option.value === draft.kind) ?? KIND_OPTIONS[0]\n return (\n <DropdownMenu>\n <DropdownMenuTrigger asChild>\n <button\n type=\"button\"\n title={`Draft kind: ${current.label}. Click to change.`}\n aria-label={`Draft kind: ${current.label}. Click to change.`}\n className=\"px-3 py-2 transition-all duration-200 font-medium border-b-2 border-transparent text-muted-foreground hover:text-foreground hover:border-border flex-shrink-0 flex items-center\"\n data-testid=\"draft-kind-trigger\"\n >\n {current.icon}\n </button>\n </DropdownMenuTrigger>\n <DropdownMenuContent align=\"start\" sideOffset={4} className=\"w-40\">\n {KIND_OPTIONS.map((option) => (\n <DropdownMenuItem\n key={option.value}\n onSelect={() => session.setDraftDocumentKind(documentId, option.value)}\n data-testid={`draft-kind-option-${option.value}`}\n >\n {option.icon}\n <span>{option.label}</span>\n {option.value === draft.kind && <Check className=\"ml-auto w-4 h-4\" />}\n </DropdownMenuItem>\n ))}\n </DropdownMenuContent>\n </DropdownMenu>\n )\n}\n\nconst TITLE_PLACEHOLDER: Record<ArbiDraftKind, string> = {\n text: 'New Doc',\n audio: 'New Audio',\n photo: 'New Photo',\n video: 'New Video',\n presentation: 'New Presentation',\n}\n\n// The draft starts with a real default name (\"New Doc\"), not a placeholder, so focusing the field\n// selects it: typing then replaces it instead of appending to it.\nfunction selectTitleOnFocus(event: FocusEvent<HTMLDivElement>) {\n if (event.target instanceof HTMLInputElement) event.target.select()\n}\n\n/**\n * A draft's editable name, in place of the title, with the auto-name switch: the active\n * configuration's `DoctagLLM.AUTO_RENAME`, the same setting as the upload dialog's.\n */\nexport function ViewerDraftTitle({ documentId }: { documentId: string }) {\n const draft = useDraft(documentId)\n const session = useArbiSessionStore()\n const { data: userSettings } = useUserSettings()\n const { data: activeConfig } = useConfig(userSettings?.last_config || 'default')\n const configField = useSaveConfigField()\n const config = activeConfig as { DoctagLLM?: { AUTO_RENAME?: boolean } } | undefined\n const autoRename = config?.DoctagLLM?.AUTO_RENAME ?? false\n\n if (!draft) return null\n return (\n <div className=\"contents\" onFocus={selectTitleOnFocus}>\n <DraftTitleControls\n title={draft.title}\n onTitleChange={(title) => session.updateDraftDocument(documentId, { title })}\n placeholder={TITLE_PLACEHOLDER[draft.kind] ?? TITLE_PLACEHOLDER.text}\n autoRename={autoRename}\n onAutoRenameChange={(value) => configField.save('DoctagLLM', 'AUTO_RENAME', value)}\n />\n </div>\n )\n}\n\n/** Each capture's file name and the type used when the recorder reports none. */\nconst CAPTURE_FILE: Record<\n 'audio' | 'photo' | 'video',\n { name: string; fallbackType: string; saved: string; label: string }\n> = {\n audio: {\n name: 'voice-note.webm',\n fallbackType: 'audio/webm',\n saved: 'Voice note saved — transcribing…',\n label: 'voice note',\n },\n photo: { name: 'photo.png', fallbackType: 'image/png', saved: 'Photo saved', label: 'photo' },\n video: { name: 'video.webm', fallbackType: 'video/webm', saved: 'Video saved', label: 'video' },\n}\n\n/**\n * A capture draft's recorder (voice, photo or video), the whole body of the viewer. The finished\n * capture is kept in the draft first, so it survives the viewer closing even if the save fails;\n * the draft is cleared once the saved document's id is known and the viewer moves to it.\n */\nexport function ViewerCaptureDraft({ documentId }: { documentId: string }) {\n const draft = useDraft(documentId)\n const session = useArbiSessionStore()\n const arbi = useArbi()\n const dictate = useDictateContext()\n const { notify } = useBlocksEnvironment()\n const upload = useUploadDocuments()\n const { data: userSettings } = useUserSettings()\n\n if (!draft || draft.kind === 'text' || draft.kind === 'presentation') return null\n const kind = draft.kind\n const file = CAPTURE_FILE[kind]\n\n const discard = () => {\n session.clearDraftDocument(documentId)\n session.setViewingDocument(null)\n }\n const save = async (blob: Blob, mimeType: string | null) => {\n session.updateDraftDocument(documentId, { mediaBlob: blob })\n try {\n const response = await upload.mutateAsync({\n files: [new File([blob], file.name, { type: mimeType || file.fallbackType })],\n options: { configExtId: userSettings?.last_config ?? undefined },\n })\n // The id often arrives later (on the realtime channel): only leave the draft for a real one.\n const newDocId = response.doc_ext_ids?.[0]\n if (newDocId) {\n session.clearDraftDocument(documentId)\n session.setViewingDocument({ id: newDocId, page: null })\n }\n notify(file.saved, 'success')\n } catch (err) {\n logger.error(`[ViewerCaptureDraft] Saving the ${file.label} failed`, err)\n notify(`Could not save the ${file.label}. Please try again.`, 'error')\n }\n }\n const onError = (message: string) => notify(message, 'error')\n\n return (\n <div className=\"h-full overflow-hidden\" data-testid=\"media-capture-recorder\">\n {kind === 'audio' && (\n <VoiceNoteRecorder\n title={draft.title}\n isSaving={upload.isPending}\n onSave={save}\n onDiscard={discard}\n onError={onError}\n // A rough transcript while reviewing (the host's dictation, else the session's); the real\n // one comes with the saved document.\n transcribe={(blob) =>\n dictate ? dictate.transcribe(blob) : arbi.assistant.transcribe(blob)\n }\n />\n )}\n {kind === 'photo' && (\n <PhotoCapture\n onSave={save}\n onDiscard={discard}\n onError={onError}\n isSaving={upload.isPending}\n />\n )}\n {kind === 'video' && (\n <VideoCapture\n onSave={save}\n onDiscard={discard}\n onError={onError}\n isSaving={upload.isPending}\n />\n )}\n </div>\n )\n}\n\n/**\n * The documents related to the open one (its email family, copies, near duplicates), beside its\n * name: one opens in the viewer, and each can be deleted or compared with it.\n */\nexport function ViewerRelatedDocuments({ document }: { document: ViewerDocumentRecord }) {\n const session = useArbiSessionStore()\n const related = useArbiSessionState((state) => state.relatedDocuments.get(document.external_id))\n const viewerOpen = useArbiSessionState((state) => isPanelOpen(state, DOCUMENT_VIEWER_PANEL))\n const viewingId = useArbiSessionState((state) => state.viewingDocument?.id ?? null)\n const onCompare = useMemo(\n () => (id: string, otherId: string) => compareDocumentsIn(session, id, otherId),\n [session]\n )\n if (!related) return null\n return (\n <RelatedDocumentsCell\n currentDoc={document as WorkspaceDocument}\n related={related}\n viewingDocumentId={viewerOpen ? viewingId : null}\n onDocumentClick={(id) => session.setViewingDocument({ id, page: null })}\n onDelete={(doc) => useFilesDialogs.getState().requestDelete(doc)}\n onCompare={onCompare}\n />\n )\n}\n","import { Presentation } from 'lucide-react'\nimport { useArbiSessionState, useArbiSessionStore } from '@arbidocs/react'\nimport { Button } from '@arbidocs/react/ui'\nimport { usePresentation } from '../../presentation/store'\nimport { showPresentation } from './requests'\n\n/**\n * Back to the presentation, from any document the viewer shows (clips are gathered while reading,\n * then arranged): its title and how many clips wait in its tray. Shown while a presentation is\n * being made and the viewer is elsewhere.\n */\nexport function PresentationPill({ compact }: { compact: boolean }) {\n const session = useArbiSessionStore()\n const boundTo = usePresentation((s) => s.boundTo)\n const clips = usePresentation((s) => s.clips.length)\n const title = usePresentation((s) => s.title)\n const onIt = useArbiSessionState(\n (s) => s.viewingDocument?.id === boundTo && s.documentViewer.tab === 'slides'\n )\n if (onIt || (boundTo === null && clips === 0)) return null\n const back = () => showPresentation(session, boundTo)\n return (\n <Button\n type=\"button\"\n variant=\"outline\"\n size=\"sm\"\n className=\"h-7 max-w-56 gap-1.5 rounded-full px-2.5 text-xs\"\n onClick={back}\n title={`Back to the presentation \"${title}\": ${clips} clip${clips === 1 ? '' : 's'} to arrange`}\n data-testid=\"presentation-pill\"\n >\n <Presentation className=\"size-3.5 shrink-0\" />\n {!compact && <span className=\"min-w-0 truncate\">{title}</span>}\n {clips > 0 && (\n <span className=\"rounded-full bg-primary px-1.5 text-[10px] font-semibold leading-4 text-primary-foreground\">\n {clips}\n </span>\n )}\n </Button>\n )\n}\n","/**\n * The viewer's spotlight, over its body: nothing until a clip is gathered, then the strip of\n * gathered clips and, when shown, the spotlight itself (their own chunk, loaded then).\n */\n\nimport { lazy, Suspense, useEffect } from 'react'\nimport { useSpotlight } from '../../presentation/spotlight'\nimport { useConnectedWorkspace } from '../ConnectionProvider'\n\nconst SpotlightStrip = lazy(() =>\n import('./SpotlightStrip').then((m) => ({ default: m.SpotlightStrip }))\n)\n\nexport function SpotlightLayer() {\n // Clips gathered by another user are dropped.\n const { userId } = useConnectedWorkspace()\n const gathered = useSpotlight((s) => s.clips.length > 0)\n useEffect(() => useSpotlight.getState().own(userId ?? null), [userId])\n if (!gathered) return null\n return (\n <Suspense fallback={null}>\n <SpotlightStrip />\n </Suspense>\n )\n}\n","/**\n * The document viewer's Clip mode: whether it is on, and its header controls. Clips made in it\n * are gathered in the viewer's spotlight strip (`SpotlightStrip`: Show them over the document, or\n * keep them as a slide); it stays on from one document to the next, so clips are gathered from\n * several documents in a row. Beside it, the Presentation pill goes back to the presentation.\n */\n\nimport { useCallback, type ReactNode } from 'react'\nimport { useSpotlight } from '../../presentation/spotlight'\nimport { ClipButton } from '../../document-tools/DocumentToolButtons'\nimport { PresentationPill } from './PresentationPill'\nimport { SpotlightLayer } from './SpotlightLayer'\n\nexport function useViewerClipping(\n /** A PDF, an image or a video is on screen. Clip mode shows over the viewer's other modes. */\n clippable: boolean,\n compact: boolean\n): { clipping: boolean; stop: () => void; button: ReactNode; layer: ReactNode } {\n // In the spotlight's store: it stays on while the viewer opens another document.\n const on = useSpotlight((s) => s.clipping)\n const setOn = useSpotlight((s) => s.setClipping)\n const stop = useCallback(() => setOn(false), [setOn])\n const button = (\n <>\n <PresentationPill compact={compact} />\n {clippable && <ClipButton active={on} compact={compact} onClick={() => setOn(!on)} />}\n </>\n )\n // Over the viewer's body: the gathered clips' strip, and the spotlight.\n const layer = <SpotlightLayer />\n return { clipping: on && clippable, stop, button, layer }\n}\n","import { useCallback, useEffect, useState } from 'react'\nimport { Maximize, PanelTop } from 'lucide-react'\nimport { Button, cn } from '@arbidocs/react/ui'\nimport { toggleFullscreen } from '../../presentation/usePresenterKeys'\n\nconst IDLE_MS = 2000\n\n/**\n * Over the viewer's clean view: Full screen, and Show controls (leave the clean view). It shows\n * while the pointer moves or a key is pressed and fades after a moment, so a share rarely\n * catches it.\n */\nexport function CleanViewControl({ onExit }: { onExit: () => void }) {\n const [view, setView] = useState<Window | null>(null)\n const [shown, setShown] = useState(true)\n const ref = useCallback((node: HTMLDivElement | null) => {\n setView(node?.ownerDocument.defaultView ?? null)\n }, [])\n\n useEffect(() => {\n if (!view) return\n let timer = view.setTimeout(() => setShown(false), IDLE_MS)\n const wake = () => {\n setShown(true)\n view.clearTimeout(timer)\n timer = view.setTimeout(() => setShown(false), IDLE_MS)\n }\n view.addEventListener('pointermove', wake)\n view.addEventListener('keydown', wake)\n return () => {\n view.clearTimeout(timer)\n view.removeEventListener('pointermove', wake)\n view.removeEventListener('keydown', wake)\n }\n }, [view])\n\n return (\n <div\n ref={ref}\n className={cn(\n 'absolute right-3 top-3 z-20 flex gap-1 rounded-md bg-background/90 p-1 shadow-md transition-opacity',\n shown ? 'opacity-100' : 'pointer-events-none opacity-0'\n )}\n data-testid=\"viewer-clean-control\"\n >\n <Button\n type=\"button\"\n size=\"sm\"\n variant=\"ghost\"\n className=\"h-7\"\n onClick={() => view && toggleFullscreen(view)}\n >\n <Maximize className=\"size-3.5\" />\n Full screen\n </Button>\n <Button\n type=\"button\"\n size=\"sm\"\n variant=\"ghost\"\n className=\"h-7\"\n onClick={onExit}\n data-testid=\"viewer-clean-exit\"\n >\n <PanelTop className=\"size-3.5\" />\n Show controls\n </Button>\n </div>\n )\n}\n","/**\n * The viewer's clean view: popped out with `documentViewer.presenting`, it shows only the document\n * on black (no header, bars or controls), to share in a call or put full screen. Its one control\n * (`CleanViewControl`: full screen, show the controls again) shows while the pointer moves. Popping\n * the viewer back in ends the clean view.\n */\n\nimport { useEffect, useRef, type ReactNode } from 'react'\nimport { useArbiSessionState, useArbiSessionStore } from '@arbidocs/react'\nimport { CleanViewControl } from './CleanViewControl'\n\nexport function useCleanView(\n /** Over the body in any view (the spotlight's strip). */\n extra?: ReactNode\n): { on: boolean; frame: { bare: boolean; overlay: ReactNode } } {\n const session = useArbiSessionStore()\n const detached = useArbiSessionState((s) => s.documentViewer.detached)\n const presenting = useArbiSessionState((s) => s.documentViewer.presenting)\n const on = detached && presenting\n\n // Back in the app's window: the next pop-out shows the controls as usual.\n const wasDetached = useRef(detached)\n useEffect(() => {\n if (wasDetached.current && !detached && presenting) {\n session.setDocumentViewer({ presenting: false })\n }\n wasDetached.current = detached\n }, [detached, presenting, session])\n\n return {\n on,\n frame: {\n bare: on,\n overlay: (\n <>\n {on && (\n <CleanViewControl onExit={() => session.setDocumentViewer({ presenting: false })} />\n )}\n {extra}\n </>\n ),\n },\n }\n}\n","import { FileCheck2 } from 'lucide-react'\nimport { useFinaliseTranslation } from '@arbidocs/react'\nimport { useDocumentTools } from '@arbidocs/react/document-tools'\nimport { Button } from '@arbidocs/react/ui'\nimport { useBlocksEnvironment } from '../../provider/environment'\n\ninterface TranslationDocument {\n external_id: string\n derived_from?: ReadonlyArray<{ role?: string | null }> | null\n}\n\n/** A translation made by ARBI that is not itself a final PDF: the editable draft to finalise. */\nconst isTranslationDraft = (doc: TranslationDocument | undefined): boolean =>\n !!doc?.derived_from?.some((d) => d.role === 'translation') &&\n !doc.derived_from.some((d) => d.role === 'final')\n\n/**\n * Finalise: save the translation's current version as a new PDF document, labelled \"Translation\" and\n * linked to the original. The editable translation stays as it is; the new PDF opens.\n */\nexport function FinaliseTranslationButton({\n document,\n isCompact,\n}: {\n document: TranslationDocument | undefined\n isCompact: boolean\n}): React.ReactElement | null {\n // The new PDF joins the documents list with its links (draft, original), so the original's\n // Translations list shows it at once.\n const finalise = useFinaliseTranslation()\n const { openDocument } = useDocumentTools()\n const { notify } = useBlocksEnvironment()\n if (!document || !isTranslationDraft(document)) return null\n const pending = finalise.isPending\n const onClick = async () => {\n try {\n const { document_ext_id: finalId } = await finalise.mutateAsync(document.external_id)\n notify('Saved the final PDF of this translation', 'success')\n openDocument?.(finalId)\n } catch (error) {\n const detail = (error as { detail?: unknown })?.detail\n notify(\n typeof detail === 'string' ? detail : 'The final PDF could not be saved. Try again.',\n 'error'\n )\n }\n }\n return (\n <Button\n type=\"button\"\n variant=\"outline\"\n size={isCompact ? 'icon' : 'sm'}\n title=\"Finalise: save this translation as a new PDF, labelled Translation and linked to the original\"\n aria-label=\"Finalise\"\n data-testid=\"finalise-translation-button\"\n className=\"pointer-coarse:min-h-11\"\n disabled={pending}\n onClick={() => void onClick()}\n >\n <FileCheck2 className=\"size-4\" />\n {!isCompact && <span className=\"ml-1\">{pending ? 'Finalising…' : 'Finalise'}</span>}\n </Button>\n )\n}\n","/**\n * Cropping an image in the viewer: the crop is saved as a NEW document made from the image\n * (`derived_from`, role `crop`) in the image's own workspace, named on the upload; the original is\n * never touched. The new document opens once its id is back (otherwise it arrives through the\n * documents list).\n */\n\nimport { useCallback, useState } from 'react'\nimport { useDocumentTools } from '@arbidocs/react/document-tools'\nimport { useBlocksEnvironment } from '../../provider/environment'\n\nexport function useImageCrop(\n documentId: string,\n fileName: string | null | undefined,\n imageBlob: Blob | null,\n /** The image's workspace, where the crop goes (never whichever one is open when it is saved). */\n workspaceId: string | null | undefined\n) {\n const { uploadDocument, onDocumentsChanged, openDocument } = useDocumentTools()\n const { notify } = useBlocksEnvironment()\n const [cropImageUrl, setCropImageUrl] = useState<string | null>(null)\n\n const handleOpenCrop = useCallback(() => {\n if (!imageBlob) return\n setCropImageUrl(URL.createObjectURL(imageBlob))\n }, [imageBlob])\n\n const closeCrop = useCallback(() => {\n setCropImageUrl((url) => {\n if (url) URL.revokeObjectURL(url)\n return null\n })\n }, [])\n\n const handleCropComplete = useCallback(\n async (result: { blob: Blob }) => {\n const baseName = (fileName || 'image').replace(/\\.[^.]+$/, '')\n const file = new File([result.blob], `${baseName} (cropped).png`, { type: 'image/png' })\n try {\n const response = await uploadDocument({\n file,\n query: {\n derived_from: [documentId],\n derived_role: 'crop',\n ...(workspaceId ? { workspace_ext_id: workspaceId } : {}),\n },\n })\n const newDocId = response?.doc_ext_ids?.[0]\n if (newDocId) {\n await onDocumentsChanged?.([newDocId], 'copy')\n openDocument?.(newDocId)\n }\n notify('Cropped image saved', 'success')\n } catch {\n notify('Failed to save the cropped image', 'error')\n } finally {\n closeCrop()\n }\n },\n [\n fileName,\n documentId,\n workspaceId,\n uploadDocument,\n onDocumentsChanged,\n openDocument,\n notify,\n closeCrop,\n ]\n )\n\n return { cropImageUrl, handleOpenCrop, closeCrop, handleCropComplete }\n}\n","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","/**\n * The viewer header's \"…\": its rarer actions (share the file, email it, translate it), out of the\n * header so reading, annotating and clipping stay one click each. Shown only when it has an item.\n */\n\nimport type { ReactNode } from 'react'\nimport { MoreHorizontal } from 'lucide-react'\nimport {\n Button,\n DropdownMenu,\n DropdownMenuContent,\n DropdownMenuItem,\n DropdownMenuTrigger,\n} from '@arbidocs/react/ui'\n\nexport interface ViewerMoreItem {\n key: string\n label: string\n icon: ReactNode\n onSelect: () => void\n testId: string\n /** Shown on hover: what it does. */\n description?: string\n}\n\nexport function ViewerMoreMenu({ items, compact }: { items: ViewerMoreItem[]; compact: boolean }) {\n if (!items.length) return null\n return (\n <DropdownMenu>\n <DropdownMenuTrigger asChild>\n <Button\n type=\"button\"\n variant=\"outline\"\n size=\"icon\"\n className={compact ? 'pointer-coarse:size-11' : 'size-8 pointer-coarse:size-11'}\n title=\"More: share the file, email, translate\"\n aria-label=\"More\"\n data-testid=\"viewer-more-menu\"\n >\n <MoreHorizontal className=\"size-4\" />\n </Button>\n </DropdownMenuTrigger>\n <DropdownMenuContent align=\"end\">\n {items.map((item) => (\n <DropdownMenuItem\n key={item.key}\n onSelect={item.onSelect}\n title={item.description}\n data-testid={item.testId}\n >\n {item.icon}\n <span className=\"ml-2\">{item.label}</span>\n </DropdownMenuItem>\n ))}\n </DropdownMenuContent>\n </DropdownMenu>\n )\n}\n","/**\n * What the document viewer is looking at: the document record, the streaming / draft overlay,\n * the kind of content (artifact, live artifact, media, Word, sheet, ...) and whether it has parsed\n * text.\n */\n\nimport { useEffect, useMemo, useState } from 'react'\nimport {\n useArbiSessionState,\n useDocument,\n useParsedDocument,\n type ArbiDraftDocument,\n} from '@arbidocs/react'\nimport {\n artifactKindFromFileName,\n artifactKindFromMode,\n useArtifactSource,\n} from '@arbidocs/react/artifacts'\nimport {\n isAudioFile,\n isDownloadOnlyFile,\n isImageFile,\n isPresentationFileName,\n isVideoFile,\n} from '@arbidocs/react/ui'\nimport { savedDocumentIdFor } from '@arbidocs/react/shell'\nimport { isDocumentLabel, summariseDocTags } from '../../files/doc-labels'\nimport { useConnectedWorkspace } from '../ConnectionProvider'\nimport { useConnectedTags } from '../workspaceData'\nimport { useViewerStreamingDocument } from './support'\n\nconst DOCX_EXTENSIONS = new Set(['.docx', '.doc'])\nconst XLSX_EXTENSIONS = new Set(['.xlsx', '.xls'])\nconst EMAIL_EXTENSIONS = new Set(['.eml', '.msg'])\n\n/** Lower-cased extension with its dot (`.pdf`), or `''`. */\nexport function fileExtension(fileName: string | null | undefined): string {\n if (!fileName) return ''\n return fileName.substring(fileName.lastIndexOf('.')).toLowerCase()\n}\n\nexport function useViewedDocument(documentId: string) {\n // `.webm` is ambiguous by extension alone (audio-only recordings use the same container as\n // video). Resolved once the bytes are here; null = not yet, and the extension's guess stands.\n const [webmHasVideoTrack, setWebmHasVideoTrack] = useState<boolean | null>(null)\n useEffect(() => setWebmHasVideoTrack(null), [documentId])\n\n // An artifact being generated in a chat.\n const streamingDoc = useViewerStreamingDocument(documentId)\n const isStreaming = !!streamingDoc && !streamingDoc.isComplete\n // A draft the user started (blank document, voice note) with no backend record yet.\n const draftDoc = useArbiSessionState<ArbiDraftDocument | undefined>(\n (state) => state.draftDocuments[documentId]\n )\n const isDraft = !!draftDoc\n // A capture draft (photo/video/audio) is its recorder; a text draft opens in the Word editor.\n const isCaptureDraft =\n draftDoc?.kind === 'audio' || draftDoc?.kind === 'photo' || draftDoc?.kind === 'video'\n const isTextDraft = draftDoc?.kind === 'text'\n\n const { workspaceId, live } = useConnectedWorkspace()\n const { data: record } = useDocument(documentId, {\n enabled: live && !!workspaceId && !isStreaming && !isDraft,\n // A new version (Save version, a signed copy) is processed before its PDF exists: keep\n // re-reading until it is done, so the PDF tab and the signing tools come back on their own.\n pollWhileProcessing: true,\n })\n // A record of the previously viewed document is not this one.\n const documentData = record?.external_id === documentId ? record : undefined\n\n // Labels for the bar the PDF view carries (the text view derives its own).\n const { data: tags } = useConnectedTags()\n const labelSummaries = useMemo(\n () => summariseDocTags(documentData?.doctags ?? [], tags.filter(isDocumentLabel)),\n [documentData, tags]\n )\n\n // A document renders on the artifact path (Word editor or live preview, and Versions) rather\n // than the PDF path when (1) an artifact is streaming, (2) it is an artifact (AI drafts are\n // stored as .docx, html/react artifacts as .html/.jsx), or (3) it is an uploaded `*.md` (editing\n // and history are its own view; the PDF is a fallback).\n const fileName = documentData?.file_name\n const isMarkdown = fileExtension(fileName) === '.md'\n const isImage = isImageFile(fileName)\n const isWebmFile = fileExtension(fileName) === '.webm'\n // A resolved \"no video track\" wins over the extension's guess (always video for .webm).\n const isVideo = isWebmFile && webmHasVideoTrack === false ? false : isVideoFile(fileName)\n const isAudio = isWebmFile && webmHasVideoTrack === false ? true : isAudioFile(fileName)\n // Generated artifacts carried as a blob (image/audio/video) render in the media viewer.\n const isBlobArtifact =\n streamingDoc?.mode === 'image' ||\n (documentData?.wp_type === 'artifact' && (isImage || isVideo || isAudio))\n const isArtifact =\n (!!streamingDoc || isTextDraft || documentData?.wp_type === 'artifact' || isMarkdown) &&\n !isBlobArtifact\n // A presentation (saved, or a new one): edited on its slides tab; its PDF is its slides.\n const isPresentation =\n draftDoc?.kind === 'presentation' ||\n isPresentationFileName(documentData?.file_name, documentData?.folder)\n // html/react artifacts render live in a sandbox; the streaming mode or the saved extension says.\n const liveKind = isArtifact\n ? (artifactKindFromMode(streamingDoc?.mode ?? undefined) ?? artifactKindFromFileName(fileName))\n : null\n\n // The saved document a chat drafts in while it is open here: a saved artifact or Word document.\n const savedDocumentId = savedDocumentIdFor({\n documentId,\n isDraft,\n isStreaming,\n isBlobArtifact,\n documentData,\n })\n\n // Parsed text is stripped of markup: a live artifact needs its stored source.\n const { data: liveSourceFetched } = useArtifactSource(\n documentId,\n !!liveKind && !streamingDoc && !!documentData && !isDraft\n )\n const liveSource = streamingDoc ? streamingDoc.content : (liveSourceFetched ?? '')\n\n // The text view exists whenever there is parsed content, for any file (a recording's\n // transcript too). `low-content` is a terminal status with indexed passages, just sparse.\n const hasParsedDocStatus =\n documentData?.status === 'completed' || documentData?.status === 'low-content'\n const wantsParsedDoc =\n !!documentId && live && !isStreaming && !isDraft && !isBlobArtifact && hasParsedDocStatus\n const { data: parsedDoc, isPending: isParsedDocPending } = useParsedDocument(\n documentId,\n 'final',\n { enabled: wantsParsedDoc }\n )\n // Loading until the text is read, including while the query still waits for the workspace to\n // open: on a reload the record comes back from the saved query cache before the session has\n // opened the workspace, and the text view a passage link asked for must not be given up then.\n // A document with no text to read (or no workspace at all) is settled at once.\n const isParsedDocLoading = wantsParsedDoc && !!workspaceId && isParsedDocPending\n const hasParsedContent =\n ((parsedDoc as { chunks?: unknown[] } | undefined)?.chunks?.length ?? 0) > 0\n\n return {\n workspaceId,\n documentData,\n streamingDoc,\n isStreaming,\n draftDoc,\n isDraft,\n isCaptureDraft,\n isTextDraft,\n labelSummaries,\n isImage,\n isWebmFile,\n setWebmHasVideoTrack,\n isVideo,\n isAudio,\n isMedia: isVideo || isAudio,\n isBlobArtifact,\n savedDocumentId,\n isArtifact,\n isPresentation,\n liveKind,\n liveSource,\n isDocx: DOCX_EXTENSIONS.has(fileExtension(fileName)),\n isXlsx: XLSX_EXTENSIONS.has(fileExtension(fileName)),\n isEmail: EMAIL_EXTENSIONS.has(fileExtension(fileName)),\n isDownloadOnly: isDownloadOnlyFile(fileName),\n isParsedDocLoading,\n hasParsedContent,\n }\n}\n\nexport type ViewedDocument = ReturnType<typeof useViewedDocument>\n","/**\n * The bytes the document viewer shows: the PDF (or, for media, the stored file), with the host's\n * copy kept on the device when the network is down; the stored sheet; the `.webm` track probe; and\n * downloading the stored file.\n */\n\nimport { useCallback, useEffect } from 'react'\nimport { hasVideoTrack, loadOfflineDocument } from '@arbidocs/react'\nimport { parseVersionRef } from '@arbidocs/react/artifacts'\nimport {\n fetchDocumentFile,\n useDocumentBytes,\n useDocumentTools,\n} from '@arbidocs/react/document-tools'\nimport { isAudioFile, isImageFile, isVideoFile } from '@arbidocs/react/ui'\nimport { useBlocksEnvironment } from '../../provider/environment'\nimport type { ViewedDocument } from './useViewedDocument'\n\n// Offline copies predate version metadata; they are useful to read but not safe for signing.\nconst offlineCopies = new WeakSet<Blob>()\n\n/** `documentId` may be a version reference (`doc-…@v2`). */\nexport function useViewerBlobs(documentId: string, doc: ViewedDocument) {\n const { documentData, isArtifact, isDocx, isXlsx, isDownloadOnly, isWebmFile } = doc\n const { setWebmHasVideoTrack } = doc\n const { client, saveFile } = useDocumentTools()\n const { notify } = useBlocksEnvironment()\n const currentVersion = documentData?.current_version ?? 1\n const snapshot = !!parseVersionRef(documentId).version\n\n // Images, video and audio show the stored file; everything else its PDF.\n const name = documentData?.file_name\n const original = isImageFile(name) || isVideoFile(name) || isAudioFile(name)\n // Offline records have no version identity; keep them readable but mark them unverified.\n const fallback =\n documentData && !snapshot\n ? async () => {\n const blob = await loadOfflineDocument(documentData.external_id)\n if (blob) offlineCopies.add(blob)\n return blob\n }\n : undefined\n const pdf = useDocumentBytes(documentId, {\n version: currentVersion,\n kind: original ? 'original' : 'pdf',\n enabled:\n (!isArtifact || (isDocx && !doc.isDraft && !doc.isStreaming && !doc.liveKind)) &&\n !!documentData &&\n !isDownloadOnly &&\n (!isDocx ||\n snapshot ||\n documentData.status === 'completed' ||\n documentData.status === 'low-content'),\n fallback,\n })\n // The query is keyed by version. Never keep an older PDF while the new version processes:\n // the viewer also offers signing actions against the displayed bytes.\n const pdfReady =\n !isDocx || snapshot || ['completed', 'low-content'].includes(documentData?.status || '')\n const pdfBlob = pdfReady && !pdf.isPlaceholderData ? (pdf.data ?? null) : null\n const pdfVerified = !!pdfBlob && !offlineCopies.has(pdfBlob)\n\n // Resolve the ambiguous .webm case once the bytes are here.\n useEffect(() => {\n if (!isWebmFile || !pdfBlob) return\n let cancelled = false\n void hasVideoTrack(pdfBlob).then((result) => {\n if (!cancelled) setWebmHasVideoTrack(result)\n })\n return () => {\n cancelled = true\n }\n }, [isWebmFile, pdfBlob, setWebmHasVideoTrack])\n\n // The stored sheet (all its sheets).\n const xlsx = useDocumentBytes(documentId, {\n version: currentVersion,\n kind: 'original',\n enabled: !isArtifact && !!documentData && isXlsx,\n })\n\n const handleDirectDownload = useCallback(async () => {\n try {\n saveFile(await fetchDocumentFile(client, documentId), documentData?.file_name || 'download')\n } catch {\n notify('Failed to download file', 'error')\n }\n }, [client, saveFile, notify, documentId, documentData?.file_name])\n\n return {\n pdfBlob,\n pdfVerified,\n retryPdf: pdf.refetch,\n isPdfLoading: pdf.isLoading,\n pdfError: pdf.error,\n xlsxBlob: xlsx.data ?? null,\n xlsxError: xlsx.error,\n handleDirectDownload,\n }\n}\n","/**\n * Tabs of the document viewer: which tabs a document has, the automatic switches when the\n * document's type or parsed content changes, and switching (which ends a comparison when leaving\n * the tab that hosts it). The open tab is the session state's, so whatever opens a document can\n * open it on a tab.\n */\n\nimport { useEffect, useRef } from 'react'\nimport { Code, FileText, History, MonitorPlay, Presentation } from 'lucide-react'\nimport { friendlyFileType } from '@arbidocs/react/ui'\nimport {\n AudIcon,\n DocIcon,\n EmlIcon,\n HtmlIcon,\n ImgIcon,\n PdfIcon,\n VidIcon,\n XlsIcon,\n useArbiSessionState,\n useArbiSessionStore,\n type ArbiViewerTab,\n} from '@arbidocs/react'\nimport type { ViewerTab } from '../../files/ViewerParts'\nimport { useIsPhone } from '../../lib/use-media-query'\nimport type { ViewedDocument } from './useViewedDocument'\n\n/**\n * @param hasHistory The document has earlier versions (a signed copy, a re-upload): PDF and text\n * documents then get a Versions tab too. Artifacts and Word documents always have one.\n */\nexport function useViewerTabs(doc: ViewedDocument, isCompact: boolean, hasHistory = false) {\n const {\n documentData,\n isArtifact,\n isPresentation,\n isDraft,\n isStreaming,\n isDocx,\n isXlsx,\n isEmail,\n isVideo,\n isAudio,\n isImage,\n liveKind,\n hasParsedContent,\n isParsedDocLoading,\n } = doc\n const session = useArbiSessionStore()\n const {\n tab: activeTab,\n compareId,\n tabRequest,\n phonePdfChosen,\n } = useArbiSessionState((s) => s.documentViewer)\n const setActiveTab = (tab: ArbiViewerTab) => session.setDocumentViewer({ tab })\n // A passage being opened (a citation, a search hit): it is lit on the PDF, else marked on the text\n // view, never in an editor.\n const passageId = useArbiSessionState((s) => s.viewingDocument?.passageId ?? null)\n // A plain-text file is still shown as a generated PDF, but the tab names the file the user\n // opened (\"Text\", as the Fields panel does), not the rendering format.\n const isTextFile = friendlyFileType(documentData?.file_type, documentData?.file_name) === 'Text'\n const isPhone = useIsPhone()\n const phoneDefaultDecidedFor = useRef<string | null>(null)\n\n // Switch to the tab that fits the document type. Only on type changes: never over the user's own\n // choice. Keyed on the document and its kind, not on the record: a refreshed record (a new\n // version finishing processing) must not send a user on the PDF tab of a Word document back to\n // the editor. Also on a passage opened: it asks for the PDF tab whatever the type.\n const hasDocumentData = !!documentData\n const documentKey = documentData?.external_id\n useEffect(() => {\n // A presentation opens on its slides; another document never shows that tab.\n if (isPresentation && hasDocumentData && activeTab === 'pdf') {\n setActiveTab('slides')\n } else if (!isPresentation && documentData && activeTab === 'slides') {\n setActiveTab(isDocx ? 'docx' : isXlsx ? 'xlsx' : 'pdf')\n }\n // A passage opened on a document whose type leaves the PDF tab goes to the text view, where\n // every passage is marked (the PDF pane's own fallback is not there to do it).\n else if (passageId && activeTab === 'pdf' && (isArtifact || isDocx)) {\n setActiveTab('html')\n }\n // A Word artifact (an AI draft, stored as .docx) has one Word tab, 'edit', not a DOCX tab.\n else if (isArtifact && (activeTab === 'pdf' || (!liveKind && activeTab === 'docx'))) {\n setActiveTab(liveKind ? 'preview' : 'edit')\n } else if (isDocx && activeTab === 'pdf') {\n setActiveTab('docx')\n } else if (!liveKind && activeTab === 'preview') {\n setActiveTab(isArtifact ? 'edit' : 'pdf')\n } else if (!isArtifact && documentData && activeTab === 'edit') {\n setActiveTab(isDocx ? 'docx' : isXlsx ? 'xlsx' : 'pdf')\n } else if (\n !isArtifact &&\n !isDocx &&\n !isXlsx &&\n documentData &&\n (activeTab === 'docx' || activeTab === 'xlsx')\n ) {\n setActiveTab('pdf')\n }\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [\n hasDocumentData,\n documentKey,\n isArtifact,\n isDocx,\n isXlsx,\n liveKind,\n isPresentation,\n passageId,\n ])\n\n // A tab asked for when the document was opened (a signature request opens on the PDF, where it\n // is signed) wins over the type's own tab once that document has loaded, and over the phone's\n // text default. Declared after the type switch above so it has the last word.\n useEffect(() => {\n if (!tabRequest || !documentKey || tabRequest.documentId !== documentKey) return\n phoneDefaultDecidedFor.current = documentKey\n session.setDocumentViewer({ tabRequest: null, tab: tabRequest.tab })\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [documentKey, tabRequest])\n\n // Versions of a PDF or text document exist only with history: leave the tab when there is none\n // (another document opened while it was active).\n const hasVersionsTab = isArtifact || isDocx || hasHistory\n useEffect(() => {\n if (activeTab === 'versions' && documentData && !hasVersionsTab) {\n setActiveTab(isXlsx ? 'xlsx' : 'pdf')\n }\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [activeTab, documentData, hasVersionsTab])\n\n // The text tab exists only with parsed content. When it is open without any (a recording with\n // no transcript, a failed parse), fall back to the natural default once the parsed query\n // settles. Not during a comparison, which uses the text tab. Waits for the record: until it is\n // here the parsed query has not started, so it is not loading yet.\n useEffect(() => {\n if (\n activeTab === 'html' &&\n documentData !== undefined &&\n !isParsedDocLoading &&\n !hasParsedContent &&\n !compareId\n ) {\n setActiveTab(isArtifact ? 'edit' : isDocx ? 'docx' : isXlsx ? 'xlsx' : 'pdf')\n }\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [\n activeTab,\n documentData,\n isParsedDocLoading,\n hasParsedContent,\n compareId,\n isArtifact,\n isDocx,\n isXlsx,\n ])\n\n // Phones open a document on the readable reflowed (text) view: a fit-width PDF on a 390px\n // screen is footnote-sized. Decided once per document, after the parsed query settles, and only\n // over the PDF default (Word, sheets, artifacts and media keep their own tab). A PDF the user\n // picked by hand this session wins.\n useEffect(() => {\n if (!isPhone || !documentKey || isParsedDocLoading) return\n if (phoneDefaultDecidedFor.current === documentKey) return\n phoneDefaultDecidedFor.current = documentKey\n const opensOnPdf =\n !isArtifact && !isDocx && !isXlsx && !isVideo && !isAudio && !isImage && !isEmail\n if (opensOnPdf && hasParsedContent && !compareId && !phonePdfChosen && activeTab === 'pdf') {\n setActiveTab('html')\n }\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [isPhone, documentKey, isParsedDocLoading, hasParsedContent])\n\n const handleTabChange = (tabId: string) => {\n // A comparison is shown on the text tab: leaving it ends the comparison.\n const change: Parameters<typeof session.setDocumentViewer>[0] = { tab: tabId as ArbiViewerTab }\n if (tabId !== 'html' && compareId) change.compareId = null\n // A phone user who goes back to the PDF wants it: stop opening documents on the text view\n // until they pick it again.\n if (isPhone && (tabId === 'pdf' || tabId === 'html')) change.phonePdfChosen = tabId === 'pdf'\n session.setDocumentViewer(change)\n }\n\n const mediaTab = isVideo\n ? { icon: <VidIcon size={20} />, tooltip: 'Video' }\n : isAudio\n ? { icon: <AudIcon size={20} />, tooltip: 'Audio' }\n : isImage\n ? { icon: <ImgIcon size={20} />, tooltip: 'Image' }\n : isEmail\n ? { icon: <EmlIcon size={20} />, tooltip: 'Email' }\n : isTextFile\n ? { icon: <FileText className=\"size-5\" />, tooltip: 'Text' }\n : documentData\n ? { icon: <PdfIcon size={20} />, tooltip: 'PDF' }\n : // The file type is unknown until the record loads: name no guess (a text file\n // would flip from PDF to Text once it arrives).\n { icon: <FileText className=\"size-5\" />, tooltip: 'Document' }\n // Tabs say what they are: in a narrow panel or on a phone only the open tab keeps its name, plus\n // the text view, whose icon is not recognisable. Labelling every tab there would crowd the header.\n const tabLabel = (id: string, label: string) =>\n !isCompact || activeTab === id || id === 'html' ? label : undefined\n\n const versionsTab: ViewerTab = {\n id: 'versions',\n icon: <History className=\"size-5\" />,\n tooltip: 'Versions',\n label: tabLabel('versions', 'Versions'),\n }\n const viewerTabs: ViewerTab[] = [\n // A presentation's slides, edited; then its PDF (the slides as saved), once it has one.\n ...(isPresentation\n ? [\n {\n id: 'slides',\n icon: <Presentation className=\"size-5\" />,\n tooltip: 'Slides',\n label: tabLabel('slides', 'Slides'),\n },\n ]\n : []),\n ...(isArtifact\n ? [\n ...(liveKind\n ? [\n {\n id: 'preview',\n icon: <MonitorPlay className=\"size-5\" />,\n tooltip: 'Preview',\n label: tabLabel('preview', 'Preview'),\n },\n ]\n : []),\n {\n id: 'edit',\n icon: liveKind ? <Code className=\"size-5\" /> : <FileText className=\"size-5\" />,\n tooltip: liveKind ? 'Code' : 'Editor',\n label: tabLabel('edit', liveKind ? 'Code' : 'Document'),\n },\n ...(!liveKind && !isDraft && !isStreaming && isDocx\n ? [\n {\n id: 'pdf',\n icon: <PdfIcon size={20} />,\n tooltip: 'PDF',\n label: tabLabel('pdf', 'PDF'),\n },\n ]\n : []),\n versionsTab,\n ]\n : [\n ...(isDocx\n ? [\n {\n id: 'docx',\n icon: <DocIcon size={20} />,\n tooltip: 'DOCX (with track changes & comments)',\n label: tabLabel('docx', 'DOCX'),\n },\n ]\n : []),\n ...(isXlsx\n ? [\n {\n id: 'xlsx',\n icon: <XlsIcon size={20} />,\n tooltip: 'Spreadsheet',\n label: tabLabel('xlsx', 'Sheet'),\n },\n ]\n : []),\n ...(isPresentation && isDraft\n ? []\n : [{ id: 'pdf', ...mediaTab, label: tabLabel('pdf', mediaTab.tooltip) }]),\n ...(hasVersionsTab ? [versionsTab] : []),\n ]),\n ...((hasParsedContent || compareId) && !liveKind\n ? [\n {\n id: 'html',\n icon: compareId ? <FileText className=\"size-5\" /> : <HtmlIcon size={20} />,\n tooltip: compareId ? 'Word redline' : 'HTML',\n label: tabLabel('html', compareId ? 'Compare' : 'HTML'),\n },\n ]\n : []),\n ]\n\n return { activeTab, handleTabChange, viewerTabs }\n}\n","/**\n * A document's versions (oldest first; every row's `id` is a version reference) and its\n * translations (each its own document, made from one of its versions). A listed document carries\n * its versions, so it costs no request; one that is not in the workspace list asks for them.\n */\n\nimport { useMemo } from 'react'\nimport { useDocumentVersionList } from '@arbidocs/react'\nimport {\n documentVersions,\n parseVersionRef,\n toArtifactVersions,\n type ArtifactVersion,\n} from '@arbidocs/react/artifacts'\nimport type { TranslationEntry } from '../../artifacts/VersionTimeline'\nimport { useConnectedDocuments } from '../workspaceData'\n\nexport function useViewerVersions(docId: string | null | undefined): {\n versions: ArtifactVersion[]\n translations: TranslationEntry[]\n} {\n const plainId = docId ? parseVersionRef(docId).docId : ''\n const { data: documents } = useConnectedDocuments()\n const listed = useMemo(\n () => (plainId ? documents.find((d) => d.external_id === plainId) : undefined),\n [documents, plainId]\n )\n const { data: history } = useDocumentVersionList(plainId, { enabled: !!plainId && !listed })\n const versions = useMemo(\n () => (listed ? documentVersions(listed) : toArtifactVersions(plainId || null, history)),\n [listed, history, plainId]\n )\n // A translation is its own document (with its own versions), never a version of the source, so\n // opening the source always opens the source.\n const translations = useMemo<TranslationEntry[]>(() => {\n if (!plainId) return []\n return documents\n .flatMap((doc) => {\n const link = doc.derived_from?.find(\n (d) => d.role === 'translation' && d.doc_ext_id === plainId\n )\n return link\n ? [\n {\n id: doc.external_id,\n name: doc.doc_metadata?.title || doc.file_name || doc.external_id,\n createdAt: doc.created_at,\n sourceVersion: link.version ?? null,\n final: !!doc.derived_from?.some((d) => d.role === 'final'),\n },\n ]\n : []\n })\n .sort((a, b) => a.createdAt.localeCompare(b.createdAt))\n }, [documents, plainId])\n return { versions, translations }\n}\n","import type { ArtifactVersion } from '@arbidocs/react/artifacts'\n\n/** The version on screen, with a direct way to open another version. */\nexport function VersionDropdown({\n versions,\n activeId,\n isSnapshot,\n onOpen,\n onHistory,\n}: {\n versions: readonly ArtifactVersion[]\n activeId: string | null\n isSnapshot: boolean\n onOpen: (id: string) => void\n onHistory: () => void\n}) {\n const active = versions.find((version) => version.id === activeId)\n const pendingVersion = activeId?.match(/@v([1-9]\\d*)$/)?.[1]\n return (\n <select\n aria-label=\"Active document version\"\n data-testid=\"document-version-dropdown\"\n className=\"max-w-44 rounded border border-input bg-background px-2 py-1 text-sm pointer-coarse:min-h-11\"\n value={active?.id ?? ''}\n onChange={(event) => {\n const id = event.currentTarget.value\n if (id === '__history') onHistory()\n else if (versions.some((version) => version.id === id)) onOpen(id)\n }}\n >\n {!active && (\n <option value=\"\">\n {pendingVersion\n ? `v${pendingVersion} · ${isSnapshot ? 'Read only' : 'Current'}`\n : 'Version unavailable'}\n </option>\n )}\n {[...versions]\n .sort((a, b) => b.number - a.number)\n .map((version) => (\n <option key={version.id} value={version.id}>\n v{version.number}\n {version.isCurrent ? ' · Current' : ' · Read only'}\n </option>\n ))}\n <option value=\"__history\">Version history…</option>\n </select>\n )\n}\n","import type { components } from '@arbidocs/client'\n\ntype ScopedTag = Pick<\n components['schemas']['TagResponse'],\n 'kind' | 'doctag_count' | 'facttag_count'\n>\n\n/**\n * A tag of the documents' vocabulary: not a saved search, and used on documents or not used\n * anywhere yet (a tag used only on facts belongs to the facts').\n */\nexport function isDocumentTag(tag: ScopedTag): boolean {\n if (tag.kind === 'search') return false\n const onDocs = (tag.doctag_count ?? 0) > 0\n const onFacts = (tag.facttag_count ?? 0) > 0\n return onDocs || !onFacts\n}\n","/**\n * Hook for managing chunk-level tagging\n *\n * Provides utilities for applying/removing tags to specific chunks\n * within a document, and determining which tags apply to a chunk.\n *\n * Citations format: CitedDocument[] — a doc-first, best-first list of the\n * documents (each with its cited chunks) backing the doctag's note. A doctag\n * is grounded in passages, so a document that loses its last chunk drops out,\n * and the doctag itself becomes ungrounded (null) once no documents remain.\n */\n\nimport { useCallback } from 'react'\nimport type { components } from '@arbidocs/client'\nimport { useAssignDocTags, useRemoveDocTags, useUpdateDocTag } from '@arbidocs/react'\n\ntype CitationSources = components['schemas']['CitationSources']\ntype DocTag = components['schemas']['DocTagResponse']\ntype Tag = Pick<components['schemas']['TagResponse'], 'external_id'>\n\ntype Citations = CitationSources | null | undefined\n\ninterface UseChunkTaggingProps {\n documentId: string\n documentDoctags: DocTag[]\n}\n\ninterface ChunkTagState {\n /** Tags that are applied to this specific chunk */\n appliedTags: DocTag[]\n /** Check if a specific tag is applied to this chunk */\n isTagApplied: (tagExtId: string) => boolean\n /** Get the doctag for a specific tag if it applies to this chunk */\n getDoctagForChunk: (tagExtId: string) => DocTag | undefined\n}\n\n/** Whether this chunk is among the passages backing the doctag. */\nfunction hasChunkInCitations(citations: Citations, chunkExtId: string): boolean {\n return (citations ?? []).some((d) => d.chunks?.some((c) => c.chunk_id === chunkExtId))\n}\n\n/** Every passage backing the doctag, document order then chunk order. */\nexport function getAllChunkIdsFromCitations(citations: Citations): string[] {\n return (citations ?? []).flatMap((d) => (d.chunks ?? []).map((c) => c.chunk_id))\n}\n\n/**\n * Drop a passage. A doctag is grounded in passages, not whole documents, so a\n * document that loses its last passage goes too; null once none remain, so an\n * emptied doctag is ungrounded rather than grounded-in-nothing.\n */\nexport function removeChunkFromCitations(citations: Citations, chunkExtId: string): Citations {\n if (!citations) return null\n const next = citations\n .map((d) => ({ ...d, chunks: (d.chunks ?? []).filter((c) => c.chunk_id !== chunkExtId) }))\n .filter((d) => d.chunks.length > 0)\n return next.length ? next : null\n}\n\n/** Add a passage under its document, ignoring duplicates. Order is the ranking. */\nexport function addChunkToCitations(\n citations: Citations,\n documentId: string,\n chunkExtId: string\n): CitationSources {\n // Hand-added passages carry no page: the viewer knows the chunk id, and the\n // page is resolved from it at render time.\n const chunk = { chunk_id: chunkExtId, page: null }\n const list = citations ?? []\n const idx = list.findIndex((d) => d.doc_ext_id === documentId)\n if (idx === -1) return [...list, { doc_ext_id: documentId, chunks: [chunk] }]\n const doc = list[idx]\n if ((doc.chunks ?? []).some((c) => c.chunk_id === chunkExtId)) return list\n const next = [...list]\n next[idx] = { ...doc, chunks: [...(doc.chunks ?? []), chunk] }\n return next\n}\n\nexport function useChunkTagging({ documentId, documentDoctags }: UseChunkTaggingProps) {\n const createDocTag = useAssignDocTags()\n const updateDocTag = useUpdateDocTag()\n const deleteDocTag = useRemoveDocTags()\n\n /**\n * Get the tagging state for a specific chunk\n */\n const getChunkTagState = useCallback(\n (chunkExtId: string): ChunkTagState => {\n // Find doctags that apply to this specific chunk (check citations)\n const appliedTags = documentDoctags.filter((dt) =>\n hasChunkInCitations(dt.citations, chunkExtId)\n )\n\n const isTagApplied = (tagExtId: string): boolean => {\n return appliedTags.some((dt) => dt.tag_ext_id === tagExtId)\n }\n\n const getDoctagForChunk = (tagExtId: string): DocTag | undefined => {\n return appliedTags.find((dt) => dt.tag_ext_id === tagExtId)\n }\n\n return {\n appliedTags,\n isTagApplied,\n getDoctagForChunk,\n }\n },\n [documentDoctags]\n )\n\n /**\n * Toggle a tag on/off for a specific chunk\n */\n const toggleChunkTag = useCallback(\n async (chunkExtId: string, tag: Tag, note?: string): Promise<void> => {\n const existingDoctag = documentDoctags.find((dt) => dt.tag_ext_id === tag.external_id)\n const isChunkTagged = hasChunkInCitations(existingDoctag?.citations, chunkExtId)\n\n if (isChunkTagged) {\n // Remove chunk from this doctag's citations\n const updatedCitations = removeChunkFromCitations(existingDoctag!.citations, chunkExtId)\n\n if (!updatedCitations) {\n // No citations remain - delete the entire doctag\n await deleteDocTag.mutateAsync({\n tagId: tag.external_id,\n docIds: [documentId],\n })\n } else {\n // Update doctag with remaining citations\n await updateDocTag.mutateAsync({\n tagId: tag.external_id,\n docId: documentId,\n citations: updatedCitations,\n note: existingDoctag!.note,\n })\n }\n } else {\n // Add chunk to tag\n if (existingDoctag) {\n // Doctag exists - add this chunk to citations\n const updatedCitations = addChunkToCitations(\n existingDoctag.citations,\n documentId,\n chunkExtId\n )\n await updateDocTag.mutateAsync({\n tagId: tag.external_id,\n docId: documentId,\n citations: updatedCitations,\n note: note ?? existingDoctag.note,\n })\n } else {\n // Create new doctag with this chunk\n const newCitations = addChunkToCitations(null, documentId, chunkExtId)\n await createDocTag.mutateAsync({\n tagId: tag.external_id,\n docIds: [documentId],\n citations: newCitations,\n note: note,\n })\n }\n }\n },\n [documentId, documentDoctags, createDocTag, updateDocTag, deleteDocTag]\n )\n\n /**\n * Update the note for a chunk tag\n */\n const updateChunkTagNote = useCallback(\n async (_chunkExtId: string, tag: Tag, note: string | null): Promise<void> => {\n const existingDoctag = documentDoctags.find((dt) => dt.tag_ext_id === tag.external_id)\n if (!existingDoctag) return\n\n await updateDocTag.mutateAsync({\n tagId: tag.external_id,\n docId: documentId,\n citations: existingDoctag.citations,\n note: note,\n })\n },\n [documentId, documentDoctags, updateDocTag]\n )\n\n /**\n * Get all unique tag external IDs applied to a chunk (for accent bar display)\n */\n const getChunkTagColors = useCallback(\n (chunkExtId: string, workspaceTags: Tag[]): string[] => {\n const { appliedTags } = getChunkTagState(chunkExtId)\n return appliedTags\n .map((dt) => {\n const tag = workspaceTags.find((t) => t.external_id === dt.tag_ext_id)\n return tag?.external_id\n })\n .filter((id): id is string => !!id)\n },\n [getChunkTagState]\n )\n\n const isLoading = createDocTag.isPending || updateDocTag.isPending || deleteDocTag.isPending\n\n return {\n getChunkTagState,\n toggleChunkTag,\n updateChunkTagNote,\n getChunkTagColors,\n isLoading,\n }\n}\n","/**\n * The passage tagging panel: the `TagPassagePanel` block bound to the passage's labels and fields\n * (apply, remove, a note per passage).\n */\n\nimport { useState, useMemo, useCallback } from 'react'\nimport type { components } from '@arbidocs/client'\nimport { TagEntity, getEntityColor } from '@arbidocs/react/ui'\nimport { TagPassagePanel, type PassageTagGroupView } from '../../../files/TagPassagePanel'\nimport { useConnectedTags, type ConnectedTag } from '../../workspaceData'\nimport { useDocumentViewerSupport } from '../support'\nimport { isDocumentTag } from './document-tags'\nimport { useChunkTagging } from './useChunkTagging'\n\ntype DocTag = components['schemas']['DocTagResponse']\ntype Tag = ConnectedTag\n\n/** The panel's group headings, by format: labels, then the fields' value types. */\nconst GROUP_TITLES: Record<string, string> = {\n checkbox: 'Label',\n select: 'Choice',\n text: 'Text',\n number: 'Number',\n}\n\ninterface PassageTagPanelProps {\n documentId: string\n chunkExtId: string\n chunkContent: string\n pageNumber?: number\n documentDoctags: DocTag[]\n onClose: () => void\n /** Called when a tag is selected to show all chunks with that tag */\n onViewTaggedChunks?: (tagExtId: string) => void\n}\n\nexport function PassageTagPanel({\n documentId,\n chunkExtId,\n chunkContent,\n pageNumber,\n documentDoctags,\n onClose,\n onViewTaggedChunks,\n}: PassageTagPanelProps) {\n const { createTag } = useDocumentViewerSupport()\n\n // Track which tag's note is being edited\n const [editingNoteTagId, setEditingNoteTagId] = useState<string | null>(null)\n const [noteValue, setNoteValue] = useState('')\n\n // Get workspace tags (filtered to exclude search tags)\n const { data: allTags } = useConnectedTags()\n const workspaceTags = useMemo(() => allTags.filter(isDocumentTag), [allTags])\n\n // Chunk tagging utilities\n const { getChunkTagState, toggleChunkTag, updateChunkTagNote, isLoading } = useChunkTagging({\n documentId,\n documentDoctags,\n })\n\n const chunkState = useMemo(() => getChunkTagState(chunkExtId), [getChunkTagState, chunkExtId])\n\n // Group tags by type for organized display\n const groupedTags = useMemo(() => {\n const groups: Record<string, Tag[]> = {\n checkbox: [],\n select: [],\n text: [],\n number: [],\n }\n\n workspaceTags.forEach((tag) => {\n // Labels (and issues) under `checkbox`; annotations by their format.\n const group =\n tag.kind === 'label' ? 'checkbox' : tag.kind === 'annotation' ? tag.tag_type.type : null\n if (group && groups[group]) {\n groups[group].push(tag)\n }\n })\n\n return groups\n }, [workspaceTags])\n\n const handleToggleTag = useCallback(\n async (tag: Tag) => {\n try {\n await toggleChunkTag(chunkExtId, tag)\n } catch (error) {\n console.error('Failed to toggle chunk tag:', error)\n }\n },\n [chunkExtId, toggleChunkTag]\n )\n\n const handleStartEditNote = useCallback(\n (tagExtId: string) => {\n const doctag = chunkState.getDoctagForChunk(tagExtId)\n setNoteValue(doctag?.note || '')\n setEditingNoteTagId(tagExtId)\n },\n [chunkState]\n )\n\n const handleSaveNote = useCallback(\n async (tag: Tag) => {\n try {\n await updateChunkTagNote(chunkExtId, tag, noteValue || null)\n } catch (error) {\n console.error('Failed to save note:', error)\n }\n setEditingNoteTagId(null)\n setNoteValue('')\n },\n [chunkExtId, noteValue, updateChunkTagNote]\n )\n\n const preview = useMemo(() => {\n const maxLength = 200\n if (chunkContent.length <= maxLength) return chunkContent\n return chunkContent.slice(0, maxLength) + '...'\n }, [chunkContent])\n\n const groups = useMemo<PassageTagGroupView[]>(\n () =>\n Object.entries(groupedTags)\n .filter(([, tags]) => tags.length > 0)\n .map(([type, tags]) => ({\n id: type,\n title: GROUP_TITLES[type] ?? type,\n tags: tags.map((tag) => ({\n id: tag.external_id,\n color: getEntityColor(tag.external_id, 'medium'),\n isApplied: chunkState.isTagApplied(tag.external_id),\n note: chunkState.getDoctagForChunk(tag.external_id)?.note,\n badge: <TagEntity tag={tag} size=\"sm\" showTooltip={false} />,\n })),\n })),\n [groupedTags, chunkState]\n )\n const tagById = useMemo(\n () => new Map(workspaceTags.map((tag) => [tag.external_id, tag])),\n [workspaceTags]\n )\n\n return (\n <TagPassagePanel\n pageNumber={pageNumber}\n preview={preview}\n groups={groups}\n isEmpty={workspaceTags.length === 0}\n isBusy={isLoading}\n editingNoteTagId={editingNoteTagId}\n noteValue={noteValue}\n onNoteChange={setNoteValue}\n onToggle={(id) => {\n const tag = tagById.get(id)\n if (tag) void handleToggleTag(tag)\n }}\n onViewTagged={onViewTaggedChunks}\n onStartNote={handleStartEditNote}\n onSaveNote={(id) => {\n const tag = tagById.get(id)\n if (tag) void handleSaveNote(tag)\n }}\n onCancelNote={() => {\n setEditingNoteTagId(null)\n setNoteValue('')\n }}\n onCreate={createTag}\n onClose={onClose}\n />\n )\n}\n","/**\n * ParsedPassage: binds one parsed chunk to the `HtmlPassage` block (markdown body, citation\n * entity pills, copy/link/label/navigator actions). Memoized so selecting one passage does not\n * re-parse the markdown of the others. The body is the conversation's markdown (`ConnectedMarkdown`),\n * so a passage's links and bookmarks are the same quiet marks as an answer's, with their menu.\n */\n\nimport { memo } from 'react'\nimport type { MarkMenuItem } from '@arbidocs/react/ui'\nimport type { ProcessedChunk } from '@arbidocs/react/viewers'\nimport { LabelMark, NoteMark, PassageMark } from '../../../citations/QuietMarks'\nimport { HtmlPassage } from '../../../files'\nimport { ConnectedMarkdown } from '../../conversation/ConnectedMarkdown'\nimport type { PassageLabel } from './useDocumentLabels'\n\nexport interface ParsedPassageProps {\n chunk: ProcessedChunk\n pageNumber: number | null\n isHighlighted: boolean\n isSelected: boolean\n /** One of a fact's cited passages, listed in an open Citation popover. */\n isCitationHighlight: boolean\n /** The cited passage currently being read from the Citation popover. */\n isActiveCitation: boolean\n /** A fact's Citation popover drives the highlights; its shades win over the selection fill. */\n factCitationActive: boolean\n isCitationMode: boolean\n runIsStart: boolean\n runIsEnd: boolean\n /** Last passage index of the run; set only on the run's first member. */\n runEndIndex: number | undefined\n onChunkClick: ((chunkId: string, extendFromAnchor: boolean) => void) | undefined\n formatChunkWithCitation: (\n content: string,\n pageNumber: number | undefined,\n chunkExtId: string | undefined\n ) => string\n getPassageDeepLink: (chunkExtId: string | undefined) => string | null\n copyToClipboard: (\n text: string,\n metadata: {\n type: 'passage' | 'link'\n documentTitle: string\n pageNumber: number | undefined\n passageIndex: number | undefined\n passageContent: string\n href?: string\n }\n ) => void\n /** Open the document's passages in the host's navigator. Absent: not offered. */\n onOpenNavigator: (() => void) | undefined\n /** Labels applied to this passage. */\n labels: PassageLabel[]\n /** The label currently being walked, when it marks this passage. */\n activeTagColor: string | undefined\n /** Open the tagging panel for this passage. */\n onTagPassage: ((chunkExtId: string) => void) | undefined\n /** Walk a label's passages (the label mark's Show row). */\n onShowLabel: ((tagExtId: string) => void) | undefined\n /** Take a label off this passage (the label mark's Remove row). */\n onRemoveLabel: ((chunkExtId: string, tagExtId: string) => void) | undefined\n}\n\nexport const ParsedPassage = memo(function ParsedPassage({\n chunk,\n pageNumber,\n isHighlighted,\n isSelected,\n isCitationHighlight,\n isActiveCitation,\n factCitationActive,\n isCitationMode,\n runIsStart,\n runIsEnd,\n runEndIndex,\n labels,\n activeTagColor,\n onTagPassage,\n onShowLabel,\n onRemoveLabel,\n onChunkClick,\n formatChunkWithCitation,\n getPassageDeepLink,\n copyToClipboard,\n onOpenNavigator,\n}: ParsedPassageProps) {\n const chunkId = chunk.chunkExtId\n const formattedContent = chunkId\n ? formatChunkWithCitation(chunk.content, pageNumber || undefined, chunkId)\n : ''\n\n // While a fact's Citation popover drives the view, its cited set (light) and the passage being\n // read (strong) take precedence over the citation-mode selection.\n const isStrong = isActiveCitation || (!factCitationActive && isSelected)\n const isLight = isCitationHighlight || (!factCitationActive && isHighlighted)\n\n // One label per run, on its first member: \"¶4\" or \"¶4-9\".\n const ownIndex = chunk.chunkIndex !== undefined ? chunk.chunkIndex + 1 : undefined\n const runLabel =\n runEndIndex !== undefined && ownIndex !== undefined && runEndIndex > ownIndex\n ? `¶${ownIndex}–${runEndIndex}`\n : `¶${ownIndex ?? ''}`\n const showLabel = !!chunkId && (!isSelected || runIsStart)\n\n const copyPassage = (type: 'passage' | 'link', text: string, href?: string) =>\n copyToClipboard(text, {\n type,\n documentTitle: chunk.docTitle || 'Document',\n pageNumber: pageNumber || undefined,\n passageIndex: chunk.chunkIndex,\n passageContent: formattedContent,\n href,\n })\n\n // ONE menu for the passage: every action that used to be a button in a column beside it.\n const passageItems: MarkMenuItem[] = chunkId\n ? [\n {\n id: 'copy-passage',\n label: 'Copy passage with citation',\n primary: true,\n testId: 'passage-copy',\n onSelect: () =>\n copyPassage('passage', formattedContent, getPassageDeepLink(chunkId) || undefined),\n },\n {\n id: 'copy-link',\n label: 'Copy passage link',\n testId: 'passage-copy-link',\n onSelect: () => {\n const link = getPassageDeepLink(chunkId)\n if (link) copyPassage('link', link, link)\n },\n },\n ...(onTagPassage\n ? [\n {\n id: 'label',\n label: 'Label this passage',\n testId: 'passage-label',\n onSelect: () => onTagPassage(chunkId),\n },\n ]\n : []),\n ...(onOpenNavigator\n ? [\n {\n id: 'navigator',\n label: 'Open in navigator',\n testId: 'passage-navigator',\n onSelect: onOpenNavigator,\n },\n ]\n : []),\n ]\n : []\n\n const labelItems: MarkMenuItem[] = chunkId\n ? labels.flatMap((l, i) => {\n const suffix = labels.length > 1 ? ` “${l.name}”` : ' label'\n return [\n ...(onShowLabel\n ? [\n {\n id: `show-${l.tagExtId}`,\n label: `Show${suffix}`,\n primary: i === 0,\n testId: 'label-show',\n onSelect: () => onShowLabel(l.tagExtId),\n },\n ]\n : []),\n ...(onRemoveLabel\n ? [\n {\n id: `remove-${l.tagExtId}`,\n label: `Remove${suffix}`,\n destructive: true,\n testId: 'label-remove',\n onSelect: () => onRemoveLabel(chunkId, l.tagExtId),\n },\n ]\n : []),\n ]\n })\n : []\n\n return (\n <HtmlPassage\n chunkId={chunkId}\n highlight={isStrong ? 'strong' : isLight ? 'light' : undefined}\n isHit={isHighlighted}\n isSelected={isSelected}\n runIsStart={runIsStart}\n runIsEnd={runIsEnd}\n isClickable={isCitationMode}\n onSelect={onChunkClick && chunkId ? (extend) => onChunkClick(chunkId, extend) : undefined}\n isTagged={labels.length > 0}\n activeTagColor={activeTagColor}\n tagMark={\n labels.length > 0 ? (\n <LabelMark\n colors={labels.map((l) => l.color)}\n name={`Labels: ${labels.map((l) => l.name).join(', ')}`}\n menuLabel=\"Label actions\"\n testId={`passage-tag-dots-${chunkId}`}\n preview={\n <span className=\"block font-medium\">{labels.map((l) => l.name).join(', ')}</span>\n }\n items={labelItems}\n />\n ) : undefined\n }\n runMarker={\n isSelected && runIsStart ? (\n <NoteMark\n label={runLabel}\n title=\"Cited by this note — click a passage to add, shift-click for a range\"\n testId={`note-marker-${chunkId}`}\n />\n ) : undefined\n }\n mark={\n showLabel && chunkId ? (\n <PassageMark\n label={runLabel}\n menuLabel=\"Passage actions\"\n testId={`passage-mark-${chunkId}`}\n items={passageItems}\n />\n ) : undefined\n }\n >\n <ConnectedMarkdown>{chunk.content}</ConnectedMarkdown>\n </HtmlPassage>\n )\n})\n","/**\n * Utility functions for formatting citations\n */\n\ninterface ChunkCopyData {\n content: string\n documentTitle?: string\n documentDate?: string\n pageNumber?: number\n chunkId?: string\n}\n\n/**\n * Formats a citation in basic academic format\n * @param data - The chunk and document data\n * @returns Formatted citation string\n */\nexport function formatCitation(data: ChunkCopyData): string {\n const { documentTitle, documentDate, pageNumber } = data\n\n let citation = ''\n\n if (documentTitle) {\n citation += `${documentTitle}`\n }\n\n if (documentDate) {\n citation += documentTitle ? `, ${documentDate}` : documentDate\n }\n\n if (pageNumber) {\n citation += citation ? `, p. ${pageNumber}` : `p. ${pageNumber}`\n }\n\n return citation\n}\n","/**\n * Passage Copy Hook\n *\n * Handles citation formatting and clipboard operations for document passages.\n */\n\nimport React, { useCallback } from 'react'\nimport { HtmlIcon } from '@arbidocs/react'\nimport { buildDeepLinkUrl } from '../../../lib/deep-link'\nimport { PassagePill } from '../../../citations/PassagePill'\nimport { useBlocksEnvironment } from '../../../provider/environment'\nimport type { ViewerDocumentRecord } from '../support'\nimport { formatCitation } from './citation-line'\n\ninterface PassageInfo {\n type: 'link' | 'passage'\n documentTitle: string\n pageNumber?: number\n passageIndex?: number\n passageContent: string\n href?: string\n}\n\ninterface UsePassageCopyProps {\n documentId: string\n documentData: ViewerDocumentRecord | null | undefined\n selectedWorkspaceId: string | null\n}\n\nexport function usePassageCopy({\n documentId,\n documentData,\n selectedWorkspaceId,\n}: UsePassageCopyProps) {\n const { notify, runtimeConfig } = useBlocksEnvironment()\n const deploymentDomain = runtimeConfig.deploymentDomain\n /**\n * Format chunk content with citation and deep link\n */\n const formatChunkWithCitation = useCallback(\n (chunkContent: string, pageNumber?: number, chunkExtId?: string) => {\n const docDate = documentData?.doc_metadata?.doc_date\n const citation = formatCitation({\n content: chunkContent,\n documentTitle: documentData?.doc_metadata?.title || documentData?.file_name || '',\n documentDate: docDate ? new Date(docDate).toISOString().split('T')[0] : undefined,\n pageNumber,\n })\n\n // Build deep link URL\n const deepLinkUrl =\n selectedWorkspaceId && documentId && chunkExtId\n ? buildDeepLinkUrl(\n { workspaceId: selectedWorkspaceId, documentId, chunkId: chunkExtId },\n deploymentDomain\n )\n : ''\n\n let result = `\"${chunkContent.trim()}\"`\n if (citation) {\n result += `\\n\\n— ${citation}`\n }\n if (deepLinkUrl) {\n result += `\\n[ARBI Docs link](${deepLinkUrl})`\n }\n return result\n },\n [documentData, selectedWorkspaceId, documentId, deploymentDomain]\n )\n\n /**\n * Get the passage deep link URL\n */\n const getPassageDeepLink = useCallback(\n (chunkExtId?: string) => {\n if (!selectedWorkspaceId || !documentId || !chunkExtId) {\n return ''\n }\n return buildDeepLinkUrl(\n { workspaceId: selectedWorkspaceId, documentId, chunkId: chunkExtId },\n deploymentDomain\n )\n },\n [selectedWorkspaceId, documentId, deploymentDomain]\n )\n\n /**\n * Copy text to clipboard with dual format (HTML + plain text)\n */\n const copyToClipboard = useCallback(\n async (text: string, passageInfo?: PassageInfo) => {\n try {\n if (passageInfo?.href) {\n const isLink = passageInfo.type === 'link'\n const { documentTitle, pageNumber, passageIndex, href } = passageInfo\n\n // Build citation text: \"Document Title, p.X(Y)\"\n const pageNotation = pageNumber ? `p.${pageNumber}` : ''\n const passageNotation = passageIndex !== undefined ? `(${passageIndex})` : ''\n const citation = `${documentTitle}${pageNotation ? `, ${pageNotation}${passageNotation}` : ''}`\n\n let html: string\n let plainText: string\n\n if (isLink) {\n // Link only: clickable link\n html = `<a href=\"${href}\" target=\"_blank\" rel=\"noopener noreferrer\">${citation}</a>`\n plainText = href\n } else {\n // Passage: link first, then content\n const linkHtml = `<p><a href=\"${href}\" target=\"_blank\" rel=\"noopener noreferrer\">${citation}</a></p>`\n html = `${linkHtml}<blockquote style=\"margin: 8px 0; padding-left: 12px; border-left: 3px solid #ccc;\">${text}</blockquote>`\n plainText = `${href}\\n\\n${text}\\n\\n— ${citation}`\n }\n\n const clipboardItem = new ClipboardItem({\n 'text/html': new Blob([html], { type: 'text/html' }),\n 'text/plain': new Blob([plainText], { type: 'text/plain' }),\n })\n\n await navigator.clipboard.write([clipboardItem])\n\n // Show notification\n const prefix = isLink ? 'Link copied:' : 'Passage copied:'\n const notificationElement = React.createElement(\n 'span',\n { className: 'inline-flex items-center gap-2' },\n prefix,\n React.createElement(PassagePill, {\n icon: React.createElement(HtmlIcon, { size: 16, className: 'flex-shrink-0' }),\n documentTitle: passageInfo.documentTitle,\n pageNumber: passageInfo.pageNumber,\n passageIndex: passageInfo.passageIndex,\n href: passageInfo.href,\n onClick: (e: React.MouseEvent) => e.stopPropagation(),\n })\n )\n\n notify(notificationElement, 'success', {\n workspaceId: selectedWorkspaceId || undefined,\n // The bell entry deep-links back to the copied passage.\n href: passageInfo.href,\n })\n } else {\n // Fallback: plain text only\n await navigator.clipboard.writeText(text)\n notify('Copied to clipboard', 'success')\n }\n } catch (err) {\n console.error('Clipboard copy failed:', err)\n notify('Failed to copy to clipboard.', 'error')\n }\n },\n [selectedWorkspaceId, notify]\n )\n\n return {\n formatChunkWithCitation,\n getPassageDeepLink,\n copyToClipboard,\n }\n}\n","/**\n * Labels (doctags) on the parsed document: summaries, per-passage colours, the label being\n * walked, and the passage being labelled. A doctag is anchored to the document, so its passages\n * come with the document itself; no reverse lookup.\n */\n\nimport { useCallback, useEffect, useMemo, useState } from 'react'\nimport type { components } from '@arbidocs/client'\nimport { getEntityColor } from '@arbidocs/react/ui'\nimport { isDocumentLabel, summariseDocTags } from '../../../files/doc-labels'\nimport { useConnectedTags, type ConnectedTag } from '../../workspaceData'\nimport { isDocumentTag } from './document-tags'\nimport { useChunkTagging } from './useChunkTagging'\n\ntype DocTag = components['schemas']['DocTagResponse']\n\n/** One label marking a passage. */\nexport interface PassageLabel {\n tagExtId: string\n name: string\n color: string\n}\n\nexport function useDocumentLabels(\n documentId: string,\n doctags: DocTag[] | undefined,\n orderedChunkIds: string[]\n) {\n const { data: allTags } = useConnectedTags()\n const workspaceTags = useMemo<ConnectedTag[]>(() => allTags.filter(isDocumentTag), [allTags])\n const documentDoctags = useMemo<DocTag[]>(() => doctags ?? [], [doctags])\n const tagSummaries = useMemo(\n () => summariseDocTags(documentDoctags, workspaceTags),\n [documentDoctags, workspaceTags]\n )\n // The chip bar carries labels only; annotations are per-document answers, not filters.\n const labelSummaries = useMemo(\n () => summariseDocTags(documentDoctags, workspaceTags.filter(isDocumentLabel)),\n [documentDoctags, workspaceTags]\n )\n\n /** chunk id -> every label marking it (name + colour). */\n const labelsByChunk = useMemo(() => {\n const map = new Map<string, PassageLabel[]>()\n for (const s of tagSummaries) {\n const label = {\n tagExtId: s.tagExtId,\n name: s.name,\n color: getEntityColor(s.tagExtId, 'medium'),\n }\n for (const id of s.chunkIds) {\n const list = map.get(id)\n if (list) list.push(label)\n else map.set(id, [label])\n }\n }\n return map\n }, [tagSummaries])\n\n const { toggleChunkTag } = useChunkTagging({ documentId, documentDoctags })\n /** Take one label off one passage (the label mark's Remove row). */\n const removeLabel = useCallback(\n async (chunkExtId: string, tagExtId: string) => {\n const tag = workspaceTags.find((t) => t.external_id === tagExtId)\n if (!tag) return\n try {\n await toggleChunkTag(chunkExtId, tag)\n } catch (error) {\n console.error('Failed to remove passage label', error)\n }\n },\n [workspaceTags, toggleChunkTag]\n )\n\n // One label at a time: two washes on one paragraph say nothing.\n const [activeTagExtId, setActiveTagExtId] = useState<string | null>(null)\n const [tagCursor, setTagCursor] = useState(0)\n /** The passage being labelled; opens the tagging panel. */\n const [taggingChunkId, setTaggingChunkId] = useState<string | null>(null)\n\n const activeTagSummary = tagSummaries.find((t) => t.tagExtId === activeTagExtId)\n const activeTagColor = activeTagExtId ? getEntityColor(activeTagExtId, 'medium') : undefined\n const activeChunkIds = useMemo(\n () => new Set(activeTagSummary?.chunkIds ?? []),\n [activeTagSummary]\n )\n\n /** Walk the active label's passages in document order, not citation order. */\n const orderedActiveIds = useMemo(\n () => orderedChunkIds.filter((id) => activeChunkIds.has(id)),\n [orderedChunkIds, activeChunkIds]\n )\n const gotoTagged = useCallback(\n (delta: number) => {\n if (orderedActiveIds.length === 0) return\n const next = (tagCursor + delta + orderedActiveIds.length) % orderedActiveIds.length\n setTagCursor(next)\n document\n .getElementById(orderedActiveIds[next])\n ?.scrollIntoView({ behavior: 'smooth', block: 'center' })\n },\n [tagCursor, orderedActiveIds]\n )\n const selectTag = useCallback((tagExtId: string | null) => {\n setActiveTagExtId(tagExtId)\n setTagCursor(0)\n }, [])\n // Selecting a label jumps to its first passage, or the highlight may be off-screen.\n useEffect(() => {\n if (!activeTagExtId || orderedActiveIds.length === 0) return\n document\n .getElementById(orderedActiveIds[0])\n ?.scrollIntoView({ behavior: 'smooth', block: 'center' })\n // Only when the label changes, not as the cursor moves.\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [activeTagExtId])\n\n return {\n documentDoctags,\n labelSummaries,\n labelsByChunk,\n removeLabel,\n activeTagExtId,\n activeTagColor,\n activeChunkIds,\n tagCursor,\n gotoTagged,\n selectTag,\n taggingChunkId,\n setTaggingChunkId,\n }\n}\n","/**\n * Passage selection for citations in the parsed viewer: drag-to-select, click / shift-click\n * ranges, contiguous runs, the cited-run stepper, and the fact-citation highlight set.\n */\n\nimport { useCallback, useEffect, useMemo, useRef, useState } from 'react'\nimport type { RefObject } from 'react'\nimport { useArbiSessionState } from '@arbidocs/react'\nimport { computeSelectionRuns } from '@arbidocs/react/viewers'\nimport type { ProcessedPage } from '@arbidocs/react/viewers'\nimport { useViewerPassageCitation } from '../support'\n\nconst NONE: readonly string[] = []\nconst noop = () => {}\n\ninterface Options {\n documentId: string\n containerRef: RefObject<HTMLDivElement | null>\n processedChunks: ProcessedPage[]\n orderedChunkIds: string[]\n pageOf: (id: string) => number | undefined\n}\n\nexport function useCitationSelection({\n documentId,\n containerRef,\n processedChunks,\n orderedChunkIds,\n pageOf,\n}: Options) {\n // A citation being edited (a fact's, a field's) picks its passages here, through the host.\n const passageCitation = useViewerPassageCitation()\n const activeCitationContext = passageCitation?.active ?? null\n const setPendingPassagesForCitation = passageCitation?.pick ?? noop\n const setUnselectedPassagesForCitation = passageCitation?.unpick ?? noop\n const viewingPassageId = useArbiSessionState((s) => s.viewingDocument?.passageId ?? null)\n\n // Multi-select: persists across selections.\n const [selectedChunks, setSelectedChunks] = useState<Set<string>>(new Set())\n // Latest selection readable inside handlers without churning the memoized passage rows. Lets a\n // click decide add-vs-remove and fire the store update OUTSIDE the setState updater.\n const selectedChunksRef = useRef(selectedChunks)\n selectedChunksRef.current = selectedChunks\n // Anchor for shift-click range selection: the last plainly-clicked passage.\n const selectionAnchorRef = useRef<string | null>(null)\n\n // Fact source-citation highlight: while a fact's Citation popover is open its listed passages\n // are washed light and the one being read (`viewingPassageId`) is stronger. Gated on the set\n // being non-empty so only that flow lights passages this way.\n const factCitationChunkIds = passageCitation?.highlighted ?? NONE\n const factCitationSet = useMemo(() => new Set(factCitationChunkIds), [factCitationChunkIds])\n const factCitationActive = factCitationSet.size > 0\n const factCitationSetRef = useRef(factCitationSet)\n factCitationSetRef.current = factCitationSet\n\n const isCitationMode = !!activeCitationContext && activeCitationContext.documentId === documentId\n\n // Contiguous runs read as ONE citation (\"p.3(4-9)\"), keyed by the run's first passage.\n const selectionRuns = useMemo(\n () => computeSelectionRuns(processedChunks, selectedChunks),\n [processedChunks, selectedChunks]\n )\n\n // Step between runs, not passages: \"next\" lands on the next MARK.\n const runStartIds = useMemo(\n () => orderedChunkIds.filter((id) => selectionRuns.get(id)?.isStart),\n [orderedChunkIds, selectionRuns]\n )\n const [runCursor, setRunCursor] = useState(0)\n const gotoRun = useCallback(\n (delta: number) => {\n if (runStartIds.length === 0) return\n const next = (runCursor + delta + runStartIds.length) % runStartIds.length\n setRunCursor(next)\n document\n .getElementById(runStartIds[next])\n ?.scrollIntoView({ behavior: 'smooth', block: 'center' })\n },\n [runCursor, runStartIds]\n )\n useEffect(() => {\n if (runCursor >= runStartIds.length) setRunCursor(0)\n }, [runStartIds.length, runCursor])\n\n // Clear selections when the citation context changes (new citation or cleared).\n useEffect(() => {\n setSelectedChunks(new Set())\n }, [activeCitationContext?.key, activeCitationContext?.documentId])\n\n // Text selection end: expand to whole chunks and accumulate.\n const handleSelectionEnd = useCallback(() => {\n if (!activeCitationContext || activeCitationContext.documentId !== documentId) return\n\n const selection = window.getSelection()\n if (!selection || selection.isCollapsed || selection.rangeCount === 0) return\n\n const container = containerRef.current\n if (!container) return\n\n const newSelectedChunks = new Set<string>()\n container.querySelectorAll('[data-chunk-id]').forEach((el) => {\n const chunkId = el.getAttribute('data-chunk-id')\n if (!chunkId) return\n // partial=true: robust intersection with nested elements and text nodes.\n if (selection.containsNode(el, true)) newSelectedChunks.add(chunkId)\n })\n\n if (newSelectedChunks.size > 0) {\n setSelectedChunks((prev) => new Set([...prev, ...newSelectedChunks]))\n setPendingPassagesForCitation(\n Array.from(newSelectedChunks).map((id) => ({ chunk_id: id, page: pageOf(id) }))\n )\n }\n\n // Chunks are highlighted instead of the raw text selection.\n selection.removeAllRanges()\n }, [activeCitationContext, documentId, containerRef, setPendingPassagesForCitation, pageOf])\n\n // A plain click toggles a passage AND sets the anchor; shift-click selects every passage\n // between the anchor and the target in document order. The stored citation is explicit chunk\n // ids (opaque ids survive a re-parse; an ordinal range would silently re-point).\n const handleChunkClick = useCallback(\n (chunkId: string, extendFromAnchor: boolean) => {\n if (!activeCitationContext || activeCitationContext.documentId !== documentId) return\n\n const anchorId = selectionAnchorRef.current\n const anchorIdx = anchorId ? orderedChunkIds.indexOf(anchorId) : -1\n const targetIdx = orderedChunkIds.indexOf(chunkId)\n\n if (extendFromAnchor && anchorIdx !== -1 && targetIdx !== -1) {\n const [from, to] = anchorIdx <= targetIdx ? [anchorIdx, targetIdx] : [targetIdx, anchorIdx]\n const range = orderedChunkIds.slice(from, to + 1)\n setSelectedChunks((prev) => new Set([...prev, ...range]))\n setPendingPassagesForCitation(range.map((id) => ({ chunk_id: id, page: pageOf(id) })))\n // Anchor stays put so a further shift-click can grow or shrink the run.\n return\n }\n\n selectionAnchorRef.current = chunkId\n // While a fact's Citation popover drives things, decide against the fact's ACTUAL cited set\n // (clicking an already-cited passage REMOVES it), not the session-local selection.\n const wasSelected = factCitationSetRef.current.size\n ? factCitationSetRef.current.has(chunkId)\n : selectedChunksRef.current.has(chunkId)\n setSelectedChunks((prev) => {\n const next = new Set(prev)\n if (wasSelected) next.delete(chunkId)\n else next.add(chunkId)\n return next\n })\n if (wasSelected) setUnselectedPassagesForCitation([chunkId])\n else setPendingPassagesForCitation([{ chunk_id: chunkId, page: pageOf(chunkId) }])\n },\n [\n activeCitationContext,\n documentId,\n orderedChunkIds,\n setPendingPassagesForCitation,\n setUnselectedPassagesForCitation,\n pageOf,\n ]\n )\n\n return {\n isCitationMode,\n selectedChunks,\n selectionRuns,\n runStartIds,\n runCursor,\n gotoRun,\n handleSelectionEnd,\n handleChunkClick,\n factCitationSet,\n factCitationActive,\n viewingPassageId,\n }\n}\n","/**\n * Page Scroll Sync Hook\n *\n * Handles bidirectional page synchronization between HTML viewer and page controls.\n * Manages tab switch scrolling, passage highlighting, and manual page navigation.\n */\n\nimport { useEffect, useRef, useCallback, useState } from 'react'\nimport { useArbiSessionState, useArbiSessionStore } from '@arbidocs/react'\nimport { usePageIntersectionObserver } from '@arbidocs/react/viewers'\n\n/** Scroll a passage to the middle of the view once it is painted (a lazy page may still render). */\nfunction scrollToChunk(chunkId: string) {\n requestAnimationFrame(() => {\n const element = document.getElementById(chunkId)\n if (element) {\n element.scrollIntoView({ behavior: 'auto', block: 'center' })\n return\n }\n // Not painted yet: one retry after a short delay.\n setTimeout(() => {\n document.getElementById(chunkId)?.scrollIntoView({ behavior: 'auto', block: 'center' })\n }, 100)\n })\n}\n\ninterface UsePageScrollSyncProps {\n containerRef: React.RefObject<HTMLDivElement | null>\n processedChunksLength: number\n scrollTrigger?: number\n /** Optional callback with visibility data for lazy loading */\n onVisibilityUpdate?: (visibilityMap: Map<number, number>) => void\n}\n\nexport function usePageScrollSync({\n containerRef,\n processedChunksLength,\n scrollTrigger,\n onVisibilityUpdate,\n}: UsePageScrollSyncProps) {\n const session = useArbiSessionStore()\n const viewingId = useArbiSessionState((s) => s.viewingDocument?.id)\n const viewingDocumentPage = useArbiSessionState((s) => s.viewingDocument?.page ?? null)\n const viewingPassageId = useArbiSessionState((s) => s.viewingDocument?.passageId ?? null)\n const activeTab = useArbiSessionState((s) => s.documentViewer.tab)\n const setViewingDocumentPage = useCallback(\n (page: number) => {\n if (viewingId) session.setViewingDocument({ id: viewingId, page })\n },\n [session, viewingId]\n )\n\n // The passage a citation opened the document at, lit until another one is.\n const [highlighted, setHighlighted] = useState<string | null>(null)\n const isChunkHighlighted = useCallback(\n (chunkId: string) => chunkId === highlighted,\n [highlighted]\n )\n\n // Track whether initial scroll has completed to prevent feedback loop\n const scrollCompleteRef = useRef(false)\n // Read the current passage inside the tab-switch effect without adding it\n // to that effect's deps (see the note on its dependency list).\n const viewingPassageIdRef = useRef(viewingPassageId)\n viewingPassageIdRef.current = viewingPassageId\n\n // Reset scroll gate when tab switches away from HTML\n useEffect(() => {\n if (activeTab !== 'html') {\n scrollCompleteRef.current = false\n }\n }, [activeTab])\n\n // Scroll to page ONLY on tab switch - not when page number updates from scrolling\n useEffect(() => {\n // Only run when tab switches to HTML\n if (activeTab !== 'html' || processedChunksLength === 0) return\n\n // If we already scrolled, don't scroll again\n if (scrollCompleteRef.current) return\n\n // A targeted passage owns the scroll (HtmlViewer centres it once its chunk\n // has rendered); scrolling to the page top here would land on top of that\n // and leave the passage out of view when it sits lower on the page.\n if (viewingPassageIdRef.current) {\n scrollCompleteRef.current = true\n return\n }\n\n // Wait for DOM update, then scroll to current page\n requestAnimationFrame(() => {\n if (viewingDocumentPage) {\n const pageElement = document.getElementById(`page-${viewingDocumentPage}`)\n if (pageElement) {\n pageElement.scrollIntoView({ behavior: 'auto', block: 'start' })\n // Only mark complete once we actually scrolled — if the element wasn't\n // rendered yet (lazy loading), leave scrollCompleteRef false so the\n // HtmlViewer post-render effect can scroll after pre-rendering the page.\n setTimeout(() => {\n scrollCompleteRef.current = true\n }, 100)\n }\n // else: element not in DOM yet — HtmlViewer will pre-render it and\n // the renderedPages-watching effect will scroll after render\n } else {\n scrollCompleteRef.current = true\n }\n })\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [activeTab, processedChunksLength]) // Note: viewingDocumentPage is intentionally NOT a dependency to prevent feedback loop\n\n // Only scroll to a passage when it actually changes (new citation selection),\n // not on every tab switch back to HTML. This preserves scroll position when\n // the user navigates PDF ↔ HTML without selecting a new citation.\n const lastScrolledPassageRef = useRef<string | null>(null)\n\n // Reset when passage is cleared (popover closed) so re-opening the same\n // citation still triggers a scroll.\n useEffect(() => {\n if (!viewingPassageId) {\n lastScrolledPassageRef.current = null\n // The citation closed: its passage is no longer lit.\n setHighlighted(null)\n }\n }, [viewingPassageId])\n\n // Effect to highlight and scroll to passage when viewingPassageId changes\n useEffect(() => {\n if (!viewingPassageId || activeTab !== 'html' || processedChunksLength === 0) return\n // Skip scroll if we already scrolled to this passage (e.g. tab switch without new selection)\n if (lastScrolledPassageRef.current === viewingPassageId) return\n lastScrolledPassageRef.current = viewingPassageId\n setHighlighted(viewingPassageId)\n scrollToChunk(viewingPassageId)\n }, [viewingPassageId, activeTab, processedChunksLength])\n\n // The page the last explicit request asked for. Read when the trigger fires: scrolling itself\n // changes `viewingDocumentPage`, and re-running the scroll for that would pull the view back to\n // the top of every page the user scrolls past.\n const viewingPageRef = useRef(viewingDocumentPage)\n viewingPageRef.current = viewingDocumentPage\n\n // Scroll to page when scrollTrigger changes (user entered a page number)\n useEffect(() => {\n const viewingDocumentPage = viewingPageRef.current\n if (!scrollTrigger || processedChunksLength === 0 || !viewingDocumentPage) return\n\n // Temporarily disable observer updates during manual scroll\n scrollCompleteRef.current = false\n\n requestAnimationFrame(() => {\n const pageElement = document.getElementById(`page-${viewingDocumentPage}`)\n if (pageElement) {\n pageElement.scrollIntoView({ behavior: 'smooth', block: 'start' })\n }\n // Re-enable observer after scroll completes\n setTimeout(() => {\n scrollCompleteRef.current = true\n }, 500)\n })\n }, [scrollTrigger, processedChunksLength])\n\n // Get page elements callback for IntersectionObserver\n const getPageElements = useCallback(\n () => Array.from(document.querySelectorAll<HTMLDivElement>('[id^=\"page-\"]')),\n []\n )\n\n // Get page number from element\n const getPageNumber = useCallback((element: Element) => {\n const pageMatch = element.id.match(/page-(\\d+)/)\n return pageMatch ? parseInt(pageMatch[1], 10) : 0\n }, [])\n\n // Use IntersectionObserver to track visible pages\n usePageIntersectionObserver({\n containerRef,\n scrollCompleteRef,\n isEnabled: activeTab === 'html' && processedChunksLength > 0,\n getPageElements,\n getPageNumber,\n onPageChange: setViewingDocumentPage,\n onVisibilityUpdate,\n observeKey: processedChunksLength,\n })\n\n return {\n isChunkHighlighted,\n }\n}\n","/**\n * Lazy page rendering for the parsed viewer: only pages near the viewport render their chunks;\n * the rest idle-fill, and a target page/passage (deep link, search, citation) is pre-rendered and\n * scrolled into view.\n */\n\nimport { useCallback, useEffect, useRef, useState } from 'react'\nimport type { RefObject } from 'react'\nimport { useArbiSessionState } from '@arbidocs/react'\nimport { usePageScrollSync } from './usePageScrollSync'\nimport type { ProcessedPage } from '@arbidocs/react/viewers'\n\n// Matches PdfViewer constants.\nconst LAZY_LOAD_BUFFER_BEFORE = 2\nconst LAZY_LOAD_BUFFER_AFTER = 5\nconst INITIAL_PAGES_TO_RENDER = 3\n// Aspect ratio of placeholder pages (A4-ish).\nconst PAGE_ASPECT_RATIO = 1.3\n\ninterface Options {\n containerRef: RefObject<HTMLDivElement | null>\n processedChunks: ProcessedPage[]\n scrollTrigger?: number\n}\n\nexport function useLazyPages({ containerRef, processedChunks, scrollTrigger }: Options) {\n const [containerWidth, setContainerWidth] = useState(0)\n useEffect(() => {\n const el = containerRef.current\n if (!el) return\n const observer = new ResizeObserver((entries) => {\n setContainerWidth(entries[0]?.contentRect.width ?? 0)\n })\n observer.observe(el)\n return () => observer.disconnect()\n }, [containerRef])\n\n const [renderedPages, setRenderedPages] = useState<Set<number>>(\n () => new Set(Array.from({ length: INITIAL_PAGES_TO_RENDER }, (_, i) => i))\n )\n\n // After the initial pages render, queue the rest during browser idle time.\n useEffect(() => {\n if (processedChunks.length === 0) return\n const renderAll = () => {\n setRenderedPages((prev) => {\n if (prev.size === processedChunks.length) return prev\n return new Set(Array.from({ length: processedChunks.length }, (_, i) => i))\n })\n }\n // Safari has no requestIdleCallback: fall back to a short timeout.\n if (typeof window.requestIdleCallback !== 'function') {\n const timer = setTimeout(renderAll, 200)\n return () => clearTimeout(timer)\n }\n const id = window.requestIdleCallback(renderAll)\n return () => window.cancelIdleCallback(id)\n }, [processedChunks.length])\n\n const handleVisibilityUpdate = useCallback(\n (visibilityMap: Map<number, number>) => {\n const visiblePageNumbers = Array.from(visibilityMap.entries())\n .filter(([, ratio]) => ratio > 0)\n .map(([pageNum]) => pageNum)\n if (visiblePageNumbers.length === 0) return\n\n const visibleIndices: number[] = []\n processedChunks.forEach((page, index) => {\n if (page.pageNumber !== null && visiblePageNumbers.includes(page.pageNumber)) {\n visibleIndices.push(index)\n }\n })\n if (visibleIndices.length === 0) return\n\n const minIndex = Math.min(...visibleIndices)\n const maxIndex = Math.max(...visibleIndices)\n const pagesToRender = new Set<number>()\n for (\n let i = Math.max(0, minIndex - LAZY_LOAD_BUFFER_BEFORE);\n i <= Math.min(processedChunks.length - 1, maxIndex + LAZY_LOAD_BUFFER_AFTER);\n i++\n ) {\n pagesToRender.add(i)\n }\n setRenderedPages((prev) => {\n // Same pages: return the old set so scrolling does not re-render the viewer every tick.\n for (const i of pagesToRender) if (!prev.has(i)) return new Set([...prev, ...pagesToRender])\n return prev\n })\n },\n [processedChunks]\n )\n\n // Ensure the target page is rendered when a passage is selected or the HTML tab is entered;\n // otherwise getElementById returns null and the scroll silently fails.\n const viewingDocumentPage = useArbiSessionState((s) => s.viewingDocument?.page ?? null)\n const viewingPassageId = useArbiSessionState((s) => s.viewingDocument?.passageId ?? null)\n const activeTab = useArbiSessionState((s) => s.documentViewer.tab)\n\n useEffect(() => {\n if (!viewingDocumentPage || processedChunks.length === 0) return\n if (!viewingPassageId && activeTab !== 'html') return\n\n const targetIndex = processedChunks.findIndex((p) => p.pageNumber === viewingDocumentPage)\n if (targetIndex === -1) return\n\n setRenderedPages((prev) => {\n if (prev.has(targetIndex)) return prev\n const next = new Set(prev)\n for (\n let i = Math.max(0, targetIndex - LAZY_LOAD_BUFFER_BEFORE);\n i <= Math.min(processedChunks.length - 1, targetIndex + LAZY_LOAD_BUFFER_AFTER);\n i++\n ) {\n next.add(i)\n }\n return next\n })\n }, [viewingPassageId, viewingDocumentPage, processedChunks, activeTab])\n\n // After pre-rendering the target, scroll to it. usePageScrollSync only fires on\n // activeTab/length changes and misses an element that was not in the DOM yet. The page scroll\n // is gated to once per tab switch; a passage (centred, not the page top) gets its own scroll,\n // retried frame by frame (bounded) until its lazy page has rendered.\n const tabSwitchScrolledRef = useRef(false)\n const passageScrolledRef = useRef<string | null>(null)\n useEffect(() => {\n if (activeTab !== 'html') tabSwitchScrolledRef.current = false\n }, [activeTab])\n useEffect(() => {\n if (!viewingPassageId) passageScrolledRef.current = null\n }, [viewingPassageId])\n useEffect(() => {\n if (activeTab !== 'html' || !viewingDocumentPage) return\n if (viewingPassageId && passageScrolledRef.current !== viewingPassageId) {\n const target = viewingPassageId\n const deadline = performance.now() + 3000\n let raf = 0\n const tick = () => {\n const el = document.getElementById(target)\n if (el) {\n passageScrolledRef.current = target\n tabSwitchScrolledRef.current = true\n el.scrollIntoView({ behavior: 'auto', block: 'center' })\n // Re-assert next frame so a competing scroll from the same commit cannot win.\n raf = requestAnimationFrame(() =>\n el.scrollIntoView({ behavior: 'auto', block: 'center' })\n )\n return\n }\n if (performance.now() < deadline) raf = requestAnimationFrame(tick)\n }\n raf = requestAnimationFrame(tick)\n return () => cancelAnimationFrame(raf)\n }\n if (tabSwitchScrolledRef.current) return\n const pageElement = document.getElementById(`page-${viewingDocumentPage}`)\n if (!pageElement) return\n tabSwitchScrolledRef.current = true\n requestAnimationFrame(() => {\n pageElement.scrollIntoView({ behavior: 'auto', block: 'start' })\n })\n // renderedPages is the key dep: it fires after pre-render adds the target page.\n }, [renderedPages, activeTab, viewingDocumentPage, viewingPassageId])\n\n const { isChunkHighlighted } = usePageScrollSync({\n containerRef,\n processedChunksLength: processedChunks.length,\n scrollTrigger,\n onVisibilityUpdate: handleVisibilityUpdate,\n })\n\n return {\n renderedPages,\n isChunkHighlighted,\n placeholderHeight: containerWidth ? containerWidth * PAGE_ASPECT_RATIO : 500,\n }\n}\n","/**\n * The text view of a document: its parsed passages, page by page, with labels, citation picking,\n * passage links and copying, and the passage a citation opened it at. Data and behaviour live in\n * the hooks (labels, citation selection, lazy pages); the markup is the blocks HtmlViewer parts.\n */\n\nimport { useCallback, useEffect, useMemo, useRef } from 'react'\nimport { useDocument, useParsedDocument } from '@arbidocs/react'\nimport { parseVersionRef } from '@arbidocs/react/artifacts'\nimport { usePinchZoom, useProcessedChunks, useScrollAnchor } from '@arbidocs/react/viewers'\nimport {\n CitedRunNav,\n DocumentLabelBar,\n HtmlPage,\n HtmlViewerEmpty,\n HtmlViewerRoot,\n HtmlViewerSurface,\n ViewerMessage,\n} from '../../../files'\nimport { useConnectedWorkspace } from '../../ConnectionProvider'\nimport { useDocumentViewerSupport } from '../support'\nimport { PassageTagPanel } from './PassageTagPanel'\nimport { ParsedPassage } from './ParsedPassage'\nimport { usePassageCopy } from './usePassageCopy'\nimport { useDocumentLabels, type PassageLabel } from './useDocumentLabels'\nimport { useCitationSelection } from './useCitationSelection'\nimport { useLazyPages } from './useLazyPages'\n\nconst EMPTY_LABELS: PassageLabel[] = []\n\nexport interface ParsedTextViewProps {\n documentId: string\n stage?: 'marker' | 'subchunk' | 'final'\n onLoadSuccess?: (totalPages: number) => void\n /** Incremented to trigger scroll to current page */\n scrollTrigger?: number\n /** Text zoom, a multiplier of the normal size (1 = 100%). */\n zoom?: number\n /** Called by pinch and double-tap. */\n onZoomChange?: (zoom: number) => void\n}\n\nexport function ParsedTextView({\n documentId,\n stage = 'final',\n onLoadSuccess,\n scrollTrigger,\n zoom = 1,\n onZoomChange,\n}: ParsedTextViewProps) {\n const { workspaceId } = useConnectedWorkspace()\n const { openInNavigator } = useDocumentViewerSupport()\n const containerRef = useRef<HTMLDivElement>(null)\n\n // Document metadata for citation formatting.\n // The document's record (a version reference names its document), for a copied passage's\n // citation line.\n const { data: documentRecord } = useDocument(parseVersionRef(documentId).docId, {\n enabled: !!documentId && !!workspaceId,\n })\n const documentData = documentRecord ?? undefined\n\n const { data: parsedDoc, isLoading, error } = useParsedDocument(documentId, stage)\n const { processedChunks, maxPageNumber } = useProcessedChunks(\n parsedDoc?.chunks,\n parsedDoc?.footnotes || {}\n )\n\n /** A chunk's page: the viewer is the only place this is known. */\n const pageByChunk = useMemo(() => {\n const map = new Map<string, number | undefined>()\n for (const page of processedChunks) {\n for (const chunk of page.chunks) {\n if (chunk.chunkExtId) map.set(chunk.chunkExtId, page.pageNumber ?? undefined)\n }\n }\n return map\n }, [processedChunks])\n const pageOf = useCallback((id: string) => pageByChunk.get(id), [pageByChunk])\n\n // Every passage id in document order: the axis a shift-click range walks.\n const orderedChunkIds = useMemo(\n () =>\n processedChunks.flatMap((page) =>\n page.chunks.map((c) => c.chunkExtId).filter((id): id is string => !!id)\n ),\n [processedChunks]\n )\n const totalPages = useMemo(\n () => processedChunks.filter((p) => p.pageNumber !== null).length,\n [processedChunks]\n )\n\n const labels = useDocumentLabels(documentId, documentData?.doctags, orderedChunkIds)\n const citation = useCitationSelection({\n documentId,\n containerRef,\n processedChunks,\n orderedChunkIds,\n pageOf,\n })\n const { renderedPages, isChunkHighlighted, placeholderHeight } = useLazyPages({\n containerRef,\n processedChunks,\n scrollTrigger,\n })\n // Lazy pages change height as they render: keep the reading position on every engine.\n useScrollAnchor(containerRef, processedChunks.length)\n usePinchZoom({ containerRef, zoom, onZoomChange })\n const { formatChunkWithCitation, getPassageDeepLink, copyToClipboard } = usePassageCopy({\n documentId,\n documentData,\n selectedWorkspaceId: workspaceId,\n })\n\n const handleOpenNavigator = useMemo(\n () => (openInNavigator ? () => openInNavigator(documentId) : undefined),\n [openInNavigator, documentId]\n )\n\n // Notify the parent of the total pages in an effect to avoid setState during render.\n useEffect(() => {\n if (maxPageNumber > 0 && onLoadSuccess) {\n try {\n onLoadSuccess(maxPageNumber)\n } catch (err) {\n console.error('Error in onLoadSuccess callback:', err)\n }\n }\n }, [maxPageNumber, onLoadSuccess])\n\n if (isLoading) return <ViewerMessage>Loading parsed document...</ViewerMessage>\n if (error) {\n return (\n <ViewerMessage>\n <span className=\"text-red-text\">Failed to load parsed document</span>\n </ViewerMessage>\n )\n }\n\n const taggingChunk = labels.taggingChunkId\n ? processedChunks\n .flatMap((page) => page.chunks)\n .find((c) => c.chunkExtId === labels.taggingChunkId)\n : undefined\n\n return (\n <HtmlViewerRoot>\n <DocumentLabelBar\n summaries={labels.labelSummaries}\n activeTagExtId={labels.activeTagExtId}\n cursor={labels.tagCursor}\n onSelect={labels.selectTag}\n onStep={labels.gotoTagged}\n />\n\n {labels.taggingChunkId && (\n <PassageTagPanel\n documentId={documentId}\n chunkExtId={labels.taggingChunkId}\n chunkContent={taggingChunk?.content ?? ''}\n pageNumber={pageOf(labels.taggingChunkId)}\n documentDoctags={labels.documentDoctags}\n onClose={() => labels.setTaggingChunkId(null)}\n onViewTaggedChunks={(tagExtId) => {\n labels.selectTag(tagExtId)\n labels.setTaggingChunkId(null)\n }}\n />\n )}\n\n {/* Hidden while a fact's Citation popover drives the view: that popover already lists and\n navigates the cited passages. */}\n {!citation.factCitationActive && citation.runStartIds.length > 0 && (\n <CitedRunNav\n position={citation.runCursor + 1}\n total={citation.runStartIds.length}\n onStep={citation.gotoRun}\n />\n )}\n <HtmlViewerSurface surfaceRef={containerRef} onMouseUp={citation.handleSelectionEnd}>\n {processedChunks.length > 0 ? (\n processedChunks.map((page, pageIndex) => (\n <HtmlPage\n key={pageIndex}\n pageNumber={page.pageNumber}\n totalPages={totalPages}\n isRendered={renderedPages.has(pageIndex)}\n placeholderHeight={placeholderHeight}\n zoom={zoom}\n >\n {page.chunks.map((chunk, chunkIndex) => {\n const id = chunk.chunkExtId\n const run = id ? citation.selectionRuns.get(id) : undefined\n return (\n <ParsedPassage\n key={chunkIndex}\n chunk={chunk}\n pageNumber={page.pageNumber}\n isHighlighted={!!(id && isChunkHighlighted(id))}\n isSelected={!!(id && citation.selectedChunks.has(id))}\n isCitationHighlight={!!(id && citation.factCitationSet.has(id))}\n isActiveCitation={\n !!(\n id &&\n citation.factCitationActive &&\n citation.viewingPassageId === id &&\n // Only while it is STILL cited: clicking it off must clear it.\n citation.factCitationSet.has(id)\n )\n }\n factCitationActive={citation.factCitationActive}\n isCitationMode={citation.isCitationMode}\n runIsStart={!!run?.isStart}\n runIsEnd={!!run?.isEnd}\n runEndIndex={run?.endIndex}\n onChunkClick={citation.isCitationMode ? citation.handleChunkClick : undefined}\n formatChunkWithCitation={formatChunkWithCitation}\n getPassageDeepLink={getPassageDeepLink}\n copyToClipboard={copyToClipboard}\n onOpenNavigator={handleOpenNavigator}\n labels={id ? (labels.labelsByChunk.get(id) ?? EMPTY_LABELS) : EMPTY_LABELS}\n activeTagColor={\n id && labels.activeChunkIds.has(id) ? labels.activeTagColor : undefined\n }\n onTagPassage={labels.setTaggingChunkId}\n onShowLabel={labels.selectTag}\n onRemoveLabel={labels.removeLabel}\n />\n )\n })}\n </HtmlPage>\n ))\n ) : (\n <HtmlViewerEmpty />\n )}\n </HtmlViewerSurface>\n </HtmlViewerRoot>\n )\n}\n","/**\n * The open presentation's clips of this document, outlined on its PDF pages: where each clip was\n * cut, and the slide it is on. The outline takes no pointer events (the page stays selectable);\n * its label goes to that slide in the presentation.\n */\n\nimport { Presentation } from 'lucide-react'\nimport type { PdfClipOutline } from './clipOutlines'\n\nexport interface PdfClipOutlinesProps {\n outlines: readonly PdfClipOutline[]\n onShow: (outline: PdfClipOutline) => void\n}\n\nexport function PdfClipOutlines({ outlines, onShow }: PdfClipOutlinesProps) {\n return (\n <div className=\"pointer-events-none absolute inset-0\" data-testid=\"pdf-clip-outlines\">\n {outlines.map((outline) => {\n const { rect } = outline\n const label = outline.slides.length\n ? `Slide ${outline.slides.map((index) => index + 1).join(', ')}`\n : 'In the tray'\n return (\n <div\n key={outline.clipId}\n className=\"absolute rounded-sm border-2 border-dashed border-primary/70\"\n style={{\n left: `${rect.x * 100}%`,\n top: `${rect.y * 100}%`,\n width: `${rect.w * 100}%`,\n height: `${rect.h * 100}%`,\n }}\n data-testid=\"pdf-clip-outline\"\n data-clip-id={outline.clipId}\n >\n <button\n type=\"button\"\n className=\"pointer-events-auto absolute -top-2.5 left-1 inline-flex items-center gap-1 rounded-full bg-primary px-1.5 text-[10px] font-medium leading-4 text-primary-foreground shadow-sm hover:bg-primary/90\"\n title={\n outline.slides.length\n ? `Clipped for the presentation: go to ${label.toLowerCase()}`\n : 'Clipped for the presentation: not on a slide yet'\n }\n onClick={() => onShow(outline)}\n data-testid=\"pdf-clip-outline-label\"\n >\n <Presentation className=\"size-2.5\" />\n {label}\n </button>\n </div>\n )\n })}\n </div>\n )\n}\n","/**\n * Which of the open presentation's clips were cut from a document's pages, and the slides each is\n * on: what the PDF outlines (`PdfClipOutlines`).\n */\n\nimport type { Clip, Rect, Slide } from '../../../presentation/model'\n\nexport interface PdfClipOutline {\n clipId: string\n /** The clipped area, as fractions of the page. */\n rect: Rect\n /** The slides (indexes) it is on; none while it waits in the tray. */\n slides: number[]\n}\n\n/** The document a viewer id names, and its version (`doc-…@v{n}`), if one. */\nfunction parseRef(id: string): { documentId: string; version: number | null } {\n const match = /^(.*)@v(\\d+)$/.exec(id)\n return match\n ? { documentId: match[1], version: Number(match[2]) }\n : { documentId: id, version: null }\n}\n\n/**\n * The page clips of the document `viewingId` names, by page number. A clip of another version of\n * it is left out when a version is viewed; the parts of a slide's design (`plain`) are left out.\n */\nexport function clipOutlinesByPage(\n viewingId: string | null | undefined,\n clips: readonly Clip[],\n slides: readonly Pick<Slide, 'items'>[]\n): Map<number, PdfClipOutline[]> {\n const byPage = new Map<number, PdfClipOutline[]>()\n if (!viewingId) return byPage\n const { documentId, version } = parseRef(viewingId)\n for (const clip of clips) {\n if (clip.kind !== 'pdf' || clip.plain || clip.documentId !== documentId) continue\n if (version !== null && clip.version !== undefined && clip.version !== version) continue\n const on = slides.flatMap((slide, index) =>\n slide.items.some((item) => item.clipId === clip.id) ? [index] : []\n )\n const outline = { clipId: clip.id, rect: clip.rect, slides: on }\n byPage.set(clip.page, [...(byPage.get(clip.page) ?? []), outline])\n }\n return byPage\n}\n","/**\n * The open presentation's clips of the viewed document, outlined over its PDF pages\n * (`clipOutlinesByPage`); a label goes to the clip's slide in the presentation.\n */\n\nimport { useCallback, useMemo, type ReactNode } from 'react'\nimport { useArbiSessionStore } from '@arbidocs/react'\nimport { usePresentation } from '../../../presentation/store'\nimport { showPresentation } from '../../presentation/requests'\nimport { PdfClipOutlines } from './PdfClipOutlines'\nimport { clipOutlinesByPage, type PdfClipOutline } from './clipOutlines'\n\n/** A PDF viewer's page overlay: `(page) => outlines | null`. */\nexport function usePdfClipOutlines(\n viewingId: string | null | undefined\n): (pageNumber: number) => ReactNode {\n const session = useArbiSessionStore()\n const clips = usePresentation((s) => s.clips)\n const slides = usePresentation((s) => s.slides)\n const byPage = useMemo(\n () => clipOutlinesByPage(viewingId, clips, slides),\n [viewingId, clips, slides]\n )\n const show = useCallback(\n (outline: PdfClipOutline) => {\n const state = usePresentation.getState()\n if (outline.slides.length) state.goTo(outline.slides[0])\n showPresentation(session, state.boundTo)\n },\n [session]\n )\n return useCallback(\n (pageNumber: number) => {\n const outlines = byPage.get(pageNumber)\n return outlines ? <PdfClipOutlines outlines={outlines} onShow={show} /> : null\n },\n [byPage, show]\n )\n}\n","/**\n * The lit passages of one PDF page, drawn over it. The boxes are fractions of the page, so the layer\n * fills the page area and scales with it; it takes no pointer events, so the PDF stays selectable.\n */\n\nimport { cn } from '@arbidocs/react/ui'\nimport type { PdfPassageBox } from './passageHighlights'\n\nexport interface PdfPassageHighlightsProps {\n boxes: readonly PdfPassageBox[]\n /** The passage being read: its box is told to the host once it is drawn, to bring it into view. */\n activeId: string | null\n onActiveDrawn: (element: HTMLElement) => void\n}\n\nexport function PdfPassageHighlights({\n boxes,\n activeId,\n onActiveDrawn,\n}: PdfPassageHighlightsProps) {\n return (\n <div className=\"pointer-events-none absolute inset-0\" data-testid=\"pdf-passage-highlights\">\n {boxes.map(({ chunkId, box: [x0, y0, x1, y1], highlight }) => (\n <div\n key={chunkId}\n ref={\n chunkId === activeId\n ? (element) => {\n if (element) onActiveDrawn(element)\n }\n : undefined\n }\n data-testid=\"pdf-passage-highlight\"\n data-chunk-id={chunkId}\n data-highlight={highlight}\n className={cn(\n // multiplied, so the page's text stays as dark as it was under the wash. The passage\n // opened (a citation clicked) is marked plainly: a faint wash on a page is easy to miss.\n 'absolute rounded-sm mix-blend-multiply',\n highlight === 'strong' || chunkId === activeId\n ? 'bg-ai-soft ring-2 ring-ai-accent/70'\n : 'bg-ai-soft/60'\n )}\n style={{\n left: `${x0 * 100}%`,\n top: `${y0 * 100}%`,\n width: `${(x1 - x0) * 100}%`,\n height: `${(y1 - y0) * 100}%`,\n }}\n />\n ))}\n </div>\n )\n}\n","/**\n * The passages a citation lights, drawn over the PDF page by page: a fact's cited passages (its\n * Citation popover is open) and the passage a citation opened the document at, as the parsed view\n * lights them. Nothing is fetched until one is lit; the parsed chunks are the parsed view's own\n * query, so opening that tab afterwards costs nothing more.\n */\n\nimport { useCallback, useEffect, useMemo, useRef, type ReactNode } from 'react'\nimport { useArbiSessionState, useParsedDocument } from '@arbidocs/react'\nimport { useProcessedChunks } from '@arbidocs/react/viewers'\nimport { useViewerPassageCitation } from '../support'\nimport { PdfPassageHighlights } from './PdfPassageHighlights'\nimport { passageBoxesByPage } from './passageHighlights'\n\nconst NONE: readonly string[] = []\nconst NO_FOOTNOTES: Record<string, string> = {}\n\n/** A PDF viewer's page overlay for the document being viewed: `(page) => highlights | null`. */\nexport function usePdfPassageHighlights(\n documentId: string | undefined\n): (pageNumber: number) => ReactNode {\n const citedIds = useViewerPassageCitation()?.highlighted ?? NONE\n const cited = useMemo(() => new Set(citedIds), [citedIds])\n const active = useArbiSessionState((s) => s.viewingDocument?.passageId ?? null)\n\n const { data: parsed } = useParsedDocument(documentId, 'final', {\n enabled: cited.size > 0 || !!active,\n })\n const { processedChunks } = useProcessedChunks(parsed?.chunks, NO_FOOTNOTES)\n const boxesByPage = useMemo(\n () => passageBoxesByPage(processedChunks, { cited, active }),\n [processedChunks, cited, active]\n )\n\n // The passage being read is brought into view once, when its page first draws it: the viewer\n // opens the page, this centres the passage on it, and scrolling away is then left alone.\n const centredFor = useRef<string | null>(null)\n const activeKey = active ? `${documentId}:${active}` : null\n useEffect(() => {\n if (!activeKey) centredFor.current = null\n }, [activeKey])\n const centre = useCallback(\n (element: HTMLElement) => {\n if (!activeKey || centredFor.current === activeKey) return\n centredFor.current = activeKey\n element.scrollIntoView?.({ block: 'center', behavior: 'smooth' })\n },\n [activeKey]\n )\n\n return useCallback(\n (pageNumber: number) => {\n const boxes = boxesByPage.get(pageNumber)\n return boxes ? (\n <PdfPassageHighlights boxes={boxes} activeId={active} onActiveDrawn={centre} />\n ) : null\n },\n [boxesByPage, active, centre]\n )\n}\n","/**\n * A passage opens on the PDF, lit in the box the parser found it in (`showDocumentPlace`). When the\n * PDF cannot show it, the text view, where every passage is marked, is opened instead: the passage\n * has no box on its page (a document parsed before passages had boxes), or the PDF cannot be\n * loaded. Decided by the PDF pane, not by the PDF viewer in it, so a PDF that never loads still\n * falls back. Once per passage: going back to the PDF afterwards stays there.\n */\n\nimport { useEffect } from 'react'\nimport { useArbiSessionState, useArbiSessionStore, useParsedDocument } from '@arbidocs/react'\nimport { useProcessedChunks } from '@arbidocs/react/viewers'\nimport { passagePlaced } from './passageHighlights'\n\nconst NO_FOOTNOTES: Record<string, string> = {}\n/**\n * The passage each session last fell back for. Kept beside the session, not in the pane: the pane\n * unmounts with the PDF tab, and coming back to it must not fall back again.\n */\nconst fellBackFor = new WeakMap<object, string>()\n\n/**\n * The fallback for the session's viewing document (the one the PDF's highlights read), from the PDF\n * pane: it is there while the PDF tab is, whether its PDF has loaded, is loading or has failed.\n */\nexport function usePassageTextFallback(pdfFailed: boolean): void {\n const session = useArbiSessionStore()\n const documentId = useArbiSessionState((s) => s.viewingDocument?.id)\n const onPdf = useArbiSessionState((s) => s.documentViewer.tab === 'pdf')\n const active = useArbiSessionState((s) => s.viewingDocument?.passageId ?? null)\n // The PDF's highlights read the same query, so this costs nothing more.\n const { data: parsed } = useParsedDocument(documentId, 'final', {\n enabled: onPdf && !!active,\n })\n const { processedChunks } = useProcessedChunks(parsed?.chunks, NO_FOOTNOTES)\n useEffect(() => {\n if (!onPdf || !active || !documentId) return\n const key = `${documentId}:${active}`\n if (fellBackFor.get(session) === key) return\n const unplaced = !!parsed && !passagePlaced(processedChunks, active)\n if (!pdfFailed && !unplaced) return\n fellBackFor.set(session, key)\n session.setDocumentViewer({ tab: 'html' })\n }, [onPdf, pdfFailed, active, parsed, processedChunks, documentId, session])\n}\n","/**\n * A presentation saved before presentations were PDFs (the editable data alone), in the viewer's\n * PDF tab: it has no slides to show there, so the card says what it is and opens its slides.\n */\n\nimport { Pencil, Presentation } from 'lucide-react'\nimport { useArbiSessionStore } from '@arbidocs/react'\nimport { Button } from '@arbidocs/react/ui'\nimport { EmptyState } from '../../components/EmptyState'\nimport { presentationTitle } from '../../presentation/persistence'\nimport { editPresentation } from './requests'\n\nexport interface PresentationFileCardProps {\n documentId: string\n fileName: string\n}\n\n/** A presentation saved in the older format: opening it and saving makes it a presentation PDF. */\nexport function PresentationFileCard({ documentId, fileName }: PresentationFileCardProps) {\n const session = useArbiSessionStore()\n return (\n <div className=\"flex h-full items-center justify-center p-6\" data-testid=\"presentation-file\">\n <EmptyState\n icon={Presentation}\n title={presentationTitle(fileName)}\n description=\"A presentation saved in an earlier format, without its slides. Open it and save it to keep it as a presentation PDF; this file can then be deleted.\"\n action={\n <Button\n type=\"button\"\n onClick={() => editPresentation(session, { kind: 'open', documentId })}\n data-testid=\"presentation-file-edit\"\n >\n <Pencil className=\"size-4\" />\n Open the slides\n </Button>\n }\n />\n </div>\n )\n}\n","/**\n * The PDF (or media) body of the document viewer: loading and failure states, the image, audio and\n * video players, and the PDF with its tools — the markup layer, signature placement, a signature\n * request being prepared or signed.\n */\n\nimport { lazy, Suspense, useCallback } from 'react'\nimport { useArbiSessionState, useArbiSessionStore } from '@arbidocs/react'\nimport type {\n SignatureAppearance,\n SignatureRequest,\n useDocumentMarkup,\n} from '@arbidocs/react/document-tools'\nimport {\n AudioViewer,\n ImageViewer,\n PdfViewer as KitPdfViewer,\n VideoViewer,\n type PdfViewerProps,\n} from '@arbidocs/react/viewers'\nimport { friendlyFileType } from '@arbidocs/react/ui'\nimport { ViewerLoadError, ViewerMessage, ViewerPreviewUnavailable } from '../../files'\nimport { usePdfClipOutlines } from './pdf/usePdfClipOutlines'\nimport { usePdfPassageHighlights } from './pdf/usePdfPassageHighlights'\nimport { usePassageTextFallback } from './pdf/usePassageTextFallback'\nimport { useViewerIsDetached } from './support'\nimport { isLegacyPresentationFile } from '../../presentation/panel-id'\nimport { PresentationFileCard } from '../presentation/PresentationFileCard'\nimport { fileExtension, type ViewedDocument } from './useViewedDocument'\n\n// The markup viewer brings in pdf-lib, which nothing else needs: load it only when it is shown.\nconst AnnotatedPdfViewer = lazy(() =>\n import('../../document-tools/viewer').then((m) => ({ default: m.AnnotatedPdfViewer }))\n)\nconst SignaturePlacementViewer = lazy(() =>\n import('../../document-tools/viewer').then((m) => ({ default: m.SignaturePlacementViewer }))\n)\n// Signature requests: placing fields for signers, and a signer's guided signing.\nconst SignatureRequestEditor = lazy(() =>\n import('../../document-tools/viewer').then((m) => ({ default: m.SignatureRequestEditor }))\n)\n// Clip mode for the presentation: its own chunk (the presentation module).\nconst ClippingPdfViewer = lazy(() =>\n import('../presentation/ClippingPdfViewer').then((m) => ({ default: m.ClippingPdfViewer }))\n)\nconst ClippingMediaViewer = lazy(() =>\n import('../presentation/ClippingMediaViewer').then((m) => ({ default: m.ClippingMediaViewer }))\n)\nconst GuidedSigningViewer = lazy(() =>\n import('../../document-tools/viewer').then((m) => ({ default: m.GuidedSigningViewer }))\n)\n\n/** A signature request: the author placing fields, or a signer walked through theirs. */\nexport type SignatureFlow =\n | { kind: 'prepare'; draft?: SignatureRequest; self?: boolean }\n | { kind: 'sign'; request: SignatureRequest }\n | null\n\n/**\n * The kit PDF viewer, reporting the page read into the session state; in a detached window its\n * pages render without the opener's web fonts (canvas text in another document cannot use them).\n */\nfunction SessionPdfViewer(props: Omit<PdfViewerProps, 'onPageChange' | 'disableFontFace'>) {\n const session = useArbiSessionStore()\n const viewingId = useArbiSessionState((s) => s.viewingDocument?.id)\n const isDetached = useViewerIsDetached()\n const onPageChange = useCallback(\n (page: number) => {\n if (viewingId) session.setViewingDocument({ id: viewingId, page })\n },\n [session, viewingId]\n )\n // The passages a citation lights, over their pages, under whatever the mode draws (markup).\n const passageHighlights = usePdfPassageHighlights(viewingId)\n // The open presentation's clips of this document, where they were cut.\n const clipOutlines = usePdfClipOutlines(viewingId)\n const { renderPageOverlay: modeOverlay } = props\n const renderPageOverlay = useCallback<NonNullable<PdfViewerProps['renderPageOverlay']>>(\n (page) => (\n <>\n {passageHighlights(page.pageNumber)}\n {clipOutlines(page.pageNumber)}\n {modeOverlay?.(page)}\n </>\n ),\n [passageHighlights, clipOutlines, modeOverlay]\n )\n return (\n <KitPdfViewer\n {...props}\n renderPageOverlay={renderPageOverlay}\n onPageChange={onPageChange}\n disableFontFace={!!isDetached}\n />\n )\n}\n\nexport interface ViewerPdfPaneProps {\n documentId: string\n doc: ViewedDocument\n pdfBlob: Blob | null\n isPdfLoading: boolean\n pdfError: unknown\n onDownload: () => void\n viewerProps: {\n currentPage: number | undefined\n onLoadSuccess: (pages: number) => void\n scrollTrigger: number\n zoom: number\n onZoomChange: (zoom: number) => void\n }\n signatureFlow: SignatureFlow\n onSignatureFlow: (flow: SignatureFlow) => void\n currentUserId: string | undefined\n placingSignature: boolean\n onPlacingDone: (appearance?: SignatureAppearance) => void\n annotating: boolean\n /** Clip mode: dragging over a page adds that area to the presentation. */\n clipping?: boolean\n markup: ReturnType<typeof useDocumentMarkup>\n pdfSnapshotNumber: number | undefined\n isSigned: boolean\n /** One's saved signature or initials to place as a picture stamp (PDF tab › My signature). */\n placeMark?: { image: string; label: string; key: number } | null\n}\n\nexport function ViewerPdfPane({\n documentId,\n doc,\n pdfBlob,\n isPdfLoading,\n pdfError,\n onDownload,\n viewerProps,\n signatureFlow,\n onSignatureFlow,\n currentUserId,\n placingSignature,\n onPlacingDone,\n annotating,\n clipping = false,\n markup,\n pdfSnapshotNumber,\n isSigned,\n placeMark = null,\n}: ViewerPdfPaneProps) {\n const { documentData, isDownloadOnly, isVideo, isAudio, isImage, isDocx } = doc\n // A passage the PDF cannot light (no box on its page, or no PDF) opens on the text view.\n usePassageTextFallback(!!pdfError)\n const showMarkup = markup.hasMarkup && !markup.showOriginal\n\n // A presentation saved before it was a PDF (its data alone): what it is, and Edit presentation.\n if (isLegacyPresentationFile(documentData?.file_name)) {\n return <PresentationFileCard documentId={documentId} fileName={documentData?.file_name ?? ''} />\n }\n\n // Files that cannot be previewed in the browser: the download, at once.\n if (isDownloadOnly) {\n return (\n <ViewerPreviewUnavailable\n extension={fileExtension(documentData?.file_name)}\n onDownload={onDownload}\n />\n )\n }\n\n // Text files are rendered to a PDF too, so name what the user opened, not the rendering.\n const loadingLabel = isVideo\n ? 'Loading video...'\n : isAudio\n ? 'Loading audio...'\n : isImage\n ? 'Loading image...'\n : !documentData\n ? 'Loading document...'\n : friendlyFileType(documentData.file_type, documentData.file_name) === 'Text'\n ? 'Loading text...'\n : 'Loading PDF...'\n const errorLabel = isVideo\n ? 'Failed to load video'\n : isAudio\n ? 'Failed to load audio'\n : isImage\n ? 'Failed to load image'\n : 'Failed to load PDF'\n\n if (\n isDocx &&\n !pdfSnapshotNumber &&\n documentData &&\n !['completed', 'low-content', 'failed'].includes(documentData.status || '')\n ) {\n return (\n <ViewerMessage>\n PDF and search indexing are processing. Open the DOCX tab to edit now.\n </ViewerMessage>\n )\n }\n if (isDocx && !pdfSnapshotNumber && documentData?.status === 'failed') {\n return (\n <ViewerMessage>\n PDF conversion failed. Open the Word editor or download the document.\n </ViewerMessage>\n )\n }\n if (isPdfLoading) return <ViewerMessage>{loadingLabel}</ViewerMessage>\n if (pdfError) {\n return (\n <ViewerLoadError\n message={\n isVideo || isAudio || isImage\n ? `${errorLabel} — download it instead.`\n : \"Couldn't display the PDF — download it instead.\"\n }\n onDownload={onDownload}\n />\n )\n }\n // Nothing is fetched yet: the PDF is read once the document record has loaded, so the viewer\n // would otherwise sit empty for that first stretch.\n if (!pdfBlob) return <ViewerMessage>{loadingLabel}</ViewerMessage>\n\n // Clip mode on an image or a video: drag over it for the presentation.\n if (clipping && (isImage || isVideo)) {\n return (\n <Suspense fallback={<ViewerMessage>Loading…</ViewerMessage>}>\n <ClippingMediaViewer\n file={pdfBlob}\n kind={isVideo ? 'video' : 'image'}\n documentId={documentId}\n fileName={documentData?.file_name || (isVideo ? 'Video' : 'Image')}\n />\n </Suspense>\n )\n }\n if (isVideo) return <VideoViewer blob={pdfBlob} title={documentData?.file_name || 'Video'} />\n if (isAudio) return <AudioViewer blob={pdfBlob} title={documentData?.file_name || 'Audio'} />\n if (isImage) {\n return <ImageViewer blob={pdfBlob} alt={documentData?.file_name || 'Document image'} />\n }\n if (signatureFlow?.kind === 'prepare') {\n return (\n <Suspense fallback={<ViewerMessage>Loading…</ViewerMessage>}>\n <SignatureRequestEditor\n {...viewerProps}\n file={pdfBlob}\n documentId={documentId}\n version={pdfSnapshotNumber ?? documentData?.current_version ?? undefined}\n selfSigning={signatureFlow.self}\n draft={signatureFlow.draft}\n shareFile={!signatureFlow.draft}\n viewer={SessionPdfViewer}\n onCancel={() => onSignatureFlow(null)}\n onSaved={() => onSignatureFlow(null)}\n />\n </Suspense>\n )\n }\n if (signatureFlow?.kind === 'sign' && currentUserId) {\n const { currentPage: _page, scrollTrigger: _trigger, ...guidedProps } = viewerProps\n return (\n <Suspense fallback={<ViewerMessage>Loading…</ViewerMessage>}>\n <GuidedSigningViewer\n {...guidedProps}\n file={pdfBlob}\n request={signatureFlow.request}\n signer={currentUserId}\n viewer={SessionPdfViewer}\n onClose={() => onSignatureFlow(null)}\n onSigned={() => onSignatureFlow(null)}\n />\n </Suspense>\n )\n }\n if (placingSignature) {\n return (\n <Suspense fallback={<ViewerMessage>Loading…</ViewerMessage>}>\n <SignaturePlacementViewer\n {...viewerProps}\n file={pdfBlob}\n documentId={documentId}\n viewer={SessionPdfViewer}\n onCancel={() => onPlacingDone()}\n onContinue={(appearance) => onPlacingDone(appearance)}\n />\n </Suspense>\n )\n }\n if (clipping) {\n return (\n <Suspense fallback={<ViewerMessage>Loading…</ViewerMessage>}>\n <ClippingPdfViewer\n {...viewerProps}\n file={pdfBlob}\n documentId={documentId}\n version={pdfSnapshotNumber}\n fileName={documentData?.file_name || 'Document'}\n hasMarkup={markup.hasMarkup}\n viewer={SessionPdfViewer}\n />\n </Suspense>\n )\n }\n // Annotate mode, or the markup as the reading view: one viewer, so leaving annotate mode keeps\n // (and saves) what was just drawn.\n if (annotating || showMarkup) {\n return (\n <Suspense\n fallback={\n <ViewerMessage>\n {annotating ? 'Loading annotation tools…' : 'Loading markup…'}\n </ViewerMessage>\n }\n >\n <AnnotatedPdfViewer\n key={`${documentId}@${pdfSnapshotNumber ?? 'current'}`}\n {...viewerProps}\n file={pdfBlob}\n documentId={documentId}\n version={pdfSnapshotNumber}\n editing={annotating}\n onMarkupChange={markup.onMarkupChange}\n fileName={documentData?.file_name}\n shared={documentData?.shared ?? false}\n folder={documentData?.folder}\n workspaceId={documentData?.workspace_ext_id}\n viewer={SessionPdfViewer}\n signed={isSigned}\n placeStamp={placeMark}\n />\n </Suspense>\n )\n }\n return <SessionPdfViewer {...viewerProps} file={pdfBlob} />\n}\n","import { lazy } from 'react'\n\n/** A presentation's slides tab: its own chunk, loaded when a presentation shows. */\nexport const SlidesTab = lazy(() =>\n import('../presentation/ConnectedSlidesTab').then((m) => ({ default: m.ConnectedSlidesTab }))\n)\n","/**\n * The whole document viewer on the signed-in session: a document (or one of its versions, read\n * only) as its PDF, its text, the Word editor, a sheet, an image, a recording or a live artifact;\n * its versions and comparisons; markup, signing and signature requests; sharing, Email, Translate\n * and Finalise. Runs under any host (`useConnectedWorkspace`): the open document, tab and comparison\n * are the session state's, navigation the `BlocksEnvironment`'s, and what only the host knows comes\n * as its host config's `viewer`.\n */\n\nimport { lazy, Suspense, useCallback, useEffect, useRef, useState, type ReactNode } from 'react'\nimport {\n ChevronDown,\n Languages,\n Link2,\n Mail,\n MessageSquare,\n MessageSquarePlus,\n PenLine,\n Signature,\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 { ViewerMoreMenu } from './ViewerMoreMenu'\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-…@v{n}` (a citation, a \"made from v2\" link): an\n * earlier version opens read-only. Default: the session state's viewing document.\n */\n documentId?: string\n /** Controls at the right end of the header (a panel's dock / pop-out switcher). */\n headerActions?: ReactNode\n /** Where html/react artifacts load their sandbox runtime from. */\n artifactRuntimeUrl?: string\n}\n\nexport function ConnectedDocumentViewer(props: ConnectedDocumentViewerProps) {\n const viewing = useArbiSessionState((s) => s.viewingDocument?.id)\n const openedId = props.documentId ?? viewing\n if (!openedId) return null\n // A viewer that throws (a PDF the browser cannot render, say) shows the error here, in the\n // viewer's place, instead of unmounting the whole app.\n return (\n <ErrorBoundary\n resetKey={openedId}\n labels={{ title: \"This document couldn't be displayed\" }}\n testId=\"document-viewer-error\"\n >\n <ConnectedDocumentToolsProvider>\n <DocumentViewerContent {...props} openedId={openedId} />\n </ConnectedDocumentToolsProvider>\n </ErrorBoundary>\n )\n}\n\nfunction DocumentViewerContent({\n openedId,\n headerActions,\n artifactRuntimeUrl = '/artifact-runtime/',\n}: ConnectedDocumentViewerProps & { openedId: string }) {\n const arbi = useArbi()\n const session = useArbiSessionStore()\n const support = useDocumentViewerSupport()\n const formatDate = support.formatDate ?? fmtDate\n const tools = useDocumentTools()\n const { openConversation, openNewConversation, notify } = useBlocksEnvironment()\n const { userId: currentUserId } = useConnectedWorkspace()\n // A document keeps one id for its whole life; its versions are inside it.\n const documentId = parseVersionRef(openedId).docId\n const [totalPages, setTotalPages] = useState<number>(0)\n const [isCompact, setIsCompact] = useState(false)\n // Zoom of the PDF (canvas scale) / text, as a multiplier of fit width; pinch, double-tap and the\n // zoom button all drive it. The text view's size is a reading preference for every document.\n const [pdfZoom, setPdfZoom] = useState(1)\n const {\n tab: zoomTab,\n textScale,\n compareId: compareDocumentId,\n } = useArbiSessionState((s) => s.documentViewer)\n const zoom = zoomTab === 'html' ? textScale : pdfZoom\n const setZoom = useCallback(\n (next: number | ((z: number) => number)) => {\n const value = typeof next === 'function' ? next(zoom) : next\n if (zoomTab === 'html') session.setDocumentViewer({ textScale: value })\n else setPdfZoom(value)\n },\n [zoomTab, session, zoom]\n )\n const [scrollTrigger, setScrollTrigger] = useState(0) // Incremented to scroll the viewers\n const containerRef = useRef<HTMLDivElement>(null)\n\n const viewingDocumentPage = useArbiSessionState((s) => s.viewingDocument?.page ?? null)\n const setViewingDocumentPage = (page: number) =>\n session.setViewingDocument({ id: openedId, page })\n const setViewingDocumentId = (id: string) => session.setViewingDocument({ id })\n const setActiveTab = (tab: Parameters<typeof session.setDocumentViewer>[0]['tab']) =>\n session.setDocumentViewer({ tab })\n const setCompareDocumentId = (id: string | null) => session.setDocumentViewer({ compareId: id })\n const { data: conversations } = useConnectedConversations()\n\n // An earlier version opened read-only (`doc-…@v{n}`) from the Versions tab, a citation or a\n // \"made from\" link. Word documents show it in the Word editor, artifacts in theirs, everything\n // else as its PDF. The version on screen is the session's viewing id, not local state: the\n // viewer remounts when its panel moves to a new window, and the version must come along.\n const snapshotRef = parseVersionRef(openedId).version ? openedId : null\n // Every version of the document, oldest first. Every version of an artifact shares one name, so\n // both sides of a comparison get the timeline's \"v1/v2/v3\" label.\n const { versions, translations } = useViewerVersions(documentId)\n const currentVersionId = versions.find((v) => v.isCurrent)?.id ?? documentId\n // Opening the current version is the live document itself, not a read-only copy of it.\n const snapshotDocumentId = snapshotRef && snapshotRef !== currentVersionId ? snapshotRef : null\n const doc = useViewedDocument(documentId)\n const setSnapshotDocumentId = (ref: string | null) => setViewingDocumentId(ref ?? documentId)\n // Drafting mode: a thread bound to the open document (or the one it was made in) drafts in it,\n // also while an earlier version of it is on screen; a turn sent then brings the live document\n // back, where the assistant's edits appear. Being open binds no chat to it.\n useRegisterOpenDocument({\n documentId: doc.savedDocumentId,\n shownId: openedId,\n showLive: () => setViewingDocumentId(documentId),\n workspaceId: doc.workspaceId,\n conversationId: doc.documentData?.conversation_ext_id ?? null,\n })\n const {\n documentData,\n streamingDoc,\n isStreaming,\n draftDoc,\n 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 — 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(clip.layer)\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 <FileShareDialog\n open={sharingFile}\n onOpenChange={setSharingFile}\n documentId={documentId}\n version={pdfSnapshotNumber ?? documentData.current_version ?? 1}\n />\n </>\n )}\n {/* Chat about this document: the thread bound to it (its questions edit it), the latest one\n or a new one. Only such a thread drafts in a document: one merely open binds no chat. */}\n {doc.savedDocumentId && !snapshotDocumentId && (\n <Button\n type=\"button\"\n variant=\"outline\"\n size={isCompact ? 'icon' : 'sm'}\n onClick={chatAboutDocument}\n title=\"Chat about this document: a thread that works in it, with edits as tracked changes\"\n aria-label=\"Chat about this document\"\n data-testid=\"document-chat-about\"\n className=\"pointer-coarse:min-h-11\"\n >\n <MessageSquarePlus className=\"size-4\" />\n {!isCompact && <span className=\"ml-1\">Chat</span>}\n </Button>\n )}\n {/* Share always asks first (the host's share dialog), so a click never changes who can see\n the file by surprise. */}\n {documentId && doc.workspaceId && (\n <ShareControl\n state={documentData?.shared ? 'shared' : 'private'}\n onToggle={share}\n disabled={!canChangeVisibility(documentData, currentUserId)}\n disabledTooltip=\"Only the owner can change visibility\"\n tooltip={\n documentData?.shared\n ? 'Shared with the workspace — click to share with specific people'\n : 'Share with the workspace, then optionally notify specific people by email'\n }\n variant=\"outline\"\n compact={isCompact}\n showState={!isCompact}\n labels={{\n shared: getEntityLabel('WORKSPACE'),\n private: 'Only you',\n mixed: 'Partly shared',\n }}\n testId=\"share-document-button\"\n stateTestId=\"document-title-shared-indicator\"\n />\n )}\n {/* 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 <Signature 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 <ViewerMoreMenu\n compact={isCompact}\n items={[\n ...(documentId && documentData && !isDraft && !isStreaming\n ? [\n {\n key: 'share-file',\n label: 'Share file…',\n icon: <Link2 className=\"size-4\" />,\n description: 'Send a link to this version of the file',\n onSelect: () => setSharingFile(true),\n testId: 'share-file-button',\n },\n ]\n : []),\n ...(tools.emailDocument && !isDraft && !isStreaming && documentData?.file_name\n ? [\n {\n key: 'email',\n label: 'Email…',\n icon: <Mail className=\"size-4\" />,\n description: 'Email this document (attached)',\n onSelect: () => tools.emailDocument?.(shownRef),\n testId: 'email-document-button',\n },\n ]\n : []),\n ...(support.translate &&\n !isDraft &&\n !isStreaming &&\n !liveKind &&\n !isImage &&\n documentData?.file_name\n ? [\n {\n key: 'translate',\n label: 'Translate…',\n icon: <Languages className=\"size-4\" />,\n description: 'A new editable document, original and translation side by side',\n onSelect: () => support.translate!(shownRef),\n testId: 'translate-document-button',\n },\n ]\n : []),\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…</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…</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…</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…</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…</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"]}
|