@arbidocs/react 0.5.111 → 0.5.112
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/account/client.js +96 -0
- package/dist/account/client.js.map +7 -0
- package/dist/account/delete.js +70 -0
- package/dist/account/delete.js.map +7 -0
- package/dist/account/didit.js +34 -0
- package/dist/account/didit.js.map +7 -0
- package/dist/account/dismissed-tips.js +33 -0
- package/dist/account/dismissed-tips.js.map +7 -0
- package/dist/account/email.js +84 -0
- package/dist/account/email.js.map +7 -0
- package/dist/account/entitlements.js +47 -0
- package/dist/account/entitlements.js.map +7 -0
- package/dist/account/identity.js +270 -0
- package/dist/account/identity.js.map +7 -0
- package/dist/account/index.js +93 -0
- package/dist/account/index.js.map +7 -0
- package/dist/account/notifications.js +59 -0
- package/dist/account/notifications.js.map +7 -0
- package/dist/account/password.js +103 -0
- package/dist/account/password.js.map +7 -0
- package/dist/account/profile.js +116 -0
- package/dist/account/profile.js.map +7 -0
- package/dist/account/recovery.js +13 -0
- package/dist/account/recovery.js.map +7 -0
- package/dist/account/relevance.js +82 -0
- package/dist/account/relevance.js.map +7 -0
- package/dist/account/sessions.js +37 -0
- package/dist/account/sessions.js.map +7 -0
- package/dist/account/settings.js +39 -0
- package/dist/account/settings.js.map +7 -0
- package/dist/account/table-views.js +16 -0
- package/dist/account/table-views.js.map +7 -0
- package/dist/ai/AiAnswer.js +83 -0
- package/dist/ai/AiAnswer.js.map +7 -0
- package/dist/ai/AiMarkdown.js +40 -0
- package/dist/ai/AiMarkdown.js.map +7 -0
- package/dist/ai/ArtifactCanvas.js +193 -0
- package/dist/ai/ArtifactCanvas.js.map +7 -0
- package/dist/ai/CitationRenderer.js +413 -0
- package/dist/ai/CitationRenderer.js.map +7 -0
- package/dist/{chunk-WL2Y2T47.js → ai/MarkdownRenderer.js} +35 -101
- package/dist/ai/MarkdownRenderer.js.map +7 -0
- package/dist/ai/MessageArtifactCard.js +75 -0
- package/dist/ai/MessageArtifactCard.js.map +7 -0
- package/dist/ai/PassageCard.js +79 -0
- package/dist/ai/PassageCard.js.map +7 -0
- package/dist/ai/engine.js +110 -0
- package/dist/ai/engine.js.map +7 -0
- package/dist/ai/index.js +63 -0
- package/dist/ai/index.js.map +7 -0
- package/dist/ai/markdown-base-components.js +37 -0
- package/dist/ai/markdown-base-components.js.map +7 -0
- package/dist/ai/markdown-streaming-context.js +6 -0
- package/dist/ai/markdown-streaming-context.js.map +7 -0
- package/dist/{chunk-VSCU7K4V.js → ai/normalize-citations.js} +12 -19
- package/dist/ai/normalize-citations.js.map +7 -0
- package/dist/ai/redline.js +41 -0
- package/dist/ai/redline.js.map +7 -0
- package/dist/ai/split-markdown-blocks.js +40 -0
- package/dist/ai/split-markdown-blocks.js.map +7 -0
- package/dist/{chunk-UW2SGTI5.js → ai/stored-markdown.js} +41 -93
- package/dist/ai/stored-markdown.js.map +7 -0
- package/dist/annotations/AnnotationPageOverlay.js +807 -0
- package/dist/annotations/AnnotationPageOverlay.js.map +7 -0
- package/dist/annotations/AnnotationToolbar.js +398 -0
- package/dist/annotations/AnnotationToolbar.js.map +7 -0
- package/dist/annotations/FreezeDialog.js +170 -0
- package/dist/annotations/FreezeDialog.js.map +7 -0
- package/dist/annotations/ProductionDialog.js +354 -0
- package/dist/annotations/ProductionDialog.js.map +7 -0
- package/dist/annotations/controller.js +49 -0
- package/dist/annotations/controller.js.map +7 -0
- package/dist/annotations/freeze/browser.js +21 -0
- package/dist/annotations/freeze/browser.js.map +7 -0
- package/dist/annotations/freeze/bundle.js +201 -0
- package/dist/annotations/freeze/bundle.js.map +7 -0
- package/dist/annotations/freeze/coords.js +37 -0
- package/dist/annotations/freeze/coords.js.map +7 -0
- package/dist/annotations/freeze/freeze.js +261 -0
- package/dist/annotations/freeze/freeze.js.map +7 -0
- package/dist/annotations/freeze/hash.js +28 -0
- package/dist/annotations/freeze/hash.js.map +7 -0
- package/dist/annotations/freeze/index-page.js +78 -0
- package/dist/annotations/freeze/index-page.js.map +7 -0
- package/dist/annotations/freeze/index.js +28 -22
- package/dist/annotations/freeze/index.js.map +7 -1
- package/dist/annotations/freeze/raster.js +208 -0
- package/dist/annotations/freeze/raster.js.map +7 -0
- package/dist/annotations/freeze/stamp.js +117 -0
- package/dist/annotations/freeze/stamp.js.map +7 -0
- package/dist/annotations/freeze/types.js +14 -0
- package/dist/annotations/freeze/types.js.map +7 -0
- package/dist/annotations/freeze/vector.js +283 -0
- package/dist/annotations/freeze/vector.js.map +7 -0
- package/dist/annotations/geometry.js +81 -0
- package/dist/annotations/geometry.js.map +7 -0
- package/dist/annotations/index.js +125 -6
- package/dist/annotations/index.js.map +7 -1
- package/dist/annotations/merge.js +53 -0
- package/dist/annotations/merge.js.map +7 -0
- package/dist/{chunk-T3USOSVN.js → annotations/model.js} +23 -16
- package/dist/annotations/model.js.map +7 -0
- package/dist/annotations/overlay-geometry.js +41 -0
- package/dist/annotations/overlay-geometry.js.map +7 -0
- package/dist/annotations/redaction-log.js +33 -0
- package/dist/annotations/redaction-log.js.map +7 -0
- package/dist/annotations/selection-marks.js +122 -0
- package/dist/annotations/selection-marks.js.map +7 -0
- package/dist/annotations/state.js +140 -0
- package/dist/annotations/state.js.map +7 -0
- package/dist/annotations/store.js +49 -0
- package/dist/annotations/store.js.map +7 -0
- package/dist/annotations/useAnnotationLayer.js +306 -0
- package/dist/annotations/useAnnotationLayer.js.map +7 -0
- package/dist/annotations/useAnnotationShortcuts.js +31 -0
- package/dist/annotations/useAnnotationShortcuts.js.map +7 -0
- package/dist/annotations/useTextSelectionMarks.js +100 -0
- package/dist/annotations/useTextSelectionMarks.js.map +7 -0
- package/dist/artifacts/artifact-kind.js +19 -0
- package/dist/artifacts/artifact-kind.js.map +7 -0
- package/dist/artifacts/index.js +89 -571
- package/dist/artifacts/index.js.map +7 -1
- package/dist/{chunk-WUTL62MC.js → artifacts/normalize-markdown.js} +12 -14
- package/dist/artifacts/normalize-markdown.js.map +7 -0
- package/dist/artifacts/redline-core.js +12 -3
- package/dist/artifacts/redline-core.js.map +7 -1
- package/dist/{chunk-74N436VK.js → artifacts/redline-diff.js} +10 -9
- package/dist/artifacts/redline-diff.js.map +7 -0
- package/dist/artifacts/redline-engine.js +14 -0
- package/dist/artifacts/redline-engine.js.map +7 -0
- package/dist/artifacts/renderArtifactMarkdown.js +9 -0
- package/dist/artifacts/renderArtifactMarkdown.js.map +7 -0
- package/dist/artifacts/useArtifactEditSession.js +183 -0
- package/dist/artifacts/useArtifactEditSession.js.map +7 -0
- package/dist/artifacts/useArtifactSession.js +173 -0
- package/dist/artifacts/useArtifactSession.js.map +7 -0
- package/dist/artifacts/useArtifactSource.js +16 -0
- package/dist/artifacts/useArtifactSource.js.map +7 -0
- package/dist/artifacts/useArtifactText.js +78 -0
- package/dist/artifacts/useArtifactText.js.map +7 -0
- package/dist/artifacts/useRedline.js +65 -0
- package/dist/artifacts/useRedline.js.map +7 -0
- package/dist/artifacts/useStreamedArtifact.js +74 -0
- package/dist/artifacts/useStreamedArtifact.js.map +7 -0
- package/dist/artifacts/versions.js +68 -0
- package/dist/artifacts/versions.js.map +7 -0
- package/dist/billing.js +200 -0
- package/dist/billing.js.map +7 -0
- package/dist/boot-timeout.js +19 -0
- package/dist/boot-timeout.js.map +7 -0
- package/dist/calendar/accounts.js +213 -0
- package/dist/calendar/accounts.js.map +7 -0
- package/dist/calendar/hooks.js +409 -0
- package/dist/calendar/hooks.js.map +7 -0
- package/dist/calendar/index.js +31 -0
- package/dist/calendar/index.js.map +7 -0
- package/dist/calendar/keys.js +5 -0
- package/dist/calendar/keys.js.map +7 -0
- package/dist/calendar/offline/outbox.js +231 -0
- package/dist/calendar/offline/outbox.js.map +7 -0
- package/dist/calendar/offline/runtime.js +109 -0
- package/dist/calendar/offline/runtime.js.map +7 -0
- package/dist/calendar/offline/support.js +41 -0
- package/dist/calendar/offline/support.js.map +7 -0
- package/dist/calendar/support.js +34 -0
- package/dist/calendar/support.js.map +7 -0
- package/dist/calls/actions.js +226 -0
- package/dist/calls/actions.js.map +7 -0
- package/dist/calls/events.js +138 -0
- package/dist/calls/events.js.map +7 -0
- package/dist/calls/gate.js +19 -0
- package/dist/calls/gate.js.map +7 -0
- package/dist/calls/hooks.js +115 -0
- package/dist/calls/hooks.js.map +7 -0
- package/dist/calls/in-call-chat.js +132 -0
- package/dist/calls/in-call-chat.js.map +7 -0
- package/dist/calls/index.js +24 -0
- package/dist/calls/index.js.map +7 -0
- package/dist/calls/keys.js +17 -0
- package/dist/calls/keys.js.map +7 -0
- package/dist/calls/livekit/index.js +6 -958
- package/dist/calls/livekit/index.js.map +7 -1
- package/dist/calls/livekit/room.js +98 -0
- package/dist/calls/livekit/room.js.map +7 -0
- package/dist/calls/livekit/useCallRecorder.js +219 -0
- package/dist/calls/livekit/useCallRecorder.js.map +7 -0
- package/dist/calls/livekit/useCallTranscriber.js +309 -0
- package/dist/calls/livekit/useCallTranscriber.js.map +7 -0
- package/dist/calls/livekit/useHostMuteNotice.js +29 -0
- package/dist/calls/livekit/useHostMuteNotice.js.map +7 -0
- package/dist/calls/livekit/useInCallChat.js +161 -0
- package/dist/calls/livekit/useInCallChat.js.map +7 -0
- package/dist/calls/livekit/useWebinar.js +239 -0
- package/dist/calls/livekit/useWebinar.js.map +7 -0
- package/dist/calls/meeting-chat.js +149 -0
- package/dist/calls/meeting-chat.js.map +7 -0
- package/dist/calls/moderation.js +50 -0
- package/dist/calls/moderation.js.map +7 -0
- package/dist/calls/open-meeting-chat.js +29 -0
- package/dist/calls/open-meeting-chat.js.map +7 -0
- package/dist/calls/read-only.js +24 -0
- package/dist/calls/read-only.js.map +7 -0
- package/dist/calls/recording-media.js +218 -0
- package/dist/calls/recording-media.js.map +7 -0
- package/dist/calls/recording-playback.js +260 -0
- package/dist/calls/recording-playback.js.map +7 -0
- package/dist/calls/recording.js +268 -0
- package/dist/calls/recording.js.map +7 -0
- package/dist/calls/save-to-thread.js +80 -0
- package/dist/calls/save-to-thread.js.map +7 -0
- package/dist/calls/session.js +134 -0
- package/dist/calls/session.js.map +7 -0
- package/dist/calls/transcript-format.js +147 -0
- package/dist/calls/transcript-format.js.map +7 -0
- package/dist/calls/transcription.js +101 -0
- package/dist/calls/transcription.js.map +7 -0
- package/dist/calls/webinar.js +71 -0
- package/dist/calls/webinar.js.map +7 -0
- package/dist/charge-watch.js +71 -0
- package/dist/charge-watch.js.map +7 -0
- package/dist/chat/ChatBubble.js +146 -0
- package/dist/chat/ChatBubble.js.map +7 -0
- package/dist/chat/ConversationScope.js +30 -0
- package/dist/chat/ConversationScope.js.map +7 -0
- package/dist/chat/active-config.js +20 -0
- package/dist/chat/active-config.js.map +7 -0
- package/dist/chat/agent-chat-owner.js +25 -0
- package/dist/chat/agent-chat-owner.js.map +7 -0
- package/dist/chat/chat-artifacts.js +64 -0
- package/dist/chat/chat-artifacts.js.map +7 -0
- package/dist/chat/citations.js +32 -0
- package/dist/chat/citations.js.map +7 -0
- package/dist/chat/config-model.js +10 -0
- package/dist/chat/config-model.js.map +7 -0
- package/dist/chat/conversation-cache.js +676 -0
- package/dist/chat/conversation-cache.js.map +7 -0
- package/dist/chat/conversation-events.js +57 -0
- package/dist/chat/conversation-events.js.map +7 -0
- package/dist/chat/conversation-mentions.js +58 -0
- package/dist/chat/conversation-mentions.js.map +7 -0
- package/dist/chat/conversation-workspace.js +58 -0
- package/dist/chat/conversation-workspace.js.map +7 -0
- package/dist/chat/mentions.js +116 -0
- package/dist/chat/mentions.js.map +7 -0
- package/dist/chat/open-document.js +106 -0
- package/dist/chat/open-document.js.map +7 -0
- package/dist/chat/orphaned.js +44 -0
- package/dist/chat/orphaned.js.map +7 -0
- package/dist/chat/pendingFirstTurn.js +30 -0
- package/dist/chat/pendingFirstTurn.js.map +7 -0
- package/dist/chat/reply-target.js +12 -0
- package/dist/chat/reply-target.js.map +7 -0
- package/dist/chat/run-finished.js +28 -0
- package/dist/chat/run-finished.js.map +7 -0
- package/dist/chat/run-state.js +91 -0
- package/dist/chat/run-state.js.map +7 -0
- package/dist/chat/stream-handlers.js +419 -0
- package/dist/chat/stream-handlers.js.map +7 -0
- package/dist/chat/thread-binding.js +76 -0
- package/dist/chat/thread-binding.js.map +7 -0
- package/dist/chat/thread-document.js +53 -0
- package/dist/chat/thread-document.js.map +7 -0
- package/dist/chat/turn-control.js +79 -0
- package/dist/chat/turn-control.js.map +7 -0
- package/dist/chat/useAgentRunControl.js +36 -0
- package/dist/chat/useAgentRunControl.js.map +7 -0
- package/dist/chat/useAnswerAgentQuestion.js +19 -0
- package/dist/chat/useAnswerAgentQuestion.js.map +7 -0
- package/dist/chat/useAskAgain.js +32 -0
- package/dist/chat/useAskAgain.js.map +7 -0
- package/dist/chat/useAutoSendDraft.js +17 -0
- package/dist/chat/useAutoSendDraft.js.map +7 -0
- package/dist/chat/useBranchNavigation.js +97 -0
- package/dist/chat/useBranchNavigation.js.map +7 -0
- package/dist/chat/useConnectRunStream.js +169 -0
- package/dist/chat/useConnectRunStream.js.map +7 -0
- package/dist/chat/useConversation.js +431 -0
- package/dist/chat/useConversation.js.map +7 -0
- package/dist/chat/useConversationActions.js +662 -0
- package/dist/chat/useConversationActions.js.map +7 -0
- package/dist/chat/useConversationData.js +143 -0
- package/dist/chat/useConversationData.js.map +7 -0
- package/dist/chat/useConversationDocuments.js +41 -0
- package/dist/chat/useConversationDocuments.js.map +7 -0
- package/dist/chat/useConversationSettings.js +78 -0
- package/dist/chat/useConversationSettings.js.map +7 -0
- package/dist/chat/useConversationTurn.js +31 -0
- package/dist/chat/useConversationTurn.js.map +7 -0
- package/dist/chat/useConversationWorkspace.js +12 -0
- package/dist/chat/useConversationWorkspace.js.map +7 -0
- package/dist/chat/useDeleteMessage.js +15 -0
- package/dist/chat/useDeleteMessage.js.map +7 -0
- package/dist/chat/useDocumentAutoAdd.js +73 -0
- package/dist/chat/useDocumentAutoAdd.js.map +7 -0
- package/dist/chat/useMessageTimer.js +39 -0
- package/dist/chat/useMessageTimer.js.map +7 -0
- package/dist/chat/useThinkingContent.js +67 -0
- package/dist/chat/useThinkingContent.js.map +7 -0
- package/dist/chat/useThreadDocument.js +61 -0
- package/dist/chat/useThreadDocument.js.map +7 -0
- package/dist/chat/workflow-run-titles.js +50 -0
- package/dist/chat/workflow-run-titles.js.map +7 -0
- package/dist/{chunk-Z3W4XFWB.cjs → chunk-C72FSQUE.cjs} +3 -3
- package/dist/{chunk-Z3W4XFWB.cjs.map → chunk-C72FSQUE.cjs.map} +1 -1
- package/dist/{chunk-LBAG7KL7.cjs → chunk-FQVNZCTD.cjs} +3 -3
- package/dist/{chunk-LBAG7KL7.cjs.map → chunk-FQVNZCTD.cjs.map} +1 -1
- package/dist/{chunk-DI5KSVKY.cjs → chunk-UDDJIUHJ.cjs} +3 -3
- package/dist/{chunk-DI5KSVKY.cjs.map → chunk-UDDJIUHJ.cjs.map} +1 -1
- package/dist/config/config-hooks.js +209 -0
- package/dist/config/config-hooks.js.map +7 -0
- package/dist/connectivity.js +72 -0
- package/dist/connectivity.js.map +7 -0
- package/dist/connectors/hooks.js +263 -0
- package/dist/connectors/hooks.js.map +7 -0
- package/dist/connectors/index.js +28 -0
- package/dist/connectors/index.js.map +7 -0
- package/dist/contacts.js +100 -0
- package/dist/contacts.js.map +7 -0
- package/dist/conversation-list.js +65 -0
- package/dist/conversation-list.js.map +7 -0
- package/dist/databases.js +195 -0
- package/dist/databases.js.map +7 -0
- package/dist/datasets/aggregate.js +281 -0
- package/dist/datasets/aggregate.js.map +7 -0
- package/dist/datasets/index.js +122 -0
- package/dist/datasets/index.js.map +7 -0
- package/dist/datasets/members.js +27 -0
- package/dist/datasets/members.js.map +7 -0
- package/dist/datasets/panel.js +44 -0
- package/dist/datasets/panel.js.map +7 -0
- package/dist/datasets/registry.js +47 -0
- package/dist/datasets/registry.js.map +7 -0
- package/dist/datasets/rows-source.js +44 -0
- package/dist/datasets/rows-source.js.map +7 -0
- package/dist/datasets/sources/activity.js +83 -0
- package/dist/datasets/sources/activity.js.map +7 -0
- package/dist/datasets/sources/conversations.js +74 -0
- package/dist/datasets/sources/conversations.js.map +7 -0
- package/dist/datasets/sources/database.js +209 -0
- package/dist/datasets/sources/database.js.map +7 -0
- package/dist/datasets/sources/documents.js +93 -0
- package/dist/datasets/sources/documents.js.map +7 -0
- package/dist/datasets/sources/facts.js +56 -0
- package/dist/datasets/sources/facts.js.map +7 -0
- package/dist/datasets/sources/projects.js +117 -0
- package/dist/datasets/sources/projects.js.map +7 -0
- package/dist/datasets/sources/tags.js +67 -0
- package/dist/datasets/sources/tags.js.map +7 -0
- package/dist/datasets/sources/usage.js +268 -0
- package/dist/datasets/sources/usage.js.map +7 -0
- package/dist/datasets/sources/workflows.js +91 -0
- package/dist/datasets/sources/workflows.js.map +7 -0
- package/dist/datasets/sources/workspaces.js +67 -0
- package/dist/datasets/sources/workspaces.js.map +7 -0
- package/dist/datasets/store.js +194 -0
- package/dist/datasets/store.js.map +7 -0
- package/dist/datasets/types.js +14 -0
- package/dist/datasets/types.js.map +7 -0
- package/dist/directmessages/ConversationList.js +148 -0
- package/dist/directmessages/ConversationList.js.map +7 -0
- package/dist/directmessages/DateSeparator.js +8 -0
- package/dist/directmessages/DateSeparator.js.map +7 -0
- package/dist/directmessages/DmAvatar.js +29 -0
- package/dist/directmessages/DmAvatar.js.map +7 -0
- package/dist/directmessages/DmComposer.js +201 -0
- package/dist/directmessages/DmComposer.js.map +7 -0
- package/dist/directmessages/arrivals.js +29 -0
- package/dist/directmessages/arrivals.js.map +7 -0
- package/dist/directmessages/chat-cache.js +192 -0
- package/dist/directmessages/chat-cache.js.map +7 -0
- package/dist/directmessages/grouping.js +26 -0
- package/dist/directmessages/grouping.js.map +7 -0
- package/dist/directmessages/index.js +81 -0
- package/dist/directmessages/index.js.map +7 -0
- package/dist/directmessages/useChats.js +266 -0
- package/dist/directmessages/useChats.js.map +7 -0
- package/dist/directmessages/utils.js +23 -0
- package/dist/directmessages/utils.js.map +7 -0
- package/dist/document-tools/can-annotate.js +7 -0
- package/dist/document-tools/can-annotate.js.map +7 -0
- package/dist/document-tools/core.cjs +80 -80
- package/dist/document-tools/core.js +218 -12
- package/dist/document-tools/core.js.map +7 -1
- package/dist/document-tools/document-pdf.js +76 -0
- package/dist/document-tools/document-pdf.js.map +7 -0
- package/dist/document-tools/environment.js +136 -0
- package/dist/document-tools/environment.js.map +7 -0
- package/dist/document-tools/file-shares.js +112 -0
- package/dist/document-tools/file-shares.js.map +7 -0
- package/dist/document-tools/frozen-copy.js +27 -0
- package/dist/document-tools/frozen-copy.js.map +7 -0
- package/dist/document-tools/index.cjs +80 -80
- package/dist/document-tools/index.js +26 -148
- package/dist/document-tools/index.js.map +7 -1
- package/dist/document-tools/markup-download.js +51 -0
- package/dist/document-tools/markup-download.js.map +7 -0
- package/dist/document-tools/markup-store.js +138 -0
- package/dist/document-tools/markup-store.js.map +7 -0
- package/dist/document-tools/markup-transfer.js +88 -0
- package/dist/document-tools/markup-transfer.js.map +7 -0
- package/dist/document-tools/production.js +147 -0
- package/dist/document-tools/production.js.map +7 -0
- package/dist/document-tools/saved-signature.js +90 -0
- package/dist/document-tools/saved-signature.js.map +7 -0
- package/dist/document-tools/signature-requests.js +310 -0
- package/dist/document-tools/signature-requests.js.map +7 -0
- package/dist/document-tools/signing.js +127 -0
- package/dist/document-tools/signing.js.map +7 -0
- package/dist/document-tools/useDocumentBytes.js +38 -0
- package/dist/document-tools/useDocumentBytes.js.map +7 -0
- package/dist/document-tools/useDocumentMarkup.js +154 -0
- package/dist/document-tools/useDocumentMarkup.js.map +7 -0
- package/dist/document-tools/useIsOnline.js +13 -0
- package/dist/document-tools/useIsOnline.js.map +7 -0
- package/dist/document-tools/verification.js +60 -0
- package/dist/document-tools/verification.js.map +7 -0
- package/dist/documents/DocumentReview.js +220 -0
- package/dist/documents/DocumentReview.js.map +7 -0
- package/dist/documents/DraftTitleControls.js +41 -0
- package/dist/documents/DraftTitleControls.js.map +7 -0
- package/dist/documents/InlineMicButton.js +90 -0
- package/dist/documents/InlineMicButton.js.map +7 -0
- package/dist/documents/MicRecordingOverlay.js +29 -0
- package/dist/documents/MicRecordingOverlay.js.map +7 -0
- package/dist/documents/MicWaveformIndicator.js +68 -0
- package/dist/documents/MicWaveformIndicator.js.map +7 -0
- package/dist/documents/PhotoCapture.js +120 -0
- package/dist/documents/PhotoCapture.js.map +7 -0
- package/dist/documents/VideoCapture.js +129 -0
- package/dist/documents/VideoCapture.js.map +7 -0
- package/dist/documents/VoiceNoteRecorder.js +166 -0
- package/dist/documents/VoiceNoteRecorder.js.map +7 -0
- package/dist/documents/audio-segmenter.js +63 -0
- package/dist/documents/audio-segmenter.js.map +7 -0
- package/dist/documents/capture-frame.js +21 -0
- package/dist/documents/capture-frame.js.map +7 -0
- package/dist/documents/chunked-recorder.js +190 -0
- package/dist/documents/chunked-recorder.js.map +7 -0
- package/dist/documents/document-download.js +53 -0
- package/dist/documents/document-download.js.map +7 -0
- package/dist/documents/document-fields.js +109 -0
- package/dist/documents/document-fields.js.map +7 -0
- package/dist/documents/documents-cache.js +110 -0
- package/dist/documents/documents-cache.js.map +7 -0
- package/dist/documents/documents-data.js +128 -0
- package/dist/documents/documents-data.js.map +7 -0
- package/dist/documents/documents-loader.js +113 -0
- package/dist/documents/documents-loader.js.map +7 -0
- package/dist/documents/documents-writes.js +448 -0
- package/dist/documents/documents-writes.js.map +7 -0
- package/dist/documents/format-elapsed.js +10 -0
- package/dist/documents/format-elapsed.js.map +7 -0
- package/dist/documents/has-video-track.js +26 -0
- package/dist/documents/has-video-track.js.map +7 -0
- package/dist/documents/index.js +266 -0
- package/dist/documents/index.js.map +7 -0
- package/dist/documents/media-error.js +18 -0
- package/dist/documents/media-error.js.map +7 -0
- package/dist/documents/offline-documents.js +160 -0
- package/dist/documents/offline-documents.js.map +7 -0
- package/dist/documents/pending-sync.js +210 -0
- package/dist/documents/pending-sync.js.map +7 -0
- package/dist/documents/processing-live.js +122 -0
- package/dist/documents/processing-live.js.map +7 -0
- package/dist/documents/processing-order.js +59 -0
- package/dist/documents/processing-order.js.map +7 -0
- package/dist/documents/processing-settle.js +21 -0
- package/dist/documents/processing-settle.js.map +7 -0
- package/dist/documents/related-documents.js +133 -0
- package/dist/documents/related-documents.js.map +7 -0
- package/dist/documents/support.js +29 -0
- package/dist/documents/support.js.map +7 -0
- package/dist/documents/upload-files.js +169 -0
- package/dist/documents/upload-files.js.map +7 -0
- package/dist/documents/useAudioRecorder.js +315 -0
- package/dist/documents/useAudioRecorder.js.map +7 -0
- package/dist/documents/useCameraStream.js +35 -0
- package/dist/documents/useCameraStream.js.map +7 -0
- package/dist/documents/useDocumentThumbnails.js +71 -0
- package/dist/documents/useDocumentThumbnails.js.map +7 -0
- package/dist/documents/useDownloadDocuments.js +90 -0
- package/dist/documents/useDownloadDocuments.js.map +7 -0
- package/dist/documents/usePassageQuotes.js +37 -0
- package/dist/documents/usePassageQuotes.js.map +7 -0
- package/dist/documents/useUploadFiles.js +165 -0
- package/dist/documents/useUploadFiles.js.map +7 -0
- package/dist/documents/useUploadFromUrls.js +63 -0
- package/dist/documents/useUploadFromUrls.js.map +7 -0
- package/dist/documents/useVideoRecorder.js +62 -0
- package/dist/documents/useVideoRecorder.js.map +7 -0
- package/dist/entities/AgentMarkers.js +61 -0
- package/dist/entities/AgentMarkers.js.map +7 -0
- package/dist/entities/DocumentEntity.js +125 -0
- package/dist/entities/DocumentEntity.js.map +7 -0
- package/dist/entities/EntityPill.js +250 -0
- package/dist/entities/EntityPill.js.map +7 -0
- package/dist/entities/ProjectEntity.js +61 -0
- package/dist/entities/ProjectEntity.js.map +7 -0
- package/dist/entities/ShieldIcon.js +49 -0
- package/dist/entities/ShieldIcon.js.map +7 -0
- package/dist/entities/TagEntity.js +79 -0
- package/dist/entities/TagEntity.js.map +7 -0
- package/dist/entities/ThreadVisibilityIcon.js +15 -0
- package/dist/entities/ThreadVisibilityIcon.js.map +7 -0
- package/dist/entities/UserEntity.js +211 -0
- package/dist/entities/UserEntity.js.map +7 -0
- package/dist/entities/VerifiedBadge.js +19 -0
- package/dist/entities/VerifiedBadge.js.map +7 -0
- package/dist/entities/agent-avatar-colors.js +26 -0
- package/dist/entities/agent-avatar-colors.js.map +7 -0
- package/dist/entities/colors.js +64 -0
- package/dist/entities/colors.js.map +7 -0
- package/dist/entities/file-type.js +151 -0
- package/dist/entities/file-type.js.map +7 -0
- package/dist/entities/index.js +100 -0
- package/dist/entities/index.js.map +7 -0
- package/dist/entities/media-type.js +61 -0
- package/dist/entities/media-type.js.map +7 -0
- package/dist/entities/registry.js +385 -0
- package/dist/entities/registry.js.map +7 -0
- package/dist/entities/status.js +43 -0
- package/dist/entities/status.js.map +7 -0
- package/dist/entities/tag-kinds.js +23 -0
- package/dist/entities/tag-kinds.js.map +7 -0
- package/dist/entities/tag-types.js +44 -0
- package/dist/entities/tag-types.js.map +7 -0
- package/dist/entities/vocabulary.js +12 -0
- package/dist/entities/vocabulary.js.map +7 -0
- package/dist/entity-extraction.js +25 -0
- package/dist/entity-extraction.js.map +7 -0
- package/dist/facts-search.js +57 -0
- package/dist/facts-search.js.map +7 -0
- package/dist/facts.js +69 -0
- package/dist/facts.js.map +7 -0
- package/dist/hooks.js +320 -0
- package/dist/hooks.js.map +7 -0
- package/dist/host/ArbiHost.js +24 -0
- package/dist/host/ArbiHost.js.map +7 -0
- package/dist/host/assistant-copy.js +54 -0
- package/dist/host/assistant-copy.js.map +7 -0
- package/dist/host/config.js +9 -0
- package/dist/host/config.js.map +7 -0
- package/dist/host/context.js +10 -0
- package/dist/host/context.js.map +7 -0
- package/dist/host/features.js +144 -0
- package/dist/host/features.js.map +7 -0
- package/dist/host/index.js +12 -0
- package/dist/host/index.js.map +7 -0
- package/dist/{chunk-DPYBZDJB.js → host/merge.js} +7 -7
- package/dist/host/merge.js.map +7 -0
- package/dist/house-template.js +40 -0
- package/dist/house-template.js.map +7 -0
- package/dist/icons/AppleIcon.js +25 -0
- package/dist/icons/AppleIcon.js.map +7 -0
- package/dist/icons/ArbiBotHeadIcon.js +46 -0
- package/dist/icons/ArbiBotHeadIcon.js.map +7 -0
- package/dist/icons/ArbiIcon.js +24 -0
- package/dist/icons/ArbiIcon.js.map +7 -0
- package/dist/icons/AudIcon.js +56 -0
- package/dist/icons/AudIcon.js.map +7 -0
- package/dist/icons/ClaudeIcon.js +28 -0
- package/dist/icons/ClaudeIcon.js.map +7 -0
- package/dist/icons/DocIcon.js +56 -0
- package/dist/icons/DocIcon.js.map +7 -0
- package/dist/icons/EmlIcon.js +57 -0
- package/dist/icons/EmlIcon.js.map +7 -0
- package/dist/icons/FireworksIcon.js +47 -0
- package/dist/icons/FireworksIcon.js.map +7 -0
- package/dist/icons/GeminiIcon.js +37 -0
- package/dist/icons/GeminiIcon.js.map +7 -0
- package/dist/icons/GitHubIcon.js +32 -0
- package/dist/icons/GitHubIcon.js.map +7 -0
- package/dist/icons/GoogleIcon.js +53 -0
- package/dist/icons/GoogleIcon.js.map +7 -0
- package/dist/icons/HtmlIcon.js +56 -0
- package/dist/icons/HtmlIcon.js.map +7 -0
- package/dist/icons/ImgIcon.js +56 -0
- package/dist/icons/ImgIcon.js.map +7 -0
- package/dist/icons/LinkedInIcon.js +25 -0
- package/dist/icons/LinkedInIcon.js.map +7 -0
- package/dist/icons/OpenAIIcon.js +28 -0
- package/dist/icons/OpenAIIcon.js.map +7 -0
- package/dist/icons/PdfIcon.js +56 -0
- package/dist/icons/PdfIcon.js.map +7 -0
- package/dist/icons/ProviderIcon.js +42 -0
- package/dist/icons/ProviderIcon.js.map +7 -0
- package/dist/icons/TxtIcon.js +56 -0
- package/dist/icons/TxtIcon.js.map +7 -0
- package/dist/icons/VidIcon.js +56 -0
- package/dist/icons/VidIcon.js.map +7 -0
- package/dist/icons/XlsIcon.js +56 -0
- package/dist/icons/XlsIcon.js.map +7 -0
- package/dist/icons/arbi-mark.js +5 -0
- package/dist/icons/arbi-mark.js.map +7 -0
- package/dist/icons/colors.js +31 -0
- package/dist/icons/colors.js.map +7 -0
- package/dist/icons/file-type.js +105 -0
- package/dist/icons/file-type.js.map +7 -0
- package/dist/icons/index.js +55 -0
- package/dist/icons/index.js.map +7 -0
- package/dist/imagecrop/ImageCropModal.js +56 -0
- package/dist/imagecrop/ImageCropModal.js.map +7 -0
- package/dist/imagecrop/ImageCropper.js +100 -0
- package/dist/imagecrop/ImageCropper.js.map +7 -0
- package/dist/imagecrop/cropImage.js +43 -0
- package/dist/imagecrop/cropImage.js.map +7 -0
- package/dist/imagecrop/index.js +13 -0
- package/dist/imagecrop/index.js.map +7 -0
- package/dist/index.cjs +282 -282
- package/dist/index.js +702 -17116
- package/dist/index.js.map +7 -1
- package/dist/{chunk-SSXFVWCT.js → lazy-chunk.js} +8 -8
- package/dist/lazy-chunk.js.map +7 -0
- package/dist/lib/collision-padding.js +13 -0
- package/dist/lib/collision-padding.js.map +7 -0
- package/dist/lib/format-friendly-date.js +55 -0
- package/dist/lib/format-friendly-date.js.map +7 -0
- package/dist/lib/format-relative-time.js +52 -0
- package/dist/lib/format-relative-time.js.map +7 -0
- package/dist/lib/markdown-to-text.js +35 -0
- package/dist/lib/markdown-to-text.js.map +7 -0
- package/dist/lib/toast-interaction.js +9 -0
- package/dist/lib/toast-interaction.js.map +7 -0
- package/dist/lib/utils.js +9 -0
- package/dist/lib/utils.js.map +7 -0
- package/dist/mail/client.js +103 -0
- package/dist/mail/client.js.map +7 -0
- package/dist/mail/document-attachment.js +38 -0
- package/dist/mail/document-attachment.js.map +7 -0
- package/dist/mail/filing.js +132 -0
- package/dist/mail/filing.js.map +7 -0
- package/dist/mail/hooks.js +393 -0
- package/dist/mail/hooks.js.map +7 -0
- package/dist/mail/index.js +120 -0
- package/dist/mail/index.js.map +7 -0
- package/dist/mail/offline/changes.js +258 -0
- package/dist/mail/offline/changes.js.map +7 -0
- package/dist/mail/offline/confirm-sign-out.js +37 -0
- package/dist/mail/offline/confirm-sign-out.js.map +7 -0
- package/dist/mail/offline/crypto.js +26 -0
- package/dist/mail/offline/crypto.js.map +7 -0
- package/dist/mail/offline/drafts.js +69 -0
- package/dist/mail/offline/drafts.js.map +7 -0
- package/dist/mail/offline/hooks.js +104 -0
- package/dist/mail/offline/hooks.js.map +7 -0
- package/dist/mail/offline/index.js +48 -0
- package/dist/mail/offline/index.js.map +7 -0
- package/dist/mail/offline/live.js +233 -0
- package/dist/mail/offline/live.js.map +7 -0
- package/dist/mail/offline/mailbox.js +191 -0
- package/dist/mail/offline/mailbox.js.map +7 -0
- package/dist/mail/offline/outbox.js +167 -0
- package/dist/mail/offline/outbox.js.map +7 -0
- package/dist/mail/offline/reads.js +159 -0
- package/dist/mail/offline/reads.js.map +7 -0
- package/dist/mail/offline/runtime.js +100 -0
- package/dist/mail/offline/runtime.js.map +7 -0
- package/dist/mail/offline/settings.js +84 -0
- package/dist/mail/offline/settings.js.map +7 -0
- package/dist/mail/offline/store.js +29 -0
- package/dist/mail/offline/store.js.map +7 -0
- package/dist/mail/offline/sync.js +251 -0
- package/dist/mail/offline/sync.js.map +7 -0
- package/dist/mail/offline/wipe.js +19 -0
- package/dist/mail/offline/wipe.js.map +7 -0
- package/dist/mail/thread-keys.js +53 -0
- package/dist/mail/thread-keys.js.map +7 -0
- package/dist/mail/threads.js +71 -0
- package/dist/mail/threads.js.map +7 -0
- package/dist/mail/useMailClient.js +42 -0
- package/dist/mail/useMailClient.js.map +7 -0
- package/dist/model-connections.js +58 -0
- package/dist/model-connections.js.map +7 -0
- package/dist/notifications/ActivityFeed.js +70 -0
- package/dist/notifications/ActivityFeed.js.map +7 -0
- package/dist/notifications/NotificationBell.js +200 -0
- package/dist/notifications/NotificationBell.js.map +7 -0
- package/dist/notifications/Toaster.js +24 -0
- package/dist/notifications/Toaster.js.map +7 -0
- package/dist/notifications/activity-types.js +65 -0
- package/dist/notifications/activity-types.js.map +7 -0
- package/dist/notifications/bell.js +24 -0
- package/dist/notifications/bell.js.map +7 -0
- package/dist/notifications/calendar-notifications.js +79 -0
- package/dist/notifications/calendar-notifications.js.map +7 -0
- package/dist/notifications/index.js +108 -0
- package/dist/notifications/index.js.map +7 -0
- package/dist/notifications/live.js +28 -0
- package/dist/notifications/live.js.map +7 -0
- package/dist/notifications/notification-types.js +127 -0
- package/dist/notifications/notification-types.js.map +7 -0
- package/dist/{chunk-BF5KW5ZI.js → notifications/notify-store.js} +24 -74
- package/dist/notifications/notify-store.js.map +7 -0
- package/dist/notifications/server-notifications.js +452 -0
- package/dist/notifications/server-notifications.js.map +7 -0
- package/dist/notifications/useNotifications.js +34 -0
- package/dist/notifications/useNotifications.js.map +7 -0
- package/dist/offline-store/network.js +11 -0
- package/dist/offline-store/network.js.map +7 -0
- package/dist/offline-store/store.js +136 -0
- package/dist/offline-store/store.js.map +7 -0
- package/dist/offline-store/wipe.js +8 -0
- package/dist/offline-store/wipe.js.map +7 -0
- package/dist/offline.js +58 -0
- package/dist/offline.js.map +7 -0
- package/dist/people.js +122 -0
- package/dist/people.js.map +7 -0
- package/dist/projects.js +30 -0
- package/dist/projects.js.map +7 -0
- package/dist/query-client.js +63 -0
- package/dist/query-client.js.map +7 -0
- package/dist/{chunk-ZM6N7YZH.js → query-keys.js} +18 -31
- package/dist/query-keys.js.map +7 -0
- package/dist/query-persist.js +66 -0
- package/dist/query-persist.js.map +7 -0
- package/dist/queued-writes.js +59 -0
- package/dist/queued-writes.js.map +7 -0
- package/dist/remote-control.js +67 -0
- package/dist/remote-control.js.map +7 -0
- package/dist/search/index.js +23 -0
- package/dist/search/index.js.map +7 -0
- package/dist/search/session.js +58 -0
- package/dist/search/session.js.map +7 -0
- package/dist/search/useSemanticSearch.js +82 -0
- package/dist/search/useSemanticSearch.js.map +7 -0
- package/dist/session/chat.js +512 -0
- package/dist/session/chat.js.map +7 -0
- package/dist/session/documents.js +196 -0
- package/dist/session/documents.js.map +7 -0
- package/dist/session/drafts.js +103 -0
- package/dist/session/drafts.js.map +7 -0
- package/dist/session/index.js +123 -0
- package/dist/session/index.js.map +7 -0
- package/dist/session/layout.js +339 -0
- package/dist/session/layout.js.map +7 -0
- package/dist/session/persist.js +106 -0
- package/dist/session/persist.js.map +7 -0
- package/dist/session/session-hooks.js +53 -0
- package/dist/session/session-hooks.js.map +7 -0
- package/dist/session/signed-in.js +36 -0
- package/dist/session/signed-in.js.map +7 -0
- package/dist/session/store.js +166 -0
- package/dist/session/store.js.map +7 -0
- package/dist/session/thread-tabs.js +121 -0
- package/dist/session/thread-tabs.js.map +7 -0
- package/dist/session/ui-state-storage.js +76 -0
- package/dist/session/ui-state-storage.js.map +7 -0
- package/dist/session/workspace.js +77 -0
- package/dist/session/workspace.js.map +7 -0
- package/dist/shell/index.cjs +37 -37
- package/dist/shell/index.js +43 -10
- package/dist/shell/index.js.map +7 -1
- package/dist/skill-pack.js +111 -0
- package/dist/skill-pack.js.map +7 -0
- package/dist/storage.js +186 -0
- package/dist/storage.js.map +7 -0
- package/dist/support/index.js +35 -0
- package/dist/support/index.js.map +7 -0
- package/dist/tags.js +204 -0
- package/dist/tags.js.map +7 -0
- package/dist/ui/DebouncedInput.js +109 -0
- package/dist/ui/DebouncedInput.js.map +7 -0
- package/dist/ui/DictateContext.js +8 -0
- package/dist/ui/DictateContext.js.map +7 -0
- package/dist/ui/IconToggle.js +79 -0
- package/dist/ui/IconToggle.js.map +7 -0
- package/dist/ui/VerifiedToggle.js +38 -0
- package/dist/ui/VerifiedToggle.js.map +7 -0
- package/dist/ui/VisibilityToggle.js +103 -0
- package/dist/ui/VisibilityToggle.js.map +7 -0
- package/dist/ui/avatar.js +40 -0
- package/dist/ui/avatar.js.map +7 -0
- package/dist/ui/badge.js +28 -0
- package/dist/ui/badge.js.map +7 -0
- package/dist/ui/button.js +48 -0
- package/dist/ui/button.js.map +7 -0
- package/dist/ui/card.js +90 -0
- package/dist/ui/card.js.map +7 -0
- package/dist/ui/checkbox.js +22 -0
- package/dist/ui/checkbox.js.map +7 -0
- package/dist/ui/collapsible.js +10 -0
- package/dist/ui/collapsible.js.map +7 -0
- package/dist/ui/command.js +103 -0
- package/dist/ui/command.js.map +7 -0
- package/dist/{chunk-YNNAJJ5Z.js → ui/dialog.js} +30 -68
- package/dist/ui/dialog.js.map +7 -0
- package/dist/{chunk-47CCGUWR.js → ui/dropdown-menu.js} +40 -45
- package/dist/ui/dropdown-menu.js.map +7 -0
- package/dist/ui/hover-card.js +36 -0
- package/dist/ui/hover-card.js.map +7 -0
- package/dist/ui/index.cjs +154 -154
- package/dist/ui/index.js +290 -10
- package/dist/ui/index.js.map +7 -1
- package/dist/ui/input.js +65 -0
- package/dist/ui/input.js.map +7 -0
- package/dist/ui/label.js +16 -0
- package/dist/ui/label.js.map +7 -0
- package/dist/ui/mark-menu.js +300 -0
- package/dist/ui/mark-menu.js.map +7 -0
- package/dist/ui/popover.js +40 -0
- package/dist/ui/popover.js.map +7 -0
- package/dist/ui/portal-container.js +17 -0
- package/dist/ui/portal-container.js.map +7 -0
- package/dist/ui/progress.js +24 -0
- package/dist/ui/progress.js.map +7 -0
- package/dist/ui/radio-group.js +29 -0
- package/dist/ui/radio-group.js.map +7 -0
- package/dist/ui/scroll-area.js +39 -0
- package/dist/ui/scroll-area.js.map +7 -0
- package/dist/ui/select.js +130 -0
- package/dist/ui/select.js.map +7 -0
- package/dist/ui/separator.js +23 -0
- package/dist/ui/separator.js.map +7 -0
- package/dist/ui/slider.js +23 -0
- package/dist/ui/slider.js.map +7 -0
- package/dist/ui/switch.js +28 -0
- package/dist/ui/switch.js.map +7 -0
- package/dist/ui/table.js +75 -0
- package/dist/ui/table.js.map +7 -0
- package/dist/ui/tabs.js +48 -0
- package/dist/ui/tabs.js.map +7 -0
- package/dist/ui/textarea.js +63 -0
- package/dist/ui/textarea.js.map +7 -0
- package/dist/ui/toggle-group.js +43 -0
- package/dist/ui/toggle-group.js.map +7 -0
- package/dist/ui/toggle.js +40 -0
- package/dist/ui/toggle.js.map +7 -0
- package/dist/ui/tooltip.js +215 -0
- package/dist/ui/tooltip.js.map +7 -0
- package/dist/usage-metered.js +8 -0
- package/dist/usage-metered.js.map +7 -0
- package/dist/useArbi.js +16 -0
- package/dist/useArbi.js.map +7 -0
- package/dist/useInstallSkillPack.js +81 -0
- package/dist/useInstallSkillPack.js.map +7 -0
- package/dist/usermenu/UserMenu.js +188 -0
- package/dist/usermenu/UserMenu.js.map +7 -0
- package/dist/usermenu/index.js +5 -0
- package/dist/usermenu/index.js.map +7 -0
- package/dist/users/index.js +15 -0
- package/dist/users/index.js.map +7 -0
- package/dist/users/user-display.js +60 -0
- package/dist/users/user-display.js.map +7 -0
- package/dist/viewers/AudioViewer.js +23 -0
- package/dist/viewers/AudioViewer.js.map +7 -0
- package/dist/viewers/DocxViewer.js +81 -0
- package/dist/viewers/DocxViewer.js.map +7 -0
- package/dist/viewers/ImageViewer.js +31 -0
- package/dist/viewers/ImageViewer.js.map +7 -0
- package/dist/viewers/PdfViewer.js +19 -3
- package/dist/viewers/PdfViewer.js.map +7 -1
- package/dist/{PdfViewerImpl-TEBYF2QI.js → viewers/PdfViewerImpl.js} +25 -19
- package/dist/viewers/PdfViewerImpl.js.map +7 -0
- package/dist/viewers/VideoViewer.js +31 -0
- package/dist/viewers/VideoViewer.js.map +7 -0
- package/dist/viewers/XlsxViewer.js +102 -0
- package/dist/viewers/XlsxViewer.js.map +7 -0
- package/dist/viewers/index.js +61 -271
- package/dist/viewers/index.js.map +7 -1
- package/dist/viewers/page-scroll.js +59 -0
- package/dist/viewers/page-scroll.js.map +7 -0
- package/dist/viewers/pdf-viewer-constants.js +9 -0
- package/dist/viewers/pdf-viewer-constants.js.map +7 -0
- package/dist/{chunk-PTOP7OHG.js → viewers/pdfjs-polyfills.js} +5 -6
- package/dist/viewers/pdfjs-polyfills.js.map +7 -0
- package/dist/viewers/selection-runs.js +38 -0
- package/dist/viewers/selection-runs.js.map +7 -0
- package/dist/viewers/usePageIntersectionObserver.js +68 -0
- package/dist/viewers/usePageIntersectionObserver.js.map +7 -0
- package/dist/viewers/useProcessedChunks.js +58 -0
- package/dist/viewers/useProcessedChunks.js.map +7 -0
- package/dist/viewers/viewer-zoom.js +163 -0
- package/dist/viewers/viewer-zoom.js.map +7 -0
- package/dist/websocket/ArbiWebSocketProvider.js +207 -0
- package/dist/websocket/ArbiWebSocketProvider.js.map +7 -0
- package/dist/websocket/context.js +14 -0
- package/dist/websocket/context.js.map +7 -0
- package/dist/websocket/hooks.js +30 -0
- package/dist/websocket/hooks.js.map +7 -0
- package/dist/websocket/index.js +22 -0
- package/dist/websocket/index.js.map +7 -0
- package/dist/websocket/live-updates.js +38 -0
- package/dist/websocket/live-updates.js.map +7 -0
- package/dist/websocket/reconnect.js +13 -0
- package/dist/websocket/reconnect.js.map +7 -0
- package/dist/websocket/store.js +58 -0
- package/dist/websocket/store.js.map +7 -0
- package/dist/workforce.js +607 -0
- package/dist/workforce.js.map +7 -0
- package/dist/workspaces/access-request.js +35 -0
- package/dist/workspaces/access-request.js.map +7 -0
- package/dist/workspaces/archive.js +59 -0
- package/dist/workspaces/archive.js.map +7 -0
- package/dist/workspaces/current.js +20 -0
- package/dist/workspaces/current.js.map +7 -0
- package/dist/workspaces/delete-workspaces.js +15 -0
- package/dist/workspaces/delete-workspaces.js.map +7 -0
- package/dist/workspaces/export-archive.js +40 -0
- package/dist/workspaces/export-archive.js.map +7 -0
- package/dist/workspaces/index.js +99 -0
- package/dist/workspaces/index.js.map +7 -0
- package/dist/workspaces/settings.js +45 -0
- package/dist/workspaces/settings.js.map +7 -0
- package/dist/workspaces/shell-workspaces.js +49 -0
- package/dist/workspaces/shell-workspaces.js.map +7 -0
- package/dist/workspaces/switch.js +234 -0
- package/dist/workspaces/switch.js.map +7 -0
- package/dist/workspaces/transfer.js +170 -0
- package/dist/workspaces/transfer.js.map +7 -0
- package/dist/workspaces/useShellWorkspaces.js +86 -0
- package/dist/workspaces/useShellWorkspaces.js.map +7 -0
- package/dist/workspaces/workspace-users.js +65 -0
- package/dist/workspaces/workspace-users.js.map +7 -0
- package/package.json +4 -4
- package/dist/PdfViewerImpl-TEBYF2QI.js.map +0 -1
- package/dist/PdfViewerImpl.d-B28hLEuj.d.cts +0 -62
- package/dist/ProductionDialog.d-CpzslFn0.d.cts +0 -51
- package/dist/annotations/freeze/index.d.cts +0 -205
- package/dist/annotations/index.d.cts +0 -360
- package/dist/artifacts/index.d.cts +0 -476
- package/dist/artifacts/redline-core.d.cts +0 -39
- package/dist/bundle-YNOX7VIL.js +0 -5
- package/dist/bundle-YNOX7VIL.js.map +0 -1
- package/dist/bundle.d-BnCSbHy2.d.cts +0 -85
- package/dist/calls/livekit/index.d.cts +0 -280
- package/dist/chunk-47CCGUWR.js.map +0 -1
- package/dist/chunk-4FL3X3LA.js +0 -2057
- package/dist/chunk-4FL3X3LA.js.map +0 -1
- package/dist/chunk-6QNBSXCE.js +0 -271
- package/dist/chunk-6QNBSXCE.js.map +0 -1
- package/dist/chunk-74N436VK.js.map +0 -1
- package/dist/chunk-APZZQZ6P.js +0 -147
- package/dist/chunk-APZZQZ6P.js.map +0 -1
- package/dist/chunk-BF5KW5ZI.js.map +0 -1
- package/dist/chunk-DPYBZDJB.js.map +0 -1
- package/dist/chunk-DZKRL5H3.js +0 -2766
- package/dist/chunk-DZKRL5H3.js.map +0 -1
- package/dist/chunk-HDCRPPBW.js +0 -75
- package/dist/chunk-HDCRPPBW.js.map +0 -1
- package/dist/chunk-L2IPPTVC.js +0 -20
- package/dist/chunk-L2IPPTVC.js.map +0 -1
- package/dist/chunk-LSU4UPS5.js +0 -1011
- package/dist/chunk-LSU4UPS5.js.map +0 -1
- package/dist/chunk-NIKPG4PW.js +0 -1128
- package/dist/chunk-NIKPG4PW.js.map +0 -1
- package/dist/chunk-NNAJLY6B.js +0 -4974
- package/dist/chunk-NNAJLY6B.js.map +0 -1
- package/dist/chunk-OYPKKHXY.js +0 -559
- package/dist/chunk-OYPKKHXY.js.map +0 -1
- package/dist/chunk-PTOP7OHG.js.map +0 -1
- package/dist/chunk-QMY2JKBI.js +0 -246
- package/dist/chunk-QMY2JKBI.js.map +0 -1
- package/dist/chunk-SN5YV6FF.js +0 -11
- package/dist/chunk-SN5YV6FF.js.map +0 -1
- package/dist/chunk-SSXFVWCT.js.map +0 -1
- package/dist/chunk-T3USOSVN.js.map +0 -1
- package/dist/chunk-T4CLW3DN.js +0 -2560
- package/dist/chunk-T4CLW3DN.js.map +0 -1
- package/dist/chunk-UW2SGTI5.js.map +0 -1
- package/dist/chunk-VSCU7K4V.js.map +0 -1
- package/dist/chunk-WL2Y2T47.js.map +0 -1
- package/dist/chunk-WUTL62MC.js.map +0 -1
- package/dist/chunk-XWPLOFDN.js +0 -644
- package/dist/chunk-XWPLOFDN.js.map +0 -1
- package/dist/chunk-Y3MTRA7D.js +0 -97
- package/dist/chunk-Y3MTRA7D.js.map +0 -1
- package/dist/chunk-YNNAJJ5Z.js.map +0 -1
- package/dist/chunk-ZM6N7YZH.js.map +0 -1
- package/dist/document-tools/core.d.cts +0 -883
- package/dist/document-tools/index.d.cts +0 -90
- package/dist/index.d-LArLnpI8.d.cts +0 -2036
- package/dist/index.d-oR5FKZpJ.d.cts +0 -579
- package/dist/index.d.cts +0 -15923
- package/dist/lazy-chunk.d-B6YDLMKI.d.cts +0 -31
- package/dist/model.d-CNtRWKVK.d.cts +0 -110
- package/dist/query-keys.d-B1Am9tIF.d.cts +0 -337
- package/dist/shell/index.d.cts +0 -6
- package/dist/store.d-GADDvC7w.d.cts +0 -35
- package/dist/stored-markdown.d-Bp18vrbr.d.cts +0 -125
- package/dist/ui/index.d.cts +0 -26
- package/dist/useAudioRecorder.d-B9rlMI_E.d.cts +0 -778
- package/dist/viewers/PdfViewer.d.cts +0 -9
- package/dist/viewers/index.d.cts +0 -262
|
@@ -0,0 +1,58 @@
|
|
|
1
|
+
import { useMutation, useQuery, useQueryClient } from "@tanstack/react-query";
|
|
2
|
+
import { useArbi } from "./useArbi.js";
|
|
3
|
+
import { useArbiSession } from "./session/signed-in.js";
|
|
4
|
+
import { arbiQueryKeys } from "./query-keys.js";
|
|
5
|
+
function useModelConnections() {
|
|
6
|
+
const arbi = useArbi();
|
|
7
|
+
const userId = useArbiSession().user?.external_id ?? void 0;
|
|
8
|
+
return useQuery({
|
|
9
|
+
queryKey: arbiQueryKeys.modelConnections(userId),
|
|
10
|
+
queryFn: () => arbi.modelConnections.list(),
|
|
11
|
+
enabled: arbi.isLoggedIn
|
|
12
|
+
});
|
|
13
|
+
}
|
|
14
|
+
function useDirectModelUsage() {
|
|
15
|
+
const arbi = useArbi();
|
|
16
|
+
const userId = useArbiSession().user?.external_id ?? void 0;
|
|
17
|
+
return useQuery({
|
|
18
|
+
queryKey: arbiQueryKeys.directModelUsage(userId),
|
|
19
|
+
queryFn: () => arbi.modelConnections.usage(),
|
|
20
|
+
enabled: arbi.isLoggedIn
|
|
21
|
+
});
|
|
22
|
+
}
|
|
23
|
+
function useRefreshModelConnections() {
|
|
24
|
+
const qc = useQueryClient();
|
|
25
|
+
const userId = useArbiSession().user?.external_id ?? void 0;
|
|
26
|
+
return async () => {
|
|
27
|
+
await qc.invalidateQueries({ queryKey: arbiQueryKeys.modelConnections(userId) });
|
|
28
|
+
await qc.invalidateQueries({ queryKey: arbiQueryKeys.availableModels() });
|
|
29
|
+
};
|
|
30
|
+
}
|
|
31
|
+
function useSaveModelConnection() {
|
|
32
|
+
const arbi = useArbi();
|
|
33
|
+
const refresh = useRefreshModelConnections();
|
|
34
|
+
return useMutation({
|
|
35
|
+
mutationFn: (input) => arbi.modelConnections.save(input),
|
|
36
|
+
onSuccess: refresh
|
|
37
|
+
});
|
|
38
|
+
}
|
|
39
|
+
function useRemoveModelConnection() {
|
|
40
|
+
const arbi = useArbi();
|
|
41
|
+
const refresh = useRefreshModelConnections();
|
|
42
|
+
return useMutation({
|
|
43
|
+
mutationFn: (id) => arbi.modelConnections.remove(id),
|
|
44
|
+
onSuccess: refresh
|
|
45
|
+
});
|
|
46
|
+
}
|
|
47
|
+
function useUnlockModelConnections() {
|
|
48
|
+
const arbi = useArbi();
|
|
49
|
+
return useMutation({ mutationFn: () => arbi.modelConnections.unlock() });
|
|
50
|
+
}
|
|
51
|
+
export {
|
|
52
|
+
useDirectModelUsage,
|
|
53
|
+
useModelConnections,
|
|
54
|
+
useRemoveModelConnection,
|
|
55
|
+
useSaveModelConnection,
|
|
56
|
+
useUnlockModelConnections
|
|
57
|
+
};
|
|
58
|
+
//# sourceMappingURL=model-connections.js.map
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../src/model-connections.ts"],
|
|
4
|
+
"sourcesContent": ["/**\n * Model connections over the SDK (`arbi.modelConnections`): the main agent's OpenAI-compatible\n * endpoints (the box's and the user's own), the user's direct model usage, and the unlock that lets\n * this session use the personal keys. Keyed per user; a save or a removal also refreshes the\n * available models (a connection's models join the picker).\n */\n\nimport { useMutation, useQuery, useQueryClient } from '@tanstack/react-query'\nimport type { PersonalConnectionInput } from '@arbidocs/sdk/browser'\nimport { useArbi } from './useArbi'\nimport { useArbiSession } from './session/signed-in'\nimport { arbiQueryKeys } from './query-keys'\n\n/** The box's model connections and the user's own. */\nexport function useModelConnections() {\n const arbi = useArbi()\n const userId = useArbiSession().user?.external_id ?? undefined\n return useQuery({\n queryKey: arbiQueryKeys.modelConnections(userId),\n queryFn: () => arbi.modelConnections.list(),\n enabled: arbi.isLoggedIn,\n })\n}\n\n/** The user's direct model calls of the last 30 days (billed by their provider). */\nexport function useDirectModelUsage() {\n const arbi = useArbi()\n const userId = useArbiSession().user?.external_id ?? undefined\n return useQuery({\n queryKey: arbiQueryKeys.directModelUsage(userId),\n queryFn: () => arbi.modelConnections.usage(),\n enabled: arbi.isLoggedIn,\n })\n}\n\n/** After a write: the connections and the models the picker offers are read again. */\nfunction useRefreshModelConnections() {\n const qc = useQueryClient()\n const userId = useArbiSession().user?.external_id ?? undefined\n return async () => {\n await qc.invalidateQueries({ queryKey: arbiQueryKeys.modelConnections(userId) })\n await qc.invalidateQueries({ queryKey: arbiQueryKeys.availableModels() })\n }\n}\n\n/** Add a personal connection, or replace `id`'s; its key is sealed and unlocked on this session. */\nexport function useSaveModelConnection() {\n const arbi = useArbi()\n const refresh = useRefreshModelConnections()\n return useMutation({\n mutationFn: (input: PersonalConnectionInput) => arbi.modelConnections.save(input),\n onSuccess: refresh,\n })\n}\n\nexport function useRemoveModelConnection() {\n const arbi = useArbi()\n const refresh = useRefreshModelConnections()\n return useMutation({\n mutationFn: (id: string) => arbi.modelConnections.remove(id),\n onSuccess: refresh,\n })\n}\n\n/** Let this session use the user's enabled personal keys. */\nexport function useUnlockModelConnections() {\n const arbi = useArbi()\n return useMutation({ mutationFn: () => arbi.modelConnections.unlock() })\n}\n"],
|
|
5
|
+
"mappings": "AAOA,SAAS,aAAa,UAAU,sBAAsB;AAEtD,SAAS,eAAe;AACxB,SAAS,sBAAsB;AAC/B,SAAS,qBAAqB;AAGvB,SAAS,sBAAsB;AACpC,QAAM,OAAO,QAAQ;AACrB,QAAM,SAAS,eAAe,EAAE,MAAM,eAAe;AACrD,SAAO,SAAS;AAAA,IACd,UAAU,cAAc,iBAAiB,MAAM;AAAA,IAC/C,SAAS,MAAM,KAAK,iBAAiB,KAAK;AAAA,IAC1C,SAAS,KAAK;AAAA,EAChB,CAAC;AACH;AAGO,SAAS,sBAAsB;AACpC,QAAM,OAAO,QAAQ;AACrB,QAAM,SAAS,eAAe,EAAE,MAAM,eAAe;AACrD,SAAO,SAAS;AAAA,IACd,UAAU,cAAc,iBAAiB,MAAM;AAAA,IAC/C,SAAS,MAAM,KAAK,iBAAiB,MAAM;AAAA,IAC3C,SAAS,KAAK;AAAA,EAChB,CAAC;AACH;AAGA,SAAS,6BAA6B;AACpC,QAAM,KAAK,eAAe;AAC1B,QAAM,SAAS,eAAe,EAAE,MAAM,eAAe;AACrD,SAAO,YAAY;AACjB,UAAM,GAAG,kBAAkB,EAAE,UAAU,cAAc,iBAAiB,MAAM,EAAE,CAAC;AAC/E,UAAM,GAAG,kBAAkB,EAAE,UAAU,cAAc,gBAAgB,EAAE,CAAC;AAAA,EAC1E;AACF;AAGO,SAAS,yBAAyB;AACvC,QAAM,OAAO,QAAQ;AACrB,QAAM,UAAU,2BAA2B;AAC3C,SAAO,YAAY;AAAA,IACjB,YAAY,CAAC,UAAmC,KAAK,iBAAiB,KAAK,KAAK;AAAA,IAChF,WAAW;AAAA,EACb,CAAC;AACH;AAEO,SAAS,2BAA2B;AACzC,QAAM,OAAO,QAAQ;AACrB,QAAM,UAAU,2BAA2B;AAC3C,SAAO,YAAY;AAAA,IACjB,YAAY,CAAC,OAAe,KAAK,iBAAiB,OAAO,EAAE;AAAA,IAC3D,WAAW;AAAA,EACb,CAAC;AACH;AAGO,SAAS,4BAA4B;AAC1C,QAAM,OAAO,QAAQ;AACrB,SAAO,YAAY,EAAE,YAAY,MAAM,KAAK,iBAAiB,OAAO,EAAE,CAAC;AACzE;",
|
|
6
|
+
"names": []
|
|
7
|
+
}
|
|
@@ -0,0 +1,70 @@
|
|
|
1
|
+
import { jsx, jsxs } from "react/jsx-runtime";
|
|
2
|
+
import { Activity } from "lucide-react";
|
|
3
|
+
import { useActivity } from "../hooks.js";
|
|
4
|
+
import { cn } from "../lib/utils.js";
|
|
5
|
+
import { describeActivity } from "./activity-types.js";
|
|
6
|
+
function formatRelative(iso) {
|
|
7
|
+
const then = new Date(iso).getTime();
|
|
8
|
+
if (Number.isNaN(then)) return "";
|
|
9
|
+
const secs = Math.round((Date.now() - then) / 1e3);
|
|
10
|
+
if (secs < 45) return "just now";
|
|
11
|
+
const mins = Math.round(secs / 60);
|
|
12
|
+
if (mins < 60) return `${mins}m`;
|
|
13
|
+
const hours = Math.round(mins / 60);
|
|
14
|
+
if (hours < 24) return `${hours}h`;
|
|
15
|
+
const days = Math.round(hours / 24);
|
|
16
|
+
if (days < 7) return `${days}d`;
|
|
17
|
+
return new Date(iso).toLocaleDateString();
|
|
18
|
+
}
|
|
19
|
+
function ActivityFeed({
|
|
20
|
+
limit = 20,
|
|
21
|
+
className,
|
|
22
|
+
emptyLabel = "No recent activity",
|
|
23
|
+
enabled,
|
|
24
|
+
"data-testid": testId = "activity-feed"
|
|
25
|
+
}) {
|
|
26
|
+
const { data, isLoading, isError } = useActivity({ limit, enabled });
|
|
27
|
+
if (isLoading) {
|
|
28
|
+
return /* @__PURE__ */ jsx("div", { className: cn("space-y-2", className), "data-testid": testId, "aria-busy": "true", children: Array.from({ length: 3 }).map((_, i) => /* @__PURE__ */ jsxs("div", { className: "flex items-center gap-3 py-1.5", children: [
|
|
29
|
+
/* @__PURE__ */ jsx("div", { className: "h-4 w-4 shrink-0 animate-pulse rounded-full bg-muted" }),
|
|
30
|
+
/* @__PURE__ */ jsx("div", { className: "h-3 flex-1 animate-pulse rounded bg-muted" })
|
|
31
|
+
] }, i)) });
|
|
32
|
+
}
|
|
33
|
+
if (isError) {
|
|
34
|
+
return /* @__PURE__ */ jsx("div", { className: cn("text-sm text-muted-foreground", className), "data-testid": testId, children: "Couldn\u2019t load activity." });
|
|
35
|
+
}
|
|
36
|
+
const items = data ?? [];
|
|
37
|
+
if (items.length === 0) {
|
|
38
|
+
return /* @__PURE__ */ jsxs(
|
|
39
|
+
"div",
|
|
40
|
+
{
|
|
41
|
+
className: cn("flex items-center gap-2 text-sm text-muted-foreground", className),
|
|
42
|
+
"data-testid": testId,
|
|
43
|
+
children: [
|
|
44
|
+
/* @__PURE__ */ jsx(Activity, { className: "h-4 w-4 shrink-0" }),
|
|
45
|
+
/* @__PURE__ */ jsx("span", { children: emptyLabel })
|
|
46
|
+
]
|
|
47
|
+
}
|
|
48
|
+
);
|
|
49
|
+
}
|
|
50
|
+
return /* @__PURE__ */ jsx("ul", { className: cn("divide-y divide-border", className), "data-testid": testId, children: items.map((item) => {
|
|
51
|
+
const desc = describeActivity(item.content);
|
|
52
|
+
return /* @__PURE__ */ jsxs(
|
|
53
|
+
"li",
|
|
54
|
+
{
|
|
55
|
+
className: "flex items-center gap-3 py-2",
|
|
56
|
+
"data-testid": "activity-feed-item",
|
|
57
|
+
children: [
|
|
58
|
+
/* @__PURE__ */ jsx(desc.Icon, { className: cn("h-4 w-4 shrink-0", desc.iconClassName) }),
|
|
59
|
+
/* @__PURE__ */ jsx("span", { className: "min-w-0 flex-1 truncate text-sm text-foreground", children: desc.title }),
|
|
60
|
+
/* @__PURE__ */ jsx("time", { className: "shrink-0 text-xs tabular-nums text-muted-foreground", children: formatRelative(item.created_at) })
|
|
61
|
+
]
|
|
62
|
+
},
|
|
63
|
+
item.external_id
|
|
64
|
+
);
|
|
65
|
+
}) });
|
|
66
|
+
}
|
|
67
|
+
export {
|
|
68
|
+
ActivityFeed
|
|
69
|
+
};
|
|
70
|
+
//# sourceMappingURL=ActivityFeed.js.map
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../../src/notifications/ActivityFeed.tsx"],
|
|
4
|
+
"sourcesContent": ["/**\n * ActivityFeed \u2014 a presentational, self-fetching list of the current user's\n * durable activity (the to-self \"you opened a workspace / processed a document\"\n * log). Renders each line via the shared {@link describeActivity} descriptor, so\n * the glyph/label knowledge stays in one place and any app (clarum's dashboard,\n * a monolith panel) can drop this in.\n *\n * Pure semantic Tailwind tokens; no store, no app `@/` imports. Data comes from\n * the shared {@link useActivity} query.\n */\n\nimport { Activity } from 'lucide-react'\nimport { useActivity } from '../hooks'\nimport { cn } from '../lib/utils'\nimport { describeActivity } from './activity-types'\n\n/** Relative time like \"just now\", \"3m\", \"2h\", \"5d\"; falls back to a date. */\nfunction formatRelative(iso: string): string {\n const then = new Date(iso).getTime()\n if (Number.isNaN(then)) return ''\n const secs = Math.round((Date.now() - then) / 1000)\n if (secs < 45) return 'just now'\n const mins = Math.round(secs / 60)\n if (mins < 60) return `${mins}m`\n const hours = Math.round(mins / 60)\n if (hours < 24) return `${hours}h`\n const days = Math.round(hours / 24)\n if (days < 7) return `${days}d`\n return new Date(iso).toLocaleDateString()\n}\n\nexport interface ActivityFeedProps {\n /** Max entries to fetch/show. Default 20. */\n limit?: number\n /** Extra classes for the outer container. */\n className?: string\n /** Message shown when there's no activity yet. */\n emptyLabel?: string\n /** Whether to fetch \u2014 defaults to enabled when logged in. */\n enabled?: boolean\n 'data-testid'?: string\n}\n\n/**\n * Renders the activity feed. Handles its own loading/empty/error states so a\n * consumer can place it directly (e.g. inside a dashboard card).\n */\nexport function ActivityFeed({\n limit = 20,\n className,\n emptyLabel = 'No recent activity',\n enabled,\n 'data-testid': testId = 'activity-feed',\n}: ActivityFeedProps) {\n const { data, isLoading, isError } = useActivity({ limit, enabled })\n\n if (isLoading) {\n return (\n <div className={cn('space-y-2', className)} data-testid={testId} aria-busy=\"true\">\n {Array.from({ length: 3 }).map((_, i) => (\n <div key={i} className=\"flex items-center gap-3 py-1.5\">\n <div className=\"h-4 w-4 shrink-0 animate-pulse rounded-full bg-muted\" />\n <div className=\"h-3 flex-1 animate-pulse rounded bg-muted\" />\n </div>\n ))}\n </div>\n )\n }\n\n if (isError) {\n return (\n <div className={cn('text-sm text-muted-foreground', className)} data-testid={testId}>\n Couldn\u2019t load activity.\n </div>\n )\n }\n\n const items = data ?? []\n if (items.length === 0) {\n return (\n <div\n className={cn('flex items-center gap-2 text-sm text-muted-foreground', className)}\n data-testid={testId}\n >\n <Activity className=\"h-4 w-4 shrink-0\" />\n <span>{emptyLabel}</span>\n </div>\n )\n }\n\n return (\n <ul className={cn('divide-y divide-border', className)} data-testid={testId}>\n {items.map((item) => {\n const desc = describeActivity(item.content)\n return (\n <li\n key={item.external_id}\n className=\"flex items-center gap-3 py-2\"\n data-testid=\"activity-feed-item\"\n >\n <desc.Icon className={cn('h-4 w-4 shrink-0', desc.iconClassName)} />\n <span className=\"min-w-0 flex-1 truncate text-sm text-foreground\">{desc.title}</span>\n <time className=\"shrink-0 text-xs tabular-nums text-muted-foreground\">\n {formatRelative(item.created_at)}\n </time>\n </li>\n )\n })}\n </ul>\n )\n}\n"],
|
|
5
|
+
"mappings": "AA4DU,SACE,KADF;AAjDV,SAAS,gBAAgB;AACzB,SAAS,mBAAmB;AAC5B,SAAS,UAAU;AACnB,SAAS,wBAAwB;AAGjC,SAAS,eAAe,KAAqB;AAC3C,QAAM,OAAO,IAAI,KAAK,GAAG,EAAE,QAAQ;AACnC,MAAI,OAAO,MAAM,IAAI,EAAG,QAAO;AAC/B,QAAM,OAAO,KAAK,OAAO,KAAK,IAAI,IAAI,QAAQ,GAAI;AAClD,MAAI,OAAO,GAAI,QAAO;AACtB,QAAM,OAAO,KAAK,MAAM,OAAO,EAAE;AACjC,MAAI,OAAO,GAAI,QAAO,GAAG,IAAI;AAC7B,QAAM,QAAQ,KAAK,MAAM,OAAO,EAAE;AAClC,MAAI,QAAQ,GAAI,QAAO,GAAG,KAAK;AAC/B,QAAM,OAAO,KAAK,MAAM,QAAQ,EAAE;AAClC,MAAI,OAAO,EAAG,QAAO,GAAG,IAAI;AAC5B,SAAO,IAAI,KAAK,GAAG,EAAE,mBAAmB;AAC1C;AAkBO,SAAS,aAAa;AAAA,EAC3B,QAAQ;AAAA,EACR;AAAA,EACA,aAAa;AAAA,EACb;AAAA,EACA,eAAe,SAAS;AAC1B,GAAsB;AACpB,QAAM,EAAE,MAAM,WAAW,QAAQ,IAAI,YAAY,EAAE,OAAO,QAAQ,CAAC;AAEnE,MAAI,WAAW;AACb,WACE,oBAAC,SAAI,WAAW,GAAG,aAAa,SAAS,GAAG,eAAa,QAAQ,aAAU,QACxE,gBAAM,KAAK,EAAE,QAAQ,EAAE,CAAC,EAAE,IAAI,CAAC,GAAG,MACjC,qBAAC,SAAY,WAAU,kCACrB;AAAA,0BAAC,SAAI,WAAU,wDAAuD;AAAA,MACtE,oBAAC,SAAI,WAAU,6CAA4C;AAAA,SAFnD,CAGV,CACD,GACH;AAAA,EAEJ;AAEA,MAAI,SAAS;AACX,WACE,oBAAC,SAAI,WAAW,GAAG,iCAAiC,SAAS,GAAG,eAAa,QAAQ,0CAErF;AAAA,EAEJ;AAEA,QAAM,QAAQ,QAAQ,CAAC;AACvB,MAAI,MAAM,WAAW,GAAG;AACtB,WACE;AAAA,MAAC;AAAA;AAAA,QACC,WAAW,GAAG,yDAAyD,SAAS;AAAA,QAChF,eAAa;AAAA,QAEb;AAAA,8BAAC,YAAS,WAAU,oBAAmB;AAAA,UACvC,oBAAC,UAAM,sBAAW;AAAA;AAAA;AAAA,IACpB;AAAA,EAEJ;AAEA,SACE,oBAAC,QAAG,WAAW,GAAG,0BAA0B,SAAS,GAAG,eAAa,QAClE,gBAAM,IAAI,CAAC,SAAS;AACnB,UAAM,OAAO,iBAAiB,KAAK,OAAO;AAC1C,WACE;AAAA,MAAC;AAAA;AAAA,QAEC,WAAU;AAAA,QACV,eAAY;AAAA,QAEZ;AAAA,8BAAC,KAAK,MAAL,EAAU,WAAW,GAAG,oBAAoB,KAAK,aAAa,GAAG;AAAA,UAClE,oBAAC,UAAK,WAAU,mDAAmD,eAAK,OAAM;AAAA,UAC9E,oBAAC,UAAK,WAAU,uDACb,yBAAe,KAAK,UAAU,GACjC;AAAA;AAAA;AAAA,MARK,KAAK;AAAA,IASZ;AAAA,EAEJ,CAAC,GACH;AAEJ;",
|
|
6
|
+
"names": []
|
|
7
|
+
}
|
|
@@ -0,0 +1,200 @@
|
|
|
1
|
+
import { jsx, jsxs } from "react/jsx-runtime";
|
|
2
|
+
import { useState } from "react";
|
|
3
|
+
import {
|
|
4
|
+
Bell,
|
|
5
|
+
BellOff,
|
|
6
|
+
CheckCheck,
|
|
7
|
+
CheckCircle2,
|
|
8
|
+
AlertTriangle,
|
|
9
|
+
XCircle,
|
|
10
|
+
Info,
|
|
11
|
+
X
|
|
12
|
+
} from "lucide-react";
|
|
13
|
+
import {
|
|
14
|
+
DropdownMenu,
|
|
15
|
+
DropdownMenuTrigger,
|
|
16
|
+
DropdownMenuContent,
|
|
17
|
+
DropdownMenuItem
|
|
18
|
+
} from "../ui/dropdown-menu.js";
|
|
19
|
+
import { ScrollArea } from "../ui/scroll-area.js";
|
|
20
|
+
import { cn } from "../lib/utils.js";
|
|
21
|
+
import { formatRelativeTime } from "../lib/format-relative-time.js";
|
|
22
|
+
import {
|
|
23
|
+
useNotify,
|
|
24
|
+
selectUnread,
|
|
25
|
+
DEFAULT_NOTIFY_TONE
|
|
26
|
+
} from "./notify-store.js";
|
|
27
|
+
const GLYPH = {
|
|
28
|
+
success: CheckCircle2,
|
|
29
|
+
error: XCircle,
|
|
30
|
+
warning: AlertTriangle,
|
|
31
|
+
info: Info
|
|
32
|
+
};
|
|
33
|
+
const BELL_LIMIT = 100;
|
|
34
|
+
function NotificationBell({
|
|
35
|
+
renderTrigger,
|
|
36
|
+
onNavigate,
|
|
37
|
+
onSelectNotification,
|
|
38
|
+
onMarkRead,
|
|
39
|
+
onMarkAllRead,
|
|
40
|
+
showMuteToggle = false,
|
|
41
|
+
toneClassNames,
|
|
42
|
+
emptyText = "You're all caught up.",
|
|
43
|
+
onViewAll,
|
|
44
|
+
viewAllLabel = "View all",
|
|
45
|
+
testId = "notifications",
|
|
46
|
+
side = "bottom",
|
|
47
|
+
align = "end"
|
|
48
|
+
}) {
|
|
49
|
+
const [open, setOpen] = useState(false);
|
|
50
|
+
const notifications = useNotify((s) => s.notifications);
|
|
51
|
+
const unread = useNotify(selectUnread);
|
|
52
|
+
const markAllRead = useNotify((s) => s.markAllRead);
|
|
53
|
+
const markRead = useNotify((s) => s.markRead);
|
|
54
|
+
const muted = useNotify((s) => s.muted);
|
|
55
|
+
const setMuted = useNotify((s) => s.setMuted);
|
|
56
|
+
const tone = (v) => toneClassNames?.[v] ?? DEFAULT_NOTIFY_TONE[v];
|
|
57
|
+
const visible = notifications.filter((n) => !n.ambient).slice(0, BELL_LIMIT);
|
|
58
|
+
return /* @__PURE__ */ jsxs(DropdownMenu, { open, onOpenChange: setOpen, children: [
|
|
59
|
+
/* @__PURE__ */ jsx(DropdownMenuTrigger, { asChild: true, children: renderTrigger ? renderTrigger({
|
|
60
|
+
unread,
|
|
61
|
+
ariaLabel: `Notifications${unread ? `, ${unread} unread` : ""}`,
|
|
62
|
+
testId
|
|
63
|
+
}) : /* @__PURE__ */ jsxs(
|
|
64
|
+
"button",
|
|
65
|
+
{
|
|
66
|
+
className: "relative flex size-9 pointer-coarse:size-11 items-center justify-center rounded-md text-muted-foreground transition-colors hover:bg-accent hover:text-foreground",
|
|
67
|
+
"data-testid": testId,
|
|
68
|
+
"aria-label": `Notifications${unread ? `, ${unread} unread` : ""}`,
|
|
69
|
+
title: "Notifications",
|
|
70
|
+
children: [
|
|
71
|
+
/* @__PURE__ */ jsx(Bell, { className: "size-5" }),
|
|
72
|
+
unread > 0 && /* @__PURE__ */ jsx(
|
|
73
|
+
"span",
|
|
74
|
+
{
|
|
75
|
+
className: "absolute -right-0.5 -top-0.5 flex min-w-4 items-center justify-center rounded-full bg-primary px-1 text-xs font-semibold leading-4 text-primary-foreground",
|
|
76
|
+
"data-testid": `${testId}-badge`,
|
|
77
|
+
children: unread > 9 ? "9+" : unread
|
|
78
|
+
}
|
|
79
|
+
)
|
|
80
|
+
]
|
|
81
|
+
}
|
|
82
|
+
) }),
|
|
83
|
+
/* @__PURE__ */ jsxs(
|
|
84
|
+
DropdownMenuContent,
|
|
85
|
+
{
|
|
86
|
+
align,
|
|
87
|
+
side,
|
|
88
|
+
sideOffset: 8,
|
|
89
|
+
collisionPadding: 12,
|
|
90
|
+
className: "w-60 rounded-lg border-border/60 p-0 shadow-lg pointer-coarse:w-88",
|
|
91
|
+
"data-testid": `${testId}-panel`,
|
|
92
|
+
"data-topbar-popover": "",
|
|
93
|
+
children: [
|
|
94
|
+
/* @__PURE__ */ jsxs("div", { className: "flex items-center justify-between gap-3 border-b border-border px-3.5 py-2.5 pointer-coarse:py-0", children: [
|
|
95
|
+
/* @__PURE__ */ jsx("p", { className: "text-sm font-semibold text-foreground", children: "Notifications" }),
|
|
96
|
+
/* @__PURE__ */ jsxs("div", { className: "flex items-center gap-3 pointer-coarse:gap-1", children: [
|
|
97
|
+
unread > 0 && /* @__PURE__ */ jsxs(
|
|
98
|
+
"button",
|
|
99
|
+
{
|
|
100
|
+
onClick: () => {
|
|
101
|
+
markAllRead();
|
|
102
|
+
onMarkAllRead?.();
|
|
103
|
+
},
|
|
104
|
+
className: "flex items-center gap-1 text-xs font-medium text-primary transition-colors hover:opacity-80 pointer-coarse:min-h-11 pointer-coarse:px-2",
|
|
105
|
+
"data-testid": `${testId}-mark-all`,
|
|
106
|
+
children: [
|
|
107
|
+
/* @__PURE__ */ jsx(CheckCheck, { className: "size-3.5" }),
|
|
108
|
+
" Mark all read"
|
|
109
|
+
]
|
|
110
|
+
}
|
|
111
|
+
),
|
|
112
|
+
showMuteToggle && /* @__PURE__ */ jsx(
|
|
113
|
+
"button",
|
|
114
|
+
{
|
|
115
|
+
onClick: () => setMuted(!muted),
|
|
116
|
+
"aria-pressed": muted,
|
|
117
|
+
title: muted ? "Unmute notifications" : "Mute notifications",
|
|
118
|
+
"aria-label": muted ? "Unmute notifications" : "Mute notifications",
|
|
119
|
+
className: cn(
|
|
120
|
+
"flex size-6 shrink-0 items-center justify-center rounded-md transition-colors hover:bg-accent pointer-coarse:size-11",
|
|
121
|
+
muted ? "text-foreground" : "text-muted-foreground hover:text-foreground"
|
|
122
|
+
),
|
|
123
|
+
"data-testid": `${testId}-mute`,
|
|
124
|
+
children: /* @__PURE__ */ jsx(BellOff, { className: "size-3.5" })
|
|
125
|
+
}
|
|
126
|
+
),
|
|
127
|
+
/* @__PURE__ */ jsx(
|
|
128
|
+
DropdownMenuItem,
|
|
129
|
+
{
|
|
130
|
+
className: "flex size-6 shrink-0 items-center justify-center rounded-md p-0 text-muted-foreground transition-colors hover:bg-accent hover:text-foreground focus:bg-accent pointer-coarse:size-11",
|
|
131
|
+
"aria-label": "Close notifications",
|
|
132
|
+
"data-testid": `${testId}-close`,
|
|
133
|
+
children: /* @__PURE__ */ jsx(X, { className: "size-3.5" })
|
|
134
|
+
}
|
|
135
|
+
)
|
|
136
|
+
] })
|
|
137
|
+
] }),
|
|
138
|
+
muted && /* @__PURE__ */ jsx(
|
|
139
|
+
"p",
|
|
140
|
+
{
|
|
141
|
+
className: "border-b border-border/60 bg-amber-500/10 px-3.5 py-1.5 text-xs text-muted-foreground",
|
|
142
|
+
"data-testid": `${testId}-muted-note`,
|
|
143
|
+
children: "Toasts are muted \u2014 everything still lands here."
|
|
144
|
+
}
|
|
145
|
+
),
|
|
146
|
+
visible.length === 0 ? /* @__PURE__ */ jsx("div", { className: "px-3.5 py-10 text-center text-sm text-muted-foreground", children: emptyText }) : /* @__PURE__ */ jsx(ScrollArea, { className: "max-h-[380px]", children: /* @__PURE__ */ jsx("ul", { "data-testid": `${testId}-list`, children: visible.map((n) => {
|
|
147
|
+
const Glyph = GLYPH[n.variant];
|
|
148
|
+
return /* @__PURE__ */ jsx("li", { children: /* @__PURE__ */ jsxs(
|
|
149
|
+
"button",
|
|
150
|
+
{
|
|
151
|
+
onClick: () => {
|
|
152
|
+
markRead(n.id);
|
|
153
|
+
if (!n.read) onMarkRead?.(n.id);
|
|
154
|
+
setOpen(false);
|
|
155
|
+
if (onSelectNotification) {
|
|
156
|
+
onSelectNotification(n);
|
|
157
|
+
return;
|
|
158
|
+
}
|
|
159
|
+
if (n.onSelect) n.onSelect();
|
|
160
|
+
else if (n.href) onNavigate?.(n.href);
|
|
161
|
+
},
|
|
162
|
+
className: cn(
|
|
163
|
+
"flex w-full items-start gap-3 border-b border-border/60 px-3.5 py-3 text-left transition-colors hover:bg-accent",
|
|
164
|
+
!n.read && "bg-accent/40"
|
|
165
|
+
),
|
|
166
|
+
"data-testid": `${testId}-item`,
|
|
167
|
+
"data-notification-id": n.id,
|
|
168
|
+
children: [
|
|
169
|
+
/* @__PURE__ */ jsx(Glyph, { className: cn("mt-0.5 size-4 shrink-0", tone(n.variant)) }),
|
|
170
|
+
/* @__PURE__ */ jsxs("div", { className: "min-w-0 flex-1", children: [
|
|
171
|
+
/* @__PURE__ */ jsx("p", { className: "text-sm font-medium leading-snug text-foreground", children: n.title }),
|
|
172
|
+
n.description && /* @__PURE__ */ jsx("p", { className: "mt-0.5 line-clamp-2 text-xs leading-relaxed text-muted-foreground", children: n.description }),
|
|
173
|
+
/* @__PURE__ */ jsx("p", { className: "mt-1 text-xs text-muted-foreground/80", children: formatRelativeTime(new Date(n.ts).toISOString()) })
|
|
174
|
+
] }),
|
|
175
|
+
(n.onSelect || n.href) && /* @__PURE__ */ jsx("span", { className: "shrink-0 self-center rounded-md bg-primary/10 px-2 py-1 text-xs font-medium text-primary", children: n.actionLabel ?? "Open" }),
|
|
176
|
+
!n.read && /* @__PURE__ */ jsx("span", { className: "mt-1.5 size-2 shrink-0 rounded-full bg-primary" })
|
|
177
|
+
]
|
|
178
|
+
}
|
|
179
|
+
) }, n.id);
|
|
180
|
+
}) }) }),
|
|
181
|
+
onViewAll && // A real menu item, not a bare button: selecting it must CLOSE the
|
|
182
|
+
// dropdown on its way to the full surface.
|
|
183
|
+
/* @__PURE__ */ jsx(
|
|
184
|
+
DropdownMenuItem,
|
|
185
|
+
{
|
|
186
|
+
onClick: onViewAll,
|
|
187
|
+
className: "justify-center rounded-none border-t border-border px-3.5 py-2.5 text-xs font-medium text-primary focus:text-primary pointer-coarse:min-h-11",
|
|
188
|
+
"data-testid": `${testId}-view-all`,
|
|
189
|
+
children: viewAllLabel
|
|
190
|
+
}
|
|
191
|
+
)
|
|
192
|
+
]
|
|
193
|
+
}
|
|
194
|
+
)
|
|
195
|
+
] });
|
|
196
|
+
}
|
|
197
|
+
export {
|
|
198
|
+
NotificationBell
|
|
199
|
+
};
|
|
200
|
+
//# sourceMappingURL=NotificationBell.js.map
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../../src/notifications/NotificationBell.tsx"],
|
|
4
|
+
"sourcesContent": ["/**\n * NotificationBell \u2014 the topbar notification centre: a bell with an unread badge\n * that opens a dropdown of recorded entries (newest first) with an unread dot,\n * relative time and optional deep-link. \"Mark all read\" clears the badge. Backed\n * by the shared {@link useNotify} store (the same one the <Toaster/> renders).\n *\n * Firm-agnostic: navigation is a callback (`onNavigate`), styling tracks semantic\n * tokens, and per-variant glyph colours are overridable via `toneClassNames`.\n */\nimport { useState, type ReactElement } from 'react'\nimport {\n Bell,\n BellOff,\n CheckCheck,\n CheckCircle2,\n AlertTriangle,\n XCircle,\n Info,\n X,\n} from 'lucide-react'\nimport {\n DropdownMenu,\n DropdownMenuTrigger,\n DropdownMenuContent,\n DropdownMenuItem,\n} from '../ui/dropdown-menu'\nimport { ScrollArea } from '../ui/scroll-area'\nimport { cn } from '../lib/utils'\nimport { formatRelativeTime } from '../lib/format-relative-time'\nimport {\n useNotify,\n selectUnread,\n DEFAULT_NOTIFY_TONE,\n type NotifyVariant,\n type AppNotification,\n} from './notify-store'\n\nconst GLYPH: Record<NotifyVariant, typeof Info> = {\n success: CheckCircle2,\n error: XCircle,\n warning: AlertTriangle,\n info: Info,\n}\n\n/** Entries the panel lists, newest first. */\nconst BELL_LIMIT = 100\n\n/** What a custom bell trigger needs to render itself. */\nexport interface NotificationBellTriggerState {\n /** Unread count (0 when none). */\n unread: number\n /** Accessible name, including the count: \"Notifications, 2 unread\". */\n ariaLabel: string\n testId: string\n}\n\nexport interface NotificationBellProps {\n /**\n * Replaces the default icon button with the host's own trigger (for example a labelled sidebar\n * row). It must forward its ref and rest props: it is mounted as the dropdown trigger.\n */\n renderTrigger?: (state: NotificationBellTriggerState) => ReactElement\n /** Called with an entry's `href` when it's clicked (e.g. router navigate). */\n onNavigate?: (href: string) => void\n /** Open this entry in the host notification centre instead of following its link. */\n onSelectNotification?: (notification: AppNotification) => void\n /** Called after an entry is locally marked read \u2014 the hook for a backend\n * bridge to propagate read state upstream (filter by the ids it owns). */\n onMarkRead?: (id: string) => void\n /** Called after \"Mark all read\" \u2014 same upstream-propagation hook. */\n onMarkAllRead?: () => void\n /** Show the store's toast mute switch in the header \u2014 the bell is where notification\n * behaviour is controlled. */\n showMuteToggle?: boolean\n /** Override per-variant glyph colours (e.g. brand emerald for success). */\n toneClassNames?: Partial<Record<NotifyVariant, string>>\n emptyText?: string\n /** Footer link to the app's full notification surface. Omit to hide. */\n onViewAll?: () => void\n viewAllLabel?: string\n testId?: string\n /** Where the panel opens relative to the bell (a sidebar-footer bell opens upward). */\n side?: 'top' | 'right' | 'bottom' | 'left'\n align?: 'start' | 'center' | 'end'\n}\n\nexport function NotificationBell({\n renderTrigger,\n onNavigate,\n onSelectNotification,\n onMarkRead,\n onMarkAllRead,\n showMuteToggle = false,\n toneClassNames,\n emptyText = \"You're all caught up.\",\n onViewAll,\n viewAllLabel = 'View all',\n testId = 'notifications',\n side = 'bottom',\n align = 'end',\n}: NotificationBellProps) {\n const [open, setOpen] = useState(false)\n const notifications = useNotify((s) => s.notifications)\n const unread = useNotify(selectUnread)\n const markAllRead = useNotify((s) => s.markAllRead)\n const markRead = useNotify((s) => s.markRead)\n const muted = useNotify((s) => s.muted)\n const setMuted = useNotify((s) => s.setMuted)\n const tone = (v: NotifyVariant) => toneClassNames?.[v] ?? DEFAULT_NOTIFY_TONE[v]\n\n // Ambient entries (routine session activity \u2014 \"Opening workspace\u2026\") are kept\n // for the log but never surfaced in the bell panel: they never badge and are\n // always filtered out here. The panel is the recent history; a host's\n // notification page (`onViewAll`) holds the rest.\n const visible = notifications.filter((n) => !n.ambient).slice(0, BELL_LIMIT)\n\n return (\n <DropdownMenu open={open} onOpenChange={setOpen}>\n <DropdownMenuTrigger asChild>\n {renderTrigger ? (\n renderTrigger({\n unread,\n ariaLabel: `Notifications${unread ? `, ${unread} unread` : ''}`,\n testId,\n })\n ) : (\n <button\n className=\"relative flex size-9 pointer-coarse:size-11 items-center justify-center rounded-md text-muted-foreground transition-colors hover:bg-accent hover:text-foreground\"\n data-testid={testId}\n aria-label={`Notifications${unread ? `, ${unread} unread` : ''}`}\n title=\"Notifications\"\n >\n <Bell className=\"size-5\" />\n {unread > 0 && (\n <span\n className=\"absolute -right-0.5 -top-0.5 flex min-w-4 items-center justify-center rounded-full bg-primary px-1 text-xs font-semibold leading-4 text-primary-foreground\"\n data-testid={`${testId}-badge`}\n >\n {unread > 9 ? '9+' : unread}\n </span>\n )}\n </button>\n )}\n </DropdownMenuTrigger>\n <DropdownMenuContent\n align={align}\n side={side}\n sideOffset={8}\n collisionPadding={12}\n className=\"w-60 rounded-lg border-border/60 p-0 shadow-lg pointer-coarse:w-88\"\n data-testid={`${testId}-panel`}\n data-topbar-popover=\"\"\n >\n <div className=\"flex items-center justify-between gap-3 border-b border-border px-3.5 py-2.5 pointer-coarse:py-0\">\n <p className=\"text-sm font-semibold text-foreground\">Notifications</p>\n <div className=\"flex items-center gap-3 pointer-coarse:gap-1\">\n {unread > 0 && (\n <button\n onClick={() => {\n markAllRead()\n onMarkAllRead?.()\n }}\n className=\"flex items-center gap-1 text-xs font-medium text-primary transition-colors hover:opacity-80 pointer-coarse:min-h-11 pointer-coarse:px-2\"\n data-testid={`${testId}-mark-all`}\n >\n <CheckCheck className=\"size-3.5\" /> Mark all read\n </button>\n )}\n {showMuteToggle && (\n <button\n onClick={() => setMuted(!muted)}\n aria-pressed={muted}\n title={muted ? 'Unmute notifications' : 'Mute notifications'}\n aria-label={muted ? 'Unmute notifications' : 'Mute notifications'}\n className={cn(\n 'flex size-6 shrink-0 items-center justify-center rounded-md transition-colors hover:bg-accent pointer-coarse:size-11',\n muted ? 'text-foreground' : 'text-muted-foreground hover:text-foreground'\n )}\n data-testid={`${testId}-mute`}\n >\n <BellOff className=\"size-3.5\" />\n </button>\n )}\n {/* Explicit close \u2014 the dropdown otherwise only dismisses via\n tap-outside/Escape, which isn't discoverable on touch and (at\n mobile width, see blocks.css) the panel covers most\n of the screen so there's nothing to tap outside of. Radix\n closes a DropdownMenu on any item select by default, so a\n plain item with no other effect doubles as a close button. */}\n <DropdownMenuItem\n className=\"flex size-6 shrink-0 items-center justify-center rounded-md p-0 text-muted-foreground transition-colors hover:bg-accent hover:text-foreground focus:bg-accent pointer-coarse:size-11\"\n aria-label=\"Close notifications\"\n data-testid={`${testId}-close`}\n >\n <X className=\"size-3.5\" />\n </DropdownMenuItem>\n </div>\n </div>\n {muted && (\n <p\n className=\"border-b border-border/60 bg-amber-500/10 px-3.5 py-1.5 text-xs text-muted-foreground\"\n data-testid={`${testId}-muted-note`}\n >\n Toasts are muted \u2014 everything still lands here.\n </p>\n )}\n\n {visible.length === 0 ? (\n <div className=\"px-3.5 py-10 text-center text-sm text-muted-foreground\">{emptyText}</div>\n ) : (\n <ScrollArea className=\"max-h-[380px]\">\n <ul data-testid={`${testId}-list`}>\n {visible.map((n) => {\n const Glyph = GLYPH[n.variant]\n return (\n <li key={n.id}>\n <button\n onClick={() => {\n markRead(n.id)\n if (!n.read) onMarkRead?.(n.id)\n setOpen(false)\n if (onSelectNotification) {\n onSelectNotification(n)\n return\n }\n // The specific action wins over the generic deep link.\n if (n.onSelect) n.onSelect()\n else if (n.href) onNavigate?.(n.href)\n }}\n className={cn(\n 'flex w-full items-start gap-3 border-b border-border/60 px-3.5 py-3 text-left transition-colors hover:bg-accent',\n !n.read && 'bg-accent/40'\n )}\n data-testid={`${testId}-item`}\n data-notification-id={n.id}\n >\n <Glyph className={cn('mt-0.5 size-4 shrink-0', tone(n.variant))} />\n <div className=\"min-w-0 flex-1\">\n <p className=\"text-sm font-medium leading-snug text-foreground\">\n {n.title}\n </p>\n {n.description && (\n <p className=\"mt-0.5 line-clamp-2 text-xs leading-relaxed text-muted-foreground\">\n {n.description}\n </p>\n )}\n <p className=\"mt-1 text-xs text-muted-foreground/80\">\n {formatRelativeTime(new Date(n.ts).toISOString())}\n </p>\n </div>\n {(n.onSelect || n.href) && (\n <span className=\"shrink-0 self-center rounded-md bg-primary/10 px-2 py-1 text-xs font-medium text-primary\">\n {n.actionLabel ?? 'Open'}\n </span>\n )}\n {!n.read && (\n <span className=\"mt-1.5 size-2 shrink-0 rounded-full bg-primary\" />\n )}\n </button>\n </li>\n )\n })}\n </ul>\n </ScrollArea>\n )}\n {onViewAll && (\n // A real menu item, not a bare button: selecting it must CLOSE the\n // dropdown on its way to the full surface.\n <DropdownMenuItem\n onClick={onViewAll}\n className=\"justify-center rounded-none border-t border-border px-3.5 py-2.5 text-xs font-medium text-primary focus:text-primary pointer-coarse:min-h-11\"\n data-testid={`${testId}-view-all`}\n >\n {viewAllLabel}\n </DropdownMenuItem>\n )}\n </DropdownMenuContent>\n </DropdownMenu>\n )\n}\n"],
|
|
5
|
+
"mappings": "AA8HU,SAME,KANF;AArHV,SAAS,gBAAmC;AAC5C;AAAA,EACE;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,OACK;AACP;AAAA,EACE;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,OACK;AACP,SAAS,kBAAkB;AAC3B,SAAS,UAAU;AACnB,SAAS,0BAA0B;AACnC;AAAA,EACE;AAAA,EACA;AAAA,EACA;AAAA,OAGK;AAEP,MAAM,QAA4C;AAAA,EAChD,SAAS;AAAA,EACT,OAAO;AAAA,EACP,SAAS;AAAA,EACT,MAAM;AACR;AAGA,MAAM,aAAa;AAyCZ,SAAS,iBAAiB;AAAA,EAC/B;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA,iBAAiB;AAAA,EACjB;AAAA,EACA,YAAY;AAAA,EACZ;AAAA,EACA,eAAe;AAAA,EACf,SAAS;AAAA,EACT,OAAO;AAAA,EACP,QAAQ;AACV,GAA0B;AACxB,QAAM,CAAC,MAAM,OAAO,IAAI,SAAS,KAAK;AACtC,QAAM,gBAAgB,UAAU,CAAC,MAAM,EAAE,aAAa;AACtD,QAAM,SAAS,UAAU,YAAY;AACrC,QAAM,cAAc,UAAU,CAAC,MAAM,EAAE,WAAW;AAClD,QAAM,WAAW,UAAU,CAAC,MAAM,EAAE,QAAQ;AAC5C,QAAM,QAAQ,UAAU,CAAC,MAAM,EAAE,KAAK;AACtC,QAAM,WAAW,UAAU,CAAC,MAAM,EAAE,QAAQ;AAC5C,QAAM,OAAO,CAAC,MAAqB,iBAAiB,CAAC,KAAK,oBAAoB,CAAC;AAM/E,QAAM,UAAU,cAAc,OAAO,CAAC,MAAM,CAAC,EAAE,OAAO,EAAE,MAAM,GAAG,UAAU;AAE3E,SACE,qBAAC,gBAAa,MAAY,cAAc,SACtC;AAAA,wBAAC,uBAAoB,SAAO,MACzB,0BACC,cAAc;AAAA,MACZ;AAAA,MACA,WAAW,gBAAgB,SAAS,KAAK,MAAM,YAAY,EAAE;AAAA,MAC7D;AAAA,IACF,CAAC,IAED;AAAA,MAAC;AAAA;AAAA,QACC,WAAU;AAAA,QACV,eAAa;AAAA,QACb,cAAY,gBAAgB,SAAS,KAAK,MAAM,YAAY,EAAE;AAAA,QAC9D,OAAM;AAAA,QAEN;AAAA,8BAAC,QAAK,WAAU,UAAS;AAAA,UACxB,SAAS,KACR;AAAA,YAAC;AAAA;AAAA,cACC,WAAU;AAAA,cACV,eAAa,GAAG,MAAM;AAAA,cAErB,mBAAS,IAAI,OAAO;AAAA;AAAA,UACvB;AAAA;AAAA;AAAA,IAEJ,GAEJ;AAAA,IACA;AAAA,MAAC;AAAA;AAAA,QACC;AAAA,QACA;AAAA,QACA,YAAY;AAAA,QACZ,kBAAkB;AAAA,QAClB,WAAU;AAAA,QACV,eAAa,GAAG,MAAM;AAAA,QACtB,uBAAoB;AAAA,QAEpB;AAAA,+BAAC,SAAI,WAAU,oGACb;AAAA,gCAAC,OAAE,WAAU,yCAAwC,2BAAa;AAAA,YAClE,qBAAC,SAAI,WAAU,gDACZ;AAAA,uBAAS,KACR;AAAA,gBAAC;AAAA;AAAA,kBACC,SAAS,MAAM;AACb,gCAAY;AACZ,oCAAgB;AAAA,kBAClB;AAAA,kBACA,WAAU;AAAA,kBACV,eAAa,GAAG,MAAM;AAAA,kBAEtB;AAAA,wCAAC,cAAW,WAAU,YAAW;AAAA,oBAAE;AAAA;AAAA;AAAA,cACrC;AAAA,cAED,kBACC;AAAA,gBAAC;AAAA;AAAA,kBACC,SAAS,MAAM,SAAS,CAAC,KAAK;AAAA,kBAC9B,gBAAc;AAAA,kBACd,OAAO,QAAQ,yBAAyB;AAAA,kBACxC,cAAY,QAAQ,yBAAyB;AAAA,kBAC7C,WAAW;AAAA,oBACT;AAAA,oBACA,QAAQ,oBAAoB;AAAA,kBAC9B;AAAA,kBACA,eAAa,GAAG,MAAM;AAAA,kBAEtB,8BAAC,WAAQ,WAAU,YAAW;AAAA;AAAA,cAChC;AAAA,cAQF;AAAA,gBAAC;AAAA;AAAA,kBACC,WAAU;AAAA,kBACV,cAAW;AAAA,kBACX,eAAa,GAAG,MAAM;AAAA,kBAEtB,8BAAC,KAAE,WAAU,YAAW;AAAA;AAAA,cAC1B;AAAA,eACF;AAAA,aACF;AAAA,UACC,SACC;AAAA,YAAC;AAAA;AAAA,cACC,WAAU;AAAA,cACV,eAAa,GAAG,MAAM;AAAA,cACvB;AAAA;AAAA,UAED;AAAA,UAGD,QAAQ,WAAW,IAClB,oBAAC,SAAI,WAAU,0DAA0D,qBAAU,IAEnF,oBAAC,cAAW,WAAU,iBACpB,8BAAC,QAAG,eAAa,GAAG,MAAM,SACvB,kBAAQ,IAAI,CAAC,MAAM;AAClB,kBAAM,QAAQ,MAAM,EAAE,OAAO;AAC7B,mBACE,oBAAC,QACC;AAAA,cAAC;AAAA;AAAA,gBACC,SAAS,MAAM;AACb,2BAAS,EAAE,EAAE;AACb,sBAAI,CAAC,EAAE,KAAM,cAAa,EAAE,EAAE;AAC9B,0BAAQ,KAAK;AACb,sBAAI,sBAAsB;AACxB,yCAAqB,CAAC;AACtB;AAAA,kBACF;AAEA,sBAAI,EAAE,SAAU,GAAE,SAAS;AAAA,2BAClB,EAAE,KAAM,cAAa,EAAE,IAAI;AAAA,gBACtC;AAAA,gBACA,WAAW;AAAA,kBACT;AAAA,kBACA,CAAC,EAAE,QAAQ;AAAA,gBACb;AAAA,gBACA,eAAa,GAAG,MAAM;AAAA,gBACtB,wBAAsB,EAAE;AAAA,gBAExB;AAAA,sCAAC,SAAM,WAAW,GAAG,0BAA0B,KAAK,EAAE,OAAO,CAAC,GAAG;AAAA,kBACjE,qBAAC,SAAI,WAAU,kBACb;AAAA,wCAAC,OAAE,WAAU,oDACV,YAAE,OACL;AAAA,oBACC,EAAE,eACD,oBAAC,OAAE,WAAU,qEACV,YAAE,aACL;AAAA,oBAEF,oBAAC,OAAE,WAAU,yCACV,6BAAmB,IAAI,KAAK,EAAE,EAAE,EAAE,YAAY,CAAC,GAClD;AAAA,qBACF;AAAA,mBACE,EAAE,YAAY,EAAE,SAChB,oBAAC,UAAK,WAAU,4FACb,YAAE,eAAe,QACpB;AAAA,kBAED,CAAC,EAAE,QACF,oBAAC,UAAK,WAAU,kDAAiD;AAAA;AAAA;AAAA,YAErE,KA3CO,EAAE,EA4CX;AAAA,UAEJ,CAAC,GACH,GACF;AAAA,UAED;AAAA;AAAA,UAGC;AAAA,YAAC;AAAA;AAAA,cACC,SAAS;AAAA,cACT,WAAU;AAAA,cACV,eAAa,GAAG,MAAM;AAAA,cAErB;AAAA;AAAA,UACH;AAAA;AAAA;AAAA,IAEJ;AAAA,KACF;AAEJ;",
|
|
6
|
+
"names": []
|
|
7
|
+
}
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
import { jsx } from "react/jsx-runtime";
|
|
2
|
+
import { Toaster as Sonner } from "sonner";
|
|
3
|
+
const DEFAULT_TOAST_OPTIONS = {
|
|
4
|
+
classNames: {
|
|
5
|
+
toast: "group toast group-[.toaster]:bg-card group-[.toaster]:text-foreground group-[.toaster]:border group-[.toaster]:border-border group-[.toaster]:shadow-lg group-[.toaster]:rounded-lg",
|
|
6
|
+
description: "group-[.toast]:text-muted-foreground",
|
|
7
|
+
actionButton: "group-[.toast]:bg-primary group-[.toast]:text-primary-foreground",
|
|
8
|
+
cancelButton: "group-[.toast]:bg-muted group-[.toast]:text-muted-foreground"
|
|
9
|
+
}
|
|
10
|
+
};
|
|
11
|
+
function Toaster({ toastOptions, ...props }) {
|
|
12
|
+
return /* @__PURE__ */ jsx(
|
|
13
|
+
Sonner,
|
|
14
|
+
{
|
|
15
|
+
className: "toaster group",
|
|
16
|
+
toastOptions: toastOptions ?? DEFAULT_TOAST_OPTIONS,
|
|
17
|
+
...props
|
|
18
|
+
}
|
|
19
|
+
);
|
|
20
|
+
}
|
|
21
|
+
export {
|
|
22
|
+
Toaster
|
|
23
|
+
};
|
|
24
|
+
//# sourceMappingURL=Toaster.js.map
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../../src/notifications/Toaster.tsx"],
|
|
4
|
+
"sourcesContent": ["/**\n * Toaster \u2014 the one shared toast surface, built on sonner (the mature engine:\n * stacking, swipe-to-dismiss, a11y, timing). Mount once near the app root; any\n * code then calls `notify.*(...)` (or the re-exported `toast`) from anywhere.\n *\n * Firm-agnostic: every sonner `ToasterProps` passes through, so a consumer sets\n * its own `position` / `theme` / `toastOptions`. The defaults give a neutral\n * shadcn-token card that both apps can override.\n */\nimport { Toaster as Sonner, type ToasterProps } from 'sonner'\n\nexport type { ToasterProps }\n\nconst DEFAULT_TOAST_OPTIONS: ToasterProps['toastOptions'] = {\n classNames: {\n toast:\n 'group toast group-[.toaster]:bg-card group-[.toaster]:text-foreground group-[.toaster]:border group-[.toaster]:border-border group-[.toaster]:shadow-lg group-[.toaster]:rounded-lg',\n description: 'group-[.toast]:text-muted-foreground',\n actionButton: 'group-[.toast]:bg-primary group-[.toast]:text-primary-foreground',\n cancelButton: 'group-[.toast]:bg-muted group-[.toast]:text-muted-foreground',\n },\n}\n\nexport function Toaster({ toastOptions, ...props }: ToasterProps) {\n return (\n <Sonner\n className=\"toaster group\"\n toastOptions={toastOptions ?? DEFAULT_TOAST_OPTIONS}\n {...props}\n />\n )\n}\n"],
|
|
5
|
+
"mappings": "AAyBI;AAhBJ,SAAS,WAAW,cAAiC;AAIrD,MAAM,wBAAsD;AAAA,EAC1D,YAAY;AAAA,IACV,OACE;AAAA,IACF,aAAa;AAAA,IACb,cAAc;AAAA,IACd,cAAc;AAAA,EAChB;AACF;AAEO,SAAS,QAAQ,EAAE,cAAc,GAAG,MAAM,GAAiB;AAChE,SACE;AAAA,IAAC;AAAA;AAAA,MACC,WAAU;AAAA,MACV,cAAc,gBAAgB;AAAA,MAC7B,GAAG;AAAA;AAAA,EACN;AAEJ;",
|
|
6
|
+
"names": []
|
|
7
|
+
}
|
|
@@ -0,0 +1,65 @@
|
|
|
1
|
+
import {
|
|
2
|
+
Activity,
|
|
3
|
+
FileCheck2,
|
|
4
|
+
FileX2,
|
|
5
|
+
FolderPlus,
|
|
6
|
+
Pencil,
|
|
7
|
+
SquareArrowOutUpRight,
|
|
8
|
+
Trash2
|
|
9
|
+
} from "lucide-react";
|
|
10
|
+
import { getEntityIcon } from "../entities/registry.js";
|
|
11
|
+
function parseActivityContent(content) {
|
|
12
|
+
if (!content) return null;
|
|
13
|
+
try {
|
|
14
|
+
const parsed = JSON.parse(content);
|
|
15
|
+
if (parsed && typeof parsed === "object" && typeof parsed.event === "string") {
|
|
16
|
+
return parsed;
|
|
17
|
+
}
|
|
18
|
+
} catch {
|
|
19
|
+
}
|
|
20
|
+
return null;
|
|
21
|
+
}
|
|
22
|
+
function str(v) {
|
|
23
|
+
return typeof v === "string" && v ? v : void 0;
|
|
24
|
+
}
|
|
25
|
+
function describeActivity(content) {
|
|
26
|
+
const parsed = typeof content === "string" || content == null ? parseActivityContent(content) : content;
|
|
27
|
+
if (!parsed) {
|
|
28
|
+
return { Icon: Activity, iconClassName: "text-muted-foreground", title: "Activity" };
|
|
29
|
+
}
|
|
30
|
+
const fileName = str(parsed.file_name);
|
|
31
|
+
switch (parsed.event) {
|
|
32
|
+
case "workspace_opened":
|
|
33
|
+
return {
|
|
34
|
+
Icon: SquareArrowOutUpRight,
|
|
35
|
+
iconClassName: "text-primary",
|
|
36
|
+
title: "Opened a workspace"
|
|
37
|
+
};
|
|
38
|
+
case "workspace_created":
|
|
39
|
+
return { Icon: FolderPlus, iconClassName: "text-green-600", title: "Created a workspace" };
|
|
40
|
+
case "workspace_updated":
|
|
41
|
+
return { Icon: Pencil, iconClassName: "text-primary", title: "Updated workspace settings" };
|
|
42
|
+
case "workspace_deleted":
|
|
43
|
+
return { Icon: Trash2, iconClassName: "text-red-500", title: "Deleted a workspace" };
|
|
44
|
+
case "document_processing": {
|
|
45
|
+
const failed = str(parsed.status) === "failed";
|
|
46
|
+
const noun = fileName ? `\u201C${fileName}\u201D` : "a document";
|
|
47
|
+
return failed ? { Icon: FileX2, iconClassName: "text-red-500", title: `Failed to process ${noun}` } : { Icon: FileCheck2, iconClassName: "text-green-600", title: `Processed ${noun}` };
|
|
48
|
+
}
|
|
49
|
+
default:
|
|
50
|
+
return {
|
|
51
|
+
Icon: parsed.workspace_ext_id ? getEntityIcon("WORKSPACE") : Activity,
|
|
52
|
+
iconClassName: "text-muted-foreground",
|
|
53
|
+
title: humaniseEvent(parsed.event)
|
|
54
|
+
};
|
|
55
|
+
}
|
|
56
|
+
}
|
|
57
|
+
function humaniseEvent(event) {
|
|
58
|
+
const words = event.replace(/[_-]+/g, " ").trim();
|
|
59
|
+
return words ? words.charAt(0).toUpperCase() + words.slice(1) : "Activity";
|
|
60
|
+
}
|
|
61
|
+
export {
|
|
62
|
+
describeActivity,
|
|
63
|
+
parseActivityContent
|
|
64
|
+
};
|
|
65
|
+
//# sourceMappingURL=activity-types.js.map
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../../src/notifications/activity-types.ts"],
|
|
4
|
+
"sourcesContent": ["/**\n * Activity-event presentation \u2014 decodes the compact `{\"event\": ..., ...fields}`\n * JSON payload carried by durable `activity` notifications (recorded backend-side\n * by `log_activity`) into a glyph + human sentence.\n *\n * Distinct from `notification-types.ts`: that maps the notification *type* (a DM,\n * a workspace-membership change, a reward); this maps the *event* recorded on a\n * to-self activity line (\"opened a workspace\", \"processed a document\"). Entity\n * glyphs are sourced from the shared entity registry \u2014 one source of truth.\n */\n\nimport {\n Activity,\n FileCheck2,\n FileX2,\n FolderPlus,\n Pencil,\n SquareArrowOutUpRight,\n Trash2,\n} from 'lucide-react'\nimport { getEntityIcon, type EntityIconComponent } from '../entities/registry'\n\n/** Parsed activity payload \u2014 always has `event`, plus event-specific fields. */\nexport interface ActivityContent {\n event: string\n [field: string]: unknown\n}\n\n/** Rendered description of an activity line. */\nexport interface ActivityDescription {\n Icon: EntityIconComponent\n /** Semantic Tailwind colour class for the glyph. */\n iconClassName: string\n /** Human-readable one-line summary of what happened. */\n title: string\n}\n\n/** Parse an activity notification's `content` JSON into `{event, ...fields}`, or null. */\nexport function parseActivityContent(content: string | null | undefined): ActivityContent | null {\n if (!content) return null\n try {\n const parsed = JSON.parse(content)\n if (parsed && typeof parsed === 'object' && typeof parsed.event === 'string') {\n return parsed as ActivityContent\n }\n } catch {\n // Not JSON (e.g. a legacy plain-string activity line) \u2014 no structured event.\n }\n return null\n}\n\nfunction str(v: unknown): string | undefined {\n return typeof v === 'string' && v ? v : undefined\n}\n\n/**\n * Describe an activity line for display. Accepts either the raw `content` string\n * or an already-parsed {@link ActivityContent}. Unknown/unparseable events fall\n * back to a generic activity glyph and a humanised event name.\n */\nexport function describeActivity(\n content: string | ActivityContent | null | undefined\n): ActivityDescription {\n const parsed =\n typeof content === 'string' || content == null ? parseActivityContent(content) : content\n\n if (!parsed) {\n return { Icon: Activity, iconClassName: 'text-muted-foreground', title: 'Activity' }\n }\n\n const fileName = str(parsed.file_name)\n\n switch (parsed.event) {\n case 'workspace_opened':\n return {\n Icon: SquareArrowOutUpRight,\n iconClassName: 'text-primary',\n title: 'Opened a workspace',\n }\n case 'workspace_created':\n return { Icon: FolderPlus, iconClassName: 'text-green-600', title: 'Created a workspace' }\n case 'workspace_updated':\n return { Icon: Pencil, iconClassName: 'text-primary', title: 'Updated workspace settings' }\n case 'workspace_deleted':\n return { Icon: Trash2, iconClassName: 'text-red-500', title: 'Deleted a workspace' }\n case 'document_processing': {\n const failed = str(parsed.status) === 'failed'\n const noun = fileName ? `\u201C${fileName}\u201D` : 'a document'\n return failed\n ? { Icon: FileX2, iconClassName: 'text-red-500', title: `Failed to process ${noun}` }\n : { Icon: FileCheck2, iconClassName: 'text-green-600', title: `Processed ${noun}` }\n }\n default:\n // Humanise an unrecognised event slug: \"some_new_event\" \u2192 \"Some new event\".\n return {\n Icon: parsed.workspace_ext_id\n ? (getEntityIcon('WORKSPACE') as EntityIconComponent)\n : Activity,\n iconClassName: 'text-muted-foreground',\n title: humaniseEvent(parsed.event),\n }\n }\n}\n\n/** \"workspace_opened\" \u2192 \"Workspace opened\" \u2014 a readable fallback for new events. */\nfunction humaniseEvent(event: string): string {\n const words = event.replace(/[_-]+/g, ' ').trim()\n return words ? words.charAt(0).toUpperCase() + words.slice(1) : 'Activity'\n}\n"],
|
|
5
|
+
"mappings": "AAWA;AAAA,EACE;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,OACK;AACP,SAAS,qBAA+C;AAkBjD,SAAS,qBAAqB,SAA4D;AAC/F,MAAI,CAAC,QAAS,QAAO;AACrB,MAAI;AACF,UAAM,SAAS,KAAK,MAAM,OAAO;AACjC,QAAI,UAAU,OAAO,WAAW,YAAY,OAAO,OAAO,UAAU,UAAU;AAC5E,aAAO;AAAA,IACT;AAAA,EACF,QAAQ;AAAA,EAER;AACA,SAAO;AACT;AAEA,SAAS,IAAI,GAAgC;AAC3C,SAAO,OAAO,MAAM,YAAY,IAAI,IAAI;AAC1C;AAOO,SAAS,iBACd,SACqB;AACrB,QAAM,SACJ,OAAO,YAAY,YAAY,WAAW,OAAO,qBAAqB,OAAO,IAAI;AAEnF,MAAI,CAAC,QAAQ;AACX,WAAO,EAAE,MAAM,UAAU,eAAe,yBAAyB,OAAO,WAAW;AAAA,EACrF;AAEA,QAAM,WAAW,IAAI,OAAO,SAAS;AAErC,UAAQ,OAAO,OAAO;AAAA,IACpB,KAAK;AACH,aAAO;AAAA,QACL,MAAM;AAAA,QACN,eAAe;AAAA,QACf,OAAO;AAAA,MACT;AAAA,IACF,KAAK;AACH,aAAO,EAAE,MAAM,YAAY,eAAe,kBAAkB,OAAO,sBAAsB;AAAA,IAC3F,KAAK;AACH,aAAO,EAAE,MAAM,QAAQ,eAAe,gBAAgB,OAAO,6BAA6B;AAAA,IAC5F,KAAK;AACH,aAAO,EAAE,MAAM,QAAQ,eAAe,gBAAgB,OAAO,sBAAsB;AAAA,IACrF,KAAK,uBAAuB;AAC1B,YAAM,SAAS,IAAI,OAAO,MAAM,MAAM;AACtC,YAAM,OAAO,WAAW,SAAI,QAAQ,WAAM;AAC1C,aAAO,SACH,EAAE,MAAM,QAAQ,eAAe,gBAAgB,OAAO,qBAAqB,IAAI,GAAG,IAClF,EAAE,MAAM,YAAY,eAAe,kBAAkB,OAAO,aAAa,IAAI,GAAG;AAAA,IACtF;AAAA,IACA;AAEE,aAAO;AAAA,QACL,MAAM,OAAO,mBACR,cAAc,WAAW,IAC1B;AAAA,QACJ,eAAe;AAAA,QACf,OAAO,cAAc,OAAO,KAAK;AAAA,MACnC;AAAA,EACJ;AACF;AAGA,SAAS,cAAc,OAAuB;AAC5C,QAAM,QAAQ,MAAM,QAAQ,UAAU,GAAG,EAAE,KAAK;AAChD,SAAO,QAAQ,MAAM,OAAO,CAAC,EAAE,YAAY,IAAI,MAAM,MAAM,CAAC,IAAI;AAClE;",
|
|
6
|
+
"names": []
|
|
7
|
+
}
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
import { describeCalendarNotification } from "./calendar-notifications.js";
|
|
2
|
+
import {
|
|
3
|
+
describeServerNotification,
|
|
4
|
+
notificationUserName
|
|
5
|
+
} from "./server-notifications.js";
|
|
6
|
+
function serverNotificationBellEntry(n, { open, workspaceHref, calendarTimeZone, ...describe }) {
|
|
7
|
+
const senderName = notificationUserName(n.sender);
|
|
8
|
+
const described = describeCalendarNotification(n, { senderName, timeZone: calendarTimeZone }) ?? describeServerNotification(n, { senderName, ...describe });
|
|
9
|
+
if (!described) return null;
|
|
10
|
+
const { title, variant, actionLabel, target } = described;
|
|
11
|
+
return {
|
|
12
|
+
id: n.external_id,
|
|
13
|
+
ts: Date.parse(n.created_at),
|
|
14
|
+
read: n.read ?? false,
|
|
15
|
+
title,
|
|
16
|
+
variant,
|
|
17
|
+
href: target?.kind === "workspace" ? workspaceHref?.(target.workspaceId) : void 0,
|
|
18
|
+
...target && { actionLabel: actionLabel ?? "Open", onSelect: () => open(target) }
|
|
19
|
+
};
|
|
20
|
+
}
|
|
21
|
+
export {
|
|
22
|
+
serverNotificationBellEntry
|
|
23
|
+
};
|
|
24
|
+
//# sourceMappingURL=bell.js.map
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../../src/notifications/bell.ts"],
|
|
4
|
+
"sourcesContent": ["/**\n * One server notification as a bell (and arrival toast) entry: what it says (the shared\n * `describeServerNotification`, or `describeCalendarNotification`) and what selecting it does.\n * The host's routing comes in as `open` (blocks: `useOpenNotificationTarget`) and `hrefFor`.\n */\nimport type { components } from '@arbidocs/client'\nimport { describeCalendarNotification } from './calendar-notifications'\nimport type { AppNotification } from './notify-store'\nimport {\n describeServerNotification,\n notificationUserName,\n type DescribeServerNotificationOptions,\n type NotificationTarget,\n} from './server-notifications'\n\ntype NotificationResponse = components['schemas']['NotificationResponse']\n\nexport interface ServerNotificationBellOptions extends Pick<\n DescribeServerNotificationOptions,\n 'documentName' | 'portalOrigins'\n> {\n /** Open where an entry leads. */\n open: (target: NotificationTarget) => void\n /** A workspace's link (an entry about a workspace is a link, not an action). */\n workspaceHref?: (workspaceId: string) => string | undefined\n /** The user's calendar time zone, for calendar notifications that carry none. */\n calendarTimeZone?: string | null\n}\n\n/**\n * The bell entry of a notification row, or null for a row the bell does not carry. `actionLabel`\n * names the toast's action (\"Review and sign\"); a workspace's own page is a link (`href`), every\n * other target an action (`onSelect`).\n */\nexport function serverNotificationBellEntry(\n n: NotificationResponse,\n { open, workspaceHref, calendarTimeZone, ...describe }: ServerNotificationBellOptions\n): AppNotification | null {\n const senderName = notificationUserName(n.sender)\n const described =\n describeCalendarNotification(n, { senderName, timeZone: calendarTimeZone }) ??\n describeServerNotification(n, { senderName, ...describe })\n if (!described) return null\n const { title, variant, actionLabel, target } = described\n return {\n id: n.external_id,\n ts: Date.parse(n.created_at),\n read: n.read ?? false,\n title,\n variant,\n href: target?.kind === 'workspace' ? workspaceHref?.(target.workspaceId) : undefined,\n ...(target && { actionLabel: actionLabel ?? 'Open', onSelect: () => open(target) }),\n }\n}\n"],
|
|
5
|
+
"mappings": "AAMA,SAAS,oCAAoC;AAE7C;AAAA,EACE;AAAA,EACA;AAAA,OAGK;AAqBA,SAAS,4BACd,GACA,EAAE,MAAM,eAAe,kBAAkB,GAAG,SAAS,GAC7B;AACxB,QAAM,aAAa,qBAAqB,EAAE,MAAM;AAChD,QAAM,YACJ,6BAA6B,GAAG,EAAE,YAAY,UAAU,iBAAiB,CAAC,KAC1E,2BAA2B,GAAG,EAAE,YAAY,GAAG,SAAS,CAAC;AAC3D,MAAI,CAAC,UAAW,QAAO;AACvB,QAAM,EAAE,OAAO,SAAS,aAAa,OAAO,IAAI;AAChD,SAAO;AAAA,IACL,IAAI,EAAE;AAAA,IACN,IAAI,KAAK,MAAM,EAAE,UAAU;AAAA,IAC3B,MAAM,EAAE,QAAQ;AAAA,IAChB;AAAA,IACA;AAAA,IACA,MAAM,QAAQ,SAAS,cAAc,gBAAgB,OAAO,WAAW,IAAI;AAAA,IAC3E,GAAI,UAAU,EAAE,aAAa,eAAe,QAAQ,UAAU,MAAM,KAAK,MAAM,EAAE;AAAA,EACnF;AACF;",
|
|
6
|
+
"names": []
|
|
7
|
+
}
|
|
@@ -0,0 +1,79 @@
|
|
|
1
|
+
function validZone(zone) {
|
|
2
|
+
if (typeof zone !== "string" || !zone) return void 0;
|
|
3
|
+
try {
|
|
4
|
+
new Intl.DateTimeFormat("en", { timeZone: zone });
|
|
5
|
+
return zone;
|
|
6
|
+
} catch {
|
|
7
|
+
return void 0;
|
|
8
|
+
}
|
|
9
|
+
}
|
|
10
|
+
function calendarNotificationMeta(content) {
|
|
11
|
+
try {
|
|
12
|
+
const m = JSON.parse(content || "{}");
|
|
13
|
+
const startsAt = typeof m.starts_at === "string" ? new Date(m.starts_at) : void 0;
|
|
14
|
+
return {
|
|
15
|
+
eventId: typeof m.event_id === "string" && /^evt-[A-Za-z0-9]{8}$/.test(m.event_id) ? m.event_id : void 0,
|
|
16
|
+
recurrenceId: typeof m.recurrence_id === "string" ? m.recurrence_id : null,
|
|
17
|
+
startsAt: startsAt && Number.isFinite(startsAt.getTime()) ? startsAt : void 0,
|
|
18
|
+
partstat: typeof m.partstat === "string" ? m.partstat : void 0,
|
|
19
|
+
hasConference: m.has_conference === true,
|
|
20
|
+
timeZone: validZone(m.time_zone)
|
|
21
|
+
};
|
|
22
|
+
} catch {
|
|
23
|
+
return { hasConference: false };
|
|
24
|
+
}
|
|
25
|
+
}
|
|
26
|
+
function when(date, timeZone) {
|
|
27
|
+
if (!date) return "";
|
|
28
|
+
return ` (${date.toLocaleString([], { weekday: "short", day: "numeric", month: "short", hour: "2-digit", minute: "2-digit", timeZone })})`;
|
|
29
|
+
}
|
|
30
|
+
const PARTSTAT_WORDS = {
|
|
31
|
+
accepted: "accepted",
|
|
32
|
+
declined: "declined",
|
|
33
|
+
tentative: "tentatively accepted",
|
|
34
|
+
delegated: "delegated"
|
|
35
|
+
};
|
|
36
|
+
function describeCalendarNotification(n, { senderName, timeZone }) {
|
|
37
|
+
const type = n.type;
|
|
38
|
+
if (!type.startsWith("calendar_")) return null;
|
|
39
|
+
const meta = calendarNotificationMeta(n.content);
|
|
40
|
+
const zone = meta.timeZone ?? validZone(timeZone);
|
|
41
|
+
const at = when(meta.startsAt, zone);
|
|
42
|
+
const target = {
|
|
43
|
+
kind: "calendar",
|
|
44
|
+
...meta.eventId && { eventId: meta.eventId, recurrenceId: meta.recurrenceId }
|
|
45
|
+
};
|
|
46
|
+
switch (type) {
|
|
47
|
+
case "calendar_invite":
|
|
48
|
+
return { title: `${senderName} invited you to an event${at}`, variant: "info", target };
|
|
49
|
+
case "calendar_update":
|
|
50
|
+
return { title: `${senderName} updated an event${at}`, variant: "info", target };
|
|
51
|
+
case "calendar_cancel":
|
|
52
|
+
return { title: `${senderName} cancelled an event${at}`, variant: "warning", target };
|
|
53
|
+
case "calendar_reply": {
|
|
54
|
+
const word = PARTSTAT_WORDS[meta.partstat ?? ""] ?? "replied to";
|
|
55
|
+
return {
|
|
56
|
+
title: `${senderName} ${word} your invitation${at}`,
|
|
57
|
+
variant: meta.partstat === "declined" ? "warning" : "info",
|
|
58
|
+
target
|
|
59
|
+
};
|
|
60
|
+
}
|
|
61
|
+
case "calendar_share":
|
|
62
|
+
return { title: `${senderName} shared a calendar with you`, variant: "info", target };
|
|
63
|
+
case "calendar_counter":
|
|
64
|
+
return { title: `${senderName} proposed a new time${at}`, variant: "info", target };
|
|
65
|
+
case "calendar_reminder": {
|
|
66
|
+
const title = meta.startsAt ? `An event starts at ${meta.startsAt.toLocaleTimeString([], { hour: "2-digit", minute: "2-digit", timeZone: zone })}` : "An event starts soon";
|
|
67
|
+
if (meta.hasConference && meta.eventId)
|
|
68
|
+
return { title, variant: "info", actionLabel: "Join", target: { ...target, join: true } };
|
|
69
|
+
return { title, variant: "info", actionLabel: "Open", target };
|
|
70
|
+
}
|
|
71
|
+
default:
|
|
72
|
+
return { title: "Calendar update", variant: "info", target };
|
|
73
|
+
}
|
|
74
|
+
}
|
|
75
|
+
export {
|
|
76
|
+
calendarNotificationMeta,
|
|
77
|
+
describeCalendarNotification
|
|
78
|
+
};
|
|
79
|
+
//# sourceMappingURL=calendar-notifications.js.map
|