@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
package/dist/chunk-6QNBSXCE.js
DELETED
|
@@ -1,271 +0,0 @@
|
|
|
1
|
-
import { useEffect, useRef, useCallback, useLayoutEffect } from 'react';
|
|
2
|
-
|
|
3
|
-
// src/viewers/page-scroll.ts
|
|
4
|
-
var PAGE_SELECTOR = '[role="article"][data-page-number]';
|
|
5
|
-
function anchorDelta(previousHeight, nextHeight, pageTop, containerTop) {
|
|
6
|
-
const delta = nextHeight - previousHeight;
|
|
7
|
-
if (delta === 0) return 0;
|
|
8
|
-
return pageTop + previousHeight <= containerTop + 1 ? delta : 0;
|
|
9
|
-
}
|
|
10
|
-
function measureVisiblePages(pages, viewTop, viewBottom) {
|
|
11
|
-
const visibility = /* @__PURE__ */ new Map();
|
|
12
|
-
let page = null;
|
|
13
|
-
let bestPx = 0;
|
|
14
|
-
let score = 0;
|
|
15
|
-
const viewHeight = viewBottom - viewTop;
|
|
16
|
-
for (const p of pages) {
|
|
17
|
-
const height = p.bottom - p.top;
|
|
18
|
-
const px = Math.min(p.bottom, viewBottom) - Math.max(p.top, viewTop);
|
|
19
|
-
if (px <= 0 || height <= 0) continue;
|
|
20
|
-
visibility.set(p.n, px / height);
|
|
21
|
-
if (px > bestPx) {
|
|
22
|
-
bestPx = px;
|
|
23
|
-
page = p.n;
|
|
24
|
-
score = px / Math.min(height, viewHeight);
|
|
25
|
-
}
|
|
26
|
-
}
|
|
27
|
-
return { page, score, visibility };
|
|
28
|
-
}
|
|
29
|
-
function useScrollAnchor(containerRef, key) {
|
|
30
|
-
useEffect(() => {
|
|
31
|
-
const container = containerRef.current;
|
|
32
|
-
if (!container || typeof ResizeObserver === "undefined") return;
|
|
33
|
-
container.style.overflowAnchor = "none";
|
|
34
|
-
const heights = /* @__PURE__ */ new Map();
|
|
35
|
-
const observer = new ResizeObserver((entries) => {
|
|
36
|
-
let shift = 0;
|
|
37
|
-
const containerTop = container.getBoundingClientRect().top;
|
|
38
|
-
for (const entry of entries) {
|
|
39
|
-
const el = entry.target;
|
|
40
|
-
const height = el.getBoundingClientRect().height;
|
|
41
|
-
const previous = heights.get(el);
|
|
42
|
-
heights.set(el, height);
|
|
43
|
-
if (previous === void 0) continue;
|
|
44
|
-
shift += anchorDelta(previous, height, el.getBoundingClientRect().top, containerTop);
|
|
45
|
-
}
|
|
46
|
-
if (shift !== 0 && !container.dataset.zooming) container.scrollTop += shift;
|
|
47
|
-
});
|
|
48
|
-
container.querySelectorAll(PAGE_SELECTOR).forEach((el) => {
|
|
49
|
-
heights.set(el, el.getBoundingClientRect().height);
|
|
50
|
-
observer.observe(el);
|
|
51
|
-
});
|
|
52
|
-
return () => observer.disconnect();
|
|
53
|
-
}, [containerRef, key]);
|
|
54
|
-
}
|
|
55
|
-
var PAGE_UPDATE_DEBOUNCE_MS = 10;
|
|
56
|
-
var MIN_VISIBILITY_THRESHOLD = 0.15;
|
|
57
|
-
var INTERSECTION_THRESHOLDS = [0, 0.25, 0.5, 0.75, 1];
|
|
58
|
-
function usePageIntersectionObserver({
|
|
59
|
-
containerRef,
|
|
60
|
-
scrollCompleteRef,
|
|
61
|
-
isEnabled,
|
|
62
|
-
getPageElements,
|
|
63
|
-
getPageNumber,
|
|
64
|
-
onPageChange,
|
|
65
|
-
onVisibilityUpdate,
|
|
66
|
-
observeKey
|
|
67
|
-
}) {
|
|
68
|
-
const latest = useRef({ getPageElements, getPageNumber, onPageChange, onVisibilityUpdate });
|
|
69
|
-
latest.current = { getPageElements, getPageNumber, onPageChange, onVisibilityUpdate };
|
|
70
|
-
useEffect(() => {
|
|
71
|
-
if (!isEnabled || !containerRef.current) return;
|
|
72
|
-
const container = containerRef.current;
|
|
73
|
-
let lastReportedPage = null;
|
|
74
|
-
let updateTimeout = null;
|
|
75
|
-
let frame = 0;
|
|
76
|
-
const evaluate = () => {
|
|
77
|
-
const root = container.getBoundingClientRect();
|
|
78
|
-
const pages = [];
|
|
79
|
-
for (const el of latest.current.getPageElements()) {
|
|
80
|
-
const n = latest.current.getPageNumber(el);
|
|
81
|
-
if (n <= 0) continue;
|
|
82
|
-
const r = el.getBoundingClientRect();
|
|
83
|
-
pages.push({ n, top: r.top, bottom: r.bottom });
|
|
84
|
-
}
|
|
85
|
-
const { page, score, visibility } = measureVisiblePages(pages, root.top, root.bottom);
|
|
86
|
-
if (scrollCompleteRef.current && page !== null && page !== lastReportedPage && score > MIN_VISIBILITY_THRESHOLD) {
|
|
87
|
-
lastReportedPage = page;
|
|
88
|
-
latest.current.onPageChange(page);
|
|
89
|
-
}
|
|
90
|
-
latest.current.onVisibilityUpdate?.(visibility);
|
|
91
|
-
};
|
|
92
|
-
const observer = new IntersectionObserver(
|
|
93
|
-
() => {
|
|
94
|
-
if (updateTimeout) clearTimeout(updateTimeout);
|
|
95
|
-
updateTimeout = setTimeout(evaluate, PAGE_UPDATE_DEBOUNCE_MS);
|
|
96
|
-
},
|
|
97
|
-
{ root: container, threshold: INTERSECTION_THRESHOLDS }
|
|
98
|
-
);
|
|
99
|
-
const onScroll = () => {
|
|
100
|
-
if (!frame) {
|
|
101
|
-
frame = requestAnimationFrame(() => {
|
|
102
|
-
frame = 0;
|
|
103
|
-
evaluate();
|
|
104
|
-
});
|
|
105
|
-
}
|
|
106
|
-
};
|
|
107
|
-
container.addEventListener("scroll", onScroll, { passive: true });
|
|
108
|
-
latest.current.getPageElements().forEach((element) => observer.observe(element));
|
|
109
|
-
return () => {
|
|
110
|
-
observer.disconnect();
|
|
111
|
-
container.removeEventListener("scroll", onScroll);
|
|
112
|
-
if (updateTimeout) clearTimeout(updateTimeout);
|
|
113
|
-
if (frame) cancelAnimationFrame(frame);
|
|
114
|
-
};
|
|
115
|
-
}, [containerRef, scrollCompleteRef, isEnabled, observeKey]);
|
|
116
|
-
}
|
|
117
|
-
var MIN_ZOOM = 0.5;
|
|
118
|
-
var MAX_ZOOM = 4;
|
|
119
|
-
var DOUBLE_TAP_ZOOM = 2;
|
|
120
|
-
var MAX_CANVAS_PIXELS = 8e6;
|
|
121
|
-
var MAX_RENDER_DPR = 2;
|
|
122
|
-
function clampZoom(zoom) {
|
|
123
|
-
if (!Number.isFinite(zoom)) return 1;
|
|
124
|
-
return Math.round(Math.min(MAX_ZOOM, Math.max(MIN_ZOOM, zoom)) * 100) / 100;
|
|
125
|
-
}
|
|
126
|
-
var ZOOM_PRESETS = [1.5, 2, 3];
|
|
127
|
-
function cycleZoom(zoom) {
|
|
128
|
-
return ZOOM_PRESETS.find((preset) => preset > zoom + 0.05) ?? 1;
|
|
129
|
-
}
|
|
130
|
-
function doubleTapZoom(zoom) {
|
|
131
|
-
return zoom > 1.05 ? 1 : DOUBLE_TAP_ZOOM;
|
|
132
|
-
}
|
|
133
|
-
function zoomLabel(zoom) {
|
|
134
|
-
return `${Math.round(zoom * 100)}%`;
|
|
135
|
-
}
|
|
136
|
-
function pinchZoom(startZoom, startDistance, distance2) {
|
|
137
|
-
if (startDistance <= 0) return startZoom;
|
|
138
|
-
return clampZoom(startZoom * distance2 / startDistance);
|
|
139
|
-
}
|
|
140
|
-
function anchoredScroll(scroll, focal, oldZoom, newZoom) {
|
|
141
|
-
if (oldZoom <= 0) return scroll;
|
|
142
|
-
return (scroll + focal) * newZoom / oldZoom - focal;
|
|
143
|
-
}
|
|
144
|
-
function renderDpr(cssWidth, cssHeight, devicePixelRatio, maxPixels = MAX_CANVAS_PIXELS) {
|
|
145
|
-
const wanted = Math.min(Math.max(devicePixelRatio || 1, 1), MAX_RENDER_DPR);
|
|
146
|
-
const area = cssWidth * cssHeight;
|
|
147
|
-
if (area <= 0) return wanted;
|
|
148
|
-
const fits = Math.sqrt(maxPixels / area);
|
|
149
|
-
return Math.max(1, Math.min(wanted, fits));
|
|
150
|
-
}
|
|
151
|
-
function fitPageWidth(contentWidth, pageBorder) {
|
|
152
|
-
if (!Number.isFinite(contentWidth)) return 0;
|
|
153
|
-
return Math.max(0, Math.floor(contentWidth) - pageBorder);
|
|
154
|
-
}
|
|
155
|
-
function contentBoxWidth(el) {
|
|
156
|
-
const style = getComputedStyle(el);
|
|
157
|
-
const padding = (parseFloat(style.paddingLeft) || 0) + (parseFloat(style.paddingRight) || 0);
|
|
158
|
-
return Math.max(0, el.clientWidth - padding);
|
|
159
|
-
}
|
|
160
|
-
var distance = (a, b) => Math.hypot(a.clientX - b.clientX, a.clientY - b.clientY);
|
|
161
|
-
var INTERACTIVE = 'button, a, input, textarea, select, [role="button"]';
|
|
162
|
-
var DOUBLE_TAP_MS = 300;
|
|
163
|
-
var DOUBLE_TAP_SLOP_PX = 30;
|
|
164
|
-
function usePinchZoom({ containerRef, zoom, onZoomChange }) {
|
|
165
|
-
const zoomRef = useRef(zoom);
|
|
166
|
-
const onChangeRef = useRef(onZoomChange);
|
|
167
|
-
onChangeRef.current = onZoomChange;
|
|
168
|
-
const focalRef = useRef(null);
|
|
169
|
-
const appliedZoomRef = useRef(zoom);
|
|
170
|
-
const request = useCallback((next, focal) => {
|
|
171
|
-
const clamped = clampZoom(next);
|
|
172
|
-
if (clamped === zoomRef.current) return;
|
|
173
|
-
focalRef.current = focal;
|
|
174
|
-
zoomRef.current = clamped;
|
|
175
|
-
onChangeRef.current?.(clamped);
|
|
176
|
-
}, []);
|
|
177
|
-
useLayoutEffect(() => {
|
|
178
|
-
zoomRef.current = zoom;
|
|
179
|
-
const container = containerRef.current;
|
|
180
|
-
const previous = appliedZoomRef.current;
|
|
181
|
-
appliedZoomRef.current = zoom;
|
|
182
|
-
if (!container || previous === zoom) return;
|
|
183
|
-
const rect = container.getBoundingClientRect();
|
|
184
|
-
const focal = focalRef.current ?? { x: rect.width / 2, y: rect.height / 2 };
|
|
185
|
-
focalRef.current = null;
|
|
186
|
-
container.dataset.zooming = "true";
|
|
187
|
-
container.scrollLeft = anchoredScroll(container.scrollLeft, focal.x, previous, zoom);
|
|
188
|
-
container.scrollTop = anchoredScroll(container.scrollTop, focal.y, previous, zoom);
|
|
189
|
-
requestAnimationFrame(
|
|
190
|
-
() => requestAnimationFrame(() => {
|
|
191
|
-
delete container.dataset.zooming;
|
|
192
|
-
})
|
|
193
|
-
);
|
|
194
|
-
}, [zoom, containerRef]);
|
|
195
|
-
useEffect(() => {
|
|
196
|
-
const el = containerRef.current;
|
|
197
|
-
if (!el) return;
|
|
198
|
-
let pinch = null;
|
|
199
|
-
let lastTap = null;
|
|
200
|
-
let frame = 0;
|
|
201
|
-
let pending = null;
|
|
202
|
-
const focalOf = (a, b) => {
|
|
203
|
-
const rect = el.getBoundingClientRect();
|
|
204
|
-
return {
|
|
205
|
-
x: (a.clientX + b.clientX) / 2 - rect.left,
|
|
206
|
-
y: (a.clientY + b.clientY) / 2 - rect.top
|
|
207
|
-
};
|
|
208
|
-
};
|
|
209
|
-
const flush = () => {
|
|
210
|
-
frame = 0;
|
|
211
|
-
if (pending) request(pending.zoom, pending.focal);
|
|
212
|
-
pending = null;
|
|
213
|
-
};
|
|
214
|
-
const onStart = (e) => {
|
|
215
|
-
if (e.touches.length === 2) {
|
|
216
|
-
pinch = { startDistance: distance(e.touches[0], e.touches[1]), startZoom: zoomRef.current };
|
|
217
|
-
lastTap = null;
|
|
218
|
-
}
|
|
219
|
-
};
|
|
220
|
-
const onMove = (e) => {
|
|
221
|
-
if (!pinch || e.touches.length !== 2) return;
|
|
222
|
-
e.preventDefault();
|
|
223
|
-
pending = {
|
|
224
|
-
zoom: pinchZoom(pinch.startZoom, pinch.startDistance, distance(e.touches[0], e.touches[1])),
|
|
225
|
-
focal: focalOf(e.touches[0], e.touches[1])
|
|
226
|
-
};
|
|
227
|
-
if (!frame) frame = requestAnimationFrame(flush);
|
|
228
|
-
};
|
|
229
|
-
const onEnd = (e) => {
|
|
230
|
-
if (pinch && e.touches.length < 2) {
|
|
231
|
-
pinch = null;
|
|
232
|
-
return;
|
|
233
|
-
}
|
|
234
|
-
if (e.touches.length !== 0 || e.changedTouches.length !== 1) return;
|
|
235
|
-
const t = e.changedTouches[0];
|
|
236
|
-
if (e.target?.closest?.(INTERACTIVE)) return;
|
|
237
|
-
const now = e.timeStamp;
|
|
238
|
-
if (lastTap && now - lastTap.time < DOUBLE_TAP_MS && Math.hypot(t.clientX - lastTap.x, t.clientY - lastTap.y) < DOUBLE_TAP_SLOP_PX) {
|
|
239
|
-
e.preventDefault();
|
|
240
|
-
const rect = el.getBoundingClientRect();
|
|
241
|
-
request(doubleTapZoom(zoomRef.current), {
|
|
242
|
-
x: t.clientX - rect.left,
|
|
243
|
-
y: t.clientY - rect.top
|
|
244
|
-
});
|
|
245
|
-
lastTap = null;
|
|
246
|
-
} else {
|
|
247
|
-
lastTap = { time: now, x: t.clientX, y: t.clientY };
|
|
248
|
-
}
|
|
249
|
-
};
|
|
250
|
-
el.addEventListener("touchstart", onStart, { passive: true });
|
|
251
|
-
el.addEventListener("touchmove", onMove, { passive: false });
|
|
252
|
-
el.addEventListener("touchend", onEnd, { passive: false });
|
|
253
|
-
el.addEventListener("touchcancel", onEnd, { passive: false });
|
|
254
|
-
return () => {
|
|
255
|
-
el.removeEventListener("touchstart", onStart);
|
|
256
|
-
el.removeEventListener("touchmove", onMove);
|
|
257
|
-
el.removeEventListener("touchend", onEnd);
|
|
258
|
-
el.removeEventListener("touchcancel", onEnd);
|
|
259
|
-
if (frame) cancelAnimationFrame(frame);
|
|
260
|
-
};
|
|
261
|
-
}, [containerRef, request]);
|
|
262
|
-
}
|
|
263
|
-
|
|
264
|
-
// src/viewers/pdf-viewer-constants.ts
|
|
265
|
-
var LAZY_LOAD_BUFFER_BEFORE = 2;
|
|
266
|
-
var LAZY_LOAD_BUFFER_AFTER = 5;
|
|
267
|
-
var INITIAL_LAZY_LOAD_BUFFER = { before: 0, after: 1 };
|
|
268
|
-
|
|
269
|
-
export { INITIAL_LAZY_LOAD_BUFFER, LAZY_LOAD_BUFFER_AFTER, LAZY_LOAD_BUFFER_BEFORE, MAX_ZOOM, MIN_ZOOM, PAGE_SELECTOR, anchorDelta, anchoredScroll, clampZoom, contentBoxWidth, cycleZoom, doubleTapZoom, fitPageWidth, pinchZoom, renderDpr, usePageIntersectionObserver, usePinchZoom, useScrollAnchor, zoomLabel };
|
|
270
|
-
//# sourceMappingURL=chunk-6QNBSXCE.js.map
|
|
271
|
-
//# sourceMappingURL=chunk-6QNBSXCE.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/viewers/page-scroll.ts","../src/viewers/usePageIntersectionObserver.ts","../src/viewers/viewer-zoom.ts","../src/viewers/pdf-viewer-constants.ts"],"names":["useEffect","distance","useRef"],"mappings":";;;AAeO,IAAM,aAAA,GAAgB;AAStB,SAAS,WAAA,CACd,cAAA,EACA,UAAA,EACA,OAAA,EACA,YAAA,EACQ;AACR,EAAA,MAAM,QAAQ,UAAA,GAAa,cAAA;AAC3B,EAAA,IAAI,KAAA,KAAU,GAAG,OAAO,CAAA;AACxB,EAAA,OAAO,OAAA,GAAU,cAAA,IAAkB,YAAA,GAAe,CAAA,GAAI,KAAA,GAAQ,CAAA;AAChE;AAcO,SAAS,mBAAA,CACd,KAAA,EACA,OAAA,EACA,UAAA,EACyE;AACzE,EAAA,MAAM,UAAA,uBAAiB,GAAA,EAAoB;AAC3C,EAAA,IAAI,IAAA,GAAsB,IAAA;AAC1B,EAAA,IAAI,MAAA,GAAS,CAAA;AACb,EAAA,IAAI,KAAA,GAAQ,CAAA;AACZ,EAAA,MAAM,aAAa,UAAA,GAAa,OAAA;AAChC,EAAA,KAAA,MAAW,KAAK,KAAA,EAAO;AACrB,IAAA,MAAM,MAAA,GAAS,CAAA,CAAE,MAAA,GAAS,CAAA,CAAE,GAAA;AAC5B,IAAA,MAAM,EAAA,GAAK,IAAA,CAAK,GAAA,CAAI,CAAA,CAAE,MAAA,EAAQ,UAAU,CAAA,GAAI,IAAA,CAAK,GAAA,CAAI,CAAA,CAAE,GAAA,EAAK,OAAO,CAAA;AACnE,IAAA,IAAI,EAAA,IAAM,CAAA,IAAK,MAAA,IAAU,CAAA,EAAG;AAC5B,IAAA,UAAA,CAAW,GAAA,CAAI,CAAA,CAAE,CAAA,EAAG,EAAA,GAAK,MAAM,CAAA;AAC/B,IAAA,IAAI,KAAK,MAAA,EAAQ;AACf,MAAA,MAAA,GAAS,EAAA;AACT,MAAA,IAAA,GAAO,CAAA,CAAE,CAAA;AACT,MAAA,KAAA,GAAQ,EAAA,GAAK,IAAA,CAAK,GAAA,CAAI,MAAA,EAAQ,UAAU,CAAA;AAAA,IAC1C;AAAA,EACF;AACA,EAAA,OAAO,EAAE,IAAA,EAAM,KAAA,EAAO,UAAA,EAAW;AACnC;AAMO,SAAS,eAAA,CAAgB,cAA6C,GAAA,EAAoB;AAC/F,EAAA,SAAA,CAAU,MAAM;AACd,IAAA,MAAM,YAAY,YAAA,CAAa,OAAA;AAC/B,IAAA,IAAI,CAAC,SAAA,IAAa,OAAO,cAAA,KAAmB,WAAA,EAAa;AACzD,IAAA,SAAA,CAAU,MAAM,cAAA,GAAiB,MAAA;AAEjC,IAAA,MAAM,OAAA,uBAAc,GAAA,EAAqB;AACzC,IAAA,MAAM,QAAA,GAAW,IAAI,cAAA,CAAe,CAAC,OAAA,KAAY;AAC/C,MAAA,IAAI,KAAA,GAAQ,CAAA;AACZ,MAAA,MAAM,YAAA,GAAe,SAAA,CAAU,qBAAA,EAAsB,CAAE,GAAA;AACvD,MAAA,KAAA,MAAW,SAAS,OAAA,EAAS;AAC3B,QAAA,MAAM,KAAK,KAAA,CAAM,MAAA;AACjB,QAAA,MAAM,MAAA,GAAS,EAAA,CAAG,qBAAA,EAAsB,CAAE,MAAA;AAC1C,QAAA,MAAM,QAAA,GAAW,OAAA,CAAQ,GAAA,CAAI,EAAE,CAAA;AAC/B,QAAA,OAAA,CAAQ,GAAA,CAAI,IAAI,MAAM,CAAA;AACtB,QAAA,IAAI,aAAa,MAAA,EAAW;AAC5B,QAAA,KAAA,IAAS,YAAY,QAAA,EAAU,MAAA,EAAQ,GAAG,qBAAA,EAAsB,CAAE,KAAK,YAAY,CAAA;AAAA,MACrF;AAEA,MAAA,IAAI,UAAU,CAAA,IAAK,CAAC,UAAU,OAAA,CAAQ,OAAA,YAAmB,SAAA,IAAa,KAAA;AAAA,IACxE,CAAC,CAAA;AACD,IAAA,SAAA,CAAU,gBAAA,CAAiB,aAAa,CAAA,CAAE,OAAA,CAAQ,CAAC,EAAA,KAAO;AACxD,MAAA,OAAA,CAAQ,GAAA,CAAI,EAAA,EAAI,EAAA,CAAG,qBAAA,GAAwB,MAAM,CAAA;AACjD,MAAA,QAAA,CAAS,QAAQ,EAAE,CAAA;AAAA,IACrB,CAAC,CAAA;AACD,IAAA,OAAO,MAAM,SAAS,UAAA,EAAW;AAAA,EACnC,CAAA,EAAG,CAAC,YAAA,EAAc,GAAG,CAAC,CAAA;AACxB;AClGA,IAAM,uBAAA,GAA0B,EAAA;AAChC,IAAM,wBAAA,GAA2B,IAAA;AACjC,IAAM,0BAA0B,CAAC,CAAA,EAAG,IAAA,EAAM,GAAA,EAAK,MAAM,CAAG,CAAA;AAiCjD,SAAS,2BAAA,CAA4B;AAAA,EAC1C,YAAA;AAAA,EACA,iBAAA;AAAA,EACA,SAAA;AAAA,EACA,eAAA;AAAA,EACA,aAAA;AAAA,EACA,YAAA;AAAA,EACA,kBAAA;AAAA,EACA;AACF,CAAA,EAAuC;AACrC,EAAA,MAAM,SAAS,MAAA,CAAO,EAAE,iBAAiB,aAAA,EAAe,YAAA,EAAc,oBAAoB,CAAA;AAC1F,EAAA,MAAA,CAAO,OAAA,GAAU,EAAE,eAAA,EAAiB,aAAA,EAAe,cAAc,kBAAA,EAAmB;AAEpF,EAAAA,UAAU,MAAM;AACd,IAAA,IAAI,CAAC,SAAA,IAAa,CAAC,YAAA,CAAa,OAAA,EAAS;AAEzC,IAAA,MAAM,YAAY,YAAA,CAAa,OAAA;AAC/B,IAAA,IAAI,gBAAA,GAAkC,IAAA;AACtC,IAAA,IAAI,aAAA,GAAsD,IAAA;AAC1D,IAAA,IAAI,KAAA,GAAQ,CAAA;AAKZ,IAAA,MAAM,WAAW,MAAM;AACrB,MAAA,MAAM,IAAA,GAAO,UAAU,qBAAA,EAAsB;AAC7C,MAAA,MAAM,QAAmB,EAAC;AAC1B,MAAA,KAAA,MAAW,EAAA,IAAM,MAAA,CAAO,OAAA,CAAQ,eAAA,EAAgB,EAAG;AACjD,QAAA,MAAM,CAAA,GAAI,MAAA,CAAO,OAAA,CAAQ,aAAA,CAAc,EAAE,CAAA;AACzC,QAAA,IAAI,KAAK,CAAA,EAAG;AACZ,QAAA,MAAM,CAAA,GAAI,GAAG,qBAAA,EAAsB;AACnC,QAAA,KAAA,CAAM,IAAA,CAAK,EAAE,CAAA,EAAG,GAAA,EAAK,EAAE,GAAA,EAAK,MAAA,EAAQ,CAAA,CAAE,MAAA,EAAQ,CAAA;AAAA,MAChD;AACA,MAAA,MAAM,EAAE,IAAA,EAAM,KAAA,EAAO,UAAA,EAAW,GAAI,oBAAoB,KAAA,EAAO,IAAA,CAAK,GAAA,EAAK,IAAA,CAAK,MAAM,CAAA;AAGpF,MAAA,IACE,kBAAkB,OAAA,IAClB,IAAA,KAAS,QACT,IAAA,KAAS,gBAAA,IACT,QAAQ,wBAAA,EACR;AACA,QAAA,gBAAA,GAAmB,IAAA;AACnB,QAAA,MAAA,CAAO,OAAA,CAAQ,aAAa,IAAI,CAAA;AAAA,MAClC;AAGA,MAAA,MAAA,CAAO,OAAA,CAAQ,qBAAqB,UAAU,CAAA;AAAA,IAChD,CAAA;AAEA,IAAA,MAAM,WAAW,IAAI,oBAAA;AAAA,MACnB,MAAM;AAEJ,QAAA,IAAI,aAAA,eAA4B,aAAa,CAAA;AAC7C,QAAA,aAAA,GAAgB,UAAA,CAAW,UAAU,uBAAuB,CAAA;AAAA,MAC9D,CAAA;AAAA,MACA,EAAE,IAAA,EAAM,SAAA,EAAW,SAAA,EAAW,uBAAA;AAAwB,KACxD;AAEA,IAAA,MAAM,WAAW,MAAM;AACrB,MAAA,IAAI,CAAC,KAAA,EAAO;AACV,QAAA,KAAA,GAAQ,sBAAsB,MAAM;AAClC,UAAA,KAAA,GAAQ,CAAA;AACR,UAAA,QAAA,EAAS;AAAA,QACX,CAAC,CAAA;AAAA,MACH;AAAA,IACF,CAAA;AACA,IAAA,SAAA,CAAU,iBAAiB,QAAA,EAAU,QAAA,EAAU,EAAE,OAAA,EAAS,MAAM,CAAA;AAGhE,IAAA,MAAA,CAAO,OAAA,CAAQ,iBAAgB,CAAE,OAAA,CAAQ,CAAC,OAAA,KAAY,QAAA,CAAS,OAAA,CAAQ,OAAO,CAAC,CAAA;AAE/E,IAAA,OAAO,MAAM;AACX,MAAA,QAAA,CAAS,UAAA,EAAW;AACpB,MAAA,SAAA,CAAU,mBAAA,CAAoB,UAAU,QAAQ,CAAA;AAChD,MAAA,IAAI,aAAA,eAA4B,aAAa,CAAA;AAC7C,MAAA,IAAI,KAAA,uBAA4B,KAAK,CAAA;AAAA,IACvC,CAAA;AAAA,EACF,GAAG,CAAC,YAAA,EAAc,iBAAA,EAAmB,SAAA,EAAW,UAAU,CAAC,CAAA;AAC7D;ACzGO,IAAM,QAAA,GAAW;AACjB,IAAM,QAAA,GAAW;AACxB,IAAM,eAAA,GAAkB,CAAA;AAEjB,IAAM,iBAAA,GAAoB,GAAA;AAEjC,IAAM,cAAA,GAAiB,CAAA;AAEhB,SAAS,UAAU,IAAA,EAAsB;AAC9C,EAAA,IAAI,CAAC,MAAA,CAAO,QAAA,CAAS,IAAI,GAAG,OAAO,CAAA;AACnC,EAAA,OAAO,IAAA,CAAK,KAAA,CAAM,IAAA,CAAK,GAAA,CAAI,QAAA,EAAU,IAAA,CAAK,GAAA,CAAI,QAAA,EAAU,IAAI,CAAC,CAAA,GAAI,GAAG,CAAA,GAAI,GAAA;AAC1E;AAGA,IAAM,YAAA,GAAe,CAAC,GAAA,EAAK,CAAA,EAAG,CAAC,CAAA;AAGxB,SAAS,UAAU,IAAA,EAAsB;AAC9C,EAAA,OAAO,aAAa,IAAA,CAAK,CAAC,WAAW,MAAA,GAAS,IAAA,GAAO,IAAI,CAAA,IAAK,CAAA;AAChE;AAGO,SAAS,cAAc,IAAA,EAAsB;AAClD,EAAA,OAAO,IAAA,GAAO,OAAO,CAAA,GAAI,eAAA;AAC3B;AAEO,SAAS,UAAU,IAAA,EAAsB;AAC9C,EAAA,OAAO,CAAA,EAAG,IAAA,CAAK,KAAA,CAAM,IAAA,GAAO,GAAG,CAAC,CAAA,CAAA,CAAA;AAClC;AAGO,SAAS,SAAA,CAAU,SAAA,EAAmB,aAAA,EAAuBC,SAAAA,EAA0B;AAC5F,EAAA,IAAI,aAAA,IAAiB,GAAG,OAAO,SAAA;AAC/B,EAAA,OAAO,SAAA,CAAW,SAAA,GAAYA,SAAAA,GAAY,aAAa,CAAA;AACzD;AAMO,SAAS,cAAA,CACd,MAAA,EACA,KAAA,EACA,OAAA,EACA,OAAA,EACQ;AACR,EAAA,IAAI,OAAA,IAAW,GAAG,OAAO,MAAA;AACzB,EAAA,OAAA,CAAS,MAAA,GAAS,KAAA,IAAS,OAAA,GAAW,OAAA,GAAU,KAAA;AAClD;AAMO,SAAS,SAAA,CACd,QAAA,EACA,SAAA,EACA,gBAAA,EACA,YAAoB,iBAAA,EACZ;AACR,EAAA,MAAM,MAAA,GAAS,KAAK,GAAA,CAAI,IAAA,CAAK,IAAI,gBAAA,IAAoB,CAAA,EAAG,CAAC,CAAA,EAAG,cAAc,CAAA;AAC1E,EAAA,MAAM,OAAO,QAAA,GAAW,SAAA;AACxB,EAAA,IAAI,IAAA,IAAQ,GAAG,OAAO,MAAA;AACtB,EAAA,MAAM,IAAA,GAAO,IAAA,CAAK,IAAA,CAAK,SAAA,GAAY,IAAI,CAAA;AACvC,EAAA,OAAO,KAAK,GAAA,CAAI,CAAA,EAAG,KAAK,GAAA,CAAI,MAAA,EAAQ,IAAI,CAAC,CAAA;AAC3C;AAOO,SAAS,YAAA,CAAa,cAAsB,UAAA,EAA4B;AAC7E,EAAA,IAAI,CAAC,MAAA,CAAO,QAAA,CAAS,YAAY,GAAG,OAAO,CAAA;AAC3C,EAAA,OAAO,KAAK,GAAA,CAAI,CAAA,EAAG,KAAK,KAAA,CAAM,YAAY,IAAI,UAAU,CAAA;AAC1D;AAMO,SAAS,gBAAgB,EAAA,EAAyB;AACvD,EAAA,MAAM,KAAA,GAAQ,iBAAiB,EAAE,CAAA;AACjC,EAAA,MAAM,OAAA,GAAA,CAAW,WAAW,KAAA,CAAM,WAAW,KAAK,CAAA,KAAM,UAAA,CAAW,KAAA,CAAM,YAAY,CAAA,IAAK,CAAA,CAAA;AAC1F,EAAA,OAAO,IAAA,CAAK,GAAA,CAAI,CAAA,EAAG,EAAA,CAAG,cAAc,OAAO,CAAA;AAC7C;AAEA,IAAM,QAAA,GAAW,CAAC,CAAA,EAAU,CAAA,KAAa,IAAA,CAAK,KAAA,CAAM,CAAA,CAAE,OAAA,GAAU,CAAA,CAAE,OAAA,EAAS,CAAA,CAAE,OAAA,GAAU,EAAE,OAAO,CAAA;AAChG,IAAM,WAAA,GAAc,qDAAA;AACpB,IAAM,aAAA,GAAgB,GAAA;AACtB,IAAM,kBAAA,GAAqB,EAAA;AAgBpB,SAAS,YAAA,CAAa,EAAE,YAAA,EAAc,IAAA,EAAM,cAAa,EAA2B;AACzF,EAAA,MAAM,OAAA,GAAUC,OAAO,IAAI,CAAA;AAC3B,EAAA,MAAM,WAAA,GAAcA,OAAO,YAAY,CAAA;AACvC,EAAA,WAAA,CAAY,OAAA,GAAU,YAAA;AACtB,EAAA,MAAM,QAAA,GAAWA,OAAwC,IAAI,CAAA;AAC7D,EAAA,MAAM,cAAA,GAAiBA,OAAO,IAAI,CAAA;AAElC,EAAA,MAAM,OAAA,GAAU,WAAA,CAAY,CAAC,IAAA,EAAc,KAAA,KAA2C;AACpF,IAAA,MAAM,OAAA,GAAU,UAAU,IAAI,CAAA;AAC9B,IAAA,IAAI,OAAA,KAAY,QAAQ,OAAA,EAAS;AACjC,IAAA,QAAA,CAAS,OAAA,GAAU,KAAA;AACnB,IAAA,OAAA,CAAQ,OAAA,GAAU,OAAA;AAClB,IAAA,WAAA,CAAY,UAAU,OAAO,CAAA;AAAA,EAC/B,CAAA,EAAG,EAAE,CAAA;AAGL,EAAA,eAAA,CAAgB,MAAM;AACpB,IAAA,OAAA,CAAQ,OAAA,GAAU,IAAA;AAClB,IAAA,MAAM,YAAY,YAAA,CAAa,OAAA;AAC/B,IAAA,MAAM,WAAW,cAAA,CAAe,OAAA;AAChC,IAAA,cAAA,CAAe,OAAA,GAAU,IAAA;AACzB,IAAA,IAAI,CAAC,SAAA,IAAa,QAAA,KAAa,IAAA,EAAM;AACrC,IAAA,MAAM,IAAA,GAAO,UAAU,qBAAA,EAAsB;AAC7C,IAAA,MAAM,KAAA,GAAQ,QAAA,CAAS,OAAA,IAAW,EAAE,CAAA,EAAG,IAAA,CAAK,KAAA,GAAQ,CAAA,EAAG,CAAA,EAAG,IAAA,CAAK,MAAA,GAAS,CAAA,EAAE;AAC1E,IAAA,QAAA,CAAS,OAAA,GAAU,IAAA;AAEnB,IAAA,SAAA,CAAU,QAAQ,OAAA,GAAU,MAAA;AAC5B,IAAA,SAAA,CAAU,aAAa,cAAA,CAAe,SAAA,CAAU,YAAY,KAAA,CAAM,CAAA,EAAG,UAAU,IAAI,CAAA;AACnF,IAAA,SAAA,CAAU,YAAY,cAAA,CAAe,SAAA,CAAU,WAAW,KAAA,CAAM,CAAA,EAAG,UAAU,IAAI,CAAA;AACjF,IAAA,qBAAA;AAAA,MAAsB,MACpB,sBAAsB,MAAM;AAC1B,QAAA,OAAO,UAAU,OAAA,CAAQ,OAAA;AAAA,MAC3B,CAAC;AAAA,KACH;AAAA,EACF,CAAA,EAAG,CAAC,IAAA,EAAM,YAAY,CAAC,CAAA;AAEvB,EAAAF,UAAU,MAAM;AACd,IAAA,MAAM,KAAK,YAAA,CAAa,OAAA;AACxB,IAAA,IAAI,CAAC,EAAA,EAAI;AACT,IAAA,IAAI,KAAA,GAA6D,IAAA;AACjE,IAAA,IAAI,OAAA,GAAyD,IAAA;AAC7D,IAAA,IAAI,KAAA,GAAQ,CAAA;AACZ,IAAA,IAAI,OAAA,GAAoE,IAAA;AAExE,IAAA,MAAM,OAAA,GAAU,CAAC,CAAA,EAAU,CAAA,KAAa;AACtC,MAAA,MAAM,IAAA,GAAO,GAAG,qBAAA,EAAsB;AACtC,MAAA,OAAO;AAAA,QACL,IAAI,CAAA,CAAE,OAAA,GAAU,CAAA,CAAE,OAAA,IAAW,IAAI,IAAA,CAAK,IAAA;AAAA,QACtC,IAAI,CAAA,CAAE,OAAA,GAAU,CAAA,CAAE,OAAA,IAAW,IAAI,IAAA,CAAK;AAAA,OACxC;AAAA,IACF,CAAA;AACA,IAAA,MAAM,QAAQ,MAAM;AAClB,MAAA,KAAA,GAAQ,CAAA;AACR,MAAA,IAAI,OAAA,EAAS,OAAA,CAAQ,OAAA,CAAQ,IAAA,EAAM,QAAQ,KAAK,CAAA;AAChD,MAAA,OAAA,GAAU,IAAA;AAAA,IACZ,CAAA;AAEA,IAAA,MAAM,OAAA,GAAU,CAAC,CAAA,KAAkB;AACjC,MAAA,IAAI,CAAA,CAAE,OAAA,CAAQ,MAAA,KAAW,CAAA,EAAG;AAC1B,QAAA,KAAA,GAAQ,EAAE,aAAA,EAAe,QAAA,CAAS,CAAA,CAAE,QAAQ,CAAC,CAAA,EAAG,CAAA,CAAE,OAAA,CAAQ,CAAC,CAAC,CAAA,EAAG,SAAA,EAAW,QAAQ,OAAA,EAAQ;AAC1F,QAAA,OAAA,GAAU,IAAA;AAAA,MACZ;AAAA,IACF,CAAA;AACA,IAAA,MAAM,MAAA,GAAS,CAAC,CAAA,KAAkB;AAChC,MAAA,IAAI,CAAC,KAAA,IAAS,CAAA,CAAE,OAAA,CAAQ,WAAW,CAAA,EAAG;AACtC,MAAA,CAAA,CAAE,cAAA,EAAe;AACjB,MAAA,OAAA,GAAU;AAAA,QACR,IAAA,EAAM,SAAA,CAAU,KAAA,CAAM,SAAA,EAAW,MAAM,aAAA,EAAe,QAAA,CAAS,CAAA,CAAE,OAAA,CAAQ,CAAC,CAAA,EAAG,CAAA,CAAE,OAAA,CAAQ,CAAC,CAAC,CAAC,CAAA;AAAA,QAC1F,KAAA,EAAO,QAAQ,CAAA,CAAE,OAAA,CAAQ,CAAC,CAAA,EAAG,CAAA,CAAE,OAAA,CAAQ,CAAC,CAAC;AAAA,OAC3C;AACA,MAAA,IAAI,CAAC,KAAA,EAAO,KAAA,GAAQ,qBAAA,CAAsB,KAAK,CAAA;AAAA,IACjD,CAAA;AACA,IAAA,MAAM,KAAA,GAAQ,CAAC,CAAA,KAAkB;AAC/B,MAAA,IAAI,KAAA,IAAS,CAAA,CAAE,OAAA,CAAQ,MAAA,GAAS,CAAA,EAAG;AACjC,QAAA,KAAA,GAAQ,IAAA;AACR,QAAA;AAAA,MACF;AACA,MAAA,IAAI,EAAE,OAAA,CAAQ,MAAA,KAAW,KAAK,CAAA,CAAE,cAAA,CAAe,WAAW,CAAA,EAAG;AAC7D,MAAA,MAAM,CAAA,GAAI,CAAA,CAAE,cAAA,CAAe,CAAC,CAAA;AAC5B,MAAA,IAAK,CAAA,CAAE,MAAA,EAA2B,OAAA,GAAU,WAAW,CAAA,EAAG;AAC1D,MAAA,MAAM,MAAM,CAAA,CAAE,SAAA;AACd,MAAA,IACE,WACA,GAAA,GAAM,OAAA,CAAQ,IAAA,GAAO,aAAA,IACrB,KAAK,KAAA,CAAM,CAAA,CAAE,OAAA,GAAU,OAAA,CAAQ,GAAG,CAAA,CAAE,OAAA,GAAU,OAAA,CAAQ,CAAC,IAAI,kBAAA,EAC3D;AACA,QAAA,CAAA,CAAE,cAAA,EAAe;AACjB,QAAA,MAAM,IAAA,GAAO,GAAG,qBAAA,EAAsB;AACtC,QAAA,OAAA,CAAQ,aAAA,CAAc,OAAA,CAAQ,OAAO,CAAA,EAAG;AAAA,UACtC,CAAA,EAAG,CAAA,CAAE,OAAA,GAAU,IAAA,CAAK,IAAA;AAAA,UACpB,CAAA,EAAG,CAAA,CAAE,OAAA,GAAU,IAAA,CAAK;AAAA,SACrB,CAAA;AACD,QAAA,OAAA,GAAU,IAAA;AAAA,MACZ,CAAA,MAAO;AACL,QAAA,OAAA,GAAU,EAAE,MAAM,GAAA,EAAK,CAAA,EAAG,EAAE,OAAA,EAAS,CAAA,EAAG,EAAE,OAAA,EAAQ;AAAA,MACpD;AAAA,IACF,CAAA;AAEA,IAAA,EAAA,CAAG,iBAAiB,YAAA,EAAc,OAAA,EAAS,EAAE,OAAA,EAAS,MAAM,CAAA;AAC5D,IAAA,EAAA,CAAG,iBAAiB,WAAA,EAAa,MAAA,EAAQ,EAAE,OAAA,EAAS,OAAO,CAAA;AAC3D,IAAA,EAAA,CAAG,iBAAiB,UAAA,EAAY,KAAA,EAAO,EAAE,OAAA,EAAS,OAAO,CAAA;AACzD,IAAA,EAAA,CAAG,iBAAiB,aAAA,EAAe,KAAA,EAAO,EAAE,OAAA,EAAS,OAAO,CAAA;AAC5D,IAAA,OAAO,MAAM;AACX,MAAA,EAAA,CAAG,mBAAA,CAAoB,cAAc,OAAO,CAAA;AAC5C,MAAA,EAAA,CAAG,mBAAA,CAAoB,aAAa,MAAM,CAAA;AAC1C,MAAA,EAAA,CAAG,mBAAA,CAAoB,YAAY,KAAK,CAAA;AACxC,MAAA,EAAA,CAAG,mBAAA,CAAoB,eAAe,KAAK,CAAA;AAC3C,MAAA,IAAI,KAAA,uBAA4B,KAAK,CAAA;AAAA,IACvC,CAAA;AAAA,EACF,CAAA,EAAG,CAAC,YAAA,EAAc,OAAO,CAAC,CAAA;AAC5B;;;ACpOO,IAAM,uBAAA,GAA0B;AAGhC,IAAM,sBAAA,GAAyB;AAO/B,IAAM,wBAAA,GAA2B,EAAE,MAAA,EAAQ,CAAA,EAAG,OAAO,CAAA","file":"chunk-6QNBSXCE.js","sourcesContent":["/**\n * Scroll stability for page-stacked viewers (PDF + parsed/HTML).\n *\n * Pages are lazy: their height can change after the user is already looking at something further\n * down (a placeholder replaced by the real page, a late canvas). Browsers that implement scroll\n * anchoring (Chromium) hide that; Safari/WebKit does not, so the content visibly jumps under the\n * finger and momentum scrolling is cut short. The viewers therefore do their own anchoring, the\n * same way on every engine: native anchoring is switched off and a page that changes height\n * entirely ABOVE the viewport shifts `scrollTop` by exactly that change.\n */\n\nimport { useEffect } from 'react'\nimport type { RefObject } from 'react'\n\n/** One page of a stacked viewer (both viewers mark pages like this). */\nexport const PAGE_SELECTOR = '[role=\"article\"][data-page-number]'\n\n/**\n * How far to move `scrollTop` after a page changed height from `previousHeight` to `nextHeight`.\n * Only a page that lay completely above the visible top edge (`containerTop`) pushes the content\n * the user is reading; anything at or below it just grows or shrinks away from the viewport.\n *\n * @param pageTop viewport-relative top of the page (unchanged by its own resize)\n */\nexport function anchorDelta(\n previousHeight: number,\n nextHeight: number,\n pageTop: number,\n containerTop: number\n): number {\n const delta = nextHeight - previousHeight\n if (delta === 0) return 0\n return pageTop + previousHeight <= containerTop + 1 ? delta : 0\n}\n\nexport interface PageBox {\n n: number\n top: number\n bottom: number\n}\n\n/**\n * Which page is being read: the one showing the most pixels inside [viewTop, viewBottom] (the\n * first on a tie). `score` is those pixels relative to the smaller of the page and the viewport,\n * so a page much taller than the screen can still count as \"mostly visible\". `visibility` maps\n * every page that shows any pixel to its visible fraction (for lazy loading).\n */\nexport function measureVisiblePages(\n pages: readonly PageBox[],\n viewTop: number,\n viewBottom: number\n): { page: number | null; score: number; visibility: Map<number, number> } {\n const visibility = new Map<number, number>()\n let page: number | null = null\n let bestPx = 0\n let score = 0\n const viewHeight = viewBottom - viewTop\n for (const p of pages) {\n const height = p.bottom - p.top\n const px = Math.min(p.bottom, viewBottom) - Math.max(p.top, viewTop)\n if (px <= 0 || height <= 0) continue\n visibility.set(p.n, px / height)\n if (px > bestPx) {\n bestPx = px\n page = p.n\n score = px / Math.min(height, viewHeight)\n }\n }\n return { page, score, visibility }\n}\n\n/**\n * Keep the reading position when pages above it change height. `key` re-scans for pages when the\n * page set changes (page count, first layout).\n */\nexport function useScrollAnchor(containerRef: RefObject<HTMLElement | null>, key: unknown): void {\n useEffect(() => {\n const container = containerRef.current\n if (!container || typeof ResizeObserver === 'undefined') return\n container.style.overflowAnchor = 'none'\n\n const heights = new Map<Element, number>()\n const observer = new ResizeObserver((entries) => {\n let shift = 0\n const containerTop = container.getBoundingClientRect().top\n for (const entry of entries) {\n const el = entry.target\n const height = el.getBoundingClientRect().height\n const previous = heights.get(el)\n heights.set(el, height)\n if (previous === undefined) continue\n shift += anchorDelta(previous, height, el.getBoundingClientRect().top, containerTop)\n }\n // A zoom change re-anchors the scroll position itself (see usePinchZoom).\n if (shift !== 0 && !container.dataset.zooming) container.scrollTop += shift\n })\n container.querySelectorAll(PAGE_SELECTOR).forEach((el) => {\n heights.set(el, el.getBoundingClientRect().height)\n observer.observe(el)\n })\n return () => observer.disconnect()\n }, [containerRef, key])\n}\n","import { useEffect, useRef, RefObject } from 'react'\nimport { measureVisiblePages, type PageBox } from './page-scroll'\n\n// Page synchronization constants\nconst PAGE_UPDATE_DEBOUNCE_MS = 10 // Delay before updating page number after scroll (10ms)\nconst MIN_VISIBILITY_THRESHOLD = 0.15 // Minimum visibility (15%) to consider page \"visible\"\nconst INTERSECTION_THRESHOLDS = [0, 0.25, 0.5, 0.75, 1.0] // IntersectionObserver thresholds\n\ninterface UsePageIntersectionObserverOptions {\n /** Container element that scrolls */\n containerRef: RefObject<HTMLElement | null>\n /** Ref tracking whether initial scroll has completed */\n scrollCompleteRef: RefObject<boolean>\n /** Whether the observer should be active */\n isEnabled: boolean\n /** Function to get page elements to observe */\n getPageElements: () => Element[]\n /** Function to extract page number from element */\n getPageNumber: (element: Element) => number\n /** Callback when page number changes */\n onPageChange: (pageNumber: number) => void\n /** Optional callback with visibility data for custom logic (e.g., lazy loading) */\n onVisibilityUpdate?: (visibilityMap: Map<number, number>) => void\n /**\n * Re-subscribe when this changes (the set of page elements: page count, first layout). Callers\n * may pass fresh inline callbacks every render: they are read through refs and never cause a\n * re-subscribe (a re-subscribe re-delivers every page and, with a state-setting callback, loops).\n */\n observeKey?: unknown\n}\n\n/**\n * Custom hook to track the visible page of a page-stacked viewer.\n * Used for bidirectional page synchronization in document viewers.\n *\n * IntersectionObserver wakes it when pages enter or leave the viewport; a passive scroll listener\n * (at most one measurement per frame) keeps it current in between. The page itself is chosen from\n * live geometry (see `measureVisiblePages`).\n */\nexport function usePageIntersectionObserver({\n containerRef,\n scrollCompleteRef,\n isEnabled,\n getPageElements,\n getPageNumber,\n onPageChange,\n onVisibilityUpdate,\n observeKey,\n}: UsePageIntersectionObserverOptions) {\n const latest = useRef({ getPageElements, getPageNumber, onPageChange, onVisibilityUpdate })\n latest.current = { getPageElements, getPageNumber, onPageChange, onVisibilityUpdate }\n\n useEffect(() => {\n if (!isEnabled || !containerRef.current) return\n\n const container = containerRef.current\n let lastReportedPage: number | null = null\n let updateTimeout: ReturnType<typeof setTimeout> | null = null\n let frame = 0\n\n // Read the live geometry rather than IntersectionObserver ratios: a ratio is relative to the\n // page's own height, so a zoomed page much taller than the screen never reaches the threshold\n // (and ratios only update on a few crossings, which is too coarse for tall pages).\n const evaluate = () => {\n const root = container.getBoundingClientRect()\n const pages: PageBox[] = []\n for (const el of latest.current.getPageElements()) {\n const n = latest.current.getPageNumber(el)\n if (n <= 0) continue\n const r = el.getBoundingClientRect()\n pages.push({ n, top: r.top, bottom: r.bottom })\n }\n const { page, score, visibility } = measureVisiblePages(pages, root.top, root.bottom)\n\n // Only report when the scroll is complete and the page changed\n if (\n scrollCompleteRef.current &&\n page !== null &&\n page !== lastReportedPage &&\n score > MIN_VISIBILITY_THRESHOLD\n ) {\n lastReportedPage = page\n latest.current.onPageChange(page)\n }\n\n // Call optional visibility update callback (e.g., for lazy loading)\n latest.current.onVisibilityUpdate?.(visibility)\n }\n\n const observer = new IntersectionObserver(\n () => {\n // Debounce updates\n if (updateTimeout) clearTimeout(updateTimeout)\n updateTimeout = setTimeout(evaluate, PAGE_UPDATE_DEBOUNCE_MS)\n },\n { root: container, threshold: INTERSECTION_THRESHOLDS }\n )\n // At most one measurement per frame while scrolling; nothing is stored in React state here.\n const onScroll = () => {\n if (!frame) {\n frame = requestAnimationFrame(() => {\n frame = 0\n evaluate()\n })\n }\n }\n container.addEventListener('scroll', onScroll, { passive: true })\n\n // Observe all page elements\n latest.current.getPageElements().forEach((element) => observer.observe(element))\n\n return () => {\n observer.disconnect()\n container.removeEventListener('scroll', onScroll)\n if (updateTimeout) clearTimeout(updateTimeout)\n if (frame) cancelAnimationFrame(frame)\n }\n }, [containerRef, scrollCompleteRef, isEnabled, observeKey])\n}\n","/**\n * Zoom for page-stacked viewers (PDF + parsed/HTML).\n *\n * Browser pinch-zoom only magnifies the bitmap the page already painted: a PDF canvas rendered at\n * fit-width stays blurry however far you pinch. The viewers therefore own the zoom: `zoom` is a\n * multiplier of the fit-width size (1 = fit width, 2 = twice as wide). The PDF viewer re-renders\n * its canvases at the new scale; the parsed viewer reflows its text. This module holds the pure\n * math and the touch gesture hook (pinch, double-tap) both use.\n */\n\nimport { useCallback, useEffect, useLayoutEffect, useRef } from 'react'\nimport type { RefObject } from 'react'\n\nexport const MIN_ZOOM = 0.5\nexport const MAX_ZOOM = 4\nconst DOUBLE_TAP_ZOOM = 2\n/** Canvas pixel budget per page: iOS Safari fails above ~16.7M pixels in total, so stay well under. */\nexport const MAX_CANVAS_PIXELS = 8_000_000\n/** Device pixel ratio is capped: beyond 2x the extra sharpness is invisible and costs 2-3x memory. */\nconst MAX_RENDER_DPR = 2\n\nexport function clampZoom(zoom: number): number {\n if (!Number.isFinite(zoom)) return 1\n return Math.round(Math.min(MAX_ZOOM, Math.max(MIN_ZOOM, zoom)) * 100) / 100\n}\n\n/** The zoom levels the single zoom button steps through before it returns to fit width. */\nconst ZOOM_PRESETS = [1.5, 2, 3]\n\n/** The zoom button: the next preset above the current zoom, or back to fit width after the last. */\nexport function cycleZoom(zoom: number): number {\n return ZOOM_PRESETS.find((preset) => preset > zoom + 0.05) ?? 1\n}\n\n/** Double-tap toggles between fit width and a comfortable reading zoom. */\nexport function doubleTapZoom(zoom: number): number {\n return zoom > 1.05 ? 1 : DOUBLE_TAP_ZOOM\n}\n\nexport function zoomLabel(zoom: number): string {\n return `${Math.round(zoom * 100)}%`\n}\n\n/** The zoom a pinch has reached: the start zoom scaled by how far the fingers moved apart. */\nexport function pinchZoom(startZoom: number, startDistance: number, distance: number): number {\n if (startDistance <= 0) return startZoom\n return clampZoom((startZoom * distance) / startDistance)\n}\n\n/**\n * New scroll offset that keeps the content point under `focal` (a viewport coordinate) still while\n * the zoom changes from `oldZoom` to `newZoom`.\n */\nexport function anchoredScroll(\n scroll: number,\n focal: number,\n oldZoom: number,\n newZoom: number\n): number {\n if (oldZoom <= 0) return scroll\n return ((scroll + focal) * newZoom) / oldZoom - focal\n}\n\n/**\n * Device pixel ratio to rasterise a page of `cssWidth` x `cssHeight` at: the device's own, capped,\n * and lowered further when the page would otherwise exceed the canvas pixel budget.\n */\nexport function renderDpr(\n cssWidth: number,\n cssHeight: number,\n devicePixelRatio: number,\n maxPixels: number = MAX_CANVAS_PIXELS\n): number {\n const wanted = Math.min(Math.max(devicePixelRatio || 1, 1), MAX_RENDER_DPR)\n const area = cssWidth * cssHeight\n if (area <= 0) return wanted\n const fits = Math.sqrt(maxPixels / area)\n return Math.max(1, Math.min(wanted, fits))\n}\n\n/**\n * Width a fit-width page's content gets in a scroller whose content box is `contentWidth` wide:\n * that box less the page's own border, floored so sub-pixel layout never rounds the page up past\n * the box into a sideways overflow.\n */\nexport function fitPageWidth(contentWidth: number, pageBorder: number): number {\n if (!Number.isFinite(contentWidth)) return 0\n return Math.max(0, Math.floor(contentWidth) - pageBorder)\n}\n\n/**\n * An element's content-box width: `clientWidth` (which, unlike `offsetWidth`, leaves out the\n * vertical scrollbar and the borders) less the horizontal padding.\n */\nexport function contentBoxWidth(el: HTMLElement): number {\n const style = getComputedStyle(el)\n const padding = (parseFloat(style.paddingLeft) || 0) + (parseFloat(style.paddingRight) || 0)\n return Math.max(0, el.clientWidth - padding)\n}\n\nconst distance = (a: Touch, b: Touch) => Math.hypot(a.clientX - b.clientX, a.clientY - b.clientY)\nconst INTERACTIVE = 'button, a, input, textarea, select, [role=\"button\"]'\nconst DOUBLE_TAP_MS = 300\nconst DOUBLE_TAP_SLOP_PX = 30\n\ninterface PinchZoomOptions {\n containerRef: RefObject<HTMLElement | null>\n zoom: number\n onZoomChange?: (zoom: number) => void\n}\n\n/**\n * Pinch and double-tap zoom on a scroller, plus focal-point preservation for EVERY zoom change\n * (gesture, buttons, props): after the new zoom has laid out, the scroll offset is moved so the\n * content under the pinch centre (or the viewport centre) stays where it was.\n *\n * The scroller must carry `touch-action: pan-x pan-y` so the browser leaves two-finger gestures\n * to this hook instead of zooming the whole app.\n */\nexport function usePinchZoom({ containerRef, zoom, onZoomChange }: PinchZoomOptions): void {\n const zoomRef = useRef(zoom)\n const onChangeRef = useRef(onZoomChange)\n onChangeRef.current = onZoomChange\n const focalRef = useRef<{ x: number; y: number } | null>(null)\n const appliedZoomRef = useRef(zoom)\n\n const request = useCallback((next: number, focal: { x: number; y: number } | null) => {\n const clamped = clampZoom(next)\n if (clamped === zoomRef.current) return\n focalRef.current = focal\n zoomRef.current = clamped\n onChangeRef.current?.(clamped)\n }, [])\n\n // Zoom changed (from here or from outside): keep the focal point still once it has laid out.\n useLayoutEffect(() => {\n zoomRef.current = zoom\n const container = containerRef.current\n const previous = appliedZoomRef.current\n appliedZoomRef.current = zoom\n if (!container || previous === zoom) return\n const rect = container.getBoundingClientRect()\n const focal = focalRef.current ?? { x: rect.width / 2, y: rect.height / 2 }\n focalRef.current = null\n // The page-anchoring observer must not also react to this resize.\n container.dataset.zooming = 'true'\n container.scrollLeft = anchoredScroll(container.scrollLeft, focal.x, previous, zoom)\n container.scrollTop = anchoredScroll(container.scrollTop, focal.y, previous, zoom)\n requestAnimationFrame(() =>\n requestAnimationFrame(() => {\n delete container.dataset.zooming\n })\n )\n }, [zoom, containerRef])\n\n useEffect(() => {\n const el = containerRef.current\n if (!el) return\n let pinch: { startDistance: number; startZoom: number } | null = null\n let lastTap: { time: number; x: number; y: number } | null = null\n let frame = 0\n let pending: { zoom: number; focal: { x: number; y: number } } | null = null\n\n const focalOf = (a: Touch, b: Touch) => {\n const rect = el.getBoundingClientRect()\n return {\n x: (a.clientX + b.clientX) / 2 - rect.left,\n y: (a.clientY + b.clientY) / 2 - rect.top,\n }\n }\n const flush = () => {\n frame = 0\n if (pending) request(pending.zoom, pending.focal)\n pending = null\n }\n\n const onStart = (e: TouchEvent) => {\n if (e.touches.length === 2) {\n pinch = { startDistance: distance(e.touches[0], e.touches[1]), startZoom: zoomRef.current }\n lastTap = null\n }\n }\n const onMove = (e: TouchEvent) => {\n if (!pinch || e.touches.length !== 2) return\n e.preventDefault()\n pending = {\n zoom: pinchZoom(pinch.startZoom, pinch.startDistance, distance(e.touches[0], e.touches[1])),\n focal: focalOf(e.touches[0], e.touches[1]),\n }\n if (!frame) frame = requestAnimationFrame(flush)\n }\n const onEnd = (e: TouchEvent) => {\n if (pinch && e.touches.length < 2) {\n pinch = null\n return\n }\n if (e.touches.length !== 0 || e.changedTouches.length !== 1) return\n const t = e.changedTouches[0]\n if ((e.target as Element | null)?.closest?.(INTERACTIVE)) return\n const now = e.timeStamp\n if (\n lastTap &&\n now - lastTap.time < DOUBLE_TAP_MS &&\n Math.hypot(t.clientX - lastTap.x, t.clientY - lastTap.y) < DOUBLE_TAP_SLOP_PX\n ) {\n e.preventDefault()\n const rect = el.getBoundingClientRect()\n request(doubleTapZoom(zoomRef.current), {\n x: t.clientX - rect.left,\n y: t.clientY - rect.top,\n })\n lastTap = null\n } else {\n lastTap = { time: now, x: t.clientX, y: t.clientY }\n }\n }\n\n el.addEventListener('touchstart', onStart, { passive: true })\n el.addEventListener('touchmove', onMove, { passive: false })\n el.addEventListener('touchend', onEnd, { passive: false })\n el.addEventListener('touchcancel', onEnd, { passive: false })\n return () => {\n el.removeEventListener('touchstart', onStart)\n el.removeEventListener('touchmove', onMove)\n el.removeEventListener('touchend', onEnd)\n el.removeEventListener('touchcancel', onEnd)\n if (frame) cancelAnimationFrame(frame)\n }\n }, [containerRef, request])\n}\n","/** Pages to render before the visible area (canvas pre-load buffer) */\nexport const LAZY_LOAD_BUFFER_BEFORE = 2\n\n/** Pages to render after the visible area (canvas pre-load buffer) */\nexport const LAZY_LOAD_BUFFER_AFTER = 5\n\n/**\n * Smaller render window used on the very first paint so time-to-first-visible-page is\n * fast. Expanded to LAZY_LOAD_BUFFER_BEFORE / LAZY_LOAD_BUFFER_AFTER once the browser\n * is idle (via requestIdleCallback / setTimeout fallback).\n */\nexport const INITIAL_LAZY_LOAD_BUFFER = { before: 0, after: 1 }\n"]}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/artifacts/redline-diff.ts"],"names":[],"mappings":"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","file":"chunk-74N436VK.js","sourcesContent":["/**\n * Redline diff core\n *\n * Pure (no DOM, no Worker globals) logic for building a Word-style redline\n * markdown string from two flattened document texts. Lives outside the\n * worker file so it's straightforward to unit test.\n *\n * Strategy: hybrid line + word diff with structural safety.\n * 1. `diffLines` splits the texts into add/remove/equal blocks.\n * 2. For an adjacent [removed, added] pair (a modified region):\n * - If either side contains markdown structure that can't safely host\n * inline tags (code fences, table rows, horizontal rules), fall back\n * to block-level wrapping (whole-line del/ins, line by line).\n * - Otherwise run `diffWords`. Markdown leading markers (#, -, *, 1., >)\n * become unchanged word tokens, so when only the heading/list text\n * changes the marker stays *outside* the inline tags and the heading\n * still parses.\n * 3. Pure removed / added blocks (no paired counterpart) are wrapped\n * line-by-line so structural prefixes stay outside the tag.\n */\n\nimport { diffLines, diffWords } from 'diff'\nimport { normalizeMarkdown } from './normalize-markdown'\n\n// Lines that can't safely host inline <del>/<ins> tags without breaking\n// markdown parsing. Code fences, table rows, and horizontal rules.\nconst UNSAFE_LINE = /^(?:\\s*(?:```|~~~).*|\\s*\\|.*\\||\\s*(?:[-=*_]\\s*){3,})\\s*$/\n\n// Block-level markdown structural prefix. When present on a line, putting\n// it INSIDE an inline tag stops the heading/list/blockquote from parsing,\n// so we always preserve it outside the wrapping tag.\nconst STRUCTURAL_PREFIX = /^(\\s*(?:#{1,6}\\s+|[-*+]\\s+|\\d+[.)]\\s+|>\\s*)+)/\n\nfunction escapeForHtmlTag(text: string): string {\n return text.replace(/</g, '<').replace(/>/g, '>')\n}\n\nfunction wrapLineAsRedline(line: string, tag: 'del' | 'ins'): string {\n if (line === '' || line.trim() === '') return line\n if (UNSAFE_LINE.test(line)) {\n return `<${tag}>${escapeForHtmlTag(line)}</${tag}>`\n }\n const m = line.match(STRUCTURAL_PREFIX)\n if (m) {\n const prefix = m[1]\n const rest = line.slice(prefix.length)\n if (rest === '') return line\n return `${prefix}<${tag}>${escapeForHtmlTag(rest)}</${tag}>`\n }\n return `<${tag}>${escapeForHtmlTag(line)}</${tag}>`\n}\n\nfunction wrapBlockAsRedline(block: string, tag: 'del' | 'ins'): string {\n const lines = block.split('\\n')\n return lines\n .map((line, i) => {\n const wrapped = wrapLineAsRedline(line, tag)\n return i < lines.length - 1 ? wrapped + '\\n' : wrapped\n })\n .join('')\n}\n\nfunction pairContainsUnsafeLine(text: string): boolean {\n for (const line of text.split('\\n')) {\n if (UNSAFE_LINE.test(line)) return true\n }\n return false\n}\n\n// The canonical text always ends in one newline; give a result back the caller's own ending.\nfunction matchTail(result: string, raw: string): string {\n return raw.endsWith('\\n') ? result : result.replace(/\\n$/, '')\n}\n\nexport function buildHybridRedlineMarkdown(rawBase: string, rawCompare: string): string {\n // Both sides go through one canonical form so escaping-only differences are not changes.\n const baseText = normalizeMarkdown(rawBase)\n const compareText = normalizeMarkdown(rawCompare)\n const lineChanges = diffLines(baseText, compareText)\n const out: string[] = []\n\n for (let i = 0; i < lineChanges.length; i++) {\n const cur = lineChanges[i]\n const next = lineChanges[i + 1]\n\n if (cur.removed && next?.added) {\n if (pairContainsUnsafeLine(cur.value) || pairContainsUnsafeLine(next.value)) {\n out.push(wrapBlockAsRedline(cur.value, 'del'))\n out.push(wrapBlockAsRedline(next.value, 'ins'))\n } else {\n const wordChanges = diffWords(cur.value, next.value)\n for (const w of wordChanges) {\n if (w.removed) out.push(`<del>${escapeForHtmlTag(w.value)}</del>`)\n else if (w.added) out.push(`<ins>${escapeForHtmlTag(w.value)}</ins>`)\n else out.push(w.value)\n }\n }\n i++ // consume the paired added entry\n } else if (cur.removed) {\n out.push(wrapBlockAsRedline(cur.value, 'del'))\n } else if (cur.added) {\n out.push(wrapBlockAsRedline(cur.value, 'ins'))\n } else {\n out.push(cur.value)\n }\n }\n\n return matchTail(out.join(''), rawCompare)\n}\n\n// ─── Regions extension ────────────────────────────────────────────────────────\n//\n// Same redline as above, but every <del>/<ins> tag carries a stable\n// `data-cid` attribute identifying the \"change region\" it belongs to. A\n// region is the smallest independently revertable change:\n//\n// - inside a safe [REM, ADD] pair, each contiguous changed-word run is its\n// own region, so a single button can revert one phrase without touching\n// other edits in the same paragraph;\n// - unsafe pairs (tables, code fences, horizontal rules) are still one\n// region for the whole block, since line-level wrapping can't safely\n// split them;\n// - a non-adjacent [removed text == added text] pair is a *move*: both\n// endpoints share one cid, render green, and one undo reverts the move.\n//\n// `revertRedlineRegion` mirrors the same walk and rebuilds the working-tree text\n// with one region \"as if it never changed\", so cids round-trip identically\n// from build → render → revert.\n\nexport type RegionKind = 'replace' | 'remove' | 'add' | 'move'\n\nexport interface RedlineRegion {\n id: string\n kind: RegionKind\n baseText: string // what the base side has for this slice\n compareText: string // what the compare side has for this slice\n}\n\nexport interface RedlineWithRegions {\n markdown: string\n regions: RedlineRegion[]\n}\n\n// Tiny deterministic hash (FNV-1a 32-bit, hex). Stable across runs and JS\n// runtimes, with no Node-only deps so this stays browser-safe.\nfunction fnv1aHex(...parts: string[]): string {\n let h = 0x811c9dc5\n for (const part of parts) {\n h ^= 0x5f5f\n h = Math.imul(h, 0x01000193) >>> 0\n for (let i = 0; i < part.length; i++) {\n h ^= part.charCodeAt(i)\n h = Math.imul(h, 0x01000193) >>> 0\n }\n }\n return ('00000000' + h.toString(16)).slice(-8)\n}\n\n// First char of the cid encodes the kind so consumers can style without a\n// region-table lookup: p=replace r=remove a=add m=move.\nfunction makeRegionId(\n kind: RegionKind,\n baseText: string,\n compareText: string,\n seq: number\n): string {\n const prefix = kind === 'replace' ? 'p' : kind === 'remove' ? 'r' : kind === 'add' ? 'a' : 'm'\n return `${prefix}${fnv1aHex(kind, baseText, compareText, String(seq))}`\n}\n\n// Move detection: a non-adjacent removed/added pair with identical text is a\n// move. Returns the move endpoints' lineChanges-indices plus a region per\n// distinct move.\nfunction detectMoves(lineChanges: { value: string; removed?: boolean; added?: boolean }[]): {\n moveByIndex: Map<number, string>\n moveRegions: RedlineRegion[]\n} {\n const moveByIndex = new Map<number, string>()\n const moveRegions: RedlineRegion[] = []\n const removedByText = new Map<string, number[]>()\n const addedByText = new Map<string, number[]>()\n\n for (let i = 0; i < lineChanges.length; i++) {\n const c = lineChanges[i]\n if (c.removed) {\n const arr = removedByText.get(c.value) ?? []\n arr.push(i)\n removedByText.set(c.value, arr)\n } else if (c.added) {\n const arr = addedByText.get(c.value) ?? []\n arr.push(i)\n addedByText.set(c.value, arr)\n }\n }\n\n let seq = 0\n for (const [text, removedIdx] of removedByText) {\n const addedIdx = addedByText.get(text)\n if (!addedIdx || addedIdx.length === 0) continue\n if (text.trim().length === 0) continue\n const n = Math.min(removedIdx.length, addedIdx.length)\n for (let k = 0; k < n; k++) {\n const rI = removedIdx[k]\n const aI = addedIdx[k]\n if (aI === rI + 1 || rI === aI + 1) continue // adjacent = replace, not move\n if (moveByIndex.has(rI) || moveByIndex.has(aI)) continue\n const id = makeRegionId('move', text, text, seq++)\n moveByIndex.set(rI, id)\n moveByIndex.set(aI, id)\n moveRegions.push({ id, kind: 'move', baseText: text, compareText: text })\n }\n }\n\n return { moveByIndex, moveRegions }\n}\n\nfunction wrapLineWithCid(line: string, tag: 'del' | 'ins', cid: string): string {\n if (line === '' || line.trim() === '') return line\n if (UNSAFE_LINE.test(line)) {\n return `<${tag} data-cid=\"${cid}\">${escapeForHtmlTag(line)}</${tag}>`\n }\n const m = line.match(STRUCTURAL_PREFIX)\n if (m) {\n const prefix = m[1]\n const rest = line.slice(prefix.length)\n if (rest === '') return line\n return `${prefix}<${tag} data-cid=\"${cid}\">${escapeForHtmlTag(rest)}</${tag}>`\n }\n return `<${tag} data-cid=\"${cid}\">${escapeForHtmlTag(line)}</${tag}>`\n}\n\nfunction wrapBlockWithCid(block: string, tag: 'del' | 'ins', cid: string): string {\n const lines = block.split('\\n')\n return lines\n .map((line, i) => {\n const wrapped = wrapLineWithCid(line, tag, cid)\n return i < lines.length - 1 ? wrapped + '\\n' : wrapped\n })\n .join('')\n}\n\n// Word-level region emission inside a safe [REM, ADD] pair.\nfunction emitWordLevelRegions(\n basePara: string,\n comparePara: string,\n reserveId: (kind: RegionKind, baseT: string, compareT: string) => string,\n regions: RedlineRegion[]\n): string {\n const wordChanges = diffWords(basePara, comparePara)\n const out: string[] = []\n let k = 0\n while (k < wordChanges.length) {\n const w = wordChanges[k]\n const wNext = wordChanges[k + 1]\n if (w.removed && wNext?.added) {\n const id = reserveId('replace', w.value, wNext.value)\n regions.push({ id, kind: 'replace', baseText: w.value, compareText: wNext.value })\n out.push(`<del data-cid=\"${id}\">${escapeForHtmlTag(w.value)}</del>`)\n out.push(`<ins data-cid=\"${id}\">${escapeForHtmlTag(wNext.value)}</ins>`)\n k += 2\n } else if (w.removed) {\n const id = reserveId('remove', w.value, '')\n regions.push({ id, kind: 'remove', baseText: w.value, compareText: '' })\n out.push(`<del data-cid=\"${id}\">${escapeForHtmlTag(w.value)}</del>`)\n k++\n } else if (w.added) {\n const id = reserveId('add', '', w.value)\n regions.push({ id, kind: 'add', baseText: '', compareText: w.value })\n out.push(`<ins data-cid=\"${id}\">${escapeForHtmlTag(w.value)}</ins>`)\n k++\n } else {\n out.push(w.value)\n k++\n }\n }\n return out.join('')\n}\n\nexport function buildHybridRedlineWithRegions(\n rawBase: string,\n rawCompare: string\n): RedlineWithRegions {\n const baseText = normalizeMarkdown(rawBase)\n const compareText = normalizeMarkdown(rawCompare)\n const lineChanges = diffLines(baseText, compareText)\n const { moveByIndex, moveRegions } = detectMoves(lineChanges)\n const out: string[] = []\n const regions: RedlineRegion[] = [...moveRegions]\n const seenIds = new Map<string, number>()\n\n const reserveId = (kind: RegionKind, baseT: string, compareT: string): string => {\n const baseHash = fnv1aHex(kind, baseT, compareT)\n const seq = seenIds.get(baseHash) ?? 0\n seenIds.set(baseHash, seq + 1)\n return makeRegionId(kind, baseT, compareT, seq)\n }\n\n for (let i = 0; i < lineChanges.length; i++) {\n const cur = lineChanges[i]\n const next = lineChanges[i + 1]\n const moveId = moveByIndex.get(i)\n\n if (moveId) {\n const tag = cur.removed ? 'del' : 'ins'\n out.push(wrapBlockWithCid(cur.value, tag, moveId))\n continue\n }\n\n if (cur.removed && next?.added) {\n if (pairContainsUnsafeLine(cur.value) || pairContainsUnsafeLine(next.value)) {\n const id = reserveId('replace', cur.value, next.value)\n regions.push({ id, kind: 'replace', baseText: cur.value, compareText: next.value })\n out.push(wrapBlockWithCid(cur.value, 'del', id))\n out.push(wrapBlockWithCid(next.value, 'ins', id))\n } else {\n out.push(emitWordLevelRegions(cur.value, next.value, reserveId, regions))\n }\n i++\n } else if (cur.removed) {\n const id = reserveId('remove', cur.value, '')\n regions.push({ id, kind: 'remove', baseText: cur.value, compareText: '' })\n out.push(wrapBlockWithCid(cur.value, 'del', id))\n } else if (cur.added) {\n const id = reserveId('add', '', cur.value)\n regions.push({ id, kind: 'add', baseText: '', compareText: cur.value })\n out.push(wrapBlockWithCid(cur.value, 'ins', id))\n } else {\n out.push(cur.value)\n }\n }\n\n return { markdown: matchTail(out.join(''), rawCompare), regions }\n}\n\n// Word-level partial revert inside a [REM, ADD] pair.\nfunction revertWordRegion(\n basePara: string,\n comparePara: string,\n targetId: string,\n reserveId: (kind: RegionKind, baseT: string, compareT: string) => string\n): { text: string; matched: boolean } {\n const wordChanges = diffWords(basePara, comparePara)\n const out: string[] = []\n let matched = false\n let k = 0\n while (k < wordChanges.length) {\n const w = wordChanges[k]\n const wNext = wordChanges[k + 1]\n if (w.removed && wNext?.added) {\n const id = reserveId('replace', w.value, wNext.value)\n if (id === targetId) {\n out.push(w.value)\n matched = true\n } else {\n out.push(wNext.value)\n }\n k += 2\n } else if (w.removed) {\n const id = reserveId('remove', w.value, '')\n if (id === targetId) {\n out.push(w.value)\n matched = true\n }\n k++\n } else if (w.added) {\n const id = reserveId('add', '', w.value)\n if (id !== targetId) {\n out.push(w.value)\n } else {\n matched = true\n }\n k++\n } else {\n out.push(w.value)\n k++\n }\n }\n return { text: out.join(''), matched }\n}\n\n// Apply a per-region revert: rebuild the working-tree text from scratch by\n// walking the same diff and treating the target region as unchanged from\n// the base. Walking the diff ourselves (rather than string-replacing in the\n// working tree) means we don't have to worry about ambiguous matches.\nexport function revertRedlineRegion(rawBase: string, rawCompare: string, targetId: string): string {\n const baseText = normalizeMarkdown(rawBase)\n const compareText = normalizeMarkdown(rawCompare)\n const lineChanges = diffLines(baseText, compareText)\n const { moveByIndex } = detectMoves(lineChanges)\n const out: string[] = []\n const seenIds = new Map<string, number>()\n\n const reserveId = (kind: RegionKind, baseT: string, compareT: string): string => {\n const baseHash = fnv1aHex(kind, baseT, compareT)\n const seq = seenIds.get(baseHash) ?? 0\n seenIds.set(baseHash, seq + 1)\n return makeRegionId(kind, baseT, compareT, seq)\n }\n\n for (let i = 0; i < lineChanges.length; i++) {\n const cur = lineChanges[i]\n const next = lineChanges[i + 1]\n const moveId = moveByIndex.get(i)\n\n if (moveId) {\n if (moveId === targetId) {\n if (cur.removed) out.push(cur.value)\n } else {\n if (cur.added) out.push(cur.value)\n }\n continue\n }\n\n if (cur.removed && next?.added) {\n if (pairContainsUnsafeLine(cur.value) || pairContainsUnsafeLine(next.value)) {\n const id = reserveId('replace', cur.value, next.value)\n out.push(id === targetId ? cur.value : next.value)\n } else {\n const { text, matched } = revertWordRegion(cur.value, next.value, targetId, reserveId)\n out.push(matched ? text : next.value)\n }\n i++\n } else if (cur.removed) {\n const id = reserveId('remove', cur.value, '')\n if (id === targetId) out.push(cur.value)\n } else if (cur.added) {\n const id = reserveId('add', '', cur.value)\n if (id !== targetId) out.push(cur.value)\n } else {\n out.push(cur.value)\n }\n }\n\n return matchTail(out.join(''), rawCompare)\n}\n"]}
|
package/dist/chunk-APZZQZ6P.js
DELETED
|
@@ -1,147 +0,0 @@
|
|
|
1
|
-
import { cn } from './chunk-SN5YV6FF.js';
|
|
2
|
-
import * as React from 'react';
|
|
3
|
-
import React__default from 'react';
|
|
4
|
-
import * as AvatarPrimitive from '@radix-ui/react-avatar';
|
|
5
|
-
import { jsx } from 'react/jsx-runtime';
|
|
6
|
-
|
|
7
|
-
var Avatar = React.forwardRef(({ className, ...props }, ref) => /* @__PURE__ */ jsx(
|
|
8
|
-
AvatarPrimitive.Root,
|
|
9
|
-
{
|
|
10
|
-
ref,
|
|
11
|
-
className: cn("relative flex h-10 w-10 shrink-0 overflow-hidden rounded-full", className),
|
|
12
|
-
...props
|
|
13
|
-
}
|
|
14
|
-
));
|
|
15
|
-
Avatar.displayName = AvatarPrimitive.Root.displayName;
|
|
16
|
-
var AvatarImage = React.forwardRef(({ className, ...props }, ref) => /* @__PURE__ */ jsx(
|
|
17
|
-
AvatarPrimitive.Image,
|
|
18
|
-
{
|
|
19
|
-
ref,
|
|
20
|
-
className: cn("aspect-square h-full w-full object-cover", className),
|
|
21
|
-
...props
|
|
22
|
-
}
|
|
23
|
-
));
|
|
24
|
-
AvatarImage.displayName = AvatarPrimitive.Image.displayName;
|
|
25
|
-
var AvatarFallback = React.forwardRef(({ className, ...props }, ref) => /* @__PURE__ */ jsx(
|
|
26
|
-
AvatarPrimitive.Fallback,
|
|
27
|
-
{
|
|
28
|
-
ref,
|
|
29
|
-
className: cn(
|
|
30
|
-
"flex h-full w-full items-center justify-center rounded-full bg-muted",
|
|
31
|
-
className
|
|
32
|
-
),
|
|
33
|
-
...props
|
|
34
|
-
}
|
|
35
|
-
));
|
|
36
|
-
AvatarFallback.displayName = AvatarPrimitive.Fallback.displayName;
|
|
37
|
-
function isAgent(user) {
|
|
38
|
-
return user.external_id.startsWith("agt-");
|
|
39
|
-
}
|
|
40
|
-
function getUserAvatarColor(userId) {
|
|
41
|
-
let fifthChar = "0";
|
|
42
|
-
if (userId && userId.length >= 5) {
|
|
43
|
-
fifthChar = userId.charAt(4);
|
|
44
|
-
}
|
|
45
|
-
const colorMap = {
|
|
46
|
-
"0": "bg-emerald-700",
|
|
47
|
-
"1": "bg-blue-700",
|
|
48
|
-
"2": "bg-violet-700",
|
|
49
|
-
"3": "bg-rose-700",
|
|
50
|
-
"4": "bg-amber-700",
|
|
51
|
-
"5": "bg-lime-700",
|
|
52
|
-
"6": "bg-purple-700",
|
|
53
|
-
"7": "bg-cyan-700",
|
|
54
|
-
"8": "bg-orange-700",
|
|
55
|
-
"9": "bg-teal-700",
|
|
56
|
-
a: "bg-red-700",
|
|
57
|
-
b: "bg-indigo-700",
|
|
58
|
-
c: "bg-pink-700",
|
|
59
|
-
d: "bg-green-700",
|
|
60
|
-
e: "bg-yellow-700",
|
|
61
|
-
f: "bg-sky-700"
|
|
62
|
-
};
|
|
63
|
-
return colorMap[fifthChar] || "bg-emerald-700";
|
|
64
|
-
}
|
|
65
|
-
function getUserInitials(user) {
|
|
66
|
-
const first = user.given_name[0] ?? "";
|
|
67
|
-
const last = user.family_name?.[0] ?? "";
|
|
68
|
-
return (first + last).toUpperCase();
|
|
69
|
-
}
|
|
70
|
-
function getUserDisplayName(user) {
|
|
71
|
-
return user.family_name ? `${user.given_name} ${user.family_name}` : user.given_name;
|
|
72
|
-
}
|
|
73
|
-
function createUserAvatarIcon(user) {
|
|
74
|
-
const initials = getUserInitials(user);
|
|
75
|
-
const colorClass = getUserAvatarColor(user.external_id);
|
|
76
|
-
return React__default.createElement(
|
|
77
|
-
Avatar,
|
|
78
|
-
{ className: "h-5 w-5 border border-white" },
|
|
79
|
-
user.picture && React__default.createElement(AvatarImage, { src: user.picture, alt: initials }),
|
|
80
|
-
React__default.createElement(
|
|
81
|
-
AvatarFallback,
|
|
82
|
-
{ className: `text-[9px] text-white font-semibold ${colorClass}` },
|
|
83
|
-
initials
|
|
84
|
-
)
|
|
85
|
-
);
|
|
86
|
-
}
|
|
87
|
-
|
|
88
|
-
// src/documents/audio-segmenter.ts
|
|
89
|
-
var DEFAULT_SEGMENTER_CONFIG = {
|
|
90
|
-
voiceThreshold: 0.3,
|
|
91
|
-
silenceMs: 700,
|
|
92
|
-
maxMs: 1e4,
|
|
93
|
-
minVoiceMs: 600
|
|
94
|
-
};
|
|
95
|
-
var INITIAL_SEGMENTER_STATE = { phase: "idle" };
|
|
96
|
-
function levelFromRms(rms) {
|
|
97
|
-
return Math.sqrt(Math.min(1, rms * 8));
|
|
98
|
-
}
|
|
99
|
-
function end(state, at, reason, config) {
|
|
100
|
-
return {
|
|
101
|
-
type: "end",
|
|
102
|
-
at,
|
|
103
|
-
startedAt: state.startedAt,
|
|
104
|
-
voiceMs: state.voiceMs,
|
|
105
|
-
keep: state.voiceMs >= config.minVoiceMs,
|
|
106
|
-
reason
|
|
107
|
-
};
|
|
108
|
-
}
|
|
109
|
-
function stepSegmenter(state, level, t, config = DEFAULT_SEGMENTER_CONFIG) {
|
|
110
|
-
const voice = level >= config.voiceThreshold;
|
|
111
|
-
if (state.phase === "idle") {
|
|
112
|
-
if (!voice) return { state, events: [] };
|
|
113
|
-
return {
|
|
114
|
-
state: { phase: "voice", startedAt: t, lastVoiceAt: t, lastSampleAt: t, voiceMs: 0 },
|
|
115
|
-
events: [{ type: "start", at: t }]
|
|
116
|
-
};
|
|
117
|
-
}
|
|
118
|
-
const dt = Math.max(0, t - state.lastSampleAt);
|
|
119
|
-
const next = {
|
|
120
|
-
...state,
|
|
121
|
-
lastSampleAt: t,
|
|
122
|
-
lastVoiceAt: voice ? t : state.lastVoiceAt,
|
|
123
|
-
voiceMs: state.voiceMs + (voice ? dt : 0)
|
|
124
|
-
};
|
|
125
|
-
if (t - next.startedAt >= config.maxMs) {
|
|
126
|
-
const events = [end(next, t, "max", config)];
|
|
127
|
-
if (!voice) return { state: { phase: "idle" }, events };
|
|
128
|
-
events.push({ type: "start", at: t });
|
|
129
|
-
return {
|
|
130
|
-
state: { phase: "voice", startedAt: t, lastVoiceAt: t, lastSampleAt: t, voiceMs: 0 },
|
|
131
|
-
events
|
|
132
|
-
};
|
|
133
|
-
}
|
|
134
|
-
const silence = config.silenceMs + (next.voiceMs < config.minVoiceMs ? config.holdShortMs ?? 0 : 0);
|
|
135
|
-
if (!voice && t - next.lastVoiceAt >= silence) {
|
|
136
|
-
return { state: { phase: "idle" }, events: [end(next, t, "silence", config)] };
|
|
137
|
-
}
|
|
138
|
-
return { state: next, events: [] };
|
|
139
|
-
}
|
|
140
|
-
function flushSegmenter(state, t, config = DEFAULT_SEGMENTER_CONFIG) {
|
|
141
|
-
if (state.phase === "idle") return { state, events: [] };
|
|
142
|
-
return { state: { phase: "idle" }, events: [end(state, t, "flush", config)] };
|
|
143
|
-
}
|
|
144
|
-
|
|
145
|
-
export { Avatar, AvatarFallback, AvatarImage, DEFAULT_SEGMENTER_CONFIG, INITIAL_SEGMENTER_STATE, createUserAvatarIcon, flushSegmenter, getUserAvatarColor, getUserDisplayName, getUserInitials, isAgent, levelFromRms, stepSegmenter };
|
|
146
|
-
//# sourceMappingURL=chunk-APZZQZ6P.js.map
|
|
147
|
-
//# sourceMappingURL=chunk-APZZQZ6P.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/ui/avatar.tsx","../src/users/user-display.ts","../src/documents/audio-segmenter.ts"],"names":["React"],"mappings":"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","file":"chunk-APZZQZ6P.js","sourcesContent":["import * as React from 'react'\nimport * as AvatarPrimitive from '@radix-ui/react-avatar'\n\nimport { cn } from '../lib/utils'\n\nconst Avatar = React.forwardRef<\n React.ElementRef<typeof AvatarPrimitive.Root>,\n React.ComponentPropsWithoutRef<typeof AvatarPrimitive.Root>\n>(({ className, ...props }, ref) => (\n <AvatarPrimitive.Root\n ref={ref}\n className={cn('relative flex h-10 w-10 shrink-0 overflow-hidden rounded-full', className)}\n {...props}\n />\n))\nAvatar.displayName = AvatarPrimitive.Root.displayName\n\nconst AvatarImage = React.forwardRef<\n React.ElementRef<typeof AvatarPrimitive.Image>,\n React.ComponentPropsWithoutRef<typeof AvatarPrimitive.Image>\n>(({ className, ...props }, ref) => (\n <AvatarPrimitive.Image\n ref={ref}\n className={cn('aspect-square h-full w-full object-cover', className)}\n {...props}\n />\n))\nAvatarImage.displayName = AvatarPrimitive.Image.displayName\n\nconst AvatarFallback = React.forwardRef<\n React.ElementRef<typeof AvatarPrimitive.Fallback>,\n React.ComponentPropsWithoutRef<typeof AvatarPrimitive.Fallback>\n>(({ className, ...props }, ref) => (\n <AvatarPrimitive.Fallback\n ref={ref}\n className={cn(\n 'flex h-full w-full items-center justify-center rounded-full bg-muted',\n className\n )}\n {...props}\n />\n))\nAvatarFallback.displayName = AvatarPrimitive.Fallback.displayName\n\nexport { Avatar, AvatarImage, AvatarFallback }\n","/**\n * User Utilities\n *\n * A person's display name, avatar colour and initials, the same in every surface.\n * Uses deterministic color mapping based on user ID (5th character of ID).\n *\n * NOTE: given_name and family_name are required fields.\n */\n\nimport { Avatar, AvatarFallback, AvatarImage } from '../ui/avatar'\nimport React from 'react'\n\n/**\n * Check if a user is an agent (external_id starts with 'agt-')\n */\nexport function isAgent(user: { external_id: string }): boolean {\n return user.external_id.startsWith('agt-')\n}\n\n/**\n * Generate consistent avatar color based on user ID\n * Uses same pattern as workspace colors - extracts 5th character for deterministic mapping\n */\nexport function getUserAvatarColor(userId: string): string {\n // Extract 5th character (index 4) for color mapping\n let fifthChar = '0' // default fallback\n\n if (userId && userId.length >= 5) {\n fifthChar = userId.charAt(4)\n }\n\n // Map to solid, vibrant avatar colors (700 weight: white initials pass WCAG AA 4.5:1 on every colour)\n const colorMap: Record<string, string> = {\n '0': 'bg-emerald-700',\n '1': 'bg-blue-700',\n '2': 'bg-violet-700',\n '3': 'bg-rose-700',\n '4': 'bg-amber-700',\n '5': 'bg-lime-700',\n '6': 'bg-purple-700',\n '7': 'bg-cyan-700',\n '8': 'bg-orange-700',\n '9': 'bg-teal-700',\n a: 'bg-red-700',\n b: 'bg-indigo-700',\n c: 'bg-pink-700',\n d: 'bg-green-700',\n e: 'bg-yellow-700',\n f: 'bg-sky-700',\n }\n\n return colorMap[fifthChar] || 'bg-emerald-700'\n}\n\n/**\n * Get user initials from given_name and family_name (both required)\n * Returns first letter of each name, e.g. \"John Doe\" -> \"JD\"\n */\nexport function getUserInitials(user: { given_name: string; family_name?: string | null }): string {\n const first = user.given_name[0] ?? ''\n const last = user.family_name?.[0] ?? ''\n return (first + last).toUpperCase()\n}\n\n/**\n * Get user display name from given_name and family_name (both required)\n * Returns full name, e.g. \"John Doe\"\n */\nexport function getUserDisplayName(user: {\n given_name: string\n family_name?: string | null\n}): string {\n return user.family_name ? `${user.given_name} ${user.family_name}` : user.given_name\n}\n\n/**\n * Create a user avatar icon element for use in toast notifications.\n * This is a simple React element (not a component with hooks) so it can be\n * used outside of React component context (e.g., in WebSocket handlers).\n */\nexport function createUserAvatarIcon(user: {\n external_id: string\n given_name: string\n family_name?: string | null\n picture?: string | null\n}): React.ReactElement {\n const initials = getUserInitials(user)\n const colorClass = getUserAvatarColor(user.external_id)\n\n return React.createElement(\n Avatar,\n { className: 'h-5 w-5 border border-white' },\n user.picture && React.createElement(AvatarImage, { src: user.picture, alt: initials }),\n React.createElement(\n AvatarFallback,\n { className: `text-[9px] text-white font-semibold ${colorClass}` },\n initials\n )\n )\n}\n","/**\n * audio-segmenter — the voice-activity state machine behind `useAudioRecorder`'s\n * segmenting mode. Pure: fed one (level, time) sample per meter tick, it says\n * when a speech segment starts and when it ends, and whether the segment held\n * enough voice to be worth keeping. The hook owns the MediaRecorders; this\n * owns only the decisions, so it is unit-testable with synthetic levels.\n *\n * A segment starts on the first sample at or above `voiceThreshold`, ends after\n * `silenceMs` without voice or at `maxMs` (a cut while still speaking starts the\n * next segment on the same sample), and is dropped when it held less than\n * `minVoiceMs` of voice — a cough, a click, a door.\n */\n\nexport interface SegmenterConfig {\n /** Meter level (0-1, as `useAudioRecorder` reports it) that counts as voice. */\n voiceThreshold: number\n /** Silence that ends a segment. */\n silenceMs: number\n /** Longest segment; a longer utterance is cut into several. */\n maxMs: number\n /** Segments with less voice than this are dropped. */\n minVoiceMs: number\n /**\n * Extra silence a segment that is still too short waits for more voice before it ends (0 = none).\n * A short word and a short phrase a pause apart — \"Perfect.\" … \"Thank you both.\" — then make one\n * segment instead of two dropped ones.\n */\n holdShortMs?: number\n}\n\nexport const DEFAULT_SEGMENTER_CONFIG: SegmenterConfig = {\n voiceThreshold: 0.3,\n silenceMs: 700,\n maxMs: 10_000,\n minVoiceMs: 600,\n}\n\nexport type SegmenterState =\n | { phase: 'idle' }\n | {\n phase: 'voice'\n /** When the segment started (the clock of the samples). */\n startedAt: number\n /** The last sample that carried voice. */\n lastVoiceAt: number\n /** The previous sample, to integrate voice time between samples. */\n lastSampleAt: number\n /** Voice accumulated so far. */\n voiceMs: number\n }\n\nexport type SegmenterEvent =\n | { type: 'start'; at: number }\n | {\n type: 'end'\n at: number\n startedAt: number\n voiceMs: number\n /** False when the segment held too little voice: discard it. */\n keep: boolean\n reason: 'silence' | 'max' | 'flush'\n }\n\nexport const INITIAL_SEGMENTER_STATE: SegmenterState = { phase: 'idle' }\n\n/**\n * The meter level (0-1) of an RMS amplitude, as the segmenter's thresholds expect it. Normal\n * speech RMS is tiny (a laptop mic at conversational distance rarely exceeds ~0.1), so it is\n * boosted, then a sqrt (perceptual) curve makes quiet-to-moderate speech clearly visible.\n */\nexport function levelFromRms(rms: number): number {\n return Math.sqrt(Math.min(1, rms * 8))\n}\n\nfunction end(\n state: Extract<SegmenterState, { phase: 'voice' }>,\n at: number,\n reason: 'silence' | 'max' | 'flush',\n config: SegmenterConfig\n): SegmenterEvent {\n return {\n type: 'end',\n at,\n startedAt: state.startedAt,\n voiceMs: state.voiceMs,\n keep: state.voiceMs >= config.minVoiceMs,\n reason,\n }\n}\n\n/** Feed one meter sample. Returns the next state and what happened (0-2 events). */\nexport function stepSegmenter(\n state: SegmenterState,\n level: number,\n t: number,\n config: SegmenterConfig = DEFAULT_SEGMENTER_CONFIG\n): { state: SegmenterState; events: SegmenterEvent[] } {\n const voice = level >= config.voiceThreshold\n if (state.phase === 'idle') {\n if (!voice) return { state, events: [] }\n return {\n state: { phase: 'voice', startedAt: t, lastVoiceAt: t, lastSampleAt: t, voiceMs: 0 },\n events: [{ type: 'start', at: t }],\n }\n }\n const dt = Math.max(0, t - state.lastSampleAt)\n const next = {\n ...state,\n lastSampleAt: t,\n lastVoiceAt: voice ? t : state.lastVoiceAt,\n voiceMs: state.voiceMs + (voice ? dt : 0),\n }\n if (t - next.startedAt >= config.maxMs) {\n const events: SegmenterEvent[] = [end(next, t, 'max', config)]\n if (!voice) return { state: { phase: 'idle' }, events }\n events.push({ type: 'start', at: t })\n return {\n state: { phase: 'voice', startedAt: t, lastVoiceAt: t, lastSampleAt: t, voiceMs: 0 },\n events,\n }\n }\n const silence =\n config.silenceMs + (next.voiceMs < config.minVoiceMs ? (config.holdShortMs ?? 0) : 0)\n if (!voice && t - next.lastVoiceAt >= silence) {\n return { state: { phase: 'idle' }, events: [end(next, t, 'silence', config)] }\n }\n return { state: next, events: [] }\n}\n\n/** Close the open segment, if any (recording stopped). */\nexport function flushSegmenter(\n state: SegmenterState,\n t: number,\n config: SegmenterConfig = DEFAULT_SEGMENTER_CONFIG\n): { state: SegmenterState; events: SegmenterEvent[] } {\n if (state.phase === 'idle') return { state, events: [] }\n return { state: { phase: 'idle' }, events: [end(state, t, 'flush', config)] }\n}\n"]}
|