@arbidocs/react 0.5.110 → 0.5.112
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/PdfViewerImpl-QUSDLNNM.cjs +380 -0
- package/dist/PdfViewerImpl-QUSDLNNM.cjs.map +1 -0
- package/dist/{PdfViewer.d-bQH9yxFg.d.cts → PdfViewerImpl.d-B28hLEuj.d.ts} +8 -1
- package/dist/account/client.js +96 -0
- package/dist/account/client.js.map +7 -0
- package/dist/account/delete.js +70 -0
- package/dist/account/delete.js.map +7 -0
- package/dist/account/didit.js +34 -0
- package/dist/account/didit.js.map +7 -0
- package/dist/account/dismissed-tips.js +33 -0
- package/dist/account/dismissed-tips.js.map +7 -0
- package/dist/account/email.js +84 -0
- package/dist/account/email.js.map +7 -0
- package/dist/account/entitlements.js +47 -0
- package/dist/account/entitlements.js.map +7 -0
- package/dist/account/identity.js +270 -0
- package/dist/account/identity.js.map +7 -0
- package/dist/account/index.js +93 -0
- package/dist/account/index.js.map +7 -0
- package/dist/account/notifications.js +59 -0
- package/dist/account/notifications.js.map +7 -0
- package/dist/account/password.js +103 -0
- package/dist/account/password.js.map +7 -0
- package/dist/account/profile.js +116 -0
- package/dist/account/profile.js.map +7 -0
- package/dist/account/recovery.js +13 -0
- package/dist/account/recovery.js.map +7 -0
- package/dist/account/relevance.js +82 -0
- package/dist/account/relevance.js.map +7 -0
- package/dist/account/sessions.js +37 -0
- package/dist/account/sessions.js.map +7 -0
- package/dist/account/settings.js +39 -0
- package/dist/account/settings.js.map +7 -0
- package/dist/account/table-views.js +16 -0
- package/dist/account/table-views.js.map +7 -0
- package/dist/ai/AiAnswer.js +83 -0
- package/dist/ai/AiAnswer.js.map +7 -0
- package/dist/ai/AiMarkdown.js +40 -0
- package/dist/ai/AiMarkdown.js.map +7 -0
- package/dist/ai/ArtifactCanvas.js +193 -0
- package/dist/ai/ArtifactCanvas.js.map +7 -0
- package/dist/ai/CitationRenderer.js +413 -0
- package/dist/ai/CitationRenderer.js.map +7 -0
- package/dist/{chunk-WL2Y2T47.js → ai/MarkdownRenderer.js} +35 -101
- package/dist/ai/MarkdownRenderer.js.map +7 -0
- package/dist/ai/MessageArtifactCard.js +75 -0
- package/dist/ai/MessageArtifactCard.js.map +7 -0
- package/dist/ai/PassageCard.js +79 -0
- package/dist/ai/PassageCard.js.map +7 -0
- package/dist/ai/engine.js +110 -0
- package/dist/ai/engine.js.map +7 -0
- package/dist/ai/index.js +63 -0
- package/dist/ai/index.js.map +7 -0
- package/dist/ai/markdown-base-components.js +37 -0
- package/dist/ai/markdown-base-components.js.map +7 -0
- package/dist/ai/markdown-streaming-context.js +6 -0
- package/dist/ai/markdown-streaming-context.js.map +7 -0
- package/dist/{chunk-VSCU7K4V.js → ai/normalize-citations.js} +12 -19
- package/dist/ai/normalize-citations.js.map +7 -0
- package/dist/ai/redline.js +41 -0
- package/dist/ai/redline.js.map +7 -0
- package/dist/ai/split-markdown-blocks.js +40 -0
- package/dist/ai/split-markdown-blocks.js.map +7 -0
- package/dist/{chunk-UW2SGTI5.js → ai/stored-markdown.js} +41 -93
- package/dist/ai/stored-markdown.js.map +7 -0
- package/dist/annotations/AnnotationPageOverlay.js +807 -0
- package/dist/annotations/AnnotationPageOverlay.js.map +7 -0
- package/dist/annotations/AnnotationToolbar.js +398 -0
- package/dist/annotations/AnnotationToolbar.js.map +7 -0
- package/dist/annotations/FreezeDialog.js +170 -0
- package/dist/annotations/FreezeDialog.js.map +7 -0
- package/dist/annotations/ProductionDialog.js +354 -0
- package/dist/annotations/ProductionDialog.js.map +7 -0
- package/dist/annotations/controller.js +49 -0
- package/dist/annotations/controller.js.map +7 -0
- package/dist/annotations/freeze/browser.js +21 -0
- package/dist/annotations/freeze/browser.js.map +7 -0
- package/dist/annotations/freeze/bundle.js +201 -0
- package/dist/annotations/freeze/bundle.js.map +7 -0
- package/dist/annotations/freeze/coords.js +37 -0
- package/dist/annotations/freeze/coords.js.map +7 -0
- package/dist/annotations/freeze/freeze.js +261 -0
- package/dist/annotations/freeze/freeze.js.map +7 -0
- package/dist/annotations/freeze/hash.js +28 -0
- package/dist/annotations/freeze/hash.js.map +7 -0
- package/dist/annotations/freeze/index-page.js +78 -0
- package/dist/annotations/freeze/index-page.js.map +7 -0
- package/dist/annotations/freeze/index.d.ts +1 -1
- package/dist/annotations/freeze/index.js +28 -22
- package/dist/annotations/freeze/index.js.map +7 -1
- package/dist/annotations/freeze/raster.js +208 -0
- package/dist/annotations/freeze/raster.js.map +7 -0
- package/dist/annotations/freeze/stamp.js +117 -0
- package/dist/annotations/freeze/stamp.js.map +7 -0
- package/dist/annotations/freeze/types.js +14 -0
- package/dist/annotations/freeze/types.js.map +7 -0
- package/dist/annotations/freeze/vector.js +283 -0
- package/dist/annotations/freeze/vector.js.map +7 -0
- package/dist/annotations/geometry.js +81 -0
- package/dist/annotations/geometry.js.map +7 -0
- package/dist/annotations/index.js +125 -6
- package/dist/annotations/index.js.map +7 -1
- package/dist/annotations/merge.js +53 -0
- package/dist/annotations/merge.js.map +7 -0
- package/dist/{chunk-T3USOSVN.js → annotations/model.js} +23 -16
- package/dist/annotations/model.js.map +7 -0
- package/dist/annotations/overlay-geometry.js +41 -0
- package/dist/annotations/overlay-geometry.js.map +7 -0
- package/dist/annotations/redaction-log.js +33 -0
- package/dist/annotations/redaction-log.js.map +7 -0
- package/dist/annotations/selection-marks.js +122 -0
- package/dist/annotations/selection-marks.js.map +7 -0
- package/dist/annotations/state.js +140 -0
- package/dist/annotations/state.js.map +7 -0
- package/dist/annotations/store.js +49 -0
- package/dist/annotations/store.js.map +7 -0
- package/dist/annotations/useAnnotationLayer.js +306 -0
- package/dist/annotations/useAnnotationLayer.js.map +7 -0
- package/dist/annotations/useAnnotationShortcuts.js +31 -0
- package/dist/annotations/useAnnotationShortcuts.js.map +7 -0
- package/dist/annotations/useTextSelectionMarks.js +100 -0
- package/dist/annotations/useTextSelectionMarks.js.map +7 -0
- package/dist/artifacts/artifact-kind.js +19 -0
- package/dist/artifacts/artifact-kind.js.map +7 -0
- package/dist/artifacts/index.cjs +13 -13
- package/dist/artifacts/index.js +89 -571
- package/dist/artifacts/index.js.map +7 -1
- package/dist/{chunk-WUTL62MC.js → artifacts/normalize-markdown.js} +12 -14
- package/dist/artifacts/normalize-markdown.js.map +7 -0
- package/dist/artifacts/redline-core.js +12 -3
- package/dist/artifacts/redline-core.js.map +7 -1
- package/dist/{chunk-74N436VK.js → artifacts/redline-diff.js} +10 -9
- package/dist/artifacts/redline-diff.js.map +7 -0
- package/dist/artifacts/redline-engine.js +14 -0
- package/dist/artifacts/redline-engine.js.map +7 -0
- package/dist/artifacts/renderArtifactMarkdown.js +9 -0
- package/dist/artifacts/renderArtifactMarkdown.js.map +7 -0
- package/dist/artifacts/useArtifactEditSession.js +183 -0
- package/dist/artifacts/useArtifactEditSession.js.map +7 -0
- package/dist/artifacts/useArtifactSession.js +173 -0
- package/dist/artifacts/useArtifactSession.js.map +7 -0
- package/dist/artifacts/useArtifactSource.js +16 -0
- package/dist/artifacts/useArtifactSource.js.map +7 -0
- package/dist/artifacts/useArtifactText.js +78 -0
- package/dist/artifacts/useArtifactText.js.map +7 -0
- package/dist/artifacts/useRedline.js +65 -0
- package/dist/artifacts/useRedline.js.map +7 -0
- package/dist/artifacts/useStreamedArtifact.js +74 -0
- package/dist/artifacts/useStreamedArtifact.js.map +7 -0
- package/dist/artifacts/versions.js +68 -0
- package/dist/artifacts/versions.js.map +7 -0
- package/dist/billing.js +200 -0
- package/dist/billing.js.map +7 -0
- package/dist/boot-timeout.js +19 -0
- package/dist/boot-timeout.js.map +7 -0
- package/dist/calendar/accounts.js +213 -0
- package/dist/calendar/accounts.js.map +7 -0
- package/dist/calendar/hooks.js +409 -0
- package/dist/calendar/hooks.js.map +7 -0
- package/dist/calendar/index.js +31 -0
- package/dist/calendar/index.js.map +7 -0
- package/dist/calendar/keys.js +5 -0
- package/dist/calendar/keys.js.map +7 -0
- package/dist/calendar/offline/outbox.js +231 -0
- package/dist/calendar/offline/outbox.js.map +7 -0
- package/dist/calendar/offline/runtime.js +109 -0
- package/dist/calendar/offline/runtime.js.map +7 -0
- package/dist/calendar/offline/support.js +41 -0
- package/dist/calendar/offline/support.js.map +7 -0
- package/dist/calendar/support.js +34 -0
- package/dist/calendar/support.js.map +7 -0
- package/dist/calls/actions.js +226 -0
- package/dist/calls/actions.js.map +7 -0
- package/dist/calls/events.js +138 -0
- package/dist/calls/events.js.map +7 -0
- package/dist/calls/gate.js +19 -0
- package/dist/calls/gate.js.map +7 -0
- package/dist/calls/hooks.js +115 -0
- package/dist/calls/hooks.js.map +7 -0
- package/dist/calls/in-call-chat.js +132 -0
- package/dist/calls/in-call-chat.js.map +7 -0
- package/dist/calls/index.js +24 -0
- package/dist/calls/index.js.map +7 -0
- package/dist/calls/keys.js +17 -0
- package/dist/calls/keys.js.map +7 -0
- package/dist/calls/livekit/index.cjs +48 -48
- package/dist/calls/livekit/index.js +6 -958
- package/dist/calls/livekit/index.js.map +7 -1
- package/dist/calls/livekit/room.js +98 -0
- package/dist/calls/livekit/room.js.map +7 -0
- package/dist/calls/livekit/useCallRecorder.js +219 -0
- package/dist/calls/livekit/useCallRecorder.js.map +7 -0
- package/dist/calls/livekit/useCallTranscriber.js +309 -0
- package/dist/calls/livekit/useCallTranscriber.js.map +7 -0
- package/dist/calls/livekit/useHostMuteNotice.js +29 -0
- package/dist/calls/livekit/useHostMuteNotice.js.map +7 -0
- package/dist/calls/livekit/useInCallChat.js +161 -0
- package/dist/calls/livekit/useInCallChat.js.map +7 -0
- package/dist/calls/livekit/useWebinar.js +239 -0
- package/dist/calls/livekit/useWebinar.js.map +7 -0
- package/dist/calls/meeting-chat.js +149 -0
- package/dist/calls/meeting-chat.js.map +7 -0
- package/dist/calls/moderation.js +50 -0
- package/dist/calls/moderation.js.map +7 -0
- package/dist/calls/open-meeting-chat.js +29 -0
- package/dist/calls/open-meeting-chat.js.map +7 -0
- package/dist/calls/read-only.js +24 -0
- package/dist/calls/read-only.js.map +7 -0
- package/dist/calls/recording-media.js +218 -0
- package/dist/calls/recording-media.js.map +7 -0
- package/dist/calls/recording-playback.js +260 -0
- package/dist/calls/recording-playback.js.map +7 -0
- package/dist/calls/recording.js +268 -0
- package/dist/calls/recording.js.map +7 -0
- package/dist/calls/save-to-thread.js +80 -0
- package/dist/calls/save-to-thread.js.map +7 -0
- package/dist/calls/session.js +134 -0
- package/dist/calls/session.js.map +7 -0
- package/dist/calls/transcript-format.js +147 -0
- package/dist/calls/transcript-format.js.map +7 -0
- package/dist/calls/transcription.js +101 -0
- package/dist/calls/transcription.js.map +7 -0
- package/dist/calls/webinar.js +71 -0
- package/dist/calls/webinar.js.map +7 -0
- package/dist/charge-watch.js +71 -0
- package/dist/charge-watch.js.map +7 -0
- package/dist/chat/ChatBubble.js +146 -0
- package/dist/chat/ChatBubble.js.map +7 -0
- package/dist/chat/ConversationScope.js +30 -0
- package/dist/chat/ConversationScope.js.map +7 -0
- package/dist/chat/active-config.js +20 -0
- package/dist/chat/active-config.js.map +7 -0
- package/dist/chat/agent-chat-owner.js +25 -0
- package/dist/chat/agent-chat-owner.js.map +7 -0
- package/dist/chat/chat-artifacts.js +64 -0
- package/dist/chat/chat-artifacts.js.map +7 -0
- package/dist/chat/citations.js +32 -0
- package/dist/chat/citations.js.map +7 -0
- package/dist/chat/config-model.js +10 -0
- package/dist/chat/config-model.js.map +7 -0
- package/dist/chat/conversation-cache.js +676 -0
- package/dist/chat/conversation-cache.js.map +7 -0
- package/dist/chat/conversation-events.js +57 -0
- package/dist/chat/conversation-events.js.map +7 -0
- package/dist/chat/conversation-mentions.js +58 -0
- package/dist/chat/conversation-mentions.js.map +7 -0
- package/dist/chat/conversation-workspace.js +58 -0
- package/dist/chat/conversation-workspace.js.map +7 -0
- package/dist/chat/mentions.js +116 -0
- package/dist/chat/mentions.js.map +7 -0
- package/dist/chat/open-document.js +106 -0
- package/dist/chat/open-document.js.map +7 -0
- package/dist/chat/orphaned.js +44 -0
- package/dist/chat/orphaned.js.map +7 -0
- package/dist/chat/pendingFirstTurn.js +30 -0
- package/dist/chat/pendingFirstTurn.js.map +7 -0
- package/dist/chat/reply-target.js +12 -0
- package/dist/chat/reply-target.js.map +7 -0
- package/dist/chat/run-finished.js +28 -0
- package/dist/chat/run-finished.js.map +7 -0
- package/dist/chat/run-state.js +91 -0
- package/dist/chat/run-state.js.map +7 -0
- package/dist/chat/stream-handlers.js +419 -0
- package/dist/chat/stream-handlers.js.map +7 -0
- package/dist/chat/thread-binding.js +76 -0
- package/dist/chat/thread-binding.js.map +7 -0
- package/dist/chat/thread-document.js +53 -0
- package/dist/chat/thread-document.js.map +7 -0
- package/dist/chat/turn-control.js +79 -0
- package/dist/chat/turn-control.js.map +7 -0
- package/dist/chat/useAgentRunControl.js +36 -0
- package/dist/chat/useAgentRunControl.js.map +7 -0
- package/dist/chat/useAnswerAgentQuestion.js +19 -0
- package/dist/chat/useAnswerAgentQuestion.js.map +7 -0
- package/dist/chat/useAskAgain.js +32 -0
- package/dist/chat/useAskAgain.js.map +7 -0
- package/dist/chat/useAutoSendDraft.js +17 -0
- package/dist/chat/useAutoSendDraft.js.map +7 -0
- package/dist/chat/useBranchNavigation.js +97 -0
- package/dist/chat/useBranchNavigation.js.map +7 -0
- package/dist/chat/useConnectRunStream.js +169 -0
- package/dist/chat/useConnectRunStream.js.map +7 -0
- package/dist/chat/useConversation.js +431 -0
- package/dist/chat/useConversation.js.map +7 -0
- package/dist/chat/useConversationActions.js +662 -0
- package/dist/chat/useConversationActions.js.map +7 -0
- package/dist/chat/useConversationData.js +143 -0
- package/dist/chat/useConversationData.js.map +7 -0
- package/dist/chat/useConversationDocuments.js +41 -0
- package/dist/chat/useConversationDocuments.js.map +7 -0
- package/dist/chat/useConversationSettings.js +78 -0
- package/dist/chat/useConversationSettings.js.map +7 -0
- package/dist/chat/useConversationTurn.js +31 -0
- package/dist/chat/useConversationTurn.js.map +7 -0
- package/dist/chat/useConversationWorkspace.js +12 -0
- package/dist/chat/useConversationWorkspace.js.map +7 -0
- package/dist/chat/useDeleteMessage.js +15 -0
- package/dist/chat/useDeleteMessage.js.map +7 -0
- package/dist/chat/useDocumentAutoAdd.js +73 -0
- package/dist/chat/useDocumentAutoAdd.js.map +7 -0
- package/dist/chat/useMessageTimer.js +39 -0
- package/dist/chat/useMessageTimer.js.map +7 -0
- package/dist/chat/useThinkingContent.js +67 -0
- package/dist/chat/useThinkingContent.js.map +7 -0
- package/dist/chat/useThreadDocument.js +61 -0
- package/dist/chat/useThreadDocument.js.map +7 -0
- package/dist/chat/workflow-run-titles.js +50 -0
- package/dist/chat/workflow-run-titles.js.map +7 -0
- package/dist/{chunk-W2FATOTX.cjs → chunk-3JAEX57E.cjs} +4 -4
- package/dist/{chunk-W2FATOTX.cjs.map → chunk-3JAEX57E.cjs.map} +1 -1
- package/dist/{chunk-HD5H2PPP.cjs → chunk-5TRUFWKT.cjs} +66 -66
- package/dist/{chunk-HD5H2PPP.cjs.map → chunk-5TRUFWKT.cjs.map} +1 -1
- package/dist/{chunk-Z3W4XFWB.cjs → chunk-C72FSQUE.cjs} +3 -3
- package/dist/{chunk-Z3W4XFWB.cjs.map → chunk-C72FSQUE.cjs.map} +1 -1
- package/dist/{chunk-LBAG7KL7.cjs → chunk-FQVNZCTD.cjs} +3 -3
- package/dist/{chunk-LBAG7KL7.cjs.map → chunk-FQVNZCTD.cjs.map} +1 -1
- package/dist/{chunk-RVUGSM65.cjs → chunk-GKGAPU6T.cjs} +44 -44
- package/dist/{chunk-RVUGSM65.cjs.map → chunk-GKGAPU6T.cjs.map} +1 -1
- package/dist/{chunk-7LIMHY56.cjs → chunk-O32T7XRD.cjs} +3 -3
- package/dist/{chunk-7LIMHY56.cjs.map → chunk-O32T7XRD.cjs.map} +1 -1
- package/dist/chunk-PWGSIM3F.cjs +291 -0
- package/dist/chunk-PWGSIM3F.cjs.map +1 -0
- package/dist/chunk-QP3WQSAA.cjs +23 -0
- package/dist/chunk-QP3WQSAA.cjs.map +1 -0
- package/dist/chunk-T5FZICXN.cjs +50 -0
- package/dist/chunk-T5FZICXN.cjs.map +1 -0
- package/dist/{chunk-QF2BW6HZ.cjs → chunk-UDDJIUHJ.cjs} +38 -38
- package/dist/{chunk-QF2BW6HZ.cjs.map → chunk-UDDJIUHJ.cjs.map} +1 -1
- package/dist/{chunk-5HDKL6XB.cjs → chunk-YMB6XUR2.cjs} +57 -57
- package/dist/{chunk-5HDKL6XB.cjs.map → chunk-YMB6XUR2.cjs.map} +1 -1
- package/dist/config/config-hooks.js +209 -0
- package/dist/config/config-hooks.js.map +7 -0
- package/dist/connectivity.js +72 -0
- package/dist/connectivity.js.map +7 -0
- package/dist/connectors/hooks.js +263 -0
- package/dist/connectors/hooks.js.map +7 -0
- package/dist/connectors/index.js +28 -0
- package/dist/connectors/index.js.map +7 -0
- package/dist/contacts.js +100 -0
- package/dist/contacts.js.map +7 -0
- package/dist/conversation-list.js +65 -0
- package/dist/conversation-list.js.map +7 -0
- package/dist/databases.js +195 -0
- package/dist/databases.js.map +7 -0
- package/dist/datasets/aggregate.js +281 -0
- package/dist/datasets/aggregate.js.map +7 -0
- package/dist/datasets/index.js +122 -0
- package/dist/datasets/index.js.map +7 -0
- package/dist/datasets/members.js +27 -0
- package/dist/datasets/members.js.map +7 -0
- package/dist/datasets/panel.js +44 -0
- package/dist/datasets/panel.js.map +7 -0
- package/dist/datasets/registry.js +47 -0
- package/dist/datasets/registry.js.map +7 -0
- package/dist/datasets/rows-source.js +44 -0
- package/dist/datasets/rows-source.js.map +7 -0
- package/dist/datasets/sources/activity.js +83 -0
- package/dist/datasets/sources/activity.js.map +7 -0
- package/dist/datasets/sources/conversations.js +74 -0
- package/dist/datasets/sources/conversations.js.map +7 -0
- package/dist/datasets/sources/database.js +209 -0
- package/dist/datasets/sources/database.js.map +7 -0
- package/dist/datasets/sources/documents.js +93 -0
- package/dist/datasets/sources/documents.js.map +7 -0
- package/dist/datasets/sources/facts.js +56 -0
- package/dist/datasets/sources/facts.js.map +7 -0
- package/dist/datasets/sources/projects.js +117 -0
- package/dist/datasets/sources/projects.js.map +7 -0
- package/dist/datasets/sources/tags.js +67 -0
- package/dist/datasets/sources/tags.js.map +7 -0
- package/dist/datasets/sources/usage.js +268 -0
- package/dist/datasets/sources/usage.js.map +7 -0
- package/dist/datasets/sources/workflows.js +91 -0
- package/dist/datasets/sources/workflows.js.map +7 -0
- package/dist/datasets/sources/workspaces.js +67 -0
- package/dist/datasets/sources/workspaces.js.map +7 -0
- package/dist/datasets/store.js +194 -0
- package/dist/datasets/store.js.map +7 -0
- package/dist/datasets/types.js +14 -0
- package/dist/datasets/types.js.map +7 -0
- package/dist/directmessages/ConversationList.js +148 -0
- package/dist/directmessages/ConversationList.js.map +7 -0
- package/dist/directmessages/DateSeparator.js +8 -0
- package/dist/directmessages/DateSeparator.js.map +7 -0
- package/dist/directmessages/DmAvatar.js +29 -0
- package/dist/directmessages/DmAvatar.js.map +7 -0
- package/dist/directmessages/DmComposer.js +201 -0
- package/dist/directmessages/DmComposer.js.map +7 -0
- package/dist/directmessages/arrivals.js +29 -0
- package/dist/directmessages/arrivals.js.map +7 -0
- package/dist/directmessages/chat-cache.js +192 -0
- package/dist/directmessages/chat-cache.js.map +7 -0
- package/dist/directmessages/grouping.js +26 -0
- package/dist/directmessages/grouping.js.map +7 -0
- package/dist/directmessages/index.js +81 -0
- package/dist/directmessages/index.js.map +7 -0
- package/dist/directmessages/useChats.js +266 -0
- package/dist/directmessages/useChats.js.map +7 -0
- package/dist/directmessages/utils.js +23 -0
- package/dist/directmessages/utils.js.map +7 -0
- package/dist/document-tools/can-annotate.js +7 -0
- package/dist/document-tools/can-annotate.js.map +7 -0
- package/dist/document-tools/core.cjs +99 -99
- package/dist/document-tools/core.d.ts +2 -2
- package/dist/document-tools/core.js +218 -12
- package/dist/document-tools/core.js.map +7 -1
- package/dist/document-tools/document-pdf.js +76 -0
- package/dist/document-tools/document-pdf.js.map +7 -0
- package/dist/document-tools/environment.js +136 -0
- package/dist/document-tools/environment.js.map +7 -0
- package/dist/document-tools/file-shares.js +112 -0
- package/dist/document-tools/file-shares.js.map +7 -0
- package/dist/document-tools/frozen-copy.js +27 -0
- package/dist/document-tools/frozen-copy.js.map +7 -0
- package/dist/document-tools/index.cjs +101 -101
- package/dist/document-tools/index.d.ts +1 -1
- package/dist/document-tools/index.js +26 -148
- package/dist/document-tools/index.js.map +7 -1
- package/dist/document-tools/markup-download.js +51 -0
- package/dist/document-tools/markup-download.js.map +7 -0
- package/dist/document-tools/markup-store.js +138 -0
- package/dist/document-tools/markup-store.js.map +7 -0
- package/dist/document-tools/markup-transfer.js +88 -0
- package/dist/document-tools/markup-transfer.js.map +7 -0
- package/dist/document-tools/production.js +147 -0
- package/dist/document-tools/production.js.map +7 -0
- package/dist/document-tools/saved-signature.js +90 -0
- package/dist/document-tools/saved-signature.js.map +7 -0
- package/dist/document-tools/signature-requests.js +310 -0
- package/dist/document-tools/signature-requests.js.map +7 -0
- package/dist/document-tools/signing.js +127 -0
- package/dist/document-tools/signing.js.map +7 -0
- package/dist/document-tools/useDocumentBytes.js +38 -0
- package/dist/document-tools/useDocumentBytes.js.map +7 -0
- package/dist/document-tools/useDocumentMarkup.js +154 -0
- package/dist/document-tools/useDocumentMarkup.js.map +7 -0
- package/dist/document-tools/useIsOnline.js +13 -0
- package/dist/document-tools/useIsOnline.js.map +7 -0
- package/dist/document-tools/verification.js +60 -0
- package/dist/document-tools/verification.js.map +7 -0
- package/dist/documents/DocumentReview.js +220 -0
- package/dist/documents/DocumentReview.js.map +7 -0
- package/dist/documents/DraftTitleControls.js +41 -0
- package/dist/documents/DraftTitleControls.js.map +7 -0
- package/dist/documents/InlineMicButton.js +90 -0
- package/dist/documents/InlineMicButton.js.map +7 -0
- package/dist/documents/MicRecordingOverlay.js +29 -0
- package/dist/documents/MicRecordingOverlay.js.map +7 -0
- package/dist/documents/MicWaveformIndicator.js +68 -0
- package/dist/documents/MicWaveformIndicator.js.map +7 -0
- package/dist/documents/PhotoCapture.js +120 -0
- package/dist/documents/PhotoCapture.js.map +7 -0
- package/dist/documents/VideoCapture.js +129 -0
- package/dist/documents/VideoCapture.js.map +7 -0
- package/dist/documents/VoiceNoteRecorder.js +166 -0
- package/dist/documents/VoiceNoteRecorder.js.map +7 -0
- package/dist/documents/audio-segmenter.js +63 -0
- package/dist/documents/audio-segmenter.js.map +7 -0
- package/dist/documents/capture-frame.js +21 -0
- package/dist/documents/capture-frame.js.map +7 -0
- package/dist/documents/chunked-recorder.js +190 -0
- package/dist/documents/chunked-recorder.js.map +7 -0
- package/dist/documents/document-download.js +53 -0
- package/dist/documents/document-download.js.map +7 -0
- package/dist/documents/document-fields.js +109 -0
- package/dist/documents/document-fields.js.map +7 -0
- package/dist/documents/documents-cache.js +110 -0
- package/dist/documents/documents-cache.js.map +7 -0
- package/dist/documents/documents-data.js +128 -0
- package/dist/documents/documents-data.js.map +7 -0
- package/dist/documents/documents-loader.js +113 -0
- package/dist/documents/documents-loader.js.map +7 -0
- package/dist/documents/documents-writes.js +448 -0
- package/dist/documents/documents-writes.js.map +7 -0
- package/dist/documents/format-elapsed.js +10 -0
- package/dist/documents/format-elapsed.js.map +7 -0
- package/dist/documents/has-video-track.js +26 -0
- package/dist/documents/has-video-track.js.map +7 -0
- package/dist/documents/index.js +266 -0
- package/dist/documents/index.js.map +7 -0
- package/dist/documents/media-error.js +18 -0
- package/dist/documents/media-error.js.map +7 -0
- package/dist/documents/offline-documents.js +160 -0
- package/dist/documents/offline-documents.js.map +7 -0
- package/dist/documents/pending-sync.js +210 -0
- package/dist/documents/pending-sync.js.map +7 -0
- package/dist/documents/processing-live.js +122 -0
- package/dist/documents/processing-live.js.map +7 -0
- package/dist/documents/processing-order.js +59 -0
- package/dist/documents/processing-order.js.map +7 -0
- package/dist/documents/processing-settle.js +21 -0
- package/dist/documents/processing-settle.js.map +7 -0
- package/dist/documents/related-documents.js +133 -0
- package/dist/documents/related-documents.js.map +7 -0
- package/dist/documents/support.js +29 -0
- package/dist/documents/support.js.map +7 -0
- package/dist/documents/upload-files.js +169 -0
- package/dist/documents/upload-files.js.map +7 -0
- package/dist/documents/useAudioRecorder.js +315 -0
- package/dist/documents/useAudioRecorder.js.map +7 -0
- package/dist/documents/useCameraStream.js +35 -0
- package/dist/documents/useCameraStream.js.map +7 -0
- package/dist/documents/useDocumentThumbnails.js +71 -0
- package/dist/documents/useDocumentThumbnails.js.map +7 -0
- package/dist/documents/useDownloadDocuments.js +90 -0
- package/dist/documents/useDownloadDocuments.js.map +7 -0
- package/dist/documents/usePassageQuotes.js +37 -0
- package/dist/documents/usePassageQuotes.js.map +7 -0
- package/dist/documents/useUploadFiles.js +165 -0
- package/dist/documents/useUploadFiles.js.map +7 -0
- package/dist/documents/useUploadFromUrls.js +63 -0
- package/dist/documents/useUploadFromUrls.js.map +7 -0
- package/dist/documents/useVideoRecorder.js +62 -0
- package/dist/documents/useVideoRecorder.js.map +7 -0
- package/dist/entities/AgentMarkers.js +61 -0
- package/dist/entities/AgentMarkers.js.map +7 -0
- package/dist/entities/DocumentEntity.js +125 -0
- package/dist/entities/DocumentEntity.js.map +7 -0
- package/dist/entities/EntityPill.js +250 -0
- package/dist/entities/EntityPill.js.map +7 -0
- package/dist/entities/ProjectEntity.js +61 -0
- package/dist/entities/ProjectEntity.js.map +7 -0
- package/dist/entities/ShieldIcon.js +49 -0
- package/dist/entities/ShieldIcon.js.map +7 -0
- package/dist/entities/TagEntity.js +79 -0
- package/dist/entities/TagEntity.js.map +7 -0
- package/dist/entities/ThreadVisibilityIcon.js +15 -0
- package/dist/entities/ThreadVisibilityIcon.js.map +7 -0
- package/dist/entities/UserEntity.js +211 -0
- package/dist/entities/UserEntity.js.map +7 -0
- package/dist/entities/VerifiedBadge.js +19 -0
- package/dist/entities/VerifiedBadge.js.map +7 -0
- package/dist/entities/agent-avatar-colors.js +26 -0
- package/dist/entities/agent-avatar-colors.js.map +7 -0
- package/dist/entities/colors.js +64 -0
- package/dist/entities/colors.js.map +7 -0
- package/dist/entities/file-type.js +151 -0
- package/dist/entities/file-type.js.map +7 -0
- package/dist/entities/index.js +100 -0
- package/dist/entities/index.js.map +7 -0
- package/dist/entities/media-type.js +61 -0
- package/dist/entities/media-type.js.map +7 -0
- package/dist/entities/registry.js +385 -0
- package/dist/entities/registry.js.map +7 -0
- package/dist/entities/status.js +43 -0
- package/dist/entities/status.js.map +7 -0
- package/dist/entities/tag-kinds.js +23 -0
- package/dist/entities/tag-kinds.js.map +7 -0
- package/dist/entities/tag-types.js +44 -0
- package/dist/entities/tag-types.js.map +7 -0
- package/dist/entities/vocabulary.js +12 -0
- package/dist/entities/vocabulary.js.map +7 -0
- package/dist/entity-extraction.js +25 -0
- package/dist/entity-extraction.js.map +7 -0
- package/dist/facts-search.js +57 -0
- package/dist/facts-search.js.map +7 -0
- package/dist/facts.js +69 -0
- package/dist/facts.js.map +7 -0
- package/dist/hooks.js +320 -0
- package/dist/hooks.js.map +7 -0
- package/dist/host/ArbiHost.js +24 -0
- package/dist/host/ArbiHost.js.map +7 -0
- package/dist/host/assistant-copy.js +54 -0
- package/dist/host/assistant-copy.js.map +7 -0
- package/dist/host/config.js +9 -0
- package/dist/host/config.js.map +7 -0
- package/dist/host/context.js +10 -0
- package/dist/host/context.js.map +7 -0
- package/dist/host/features.js +144 -0
- package/dist/host/features.js.map +7 -0
- package/dist/host/index.js +12 -0
- package/dist/host/index.js.map +7 -0
- package/dist/{chunk-DPYBZDJB.js → host/merge.js} +7 -7
- package/dist/host/merge.js.map +7 -0
- package/dist/house-template.js +40 -0
- package/dist/house-template.js.map +7 -0
- package/dist/icons/AppleIcon.js +25 -0
- package/dist/icons/AppleIcon.js.map +7 -0
- package/dist/icons/ArbiBotHeadIcon.js +46 -0
- package/dist/icons/ArbiBotHeadIcon.js.map +7 -0
- package/dist/icons/ArbiIcon.js +24 -0
- package/dist/icons/ArbiIcon.js.map +7 -0
- package/dist/icons/AudIcon.js +56 -0
- package/dist/icons/AudIcon.js.map +7 -0
- package/dist/icons/ClaudeIcon.js +28 -0
- package/dist/icons/ClaudeIcon.js.map +7 -0
- package/dist/icons/DocIcon.js +56 -0
- package/dist/icons/DocIcon.js.map +7 -0
- package/dist/icons/EmlIcon.js +57 -0
- package/dist/icons/EmlIcon.js.map +7 -0
- package/dist/icons/FireworksIcon.js +47 -0
- package/dist/icons/FireworksIcon.js.map +7 -0
- package/dist/icons/GeminiIcon.js +37 -0
- package/dist/icons/GeminiIcon.js.map +7 -0
- package/dist/icons/GitHubIcon.js +32 -0
- package/dist/icons/GitHubIcon.js.map +7 -0
- package/dist/icons/GoogleIcon.js +53 -0
- package/dist/icons/GoogleIcon.js.map +7 -0
- package/dist/icons/HtmlIcon.js +56 -0
- package/dist/icons/HtmlIcon.js.map +7 -0
- package/dist/icons/ImgIcon.js +56 -0
- package/dist/icons/ImgIcon.js.map +7 -0
- package/dist/icons/LinkedInIcon.js +25 -0
- package/dist/icons/LinkedInIcon.js.map +7 -0
- package/dist/icons/OpenAIIcon.js +28 -0
- package/dist/icons/OpenAIIcon.js.map +7 -0
- package/dist/icons/PdfIcon.js +56 -0
- package/dist/icons/PdfIcon.js.map +7 -0
- package/dist/icons/ProviderIcon.js +42 -0
- package/dist/icons/ProviderIcon.js.map +7 -0
- package/dist/icons/TxtIcon.js +56 -0
- package/dist/icons/TxtIcon.js.map +7 -0
- package/dist/icons/VidIcon.js +56 -0
- package/dist/icons/VidIcon.js.map +7 -0
- package/dist/icons/XlsIcon.js +56 -0
- package/dist/icons/XlsIcon.js.map +7 -0
- package/dist/icons/arbi-mark.js +5 -0
- package/dist/icons/arbi-mark.js.map +7 -0
- package/dist/icons/colors.js +31 -0
- package/dist/icons/colors.js.map +7 -0
- package/dist/icons/file-type.js +105 -0
- package/dist/icons/file-type.js.map +7 -0
- package/dist/icons/index.js +55 -0
- package/dist/icons/index.js.map +7 -0
- package/dist/imagecrop/ImageCropModal.js +56 -0
- package/dist/imagecrop/ImageCropModal.js.map +7 -0
- package/dist/imagecrop/ImageCropper.js +100 -0
- package/dist/imagecrop/ImageCropper.js.map +7 -0
- package/dist/imagecrop/cropImage.js +43 -0
- package/dist/imagecrop/cropImage.js.map +7 -0
- package/dist/imagecrop/index.js +13 -0
- package/dist/imagecrop/index.js.map +7 -0
- package/dist/index.cjs +1689 -1619
- package/dist/index.cjs.map +1 -1
- package/dist/{index.d-BMhTH98a.d.ts → index.d-CYXcTKYt.d.ts} +1 -0
- package/dist/index.d.ts +38 -8
- package/dist/index.js +702 -17060
- package/dist/index.js.map +7 -1
- package/dist/lazy-chunk.d-B6YDLMKI.d.ts +31 -0
- package/dist/lazy-chunk.js +46 -0
- package/dist/lazy-chunk.js.map +7 -0
- package/dist/lib/collision-padding.js +13 -0
- package/dist/lib/collision-padding.js.map +7 -0
- package/dist/lib/format-friendly-date.js +55 -0
- package/dist/lib/format-friendly-date.js.map +7 -0
- package/dist/lib/format-relative-time.js +52 -0
- package/dist/lib/format-relative-time.js.map +7 -0
- package/dist/lib/markdown-to-text.js +35 -0
- package/dist/lib/markdown-to-text.js.map +7 -0
- package/dist/lib/toast-interaction.js +9 -0
- package/dist/lib/toast-interaction.js.map +7 -0
- package/dist/lib/utils.js +9 -0
- package/dist/lib/utils.js.map +7 -0
- package/dist/mail/client.js +103 -0
- package/dist/mail/client.js.map +7 -0
- package/dist/mail/document-attachment.js +38 -0
- package/dist/mail/document-attachment.js.map +7 -0
- package/dist/mail/filing.js +132 -0
- package/dist/mail/filing.js.map +7 -0
- package/dist/mail/hooks.js +393 -0
- package/dist/mail/hooks.js.map +7 -0
- package/dist/mail/index.js +120 -0
- package/dist/mail/index.js.map +7 -0
- package/dist/mail/offline/changes.js +258 -0
- package/dist/mail/offline/changes.js.map +7 -0
- package/dist/mail/offline/confirm-sign-out.js +37 -0
- package/dist/mail/offline/confirm-sign-out.js.map +7 -0
- package/dist/mail/offline/crypto.js +26 -0
- package/dist/mail/offline/crypto.js.map +7 -0
- package/dist/mail/offline/drafts.js +69 -0
- package/dist/mail/offline/drafts.js.map +7 -0
- package/dist/mail/offline/hooks.js +104 -0
- package/dist/mail/offline/hooks.js.map +7 -0
- package/dist/mail/offline/index.js +48 -0
- package/dist/mail/offline/index.js.map +7 -0
- package/dist/mail/offline/live.js +233 -0
- package/dist/mail/offline/live.js.map +7 -0
- package/dist/mail/offline/mailbox.js +191 -0
- package/dist/mail/offline/mailbox.js.map +7 -0
- package/dist/mail/offline/outbox.js +167 -0
- package/dist/mail/offline/outbox.js.map +7 -0
- package/dist/mail/offline/reads.js +159 -0
- package/dist/mail/offline/reads.js.map +7 -0
- package/dist/mail/offline/runtime.js +100 -0
- package/dist/mail/offline/runtime.js.map +7 -0
- package/dist/mail/offline/settings.js +84 -0
- package/dist/mail/offline/settings.js.map +7 -0
- package/dist/mail/offline/store.js +29 -0
- package/dist/mail/offline/store.js.map +7 -0
- package/dist/mail/offline/sync.js +251 -0
- package/dist/mail/offline/sync.js.map +7 -0
- package/dist/mail/offline/wipe.js +19 -0
- package/dist/mail/offline/wipe.js.map +7 -0
- package/dist/mail/thread-keys.js +53 -0
- package/dist/mail/thread-keys.js.map +7 -0
- package/dist/mail/threads.js +71 -0
- package/dist/mail/threads.js.map +7 -0
- package/dist/mail/useMailClient.js +42 -0
- package/dist/mail/useMailClient.js.map +7 -0
- package/dist/model-connections.js +58 -0
- package/dist/model-connections.js.map +7 -0
- package/dist/notifications/ActivityFeed.js +70 -0
- package/dist/notifications/ActivityFeed.js.map +7 -0
- package/dist/notifications/NotificationBell.js +200 -0
- package/dist/notifications/NotificationBell.js.map +7 -0
- package/dist/notifications/Toaster.js +24 -0
- package/dist/notifications/Toaster.js.map +7 -0
- package/dist/notifications/activity-types.js +65 -0
- package/dist/notifications/activity-types.js.map +7 -0
- package/dist/notifications/bell.js +24 -0
- package/dist/notifications/bell.js.map +7 -0
- package/dist/notifications/calendar-notifications.js +79 -0
- package/dist/notifications/calendar-notifications.js.map +7 -0
- package/dist/notifications/index.js +108 -0
- package/dist/notifications/index.js.map +7 -0
- package/dist/notifications/live.js +28 -0
- package/dist/notifications/live.js.map +7 -0
- package/dist/notifications/notification-types.js +127 -0
- package/dist/notifications/notification-types.js.map +7 -0
- package/dist/{chunk-BF5KW5ZI.js → notifications/notify-store.js} +24 -74
- package/dist/notifications/notify-store.js.map +7 -0
- package/dist/notifications/server-notifications.js +452 -0
- package/dist/notifications/server-notifications.js.map +7 -0
- package/dist/notifications/useNotifications.js +34 -0
- package/dist/notifications/useNotifications.js.map +7 -0
- package/dist/offline-store/network.js +11 -0
- package/dist/offline-store/network.js.map +7 -0
- package/dist/offline-store/store.js +136 -0
- package/dist/offline-store/store.js.map +7 -0
- package/dist/offline-store/wipe.js +8 -0
- package/dist/offline-store/wipe.js.map +7 -0
- package/dist/offline.js +58 -0
- package/dist/offline.js.map +7 -0
- package/dist/people.js +122 -0
- package/dist/people.js.map +7 -0
- package/dist/projects.js +30 -0
- package/dist/projects.js.map +7 -0
- package/dist/query-client.js +63 -0
- package/dist/query-client.js.map +7 -0
- package/dist/{query-keys.d-ChgpJLPF.d.ts → query-keys.d-B1Am9tIF.d.ts} +1 -1
- package/dist/{chunk-6H3O63TQ.js → query-keys.js} +19 -32
- package/dist/query-keys.js.map +7 -0
- package/dist/query-persist.js +66 -0
- package/dist/query-persist.js.map +7 -0
- package/dist/queued-writes.js +59 -0
- package/dist/queued-writes.js.map +7 -0
- package/dist/remote-control.js +67 -0
- package/dist/remote-control.js.map +7 -0
- package/dist/search/index.js +23 -0
- package/dist/search/index.js.map +7 -0
- package/dist/search/session.js +58 -0
- package/dist/search/session.js.map +7 -0
- package/dist/search/useSemanticSearch.js +82 -0
- package/dist/search/useSemanticSearch.js.map +7 -0
- package/dist/session/chat.js +512 -0
- package/dist/session/chat.js.map +7 -0
- package/dist/session/documents.js +196 -0
- package/dist/session/documents.js.map +7 -0
- package/dist/session/drafts.js +103 -0
- package/dist/session/drafts.js.map +7 -0
- package/dist/session/index.js +123 -0
- package/dist/session/index.js.map +7 -0
- package/dist/session/layout.js +339 -0
- package/dist/session/layout.js.map +7 -0
- package/dist/session/persist.js +106 -0
- package/dist/session/persist.js.map +7 -0
- package/dist/session/session-hooks.js +53 -0
- package/dist/session/session-hooks.js.map +7 -0
- package/dist/session/signed-in.js +36 -0
- package/dist/session/signed-in.js.map +7 -0
- package/dist/session/store.js +166 -0
- package/dist/session/store.js.map +7 -0
- package/dist/session/thread-tabs.js +121 -0
- package/dist/session/thread-tabs.js.map +7 -0
- package/dist/session/ui-state-storage.js +76 -0
- package/dist/session/ui-state-storage.js.map +7 -0
- package/dist/session/workspace.js +77 -0
- package/dist/session/workspace.js.map +7 -0
- package/dist/shell/index.cjs +37 -37
- package/dist/shell/index.js +43 -10
- package/dist/shell/index.js.map +7 -1
- package/dist/skill-pack.js +111 -0
- package/dist/skill-pack.js.map +7 -0
- package/dist/storage.js +186 -0
- package/dist/storage.js.map +7 -0
- package/dist/support/index.js +35 -0
- package/dist/support/index.js.map +7 -0
- package/dist/tags.js +204 -0
- package/dist/tags.js.map +7 -0
- package/dist/ui/DebouncedInput.js +109 -0
- package/dist/ui/DebouncedInput.js.map +7 -0
- package/dist/ui/DictateContext.js +8 -0
- package/dist/ui/DictateContext.js.map +7 -0
- package/dist/ui/IconToggle.js +79 -0
- package/dist/ui/IconToggle.js.map +7 -0
- package/dist/ui/VerifiedToggle.js +38 -0
- package/dist/ui/VerifiedToggle.js.map +7 -0
- package/dist/ui/VisibilityToggle.js +103 -0
- package/dist/ui/VisibilityToggle.js.map +7 -0
- package/dist/ui/avatar.js +40 -0
- package/dist/ui/avatar.js.map +7 -0
- package/dist/ui/badge.js +28 -0
- package/dist/ui/badge.js.map +7 -0
- package/dist/ui/button.js +48 -0
- package/dist/ui/button.js.map +7 -0
- package/dist/ui/card.js +90 -0
- package/dist/ui/card.js.map +7 -0
- package/dist/ui/checkbox.js +22 -0
- package/dist/ui/checkbox.js.map +7 -0
- package/dist/ui/collapsible.js +10 -0
- package/dist/ui/collapsible.js.map +7 -0
- package/dist/ui/command.js +103 -0
- package/dist/ui/command.js.map +7 -0
- package/dist/{chunk-YNNAJJ5Z.js → ui/dialog.js} +30 -68
- package/dist/ui/dialog.js.map +7 -0
- package/dist/{chunk-47CCGUWR.js → ui/dropdown-menu.js} +40 -45
- package/dist/ui/dropdown-menu.js.map +7 -0
- package/dist/ui/hover-card.js +36 -0
- package/dist/ui/hover-card.js.map +7 -0
- package/dist/ui/index.cjs +167 -154
- package/dist/ui/index.d.ts +2 -1
- package/dist/ui/index.js +290 -9
- package/dist/ui/index.js.map +7 -1
- package/dist/ui/input.js +65 -0
- package/dist/ui/input.js.map +7 -0
- package/dist/ui/label.js +16 -0
- package/dist/ui/label.js.map +7 -0
- package/dist/ui/mark-menu.js +300 -0
- package/dist/ui/mark-menu.js.map +7 -0
- package/dist/ui/popover.js +40 -0
- package/dist/ui/popover.js.map +7 -0
- package/dist/ui/portal-container.js +17 -0
- package/dist/ui/portal-container.js.map +7 -0
- package/dist/ui/progress.js +24 -0
- package/dist/ui/progress.js.map +7 -0
- package/dist/ui/radio-group.js +29 -0
- package/dist/ui/radio-group.js.map +7 -0
- package/dist/ui/scroll-area.js +39 -0
- package/dist/ui/scroll-area.js.map +7 -0
- package/dist/ui/select.js +130 -0
- package/dist/ui/select.js.map +7 -0
- package/dist/ui/separator.js +23 -0
- package/dist/ui/separator.js.map +7 -0
- package/dist/ui/slider.js +23 -0
- package/dist/ui/slider.js.map +7 -0
- package/dist/ui/switch.js +28 -0
- package/dist/ui/switch.js.map +7 -0
- package/dist/ui/table.js +75 -0
- package/dist/ui/table.js.map +7 -0
- package/dist/ui/tabs.js +48 -0
- package/dist/ui/tabs.js.map +7 -0
- package/dist/ui/textarea.js +63 -0
- package/dist/ui/textarea.js.map +7 -0
- package/dist/ui/toggle-group.js +43 -0
- package/dist/ui/toggle-group.js.map +7 -0
- package/dist/ui/toggle.js +40 -0
- package/dist/ui/toggle.js.map +7 -0
- package/dist/ui/tooltip.js +215 -0
- package/dist/ui/tooltip.js.map +7 -0
- package/dist/usage-metered.js +8 -0
- package/dist/usage-metered.js.map +7 -0
- package/dist/useArbi.js +16 -0
- package/dist/useArbi.js.map +7 -0
- package/dist/useInstallSkillPack.js +81 -0
- package/dist/useInstallSkillPack.js.map +7 -0
- package/dist/usermenu/UserMenu.js +188 -0
- package/dist/usermenu/UserMenu.js.map +7 -0
- package/dist/usermenu/index.js +5 -0
- package/dist/usermenu/index.js.map +7 -0
- package/dist/users/index.js +15 -0
- package/dist/users/index.js.map +7 -0
- package/dist/users/user-display.js +60 -0
- package/dist/users/user-display.js.map +7 -0
- package/dist/viewers/AudioViewer.js +23 -0
- package/dist/viewers/AudioViewer.js.map +7 -0
- package/dist/viewers/DocxViewer.js +81 -0
- package/dist/viewers/DocxViewer.js.map +7 -0
- package/dist/viewers/ImageViewer.js +31 -0
- package/dist/viewers/ImageViewer.js.map +7 -0
- package/dist/viewers/PdfViewer.cjs +17 -0
- package/dist/viewers/PdfViewer.cjs.map +1 -0
- package/dist/viewers/PdfViewer.d.ts +9 -0
- package/dist/viewers/PdfViewer.js +20 -0
- package/dist/viewers/PdfViewer.js.map +7 -0
- package/dist/viewers/PdfViewerImpl.js +384 -0
- package/dist/viewers/PdfViewerImpl.js.map +7 -0
- package/dist/viewers/VideoViewer.js +31 -0
- package/dist/viewers/VideoViewer.js.map +7 -0
- package/dist/viewers/XlsxViewer.js +102 -0
- package/dist/viewers/XlsxViewer.js.map +7 -0
- package/dist/viewers/index.cjs +79 -653
- package/dist/viewers/index.cjs.map +1 -1
- package/dist/viewers/index.d.ts +3 -1
- package/dist/viewers/index.js +60 -903
- package/dist/viewers/index.js.map +7 -1
- package/dist/viewers/page-scroll.js +59 -0
- package/dist/viewers/page-scroll.js.map +7 -0
- package/dist/viewers/pdf-viewer-constants.js +9 -0
- package/dist/viewers/pdf-viewer-constants.js.map +7 -0
- package/dist/{chunk-PTOP7OHG.js → viewers/pdfjs-polyfills.js} +5 -6
- package/dist/viewers/pdfjs-polyfills.js.map +7 -0
- package/dist/viewers/selection-runs.js +38 -0
- package/dist/viewers/selection-runs.js.map +7 -0
- package/dist/viewers/usePageIntersectionObserver.js +68 -0
- package/dist/viewers/usePageIntersectionObserver.js.map +7 -0
- package/dist/viewers/useProcessedChunks.js +58 -0
- package/dist/viewers/useProcessedChunks.js.map +7 -0
- package/dist/viewers/viewer-zoom.js +163 -0
- package/dist/viewers/viewer-zoom.js.map +7 -0
- package/dist/websocket/ArbiWebSocketProvider.js +207 -0
- package/dist/websocket/ArbiWebSocketProvider.js.map +7 -0
- package/dist/websocket/context.js +14 -0
- package/dist/websocket/context.js.map +7 -0
- package/dist/websocket/hooks.js +30 -0
- package/dist/websocket/hooks.js.map +7 -0
- package/dist/websocket/index.js +22 -0
- package/dist/websocket/index.js.map +7 -0
- package/dist/websocket/live-updates.js +38 -0
- package/dist/websocket/live-updates.js.map +7 -0
- package/dist/websocket/reconnect.js +13 -0
- package/dist/websocket/reconnect.js.map +7 -0
- package/dist/websocket/store.js +58 -0
- package/dist/websocket/store.js.map +7 -0
- package/dist/workforce.js +607 -0
- package/dist/workforce.js.map +7 -0
- package/dist/workspaces/access-request.js +35 -0
- package/dist/workspaces/access-request.js.map +7 -0
- package/dist/workspaces/archive.js +59 -0
- package/dist/workspaces/archive.js.map +7 -0
- package/dist/workspaces/current.js +20 -0
- package/dist/workspaces/current.js.map +7 -0
- package/dist/workspaces/delete-workspaces.js +15 -0
- package/dist/workspaces/delete-workspaces.js.map +7 -0
- package/dist/workspaces/export-archive.js +40 -0
- package/dist/workspaces/export-archive.js.map +7 -0
- package/dist/workspaces/index.js +99 -0
- package/dist/workspaces/index.js.map +7 -0
- package/dist/workspaces/settings.js +45 -0
- package/dist/workspaces/settings.js.map +7 -0
- package/dist/workspaces/shell-workspaces.js +49 -0
- package/dist/workspaces/shell-workspaces.js.map +7 -0
- package/dist/workspaces/switch.js +234 -0
- package/dist/workspaces/switch.js.map +7 -0
- package/dist/workspaces/transfer.js +170 -0
- package/dist/workspaces/transfer.js.map +7 -0
- package/dist/workspaces/useShellWorkspaces.js +86 -0
- package/dist/workspaces/useShellWorkspaces.js.map +7 -0
- package/dist/workspaces/workspace-users.js +65 -0
- package/dist/workspaces/workspace-users.js.map +7 -0
- package/package.json +12 -4
- package/dist/PdfViewer.d-bQH9yxFg.d.ts +0 -55
- package/dist/ProductionDialog.d-CpzslFn0.d.cts +0 -51
- package/dist/annotations/freeze/index.d.cts +0 -205
- package/dist/annotations/index.d.cts +0 -360
- package/dist/artifacts/index.d.cts +0 -476
- package/dist/artifacts/redline-core.d.cts +0 -39
- package/dist/bundle-YNOX7VIL.js +0 -5
- package/dist/bundle-YNOX7VIL.js.map +0 -1
- package/dist/bundle.d-BnCSbHy2.d.cts +0 -85
- package/dist/calls/livekit/index.d.cts +0 -280
- package/dist/chunk-47CCGUWR.js.map +0 -1
- package/dist/chunk-6H3O63TQ.js.map +0 -1
- package/dist/chunk-74N436VK.js.map +0 -1
- package/dist/chunk-APZZQZ6P.js +0 -147
- package/dist/chunk-APZZQZ6P.js.map +0 -1
- package/dist/chunk-BF5KW5ZI.js.map +0 -1
- package/dist/chunk-CPQ3CU4B.js +0 -246
- package/dist/chunk-CPQ3CU4B.js.map +0 -1
- package/dist/chunk-DPYBZDJB.js.map +0 -1
- package/dist/chunk-DQALOQPI.js +0 -2766
- package/dist/chunk-DQALOQPI.js.map +0 -1
- package/dist/chunk-FZJMA32S.js +0 -1011
- package/dist/chunk-FZJMA32S.js.map +0 -1
- package/dist/chunk-H5M7FXLB.js +0 -2057
- package/dist/chunk-H5M7FXLB.js.map +0 -1
- package/dist/chunk-HDCRPPBW.js +0 -75
- package/dist/chunk-HDCRPPBW.js.map +0 -1
- package/dist/chunk-NIKPG4PW.js +0 -1128
- package/dist/chunk-NIKPG4PW.js.map +0 -1
- package/dist/chunk-NNAJLY6B.js +0 -4974
- package/dist/chunk-NNAJLY6B.js.map +0 -1
- package/dist/chunk-OYPKKHXY.js +0 -559
- package/dist/chunk-OYPKKHXY.js.map +0 -1
- package/dist/chunk-P6WLV5UY.js +0 -644
- package/dist/chunk-P6WLV5UY.js.map +0 -1
- package/dist/chunk-PTOP7OHG.js.map +0 -1
- package/dist/chunk-SN5YV6FF.js +0 -11
- package/dist/chunk-SN5YV6FF.js.map +0 -1
- package/dist/chunk-T3USOSVN.js.map +0 -1
- package/dist/chunk-T4CLW3DN.js +0 -2560
- package/dist/chunk-T4CLW3DN.js.map +0 -1
- package/dist/chunk-UW2SGTI5.js.map +0 -1
- package/dist/chunk-VSCU7K4V.js.map +0 -1
- package/dist/chunk-WL2Y2T47.js.map +0 -1
- package/dist/chunk-WUTL62MC.js.map +0 -1
- package/dist/chunk-Y3MTRA7D.js +0 -97
- package/dist/chunk-Y3MTRA7D.js.map +0 -1
- package/dist/chunk-YNNAJJ5Z.js.map +0 -1
- package/dist/document-tools/core.d.cts +0 -883
- package/dist/document-tools/index.d.cts +0 -90
- package/dist/index.d-BMhTH98a.d.cts +0 -2035
- package/dist/index.d-oR5FKZpJ.d.cts +0 -579
- package/dist/index.d.cts +0 -15893
- package/dist/model.d-CNtRWKVK.d.cts +0 -110
- package/dist/query-keys.d-ChgpJLPF.d.cts +0 -337
- package/dist/shell/index.d.cts +0 -6
- package/dist/store.d-GADDvC7w.d.cts +0 -35
- package/dist/stored-markdown.d-Bp18vrbr.d.cts +0 -125
- package/dist/ui/index.d.cts +0 -25
- package/dist/useAudioRecorder.d-B9rlMI_E.d.cts +0 -778
- package/dist/viewers/index.d.cts +0 -260
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
import { emptyLayer, parseLayer } from "./model.js";
|
|
2
|
+
class AnnotationStoreOfflineError extends Error {
|
|
3
|
+
constructor(message = "You are offline") {
|
|
4
|
+
super(message);
|
|
5
|
+
this.name = "AnnotationStoreOfflineError";
|
|
6
|
+
}
|
|
7
|
+
}
|
|
8
|
+
function createMemoryStore(now = () => (/* @__PURE__ */ new Date()).toISOString()) {
|
|
9
|
+
const layers = /* @__PURE__ */ new Map();
|
|
10
|
+
return {
|
|
11
|
+
async load(documentId) {
|
|
12
|
+
const raw = layers.get(documentId);
|
|
13
|
+
return raw ? parseLayer(JSON.parse(raw)) : emptyLayer(documentId, now());
|
|
14
|
+
},
|
|
15
|
+
async save(layer) {
|
|
16
|
+
layers.set(layer.documentId, JSON.stringify(parseLayer(layer)));
|
|
17
|
+
}
|
|
18
|
+
};
|
|
19
|
+
}
|
|
20
|
+
const STORAGE_PREFIX = "arbi:annotations:";
|
|
21
|
+
function createLocalStorageStore(storage = safeLocalStorage(), now = () => (/* @__PURE__ */ new Date()).toISOString()) {
|
|
22
|
+
return {
|
|
23
|
+
async load(documentId) {
|
|
24
|
+
try {
|
|
25
|
+
const raw = storage?.getItem(STORAGE_PREFIX + documentId);
|
|
26
|
+
if (raw) return parseLayer(JSON.parse(raw));
|
|
27
|
+
} catch {
|
|
28
|
+
}
|
|
29
|
+
return emptyLayer(documentId, now());
|
|
30
|
+
},
|
|
31
|
+
async save(layer) {
|
|
32
|
+
if (!storage) throw new Error("storage is not available");
|
|
33
|
+
storage.setItem(STORAGE_PREFIX + layer.documentId, JSON.stringify(parseLayer(layer)));
|
|
34
|
+
}
|
|
35
|
+
};
|
|
36
|
+
}
|
|
37
|
+
function safeLocalStorage() {
|
|
38
|
+
try {
|
|
39
|
+
return typeof localStorage === "undefined" ? void 0 : localStorage;
|
|
40
|
+
} catch {
|
|
41
|
+
return void 0;
|
|
42
|
+
}
|
|
43
|
+
}
|
|
44
|
+
export {
|
|
45
|
+
AnnotationStoreOfflineError,
|
|
46
|
+
createLocalStorageStore,
|
|
47
|
+
createMemoryStore
|
|
48
|
+
};
|
|
49
|
+
//# sourceMappingURL=store.js.map
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../../src/annotations/store.ts"],
|
|
4
|
+
"sourcesContent": ["/**\n * Where a layer is kept. The layer is data about a document, not part of it, so the host decides\n * (backend API, IndexedDB, a file). This package ships an in-memory store and a localStorage\n * store; both validate on load because stored JSON is untrusted. A store shared by several\n * writers (ARBI's server-side markup) also implements the optional members: it may merge on save,\n * pull others' changes, and say whether this user may write at all.\n */\n\nimport { emptyLayer, parseLayer, type AnnotationLayer } from './model'\n\nexport interface AnnotationStore {\n /** The saved layer, or an empty one for a document that has none yet. */\n load(documentId: string): Promise<AnnotationLayer>\n /**\n * Write a layer. A store with other writers may resolve to what it actually saved \u2014 this layer\n * merged with theirs (see `mergeLayers`); the caller then rebases its newer edits onto it.\n */\n save(layer: AnnotationLayer): Promise<AnnotationLayer | void>\n /** Others' changes since the last load or save, or null when there are none. */\n pull?(documentId: string): Promise<AnnotationLayer | null>\n /** Whether this user may change the layer; false makes it view-only. Known after `load`. */\n canEdit?(documentId: string): boolean\n}\n\n/** Thrown by a store whose backend cannot be reached: the layer is kept and saved when back. */\nexport class AnnotationStoreOfflineError extends Error {\n constructor(message = 'You are offline') {\n super(message)\n this.name = 'AnnotationStoreOfflineError'\n }\n}\n\nexport function createMemoryStore(\n now: () => string = () => new Date().toISOString()\n): AnnotationStore {\n const layers = new Map<string, string>()\n return {\n async load(documentId) {\n const raw = layers.get(documentId)\n return raw ? parseLayer(JSON.parse(raw)) : emptyLayer(documentId, now())\n },\n async save(layer) {\n layers.set(layer.documentId, JSON.stringify(parseLayer(layer)))\n },\n }\n}\n\nconst STORAGE_PREFIX = 'arbi:annotations:'\n\n/**\n * Per-browser store. Storage can be absent, full or blocked (private windows), so every access is\n * guarded. A saved layer that no longer validates is ignored rather than crashing the viewer.\n */\nexport function createLocalStorageStore(\n storage: Pick<Storage, 'getItem' | 'setItem'> | undefined = safeLocalStorage(),\n now: () => string = () => new Date().toISOString()\n): AnnotationStore {\n return {\n async load(documentId) {\n try {\n const raw = storage?.getItem(STORAGE_PREFIX + documentId)\n if (raw) return parseLayer(JSON.parse(raw))\n } catch {\n // unreadable or invalid: start from an empty layer\n }\n return emptyLayer(documentId, now())\n },\n async save(layer) {\n if (!storage) throw new Error('storage is not available')\n storage.setItem(STORAGE_PREFIX + layer.documentId, JSON.stringify(parseLayer(layer)))\n },\n }\n}\n\nfunction safeLocalStorage(): Storage | undefined {\n try {\n return typeof localStorage === 'undefined' ? undefined : localStorage\n } catch {\n return undefined\n }\n}\n"],
|
|
5
|
+
"mappings": "AAQA,SAAS,YAAY,kBAAwC;AAiBtD,MAAM,oCAAoC,MAAM;AAAA,EACrD,YAAY,UAAU,mBAAmB;AACvC,UAAM,OAAO;AACb,SAAK,OAAO;AAAA,EACd;AACF;AAEO,SAAS,kBACd,MAAoB,OAAM,oBAAI,KAAK,GAAE,YAAY,GAChC;AACjB,QAAM,SAAS,oBAAI,IAAoB;AACvC,SAAO;AAAA,IACL,MAAM,KAAK,YAAY;AACrB,YAAM,MAAM,OAAO,IAAI,UAAU;AACjC,aAAO,MAAM,WAAW,KAAK,MAAM,GAAG,CAAC,IAAI,WAAW,YAAY,IAAI,CAAC;AAAA,IACzE;AAAA,IACA,MAAM,KAAK,OAAO;AAChB,aAAO,IAAI,MAAM,YAAY,KAAK,UAAU,WAAW,KAAK,CAAC,CAAC;AAAA,IAChE;AAAA,EACF;AACF;AAEA,MAAM,iBAAiB;AAMhB,SAAS,wBACd,UAA4D,iBAAiB,GAC7E,MAAoB,OAAM,oBAAI,KAAK,GAAE,YAAY,GAChC;AACjB,SAAO;AAAA,IACL,MAAM,KAAK,YAAY;AACrB,UAAI;AACF,cAAM,MAAM,SAAS,QAAQ,iBAAiB,UAAU;AACxD,YAAI,IAAK,QAAO,WAAW,KAAK,MAAM,GAAG,CAAC;AAAA,MAC5C,QAAQ;AAAA,MAER;AACA,aAAO,WAAW,YAAY,IAAI,CAAC;AAAA,IACrC;AAAA,IACA,MAAM,KAAK,OAAO;AAChB,UAAI,CAAC,QAAS,OAAM,IAAI,MAAM,0BAA0B;AACxD,cAAQ,QAAQ,iBAAiB,MAAM,YAAY,KAAK,UAAU,WAAW,KAAK,CAAC,CAAC;AAAA,IACtF;AAAA,EACF;AACF;AAEA,SAAS,mBAAwC;AAC/C,MAAI;AACF,WAAO,OAAO,iBAAiB,cAAc,SAAY;AAAA,EAC3D,QAAQ;AACN,WAAO;AAAA,EACT;AACF;",
|
|
6
|
+
"names": []
|
|
7
|
+
}
|
|
@@ -0,0 +1,306 @@
|
|
|
1
|
+
import { useCallback, useEffect, useMemo, useRef, useState } from "react";
|
|
2
|
+
import {
|
|
3
|
+
DEFAULT_SETTINGS
|
|
4
|
+
} from "./controller.js";
|
|
5
|
+
import { mergeLayers } from "./merge.js";
|
|
6
|
+
import { emptyLayer } from "./model.js";
|
|
7
|
+
import {
|
|
8
|
+
applyAction,
|
|
9
|
+
canRedo as historyCanRedo,
|
|
10
|
+
canUndo as historyCanUndo,
|
|
11
|
+
createHistory,
|
|
12
|
+
redo as historyRedo,
|
|
13
|
+
undo as historyUndo
|
|
14
|
+
} from "./state.js";
|
|
15
|
+
import { AnnotationStoreOfflineError } from "./store.js";
|
|
16
|
+
const AUTOSAVE_MS = 600;
|
|
17
|
+
const RETRY_MS = 1e4;
|
|
18
|
+
const defaultNow = () => (/* @__PURE__ */ new Date()).toISOString();
|
|
19
|
+
const defaultId = () => globalThis.crypto.randomUUID();
|
|
20
|
+
function rebaseHistory(history, sent, remote) {
|
|
21
|
+
const onto = (layer) => layer === sent ? remote : mergeLayers({ base: sent, mine: layer, theirs: remote });
|
|
22
|
+
return {
|
|
23
|
+
present: onto(history.present),
|
|
24
|
+
past: history.past.map(onto),
|
|
25
|
+
future: history.future.map(onto)
|
|
26
|
+
};
|
|
27
|
+
}
|
|
28
|
+
function useAnnotationLayer({
|
|
29
|
+
documentId,
|
|
30
|
+
store,
|
|
31
|
+
author,
|
|
32
|
+
autosaveMs = AUTOSAVE_MS,
|
|
33
|
+
readOnly: readOnlyProp = false,
|
|
34
|
+
online = true,
|
|
35
|
+
pullMs = 0,
|
|
36
|
+
now = defaultNow,
|
|
37
|
+
makeId = defaultId
|
|
38
|
+
}) {
|
|
39
|
+
const [history, setHistory] = useState(
|
|
40
|
+
() => createHistory(emptyLayer(documentId, now()))
|
|
41
|
+
);
|
|
42
|
+
const [savedLayer, setSavedLayer] = useState(null);
|
|
43
|
+
const [status, setStatus] = useState("loading");
|
|
44
|
+
const [error, setError] = useState(null);
|
|
45
|
+
const [saving, setSaving] = useState(false);
|
|
46
|
+
const [offlineFailure, setOfflineFailure] = useState(false);
|
|
47
|
+
const [storeReadOnly, setStoreReadOnly] = useState(false);
|
|
48
|
+
const [tool, setToolState] = useState("select");
|
|
49
|
+
const [settings, setSettingsState] = useState(DEFAULT_SETTINGS);
|
|
50
|
+
const [selectedId, setSelectedId] = useState(null);
|
|
51
|
+
const readOnly = readOnlyProp || storeReadOnly;
|
|
52
|
+
const historyRef = useRef(history);
|
|
53
|
+
const savedRef = useRef(null);
|
|
54
|
+
const timerRef = useRef(void 0);
|
|
55
|
+
const retryRef = useRef(void 0);
|
|
56
|
+
const savingRef = useRef(false);
|
|
57
|
+
const docRef = useRef(documentId);
|
|
58
|
+
const storeRef = useRef(store);
|
|
59
|
+
storeRef.current = store;
|
|
60
|
+
const nowRef = useRef(now);
|
|
61
|
+
nowRef.current = now;
|
|
62
|
+
const idRef = useRef(makeId);
|
|
63
|
+
idRef.current = makeId;
|
|
64
|
+
const readOnlyRef = useRef(readOnly);
|
|
65
|
+
readOnlyRef.current = readOnly;
|
|
66
|
+
const onlineRef = useRef(online);
|
|
67
|
+
onlineRef.current = online;
|
|
68
|
+
const autosaveMsRef = useRef(autosaveMs);
|
|
69
|
+
autosaveMsRef.current = autosaveMs;
|
|
70
|
+
const commit = useCallback((next) => {
|
|
71
|
+
historyRef.current = next;
|
|
72
|
+
setHistory(next);
|
|
73
|
+
}, []);
|
|
74
|
+
const adoptRemote = useCallback(
|
|
75
|
+
(sent, remote) => {
|
|
76
|
+
commit(rebaseHistory(historyRef.current, sent, remote));
|
|
77
|
+
savedRef.current = remote;
|
|
78
|
+
setSavedLayer(remote);
|
|
79
|
+
},
|
|
80
|
+
[commit]
|
|
81
|
+
);
|
|
82
|
+
useEffect(() => {
|
|
83
|
+
docRef.current = documentId;
|
|
84
|
+
let cancelled = false;
|
|
85
|
+
setStatus("loading");
|
|
86
|
+
setError(null);
|
|
87
|
+
setSelectedId(null);
|
|
88
|
+
setSavedLayer(null);
|
|
89
|
+
setStoreReadOnly(false);
|
|
90
|
+
savedRef.current = null;
|
|
91
|
+
commit(createHistory(emptyLayer(documentId, nowRef.current())));
|
|
92
|
+
storeRef.current.load(documentId).then((layer) => {
|
|
93
|
+
if (cancelled) return;
|
|
94
|
+
savedRef.current = layer;
|
|
95
|
+
setSavedLayer(layer);
|
|
96
|
+
setStoreReadOnly(storeRef.current.canEdit?.(documentId) === false);
|
|
97
|
+
commit(createHistory(layer));
|
|
98
|
+
setStatus("ready");
|
|
99
|
+
}).catch((e) => {
|
|
100
|
+
if (cancelled) return;
|
|
101
|
+
setError(e instanceof Error ? e.message : "The annotations could not be loaded");
|
|
102
|
+
setStatus("error");
|
|
103
|
+
});
|
|
104
|
+
return () => {
|
|
105
|
+
cancelled = true;
|
|
106
|
+
clearTimeout(timerRef.current);
|
|
107
|
+
clearTimeout(retryRef.current);
|
|
108
|
+
const layer = historyRef.current.present;
|
|
109
|
+
if (savedRef.current !== null && layer !== savedRef.current && layer.documentId === documentId && !readOnlyRef.current) {
|
|
110
|
+
storeRef.current.save(layer).catch((e) => console.error("Annotations could not be saved", e));
|
|
111
|
+
}
|
|
112
|
+
};
|
|
113
|
+
}, [documentId, commit]);
|
|
114
|
+
const save = useCallback(async () => {
|
|
115
|
+
clearTimeout(timerRef.current);
|
|
116
|
+
clearTimeout(retryRef.current);
|
|
117
|
+
const layer = historyRef.current.present;
|
|
118
|
+
if (layer === savedRef.current || savedRef.current === null) return;
|
|
119
|
+
if (readOnlyRef.current || savingRef.current) return;
|
|
120
|
+
if (!onlineRef.current) return;
|
|
121
|
+
savingRef.current = true;
|
|
122
|
+
setSaving(true);
|
|
123
|
+
let failed = false;
|
|
124
|
+
try {
|
|
125
|
+
const stored = await storeRef.current.save(layer);
|
|
126
|
+
if (layer.documentId === docRef.current) {
|
|
127
|
+
setError(null);
|
|
128
|
+
setOfflineFailure(false);
|
|
129
|
+
if (stored && stored !== layer) {
|
|
130
|
+
adoptRemote(layer, stored);
|
|
131
|
+
} else {
|
|
132
|
+
savedRef.current = layer;
|
|
133
|
+
setSavedLayer(layer);
|
|
134
|
+
}
|
|
135
|
+
}
|
|
136
|
+
} catch (e) {
|
|
137
|
+
failed = true;
|
|
138
|
+
if (e instanceof AnnotationStoreOfflineError) {
|
|
139
|
+
setOfflineFailure(true);
|
|
140
|
+
} else {
|
|
141
|
+
setError(e instanceof Error ? e.message : "The annotations could not be saved");
|
|
142
|
+
}
|
|
143
|
+
retryRef.current = setTimeout(() => void saveRef.current(), RETRY_MS);
|
|
144
|
+
} finally {
|
|
145
|
+
savingRef.current = false;
|
|
146
|
+
setSaving(false);
|
|
147
|
+
if (!failed && historyRef.current.present !== savedRef.current) {
|
|
148
|
+
timerRef.current = setTimeout(() => void saveRef.current(), autosaveMsRef.current);
|
|
149
|
+
}
|
|
150
|
+
}
|
|
151
|
+
}, [adoptRemote]);
|
|
152
|
+
const saveRef = useRef(save);
|
|
153
|
+
saveRef.current = save;
|
|
154
|
+
const present = history.present;
|
|
155
|
+
const dirty = status === "ready" && present !== savedLayer;
|
|
156
|
+
useEffect(() => {
|
|
157
|
+
if (!dirty || !online || readOnly) return;
|
|
158
|
+
timerRef.current = setTimeout(() => void save(), autosaveMs);
|
|
159
|
+
return () => clearTimeout(timerRef.current);
|
|
160
|
+
}, [dirty, present, autosaveMs, save, online, readOnly]);
|
|
161
|
+
useEffect(() => {
|
|
162
|
+
if (online) setOfflineFailure(false);
|
|
163
|
+
if (online && savedRef.current !== null && historyRef.current.present !== savedRef.current) {
|
|
164
|
+
void save();
|
|
165
|
+
}
|
|
166
|
+
}, [online, save]);
|
|
167
|
+
const pull = useCallback(async () => {
|
|
168
|
+
const s = storeRef.current;
|
|
169
|
+
const base = savedRef.current;
|
|
170
|
+
if (!s.pull || !base || savingRef.current || !onlineRef.current) return;
|
|
171
|
+
if (historyRef.current.present !== base) return;
|
|
172
|
+
try {
|
|
173
|
+
const remote = await s.pull(docRef.current);
|
|
174
|
+
if (!remote || remote.documentId !== docRef.current || savedRef.current !== base) return;
|
|
175
|
+
adoptRemote(base, remote);
|
|
176
|
+
} catch {
|
|
177
|
+
}
|
|
178
|
+
}, [adoptRemote]);
|
|
179
|
+
useEffect(() => {
|
|
180
|
+
if (!pullMs || status !== "ready") return;
|
|
181
|
+
const timer = setInterval(() => void pull(), pullMs);
|
|
182
|
+
const onFocus = () => void pull();
|
|
183
|
+
window.addEventListener("focus", onFocus);
|
|
184
|
+
return () => {
|
|
185
|
+
clearInterval(timer);
|
|
186
|
+
window.removeEventListener("focus", onFocus);
|
|
187
|
+
};
|
|
188
|
+
}, [pullMs, status, pull]);
|
|
189
|
+
useEffect(() => {
|
|
190
|
+
const flush = () => void save();
|
|
191
|
+
const onVisibility = () => {
|
|
192
|
+
if (document.visibilityState === "hidden") flush();
|
|
193
|
+
};
|
|
194
|
+
window.addEventListener("pagehide", flush);
|
|
195
|
+
document.addEventListener("visibilitychange", onVisibility);
|
|
196
|
+
return () => {
|
|
197
|
+
window.removeEventListener("pagehide", flush);
|
|
198
|
+
document.removeEventListener("visibilitychange", onVisibility);
|
|
199
|
+
};
|
|
200
|
+
}, [save]);
|
|
201
|
+
const dispatch = useCallback(
|
|
202
|
+
(action) => {
|
|
203
|
+
if (readOnlyRef.current) return false;
|
|
204
|
+
try {
|
|
205
|
+
commit(applyAction(historyRef.current, action));
|
|
206
|
+
setError(null);
|
|
207
|
+
return true;
|
|
208
|
+
} catch (e) {
|
|
209
|
+
setError(e instanceof Error ? e.message : "The change was rejected");
|
|
210
|
+
return false;
|
|
211
|
+
}
|
|
212
|
+
},
|
|
213
|
+
[commit]
|
|
214
|
+
);
|
|
215
|
+
const stamp = useCallback(
|
|
216
|
+
(mark) => {
|
|
217
|
+
const t = nowRef.current();
|
|
218
|
+
return { ...mark, id: idRef.current(), author, createdAt: t, updatedAt: t };
|
|
219
|
+
},
|
|
220
|
+
[author]
|
|
221
|
+
);
|
|
222
|
+
const offline = !online || offlineFailure;
|
|
223
|
+
const controller = useMemo(() => {
|
|
224
|
+
const exists = (id) => id !== null && present.annotations.some((a) => a.id === id) ? id : null;
|
|
225
|
+
return {
|
|
226
|
+
layer: present,
|
|
227
|
+
status,
|
|
228
|
+
error,
|
|
229
|
+
saving,
|
|
230
|
+
dirty,
|
|
231
|
+
offline,
|
|
232
|
+
readOnly,
|
|
233
|
+
author,
|
|
234
|
+
tool: readOnly ? "select" : tool,
|
|
235
|
+
setTool: (next) => {
|
|
236
|
+
if (readOnly && next !== "select") return;
|
|
237
|
+
setToolState(next);
|
|
238
|
+
if (next !== "select") setSelectedId(null);
|
|
239
|
+
},
|
|
240
|
+
settings,
|
|
241
|
+
setSettings: (patch) => setSettingsState((s) => ({ ...s, ...patch, colors: { ...s.colors, ...patch.colors } })),
|
|
242
|
+
selectedId: exists(selectedId),
|
|
243
|
+
select: setSelectedId,
|
|
244
|
+
add: (mark) => {
|
|
245
|
+
const annotation = stamp(mark);
|
|
246
|
+
return dispatch({ type: "add", annotation }) ? annotation.id : null;
|
|
247
|
+
},
|
|
248
|
+
addMany: (marks) => {
|
|
249
|
+
const annotations = marks.map(stamp);
|
|
250
|
+
return dispatch({ type: "addMany", annotations }) ? annotations.map((a) => a.id) : [];
|
|
251
|
+
},
|
|
252
|
+
update: (id, patch) => void dispatch({ type: "update", id, patch, now: nowRef.current() }),
|
|
253
|
+
remove: (id) => void dispatch({ type: "remove", id, now: nowRef.current() }),
|
|
254
|
+
setRedactionStatus: (ids, next) => void dispatch({
|
|
255
|
+
type: "setRedactionStatus",
|
|
256
|
+
ids,
|
|
257
|
+
status: next,
|
|
258
|
+
now: nowRef.current(),
|
|
259
|
+
by: author
|
|
260
|
+
}),
|
|
261
|
+
reply: (id, body) => {
|
|
262
|
+
const t = nowRef.current();
|
|
263
|
+
void dispatch({
|
|
264
|
+
type: "reply",
|
|
265
|
+
id,
|
|
266
|
+
reply: { id: idRef.current(), author, createdAt: t, body },
|
|
267
|
+
now: t
|
|
268
|
+
});
|
|
269
|
+
},
|
|
270
|
+
resolve: (id, resolved) => void dispatch({ type: "resolve", id, resolved, now: nowRef.current() }),
|
|
271
|
+
undo: () => {
|
|
272
|
+
if (!readOnly) commit(historyUndo(historyRef.current));
|
|
273
|
+
},
|
|
274
|
+
redo: () => {
|
|
275
|
+
if (!readOnly) commit(historyRedo(historyRef.current));
|
|
276
|
+
},
|
|
277
|
+
canUndo: !readOnly && historyCanUndo(history),
|
|
278
|
+
canRedo: !readOnly && historyCanRedo(history),
|
|
279
|
+
flush: save
|
|
280
|
+
};
|
|
281
|
+
}, [
|
|
282
|
+
present,
|
|
283
|
+
history,
|
|
284
|
+
status,
|
|
285
|
+
error,
|
|
286
|
+
saving,
|
|
287
|
+
dirty,
|
|
288
|
+
offline,
|
|
289
|
+
readOnly,
|
|
290
|
+
author,
|
|
291
|
+
tool,
|
|
292
|
+
settings,
|
|
293
|
+
selectedId,
|
|
294
|
+
stamp,
|
|
295
|
+
dispatch,
|
|
296
|
+
commit,
|
|
297
|
+
save
|
|
298
|
+
]);
|
|
299
|
+
return controller;
|
|
300
|
+
}
|
|
301
|
+
export {
|
|
302
|
+
AUTOSAVE_MS,
|
|
303
|
+
RETRY_MS,
|
|
304
|
+
useAnnotationLayer
|
|
305
|
+
};
|
|
306
|
+
//# sourceMappingURL=useAnnotationLayer.js.map
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../../src/annotations/useAnnotationLayer.ts"],
|
|
4
|
+
"sourcesContent": ["/**\n * Annotation state for one document: loads its layer from a store, applies edits through the pure\n * reducer (so undo/redo is exact), and saves back after a short pause.\n *\n * Edits are applied from a ref, not inside a React state updater, so a mark that fails validation\n * is reported through `error` instead of throwing during render.\n *\n * With a shared store (other people edit the same layer) a save may come back merged with their\n * marks, and `pull` brings in their changes while this user is idle. Either way the remote layer is\n * REBASED in: the edits made here since are replayed on top of it with `mergeLayers`, and so is\n * every undo/redo step, so undoing never removes a colleague's mark or brings back one they deleted.\n */\n\nimport { useCallback, useEffect, useMemo, useRef, useState } from 'react'\nimport {\n DEFAULT_SETTINGS,\n type AnnotationController,\n type AnnotationTool,\n type LayerStatus,\n type NewMark,\n type ToolSettings,\n} from './controller'\nimport { mergeLayers } from './merge'\nimport { emptyLayer, type Annotation, type AnnotationLayer } from './model'\nimport {\n applyAction,\n canRedo as historyCanRedo,\n canUndo as historyCanUndo,\n createHistory,\n redo as historyRedo,\n undo as historyUndo,\n type AnnotationAction,\n type LayerHistory,\n} from './state'\nimport { AnnotationStoreOfflineError, type AnnotationStore } from './store'\n\nexport const AUTOSAVE_MS = 600\n/** After a failed save, try again this much later (while edits are still unsaved). */\nexport const RETRY_MS = 10_000\n\nexport interface UseAnnotationLayerOptions {\n documentId: string\n store: AnnotationStore\n /** Display name recorded as the author of new marks. */\n author: string\n autosaveMs?: number\n /** View only: marks are shown and comments can be read, nothing can be changed. */\n readOnly?: boolean\n /** False while the device is offline: edits are kept and saved when it comes back. */\n online?: boolean\n /** Ask the store for others' changes this often while idle (0 = never). Needs `store.pull`. */\n pullMs?: number\n now?: () => string\n makeId?: () => string\n}\n\nconst defaultNow = () => new Date().toISOString()\nconst defaultId = () => globalThis.crypto.randomUUID()\n\n/** Replay a history onto a remote layer: `sent` is what the remote layer was made from. */\nfunction rebaseHistory(\n history: LayerHistory,\n sent: AnnotationLayer,\n remote: AnnotationLayer\n): LayerHistory {\n const onto = (layer: AnnotationLayer) =>\n layer === sent ? remote : mergeLayers({ base: sent, mine: layer, theirs: remote })\n return {\n present: onto(history.present),\n past: history.past.map(onto),\n future: history.future.map(onto),\n }\n}\n\nexport function useAnnotationLayer({\n documentId,\n store,\n author,\n autosaveMs = AUTOSAVE_MS,\n readOnly: readOnlyProp = false,\n online = true,\n pullMs = 0,\n now = defaultNow,\n makeId = defaultId,\n}: UseAnnotationLayerOptions): AnnotationController {\n const [history, setHistory] = useState<LayerHistory>(() =>\n createHistory(emptyLayer(documentId, now()))\n )\n const [savedLayer, setSavedLayer] = useState<AnnotationLayer | null>(null)\n const [status, setStatus] = useState<LayerStatus>('loading')\n const [error, setError] = useState<string | null>(null)\n const [saving, setSaving] = useState(false)\n const [offlineFailure, setOfflineFailure] = useState(false)\n const [storeReadOnly, setStoreReadOnly] = useState(false)\n const [tool, setToolState] = useState<AnnotationTool>('select')\n const [settings, setSettingsState] = useState<ToolSettings>(DEFAULT_SETTINGS)\n const [selectedId, setSelectedId] = useState<string | null>(null)\n const readOnly = readOnlyProp || storeReadOnly\n\n const historyRef = useRef(history)\n const savedRef = useRef<AnnotationLayer | null>(null)\n const timerRef = useRef<ReturnType<typeof setTimeout> | undefined>(undefined)\n const retryRef = useRef<ReturnType<typeof setTimeout> | undefined>(undefined)\n const savingRef = useRef(false)\n const docRef = useRef(documentId)\n const storeRef = useRef(store)\n storeRef.current = store\n const nowRef = useRef(now)\n nowRef.current = now\n const idRef = useRef(makeId)\n idRef.current = makeId\n const readOnlyRef = useRef(readOnly)\n readOnlyRef.current = readOnly\n const onlineRef = useRef(online)\n onlineRef.current = online\n const autosaveMsRef = useRef(autosaveMs)\n autosaveMsRef.current = autosaveMs\n\n const commit = useCallback((next: LayerHistory) => {\n historyRef.current = next\n setHistory(next)\n }, [])\n\n /** Take in a layer the store produced from `sent` (a merged save, or others' changes). */\n const adoptRemote = useCallback(\n (sent: AnnotationLayer, remote: AnnotationLayer) => {\n commit(rebaseHistory(historyRef.current, sent, remote))\n savedRef.current = remote\n setSavedLayer(remote)\n },\n [commit]\n )\n\n // Load when the document changes.\n useEffect(() => {\n docRef.current = documentId\n let cancelled = false\n setStatus('loading')\n setError(null)\n setSelectedId(null)\n setSavedLayer(null)\n setStoreReadOnly(false)\n savedRef.current = null\n commit(createHistory(emptyLayer(documentId, nowRef.current())))\n storeRef.current\n .load(documentId)\n .then((layer) => {\n if (cancelled) return\n savedRef.current = layer\n setSavedLayer(layer)\n setStoreReadOnly(storeRef.current.canEdit?.(documentId) === false)\n commit(createHistory(layer))\n setStatus('ready')\n })\n .catch((e: unknown) => {\n if (cancelled) return\n setError(e instanceof Error ? e.message : 'The annotations could not be loaded')\n setStatus('error')\n })\n return () => {\n cancelled = true\n // Leaving this document (switching to another, or unmounting): write the edits still waiting\n // on the autosave timer. Without this they would be silently dropped.\n clearTimeout(timerRef.current)\n clearTimeout(retryRef.current)\n const layer = historyRef.current.present\n if (\n savedRef.current !== null &&\n layer !== savedRef.current &&\n layer.documentId === documentId &&\n !readOnlyRef.current\n ) {\n storeRef.current\n .save(layer)\n .catch((e: unknown) => console.error('Annotations could not be saved', e))\n }\n }\n }, [documentId, commit])\n\n const save = useCallback(async () => {\n clearTimeout(timerRef.current)\n clearTimeout(retryRef.current)\n const layer = historyRef.current.present\n // Nothing to write, not loaded yet (never overwrite a layer with the empty placeholder), view\n // only, or a write already in flight (its completion schedules the next one).\n if (layer === savedRef.current || savedRef.current === null) return\n if (readOnlyRef.current || savingRef.current) return\n if (!onlineRef.current) return // kept; the online effect saves it when the device is back\n savingRef.current = true\n setSaving(true)\n let failed = false\n try {\n const stored = await storeRef.current.save(layer)\n if (layer.documentId === docRef.current) {\n setError(null)\n setOfflineFailure(false)\n if (stored && stored !== layer) {\n adoptRemote(layer, stored)\n } else {\n savedRef.current = layer\n setSavedLayer(layer)\n }\n }\n } catch (e) {\n failed = true\n if (e instanceof AnnotationStoreOfflineError) {\n setOfflineFailure(true)\n } else {\n setError(e instanceof Error ? e.message : 'The annotations could not be saved')\n }\n // Try again later; any new edit also tries again.\n retryRef.current = setTimeout(() => void saveRef.current(), RETRY_MS)\n } finally {\n savingRef.current = false\n setSaving(false)\n // Edits made while this write was in flight go out next (their own timer found it busy).\n if (!failed && historyRef.current.present !== savedRef.current) {\n timerRef.current = setTimeout(() => void saveRef.current(), autosaveMsRef.current)\n }\n }\n }, [adoptRemote])\n const saveRef = useRef(save)\n saveRef.current = save\n\n const present = history.present\n const dirty = status === 'ready' && present !== savedLayer\n\n useEffect(() => {\n if (!dirty || !online || readOnly) return\n timerRef.current = setTimeout(() => void save(), autosaveMs)\n return () => clearTimeout(timerRef.current)\n }, [dirty, present, autosaveMs, save, online, readOnly])\n\n // Back online: the unsaved edits go out at once.\n useEffect(() => {\n if (online) setOfflineFailure(false)\n if (online && savedRef.current !== null && historyRef.current.present !== savedRef.current) {\n void save()\n }\n }, [online, save])\n\n // Others' changes, while this user is idle (nothing unsaved, nothing in flight).\n const pull = useCallback(async () => {\n const s = storeRef.current\n const base = savedRef.current\n if (!s.pull || !base || savingRef.current || !onlineRef.current) return\n if (historyRef.current.present !== base) return\n try {\n const remote = await s.pull(docRef.current)\n if (!remote || remote.documentId !== docRef.current || savedRef.current !== base) return\n adoptRemote(base, remote)\n } catch {\n // A failed pull changes nothing; the next one (or a save) catches up.\n }\n }, [adoptRemote])\n\n useEffect(() => {\n if (!pullMs || status !== 'ready') return\n const timer = setInterval(() => void pull(), pullMs)\n const onFocus = () => void pull()\n window.addEventListener('focus', onFocus)\n return () => {\n clearInterval(timer)\n window.removeEventListener('focus', onFocus)\n }\n }, [pullMs, status, pull])\n\n // The tab can close or reload with edits still waiting on the autosave timer, and React's own\n // cleanup does not run then. Write when the page is being left or hidden (mobile browsers often\n // fire only the latter). `save` starts the store write synchronously, which is what unload needs.\n useEffect(() => {\n const flush = () => void save()\n const onVisibility = () => {\n if (document.visibilityState === 'hidden') flush()\n }\n window.addEventListener('pagehide', flush)\n document.addEventListener('visibilitychange', onVisibility)\n return () => {\n window.removeEventListener('pagehide', flush)\n document.removeEventListener('visibilitychange', onVisibility)\n }\n }, [save])\n\n const dispatch = useCallback(\n (action: AnnotationAction): boolean => {\n if (readOnlyRef.current) return false\n try {\n commit(applyAction(historyRef.current, action))\n setError(null)\n return true\n } catch (e) {\n setError(e instanceof Error ? e.message : 'The change was rejected')\n return false\n }\n },\n [commit]\n )\n\n const stamp = useCallback(\n (mark: NewMark): Annotation => {\n const t = nowRef.current()\n return { ...mark, id: idRef.current(), author, createdAt: t, updatedAt: t } as Annotation\n },\n [author]\n )\n\n const offline = !online || offlineFailure\n\n const controller = useMemo<AnnotationController>(() => {\n const exists = (id: string | null) =>\n id !== null && present.annotations.some((a) => a.id === id) ? id : null\n return {\n layer: present,\n status,\n error,\n saving,\n dirty,\n offline,\n readOnly,\n author,\n tool: readOnly ? 'select' : tool,\n setTool: (next) => {\n if (readOnly && next !== 'select') return\n setToolState(next)\n if (next !== 'select') setSelectedId(null)\n },\n settings,\n setSettings: (patch) =>\n setSettingsState((s) => ({ ...s, ...patch, colors: { ...s.colors, ...patch.colors } })),\n selectedId: exists(selectedId),\n select: setSelectedId,\n add: (mark) => {\n const annotation = stamp(mark)\n return dispatch({ type: 'add', annotation }) ? annotation.id : null\n },\n addMany: (marks) => {\n const annotations = marks.map(stamp)\n return dispatch({ type: 'addMany', annotations }) ? annotations.map((a) => a.id) : []\n },\n update: (id, patch) => void dispatch({ type: 'update', id, patch, now: nowRef.current() }),\n remove: (id) => void dispatch({ type: 'remove', id, now: nowRef.current() }),\n setRedactionStatus: (ids, next) =>\n void dispatch({\n type: 'setRedactionStatus',\n ids,\n status: next,\n now: nowRef.current(),\n by: author,\n }),\n reply: (id, body) => {\n const t = nowRef.current()\n void dispatch({\n type: 'reply',\n id,\n reply: { id: idRef.current(), author, createdAt: t, body },\n now: t,\n })\n },\n resolve: (id, resolved) =>\n void dispatch({ type: 'resolve', id, resolved, now: nowRef.current() }),\n undo: () => {\n if (!readOnly) commit(historyUndo(historyRef.current))\n },\n redo: () => {\n if (!readOnly) commit(historyRedo(historyRef.current))\n },\n canUndo: !readOnly && historyCanUndo(history),\n canRedo: !readOnly && historyCanRedo(history),\n flush: save,\n }\n }, [\n present,\n history,\n status,\n error,\n saving,\n dirty,\n offline,\n readOnly,\n author,\n tool,\n settings,\n selectedId,\n stamp,\n dispatch,\n commit,\n save,\n ])\n\n return controller\n}\n"],
|
|
5
|
+
"mappings": "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",
|
|
6
|
+
"names": []
|
|
7
|
+
}
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
import { useEffect } from "react";
|
|
2
|
+
const isEditable = (el) => el instanceof HTMLElement && (el.isContentEditable || /^(INPUT|TEXTAREA|SELECT)$/.test(el.tagName));
|
|
3
|
+
function useAnnotationShortcuts(controller, enabled = true) {
|
|
4
|
+
useEffect(() => {
|
|
5
|
+
if (!enabled) return;
|
|
6
|
+
const onKey = (e) => {
|
|
7
|
+
if (isEditable(e.target)) return;
|
|
8
|
+
const mod = e.metaKey || e.ctrlKey;
|
|
9
|
+
if (mod && e.key.toLowerCase() === "z") {
|
|
10
|
+
e.preventDefault();
|
|
11
|
+
if (e.shiftKey) controller.redo();
|
|
12
|
+
else controller.undo();
|
|
13
|
+
} else if (mod && e.key.toLowerCase() === "y") {
|
|
14
|
+
e.preventDefault();
|
|
15
|
+
controller.redo();
|
|
16
|
+
} else if ((e.key === "Delete" || e.key === "Backspace") && controller.selectedId) {
|
|
17
|
+
e.preventDefault();
|
|
18
|
+
controller.remove(controller.selectedId);
|
|
19
|
+
} else if (e.key === "Escape") {
|
|
20
|
+
controller.select(null);
|
|
21
|
+
controller.setTool("select");
|
|
22
|
+
}
|
|
23
|
+
};
|
|
24
|
+
document.addEventListener("keydown", onKey);
|
|
25
|
+
return () => document.removeEventListener("keydown", onKey);
|
|
26
|
+
}, [controller, enabled]);
|
|
27
|
+
}
|
|
28
|
+
export {
|
|
29
|
+
useAnnotationShortcuts
|
|
30
|
+
};
|
|
31
|
+
//# sourceMappingURL=useAnnotationShortcuts.js.map
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../../src/annotations/useAnnotationShortcuts.ts"],
|
|
4
|
+
"sourcesContent": ["/** Delete, Escape, undo and redo for the annotation layer. */\n\nimport { useEffect } from 'react'\nimport type { AnnotationController } from './controller'\n\nconst isEditable = (el: EventTarget | null) =>\n el instanceof HTMLElement &&\n (el.isContentEditable || /^(INPUT|TEXTAREA|SELECT)$/.test(el.tagName))\n\n/** Delete, Escape, undo and redo, ignoring keystrokes meant for a text field. */\nexport function useAnnotationShortcuts(controller: AnnotationController, enabled = true) {\n useEffect(() => {\n if (!enabled) return\n const onKey = (e: KeyboardEvent) => {\n if (isEditable(e.target)) return\n const mod = e.metaKey || e.ctrlKey\n if (mod && e.key.toLowerCase() === 'z') {\n e.preventDefault()\n if (e.shiftKey) controller.redo()\n else controller.undo()\n } else if (mod && e.key.toLowerCase() === 'y') {\n e.preventDefault()\n controller.redo()\n } else if ((e.key === 'Delete' || e.key === 'Backspace') && controller.selectedId) {\n e.preventDefault()\n controller.remove(controller.selectedId)\n } else if (e.key === 'Escape') {\n controller.select(null)\n controller.setTool('select')\n }\n }\n document.addEventListener('keydown', onKey)\n return () => document.removeEventListener('keydown', onKey)\n }, [controller, enabled])\n}\n"],
|
|
5
|
+
"mappings": "AAEA,SAAS,iBAAiB;AAG1B,MAAM,aAAa,CAAC,OAClB,cAAc,gBACb,GAAG,qBAAqB,4BAA4B,KAAK,GAAG,OAAO;AAG/D,SAAS,uBAAuB,YAAkC,UAAU,MAAM;AACvF,YAAU,MAAM;AACd,QAAI,CAAC,QAAS;AACd,UAAM,QAAQ,CAAC,MAAqB;AAClC,UAAI,WAAW,EAAE,MAAM,EAAG;AAC1B,YAAM,MAAM,EAAE,WAAW,EAAE;AAC3B,UAAI,OAAO,EAAE,IAAI,YAAY,MAAM,KAAK;AACtC,UAAE,eAAe;AACjB,YAAI,EAAE,SAAU,YAAW,KAAK;AAAA,YAC3B,YAAW,KAAK;AAAA,MACvB,WAAW,OAAO,EAAE,IAAI,YAAY,MAAM,KAAK;AAC7C,UAAE,eAAe;AACjB,mBAAW,KAAK;AAAA,MAClB,YAAY,EAAE,QAAQ,YAAY,EAAE,QAAQ,gBAAgB,WAAW,YAAY;AACjF,UAAE,eAAe;AACjB,mBAAW,OAAO,WAAW,UAAU;AAAA,MACzC,WAAW,EAAE,QAAQ,UAAU;AAC7B,mBAAW,OAAO,IAAI;AACtB,mBAAW,QAAQ,QAAQ;AAAA,MAC7B;AAAA,IACF;AACA,aAAS,iBAAiB,WAAW,KAAK;AAC1C,WAAO,MAAM,SAAS,oBAAoB,WAAW,KAAK;AAAA,EAC5D,GAAG,CAAC,YAAY,OAAO,CAAC;AAC1B;",
|
|
6
|
+
"names": []
|
|
7
|
+
}
|
|
@@ -0,0 +1,100 @@
|
|
|
1
|
+
import { useEffect, useRef } from "react";
|
|
2
|
+
import { usePortalContainer } from "../ui/portal-container.js";
|
|
3
|
+
import { TEXT_TOOLS } from "./controller.js";
|
|
4
|
+
import { extendFocusToPointer, readSelection, selectionToPageMarks } from "./selection-marks.js";
|
|
5
|
+
const PAGE_SELECTOR = "[data-page-number]";
|
|
6
|
+
const TOUCH_SETTLE_MS = 700;
|
|
7
|
+
const MOUSE_SETTLE_MS = 80;
|
|
8
|
+
const STABLE_CHECKS = 3;
|
|
9
|
+
const MAX_SETTLE_ROUNDS = 12;
|
|
10
|
+
function useTextSelectionMarks(controller) {
|
|
11
|
+
const latest = useRef(controller);
|
|
12
|
+
latest.current = controller;
|
|
13
|
+
const pagesDoc = usePortalContainer()?.ownerDocument ?? document;
|
|
14
|
+
useEffect(() => {
|
|
15
|
+
let startedOnPage = false;
|
|
16
|
+
let touchSelecting = false;
|
|
17
|
+
let settleTimer;
|
|
18
|
+
const settleTimers = /* @__PURE__ */ new Set();
|
|
19
|
+
const markSelection = () => {
|
|
20
|
+
const c = latest.current;
|
|
21
|
+
const selection = pagesDoc.getSelection();
|
|
22
|
+
if (!selection || !TEXT_TOOLS.includes(c.tool)) return false;
|
|
23
|
+
const pages = selectionToPageMarks(readSelection(selection, pagesDoc));
|
|
24
|
+
if (pages.length === 0) return false;
|
|
25
|
+
const marks = pages.map(
|
|
26
|
+
(p) => c.tool === "highlight" ? {
|
|
27
|
+
kind: "highlight",
|
|
28
|
+
page: p.page,
|
|
29
|
+
rects: p.rects,
|
|
30
|
+
color: c.settings.colors.highlight,
|
|
31
|
+
text: p.text
|
|
32
|
+
} : {
|
|
33
|
+
kind: "redaction",
|
|
34
|
+
page: p.page,
|
|
35
|
+
rects: p.rects,
|
|
36
|
+
reason: c.settings.redactionReason,
|
|
37
|
+
text: p.text,
|
|
38
|
+
status: "pending"
|
|
39
|
+
}
|
|
40
|
+
);
|
|
41
|
+
if (c.addMany(marks).length === 0) return false;
|
|
42
|
+
selection.removeAllRanges();
|
|
43
|
+
return true;
|
|
44
|
+
};
|
|
45
|
+
const onDown = (e) => {
|
|
46
|
+
startedOnPage = e.target instanceof Element && e.target.closest(PAGE_SELECTOR) !== null;
|
|
47
|
+
touchSelecting = startedOnPage && e.pointerType === "touch";
|
|
48
|
+
};
|
|
49
|
+
const onUp = (e) => {
|
|
50
|
+
if (!startedOnPage || !TEXT_TOOLS.includes(latest.current.tool)) return;
|
|
51
|
+
startedOnPage = false;
|
|
52
|
+
const selection = pagesDoc.getSelection();
|
|
53
|
+
if (selection && e.pointerType === "mouse") {
|
|
54
|
+
extendFocusToPointer(selection, { x: e.clientX, y: e.clientY });
|
|
55
|
+
}
|
|
56
|
+
let last = selection?.toString() ?? "";
|
|
57
|
+
let stable = 0;
|
|
58
|
+
let rounds = 0;
|
|
59
|
+
const check = () => {
|
|
60
|
+
const now = pagesDoc.getSelection()?.toString() ?? "";
|
|
61
|
+
if (now === last) stable++;
|
|
62
|
+
else {
|
|
63
|
+
last = now;
|
|
64
|
+
stable = 0;
|
|
65
|
+
}
|
|
66
|
+
if (stable >= STABLE_CHECKS || ++rounds >= MAX_SETTLE_ROUNDS) {
|
|
67
|
+
if (markSelection()) touchSelecting = false;
|
|
68
|
+
return;
|
|
69
|
+
}
|
|
70
|
+
settleTimers.add(setTimeout(check, MOUSE_SETTLE_MS));
|
|
71
|
+
};
|
|
72
|
+
settleTimers.add(setTimeout(check, MOUSE_SETTLE_MS));
|
|
73
|
+
};
|
|
74
|
+
const onSelectionChange = () => {
|
|
75
|
+
if (!touchSelecting || !TEXT_TOOLS.includes(latest.current.tool)) return;
|
|
76
|
+
clearTimeout(settleTimer);
|
|
77
|
+
settleTimer = setTimeout(() => {
|
|
78
|
+
if (markSelection()) touchSelecting = false;
|
|
79
|
+
}, TOUCH_SETTLE_MS);
|
|
80
|
+
};
|
|
81
|
+
pagesDoc.addEventListener("pointerdown", onDown, true);
|
|
82
|
+
pagesDoc.addEventListener("pointerup", onUp, true);
|
|
83
|
+
pagesDoc.addEventListener("selectionchange", onSelectionChange);
|
|
84
|
+
return () => {
|
|
85
|
+
clearTimeout(settleTimer);
|
|
86
|
+
settleTimers.forEach(clearTimeout);
|
|
87
|
+
pagesDoc.removeEventListener("pointerdown", onDown, true);
|
|
88
|
+
pagesDoc.removeEventListener("pointerup", onUp, true);
|
|
89
|
+
pagesDoc.removeEventListener("selectionchange", onSelectionChange);
|
|
90
|
+
};
|
|
91
|
+
}, [pagesDoc]);
|
|
92
|
+
}
|
|
93
|
+
export {
|
|
94
|
+
MAX_SETTLE_ROUNDS,
|
|
95
|
+
MOUSE_SETTLE_MS,
|
|
96
|
+
STABLE_CHECKS,
|
|
97
|
+
TOUCH_SETTLE_MS,
|
|
98
|
+
useTextSelectionMarks
|
|
99
|
+
};
|
|
100
|
+
//# sourceMappingURL=useTextSelectionMarks.js.map
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../../src/annotations/useTextSelectionMarks.ts"],
|
|
4
|
+
"sourcesContent": ["/**\n * Turns a text selection made on the page into marks while the highlight or redact-text tool is\n * active. Only a selection that STARTED on a page counts: otherwise text left selected from an\n * earlier gesture would be marked the moment the user clicked a toolbar button.\n *\n * With a mouse the gesture is press, drag, release, so the release marks the selection. A touch\n * selection is different: the user long-presses a word, then drags the handles, and the browser\n * may cancel the pointer instead of releasing it. So for touch the selection is marked once it has\n * stopped changing for a moment. The marks are undoable, and redactions stay pending until reviewed.\n */\n\nimport { useEffect, useRef } from 'react'\nimport { usePortalContainer } from '../ui/portal-container'\nimport { TEXT_TOOLS, type AnnotationController, type NewMark } from './controller'\nimport { extendFocusToPointer, readSelection, selectionToPageMarks } from './selection-marks'\n\nconst PAGE_SELECTOR = '[data-page-number]'\n\n/** How long a touch selection must stay unchanged before it is turned into marks. */\nexport const TOUCH_SETTLE_MS = 700\n\n/**\n * After a mouse release the browser may still be extending the selection (WebKit does, under\n * load), so reading it at once can capture only part of what the user selected: a redaction that\n * under-covers. The release therefore waits until the selection has read the same on\n * STABLE_CHECKS consecutive checks, MOUSE_SETTLE_MS apart, and gives up waiting after\n * MAX_SETTLE_ROUNDS checks so a selection that never stops changing cannot hang the tool.\n */\nexport const MOUSE_SETTLE_MS = 80\nexport const STABLE_CHECKS = 3\nexport const MAX_SETTLE_ROUNDS = 12\n\nexport function useTextSelectionMarks(controller: AnnotationController) {\n const latest = useRef(controller)\n latest.current = controller\n // A viewer popped out to another window renders into that window's document, which has its own\n // selection and events. Listen to the document the pages are actually in.\n const pagesDoc = usePortalContainer()?.ownerDocument ?? document\n\n useEffect(() => {\n let startedOnPage = false\n let touchSelecting = false\n let settleTimer: ReturnType<typeof setTimeout> | undefined\n const settleTimers = new Set<ReturnType<typeof setTimeout>>()\n\n /** Mark whatever is selected on the pages. Returns true when marks were made. */\n const markSelection = (): boolean => {\n const c = latest.current\n const selection = pagesDoc.getSelection()\n if (!selection || !TEXT_TOOLS.includes(c.tool)) return false\n const pages = selectionToPageMarks(readSelection(selection, pagesDoc))\n if (pages.length === 0) return false\n const marks: NewMark[] = pages.map((p) =>\n c.tool === 'highlight'\n ? {\n kind: 'highlight',\n page: p.page,\n rects: p.rects,\n color: c.settings.colors.highlight,\n text: p.text,\n }\n : {\n kind: 'redaction',\n page: p.page,\n rects: p.rects,\n reason: c.settings.redactionReason,\n text: p.text,\n status: 'pending',\n }\n )\n if (c.addMany(marks).length === 0) return false\n selection.removeAllRanges()\n return true\n }\n\n const onDown = (e: PointerEvent) => {\n startedOnPage = e.target instanceof Element && e.target.closest(PAGE_SELECTOR) !== null\n touchSelecting = startedOnPage && e.pointerType === 'touch'\n }\n\n const onUp = (e: PointerEvent) => {\n if (!startedOnPage || !TEXT_TOOLS.includes(latest.current.tool)) return\n startedOnPage = false\n const selection = pagesDoc.getSelection()\n if (selection && e.pointerType === 'mouse') {\n extendFocusToPointer(selection, { x: e.clientX, y: e.clientY })\n }\n // Let the browser finish updating the selection for this gesture first.\n let last = selection?.toString() ?? ''\n let stable = 0\n let rounds = 0\n const check = () => {\n const now = pagesDoc.getSelection()?.toString() ?? ''\n if (now === last) stable++\n else {\n last = now\n stable = 0\n }\n if (stable >= STABLE_CHECKS || ++rounds >= MAX_SETTLE_ROUNDS) {\n if (markSelection()) touchSelecting = false\n return\n }\n settleTimers.add(setTimeout(check, MOUSE_SETTLE_MS))\n }\n settleTimers.add(setTimeout(check, MOUSE_SETTLE_MS))\n }\n\n const onSelectionChange = () => {\n if (!touchSelecting || !TEXT_TOOLS.includes(latest.current.tool)) return\n clearTimeout(settleTimer)\n settleTimer = setTimeout(() => {\n if (markSelection()) touchSelecting = false\n }, TOUCH_SETTLE_MS)\n }\n\n pagesDoc.addEventListener('pointerdown', onDown, true)\n pagesDoc.addEventListener('pointerup', onUp, true)\n pagesDoc.addEventListener('selectionchange', onSelectionChange)\n return () => {\n clearTimeout(settleTimer)\n settleTimers.forEach(clearTimeout)\n pagesDoc.removeEventListener('pointerdown', onDown, true)\n pagesDoc.removeEventListener('pointerup', onUp, true)\n pagesDoc.removeEventListener('selectionchange', onSelectionChange)\n }\n }, [pagesDoc])\n}\n"],
|
|
5
|
+
"mappings": "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",
|
|
6
|
+
"names": []
|
|
7
|
+
}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
function artifactKindFromFileName(fileName) {
|
|
2
|
+
const ext = (fileName ?? "").toLowerCase().match(/\.[a-z0-9]+$/)?.[0];
|
|
3
|
+
if (ext === ".html" || ext === ".htm") return "html";
|
|
4
|
+
if (ext === ".jsx") return "react";
|
|
5
|
+
return null;
|
|
6
|
+
}
|
|
7
|
+
function artifactKindFromMode(mode) {
|
|
8
|
+
return mode === "html" || mode === "react" ? mode : null;
|
|
9
|
+
}
|
|
10
|
+
function viewerTabForArtifactMode(mode) {
|
|
11
|
+
if (mode === "image") return "pdf";
|
|
12
|
+
return artifactKindFromMode(mode) ? "preview" : "edit";
|
|
13
|
+
}
|
|
14
|
+
export {
|
|
15
|
+
artifactKindFromFileName,
|
|
16
|
+
artifactKindFromMode,
|
|
17
|
+
viewerTabForArtifactMode
|
|
18
|
+
};
|
|
19
|
+
//# sourceMappingURL=artifact-kind.js.map
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../../src/artifacts/artifact-kind.ts"],
|
|
4
|
+
"sourcesContent": ["/**\n * Which live renderer, if any, an artifact maps to. Kept free of heavy imports (no compiler) so the\n * document viewer can use it without pulling the preview code into its bundle.\n *\n * The backend persists an artifact's render mode in the saved file's extension: .html / .jsx are live\n * artifacts; document drafts are stored as .docx and open in the Word editor.\n */\nexport type ArtifactPreviewKind = 'html' | 'react'\n\nexport function artifactKindFromFileName(fileName?: string | null): ArtifactPreviewKind | null {\n const ext = (fileName ?? '').toLowerCase().match(/\\.[a-z0-9]+$/)?.[0]\n if (ext === '.html' || ext === '.htm') return 'html'\n if (ext === '.jsx') return 'react'\n return null\n}\n\nexport function artifactKindFromMode(mode?: string | null): ArtifactPreviewKind | null {\n return mode === 'html' || mode === 'react' ? mode : null\n}\n\n/**\n * The viewer tab an artifact opens on: a generated image on its media view ('pdf'), an html/react\n * artifact on its rendered Preview, and a document draft (stored as .docx) in the Word editor.\n */\nexport function viewerTabForArtifactMode(mode?: string | null): 'pdf' | 'preview' | 'edit' {\n if (mode === 'image') return 'pdf'\n return artifactKindFromMode(mode) ? 'preview' : 'edit'\n}\n"],
|
|
5
|
+
"mappings": "AASO,SAAS,yBAAyB,UAAsD;AAC7F,QAAM,OAAO,YAAY,IAAI,YAAY,EAAE,MAAM,cAAc,IAAI,CAAC;AACpE,MAAI,QAAQ,WAAW,QAAQ,OAAQ,QAAO;AAC9C,MAAI,QAAQ,OAAQ,QAAO;AAC3B,SAAO;AACT;AAEO,SAAS,qBAAqB,MAAkD;AACrF,SAAO,SAAS,UAAU,SAAS,UAAU,OAAO;AACtD;AAMO,SAAS,yBAAyB,MAAkD;AACzF,MAAI,SAAS,QAAS,QAAO;AAC7B,SAAO,qBAAqB,IAAI,IAAI,YAAY;AAClD;",
|
|
6
|
+
"names": []
|
|
7
|
+
}
|