@arbidocs/blocks 0.5.119 → 0.5.121
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/ClippingMediaViewer-B6WG7Q64.cjs +156 -0
- package/dist/ClippingMediaViewer-B6WG7Q64.cjs.map +1 -0
- package/dist/ClippingPdfViewer-6GCVTV3V.cjs +79 -0
- package/dist/ClippingPdfViewer-6GCVTV3V.cjs.map +1 -0
- package/dist/{ConnectedCallDock-WER7R222.cjs → ConnectedCallDock-DC5V5OUJ.cjs} +25 -23
- package/dist/ConnectedCallDock-DC5V5OUJ.cjs.map +1 -0
- package/dist/{ConnectedCallRoom-T7OBQTYP.cjs → ConnectedCallRoom-FQLXWTFB.cjs} +18 -16
- package/dist/{ConnectedCallRoom-T7OBQTYP.cjs.map → ConnectedCallRoom-FQLXWTFB.cjs.map} +1 -1
- package/dist/{ConnectedNativeDocxComparison-546ILGLW.cjs → ConnectedNativeDocxComparison-4Q5S7VLD.cjs} +17 -17
- package/dist/{ConnectedNativeDocxComparison-546ILGLW.cjs.map → ConnectedNativeDocxComparison-4Q5S7VLD.cjs.map} +1 -1
- package/dist/ConnectedPresentation-4HLDZDWV.cjs +183 -0
- package/dist/ConnectedPresentation-4HLDZDWV.cjs.map +1 -0
- package/dist/{ConnectedProductionSetDialog-LHB4VQWC.cjs → ConnectedProductionSetDialog-4EAY6KAZ.cjs} +3 -3
- package/dist/{ConnectedProductionSetDialog-LHB4VQWC.cjs.map → ConnectedProductionSetDialog-4EAY6KAZ.cjs.map} +1 -1
- package/dist/ConnectedSlidesTab-7QDE2CZD.cjs +234 -0
- package/dist/ConnectedSlidesTab-7QDE2CZD.cjs.map +1 -0
- package/dist/{ConnectedStreamedWordArtifact-S2ZFZLZQ.cjs → ConnectedStreamedWordArtifact-FFOQJBOI.cjs} +17 -17
- package/dist/{ConnectedStreamedWordArtifact-S2ZFZLZQ.cjs.map → ConnectedStreamedWordArtifact-FFOQJBOI.cjs.map} +1 -1
- package/dist/{DocumentReviewCard-ZSBZBGFK.cjs → DocumentReviewCard-SNWVEZ7S.cjs} +19 -18
- package/dist/DocumentReviewCard-SNWVEZ7S.cjs.map +1 -0
- package/dist/{FilesViewerDialog-6UKR5WEF.cjs → FilesViewerDialog-IZI63FOV.cjs} +54 -47
- package/dist/FilesViewerDialog-IZI63FOV.cjs.map +1 -0
- package/dist/{GridViewImpl-ZMJJWTOM.cjs → GridViewImpl-LTYET77Q.cjs} +3 -3
- package/dist/GridViewImpl-LTYET77Q.cjs.map +1 -0
- package/dist/{WorkspaceTableView-J3C6VH4T.cjs → WorkspaceTableView-TEIRB6VJ.cjs} +11 -10
- package/dist/WorkspaceTableView-TEIRB6VJ.cjs.map +1 -0
- package/dist/agents/index.cjs +297 -297
- package/dist/agents/tasks/ConversationListView.js +10 -2
- package/dist/agents/tasks/ConversationListView.js.map +2 -2
- package/dist/agents/tasks/TaskTable.js +5 -4
- package/dist/agents/tasks/TaskTable.js.map +2 -2
- package/dist/agents/tasks/WorkflowsTable.js +4 -5
- package/dist/agents/tasks/WorkflowsTable.js.map +2 -2
- package/dist/agents/tasks/taskColumns.js +1 -1
- package/dist/agents/tasks/taskColumns.js.map +1 -1
- package/dist/agents/tasks/taskTableLabels.js +1 -1
- package/dist/agents/tasks/taskTableLabels.js.map +1 -1
- package/dist/agents/tasks/workflowTableLabels.js +1 -1
- package/dist/agents/tasks/workflowTableLabels.js.map +1 -1
- package/dist/{ai-IM4A23YT.cjs → ai-KBYNRNZ6.cjs} +28 -26
- package/dist/ai-KBYNRNZ6.cjs.map +1 -0
- package/dist/calls/connected/CallControls.d.ts +2 -0
- package/dist/calls/connected/CallControls.js +71 -9
- package/dist/calls/connected/CallControls.js.map +2 -2
- package/dist/calls/connected/ShareDocumentDialog.d.ts +14 -0
- package/dist/calls/connected/ShareDocumentDialog.js +77 -0
- package/dist/calls/connected/ShareDocumentDialog.js.map +7 -0
- package/dist/calls/index.cjs +121 -121
- package/dist/chat/index.cjs +9 -8
- package/dist/{chunk-T23UTIRI.cjs → chunk-2PZT3J34.cjs} +6 -6
- package/dist/{chunk-T23UTIRI.cjs.map → chunk-2PZT3J34.cjs.map} +1 -1
- package/dist/{chunk-SGYSDABK.cjs → chunk-2W5E62EY.cjs} +6 -6
- package/dist/{chunk-SGYSDABK.cjs.map → chunk-2W5E62EY.cjs.map} +1 -1
- package/dist/{chunk-TDO5UWXF.cjs → chunk-3SCNXNHI.cjs} +5 -5
- package/dist/{chunk-TDO5UWXF.cjs.map → chunk-3SCNXNHI.cjs.map} +1 -1
- package/dist/{chunk-KTQOGT2L.cjs → chunk-474GPLCM.cjs} +7 -7
- package/dist/{chunk-KTQOGT2L.cjs.map → chunk-474GPLCM.cjs.map} +1 -1
- package/dist/{chunk-TP5PGWIO.cjs → chunk-4IOYQLKG.cjs} +3 -3
- package/dist/{chunk-TP5PGWIO.cjs.map → chunk-4IOYQLKG.cjs.map} +1 -1
- package/dist/{chunk-NY3YUCOW.cjs → chunk-4NPCDS2X.cjs} +3 -3
- package/dist/{chunk-NY3YUCOW.cjs.map → chunk-4NPCDS2X.cjs.map} +1 -1
- package/dist/{chunk-CPG7II4E.cjs → chunk-4RBQ44RY.cjs} +28 -28
- package/dist/chunk-4RBQ44RY.cjs.map +1 -0
- package/dist/{chunk-BQ5RIWWT.cjs → chunk-4VZZWYEC.cjs} +3 -3
- package/dist/{chunk-BQ5RIWWT.cjs.map → chunk-4VZZWYEC.cjs.map} +1 -1
- package/dist/{chunk-Y24V6HPR.cjs → chunk-52KGMAO5.cjs} +15 -15
- package/dist/{chunk-Y24V6HPR.cjs.map → chunk-52KGMAO5.cjs.map} +1 -1
- package/dist/{chunk-HB2O4THB.cjs → chunk-5534FYXP.cjs} +4 -4
- package/dist/{chunk-HB2O4THB.cjs.map → chunk-5534FYXP.cjs.map} +1 -1
- package/dist/chunk-5GCCUXMT.cjs +63 -0
- package/dist/chunk-5GCCUXMT.cjs.map +1 -0
- package/dist/chunk-5LTIZ44D.cjs +95 -0
- package/dist/chunk-5LTIZ44D.cjs.map +1 -0
- package/dist/{chunk-YGXOKB5Z.cjs → chunk-734NPQNR.cjs} +4 -4
- package/dist/{chunk-YGXOKB5Z.cjs.map → chunk-734NPQNR.cjs.map} +1 -1
- package/dist/{chunk-SB4M3ITT.cjs → chunk-7VUJGHMY.cjs} +444 -100
- package/dist/chunk-7VUJGHMY.cjs.map +1 -0
- package/dist/chunk-AFQTQC7A.cjs +35 -0
- package/dist/chunk-AFQTQC7A.cjs.map +1 -0
- package/dist/{chunk-XKVPSOKP.cjs → chunk-AY6EZSZB.cjs} +4 -4
- package/dist/{chunk-XKVPSOKP.cjs.map → chunk-AY6EZSZB.cjs.map} +1 -1
- package/dist/{chunk-TT4IF52H.cjs → chunk-BVAT4EVC.cjs} +40 -41
- package/dist/chunk-BVAT4EVC.cjs.map +1 -0
- package/dist/{chunk-VGCTYTEW.cjs → chunk-C2OICDMI.cjs} +10 -10
- package/dist/{chunk-VGCTYTEW.cjs.map → chunk-C2OICDMI.cjs.map} +1 -1
- package/dist/{chunk-CPR6EHG7.cjs → chunk-DR2AH7JL.cjs} +179 -55
- package/dist/chunk-DR2AH7JL.cjs.map +1 -0
- package/dist/{chunk-NJCK6V6U.cjs → chunk-EATIFPKP.cjs} +4 -60
- package/dist/chunk-EATIFPKP.cjs.map +1 -0
- package/dist/{chunk-B3LZITVF.cjs → chunk-EHP6OH5D.cjs} +11 -451
- package/dist/chunk-EHP6OH5D.cjs.map +1 -0
- package/dist/{chunk-DDIW4HLU.cjs → chunk-ENGL7P3I.cjs} +46 -37
- package/dist/chunk-ENGL7P3I.cjs.map +1 -0
- package/dist/{chunk-QHOHDNBU.cjs → chunk-FKFQCK3C.cjs} +4 -4
- package/dist/{chunk-QHOHDNBU.cjs.map → chunk-FKFQCK3C.cjs.map} +1 -1
- package/dist/{chunk-6UTKM5AB.cjs → chunk-GKVE5JGB.cjs} +76 -76
- package/dist/chunk-GKVE5JGB.cjs.map +1 -0
- package/dist/{chunk-B2HNNG25.cjs → chunk-GPX5VC57.cjs} +50 -50
- package/dist/{chunk-B2HNNG25.cjs.map → chunk-GPX5VC57.cjs.map} +1 -1
- package/dist/{chunk-WAV762GP.cjs → chunk-GQXPNIRE.cjs} +6 -6
- package/dist/{chunk-WAV762GP.cjs.map → chunk-GQXPNIRE.cjs.map} +1 -1
- package/dist/chunk-GX2EBMJW.cjs +133 -0
- package/dist/chunk-GX2EBMJW.cjs.map +1 -0
- package/dist/{chunk-7OPOPYV6.cjs → chunk-H5OLHP2U.cjs} +3 -3
- package/dist/{chunk-7OPOPYV6.cjs.map → chunk-H5OLHP2U.cjs.map} +1 -1
- package/dist/chunk-HYUKPHCT.cjs +66 -0
- package/dist/chunk-HYUKPHCT.cjs.map +1 -0
- package/dist/{chunk-NNUK5ZM7.cjs → chunk-JQLWKNJO.cjs} +29 -27
- package/dist/chunk-JQLWKNJO.cjs.map +1 -0
- package/dist/{chunk-OEREKAAP.cjs → chunk-JZEYHDWJ.cjs} +75 -75
- package/dist/{chunk-OEREKAAP.cjs.map → chunk-JZEYHDWJ.cjs.map} +1 -1
- package/dist/{chunk-PGJYD67F.cjs → chunk-KNGZZC4O.cjs} +7 -6
- package/dist/chunk-KNGZZC4O.cjs.map +1 -0
- package/dist/{chunk-NIE3N6OM.cjs → chunk-KP5AITQ4.cjs} +10 -10
- package/dist/{chunk-NIE3N6OM.cjs.map → chunk-KP5AITQ4.cjs.map} +1 -1
- package/dist/{chunk-YYPZOEED.cjs → chunk-LHWOKOMP.cjs} +23 -2
- package/dist/chunk-LHWOKOMP.cjs.map +1 -0
- package/dist/{chunk-57NHXEU2.cjs → chunk-MXBXZXXQ.cjs} +5 -5
- package/dist/{chunk-57NHXEU2.cjs.map → chunk-MXBXZXXQ.cjs.map} +1 -1
- package/dist/{chunk-WXUU3COI.cjs → chunk-MZ2KZXNU.cjs} +3 -3
- package/dist/{chunk-WXUU3COI.cjs.map → chunk-MZ2KZXNU.cjs.map} +1 -1
- package/dist/chunk-NAJN32MF.cjs +154 -0
- package/dist/chunk-NAJN32MF.cjs.map +1 -0
- package/dist/{chunk-557MJ4IH.cjs → chunk-NLOETJCB.cjs} +17 -154
- package/dist/chunk-NLOETJCB.cjs.map +1 -0
- package/dist/{chunk-4XJEHKVZ.cjs → chunk-PIYYBPHH.cjs} +4 -4
- package/dist/{chunk-4XJEHKVZ.cjs.map → chunk-PIYYBPHH.cjs.map} +1 -1
- package/dist/chunk-Q3XJUXID.cjs +4774 -0
- package/dist/chunk-Q3XJUXID.cjs.map +1 -0
- package/dist/{chunk-325GVZE6.cjs → chunk-Q6DQGGP4.cjs} +3 -3
- package/dist/{chunk-325GVZE6.cjs.map → chunk-Q6DQGGP4.cjs.map} +1 -1
- package/dist/chunk-QFXILJMJ.cjs +458 -0
- package/dist/chunk-QFXILJMJ.cjs.map +1 -0
- package/dist/{chunk-R7CJEIA5.cjs → chunk-RYVZDFVO.cjs} +8 -9
- package/dist/chunk-RYVZDFVO.cjs.map +1 -0
- package/dist/{chunk-VLCY46K6.cjs → chunk-TG2GM7WJ.cjs} +4 -3
- package/dist/chunk-TG2GM7WJ.cjs.map +1 -0
- package/dist/{chunk-EOG6OT5I.cjs → chunk-TXP2N3DC.cjs} +4 -4
- package/dist/{chunk-EOG6OT5I.cjs.map → chunk-TXP2N3DC.cjs.map} +1 -1
- package/dist/{chunk-KXIRVKCJ.cjs → chunk-UUENH4BJ.cjs} +3 -3
- package/dist/{chunk-KXIRVKCJ.cjs.map → chunk-UUENH4BJ.cjs.map} +1 -1
- package/dist/chunk-VJ5ZLRBD.cjs +27 -0
- package/dist/chunk-VJ5ZLRBD.cjs.map +1 -0
- package/dist/{chunk-P77YTTJ3.cjs → chunk-W6B3RYTX.cjs} +4 -4
- package/dist/{chunk-P77YTTJ3.cjs.map → chunk-W6B3RYTX.cjs.map} +1 -1
- package/dist/chunk-WOOOMTTA.cjs +19 -0
- package/dist/chunk-WOOOMTTA.cjs.map +1 -0
- package/dist/{chunk-ZPPMAL5P.cjs → chunk-WQMR3O2D.cjs} +6 -10
- package/dist/chunk-WQMR3O2D.cjs.map +1 -0
- package/dist/{chunk-CJYWHUZR.cjs → chunk-XCKHOXRP.cjs} +4 -4
- package/dist/{chunk-CJYWHUZR.cjs.map → chunk-XCKHOXRP.cjs.map} +1 -1
- package/dist/{chunk-6WMMZLEV.cjs → chunk-XJEXFEWG.cjs} +2 -27
- package/dist/chunk-XJEXFEWG.cjs.map +1 -0
- package/dist/chunk-XK4TVJKD.cjs +73 -0
- package/dist/chunk-XK4TVJKD.cjs.map +1 -0
- package/dist/chunk-XTR26TNE.cjs +1358 -0
- package/dist/chunk-XTR26TNE.cjs.map +1 -0
- package/dist/{chunk-E7TE2WVT.cjs → chunk-ZVEW3JBT.cjs} +3 -3
- package/dist/{chunk-E7TE2WVT.cjs.map → chunk-ZVEW3JBT.cjs.map} +1 -1
- package/dist/collaboration/index.cjs +73 -73
- package/dist/collaboration/sharing/ShareControl.js +10 -2
- package/dist/collaboration/sharing/ShareControl.js.map +2 -2
- package/dist/components/SharedCell.d.ts +2 -4
- package/dist/components/SharedCell.js +4 -8
- package/dist/components/SharedCell.js.map +2 -2
- package/dist/components/ZoomSlider.d.ts +25 -0
- package/dist/components/ZoomSlider.js +59 -0
- package/dist/components/ZoomSlider.js.map +7 -0
- package/dist/connect/docx.cjs +20 -20
- package/dist/connect/index.cjs +1210 -1264
- package/dist/connect/index.cjs.map +1 -1
- package/dist/connect/viewer.cjs +42 -36
- package/dist/connection/ai.d.ts +1 -1
- package/dist/connection/facts/factPageColumns.js +3 -9
- package/dist/connection/facts/factPageColumns.js.map +2 -2
- package/dist/connection/files/ConnectedNewFileMenu.d.ts +2 -1
- package/dist/connection/files/ConnectedNewFileMenu.js +9 -3
- package/dist/connection/files/ConnectedNewFileMenu.js.map +2 -2
- package/dist/connection/files/explorer/ConnectedFilesExplorer.js +1 -1
- package/dist/connection/files/explorer/ConnectedFilesExplorer.js.map +2 -2
- package/dist/connection/files/explorer/FileTiles.js +1 -1
- package/dist/connection/files/explorer/FileTiles.js.map +2 -2
- package/dist/connection/files/fields/documentField.js +1 -1
- package/dist/connection/files/fields/documentField.js.map +2 -2
- package/dist/connection/files/grid/cells.js +1 -3
- package/dist/connection/files/grid/cells.js.map +2 -2
- package/dist/connection/files/grid/documentColumns.js +4 -3
- package/dist/connection/files/grid/documentColumns.js.map +2 -2
- package/dist/connection/files/page/DocumentsFilterBarActions.js +17 -28
- package/dist/connection/files/page/DocumentsFilterBarActions.js.map +2 -2
- package/dist/connection/mail/useMailboxDefaults.js +1 -1
- package/dist/connection/mail/useMailboxDefaults.js.map +2 -2
- package/dist/connection/panels/useSessionPanelMode.js +3 -2
- package/dist/connection/panels/useSessionPanelMode.js.map +2 -2
- package/dist/connection/presentation/ClippingMediaViewer.d.ts +12 -0
- package/dist/connection/presentation/ClippingMediaViewer.js +153 -0
- package/dist/connection/presentation/ClippingMediaViewer.js.map +7 -0
- package/dist/connection/presentation/ClippingPdfViewer.d.ts +22 -0
- package/dist/connection/presentation/ClippingPdfViewer.js +75 -0
- package/dist/connection/presentation/ClippingPdfViewer.js.map +7 -0
- package/dist/connection/presentation/ConnectedPresentation.d.ts +12 -0
- package/dist/connection/presentation/ConnectedPresentation.js +100 -0
- package/dist/connection/presentation/ConnectedPresentation.js.map +7 -0
- package/dist/connection/presentation/ConnectedSlidesTab.d.ts +20 -0
- package/dist/connection/presentation/ConnectedSlidesTab.js +220 -0
- package/dist/connection/presentation/ConnectedSlidesTab.js.map +7 -0
- package/dist/connection/presentation/CropClipDialog.d.ts +11 -0
- package/dist/connection/presentation/CropClipDialog.js +86 -0
- package/dist/connection/presentation/CropClipDialog.js.map +7 -0
- package/dist/connection/presentation/GenerateTile.d.ts +4 -0
- package/dist/connection/presentation/GenerateTile.js +24 -0
- package/dist/connection/presentation/GenerateTile.js.map +7 -0
- package/dist/connection/presentation/LabelColumnMenu.d.ts +8 -0
- package/dist/connection/presentation/LabelColumnMenu.js +38 -0
- package/dist/connection/presentation/LabelColumnMenu.js.map +7 -0
- package/dist/connection/presentation/PresentationDialogs.d.ts +39 -0
- package/dist/connection/presentation/PresentationDialogs.js +295 -0
- package/dist/connection/presentation/PresentationDialogs.js.map +7 -0
- package/dist/connection/presentation/PresentationFileCard.d.ts +10 -0
- package/dist/connection/presentation/PresentationFileCard.js +35 -0
- package/dist/connection/presentation/PresentationFileCard.js.map +7 -0
- package/dist/connection/presentation/PresentationPill.d.ts +8 -0
- package/dist/connection/presentation/PresentationPill.js +44 -0
- package/dist/connection/presentation/PresentationPill.js.map +7 -0
- package/dist/connection/presentation/PresentationSlot.d.ts +7 -0
- package/dist/connection/presentation/PresentationSlot.js +35 -0
- package/dist/connection/presentation/PresentationSlot.js.map +7 -0
- package/dist/connection/presentation/requests.d.ts +16 -0
- package/dist/connection/presentation/requests.js +20 -0
- package/dist/connection/presentation/requests.js.map +7 -0
- package/dist/connection/presentation/useImageGeneration.d.ts +11 -0
- package/dist/connection/presentation/useImageGeneration.js +66 -0
- package/dist/connection/presentation/useImageGeneration.js.map +7 -0
- package/dist/connection/presentation/useLabelColumns.d.ts +15 -0
- package/dist/connection/presentation/useLabelColumns.js +33 -0
- package/dist/connection/presentation/useLabelColumns.js.map +7 -0
- package/dist/connection/presentation/usePresentationController.d.ts +15 -0
- package/dist/connection/presentation/usePresentationController.js +118 -0
- package/dist/connection/presentation/usePresentationController.js.map +7 -0
- package/dist/connection/presentation/usePresentationFiles.d.ts +44 -0
- package/dist/connection/presentation/usePresentationFiles.js +307 -0
- package/dist/connection/presentation/usePresentationFiles.js.map +7 -0
- package/dist/connection/presentation/useViewerClipping.d.ts +14 -0
- package/dist/connection/presentation/useViewerClipping.js +18 -0
- package/dist/connection/presentation/useViewerClipping.js.map +7 -0
- package/dist/connection/sharing/WorkspaceMembersList.d.ts +4 -0
- package/dist/connection/sharing/WorkspaceMembersList.js +34 -0
- package/dist/connection/sharing/WorkspaceMembersList.js.map +7 -0
- package/dist/connection/shell/ConnectedAppShell.js +9 -1
- package/dist/connection/shell/ConnectedAppShell.js.map +2 -2
- package/dist/connection/viewer/CleanViewControl.d.ts +8 -0
- package/dist/connection/viewer/CleanViewControl.js +76 -0
- package/dist/connection/viewer/CleanViewControl.js.map +7 -0
- package/dist/connection/viewer/ConnectedDocumentViewer.js +31 -31
- package/dist/connection/viewer/ConnectedDocumentViewer.js.map +2 -2
- package/dist/connection/viewer/ViewerCropModal.d.ts +5 -0
- package/dist/connection/viewer/ViewerCropModal.js +22 -0
- package/dist/connection/viewer/ViewerCropModal.js.map +7 -0
- package/dist/connection/viewer/ViewerPdfPane.d.ts +3 -1
- package/dist/connection/viewer/ViewerPdfPane.js +57 -2
- package/dist/connection/viewer/ViewerPdfPane.js.map +2 -2
- package/dist/connection/viewer/drafts.js +6 -4
- package/dist/connection/viewer/drafts.js.map +2 -2
- package/dist/connection/viewer/pdf/PdfPassageHighlights.d.ts +12 -0
- package/dist/connection/viewer/pdf/PdfPassageHighlights.js +36 -0
- package/dist/connection/viewer/pdf/PdfPassageHighlights.js.map +7 -0
- package/dist/connection/viewer/pdf/passageHighlights.d.ts +26 -0
- package/dist/connection/viewer/pdf/passageHighlights.js +40 -0
- package/dist/connection/viewer/pdf/passageHighlights.js.map +7 -0
- package/dist/connection/viewer/pdf/usePdfPassageHighlights.d.ts +9 -0
- package/dist/connection/viewer/pdf/usePdfPassageHighlights.js +47 -0
- package/dist/connection/viewer/pdf/usePdfPassageHighlights.js.map +7 -0
- package/dist/connection/viewer/shareDocument.d.ts +11 -0
- package/dist/connection/viewer/shareDocument.js +11 -0
- package/dist/connection/viewer/shareDocument.js.map +7 -0
- package/dist/connection/viewer/slidesTabChunk.d.ts +2 -0
- package/dist/connection/viewer/slidesTabChunk.js +9 -0
- package/dist/connection/viewer/slidesTabChunk.js.map +7 -0
- package/dist/connection/viewer/useCleanView.d.ts +14 -0
- package/dist/connection/viewer/useCleanView.js +29 -0
- package/dist/connection/viewer/useCleanView.js.map +7 -0
- package/dist/connection/viewer/useViewedDocument.d.ts +1 -0
- package/dist/connection/viewer/useViewedDocument.js +9 -1
- package/dist/connection/viewer/useViewedDocument.js.map +2 -2
- package/dist/connection/viewer/useViewerTabs.js +18 -4
- package/dist/connection/viewer/useViewerTabs.js.map +2 -2
- package/dist/connection/workflows/ConnectedWorkflowStart.d.ts +14 -2
- package/dist/connection/workflows/ConnectedWorkflowStart.js +5 -2
- package/dist/connection/workflows/ConnectedWorkflowStart.js.map +2 -2
- package/dist/connection/workflows/workflowsPageLabels.js +1 -1
- package/dist/connection/workflows/workflowsPageLabels.js.map +1 -1
- package/dist/dashboards/index.cjs +1 -1
- package/dist/databases/index.cjs +49 -49
- package/dist/document-tools/DocumentToolButtons.d.ts +2 -0
- package/dist/document-tools/DocumentToolButtons.js +22 -1
- package/dist/document-tools/DocumentToolButtons.js.map +2 -2
- package/dist/document-tools/index.cjs +16 -12
- package/dist/document-tools/index.d.ts +1 -1
- package/dist/document-tools/index.js +2 -0
- package/dist/document-tools/index.js.map +2 -2
- package/dist/embed/index.cjs +43 -41
- package/dist/facts/factColumns.js +3 -3
- package/dist/facts/factColumns.js.map +1 -1
- package/dist/facts/index.cjs +42 -42
- package/dist/files/GridViewImpl.js +1 -1
- package/dist/files/GridViewImpl.js.map +2 -2
- package/dist/files/HtmlViewerParts.js +7 -15
- package/dist/files/HtmlViewerParts.js.map +2 -2
- package/dist/files/ViewerChrome.d.ts +5 -1
- package/dist/files/ViewerChrome.js +16 -6
- package/dist/files/ViewerChrome.js.map +2 -2
- package/dist/files/index.cjs +226 -226
- package/dist/files/navigator/DocumentSearchList.js +1 -1
- package/dist/files/navigator/DocumentSearchList.js.map +2 -2
- package/dist/index.cjs +1668 -1666
- package/dist/index.cjs.map +1 -1
- package/dist/presentation/BoxActionBar.d.ts +11 -0
- package/dist/presentation/BoxActionBar.js +182 -0
- package/dist/presentation/BoxActionBar.js.map +7 -0
- package/dist/presentation/ClipActionBar.d.ts +26 -0
- package/dist/presentation/ClipActionBar.js +103 -0
- package/dist/presentation/ClipActionBar.js.map +7 -0
- package/dist/presentation/ClipCaptureOverlay.d.ts +14 -0
- package/dist/presentation/ClipCaptureOverlay.js +69 -0
- package/dist/presentation/ClipCaptureOverlay.js.map +7 -0
- package/dist/presentation/ClipImage.d.ts +21 -0
- package/dist/presentation/ClipImage.js +119 -0
- package/dist/presentation/ClipImage.js.map +7 -0
- package/dist/presentation/ClipTray.d.ts +11 -0
- package/dist/presentation/ClipTray.js +152 -0
- package/dist/presentation/ClipTray.js.map +7 -0
- package/dist/presentation/ClipViewControls.d.ts +11 -0
- package/dist/presentation/ClipViewControls.js +142 -0
- package/dist/presentation/ClipViewControls.js.map +7 -0
- package/dist/presentation/DesignMenu.d.ts +8 -0
- package/dist/presentation/DesignMenu.js +199 -0
- package/dist/presentation/DesignMenu.js.map +7 -0
- package/dist/presentation/LayoutMenu.d.ts +17 -0
- package/dist/presentation/LayoutMenu.js +122 -0
- package/dist/presentation/LayoutMenu.js.map +7 -0
- package/dist/presentation/MediaClip.d.ts +15 -0
- package/dist/presentation/MediaClip.js +67 -0
- package/dist/presentation/MediaClip.js.map +7 -0
- package/dist/presentation/Notice.d.ts +6 -0
- package/dist/presentation/Notice.js +43 -0
- package/dist/presentation/Notice.js.map +7 -0
- package/dist/presentation/PresentationStage.d.ts +32 -0
- package/dist/presentation/PresentationStage.js +232 -0
- package/dist/presentation/PresentationStage.js.map +7 -0
- package/dist/presentation/PresenterView.d.ts +16 -0
- package/dist/presentation/PresenterView.js +69 -0
- package/dist/presentation/PresenterView.js.map +7 -0
- package/dist/presentation/SlideDecor.d.ts +25 -0
- package/dist/presentation/SlideDecor.js +189 -0
- package/dist/presentation/SlideDecor.js.map +7 -0
- package/dist/presentation/SlidesEditor.d.ts +25 -0
- package/dist/presentation/SlidesEditor.js +359 -0
- package/dist/presentation/SlidesEditor.js.map +7 -0
- package/dist/presentation/StageBox.d.ts +30 -0
- package/dist/presentation/StageBox.js +281 -0
- package/dist/presentation/StageBox.js.map +7 -0
- package/dist/presentation/StageItem.d.ts +37 -0
- package/dist/presentation/StageItem.js +211 -0
- package/dist/presentation/StageItem.js.map +7 -0
- package/dist/presentation/box-style.d.ts +6 -0
- package/dist/presentation/box-style.js +19 -0
- package/dist/presentation/box-style.js.map +7 -0
- package/dist/presentation/boxes.d.ts +105 -0
- package/dist/presentation/boxes.js +103 -0
- package/dist/presentation/boxes.js.map +7 -0
- package/dist/presentation/draw-boxes.d.ts +8 -0
- package/dist/presentation/draw-boxes.js +130 -0
- package/dist/presentation/draw-boxes.js.map +7 -0
- package/dist/presentation/export-boxes.d.ts +10 -0
- package/dist/presentation/export-boxes.js +74 -0
- package/dist/presentation/export-boxes.js.map +7 -0
- package/dist/presentation/export-pptx.d.ts +16 -0
- package/dist/presentation/export-pptx.js +194 -0
- package/dist/presentation/export-pptx.js.map +7 -0
- package/dist/presentation/import-pptx.d.ts +35 -0
- package/dist/presentation/import-pptx.js +659 -0
- package/dist/presentation/import-pptx.js.map +7 -0
- package/dist/presentation/merge-outside-edits.d.ts +12 -0
- package/dist/presentation/merge-outside-edits.js +35 -0
- package/dist/presentation/merge-outside-edits.js.map +7 -0
- package/dist/presentation/model.d.ts +201 -0
- package/dist/presentation/model.js +271 -0
- package/dist/presentation/model.js.map +7 -0
- package/dist/presentation/panel-id.d.ts +34 -0
- package/dist/presentation/panel-id.js +24 -0
- package/dist/presentation/panel-id.js.map +7 -0
- package/dist/presentation/persistence.d.ts +121 -0
- package/dist/presentation/persistence.js +141 -0
- package/dist/presentation/persistence.js.map +7 -0
- package/dist/presentation/pptx-data.d.ts +22 -0
- package/dist/presentation/pptx-data.js +83 -0
- package/dist/presentation/pptx-data.js.map +7 -0
- package/dist/presentation/pptx-xml.d.ts +90 -0
- package/dist/presentation/pptx-xml.js +333 -0
- package/dist/presentation/pptx-xml.js.map +7 -0
- package/dist/presentation/render-slides.d.ts +58 -0
- package/dist/presentation/render-slides.js +309 -0
- package/dist/presentation/render-slides.js.map +7 -0
- package/dist/presentation/saved-boxes.d.ts +11 -0
- package/dist/presentation/saved-boxes.js +80 -0
- package/dist/presentation/saved-boxes.js.map +7 -0
- package/dist/presentation/slide-layout.d.ts +54 -0
- package/dist/presentation/slide-layout.js +117 -0
- package/dist/presentation/slide-layout.js.map +7 -0
- package/dist/presentation/stage-videos.d.ts +5 -0
- package/dist/presentation/stage-videos.js +19 -0
- package/dist/presentation/stage-videos.js.map +7 -0
- package/dist/presentation/store.d.ts +203 -0
- package/dist/presentation/store.js +429 -0
- package/dist/presentation/store.js.map +7 -0
- package/dist/presentation/theme.d.ts +102 -0
- package/dist/presentation/theme.js +276 -0
- package/dist/presentation/theme.js.map +7 -0
- package/dist/presentation/useClipDrag.d.ts +26 -0
- package/dist/presentation/useClipDrag.js +65 -0
- package/dist/presentation/useClipDrag.js.map +7 -0
- package/dist/presentation/useObjectUrl.d.ts +6 -0
- package/dist/presentation/useObjectUrl.js +15 -0
- package/dist/presentation/useObjectUrl.js.map +7 -0
- package/dist/presentation/usePresenterKeys.d.ts +13 -0
- package/dist/presentation/usePresenterKeys.js +62 -0
- package/dist/presentation/usePresenterKeys.js.map +7 -0
- package/dist/settings/index.cjs +151 -150
- package/dist/shell/PanelPortal.js +1 -0
- package/dist/shell/PanelPortal.js.map +2 -2
- package/dist/shell/index.cjs +112 -110
- package/dist/shell/panel-windows.d.ts +2 -0
- package/dist/shell/panel-windows.js +7 -2
- package/dist/shell/panel-windows.js.map +2 -2
- package/dist/studio/index.cjs +28 -26
- package/dist/studio/index.cjs.map +1 -1
- package/dist/styles.css +1 -1
- package/dist/workflow-canvas/index.cjs +58 -57
- package/dist/workflow-canvas/index.cjs.map +1 -1
- package/node_modules/@arbidocs/coedit/package.json +1 -1
- package/package.json +6 -5
- package/dist/ConnectedCallDock-WER7R222.cjs.map +0 -1
- package/dist/DocumentReviewCard-ZSBZBGFK.cjs.map +0 -1
- package/dist/FilesViewerDialog-6UKR5WEF.cjs.map +0 -1
- package/dist/GridViewImpl-ZMJJWTOM.cjs.map +0 -1
- package/dist/WorkspaceTableView-J3C6VH4T.cjs.map +0 -1
- package/dist/ai-IM4A23YT.cjs.map +0 -1
- package/dist/chunk-557MJ4IH.cjs.map +0 -1
- package/dist/chunk-6UTKM5AB.cjs.map +0 -1
- package/dist/chunk-6WMMZLEV.cjs.map +0 -1
- package/dist/chunk-B3LZITVF.cjs.map +0 -1
- package/dist/chunk-CPG7II4E.cjs.map +0 -1
- package/dist/chunk-CPR6EHG7.cjs.map +0 -1
- package/dist/chunk-DDIW4HLU.cjs.map +0 -1
- package/dist/chunk-NJCK6V6U.cjs.map +0 -1
- package/dist/chunk-NNUK5ZM7.cjs.map +0 -1
- package/dist/chunk-PGJYD67F.cjs.map +0 -1
- package/dist/chunk-R7CJEIA5.cjs.map +0 -1
- package/dist/chunk-SB4M3ITT.cjs.map +0 -1
- package/dist/chunk-TT4IF52H.cjs.map +0 -1
- package/dist/chunk-VLCY46K6.cjs.map +0 -1
- package/dist/chunk-YYPZOEED.cjs.map +0 -1
- package/dist/chunk-ZPPMAL5P.cjs.map +0 -1
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
"use client";
|
|
2
2
|
import { Fragment, jsx, jsxs } from "react/jsx-runtime";
|
|
3
3
|
import { memo } from "react";
|
|
4
|
-
import {
|
|
5
|
-
import { cn } from "@arbidocs/react/ui";
|
|
4
|
+
import { StickyNote, Tags } from "lucide-react";
|
|
5
|
+
import { cn, SharingEntity } from "@arbidocs/react/ui";
|
|
6
6
|
import { testIdOr } from "../chat/test-id.js";
|
|
7
7
|
const DEFAULT_HTML_VIEWER_LABELS = {
|
|
8
8
|
viewerRegion: "Parsed document viewer",
|
|
@@ -288,21 +288,13 @@ function DocTagBar({
|
|
|
288
288
|
nextLabel: l.nextLabelPassage
|
|
289
289
|
}
|
|
290
290
|
),
|
|
291
|
-
visibility && /* @__PURE__ */
|
|
292
|
-
|
|
291
|
+
visibility && /* @__PURE__ */ jsx("span", { className: "ml-auto shrink-0", children: /* @__PURE__ */ jsx(
|
|
292
|
+
SharingEntity,
|
|
293
293
|
{
|
|
294
|
-
|
|
295
|
-
"data-testid": testIdOr(testIds?.visibility, { testId: "doc-visibility-chip" })
|
|
296
|
-
className: cn(
|
|
297
|
-
"ml-auto inline-flex shrink-0 items-center gap-1.5 rounded-full px-2 py-0.5 text-xs",
|
|
298
|
-
visibility === "shared" ? "bg-accent text-accent-foreground" : "bg-muted text-muted-foreground"
|
|
299
|
-
),
|
|
300
|
-
children: [
|
|
301
|
-
/* @__PURE__ */ jsx(Share2, { className: "size-3 shrink-0" }),
|
|
302
|
-
visibility === "shared" ? l.shared : l.private
|
|
303
|
-
]
|
|
294
|
+
shared: visibility === "shared",
|
|
295
|
+
"data-testid": testIdOr(testIds?.visibility, { testId: "doc-visibility-chip" })
|
|
304
296
|
}
|
|
305
|
-
)
|
|
297
|
+
) })
|
|
306
298
|
]
|
|
307
299
|
}
|
|
308
300
|
);
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../../src/files/HtmlViewerParts.tsx"],
|
|
4
|
-
"sourcesContent": ["import { memo } from 'react'\nimport type { ReactNode, Ref } from 'react'\nimport { Share2, StickyNote, Tags } from 'lucide-react'\nimport { cn } from '@arbidocs/react/ui'\nimport { testIdOr } from '../chat/test-id'\n\n/** Every fixed string of the parsed viewer parts. Pass a partial `labels` to translate or reword. */\nexport interface HtmlViewerLabels {\n viewerRegion: string\n pageOfTotal: (page: number, total: number) => string\n documentContent: string\n page: (n: number) => string\n noContent: string\n noContentDescription: string\n citedSuffix: string\n previousCited: string\n nextCited: string\n previousLabelPassage: string\n nextLabelPassage: string\n sharedWithMembers: string\n privateToYou: string\n shared: string\n private: string\n}\n\nexport const DEFAULT_HTML_VIEWER_LABELS: HtmlViewerLabels = {\n viewerRegion: 'Parsed document viewer',\n pageOfTotal: (page, total) => `Page ${page} of ${total}`,\n documentContent: 'Document content',\n page: (n) => `Page ${n}`,\n noContent: 'No Content Available',\n noContentDescription: 'This document has not been parsed yet or contains no content',\n citedSuffix: 'cited',\n previousCited: 'Previous cited passage',\n nextCited: 'Next cited passage',\n previousLabelPassage: 'Previous passage with this label',\n nextLabelPassage: 'Next passage with this label',\n sharedWithMembers: 'Shared with workspace members',\n privateToYou: 'Private to you',\n shared: 'Shared',\n private: 'Private',\n}\n\n// \u2500\u2500 Surface + pages \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\nexport interface HtmlViewerRootProps {\n children: ReactNode\n className?: string\n}\n\n/** Positioning context for the parsed viewer: overlays (tag bar, cited stepper) sit on it. */\nexport function HtmlViewerRoot({ children, className }: HtmlViewerRootProps) {\n return (\n <div className={cn('relative h-full w-full', className)} data-slot=\"html-viewer\">\n {children}\n </div>\n )\n}\n\nexport interface HtmlViewerSurfaceProps {\n children: ReactNode\n surfaceRef?: Ref<HTMLDivElement>\n /** Hidden (kept mounted) while the translation comparison table is showing. */\n hidden?: boolean\n onMouseUp?: () => void\n className?: string\n labels?: Partial<HtmlViewerLabels>\n /** Overrides the root test id (default `parsed-viewer`). */\n testId?: string\n}\n\n/** The scrolling canvas the page sheets stack on. */\nexport function HtmlViewerSurface({\n children,\n surfaceRef,\n hidden,\n onMouseUp,\n className,\n labels,\n testId,\n}: HtmlViewerSurfaceProps) {\n const l = { ...DEFAULT_HTML_VIEWER_LABELS, ...labels }\n return (\n <div\n ref={surfaceRef}\n className={cn(\n 'flex h-full w-full flex-col items-center overflow-y-auto bg-muted p-4 pb-20',\n hidden && 'hidden',\n className\n )}\n role=\"region\"\n aria-label={l.viewerRegion}\n data-slot=\"html-viewer-surface\"\n // Two-finger gestures belong to the host's text zoom, not to the browser's bitmap zoom.\n style={{ touchAction: 'pan-x pan-y' }}\n data-testid={testIdOr(testId, { testId: 'parsed-viewer' })}\n onMouseUp={onMouseUp}\n >\n {children}\n </div>\n )\n}\n\nexport interface HtmlPageProps {\n /** 1-based page number, null for unpaginated content. */\n pageNumber: number | null\n totalPages: number\n /** False renders a sized placeholder (lazy pages). */\n isRendered: boolean\n /** Placeholder height in px when not rendered. */\n placeholderHeight: number\n /** Text size multiplier: the font size changes and the text reflows inside the page width. */\n zoom?: number\n children?: ReactNode\n labels?: Partial<HtmlViewerLabels>\n}\n\n/** One page sheet: numbered header, content, or a lightweight placeholder while off-screen. */\nexport function HtmlPage({\n pageNumber,\n totalPages,\n isRendered,\n placeholderHeight,\n zoom = 1,\n children,\n labels,\n}: HtmlPageProps) {\n const l = { ...DEFAULT_HTML_VIEWER_LABELS, ...labels }\n return (\n <div\n id={pageNumber ? `page-${pageNumber}` : undefined}\n data-page-number={pageNumber ?? undefined}\n data-slot=\"html-page\"\n className={cn(\n // shrink-0: a page is a flex item of the scrolling surface and must never be squeezed.\n 'mb-6 w-full max-w-4xl shrink-0',\n isRendered && 'rounded-lg border border-border bg-background p-8'\n )}\n role=\"article\"\n aria-label={pageNumber ? l.pageOfTotal(pageNumber, totalPages) : l.documentContent}\n >\n {isRendered ? (\n <>\n {pageNumber ? (\n <div className=\"mb-4 flex items-center justify-center border-b border-border pb-4\">\n <div className=\"text-sm font-medium text-muted-foreground\">{l.page(pageNumber)}</div>\n </div>\n ) : null}\n <div\n className=\"prose prose-sm max-w-none prose-p:my-0 prose-headings:my-0 [&_img]:max-w-full [&_pre]:overflow-x-auto [&_table]:block [&_table]:max-w-full [&_table]:overflow-x-auto\"\n // The page text inherits this size (1rem at 100%), so this one value scales it and reflows.\n style={zoom === 1 ? undefined : { fontSize: `${zoom}rem` }}\n >\n {children}\n </div>\n </>\n ) : (\n <div\n className=\"flex items-center justify-center rounded-md border border-border bg-muted\"\n style={{ height: placeholderHeight }}\n >\n {pageNumber ? (\n <div className=\"text-sm text-muted-foreground\">{l.page(pageNumber)}</div>\n ) : null}\n </div>\n )}\n </div>\n )\n}\n\n/** Shown when a parsed document has no chunks. */\nexport function HtmlViewerEmpty({ labels }: { labels?: Partial<HtmlViewerLabels> }) {\n const l = { ...DEFAULT_HTML_VIEWER_LABELS, ...labels }\n return (\n <div className=\"flex h-full items-center justify-center text-muted-foreground\">\n <div className=\"text-center\">\n <p className=\"mb-2 text-base font-medium\">{l.noContent}</p>\n <p className=\"text-sm\">{l.noContentDescription}</p>\n </div>\n </div>\n )\n}\n\n// \u2500\u2500 Passage \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\nexport type PassageHighlight = 'light' | 'strong'\n\nexport interface HtmlPassageProps {\n /** Passage (chunk) id: the element id, deep-link and scroll target. */\n chunkId?: string\n /** Yellow wash: `strong` = selected/being read, `light` = listed or search hit. */\n highlight?: PassageHighlight\n /** Marks a search hit for e2e (`highlighted-chunk`). */\n isHit?: boolean\n /** Overrides the hit test id (default `highlighted-chunk`). */\n hitTestId?: string\n /** Part of a contiguous selected run; the run is drawn as one block. */\n isSelected?: boolean\n runIsStart?: boolean\n runIsEnd?: boolean\n /** Citation mode: the passage toggles on click. */\n isClickable?: boolean\n /** Click on the passage; `extend` is true when shift was held (range select). */\n onSelect?: (extend: boolean) => void\n /** The passage carries labels; `tagMark` draws them. */\n isTagged?: boolean\n /** Colour of the label currently being walked, when it marks this passage. */\n activeTagColor?: string\n /** Citation run marker, shown once at the first member of a run. */\n runMarker?: ReactNode\n /** Label stripes in the margin (a `LabelMark`): always visible, one menu. */\n tagMark?: ReactNode\n /**\n * The passage's reference mark (a `PassageMark`): quiet text in the margin whose menu carries\n * every passage action. Faint on hover/focus, always faintly visible on touch.\n */\n mark?: ReactNode\n /** The passage text. */\n children: ReactNode\n}\n\n/** One parsed passage: highlight states, label stripes, run marker, reference label, actions. */\nexport const HtmlPassage = memo(function HtmlPassage({\n chunkId,\n highlight,\n isHit,\n hitTestId,\n isSelected,\n runIsStart,\n runIsEnd,\n isClickable,\n onSelect,\n isTagged,\n activeTagColor,\n runMarker,\n tagMark,\n mark,\n children,\n}: HtmlPassageProps) {\n const hasId = !!chunkId\n // A selected run is one block: round only its first top and last bottom.\n const rounding = !isSelected\n ? 'rounded'\n : [runIsStart ? 'rounded-t' : 'rounded-t-none', runIsEnd ? 'rounded-b' : 'rounded-b-none'].join(\n ' '\n )\n return (\n <div\n id={chunkId}\n data-slot=\"html-passage\"\n data-chunk-id={chunkId}\n data-run-start={(isSelected && runIsStart) || undefined}\n data-tagged={isTagged || undefined}\n data-tag-active={activeTagColor ? true : undefined}\n data-testid={isHit ? testIdOr(hitTestId, { testId: 'highlighted-chunk' }) : null}\n onClick={\n hasId && onSelect\n ? (e) => {\n // A mark or its menu is its own target; it must not also select the passage.\n if ((e.target as HTMLElement).closest('[data-slot=\"mark\"], [data-slot=\"mark-menu\"]'))\n return\n onSelect(e.shiftKey)\n }\n : undefined\n }\n className={cn(\n 'group relative block px-1 py-0.5',\n rounding,\n highlight === 'strong'\n ? 'bg-ai-soft text-foreground ring-1 ring-ai-accent/40'\n : highlight === 'light'\n ? 'bg-ai-soft/60 text-foreground hover:bg-ai-soft'\n : hasId && 'hover:bg-muted/50',\n hasId && isClickable && 'cursor-pointer select-none',\n // On touch every passage with an id is at least 44px tall, so the marks of consecutive\n // one-line passages keep their 44px tap areas apart. Tied to the id, which never changes,\n // not to the mark, which comes and goes while a citation run is selected: the document\n // must not jump under the finger.\n hasId && 'pointer-coarse:min-h-11'\n )}\n // The active label washes its passages in its own (dynamic) colour, kept faint.\n style={\n activeTagColor && !highlight\n ? {\n backgroundColor: `${activeTagColor}22`,\n boxShadow: `inset 3px 0 0 0 ${activeTagColor}`,\n }\n : undefined\n }\n >\n {children}\n\n {tagMark && <span className=\"absolute -left-3 top-1.5 z-10\">{tagMark}</span>}\n\n {runMarker ? (\n <span className=\"absolute -top-2.5 left-1 z-10\" data-run-marker>\n {runMarker}\n </span>\n ) : null}\n\n {mark && (\n <span className=\"absolute -top-2.5 right-0 z-10 opacity-0 transition-opacity duration-200 group-hover:opacity-100 group-focus-within:opacity-100 pointer-coarse:opacity-70 [&:has([aria-expanded=true])]:opacity-100\">\n {mark}\n </span>\n )}\n </div>\n )\n})\n\n// \u2500\u2500 Steppers \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\ninterface PassageStepperProps {\n /** 1-based position. */\n position: number\n total: number\n onStep: (delta: number) => void\n /** Test id of the stepper (none by default). */\n testId?: string\n className?: string\n prevLabel: string\n nextLabel: string\n /** Text after the count, e.g. \"cited\". */\n suffix?: string\n}\n\nconst stepButton =\n 'px-1 text-muted-foreground hover:text-foreground pointer-coarse:min-h-11 pointer-coarse:min-w-11'\n\n/** Compact \"3/9 cited\" prev/next stepper overlaid on the document. */\nfunction PassageStepper({\n position,\n total,\n onStep,\n testId,\n className,\n prevLabel,\n nextLabel,\n suffix,\n}: PassageStepperProps) {\n return (\n <span\n className={cn(\n 'inline-flex items-center gap-1 rounded-md border border-border bg-background/95 px-1.5 py-0.5',\n className\n )}\n data-slot=\"passage-stepper\"\n data-testid={testId}\n >\n <button\n type=\"button\"\n onClick={() => onStep(-1)}\n aria-label={prevLabel}\n className={stepButton}\n >\n \u2039\n </button>\n <span className=\"text-xs tabular-nums text-muted-foreground\">\n {Math.min(position, total)}/{total}\n {suffix ? ` ${suffix}` : ''}\n </span>\n <button type=\"button\" onClick={() => onStep(1)} aria-label={nextLabel} className={stepButton}>\n \u203A\n </button>\n </span>\n )\n}\n\n/** Overlay placement for the cited-passages stepper (top centre of the viewer). */\nexport function CitedRunNav({\n labels,\n testId,\n ...props\n}: Omit<PassageStepperProps, 'prevLabel' | 'nextLabel' | 'testId' | 'suffix'> & {\n labels?: Partial<HtmlViewerLabels>\n /** Overrides the stepper test id (default `note-run-nav`). */\n testId?: string\n}) {\n const l = { ...DEFAULT_HTML_VIEWER_LABELS, ...labels }\n return (\n <div className=\"absolute left-1/2 top-2 z-20 -translate-x-1/2\" data-slot=\"cited-run-nav\">\n <PassageStepper\n {...props}\n suffix={l.citedSuffix}\n prevLabel={l.previousCited}\n nextLabel={l.nextCited}\n testId={testIdOr(testId, { testId: 'note-run-nav' })}\n />\n </div>\n )\n}\n\n// \u2500\u2500 Label bar \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\nexport interface DocTagChipView {\n id: string\n name: string\n /** Fill colour (dynamic, per label). */\n color: string\n /** Passages the label marks; 0 = applies to the whole document. */\n passageCount: number\n hasNote: boolean\n title: string\n}\n\nexport interface DocTagBarProps {\n chips: DocTagChipView[]\n /** Document visibility mark on the far right; null/undefined omits it. */\n visibility?: 'shared' | 'private' | null\n /** Passage stepping over the active label's passages (parsed view only). */\n step?: { position: number; total: number; onStep: (delta: number) => void }\n /** The label currently washing its passages (parsed view only). */\n activeId?: string | null\n /** When given, chips are toggles: pick a label to mark its passages, pick it again to clear. */\n onSelect?: (id: string | null) => void\n labels?: Partial<HtmlViewerLabels>\n testIds?: Partial<DocTagBarTestIds>\n}\n\nexport interface DocTagBarTestIds {\n root: string\n nav: string\n visibility: string\n /** Replaces the whole `doc-tag-chip-<id>` id. */\n chip: (id: string) => string\n}\n\n/**\n * The document's labels along the top of a viewer: chips (toggles when `onSelect` is given, else\n * read-only marks), optional passage stepper for the active label, and the shared/private mark.\n * Draws nothing when it has nothing to say.\n */\nexport function DocTagBar({\n chips,\n visibility,\n step,\n activeId = null,\n onSelect,\n labels,\n testIds,\n}: DocTagBarProps) {\n const l = { ...DEFAULT_HTML_VIEWER_LABELS, ...labels }\n if (chips.length === 0 && !visibility) return null\n return (\n <div\n className=\"absolute left-2 right-2 top-2 z-20 flex flex-wrap items-center gap-1\"\n data-slot=\"doc-tag-bar\"\n data-testid={testIdOr(testIds?.root, { testId: 'doc-tag-bar' })}\n >\n {chips.map((c) => {\n const isActive = c.id === activeId\n const content = (\n <>\n <Tags className=\"size-3 shrink-0\" />\n {c.name}\n {c.passageCount > 0 && (\n <span className=\"tabular-nums opacity-90\">{c.passageCount}</span>\n )}\n {c.hasNote && <StickyNote className=\"size-3 opacity-90\" />}\n </>\n )\n const chipClass =\n 'inline-flex items-center gap-1.5 rounded-full border border-transparent px-2 py-0.5 text-xs text-white'\n return onSelect ? (\n <button\n key={c.id}\n type=\"button\"\n // Picking the active chip again clears it: the way back to the plain document.\n onClick={() => onSelect(isActive ? null : c.id)}\n aria-pressed={isActive}\n title={c.title}\n data-testid={testIdOr(testIds?.chip?.(c.id), { testId: `doc-tag-chip-${c.id}` })}\n data-active={isActive || undefined}\n className={cn(chipClass, 'cursor-pointer', !isActive && 'opacity-70 hover:opacity-100')}\n style={{ backgroundColor: c.color }}\n >\n {content}\n </button>\n ) : (\n <span\n key={c.id}\n title={c.title}\n data-testid={testIdOr(testIds?.chip?.(c.id), { testId: `doc-tag-chip-${c.id}` })}\n className={chipClass}\n style={{ backgroundColor: c.color }}\n >\n {content}\n </span>\n )\n })}\n\n {step && step.total > 0 && (\n <PassageStepper\n className=\"ml-1\"\n position={step.position}\n total={step.total}\n onStep={step.onStep}\n testId={testIdOr(testIds?.nav, { testId: 'doc-tag-nav' })}\n prevLabel={l.previousLabelPassage}\n nextLabel={l.nextLabelPassage}\n />\n )}\n\n {visibility && (\n <span\n title={visibility === 'shared' ? l.sharedWithMembers : l.privateToYou}\n data-testid={testIdOr(testIds?.visibility, { testId: 'doc-visibility-chip' })}\n className={cn(\n 'ml-auto inline-flex shrink-0 items-center gap-1.5 rounded-full px-2 py-0.5 text-xs',\n visibility === 'shared'\n ? 'bg-accent text-accent-foreground'\n : 'bg-muted text-muted-foreground'\n )}\n >\n <Share2 className=\"size-3 shrink-0\" />\n {visibility === 'shared' ? l.shared : l.private}\n </span>\n )}\n </div>\n )\n}\n"],
|
|
5
|
-
"mappings": ";AAqDI,SAyFI,UAzFJ,KAyFI,YAzFJ;AArDJ,SAAS,YAAY;AAErB,
|
|
4
|
+
"sourcesContent": ["import { memo } from 'react'\nimport type { ReactNode, Ref } from 'react'\nimport { Share2, StickyNote, Tags } from 'lucide-react'\nimport { cn, SharingEntity } from '@arbidocs/react/ui'\nimport { testIdOr } from '../chat/test-id'\n\n/** Every fixed string of the parsed viewer parts. Pass a partial `labels` to translate or reword. */\nexport interface HtmlViewerLabels {\n viewerRegion: string\n pageOfTotal: (page: number, total: number) => string\n documentContent: string\n page: (n: number) => string\n noContent: string\n noContentDescription: string\n citedSuffix: string\n previousCited: string\n nextCited: string\n previousLabelPassage: string\n nextLabelPassage: string\n sharedWithMembers: string\n privateToYou: string\n shared: string\n private: string\n}\n\nexport const DEFAULT_HTML_VIEWER_LABELS: HtmlViewerLabels = {\n viewerRegion: 'Parsed document viewer',\n pageOfTotal: (page, total) => `Page ${page} of ${total}`,\n documentContent: 'Document content',\n page: (n) => `Page ${n}`,\n noContent: 'No Content Available',\n noContentDescription: 'This document has not been parsed yet or contains no content',\n citedSuffix: 'cited',\n previousCited: 'Previous cited passage',\n nextCited: 'Next cited passage',\n previousLabelPassage: 'Previous passage with this label',\n nextLabelPassage: 'Next passage with this label',\n sharedWithMembers: 'Shared with workspace members',\n privateToYou: 'Private to you',\n shared: 'Shared',\n private: 'Private',\n}\n\n// \u2500\u2500 Surface + pages \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\nexport interface HtmlViewerRootProps {\n children: ReactNode\n className?: string\n}\n\n/** Positioning context for the parsed viewer: overlays (tag bar, cited stepper) sit on it. */\nexport function HtmlViewerRoot({ children, className }: HtmlViewerRootProps) {\n return (\n <div className={cn('relative h-full w-full', className)} data-slot=\"html-viewer\">\n {children}\n </div>\n )\n}\n\nexport interface HtmlViewerSurfaceProps {\n children: ReactNode\n surfaceRef?: Ref<HTMLDivElement>\n /** Hidden (kept mounted) while the translation comparison table is showing. */\n hidden?: boolean\n onMouseUp?: () => void\n className?: string\n labels?: Partial<HtmlViewerLabels>\n /** Overrides the root test id (default `parsed-viewer`). */\n testId?: string\n}\n\n/** The scrolling canvas the page sheets stack on. */\nexport function HtmlViewerSurface({\n children,\n surfaceRef,\n hidden,\n onMouseUp,\n className,\n labels,\n testId,\n}: HtmlViewerSurfaceProps) {\n const l = { ...DEFAULT_HTML_VIEWER_LABELS, ...labels }\n return (\n <div\n ref={surfaceRef}\n className={cn(\n 'flex h-full w-full flex-col items-center overflow-y-auto bg-muted p-4 pb-20',\n hidden && 'hidden',\n className\n )}\n role=\"region\"\n aria-label={l.viewerRegion}\n data-slot=\"html-viewer-surface\"\n // Two-finger gestures belong to the host's text zoom, not to the browser's bitmap zoom.\n style={{ touchAction: 'pan-x pan-y' }}\n data-testid={testIdOr(testId, { testId: 'parsed-viewer' })}\n onMouseUp={onMouseUp}\n >\n {children}\n </div>\n )\n}\n\nexport interface HtmlPageProps {\n /** 1-based page number, null for unpaginated content. */\n pageNumber: number | null\n totalPages: number\n /** False renders a sized placeholder (lazy pages). */\n isRendered: boolean\n /** Placeholder height in px when not rendered. */\n placeholderHeight: number\n /** Text size multiplier: the font size changes and the text reflows inside the page width. */\n zoom?: number\n children?: ReactNode\n labels?: Partial<HtmlViewerLabels>\n}\n\n/** One page sheet: numbered header, content, or a lightweight placeholder while off-screen. */\nexport function HtmlPage({\n pageNumber,\n totalPages,\n isRendered,\n placeholderHeight,\n zoom = 1,\n children,\n labels,\n}: HtmlPageProps) {\n const l = { ...DEFAULT_HTML_VIEWER_LABELS, ...labels }\n return (\n <div\n id={pageNumber ? `page-${pageNumber}` : undefined}\n data-page-number={pageNumber ?? undefined}\n data-slot=\"html-page\"\n className={cn(\n // shrink-0: a page is a flex item of the scrolling surface and must never be squeezed.\n 'mb-6 w-full max-w-4xl shrink-0',\n isRendered && 'rounded-lg border border-border bg-background p-8'\n )}\n role=\"article\"\n aria-label={pageNumber ? l.pageOfTotal(pageNumber, totalPages) : l.documentContent}\n >\n {isRendered ? (\n <>\n {pageNumber ? (\n <div className=\"mb-4 flex items-center justify-center border-b border-border pb-4\">\n <div className=\"text-sm font-medium text-muted-foreground\">{l.page(pageNumber)}</div>\n </div>\n ) : null}\n <div\n className=\"prose prose-sm max-w-none prose-p:my-0 prose-headings:my-0 [&_img]:max-w-full [&_pre]:overflow-x-auto [&_table]:block [&_table]:max-w-full [&_table]:overflow-x-auto\"\n // The page text inherits this size (1rem at 100%), so this one value scales it and reflows.\n style={zoom === 1 ? undefined : { fontSize: `${zoom}rem` }}\n >\n {children}\n </div>\n </>\n ) : (\n <div\n className=\"flex items-center justify-center rounded-md border border-border bg-muted\"\n style={{ height: placeholderHeight }}\n >\n {pageNumber ? (\n <div className=\"text-sm text-muted-foreground\">{l.page(pageNumber)}</div>\n ) : null}\n </div>\n )}\n </div>\n )\n}\n\n/** Shown when a parsed document has no chunks. */\nexport function HtmlViewerEmpty({ labels }: { labels?: Partial<HtmlViewerLabels> }) {\n const l = { ...DEFAULT_HTML_VIEWER_LABELS, ...labels }\n return (\n <div className=\"flex h-full items-center justify-center text-muted-foreground\">\n <div className=\"text-center\">\n <p className=\"mb-2 text-base font-medium\">{l.noContent}</p>\n <p className=\"text-sm\">{l.noContentDescription}</p>\n </div>\n </div>\n )\n}\n\n// \u2500\u2500 Passage \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\nexport type PassageHighlight = 'light' | 'strong'\n\nexport interface HtmlPassageProps {\n /** Passage (chunk) id: the element id, deep-link and scroll target. */\n chunkId?: string\n /** Yellow wash: `strong` = selected/being read, `light` = listed or search hit. */\n highlight?: PassageHighlight\n /** Marks a search hit for e2e (`highlighted-chunk`). */\n isHit?: boolean\n /** Overrides the hit test id (default `highlighted-chunk`). */\n hitTestId?: string\n /** Part of a contiguous selected run; the run is drawn as one block. */\n isSelected?: boolean\n runIsStart?: boolean\n runIsEnd?: boolean\n /** Citation mode: the passage toggles on click. */\n isClickable?: boolean\n /** Click on the passage; `extend` is true when shift was held (range select). */\n onSelect?: (extend: boolean) => void\n /** The passage carries labels; `tagMark` draws them. */\n isTagged?: boolean\n /** Colour of the label currently being walked, when it marks this passage. */\n activeTagColor?: string\n /** Citation run marker, shown once at the first member of a run. */\n runMarker?: ReactNode\n /** Label stripes in the margin (a `LabelMark`): always visible, one menu. */\n tagMark?: ReactNode\n /**\n * The passage's reference mark (a `PassageMark`): quiet text in the margin whose menu carries\n * every passage action. Faint on hover/focus, always faintly visible on touch.\n */\n mark?: ReactNode\n /** The passage text. */\n children: ReactNode\n}\n\n/** One parsed passage: highlight states, label stripes, run marker, reference label, actions. */\nexport const HtmlPassage = memo(function HtmlPassage({\n chunkId,\n highlight,\n isHit,\n hitTestId,\n isSelected,\n runIsStart,\n runIsEnd,\n isClickable,\n onSelect,\n isTagged,\n activeTagColor,\n runMarker,\n tagMark,\n mark,\n children,\n}: HtmlPassageProps) {\n const hasId = !!chunkId\n // A selected run is one block: round only its first top and last bottom.\n const rounding = !isSelected\n ? 'rounded'\n : [runIsStart ? 'rounded-t' : 'rounded-t-none', runIsEnd ? 'rounded-b' : 'rounded-b-none'].join(\n ' '\n )\n return (\n <div\n id={chunkId}\n data-slot=\"html-passage\"\n data-chunk-id={chunkId}\n data-run-start={(isSelected && runIsStart) || undefined}\n data-tagged={isTagged || undefined}\n data-tag-active={activeTagColor ? true : undefined}\n data-testid={isHit ? testIdOr(hitTestId, { testId: 'highlighted-chunk' }) : null}\n onClick={\n hasId && onSelect\n ? (e) => {\n // A mark or its menu is its own target; it must not also select the passage.\n if ((e.target as HTMLElement).closest('[data-slot=\"mark\"], [data-slot=\"mark-menu\"]'))\n return\n onSelect(e.shiftKey)\n }\n : undefined\n }\n className={cn(\n 'group relative block px-1 py-0.5',\n rounding,\n highlight === 'strong'\n ? 'bg-ai-soft text-foreground ring-1 ring-ai-accent/40'\n : highlight === 'light'\n ? 'bg-ai-soft/60 text-foreground hover:bg-ai-soft'\n : hasId && 'hover:bg-muted/50',\n hasId && isClickable && 'cursor-pointer select-none',\n // On touch every passage with an id is at least 44px tall, so the marks of consecutive\n // one-line passages keep their 44px tap areas apart. Tied to the id, which never changes,\n // not to the mark, which comes and goes while a citation run is selected: the document\n // must not jump under the finger.\n hasId && 'pointer-coarse:min-h-11'\n )}\n // The active label washes its passages in its own (dynamic) colour, kept faint.\n style={\n activeTagColor && !highlight\n ? {\n backgroundColor: `${activeTagColor}22`,\n boxShadow: `inset 3px 0 0 0 ${activeTagColor}`,\n }\n : undefined\n }\n >\n {children}\n\n {tagMark && <span className=\"absolute -left-3 top-1.5 z-10\">{tagMark}</span>}\n\n {runMarker ? (\n <span className=\"absolute -top-2.5 left-1 z-10\" data-run-marker>\n {runMarker}\n </span>\n ) : null}\n\n {mark && (\n <span className=\"absolute -top-2.5 right-0 z-10 opacity-0 transition-opacity duration-200 group-hover:opacity-100 group-focus-within:opacity-100 pointer-coarse:opacity-70 [&:has([aria-expanded=true])]:opacity-100\">\n {mark}\n </span>\n )}\n </div>\n )\n})\n\n// \u2500\u2500 Steppers \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\ninterface PassageStepperProps {\n /** 1-based position. */\n position: number\n total: number\n onStep: (delta: number) => void\n /** Test id of the stepper (none by default). */\n testId?: string\n className?: string\n prevLabel: string\n nextLabel: string\n /** Text after the count, e.g. \"cited\". */\n suffix?: string\n}\n\nconst stepButton =\n 'px-1 text-muted-foreground hover:text-foreground pointer-coarse:min-h-11 pointer-coarse:min-w-11'\n\n/** Compact \"3/9 cited\" prev/next stepper overlaid on the document. */\nfunction PassageStepper({\n position,\n total,\n onStep,\n testId,\n className,\n prevLabel,\n nextLabel,\n suffix,\n}: PassageStepperProps) {\n return (\n <span\n className={cn(\n 'inline-flex items-center gap-1 rounded-md border border-border bg-background/95 px-1.5 py-0.5',\n className\n )}\n data-slot=\"passage-stepper\"\n data-testid={testId}\n >\n <button\n type=\"button\"\n onClick={() => onStep(-1)}\n aria-label={prevLabel}\n className={stepButton}\n >\n \u2039\n </button>\n <span className=\"text-xs tabular-nums text-muted-foreground\">\n {Math.min(position, total)}/{total}\n {suffix ? ` ${suffix}` : ''}\n </span>\n <button type=\"button\" onClick={() => onStep(1)} aria-label={nextLabel} className={stepButton}>\n \u203A\n </button>\n </span>\n )\n}\n\n/** Overlay placement for the cited-passages stepper (top centre of the viewer). */\nexport function CitedRunNav({\n labels,\n testId,\n ...props\n}: Omit<PassageStepperProps, 'prevLabel' | 'nextLabel' | 'testId' | 'suffix'> & {\n labels?: Partial<HtmlViewerLabels>\n /** Overrides the stepper test id (default `note-run-nav`). */\n testId?: string\n}) {\n const l = { ...DEFAULT_HTML_VIEWER_LABELS, ...labels }\n return (\n <div className=\"absolute left-1/2 top-2 z-20 -translate-x-1/2\" data-slot=\"cited-run-nav\">\n <PassageStepper\n {...props}\n suffix={l.citedSuffix}\n prevLabel={l.previousCited}\n nextLabel={l.nextCited}\n testId={testIdOr(testId, { testId: 'note-run-nav' })}\n />\n </div>\n )\n}\n\n// \u2500\u2500 Label bar \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\nexport interface DocTagChipView {\n id: string\n name: string\n /** Fill colour (dynamic, per label). */\n color: string\n /** Passages the label marks; 0 = applies to the whole document. */\n passageCount: number\n hasNote: boolean\n title: string\n}\n\nexport interface DocTagBarProps {\n chips: DocTagChipView[]\n /** Document visibility mark on the far right; null/undefined omits it. */\n visibility?: 'shared' | 'private' | null\n /** Passage stepping over the active label's passages (parsed view only). */\n step?: { position: number; total: number; onStep: (delta: number) => void }\n /** The label currently washing its passages (parsed view only). */\n activeId?: string | null\n /** When given, chips are toggles: pick a label to mark its passages, pick it again to clear. */\n onSelect?: (id: string | null) => void\n labels?: Partial<HtmlViewerLabels>\n testIds?: Partial<DocTagBarTestIds>\n}\n\nexport interface DocTagBarTestIds {\n root: string\n nav: string\n visibility: string\n /** Replaces the whole `doc-tag-chip-<id>` id. */\n chip: (id: string) => string\n}\n\n/**\n * The document's labels along the top of a viewer: chips (toggles when `onSelect` is given, else\n * read-only marks), optional passage stepper for the active label, and the shared/private mark.\n * Draws nothing when it has nothing to say.\n */\nexport function DocTagBar({\n chips,\n visibility,\n step,\n activeId = null,\n onSelect,\n labels,\n testIds,\n}: DocTagBarProps) {\n const l = { ...DEFAULT_HTML_VIEWER_LABELS, ...labels }\n if (chips.length === 0 && !visibility) return null\n return (\n <div\n className=\"absolute left-2 right-2 top-2 z-20 flex flex-wrap items-center gap-1\"\n data-slot=\"doc-tag-bar\"\n data-testid={testIdOr(testIds?.root, { testId: 'doc-tag-bar' })}\n >\n {chips.map((c) => {\n const isActive = c.id === activeId\n const content = (\n <>\n <Tags className=\"size-3 shrink-0\" />\n {c.name}\n {c.passageCount > 0 && (\n <span className=\"tabular-nums opacity-90\">{c.passageCount}</span>\n )}\n {c.hasNote && <StickyNote className=\"size-3 opacity-90\" />}\n </>\n )\n const chipClass =\n 'inline-flex items-center gap-1.5 rounded-full border border-transparent px-2 py-0.5 text-xs text-white'\n return onSelect ? (\n <button\n key={c.id}\n type=\"button\"\n // Picking the active chip again clears it: the way back to the plain document.\n onClick={() => onSelect(isActive ? null : c.id)}\n aria-pressed={isActive}\n title={c.title}\n data-testid={testIdOr(testIds?.chip?.(c.id), { testId: `doc-tag-chip-${c.id}` })}\n data-active={isActive || undefined}\n className={cn(chipClass, 'cursor-pointer', !isActive && 'opacity-70 hover:opacity-100')}\n style={{ backgroundColor: c.color }}\n >\n {content}\n </button>\n ) : (\n <span\n key={c.id}\n title={c.title}\n data-testid={testIdOr(testIds?.chip?.(c.id), { testId: `doc-tag-chip-${c.id}` })}\n className={chipClass}\n style={{ backgroundColor: c.color }}\n >\n {content}\n </span>\n )\n })}\n\n {step && step.total > 0 && (\n <PassageStepper\n className=\"ml-1\"\n position={step.position}\n total={step.total}\n onStep={step.onStep}\n testId={testIdOr(testIds?.nav, { testId: 'doc-tag-nav' })}\n prevLabel={l.previousLabelPassage}\n nextLabel={l.nextLabelPassage}\n />\n )}\n\n {visibility && (\n <span className=\"ml-auto shrink-0\">\n <SharingEntity\n shared={visibility === 'shared'}\n data-testid={testIdOr(testIds?.visibility, { testId: 'doc-visibility-chip' })}\n />\n </span>\n )}\n </div>\n )\n}\n"],
|
|
5
|
+
"mappings": "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",
|
|
6
6
|
"names": ["HtmlPassage"]
|
|
7
7
|
}
|
|
@@ -34,12 +34,16 @@ export interface ViewerFrameProps {
|
|
|
34
34
|
children: ReactNode;
|
|
35
35
|
/** Rendered after the content area (modals owned by the viewer, e.g. crop). */
|
|
36
36
|
footer?: ReactNode;
|
|
37
|
+
/** The content alone, on black (a clean view to share or put full screen): no header. */
|
|
38
|
+
bare?: boolean;
|
|
39
|
+
/** Over the content, e.g. the control leaving the clean view. */
|
|
40
|
+
overlay?: ReactNode;
|
|
37
41
|
frameRef?: React.Ref<HTMLDivElement>;
|
|
38
42
|
className?: string;
|
|
39
43
|
testIds?: Partial<ViewerFrameTestIds>;
|
|
40
44
|
}
|
|
41
45
|
/** The document viewer shell: sticky header, optional compare row, scrolling content. */
|
|
42
|
-
export declare const ViewerFrame: ({ header, compareRow, contentId, children, footer, frameRef, className, testIds, }: ViewerFrameProps) => import("react").JSX.Element;
|
|
46
|
+
export declare const ViewerFrame: ({ header, compareRow, contentId, children, footer, frameRef, className, testIds, bare, overlay, }: ViewerFrameProps) => import("react").JSX.Element;
|
|
43
47
|
/** Centered muted status line for loading / error states inside the viewer. */
|
|
44
48
|
export declare function ViewerMessage({ children, testId }: {
|
|
45
49
|
children: ReactNode;
|
|
@@ -33,16 +33,23 @@ const ViewerFrame = ({
|
|
|
33
33
|
footer,
|
|
34
34
|
frameRef,
|
|
35
35
|
className,
|
|
36
|
-
testIds
|
|
36
|
+
testIds,
|
|
37
|
+
bare = false,
|
|
38
|
+
overlay
|
|
37
39
|
}) => /* @__PURE__ */ jsxs(
|
|
38
40
|
"div",
|
|
39
41
|
{
|
|
40
42
|
ref: frameRef,
|
|
41
|
-
className: cn(
|
|
43
|
+
className: cn(
|
|
44
|
+
"flex h-full w-full flex-col",
|
|
45
|
+
bare && "bg-black [&_[data-slot=pdf-scroller]]:bg-black",
|
|
46
|
+
className
|
|
47
|
+
),
|
|
42
48
|
"data-slot": "viewer-frame",
|
|
49
|
+
"data-bare": bare || void 0,
|
|
43
50
|
"data-testid": testIdOr(testIds?.root, { testId: "document-viewer" }),
|
|
44
51
|
children: [
|
|
45
|
-
/* @__PURE__ */ jsxs("div", { className: "sticky top-0 z-10 bg-background", children: [
|
|
52
|
+
!bare && /* @__PURE__ */ jsxs("div", { className: "sticky top-0 z-10 bg-background", children: [
|
|
46
53
|
header,
|
|
47
54
|
compareRow && /* @__PURE__ */ jsx(
|
|
48
55
|
"div",
|
|
@@ -53,12 +60,15 @@ const ViewerFrame = ({
|
|
|
53
60
|
}
|
|
54
61
|
)
|
|
55
62
|
] }),
|
|
56
|
-
/* @__PURE__ */
|
|
63
|
+
/* @__PURE__ */ jsxs(
|
|
57
64
|
"div",
|
|
58
65
|
{
|
|
59
|
-
className: "flex-1 overflow-hidden",
|
|
66
|
+
className: "relative flex-1 overflow-hidden",
|
|
60
67
|
"data-testid": testIdOr(testIds?.content, { testId: `document-viewer-content-${contentId}` }),
|
|
61
|
-
children
|
|
68
|
+
children: [
|
|
69
|
+
children,
|
|
70
|
+
overlay
|
|
71
|
+
]
|
|
62
72
|
}
|
|
63
73
|
),
|
|
64
74
|
footer
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../../src/files/ViewerChrome.tsx"],
|
|
4
|
-
"sourcesContent": ["import type { ReactNode } from 'react'\nimport {\n Check,\n ChevronLeft,\n ChevronRight,\n Crop,\n GitCompare,\n ImagePlus,\n Loader2,\n Pencil,\n X,\n ZoomIn,\n} from 'lucide-react'\nimport { Button, cn } from '@arbidocs/react/ui'\nimport { testIdOr } from '../chat/test-id'\n\n/** Every fixed string of the viewer chrome and parts. Pass a partial `labels` to translate or reword. */\nexport interface ViewerLabels {\n useAsReference: string\n useAsReferenceTitle: string\n crop: string\n cropTitle: string\n previousPage: string\n nextPage: string\n /** The zoom button's accessible name; `level` is the current zoom, e.g. \"150%\". */\n zoom: (level: string) => string\n pageInput: string\n pageOfTitle: string\n pageOf: (page: number, total: number) => string\n previewUnavailable: string\n cannotPreview: (extension: string) => string\n downloadToOpen: string\n download: string\n}\n\nexport const DEFAULT_VIEWER_LABELS: ViewerLabels = {\n useAsReference: 'Use as reference',\n useAsReferenceTitle: 'Use as reference for a new image generation',\n crop: 'Crop',\n cropTitle: 'Crop and save as a new version',\n previousPage: 'Previous page',\n nextPage: 'Next page',\n zoom: (level) => `Zoom ${level}. Click to zoom in further, then back to fit the page width.`,\n pageInput: 'Page number input',\n pageOfTitle: 'Click to go to page',\n pageOf: (page, total) => `Page ${page} of ${total}. Click to navigate.`,\n previewUnavailable: 'Preview not available',\n cannotPreview: (extension) => `${extension} files cannot be previewed in the browser.`,\n downloadToOpen: 'Download to open',\n download: 'Download',\n}\n\nexport interface ViewerFrameTestIds {\n root: string\n compareRow: string\n /** Replaces the whole `document-viewer-content-<id>` id. */\n content: string\n}\n\n// \u2500\u2500 Frame \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\nexport interface ViewerFrameProps {\n /** The sticky top bar (tabs + title + actions). */\n header: ReactNode\n /** \"Comparing against...\" chips, shown on their own row under the header when set. */\n compareRow?: ReactNode\n /** Document id; the content area's test id is `document-viewer-content-{id}`. */\n contentId: string\n children: ReactNode\n /** Rendered after the content area (modals owned by the viewer, e.g. crop). */\n footer?: ReactNode\n frameRef?: React.Ref<HTMLDivElement>\n className?: string\n testIds?: Partial<ViewerFrameTestIds>\n}\n\n/** The document viewer shell: sticky header, optional compare row, scrolling content. */\nexport const ViewerFrame = ({\n header,\n compareRow,\n contentId,\n children,\n footer,\n frameRef,\n className,\n testIds,\n}: ViewerFrameProps) => (\n <div\n ref={frameRef}\n className={cn('flex h-full w-full flex-col', className)}\n data-slot=\"viewer-frame\"\n data-testid={testIdOr(testIds?.root, { testId: 'document-viewer' })}\n >\n <div className=\"sticky top-0 z-10 bg-background\">\n {header}\n {compareRow && (\n <div\n className=\"flex flex-wrap items-center gap-1.5 border-t border-border px-3 py-1.5\"\n data-testid={testIdOr(testIds?.compareRow, { testId: 'compare-indicator-row' })}\n >\n {compareRow}\n </div>\n )}\n </div>\n <div\n className=\"flex-1 overflow-hidden\"\n data-testid={testIdOr(testIds?.content, { testId: `document-viewer-content-${contentId}` })}\n >\n {children}\n </div>\n {footer}\n </div>\n)\n\n/** Centered muted status line for loading / error states inside the viewer. */\nexport function ViewerMessage({ children, testId }: { children: ReactNode; testId?: string }) {\n return (\n <div className=\"flex h-full items-center justify-center\" data-testid={testId}>\n <div className=\"text-sm text-muted-foreground\">{children}</div>\n </div>\n )\n}\n\n// \u2500\u2500 Title \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\nexport interface ViewerTitleProps {\n title: string\n /** e.g. \"v3\". */\n versionLabel?: string | null\n /** Let the pill shrink (live artifacts share the row with more controls). */\n shrink?: boolean\n}\n\n/** Read-only document name (plain text, no fill) with the version label. */\nexport function ViewerTitle({ title, versionLabel, shrink }: ViewerTitleProps) {\n return (\n <span\n className={cn(\n 'inline-flex min-w-0 items-center gap-1.5 px-1 py-1 text-sm font-medium',\n shrink ? 'shrink' : 'shrink-0'\n )}\n title={title}\n >\n <span className=\"truncate\">{title}</span>\n {versionLabel && (\n <span className=\"shrink-0 text-xs font-normal text-muted-foreground\">{versionLabel}</span>\n )}\n </span>\n )\n}\n\n// \u2500\u2500 Actions \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\nexport interface ViewerImageActionsProps {\n compact: boolean\n /** Start a generation from the image. Omitted: not offered. */\n onUseAsReference?: () => void\n onCrop: () => void\n labels?: Partial<ViewerLabels>\n testIds?: Partial<{ useAsReference: string; crop: string }>\n}\n\n/** Image-only actions: feed it into a new generation, or crop it into a new version. */\nexport function ViewerImageActions({\n compact,\n onUseAsReference,\n onCrop,\n labels,\n testIds,\n}: ViewerImageActionsProps) {\n const l = { ...DEFAULT_VIEWER_LABELS, ...labels }\n const size = compact ? 'icon' : 'sm'\n return (\n <>\n {onUseAsReference && (\n <Button\n onClick={onUseAsReference}\n variant=\"outline\"\n size={size}\n title={l.useAsReferenceTitle}\n aria-label={l.useAsReference}\n data-testid={testIdOr(testIds?.useAsReference, {\n testId: 'image-use-as-reference-button',\n })}\n className=\"pointer-coarse:min-h-11\"\n >\n <ImagePlus className=\"size-4\" />\n {!compact && <span className=\"ml-1\">{l.useAsReference}</span>}\n </Button>\n )}\n <Button\n onClick={onCrop}\n variant=\"outline\"\n size={size}\n title={l.cropTitle}\n aria-label={l.crop}\n data-testid={testIdOr(testIds?.crop, { testId: 'image-crop-button' })}\n className=\"pointer-coarse:min-h-11\"\n >\n <Crop className=\"size-4\" />\n {!compact && <span className=\"ml-1\">{l.crop}</span>}\n </Button>\n </>\n )\n}\n\n// \u2500\u2500 PDF page navigation \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\nexport interface PdfPageNavProps {\n canPrev: boolean\n canNext: boolean\n onPrev: () => void\n onNext: () => void\n /** The \"3 / 12\" counter between the arrows (the host owns its editing behaviour). */\n counter: ReactNode\n labels?: Partial<ViewerLabels>\n testIds?: Partial<{ overlay: string; prev: string; next: string }>\n}\n\n/** Floating prev / counter / next control over a rendered PDF. */\nexport function PdfPageNav({\n canPrev,\n canNext,\n onPrev,\n onNext,\n counter,\n labels,\n testIds,\n}: PdfPageNavProps) {\n const l = { ...DEFAULT_VIEWER_LABELS, ...labels }\n return (\n <div\n className=\"absolute bottom-4 left-1/2 z-10 flex -translate-x-1/2 items-center gap-1 rounded-lg border border-border bg-background/95 px-2 py-1.5 shadow-lg backdrop-blur\"\n data-testid={testIdOr(testIds?.overlay, { testId: 'pdf-page-nav-overlay' })}\n >\n <Button\n variant=\"ghost\"\n size=\"icon\"\n className=\"size-7 shrink-0 pointer-coarse:size-11\"\n onClick={onPrev}\n disabled={!canPrev}\n aria-label={l.previousPage}\n data-testid={testIdOr(testIds?.prev, { testId: 'pdf-page-nav-prev' })}\n >\n <ChevronLeft className=\"size-4\" />\n </Button>\n {counter}\n <Button\n variant=\"ghost\"\n size=\"icon\"\n className=\"size-7 shrink-0 pointer-coarse:size-11\"\n onClick={onNext}\n disabled={!canNext}\n aria-label={l.nextPage}\n data-testid={testIdOr(testIds?.next, { testId: 'pdf-page-nav-next' })}\n >\n <ChevronRight className=\"size-4\" />\n </Button>\n </div>\n )\n}\n\n// \u2500\u2500 Zoom \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\nexport interface ViewerZoomControlProps {\n /** Multiplier of the fit-width size (1 = fit width). */\n zoom: number\n /** Steps to the next zoom level (and back to fit width after the last). */\n onCycle: () => void\n labels?: Partial<ViewerLabels>\n testIds?: Partial<{ button: string; level: string }>\n}\n\n/**\n * The viewer's zoom button, on every pointer: a docked panel on a desktop screen still leaves the\n * text too small to read, so mouse users need a way to enlarge it too. It stays quiet at fit width\n * and shows the level once zoomed; pinch and double-tap work alongside it.\n */\nexport function ViewerZoomControl({ zoom, onCycle, labels, testIds }: ViewerZoomControlProps) {\n const l = { ...DEFAULT_VIEWER_LABELS, ...labels }\n const level = `${Math.round(zoom * 100)}%`\n const isZoomed = Math.abs(zoom - 1) > 0.02\n return (\n <Button\n type=\"button\"\n variant=\"ghost\"\n onClick={onCycle}\n title={`Zoom ${level}`}\n aria-label={l.zoom(level)}\n data-testid={testIdOr(testIds?.button, { testId: 'viewer-zoom-button' })}\n className=\"absolute right-3 bottom-4 z-10 h-9 min-w-9 items-center justify-center gap-1 rounded-full border border-border bg-background/95 px-2 shadow-md backdrop-blur pointer-coarse:h-11 pointer-coarse:min-w-11 pointer-coarse:px-2.5\"\n >\n <ZoomIn className=\"size-4\" />\n {isZoomed && (\n <span\n className=\"text-xs font-medium tabular-nums\"\n data-testid={testIdOr(testIds?.level, { testId: 'viewer-zoom-level' })}\n >\n {level}\n </span>\n )}\n </Button>\n )\n}\n"],
|
|
5
|
-
"mappings": ";
|
|
4
|
+
"sourcesContent": ["import type { ReactNode } from 'react'\nimport {\n Check,\n ChevronLeft,\n ChevronRight,\n Crop,\n GitCompare,\n ImagePlus,\n Loader2,\n Pencil,\n X,\n ZoomIn,\n} from 'lucide-react'\nimport { Button, cn } from '@arbidocs/react/ui'\nimport { testIdOr } from '../chat/test-id'\n\n/** Every fixed string of the viewer chrome and parts. Pass a partial `labels` to translate or reword. */\nexport interface ViewerLabels {\n useAsReference: string\n useAsReferenceTitle: string\n crop: string\n cropTitle: string\n previousPage: string\n nextPage: string\n /** The zoom button's accessible name; `level` is the current zoom, e.g. \"150%\". */\n zoom: (level: string) => string\n pageInput: string\n pageOfTitle: string\n pageOf: (page: number, total: number) => string\n previewUnavailable: string\n cannotPreview: (extension: string) => string\n downloadToOpen: string\n download: string\n}\n\nexport const DEFAULT_VIEWER_LABELS: ViewerLabels = {\n useAsReference: 'Use as reference',\n useAsReferenceTitle: 'Use as reference for a new image generation',\n crop: 'Crop',\n cropTitle: 'Crop and save as a new version',\n previousPage: 'Previous page',\n nextPage: 'Next page',\n zoom: (level) => `Zoom ${level}. Click to zoom in further, then back to fit the page width.`,\n pageInput: 'Page number input',\n pageOfTitle: 'Click to go to page',\n pageOf: (page, total) => `Page ${page} of ${total}. Click to navigate.`,\n previewUnavailable: 'Preview not available',\n cannotPreview: (extension) => `${extension} files cannot be previewed in the browser.`,\n downloadToOpen: 'Download to open',\n download: 'Download',\n}\n\nexport interface ViewerFrameTestIds {\n root: string\n compareRow: string\n /** Replaces the whole `document-viewer-content-<id>` id. */\n content: string\n}\n\n// \u2500\u2500 Frame \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\nexport interface ViewerFrameProps {\n /** The sticky top bar (tabs + title + actions). */\n header: ReactNode\n /** \"Comparing against...\" chips, shown on their own row under the header when set. */\n compareRow?: ReactNode\n /** Document id; the content area's test id is `document-viewer-content-{id}`. */\n contentId: string\n children: ReactNode\n /** Rendered after the content area (modals owned by the viewer, e.g. crop). */\n footer?: ReactNode\n /** The content alone, on black (a clean view to share or put full screen): no header. */\n bare?: boolean\n /** Over the content, e.g. the control leaving the clean view. */\n overlay?: ReactNode\n frameRef?: React.Ref<HTMLDivElement>\n className?: string\n testIds?: Partial<ViewerFrameTestIds>\n}\n\n/** The document viewer shell: sticky header, optional compare row, scrolling content. */\nexport const ViewerFrame = ({\n header,\n compareRow,\n contentId,\n children,\n footer,\n frameRef,\n className,\n testIds,\n bare = false,\n overlay,\n}: ViewerFrameProps) => (\n <div\n ref={frameRef}\n className={cn(\n 'flex h-full w-full flex-col',\n bare && 'bg-black [&_[data-slot=pdf-scroller]]:bg-black',\n className\n )}\n data-slot=\"viewer-frame\"\n data-bare={bare || undefined}\n data-testid={testIdOr(testIds?.root, { testId: 'document-viewer' })}\n >\n {!bare && (\n <div className=\"sticky top-0 z-10 bg-background\">\n {header}\n {compareRow && (\n <div\n className=\"flex flex-wrap items-center gap-1.5 border-t border-border px-3 py-1.5\"\n data-testid={testIdOr(testIds?.compareRow, { testId: 'compare-indicator-row' })}\n >\n {compareRow}\n </div>\n )}\n </div>\n )}\n <div\n className=\"relative flex-1 overflow-hidden\"\n data-testid={testIdOr(testIds?.content, { testId: `document-viewer-content-${contentId}` })}\n >\n {children}\n {overlay}\n </div>\n {footer}\n </div>\n)\n\n/** Centered muted status line for loading / error states inside the viewer. */\nexport function ViewerMessage({ children, testId }: { children: ReactNode; testId?: string }) {\n return (\n <div className=\"flex h-full items-center justify-center\" data-testid={testId}>\n <div className=\"text-sm text-muted-foreground\">{children}</div>\n </div>\n )\n}\n\n// \u2500\u2500 Title \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\nexport interface ViewerTitleProps {\n title: string\n /** e.g. \"v3\". */\n versionLabel?: string | null\n /** Let the pill shrink (live artifacts share the row with more controls). */\n shrink?: boolean\n}\n\n/** Read-only document name (plain text, no fill) with the version label. */\nexport function ViewerTitle({ title, versionLabel, shrink }: ViewerTitleProps) {\n return (\n <span\n className={cn(\n 'inline-flex min-w-0 items-center gap-1.5 px-1 py-1 text-sm font-medium',\n shrink ? 'shrink' : 'shrink-0'\n )}\n title={title}\n >\n <span className=\"truncate\">{title}</span>\n {versionLabel && (\n <span className=\"shrink-0 text-xs font-normal text-muted-foreground\">{versionLabel}</span>\n )}\n </span>\n )\n}\n\n// \u2500\u2500 Actions \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\nexport interface ViewerImageActionsProps {\n compact: boolean\n /** Start a generation from the image. Omitted: not offered. */\n onUseAsReference?: () => void\n onCrop: () => void\n labels?: Partial<ViewerLabels>\n testIds?: Partial<{ useAsReference: string; crop: string }>\n}\n\n/** Image-only actions: feed it into a new generation, or crop it into a new version. */\nexport function ViewerImageActions({\n compact,\n onUseAsReference,\n onCrop,\n labels,\n testIds,\n}: ViewerImageActionsProps) {\n const l = { ...DEFAULT_VIEWER_LABELS, ...labels }\n const size = compact ? 'icon' : 'sm'\n return (\n <>\n {onUseAsReference && (\n <Button\n onClick={onUseAsReference}\n variant=\"outline\"\n size={size}\n title={l.useAsReferenceTitle}\n aria-label={l.useAsReference}\n data-testid={testIdOr(testIds?.useAsReference, {\n testId: 'image-use-as-reference-button',\n })}\n className=\"pointer-coarse:min-h-11\"\n >\n <ImagePlus className=\"size-4\" />\n {!compact && <span className=\"ml-1\">{l.useAsReference}</span>}\n </Button>\n )}\n <Button\n onClick={onCrop}\n variant=\"outline\"\n size={size}\n title={l.cropTitle}\n aria-label={l.crop}\n data-testid={testIdOr(testIds?.crop, { testId: 'image-crop-button' })}\n className=\"pointer-coarse:min-h-11\"\n >\n <Crop className=\"size-4\" />\n {!compact && <span className=\"ml-1\">{l.crop}</span>}\n </Button>\n </>\n )\n}\n\n// \u2500\u2500 PDF page navigation \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\nexport interface PdfPageNavProps {\n canPrev: boolean\n canNext: boolean\n onPrev: () => void\n onNext: () => void\n /** The \"3 / 12\" counter between the arrows (the host owns its editing behaviour). */\n counter: ReactNode\n labels?: Partial<ViewerLabels>\n testIds?: Partial<{ overlay: string; prev: string; next: string }>\n}\n\n/** Floating prev / counter / next control over a rendered PDF. */\nexport function PdfPageNav({\n canPrev,\n canNext,\n onPrev,\n onNext,\n counter,\n labels,\n testIds,\n}: PdfPageNavProps) {\n const l = { ...DEFAULT_VIEWER_LABELS, ...labels }\n return (\n <div\n className=\"absolute bottom-4 left-1/2 z-10 flex -translate-x-1/2 items-center gap-1 rounded-lg border border-border bg-background/95 px-2 py-1.5 shadow-lg backdrop-blur\"\n data-testid={testIdOr(testIds?.overlay, { testId: 'pdf-page-nav-overlay' })}\n >\n <Button\n variant=\"ghost\"\n size=\"icon\"\n className=\"size-7 shrink-0 pointer-coarse:size-11\"\n onClick={onPrev}\n disabled={!canPrev}\n aria-label={l.previousPage}\n data-testid={testIdOr(testIds?.prev, { testId: 'pdf-page-nav-prev' })}\n >\n <ChevronLeft className=\"size-4\" />\n </Button>\n {counter}\n <Button\n variant=\"ghost\"\n size=\"icon\"\n className=\"size-7 shrink-0 pointer-coarse:size-11\"\n onClick={onNext}\n disabled={!canNext}\n aria-label={l.nextPage}\n data-testid={testIdOr(testIds?.next, { testId: 'pdf-page-nav-next' })}\n >\n <ChevronRight className=\"size-4\" />\n </Button>\n </div>\n )\n}\n\n// \u2500\u2500 Zoom \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\nexport interface ViewerZoomControlProps {\n /** Multiplier of the fit-width size (1 = fit width). */\n zoom: number\n /** Steps to the next zoom level (and back to fit width after the last). */\n onCycle: () => void\n labels?: Partial<ViewerLabels>\n testIds?: Partial<{ button: string; level: string }>\n}\n\n/**\n * The viewer's zoom button, on every pointer: a docked panel on a desktop screen still leaves the\n * text too small to read, so mouse users need a way to enlarge it too. It stays quiet at fit width\n * and shows the level once zoomed; pinch and double-tap work alongside it.\n */\nexport function ViewerZoomControl({ zoom, onCycle, labels, testIds }: ViewerZoomControlProps) {\n const l = { ...DEFAULT_VIEWER_LABELS, ...labels }\n const level = `${Math.round(zoom * 100)}%`\n const isZoomed = Math.abs(zoom - 1) > 0.02\n return (\n <Button\n type=\"button\"\n variant=\"ghost\"\n onClick={onCycle}\n title={`Zoom ${level}`}\n aria-label={l.zoom(level)}\n data-testid={testIdOr(testIds?.button, { testId: 'viewer-zoom-button' })}\n className=\"absolute right-3 bottom-4 z-10 h-9 min-w-9 items-center justify-center gap-1 rounded-full border border-border bg-background/95 px-2 shadow-md backdrop-blur pointer-coarse:h-11 pointer-coarse:min-w-11 pointer-coarse:px-2.5\"\n >\n <ZoomIn className=\"size-4\" />\n {isZoomed && (\n <span\n className=\"text-xs font-medium tabular-nums\"\n data-testid={testIdOr(testIds?.level, { testId: 'viewer-zoom-level' })}\n >\n {level}\n </span>\n )}\n </Button>\n )\n}\n"],
|
|
5
|
+
"mappings": "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",
|
|
6
6
|
"names": []
|
|
7
7
|
}
|