@arbidocs/react 0.5.111 → 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/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.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.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.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-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-DI5KSVKY.cjs → chunk-UDDJIUHJ.cjs} +3 -3
- package/dist/{chunk-DI5KSVKY.cjs.map → chunk-UDDJIUHJ.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 +80 -80
- 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 +80 -80
- 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 +282 -282
- package/dist/index.js +702 -17116
- package/dist/index.js.map +7 -1
- package/dist/{chunk-SSXFVWCT.js → lazy-chunk.js} +8 -8
- 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/{chunk-ZM6N7YZH.js → query-keys.js} +18 -31
- 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 +154 -154
- package/dist/ui/index.js +290 -10
- 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.js +19 -3
- package/dist/viewers/PdfViewer.js.map +7 -1
- package/dist/{PdfViewerImpl-TEBYF2QI.js → viewers/PdfViewerImpl.js} +25 -19
- 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.js +61 -271
- 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 +4 -4
- package/dist/PdfViewerImpl-TEBYF2QI.js.map +0 -1
- package/dist/PdfViewerImpl.d-B28hLEuj.d.cts +0 -62
- 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-4FL3X3LA.js +0 -2057
- package/dist/chunk-4FL3X3LA.js.map +0 -1
- package/dist/chunk-6QNBSXCE.js +0 -271
- package/dist/chunk-6QNBSXCE.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-DPYBZDJB.js.map +0 -1
- package/dist/chunk-DZKRL5H3.js +0 -2766
- package/dist/chunk-DZKRL5H3.js.map +0 -1
- package/dist/chunk-HDCRPPBW.js +0 -75
- package/dist/chunk-HDCRPPBW.js.map +0 -1
- package/dist/chunk-L2IPPTVC.js +0 -20
- package/dist/chunk-L2IPPTVC.js.map +0 -1
- package/dist/chunk-LSU4UPS5.js +0 -1011
- package/dist/chunk-LSU4UPS5.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-PTOP7OHG.js.map +0 -1
- package/dist/chunk-QMY2JKBI.js +0 -246
- package/dist/chunk-QMY2JKBI.js.map +0 -1
- package/dist/chunk-SN5YV6FF.js +0 -11
- package/dist/chunk-SN5YV6FF.js.map +0 -1
- package/dist/chunk-SSXFVWCT.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-XWPLOFDN.js +0 -644
- package/dist/chunk-XWPLOFDN.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/chunk-ZM6N7YZH.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-LArLnpI8.d.cts +0 -2036
- package/dist/index.d-oR5FKZpJ.d.cts +0 -579
- package/dist/index.d.cts +0 -15923
- package/dist/lazy-chunk.d-B6YDLMKI.d.cts +0 -31
- package/dist/model.d-CNtRWKVK.d.cts +0 -110
- package/dist/query-keys.d-B1Am9tIF.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 -26
- package/dist/useAudioRecorder.d-B9rlMI_E.d.cts +0 -778
- package/dist/viewers/PdfViewer.d.cts +0 -9
- package/dist/viewers/index.d.cts +0 -262
|
@@ -0,0 +1,90 @@
|
|
|
1
|
+
import { Fragment, jsx, jsxs } from "react/jsx-runtime";
|
|
2
|
+
import { useEffect, useRef, useState } from "react";
|
|
3
|
+
import { Mic, Square, Loader2 } from "lucide-react";
|
|
4
|
+
import { useAudioRecorder } from "./useAudioRecorder.js";
|
|
5
|
+
import { MicRecordingOverlay } from "./MicRecordingOverlay.js";
|
|
6
|
+
const HOLD_THRESHOLD_MS = 350;
|
|
7
|
+
function InlineMicButton({
|
|
8
|
+
focused,
|
|
9
|
+
onTranscript,
|
|
10
|
+
onError,
|
|
11
|
+
transcribe,
|
|
12
|
+
className
|
|
13
|
+
}) {
|
|
14
|
+
const recorder = useAudioRecorder();
|
|
15
|
+
const [isTranscribing, setIsTranscribing] = useState(false);
|
|
16
|
+
const [latched, setLatched] = useState(false);
|
|
17
|
+
const pressedAtRef = useRef(0);
|
|
18
|
+
useEffect(() => {
|
|
19
|
+
if (recorder.error) onError?.(recorder.error);
|
|
20
|
+
}, [recorder.error]);
|
|
21
|
+
useEffect(() => {
|
|
22
|
+
if (recorder.state !== "stopped" || !recorder.blob) return;
|
|
23
|
+
const blob = recorder.blob;
|
|
24
|
+
setIsTranscribing(true);
|
|
25
|
+
transcribe(blob).then((text) => {
|
|
26
|
+
if (text.trim()) onTranscript(text.trim());
|
|
27
|
+
}).catch((err) => {
|
|
28
|
+
onError?.(err instanceof Error ? err.message : "Could not transcribe audio.");
|
|
29
|
+
}).finally(() => {
|
|
30
|
+
setIsTranscribing(false);
|
|
31
|
+
setLatched(false);
|
|
32
|
+
recorder.reset();
|
|
33
|
+
});
|
|
34
|
+
}, [recorder.state, recorder.blob]);
|
|
35
|
+
const isRecording = recorder.state === "recording";
|
|
36
|
+
const isBusy = isTranscribing;
|
|
37
|
+
if (!focused && !isRecording && !isBusy) return null;
|
|
38
|
+
const handlePointerDown = (e) => {
|
|
39
|
+
e.preventDefault();
|
|
40
|
+
if (isRecording) return;
|
|
41
|
+
pressedAtRef.current = Date.now();
|
|
42
|
+
void recorder.start();
|
|
43
|
+
};
|
|
44
|
+
const handlePointerUp = () => {
|
|
45
|
+
if (!isRecording) return;
|
|
46
|
+
if (latched) {
|
|
47
|
+
recorder.stop();
|
|
48
|
+
setLatched(false);
|
|
49
|
+
return;
|
|
50
|
+
}
|
|
51
|
+
const held = Date.now() - pressedAtRef.current;
|
|
52
|
+
if (held >= HOLD_THRESHOLD_MS) {
|
|
53
|
+
recorder.stop();
|
|
54
|
+
} else {
|
|
55
|
+
setLatched(true);
|
|
56
|
+
}
|
|
57
|
+
};
|
|
58
|
+
const handlePointerLeave = () => {
|
|
59
|
+
if (isRecording && !latched) recorder.stop();
|
|
60
|
+
};
|
|
61
|
+
return /* @__PURE__ */ jsxs(Fragment, { children: [
|
|
62
|
+
/* @__PURE__ */ jsx(
|
|
63
|
+
"button",
|
|
64
|
+
{
|
|
65
|
+
type: "button",
|
|
66
|
+
onPointerDown: handlePointerDown,
|
|
67
|
+
onPointerUp: handlePointerUp,
|
|
68
|
+
onPointerLeave: handlePointerLeave,
|
|
69
|
+
onPointerCancel: handlePointerLeave,
|
|
70
|
+
disabled: isBusy,
|
|
71
|
+
title: isRecording ? "Release to stop, or tap again if hands-free" : "Hold, or tap to dictate",
|
|
72
|
+
"data-testid": "inline-mic-button",
|
|
73
|
+
className: `inline-flex items-center justify-center rounded-full transition-colors disabled:pointer-events-none ${isRecording ? "h-7 w-7 bg-red-500 text-white shadow-sm hover:bg-red-600" : isBusy ? "h-6 w-6 text-muted-foreground" : "h-6 w-6 text-muted-foreground/50 hover:bg-muted hover:text-muted-foreground"} ${className ?? ""}`,
|
|
74
|
+
children: isBusy ? /* @__PURE__ */ jsx(Loader2, { className: "h-3.5 w-3.5 animate-spin" }) : isRecording ? /* @__PURE__ */ jsx(Square, { className: "h-3 w-3 fill-current" }) : /* @__PURE__ */ jsx(Mic, { className: "h-3.5 w-3.5" })
|
|
75
|
+
}
|
|
76
|
+
),
|
|
77
|
+
isRecording && /* @__PURE__ */ jsx(
|
|
78
|
+
MicRecordingOverlay,
|
|
79
|
+
{
|
|
80
|
+
level: recorder.level,
|
|
81
|
+
elapsedMs: recorder.elapsedMs,
|
|
82
|
+
caption: latched ? "Tap the mic again to stop" : "Release to stop, or keep holding"
|
|
83
|
+
}
|
|
84
|
+
)
|
|
85
|
+
] });
|
|
86
|
+
}
|
|
87
|
+
export {
|
|
88
|
+
InlineMicButton
|
|
89
|
+
};
|
|
90
|
+
//# sourceMappingURL=InlineMicButton.js.map
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../../src/documents/InlineMicButton.tsx"],
|
|
4
|
+
"sourcesContent": ["/**\n * InlineMicButton\n *\n * A dictate-instead-of-type button meant to sit inside a text field's own\n * padding (a corner of an `<input>`/`<textarea>`), not a standalone feature\n * in its own right \u2014 no waveform, no timer, no card chrome. Only shows while\n * the host field is focused (or mid-recording/transcribing, so it never\n * vanishes out from under an active dictation) \u2014 otherwise the field stays\n * clean. Idle it's subtle (small, muted); once pressed it's the opposite \u2014\n * a solid, unmissable recording indicator, because \"is this thing listening\"\n * is the one moment subtlety actively hurts. Built on the same\n * useAudioRecorder engine as VoiceNoteRecorder/MicButton.\n *\n * Two ways to use it, same as WhatsApp/Telegram voice messages:\n * - Press and hold, release to stop \u2014 quick dictation, thumb-friendly.\n * - A quick tap instead locks it into hands-free recording (no need to keep\n * the pointer down for a long note); tap again to stop. A tap is whatever\n * releases before HOLD_THRESHOLD_MS \u2014 past that it's a hold, and release\n * stops it immediately.\n *\n * REUSE-FIRST: props/callbacks in. The host supplies `transcribe` (its own\n * speech-to-text endpoint), `focused` (its own focus state), and\n * `onTranscript` (where the text goes \u2014 append, insert at cursor, whatever\n * fits the field).\n *\n * `preventDefault()` on pointerdown so pressing this button never steals\n * focus from the field it's embedded in \u2014 without that, a field that blurs\n * to collapse itself (e.g. an editor that exits edit mode on blur) would\n * close out from under a user mid-dictation, and `focused` would immediately\n * flip false and hide the button being pressed.\n */\n\nimport { useEffect, useRef, useState } from 'react'\nimport { Mic, Square, Loader2 } from 'lucide-react'\nimport { useAudioRecorder } from './useAudioRecorder'\nimport { MicRecordingOverlay } from './MicRecordingOverlay'\n\n// Below this, a press-release is a \"tap\" (locks into hands-free recording);\n// at or above it, release stops the recording immediately (press-and-hold).\nconst HOLD_THRESHOLD_MS = 350\n\nexport interface InlineMicButtonProps {\n /** Whether the host field currently has focus. The button renders only\n * while this is true, or while actively recording/transcribing. */\n focused: boolean\n /** Called with the transcribed text once recording stops and transcription\n * resolves. The host decides how to merge it into the field's value. */\n onTranscript: (text: string) => void\n /** Surfaces recorder or transcription failures \u2014 wire to the host's own\n * notification system. Without it, failures are silent. */\n onError?: (message: string) => void\n /** The host's own speech-to-text call. */\n transcribe: (blob: Blob) => Promise<string>\n className?: string\n}\n\nexport function InlineMicButton({\n focused,\n onTranscript,\n onError,\n transcribe,\n className,\n}: InlineMicButtonProps) {\n const recorder = useAudioRecorder()\n const [isTranscribing, setIsTranscribing] = useState(false)\n // True once a quick tap has left the recording running hands-free \u2014 the\n // next press (of any length) is the \"stop\" gesture rather than a new hold.\n const [latched, setLatched] = useState(false)\n const pressedAtRef = useRef(0)\n\n useEffect(() => {\n if (recorder.error) onError?.(recorder.error)\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [recorder.error])\n\n useEffect(() => {\n if (recorder.state !== 'stopped' || !recorder.blob) return\n const blob = recorder.blob\n setIsTranscribing(true)\n transcribe(blob)\n .then((text) => {\n if (text.trim()) onTranscript(text.trim())\n })\n .catch((err) => {\n onError?.(err instanceof Error ? err.message : 'Could not transcribe audio.')\n })\n .finally(() => {\n setIsTranscribing(false)\n setLatched(false)\n recorder.reset()\n })\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [recorder.state, recorder.blob])\n\n const isRecording = recorder.state === 'recording'\n const isBusy = isTranscribing\n\n if (!focused && !isRecording && !isBusy) return null\n\n const handlePointerDown = (e: React.PointerEvent) => {\n e.preventDefault()\n if (isRecording) return // latched (or otherwise already going) \u2014 let pointerup stop it\n pressedAtRef.current = Date.now()\n void recorder.start()\n }\n\n const handlePointerUp = () => {\n if (!isRecording) return\n if (latched) {\n recorder.stop()\n setLatched(false)\n return\n }\n const held = Date.now() - pressedAtRef.current\n if (held >= HOLD_THRESHOLD_MS) {\n recorder.stop()\n } else {\n setLatched(true)\n }\n }\n\n const handlePointerLeave = () => {\n // Dragged off mid-hold (not latched into hands-free) \u2014 stop, same as\n // releasing over the button. Latched recording stays running regardless\n // of where the pointer goes; that's the point of hands-free.\n if (isRecording && !latched) recorder.stop()\n }\n\n return (\n <>\n <button\n type=\"button\"\n onPointerDown={handlePointerDown}\n onPointerUp={handlePointerUp}\n onPointerLeave={handlePointerLeave}\n onPointerCancel={handlePointerLeave}\n disabled={isBusy}\n title={\n isRecording ? 'Release to stop, or tap again if hands-free' : 'Hold, or tap to dictate'\n }\n data-testid=\"inline-mic-button\"\n className={`inline-flex items-center justify-center rounded-full transition-colors disabled:pointer-events-none ${\n isRecording\n ? 'h-7 w-7 bg-red-500 text-white shadow-sm hover:bg-red-600'\n : isBusy\n ? 'h-6 w-6 text-muted-foreground'\n : 'h-6 w-6 text-muted-foreground/50 hover:bg-muted hover:text-muted-foreground'\n } ${className ?? ''}`}\n >\n {isBusy ? (\n <Loader2 className=\"h-3.5 w-3.5 animate-spin\" />\n ) : isRecording ? (\n <Square className=\"h-3 w-3 fill-current\" />\n ) : (\n <Mic className=\"h-3.5 w-3.5\" />\n )}\n </button>\n {/* Same big, unmissable \"is it hearing me\" feedback as the chat\n composer's mic \u2014 reused, not reimplemented, so every recording in\n the app looks and feels the same. */}\n {isRecording && (\n <MicRecordingOverlay\n level={recorder.level}\n elapsedMs={recorder.elapsedMs}\n caption={latched ? 'Tap the mic again to stop' : 'Release to stop, or keep holding'}\n />\n )}\n </>\n )\n}\n"],
|
|
5
|
+
"mappings": "AAiII,mBAqBM,KArBN;AAjGJ,SAAS,WAAW,QAAQ,gBAAgB;AAC5C,SAAS,KAAK,QAAQ,eAAe;AACrC,SAAS,wBAAwB;AACjC,SAAS,2BAA2B;AAIpC,MAAM,oBAAoB;AAiBnB,SAAS,gBAAgB;AAAA,EAC9B;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,GAAyB;AACvB,QAAM,WAAW,iBAAiB;AAClC,QAAM,CAAC,gBAAgB,iBAAiB,IAAI,SAAS,KAAK;AAG1D,QAAM,CAAC,SAAS,UAAU,IAAI,SAAS,KAAK;AAC5C,QAAM,eAAe,OAAO,CAAC;AAE7B,YAAU,MAAM;AACd,QAAI,SAAS,MAAO,WAAU,SAAS,KAAK;AAAA,EAE9C,GAAG,CAAC,SAAS,KAAK,CAAC;AAEnB,YAAU,MAAM;AACd,QAAI,SAAS,UAAU,aAAa,CAAC,SAAS,KAAM;AACpD,UAAM,OAAO,SAAS;AACtB,sBAAkB,IAAI;AACtB,eAAW,IAAI,EACZ,KAAK,CAAC,SAAS;AACd,UAAI,KAAK,KAAK,EAAG,cAAa,KAAK,KAAK,CAAC;AAAA,IAC3C,CAAC,EACA,MAAM,CAAC,QAAQ;AACd,gBAAU,eAAe,QAAQ,IAAI,UAAU,6BAA6B;AAAA,IAC9E,CAAC,EACA,QAAQ,MAAM;AACb,wBAAkB,KAAK;AACvB,iBAAW,KAAK;AAChB,eAAS,MAAM;AAAA,IACjB,CAAC;AAAA,EAEL,GAAG,CAAC,SAAS,OAAO,SAAS,IAAI,CAAC;AAElC,QAAM,cAAc,SAAS,UAAU;AACvC,QAAM,SAAS;AAEf,MAAI,CAAC,WAAW,CAAC,eAAe,CAAC,OAAQ,QAAO;AAEhD,QAAM,oBAAoB,CAAC,MAA0B;AACnD,MAAE,eAAe;AACjB,QAAI,YAAa;AACjB,iBAAa,UAAU,KAAK,IAAI;AAChC,SAAK,SAAS,MAAM;AAAA,EACtB;AAEA,QAAM,kBAAkB,MAAM;AAC5B,QAAI,CAAC,YAAa;AAClB,QAAI,SAAS;AACX,eAAS,KAAK;AACd,iBAAW,KAAK;AAChB;AAAA,IACF;AACA,UAAM,OAAO,KAAK,IAAI,IAAI,aAAa;AACvC,QAAI,QAAQ,mBAAmB;AAC7B,eAAS,KAAK;AAAA,IAChB,OAAO;AACL,iBAAW,IAAI;AAAA,IACjB;AAAA,EACF;AAEA,QAAM,qBAAqB,MAAM;AAI/B,QAAI,eAAe,CAAC,QAAS,UAAS,KAAK;AAAA,EAC7C;AAEA,SACE,iCACE;AAAA;AAAA,MAAC;AAAA;AAAA,QACC,MAAK;AAAA,QACL,eAAe;AAAA,QACf,aAAa;AAAA,QACb,gBAAgB;AAAA,QAChB,iBAAiB;AAAA,QACjB,UAAU;AAAA,QACV,OACE,cAAc,gDAAgD;AAAA,QAEhE,eAAY;AAAA,QACZ,WAAW,uGACT,cACI,6DACA,SACE,kCACA,6EACR,IAAI,aAAa,EAAE;AAAA,QAElB,mBACC,oBAAC,WAAQ,WAAU,4BAA2B,IAC5C,cACF,oBAAC,UAAO,WAAU,wBAAuB,IAEzC,oBAAC,OAAI,WAAU,eAAc;AAAA;AAAA,IAEjC;AAAA,IAIC,eACC;AAAA,MAAC;AAAA;AAAA,QACC,OAAO,SAAS;AAAA,QAChB,WAAW,SAAS;AAAA,QACpB,SAAS,UAAU,8BAA8B;AAAA;AAAA,IACnD;AAAA,KAEJ;AAEJ;",
|
|
6
|
+
"names": []
|
|
7
|
+
}
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
import { jsx, jsxs } from "react/jsx-runtime";
|
|
2
|
+
import { createPortal } from "react-dom";
|
|
3
|
+
import { MicWaveformIndicator } from "./MicWaveformIndicator.js";
|
|
4
|
+
function MicRecordingOverlay({
|
|
5
|
+
level,
|
|
6
|
+
elapsedMs,
|
|
7
|
+
caption = "Keep button pressed while speaking"
|
|
8
|
+
}) {
|
|
9
|
+
if (typeof document === "undefined") return null;
|
|
10
|
+
return createPortal(
|
|
11
|
+
/* @__PURE__ */ jsx(
|
|
12
|
+
"div",
|
|
13
|
+
{
|
|
14
|
+
"aria-hidden": true,
|
|
15
|
+
className: "pointer-events-none fixed inset-0 z-[2147483647] flex items-center justify-center",
|
|
16
|
+
"data-testid": "mic-recording-overlay",
|
|
17
|
+
children: /* @__PURE__ */ jsxs("div", { className: "flex w-72 flex-col items-center gap-3 rounded-2xl bg-background/95 px-6 py-5 shadow-2xl ring-1 ring-border backdrop-blur-sm", children: [
|
|
18
|
+
/* @__PURE__ */ jsx(MicWaveformIndicator, { level, elapsedMs }),
|
|
19
|
+
/* @__PURE__ */ jsx("p", { className: "text-center text-sm font-medium text-muted-foreground", children: caption })
|
|
20
|
+
] })
|
|
21
|
+
}
|
|
22
|
+
),
|
|
23
|
+
document.body
|
|
24
|
+
);
|
|
25
|
+
}
|
|
26
|
+
export {
|
|
27
|
+
MicRecordingOverlay
|
|
28
|
+
};
|
|
29
|
+
//# sourceMappingURL=MicRecordingOverlay.js.map
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../../src/documents/MicRecordingOverlay.tsx"],
|
|
4
|
+
"sourcesContent": ["/**\n * MicRecordingOverlay\n *\n * The big, unmissable \"is it hearing me\" feedback for an active recording \u2014\n * a centered, portaled card with the REC-badge/timer/waveform visual\n * (MicWaveformIndicator). Shared by any recorder in the app that wants the\n * same prominent treatment while actively recording: the chat composer's\n * press-and-hold mic and the inline dictate button both use this, so\n * \"you are recording\" looks and feels identical everywhere it happens.\n *\n * Non-interactive (pointer-events disabled) so it never blocks a click\n * elsewhere; mounted via a portal so it renders above whatever field or\n * layout it was triggered from, regardless of overflow/z-index there.\n */\n\nimport { createPortal } from 'react-dom'\nimport { MicWaveformIndicator } from './MicWaveformIndicator'\n\nexport interface MicRecordingOverlayProps {\n level: number\n elapsedMs: number\n /** Caption under the waveform \u2014 defaults to the press-and-hold framing. */\n caption?: string\n}\n\nexport function MicRecordingOverlay({\n level,\n elapsedMs,\n caption = 'Keep button pressed while speaking',\n}: MicRecordingOverlayProps) {\n if (typeof document === 'undefined') return null\n return createPortal(\n <div\n aria-hidden\n className=\"pointer-events-none fixed inset-0 z-[2147483647] flex items-center justify-center\"\n data-testid=\"mic-recording-overlay\"\n >\n <div className=\"flex w-72 flex-col items-center gap-3 rounded-2xl bg-background/95 px-6 py-5 shadow-2xl ring-1 ring-border backdrop-blur-sm\">\n <MicWaveformIndicator level={level} elapsedMs={elapsedMs} />\n <p className=\"text-center text-sm font-medium text-muted-foreground\">{caption}</p>\n </div>\n </div>,\n document.body\n )\n}\n"],
|
|
5
|
+
"mappings": "AAqCM,SACE,KADF;AAtBN,SAAS,oBAAoB;AAC7B,SAAS,4BAA4B;AAS9B,SAAS,oBAAoB;AAAA,EAClC;AAAA,EACA;AAAA,EACA,UAAU;AACZ,GAA6B;AAC3B,MAAI,OAAO,aAAa,YAAa,QAAO;AAC5C,SAAO;AAAA,IACL;AAAA,MAAC;AAAA;AAAA,QACC,eAAW;AAAA,QACX,WAAU;AAAA,QACV,eAAY;AAAA,QAEZ,+BAAC,SAAI,WAAU,+HACb;AAAA,8BAAC,wBAAqB,OAAc,WAAsB;AAAA,UAC1D,oBAAC,OAAE,WAAU,yDAAyD,mBAAQ;AAAA,WAChF;AAAA;AAAA,IACF;AAAA,IACA,SAAS;AAAA,EACX;AACF;",
|
|
6
|
+
"names": []
|
|
7
|
+
}
|
|
@@ -0,0 +1,68 @@
|
|
|
1
|
+
import { jsx, jsxs } from "react/jsx-runtime";
|
|
2
|
+
import { formatElapsed } from "./format-elapsed.js";
|
|
3
|
+
const BAR_WEIGHTS = [
|
|
4
|
+
0.25,
|
|
5
|
+
0.32,
|
|
6
|
+
0.48,
|
|
7
|
+
0.62,
|
|
8
|
+
0.82,
|
|
9
|
+
0.56,
|
|
10
|
+
0.92,
|
|
11
|
+
0.72,
|
|
12
|
+
1,
|
|
13
|
+
0.86,
|
|
14
|
+
0.62,
|
|
15
|
+
0.96,
|
|
16
|
+
0.76,
|
|
17
|
+
0.5,
|
|
18
|
+
0.84,
|
|
19
|
+
0.66,
|
|
20
|
+
0.42,
|
|
21
|
+
0.56,
|
|
22
|
+
0.36,
|
|
23
|
+
0.28,
|
|
24
|
+
0.22
|
|
25
|
+
];
|
|
26
|
+
const MIN_BAR_PX = 3;
|
|
27
|
+
const MAX_BAR_PX = 40;
|
|
28
|
+
function MicWaveformIndicator({
|
|
29
|
+
level,
|
|
30
|
+
elapsedMs,
|
|
31
|
+
paused = false
|
|
32
|
+
}) {
|
|
33
|
+
return /* @__PURE__ */ jsxs("div", { className: "flex flex-col items-center gap-3", "data-testid": "mic-waveform-indicator", children: [
|
|
34
|
+
/* @__PURE__ */ jsxs("div", { className: "flex items-center gap-2", children: [
|
|
35
|
+
/* @__PURE__ */ jsxs("span", { className: "relative flex h-2 w-2", children: [
|
|
36
|
+
!paused && /* @__PURE__ */ jsx("span", { className: "absolute inline-flex h-full w-full animate-ping rounded-full bg-red-500 opacity-75" }),
|
|
37
|
+
/* @__PURE__ */ jsx(
|
|
38
|
+
"span",
|
|
39
|
+
{
|
|
40
|
+
className: `relative inline-flex h-2 w-2 rounded-full ${paused ? "bg-muted-foreground" : "bg-red-500"}`
|
|
41
|
+
}
|
|
42
|
+
)
|
|
43
|
+
] }),
|
|
44
|
+
/* @__PURE__ */ jsx(
|
|
45
|
+
"span",
|
|
46
|
+
{
|
|
47
|
+
className: `text-xs font-semibold uppercase tracking-wide ${paused ? "text-muted-foreground" : "text-red-500"}`,
|
|
48
|
+
children: paused ? "Paused" : "Rec"
|
|
49
|
+
}
|
|
50
|
+
),
|
|
51
|
+
/* @__PURE__ */ jsx("span", { className: "font-mono text-xs tabular-nums text-muted-foreground", children: formatElapsed(elapsedMs) })
|
|
52
|
+
] }),
|
|
53
|
+
/* @__PURE__ */ jsx("div", { className: "flex h-10 items-end gap-[3px]", "data-testid": "mic-waveform-indicator-bars", children: BAR_WEIGHTS.map((weight, i) => /* @__PURE__ */ jsx(
|
|
54
|
+
"span",
|
|
55
|
+
{
|
|
56
|
+
className: "w-1 rounded-full bg-secondary transition-[height] duration-75 ease-out",
|
|
57
|
+
style: {
|
|
58
|
+
height: Math.min(MAX_BAR_PX, Math.max(MIN_BAR_PX, level * weight * MAX_BAR_PX))
|
|
59
|
+
}
|
|
60
|
+
},
|
|
61
|
+
i
|
|
62
|
+
)) })
|
|
63
|
+
] });
|
|
64
|
+
}
|
|
65
|
+
export {
|
|
66
|
+
MicWaveformIndicator
|
|
67
|
+
};
|
|
68
|
+
//# sourceMappingURL=MicWaveformIndicator.js.map
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../../src/documents/MicWaveformIndicator.tsx"],
|
|
4
|
+
"sourcesContent": ["/**\n * MicWaveformIndicator\n *\n * The REC-badge + timer + waveform visual \u2014 the reusable \"is it hearing me\"\n * piece shared by any press-and-hold or toggle-style audio recorder a host\n * app builds on `useAudioRecorder`. Purely presentational: no portal, no\n * card chrome, no caption \u2014 callers provide their own context around it.\n *\n * Styled like the REC-badge + timer + waveform convention every voice\n * recorder app uses (Voice Memos, WhatsApp, Slack huddles) \u2014 recognisable\n * at a glance as \"this bar height is how loud you are\", not just decoration.\n */\n\nimport { formatElapsed } from './format-elapsed'\n\n// A waveform silhouette (bell-shaped with a little natural asymmetry) rather\n// than a uniform bank of bars \u2014 reads as an actual audio waveform rather\n// than N identical dots. Every bar still scales with the same live `level`.\nconst BAR_WEIGHTS = [\n 0.25, 0.32, 0.48, 0.62, 0.82, 0.56, 0.92, 0.72, 1, 0.86, 0.62, 0.96, 0.76, 0.5, 0.84, 0.66, 0.42,\n 0.56, 0.36, 0.28, 0.22,\n]\nconst MIN_BAR_PX = 3\nconst MAX_BAR_PX = 40\n\nexport interface MicWaveformIndicatorProps {\n level: number\n elapsedMs: number\n /** Dims the REC badge and freezes the \"recording\" framing while paused,\n * without needing a separate visual language. */\n paused?: boolean\n}\n\nexport function MicWaveformIndicator({\n level,\n elapsedMs,\n paused = false,\n}: MicWaveformIndicatorProps) {\n return (\n <div className=\"flex flex-col items-center gap-3\" data-testid=\"mic-waveform-indicator\">\n <div className=\"flex items-center gap-2\">\n <span className=\"relative flex h-2 w-2\">\n {!paused && (\n <span className=\"absolute inline-flex h-full w-full animate-ping rounded-full bg-red-500 opacity-75\" />\n )}\n <span\n className={`relative inline-flex h-2 w-2 rounded-full ${paused ? 'bg-muted-foreground' : 'bg-red-500'}`}\n />\n </span>\n <span\n className={`text-xs font-semibold uppercase tracking-wide ${paused ? 'text-muted-foreground' : 'text-red-500'}`}\n >\n {paused ? 'Paused' : 'Rec'}\n </span>\n <span className=\"font-mono text-xs tabular-nums text-muted-foreground\">\n {formatElapsed(elapsedMs)}\n </span>\n </div>\n <div className=\"flex h-10 items-end gap-[3px]\" data-testid=\"mic-waveform-indicator-bars\">\n {BAR_WEIGHTS.map((weight, i) => (\n <span\n key={i}\n className=\"w-1 rounded-full bg-secondary transition-[height] duration-75 ease-out\"\n style={{\n height: Math.min(MAX_BAR_PX, Math.max(MIN_BAR_PX, level * weight * MAX_BAR_PX)),\n }}\n />\n ))}\n </div>\n </div>\n )\n}\n"],
|
|
5
|
+
"mappings": "AAyCQ,SAEI,KAFJ;AA5BR,SAAS,qBAAqB;AAK9B,MAAM,cAAc;AAAA,EAClB;AAAA,EAAM;AAAA,EAAM;AAAA,EAAM;AAAA,EAAM;AAAA,EAAM;AAAA,EAAM;AAAA,EAAM;AAAA,EAAM;AAAA,EAAG;AAAA,EAAM;AAAA,EAAM;AAAA,EAAM;AAAA,EAAM;AAAA,EAAK;AAAA,EAAM;AAAA,EAAM;AAAA,EAC5F;AAAA,EAAM;AAAA,EAAM;AAAA,EAAM;AACpB;AACA,MAAM,aAAa;AACnB,MAAM,aAAa;AAUZ,SAAS,qBAAqB;AAAA,EACnC;AAAA,EACA;AAAA,EACA,SAAS;AACX,GAA8B;AAC5B,SACE,qBAAC,SAAI,WAAU,oCAAmC,eAAY,0BAC5D;AAAA,yBAAC,SAAI,WAAU,2BACb;AAAA,2BAAC,UAAK,WAAU,yBACb;AAAA,SAAC,UACA,oBAAC,UAAK,WAAU,sFAAqF;AAAA,QAEvG;AAAA,UAAC;AAAA;AAAA,YACC,WAAW,6CAA6C,SAAS,wBAAwB,YAAY;AAAA;AAAA,QACvG;AAAA,SACF;AAAA,MACA;AAAA,QAAC;AAAA;AAAA,UACC,WAAW,iDAAiD,SAAS,0BAA0B,cAAc;AAAA,UAE5G,mBAAS,WAAW;AAAA;AAAA,MACvB;AAAA,MACA,oBAAC,UAAK,WAAU,wDACb,wBAAc,SAAS,GAC1B;AAAA,OACF;AAAA,IACA,oBAAC,SAAI,WAAU,iCAAgC,eAAY,+BACxD,sBAAY,IAAI,CAAC,QAAQ,MACxB;AAAA,MAAC;AAAA;AAAA,QAEC,WAAU;AAAA,QACV,OAAO;AAAA,UACL,QAAQ,KAAK,IAAI,YAAY,KAAK,IAAI,YAAY,QAAQ,SAAS,UAAU,CAAC;AAAA,QAChF;AAAA;AAAA,MAJK;AAAA,IAKP,CACD,GACH;AAAA,KACF;AAEJ;",
|
|
6
|
+
"names": []
|
|
7
|
+
}
|
|
@@ -0,0 +1,120 @@
|
|
|
1
|
+
import { Fragment, jsx, jsxs } from "react/jsx-runtime";
|
|
2
|
+
import { useEffect, useRef, useState } from "react";
|
|
3
|
+
import { Camera, Check, Loader2, RotateCcw, Trash2 } from "lucide-react";
|
|
4
|
+
import { Button } from "../ui/button.js";
|
|
5
|
+
import { ImageViewer } from "../viewers/ImageViewer.js";
|
|
6
|
+
import { useCameraStream } from "./useCameraStream.js";
|
|
7
|
+
import { captureFrameAsBlob } from "./capture-frame.js";
|
|
8
|
+
function PhotoCapture({ onSave, onDiscard, onError, isSaving = false }) {
|
|
9
|
+
const camera = useCameraStream({ video: true, audio: false });
|
|
10
|
+
const videoRef = useRef(null);
|
|
11
|
+
const [capturedBlob, setCapturedBlob] = useState(null);
|
|
12
|
+
const [captureError, setCaptureError] = useState(null);
|
|
13
|
+
useEffect(() => {
|
|
14
|
+
void camera.start();
|
|
15
|
+
}, []);
|
|
16
|
+
useEffect(() => {
|
|
17
|
+
if (camera.error) onError?.(camera.error);
|
|
18
|
+
}, [camera.error]);
|
|
19
|
+
useEffect(() => {
|
|
20
|
+
const video = videoRef.current;
|
|
21
|
+
if (!video) return;
|
|
22
|
+
video.srcObject = camera.stream;
|
|
23
|
+
if (camera.stream) void video.play().catch(() => {
|
|
24
|
+
});
|
|
25
|
+
}, [camera.stream]);
|
|
26
|
+
const handleShutter = () => {
|
|
27
|
+
const video = videoRef.current;
|
|
28
|
+
if (!video) return;
|
|
29
|
+
setCaptureError(null);
|
|
30
|
+
captureFrameAsBlob(video).then(setCapturedBlob).catch((err) => {
|
|
31
|
+
const message = err instanceof Error ? err.message : "Failed to capture the photo";
|
|
32
|
+
setCaptureError(message);
|
|
33
|
+
onError?.(message);
|
|
34
|
+
});
|
|
35
|
+
};
|
|
36
|
+
const handleRetake = () => setCapturedBlob(null);
|
|
37
|
+
const handleSave = () => {
|
|
38
|
+
if (!capturedBlob) return;
|
|
39
|
+
void onSave(capturedBlob, "image/png");
|
|
40
|
+
};
|
|
41
|
+
return /* @__PURE__ */ jsxs("div", { className: "flex h-full flex-col items-center justify-center gap-6 p-8", children: [
|
|
42
|
+
!capturedBlob && /* @__PURE__ */ jsxs(Fragment, { children: [
|
|
43
|
+
/* @__PURE__ */ jsx("div", { className: "w-full max-w-md overflow-hidden rounded-lg bg-muted/30", children: /* @__PURE__ */ jsx(
|
|
44
|
+
"video",
|
|
45
|
+
{
|
|
46
|
+
ref: videoRef,
|
|
47
|
+
autoPlay: true,
|
|
48
|
+
muted: true,
|
|
49
|
+
playsInline: true,
|
|
50
|
+
className: "w-full max-h-[60vh] object-contain",
|
|
51
|
+
"data-testid": "photo-capture-preview"
|
|
52
|
+
}
|
|
53
|
+
) }),
|
|
54
|
+
/* @__PURE__ */ jsx(
|
|
55
|
+
Button,
|
|
56
|
+
{
|
|
57
|
+
type: "button",
|
|
58
|
+
size: "lg",
|
|
59
|
+
className: "h-16 w-16 rounded-full p-0",
|
|
60
|
+
onClick: handleShutter,
|
|
61
|
+
disabled: !camera.stream,
|
|
62
|
+
"data-testid": "photo-capture-shutter-button",
|
|
63
|
+
children: /* @__PURE__ */ jsx(Camera, { className: "h-6 w-6" })
|
|
64
|
+
}
|
|
65
|
+
),
|
|
66
|
+
/* @__PURE__ */ jsx("p", { className: "text-sm text-muted-foreground", children: camera.isStarting ? "Starting camera\u2026" : camera.stream ? "Press to take a photo" : "Waiting for camera access\u2026" }),
|
|
67
|
+
captureError && /* @__PURE__ */ jsx("p", { className: "text-sm text-red-text", children: captureError })
|
|
68
|
+
] }),
|
|
69
|
+
capturedBlob && /* @__PURE__ */ jsxs(Fragment, { children: [
|
|
70
|
+
/* @__PURE__ */ jsx("div", { className: "w-full max-w-md", children: /* @__PURE__ */ jsx(ImageViewer, { blob: capturedBlob, alt: "Captured photo" }) }),
|
|
71
|
+
/* @__PURE__ */ jsxs("div", { className: "flex items-center gap-3", children: [
|
|
72
|
+
/* @__PURE__ */ jsxs(
|
|
73
|
+
Button,
|
|
74
|
+
{
|
|
75
|
+
type: "button",
|
|
76
|
+
variant: "outline",
|
|
77
|
+
onClick: onDiscard,
|
|
78
|
+
disabled: isSaving,
|
|
79
|
+
"data-testid": "photo-capture-discard-button",
|
|
80
|
+
children: [
|
|
81
|
+
/* @__PURE__ */ jsx(Trash2, { className: "mr-1.5 h-4 w-4" }),
|
|
82
|
+
"Discard"
|
|
83
|
+
]
|
|
84
|
+
}
|
|
85
|
+
),
|
|
86
|
+
/* @__PURE__ */ jsxs(
|
|
87
|
+
Button,
|
|
88
|
+
{
|
|
89
|
+
type: "button",
|
|
90
|
+
variant: "outline",
|
|
91
|
+
onClick: handleRetake,
|
|
92
|
+
disabled: isSaving,
|
|
93
|
+
"data-testid": "photo-capture-retake-button",
|
|
94
|
+
children: [
|
|
95
|
+
/* @__PURE__ */ jsx(RotateCcw, { className: "mr-1.5 h-4 w-4" }),
|
|
96
|
+
"Retake"
|
|
97
|
+
]
|
|
98
|
+
}
|
|
99
|
+
),
|
|
100
|
+
/* @__PURE__ */ jsxs(
|
|
101
|
+
Button,
|
|
102
|
+
{
|
|
103
|
+
type: "button",
|
|
104
|
+
onClick: handleSave,
|
|
105
|
+
disabled: isSaving,
|
|
106
|
+
"data-testid": "photo-capture-save-button",
|
|
107
|
+
children: [
|
|
108
|
+
isSaving ? /* @__PURE__ */ jsx(Loader2, { className: "mr-1.5 h-4 w-4 animate-spin" }) : /* @__PURE__ */ jsx(Check, { className: "mr-1.5 h-4 w-4" }),
|
|
109
|
+
isSaving ? "Saving\u2026" : "Save"
|
|
110
|
+
]
|
|
111
|
+
}
|
|
112
|
+
)
|
|
113
|
+
] })
|
|
114
|
+
] })
|
|
115
|
+
] });
|
|
116
|
+
}
|
|
117
|
+
export {
|
|
118
|
+
PhotoCapture
|
|
119
|
+
};
|
|
120
|
+
//# sourceMappingURL=PhotoCapture.js.map
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../../src/documents/PhotoCapture.tsx"],
|
|
4
|
+
"sourcesContent": ["/**\n * PhotoCapture\n *\n * Camera capture UI: live preview \u2192 shutter \u2192 review (retake or save).\n * Shares its shape (onSave/onDiscard/onError/isSaving) with VoiceNoteRecorder\n * so a host app wires them identically \u2014 see ViewerCaptureDraft\n * (`@arbidocs/blocks`, connection/viewer/drafts.tsx) for how the three capture\n * modes plug into the same draft/save contract.\n *\n * REUSE-FIRST: no app coupling. This component owns only the capture UI and\n * in-memory blob, never persistence \u2014 nothing is uploaded until the host's\n * `onSave` is called.\n */\n\nimport { useEffect, useRef, useState } from 'react'\nimport { Camera, Check, Loader2, RotateCcw, Trash2 } from 'lucide-react'\nimport { Button } from '../ui/button'\nimport { ImageViewer } from '../viewers/ImageViewer'\nimport { useCameraStream } from './useCameraStream'\nimport { captureFrameAsBlob } from './capture-frame'\n\nexport interface PhotoCaptureProps {\n /** Called with the captured photo when the user hits Save. Resolve to let\n * the host close/replace this capture UI; shows a saving spinner while\n * the promise is pending. */\n onSave: (blob: Blob, mimeType: string | null) => Promise<void> | void\n /** Called when the user discards the draft. */\n onDiscard: () => void\n /** Surfaces camera failures (e.g. denied permission) \u2014 wire this to the\n * host's own notification system. Without it, failures are silent. */\n onError?: (message: string) => void\n isSaving?: boolean\n}\n\nexport function PhotoCapture({ onSave, onDiscard, onError, isSaving = false }: PhotoCaptureProps) {\n const camera = useCameraStream({ video: true, audio: false })\n const videoRef = useRef<HTMLVideoElement>(null)\n const [capturedBlob, setCapturedBlob] = useState<Blob | null>(null)\n const [captureError, setCaptureError] = useState<string | null>(null)\n\n useEffect(() => {\n void camera.start()\n // Start the camera once on mount \u2014 camera.start is stable (useCallback\n // with no deps), so this intentionally doesn't re-run per render.\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [])\n\n useEffect(() => {\n if (camera.error) onError?.(camera.error)\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [camera.error])\n\n useEffect(() => {\n const video = videoRef.current\n if (!video) return\n video.srcObject = camera.stream\n if (camera.stream) void video.play().catch(() => {})\n }, [camera.stream])\n\n const handleShutter = () => {\n const video = videoRef.current\n if (!video) return\n setCaptureError(null)\n captureFrameAsBlob(video)\n .then(setCapturedBlob)\n .catch((err) => {\n const message = err instanceof Error ? err.message : 'Failed to capture the photo'\n setCaptureError(message)\n onError?.(message)\n })\n }\n\n const handleRetake = () => setCapturedBlob(null)\n\n const handleSave = () => {\n if (!capturedBlob) return\n void onSave(capturedBlob, 'image/png')\n }\n\n return (\n <div className=\"flex h-full flex-col items-center justify-center gap-6 p-8\">\n {!capturedBlob && (\n <>\n <div className=\"w-full max-w-md overflow-hidden rounded-lg bg-muted/30\">\n <video\n ref={videoRef}\n autoPlay\n muted\n playsInline\n className=\"w-full max-h-[60vh] object-contain\"\n data-testid=\"photo-capture-preview\"\n />\n </div>\n <Button\n type=\"button\"\n size=\"lg\"\n className=\"h-16 w-16 rounded-full p-0\"\n onClick={handleShutter}\n disabled={!camera.stream}\n data-testid=\"photo-capture-shutter-button\"\n >\n <Camera className=\"h-6 w-6\" />\n </Button>\n <p className=\"text-sm text-muted-foreground\">\n {camera.isStarting\n ? 'Starting camera\u2026'\n : camera.stream\n ? 'Press to take a photo'\n : 'Waiting for camera access\u2026'}\n </p>\n {captureError && <p className=\"text-sm text-red-text\">{captureError}</p>}\n </>\n )}\n\n {capturedBlob && (\n <>\n <div className=\"w-full max-w-md\">\n <ImageViewer blob={capturedBlob} alt=\"Captured photo\" />\n </div>\n <div className=\"flex items-center gap-3\">\n <Button\n type=\"button\"\n variant=\"outline\"\n onClick={onDiscard}\n disabled={isSaving}\n data-testid=\"photo-capture-discard-button\"\n >\n <Trash2 className=\"mr-1.5 h-4 w-4\" />\n Discard\n </Button>\n <Button\n type=\"button\"\n variant=\"outline\"\n onClick={handleRetake}\n disabled={isSaving}\n data-testid=\"photo-capture-retake-button\"\n >\n <RotateCcw className=\"mr-1.5 h-4 w-4\" />\n Retake\n </Button>\n <Button\n type=\"button\"\n onClick={handleSave}\n disabled={isSaving}\n data-testid=\"photo-capture-save-button\"\n >\n {isSaving ? (\n <Loader2 className=\"mr-1.5 h-4 w-4 animate-spin\" />\n ) : (\n <Check className=\"mr-1.5 h-4 w-4\" />\n )}\n {isSaving ? 'Saving\u2026' : 'Save'}\n </Button>\n </div>\n </>\n )}\n </div>\n )\n}\n"],
|
|
5
|
+
"mappings": "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",
|
|
6
|
+
"names": []
|
|
7
|
+
}
|
|
@@ -0,0 +1,129 @@
|
|
|
1
|
+
import { Fragment, jsx, jsxs } from "react/jsx-runtime";
|
|
2
|
+
import { useEffect, useRef } from "react";
|
|
3
|
+
import { Check, Circle, Loader2, RotateCcw, Square, Trash2 } from "lucide-react";
|
|
4
|
+
import { Button } from "../ui/button.js";
|
|
5
|
+
import { VideoViewer } from "../viewers/VideoViewer.js";
|
|
6
|
+
import { useCameraStream } from "./useCameraStream.js";
|
|
7
|
+
import { useVideoRecorder } from "./useVideoRecorder.js";
|
|
8
|
+
import { formatElapsed } from "./format-elapsed.js";
|
|
9
|
+
function VideoCapture({ onSave, onDiscard, onError, isSaving = false }) {
|
|
10
|
+
const camera = useCameraStream({ video: true, audio: true });
|
|
11
|
+
const recorder = useVideoRecorder(camera.stream);
|
|
12
|
+
const videoRef = useRef(null);
|
|
13
|
+
useEffect(() => {
|
|
14
|
+
void camera.start();
|
|
15
|
+
}, []);
|
|
16
|
+
useEffect(() => {
|
|
17
|
+
if (camera.error) onError?.(camera.error);
|
|
18
|
+
}, [camera.error]);
|
|
19
|
+
useEffect(() => {
|
|
20
|
+
const video = videoRef.current;
|
|
21
|
+
if (!video || recorder.state === "stopped") return;
|
|
22
|
+
video.srcObject = camera.stream;
|
|
23
|
+
if (camera.stream) void video.play().catch(() => {
|
|
24
|
+
});
|
|
25
|
+
}, [camera.stream, recorder.state]);
|
|
26
|
+
const handleRetake = () => {
|
|
27
|
+
recorder.reset();
|
|
28
|
+
};
|
|
29
|
+
const handleSave = () => {
|
|
30
|
+
if (!recorder.blob) return;
|
|
31
|
+
void onSave(recorder.blob, recorder.mimeType);
|
|
32
|
+
};
|
|
33
|
+
return /* @__PURE__ */ jsxs("div", { className: "flex h-full flex-col items-center justify-center gap-6 p-8", children: [
|
|
34
|
+
recorder.state !== "stopped" && /* @__PURE__ */ jsxs(Fragment, { children: [
|
|
35
|
+
/* @__PURE__ */ jsx("div", { className: "w-full max-w-md overflow-hidden rounded-lg bg-muted/30", children: /* @__PURE__ */ jsx(
|
|
36
|
+
"video",
|
|
37
|
+
{
|
|
38
|
+
ref: videoRef,
|
|
39
|
+
autoPlay: true,
|
|
40
|
+
muted: true,
|
|
41
|
+
playsInline: true,
|
|
42
|
+
className: "w-full max-h-[60vh] object-contain",
|
|
43
|
+
"data-testid": "video-capture-preview"
|
|
44
|
+
}
|
|
45
|
+
) }),
|
|
46
|
+
recorder.state === "recording" && /* @__PURE__ */ jsxs("div", { className: "flex items-center gap-2", "data-testid": "video-capture-rec-indicator", children: [
|
|
47
|
+
/* @__PURE__ */ jsxs("span", { className: "relative flex h-2 w-2", children: [
|
|
48
|
+
/* @__PURE__ */ jsx("span", { className: "absolute inline-flex h-full w-full animate-ping rounded-full bg-red-500 opacity-75" }),
|
|
49
|
+
/* @__PURE__ */ jsx("span", { className: "relative inline-flex h-2 w-2 rounded-full bg-red-500" })
|
|
50
|
+
] }),
|
|
51
|
+
/* @__PURE__ */ jsx("span", { className: "text-xs font-semibold uppercase tracking-wide text-red-500", children: "Rec" }),
|
|
52
|
+
/* @__PURE__ */ jsx("span", { className: "font-mono text-xs tabular-nums text-muted-foreground", children: formatElapsed(recorder.elapsedMs) })
|
|
53
|
+
] }),
|
|
54
|
+
recorder.state === "recording" ? /* @__PURE__ */ jsx(
|
|
55
|
+
Button,
|
|
56
|
+
{
|
|
57
|
+
type: "button",
|
|
58
|
+
size: "lg",
|
|
59
|
+
className: "h-16 w-16 rounded-full p-0",
|
|
60
|
+
onClick: recorder.stop,
|
|
61
|
+
"data-testid": "video-capture-stop-button",
|
|
62
|
+
children: /* @__PURE__ */ jsx(Square, { className: "h-5 w-5 fill-current" })
|
|
63
|
+
}
|
|
64
|
+
) : /* @__PURE__ */ jsx(
|
|
65
|
+
Button,
|
|
66
|
+
{
|
|
67
|
+
type: "button",
|
|
68
|
+
size: "lg",
|
|
69
|
+
className: "h-16 w-16 rounded-full p-0",
|
|
70
|
+
onClick: recorder.start,
|
|
71
|
+
disabled: !camera.stream,
|
|
72
|
+
"data-testid": "video-capture-record-button",
|
|
73
|
+
children: /* @__PURE__ */ jsx(Circle, { className: "h-6 w-6 fill-current" })
|
|
74
|
+
}
|
|
75
|
+
),
|
|
76
|
+
/* @__PURE__ */ jsx("p", { className: "text-sm text-muted-foreground", children: recorder.state === "recording" ? "Tap to stop recording" : camera.isStarting ? "Starting camera\u2026" : camera.stream ? "Tap to start recording" : "Waiting for camera access\u2026" })
|
|
77
|
+
] }),
|
|
78
|
+
recorder.state === "stopped" && recorder.blob && /* @__PURE__ */ jsxs(Fragment, { children: [
|
|
79
|
+
/* @__PURE__ */ jsx("div", { className: "w-full max-w-md", children: /* @__PURE__ */ jsx(VideoViewer, { blob: recorder.blob, title: "Captured video" }) }),
|
|
80
|
+
/* @__PURE__ */ jsxs("div", { className: "flex items-center gap-3", children: [
|
|
81
|
+
/* @__PURE__ */ jsxs(
|
|
82
|
+
Button,
|
|
83
|
+
{
|
|
84
|
+
type: "button",
|
|
85
|
+
variant: "outline",
|
|
86
|
+
onClick: onDiscard,
|
|
87
|
+
disabled: isSaving,
|
|
88
|
+
"data-testid": "video-capture-discard-button",
|
|
89
|
+
children: [
|
|
90
|
+
/* @__PURE__ */ jsx(Trash2, { className: "mr-1.5 h-4 w-4" }),
|
|
91
|
+
"Discard"
|
|
92
|
+
]
|
|
93
|
+
}
|
|
94
|
+
),
|
|
95
|
+
/* @__PURE__ */ jsxs(
|
|
96
|
+
Button,
|
|
97
|
+
{
|
|
98
|
+
type: "button",
|
|
99
|
+
variant: "outline",
|
|
100
|
+
onClick: handleRetake,
|
|
101
|
+
disabled: isSaving,
|
|
102
|
+
"data-testid": "video-capture-retake-button",
|
|
103
|
+
children: [
|
|
104
|
+
/* @__PURE__ */ jsx(RotateCcw, { className: "mr-1.5 h-4 w-4" }),
|
|
105
|
+
"Record again"
|
|
106
|
+
]
|
|
107
|
+
}
|
|
108
|
+
),
|
|
109
|
+
/* @__PURE__ */ jsxs(
|
|
110
|
+
Button,
|
|
111
|
+
{
|
|
112
|
+
type: "button",
|
|
113
|
+
onClick: handleSave,
|
|
114
|
+
disabled: isSaving,
|
|
115
|
+
"data-testid": "video-capture-save-button",
|
|
116
|
+
children: [
|
|
117
|
+
isSaving ? /* @__PURE__ */ jsx(Loader2, { className: "mr-1.5 h-4 w-4 animate-spin" }) : /* @__PURE__ */ jsx(Check, { className: "mr-1.5 h-4 w-4" }),
|
|
118
|
+
isSaving ? "Saving\u2026" : "Save"
|
|
119
|
+
]
|
|
120
|
+
}
|
|
121
|
+
)
|
|
122
|
+
] })
|
|
123
|
+
] })
|
|
124
|
+
] });
|
|
125
|
+
}
|
|
126
|
+
export {
|
|
127
|
+
VideoCapture
|
|
128
|
+
};
|
|
129
|
+
//# sourceMappingURL=VideoCapture.js.map
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../../src/documents/VideoCapture.tsx"],
|
|
4
|
+
"sourcesContent": ["/**\n * VideoCapture\n *\n * Camera capture UI: live preview \u2192 tap to record / tap to stop \u2192 review\n * (playback, retake, or save). Shares its shape (onSave/onDiscard/onError/\n * isSaving) with VoiceNoteRecorder and PhotoCapture \u2014 see ViewerCaptureDraft\n * (`@arbidocs/blocks`, connection/viewer/drafts.tsx) for how the three capture\n * modes plug into the same draft/save contract.\n *\n * Deliberately a simple tap-to-start/tap-to-stop toggle rather than a\n * press-and-hold gesture \u2014 matches VoiceNoteRecorder's toggle interaction\n * and needs no extra gesture handling for a first cut of camera video.\n *\n * REUSE-FIRST: no app coupling. This component owns only the capture UI and\n * in-memory blob, never persistence \u2014 nothing is uploaded until the host's\n * `onSave` is called.\n */\n\nimport { useEffect, useRef } from 'react'\nimport { Check, Circle, Loader2, RotateCcw, Square, Trash2 } from 'lucide-react'\nimport { Button } from '../ui/button'\nimport { VideoViewer } from '../viewers/VideoViewer'\nimport { useCameraStream } from './useCameraStream'\nimport { useVideoRecorder } from './useVideoRecorder'\nimport { formatElapsed } from './format-elapsed'\n\nexport interface VideoCaptureProps {\n /** Called with the recorded clip when the user hits Save. Resolve to let\n * the host close/replace this capture UI; shows a saving spinner while\n * the promise is pending. */\n onSave: (blob: Blob, mimeType: string | null) => Promise<void> | void\n /** Called when the user discards the draft. */\n onDiscard: () => void\n /** Surfaces camera failures (e.g. denied permission) \u2014 wire this to the\n * host's own notification system. Without it, failures are silent. */\n onError?: (message: string) => void\n isSaving?: boolean\n}\n\nexport function VideoCapture({ onSave, onDiscard, onError, isSaving = false }: VideoCaptureProps) {\n // Camera audio too, not just video \u2014 a silent clip would surprise anyone\n // used to phone camera video capture.\n const camera = useCameraStream({ video: true, audio: true })\n const recorder = useVideoRecorder(camera.stream)\n const videoRef = useRef<HTMLVideoElement>(null)\n\n useEffect(() => {\n void camera.start()\n // Start the camera once on mount \u2014 see PhotoCapture's identical effect.\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [])\n\n useEffect(() => {\n if (camera.error) onError?.(camera.error)\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [camera.error])\n\n // Live preview binds to the camera stream while previewing/recording; once\n // stopped, the video element is replaced by VideoViewer playing the\n // recorded blob (below), so this effect only matters pre-stop.\n useEffect(() => {\n const video = videoRef.current\n if (!video || recorder.state === 'stopped') return\n video.srcObject = camera.stream\n if (camera.stream) void video.play().catch(() => {})\n }, [camera.stream, recorder.state])\n\n const handleRetake = () => {\n recorder.reset()\n }\n\n const handleSave = () => {\n if (!recorder.blob) return\n void onSave(recorder.blob, recorder.mimeType)\n }\n\n return (\n <div className=\"flex h-full flex-col items-center justify-center gap-6 p-8\">\n {recorder.state !== 'stopped' && (\n <>\n <div className=\"w-full max-w-md overflow-hidden rounded-lg bg-muted/30\">\n <video\n ref={videoRef}\n autoPlay\n muted\n playsInline\n className=\"w-full max-h-[60vh] object-contain\"\n data-testid=\"video-capture-preview\"\n />\n </div>\n {recorder.state === 'recording' && (\n <div className=\"flex items-center gap-2\" data-testid=\"video-capture-rec-indicator\">\n <span className=\"relative flex h-2 w-2\">\n <span className=\"absolute inline-flex h-full w-full animate-ping rounded-full bg-red-500 opacity-75\" />\n <span className=\"relative inline-flex h-2 w-2 rounded-full bg-red-500\" />\n </span>\n <span className=\"text-xs font-semibold uppercase tracking-wide text-red-500\">\n Rec\n </span>\n <span className=\"font-mono text-xs tabular-nums text-muted-foreground\">\n {formatElapsed(recorder.elapsedMs)}\n </span>\n </div>\n )}\n {recorder.state === 'recording' ? (\n <Button\n type=\"button\"\n size=\"lg\"\n className=\"h-16 w-16 rounded-full p-0\"\n onClick={recorder.stop}\n data-testid=\"video-capture-stop-button\"\n >\n <Square className=\"h-5 w-5 fill-current\" />\n </Button>\n ) : (\n <Button\n type=\"button\"\n size=\"lg\"\n className=\"h-16 w-16 rounded-full p-0\"\n onClick={recorder.start}\n disabled={!camera.stream}\n data-testid=\"video-capture-record-button\"\n >\n <Circle className=\"h-6 w-6 fill-current\" />\n </Button>\n )}\n <p className=\"text-sm text-muted-foreground\">\n {recorder.state === 'recording'\n ? 'Tap to stop recording'\n : camera.isStarting\n ? 'Starting camera\u2026'\n : camera.stream\n ? 'Tap to start recording'\n : 'Waiting for camera access\u2026'}\n </p>\n </>\n )}\n\n {recorder.state === 'stopped' && recorder.blob && (\n <>\n <div className=\"w-full max-w-md\">\n <VideoViewer blob={recorder.blob} title=\"Captured video\" />\n </div>\n <div className=\"flex items-center gap-3\">\n <Button\n type=\"button\"\n variant=\"outline\"\n onClick={onDiscard}\n disabled={isSaving}\n data-testid=\"video-capture-discard-button\"\n >\n <Trash2 className=\"mr-1.5 h-4 w-4\" />\n Discard\n </Button>\n <Button\n type=\"button\"\n variant=\"outline\"\n onClick={handleRetake}\n disabled={isSaving}\n data-testid=\"video-capture-retake-button\"\n >\n <RotateCcw className=\"mr-1.5 h-4 w-4\" />\n Record again\n </Button>\n <Button\n type=\"button\"\n onClick={handleSave}\n disabled={isSaving}\n data-testid=\"video-capture-save-button\"\n >\n {isSaving ? (\n <Loader2 className=\"mr-1.5 h-4 w-4 animate-spin\" />\n ) : (\n <Check className=\"mr-1.5 h-4 w-4\" />\n )}\n {isSaving ? 'Saving\u2026' : 'Save'}\n </Button>\n </div>\n </>\n )}\n </div>\n )\n}\n"],
|
|
5
|
+
"mappings": "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",
|
|
6
|
+
"names": []
|
|
7
|
+
}
|