@arbidocs/react 0.5.110 → 0.5.112
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/PdfViewerImpl-QUSDLNNM.cjs +380 -0
- package/dist/PdfViewerImpl-QUSDLNNM.cjs.map +1 -0
- package/dist/{PdfViewer.d-bQH9yxFg.d.cts → PdfViewerImpl.d-B28hLEuj.d.ts} +8 -1
- package/dist/account/client.js +96 -0
- package/dist/account/client.js.map +7 -0
- package/dist/account/delete.js +70 -0
- package/dist/account/delete.js.map +7 -0
- package/dist/account/didit.js +34 -0
- package/dist/account/didit.js.map +7 -0
- package/dist/account/dismissed-tips.js +33 -0
- package/dist/account/dismissed-tips.js.map +7 -0
- package/dist/account/email.js +84 -0
- package/dist/account/email.js.map +7 -0
- package/dist/account/entitlements.js +47 -0
- package/dist/account/entitlements.js.map +7 -0
- package/dist/account/identity.js +270 -0
- package/dist/account/identity.js.map +7 -0
- package/dist/account/index.js +93 -0
- package/dist/account/index.js.map +7 -0
- package/dist/account/notifications.js +59 -0
- package/dist/account/notifications.js.map +7 -0
- package/dist/account/password.js +103 -0
- package/dist/account/password.js.map +7 -0
- package/dist/account/profile.js +116 -0
- package/dist/account/profile.js.map +7 -0
- package/dist/account/recovery.js +13 -0
- package/dist/account/recovery.js.map +7 -0
- package/dist/account/relevance.js +82 -0
- package/dist/account/relevance.js.map +7 -0
- package/dist/account/sessions.js +37 -0
- package/dist/account/sessions.js.map +7 -0
- package/dist/account/settings.js +39 -0
- package/dist/account/settings.js.map +7 -0
- package/dist/account/table-views.js +16 -0
- package/dist/account/table-views.js.map +7 -0
- package/dist/ai/AiAnswer.js +83 -0
- package/dist/ai/AiAnswer.js.map +7 -0
- package/dist/ai/AiMarkdown.js +40 -0
- package/dist/ai/AiMarkdown.js.map +7 -0
- package/dist/ai/ArtifactCanvas.js +193 -0
- package/dist/ai/ArtifactCanvas.js.map +7 -0
- package/dist/ai/CitationRenderer.js +413 -0
- package/dist/ai/CitationRenderer.js.map +7 -0
- package/dist/{chunk-WL2Y2T47.js → ai/MarkdownRenderer.js} +35 -101
- package/dist/ai/MarkdownRenderer.js.map +7 -0
- package/dist/ai/MessageArtifactCard.js +75 -0
- package/dist/ai/MessageArtifactCard.js.map +7 -0
- package/dist/ai/PassageCard.js +79 -0
- package/dist/ai/PassageCard.js.map +7 -0
- package/dist/ai/engine.js +110 -0
- package/dist/ai/engine.js.map +7 -0
- package/dist/ai/index.js +63 -0
- package/dist/ai/index.js.map +7 -0
- package/dist/ai/markdown-base-components.js +37 -0
- package/dist/ai/markdown-base-components.js.map +7 -0
- package/dist/ai/markdown-streaming-context.js +6 -0
- package/dist/ai/markdown-streaming-context.js.map +7 -0
- package/dist/{chunk-VSCU7K4V.js → ai/normalize-citations.js} +12 -19
- package/dist/ai/normalize-citations.js.map +7 -0
- package/dist/ai/redline.js +41 -0
- package/dist/ai/redline.js.map +7 -0
- package/dist/ai/split-markdown-blocks.js +40 -0
- package/dist/ai/split-markdown-blocks.js.map +7 -0
- package/dist/{chunk-UW2SGTI5.js → ai/stored-markdown.js} +41 -93
- package/dist/ai/stored-markdown.js.map +7 -0
- package/dist/annotations/AnnotationPageOverlay.js +807 -0
- package/dist/annotations/AnnotationPageOverlay.js.map +7 -0
- package/dist/annotations/AnnotationToolbar.js +398 -0
- package/dist/annotations/AnnotationToolbar.js.map +7 -0
- package/dist/annotations/FreezeDialog.js +170 -0
- package/dist/annotations/FreezeDialog.js.map +7 -0
- package/dist/annotations/ProductionDialog.js +354 -0
- package/dist/annotations/ProductionDialog.js.map +7 -0
- package/dist/annotations/controller.js +49 -0
- package/dist/annotations/controller.js.map +7 -0
- package/dist/annotations/freeze/browser.js +21 -0
- package/dist/annotations/freeze/browser.js.map +7 -0
- package/dist/annotations/freeze/bundle.js +201 -0
- package/dist/annotations/freeze/bundle.js.map +7 -0
- package/dist/annotations/freeze/coords.js +37 -0
- package/dist/annotations/freeze/coords.js.map +7 -0
- package/dist/annotations/freeze/freeze.js +261 -0
- package/dist/annotations/freeze/freeze.js.map +7 -0
- package/dist/annotations/freeze/hash.js +28 -0
- package/dist/annotations/freeze/hash.js.map +7 -0
- package/dist/annotations/freeze/index-page.js +78 -0
- package/dist/annotations/freeze/index-page.js.map +7 -0
- package/dist/annotations/freeze/index.d.ts +1 -1
- package/dist/annotations/freeze/index.js +28 -22
- package/dist/annotations/freeze/index.js.map +7 -1
- package/dist/annotations/freeze/raster.js +208 -0
- package/dist/annotations/freeze/raster.js.map +7 -0
- package/dist/annotations/freeze/stamp.js +117 -0
- package/dist/annotations/freeze/stamp.js.map +7 -0
- package/dist/annotations/freeze/types.js +14 -0
- package/dist/annotations/freeze/types.js.map +7 -0
- package/dist/annotations/freeze/vector.js +283 -0
- package/dist/annotations/freeze/vector.js.map +7 -0
- package/dist/annotations/geometry.js +81 -0
- package/dist/annotations/geometry.js.map +7 -0
- package/dist/annotations/index.js +125 -6
- package/dist/annotations/index.js.map +7 -1
- package/dist/annotations/merge.js +53 -0
- package/dist/annotations/merge.js.map +7 -0
- package/dist/{chunk-T3USOSVN.js → annotations/model.js} +23 -16
- package/dist/annotations/model.js.map +7 -0
- package/dist/annotations/overlay-geometry.js +41 -0
- package/dist/annotations/overlay-geometry.js.map +7 -0
- package/dist/annotations/redaction-log.js +33 -0
- package/dist/annotations/redaction-log.js.map +7 -0
- package/dist/annotations/selection-marks.js +122 -0
- package/dist/annotations/selection-marks.js.map +7 -0
- package/dist/annotations/state.js +140 -0
- package/dist/annotations/state.js.map +7 -0
- package/dist/annotations/store.js +49 -0
- package/dist/annotations/store.js.map +7 -0
- package/dist/annotations/useAnnotationLayer.js +306 -0
- package/dist/annotations/useAnnotationLayer.js.map +7 -0
- package/dist/annotations/useAnnotationShortcuts.js +31 -0
- package/dist/annotations/useAnnotationShortcuts.js.map +7 -0
- package/dist/annotations/useTextSelectionMarks.js +100 -0
- package/dist/annotations/useTextSelectionMarks.js.map +7 -0
- package/dist/artifacts/artifact-kind.js +19 -0
- package/dist/artifacts/artifact-kind.js.map +7 -0
- package/dist/artifacts/index.cjs +13 -13
- package/dist/artifacts/index.js +89 -571
- package/dist/artifacts/index.js.map +7 -1
- package/dist/{chunk-WUTL62MC.js → artifacts/normalize-markdown.js} +12 -14
- package/dist/artifacts/normalize-markdown.js.map +7 -0
- package/dist/artifacts/redline-core.js +12 -3
- package/dist/artifacts/redline-core.js.map +7 -1
- package/dist/{chunk-74N436VK.js → artifacts/redline-diff.js} +10 -9
- package/dist/artifacts/redline-diff.js.map +7 -0
- package/dist/artifacts/redline-engine.js +14 -0
- package/dist/artifacts/redline-engine.js.map +7 -0
- package/dist/artifacts/renderArtifactMarkdown.js +9 -0
- package/dist/artifacts/renderArtifactMarkdown.js.map +7 -0
- package/dist/artifacts/useArtifactEditSession.js +183 -0
- package/dist/artifacts/useArtifactEditSession.js.map +7 -0
- package/dist/artifacts/useArtifactSession.js +173 -0
- package/dist/artifacts/useArtifactSession.js.map +7 -0
- package/dist/artifacts/useArtifactSource.js +16 -0
- package/dist/artifacts/useArtifactSource.js.map +7 -0
- package/dist/artifacts/useArtifactText.js +78 -0
- package/dist/artifacts/useArtifactText.js.map +7 -0
- package/dist/artifacts/useRedline.js +65 -0
- package/dist/artifacts/useRedline.js.map +7 -0
- package/dist/artifacts/useStreamedArtifact.js +74 -0
- package/dist/artifacts/useStreamedArtifact.js.map +7 -0
- package/dist/artifacts/versions.js +68 -0
- package/dist/artifacts/versions.js.map +7 -0
- package/dist/billing.js +200 -0
- package/dist/billing.js.map +7 -0
- package/dist/boot-timeout.js +19 -0
- package/dist/boot-timeout.js.map +7 -0
- package/dist/calendar/accounts.js +213 -0
- package/dist/calendar/accounts.js.map +7 -0
- package/dist/calendar/hooks.js +409 -0
- package/dist/calendar/hooks.js.map +7 -0
- package/dist/calendar/index.js +31 -0
- package/dist/calendar/index.js.map +7 -0
- package/dist/calendar/keys.js +5 -0
- package/dist/calendar/keys.js.map +7 -0
- package/dist/calendar/offline/outbox.js +231 -0
- package/dist/calendar/offline/outbox.js.map +7 -0
- package/dist/calendar/offline/runtime.js +109 -0
- package/dist/calendar/offline/runtime.js.map +7 -0
- package/dist/calendar/offline/support.js +41 -0
- package/dist/calendar/offline/support.js.map +7 -0
- package/dist/calendar/support.js +34 -0
- package/dist/calendar/support.js.map +7 -0
- package/dist/calls/actions.js +226 -0
- package/dist/calls/actions.js.map +7 -0
- package/dist/calls/events.js +138 -0
- package/dist/calls/events.js.map +7 -0
- package/dist/calls/gate.js +19 -0
- package/dist/calls/gate.js.map +7 -0
- package/dist/calls/hooks.js +115 -0
- package/dist/calls/hooks.js.map +7 -0
- package/dist/calls/in-call-chat.js +132 -0
- package/dist/calls/in-call-chat.js.map +7 -0
- package/dist/calls/index.js +24 -0
- package/dist/calls/index.js.map +7 -0
- package/dist/calls/keys.js +17 -0
- package/dist/calls/keys.js.map +7 -0
- package/dist/calls/livekit/index.cjs +48 -48
- package/dist/calls/livekit/index.js +6 -958
- package/dist/calls/livekit/index.js.map +7 -1
- package/dist/calls/livekit/room.js +98 -0
- package/dist/calls/livekit/room.js.map +7 -0
- package/dist/calls/livekit/useCallRecorder.js +219 -0
- package/dist/calls/livekit/useCallRecorder.js.map +7 -0
- package/dist/calls/livekit/useCallTranscriber.js +309 -0
- package/dist/calls/livekit/useCallTranscriber.js.map +7 -0
- package/dist/calls/livekit/useHostMuteNotice.js +29 -0
- package/dist/calls/livekit/useHostMuteNotice.js.map +7 -0
- package/dist/calls/livekit/useInCallChat.js +161 -0
- package/dist/calls/livekit/useInCallChat.js.map +7 -0
- package/dist/calls/livekit/useWebinar.js +239 -0
- package/dist/calls/livekit/useWebinar.js.map +7 -0
- package/dist/calls/meeting-chat.js +149 -0
- package/dist/calls/meeting-chat.js.map +7 -0
- package/dist/calls/moderation.js +50 -0
- package/dist/calls/moderation.js.map +7 -0
- package/dist/calls/open-meeting-chat.js +29 -0
- package/dist/calls/open-meeting-chat.js.map +7 -0
- package/dist/calls/read-only.js +24 -0
- package/dist/calls/read-only.js.map +7 -0
- package/dist/calls/recording-media.js +218 -0
- package/dist/calls/recording-media.js.map +7 -0
- package/dist/calls/recording-playback.js +260 -0
- package/dist/calls/recording-playback.js.map +7 -0
- package/dist/calls/recording.js +268 -0
- package/dist/calls/recording.js.map +7 -0
- package/dist/calls/save-to-thread.js +80 -0
- package/dist/calls/save-to-thread.js.map +7 -0
- package/dist/calls/session.js +134 -0
- package/dist/calls/session.js.map +7 -0
- package/dist/calls/transcript-format.js +147 -0
- package/dist/calls/transcript-format.js.map +7 -0
- package/dist/calls/transcription.js +101 -0
- package/dist/calls/transcription.js.map +7 -0
- package/dist/calls/webinar.js +71 -0
- package/dist/calls/webinar.js.map +7 -0
- package/dist/charge-watch.js +71 -0
- package/dist/charge-watch.js.map +7 -0
- package/dist/chat/ChatBubble.js +146 -0
- package/dist/chat/ChatBubble.js.map +7 -0
- package/dist/chat/ConversationScope.js +30 -0
- package/dist/chat/ConversationScope.js.map +7 -0
- package/dist/chat/active-config.js +20 -0
- package/dist/chat/active-config.js.map +7 -0
- package/dist/chat/agent-chat-owner.js +25 -0
- package/dist/chat/agent-chat-owner.js.map +7 -0
- package/dist/chat/chat-artifacts.js +64 -0
- package/dist/chat/chat-artifacts.js.map +7 -0
- package/dist/chat/citations.js +32 -0
- package/dist/chat/citations.js.map +7 -0
- package/dist/chat/config-model.js +10 -0
- package/dist/chat/config-model.js.map +7 -0
- package/dist/chat/conversation-cache.js +676 -0
- package/dist/chat/conversation-cache.js.map +7 -0
- package/dist/chat/conversation-events.js +57 -0
- package/dist/chat/conversation-events.js.map +7 -0
- package/dist/chat/conversation-mentions.js +58 -0
- package/dist/chat/conversation-mentions.js.map +7 -0
- package/dist/chat/conversation-workspace.js +58 -0
- package/dist/chat/conversation-workspace.js.map +7 -0
- package/dist/chat/mentions.js +116 -0
- package/dist/chat/mentions.js.map +7 -0
- package/dist/chat/open-document.js +106 -0
- package/dist/chat/open-document.js.map +7 -0
- package/dist/chat/orphaned.js +44 -0
- package/dist/chat/orphaned.js.map +7 -0
- package/dist/chat/pendingFirstTurn.js +30 -0
- package/dist/chat/pendingFirstTurn.js.map +7 -0
- package/dist/chat/reply-target.js +12 -0
- package/dist/chat/reply-target.js.map +7 -0
- package/dist/chat/run-finished.js +28 -0
- package/dist/chat/run-finished.js.map +7 -0
- package/dist/chat/run-state.js +91 -0
- package/dist/chat/run-state.js.map +7 -0
- package/dist/chat/stream-handlers.js +419 -0
- package/dist/chat/stream-handlers.js.map +7 -0
- package/dist/chat/thread-binding.js +76 -0
- package/dist/chat/thread-binding.js.map +7 -0
- package/dist/chat/thread-document.js +53 -0
- package/dist/chat/thread-document.js.map +7 -0
- package/dist/chat/turn-control.js +79 -0
- package/dist/chat/turn-control.js.map +7 -0
- package/dist/chat/useAgentRunControl.js +36 -0
- package/dist/chat/useAgentRunControl.js.map +7 -0
- package/dist/chat/useAnswerAgentQuestion.js +19 -0
- package/dist/chat/useAnswerAgentQuestion.js.map +7 -0
- package/dist/chat/useAskAgain.js +32 -0
- package/dist/chat/useAskAgain.js.map +7 -0
- package/dist/chat/useAutoSendDraft.js +17 -0
- package/dist/chat/useAutoSendDraft.js.map +7 -0
- package/dist/chat/useBranchNavigation.js +97 -0
- package/dist/chat/useBranchNavigation.js.map +7 -0
- package/dist/chat/useConnectRunStream.js +169 -0
- package/dist/chat/useConnectRunStream.js.map +7 -0
- package/dist/chat/useConversation.js +431 -0
- package/dist/chat/useConversation.js.map +7 -0
- package/dist/chat/useConversationActions.js +662 -0
- package/dist/chat/useConversationActions.js.map +7 -0
- package/dist/chat/useConversationData.js +143 -0
- package/dist/chat/useConversationData.js.map +7 -0
- package/dist/chat/useConversationDocuments.js +41 -0
- package/dist/chat/useConversationDocuments.js.map +7 -0
- package/dist/chat/useConversationSettings.js +78 -0
- package/dist/chat/useConversationSettings.js.map +7 -0
- package/dist/chat/useConversationTurn.js +31 -0
- package/dist/chat/useConversationTurn.js.map +7 -0
- package/dist/chat/useConversationWorkspace.js +12 -0
- package/dist/chat/useConversationWorkspace.js.map +7 -0
- package/dist/chat/useDeleteMessage.js +15 -0
- package/dist/chat/useDeleteMessage.js.map +7 -0
- package/dist/chat/useDocumentAutoAdd.js +73 -0
- package/dist/chat/useDocumentAutoAdd.js.map +7 -0
- package/dist/chat/useMessageTimer.js +39 -0
- package/dist/chat/useMessageTimer.js.map +7 -0
- package/dist/chat/useThinkingContent.js +67 -0
- package/dist/chat/useThinkingContent.js.map +7 -0
- package/dist/chat/useThreadDocument.js +61 -0
- package/dist/chat/useThreadDocument.js.map +7 -0
- package/dist/chat/workflow-run-titles.js +50 -0
- package/dist/chat/workflow-run-titles.js.map +7 -0
- package/dist/{chunk-W2FATOTX.cjs → chunk-3JAEX57E.cjs} +4 -4
- package/dist/{chunk-W2FATOTX.cjs.map → chunk-3JAEX57E.cjs.map} +1 -1
- package/dist/{chunk-HD5H2PPP.cjs → chunk-5TRUFWKT.cjs} +66 -66
- package/dist/{chunk-HD5H2PPP.cjs.map → chunk-5TRUFWKT.cjs.map} +1 -1
- package/dist/{chunk-Z3W4XFWB.cjs → chunk-C72FSQUE.cjs} +3 -3
- package/dist/{chunk-Z3W4XFWB.cjs.map → chunk-C72FSQUE.cjs.map} +1 -1
- package/dist/{chunk-LBAG7KL7.cjs → chunk-FQVNZCTD.cjs} +3 -3
- package/dist/{chunk-LBAG7KL7.cjs.map → chunk-FQVNZCTD.cjs.map} +1 -1
- package/dist/{chunk-RVUGSM65.cjs → chunk-GKGAPU6T.cjs} +44 -44
- package/dist/{chunk-RVUGSM65.cjs.map → chunk-GKGAPU6T.cjs.map} +1 -1
- package/dist/{chunk-7LIMHY56.cjs → chunk-O32T7XRD.cjs} +3 -3
- package/dist/{chunk-7LIMHY56.cjs.map → chunk-O32T7XRD.cjs.map} +1 -1
- package/dist/chunk-PWGSIM3F.cjs +291 -0
- package/dist/chunk-PWGSIM3F.cjs.map +1 -0
- package/dist/chunk-QP3WQSAA.cjs +23 -0
- package/dist/chunk-QP3WQSAA.cjs.map +1 -0
- package/dist/chunk-T5FZICXN.cjs +50 -0
- package/dist/chunk-T5FZICXN.cjs.map +1 -0
- package/dist/{chunk-QF2BW6HZ.cjs → chunk-UDDJIUHJ.cjs} +38 -38
- package/dist/{chunk-QF2BW6HZ.cjs.map → chunk-UDDJIUHJ.cjs.map} +1 -1
- package/dist/{chunk-5HDKL6XB.cjs → chunk-YMB6XUR2.cjs} +57 -57
- package/dist/{chunk-5HDKL6XB.cjs.map → chunk-YMB6XUR2.cjs.map} +1 -1
- package/dist/config/config-hooks.js +209 -0
- package/dist/config/config-hooks.js.map +7 -0
- package/dist/connectivity.js +72 -0
- package/dist/connectivity.js.map +7 -0
- package/dist/connectors/hooks.js +263 -0
- package/dist/connectors/hooks.js.map +7 -0
- package/dist/connectors/index.js +28 -0
- package/dist/connectors/index.js.map +7 -0
- package/dist/contacts.js +100 -0
- package/dist/contacts.js.map +7 -0
- package/dist/conversation-list.js +65 -0
- package/dist/conversation-list.js.map +7 -0
- package/dist/databases.js +195 -0
- package/dist/databases.js.map +7 -0
- package/dist/datasets/aggregate.js +281 -0
- package/dist/datasets/aggregate.js.map +7 -0
- package/dist/datasets/index.js +122 -0
- package/dist/datasets/index.js.map +7 -0
- package/dist/datasets/members.js +27 -0
- package/dist/datasets/members.js.map +7 -0
- package/dist/datasets/panel.js +44 -0
- package/dist/datasets/panel.js.map +7 -0
- package/dist/datasets/registry.js +47 -0
- package/dist/datasets/registry.js.map +7 -0
- package/dist/datasets/rows-source.js +44 -0
- package/dist/datasets/rows-source.js.map +7 -0
- package/dist/datasets/sources/activity.js +83 -0
- package/dist/datasets/sources/activity.js.map +7 -0
- package/dist/datasets/sources/conversations.js +74 -0
- package/dist/datasets/sources/conversations.js.map +7 -0
- package/dist/datasets/sources/database.js +209 -0
- package/dist/datasets/sources/database.js.map +7 -0
- package/dist/datasets/sources/documents.js +93 -0
- package/dist/datasets/sources/documents.js.map +7 -0
- package/dist/datasets/sources/facts.js +56 -0
- package/dist/datasets/sources/facts.js.map +7 -0
- package/dist/datasets/sources/projects.js +117 -0
- package/dist/datasets/sources/projects.js.map +7 -0
- package/dist/datasets/sources/tags.js +67 -0
- package/dist/datasets/sources/tags.js.map +7 -0
- package/dist/datasets/sources/usage.js +268 -0
- package/dist/datasets/sources/usage.js.map +7 -0
- package/dist/datasets/sources/workflows.js +91 -0
- package/dist/datasets/sources/workflows.js.map +7 -0
- package/dist/datasets/sources/workspaces.js +67 -0
- package/dist/datasets/sources/workspaces.js.map +7 -0
- package/dist/datasets/store.js +194 -0
- package/dist/datasets/store.js.map +7 -0
- package/dist/datasets/types.js +14 -0
- package/dist/datasets/types.js.map +7 -0
- package/dist/directmessages/ConversationList.js +148 -0
- package/dist/directmessages/ConversationList.js.map +7 -0
- package/dist/directmessages/DateSeparator.js +8 -0
- package/dist/directmessages/DateSeparator.js.map +7 -0
- package/dist/directmessages/DmAvatar.js +29 -0
- package/dist/directmessages/DmAvatar.js.map +7 -0
- package/dist/directmessages/DmComposer.js +201 -0
- package/dist/directmessages/DmComposer.js.map +7 -0
- package/dist/directmessages/arrivals.js +29 -0
- package/dist/directmessages/arrivals.js.map +7 -0
- package/dist/directmessages/chat-cache.js +192 -0
- package/dist/directmessages/chat-cache.js.map +7 -0
- package/dist/directmessages/grouping.js +26 -0
- package/dist/directmessages/grouping.js.map +7 -0
- package/dist/directmessages/index.js +81 -0
- package/dist/directmessages/index.js.map +7 -0
- package/dist/directmessages/useChats.js +266 -0
- package/dist/directmessages/useChats.js.map +7 -0
- package/dist/directmessages/utils.js +23 -0
- package/dist/directmessages/utils.js.map +7 -0
- package/dist/document-tools/can-annotate.js +7 -0
- package/dist/document-tools/can-annotate.js.map +7 -0
- package/dist/document-tools/core.cjs +99 -99
- package/dist/document-tools/core.d.ts +2 -2
- package/dist/document-tools/core.js +218 -12
- package/dist/document-tools/core.js.map +7 -1
- package/dist/document-tools/document-pdf.js +76 -0
- package/dist/document-tools/document-pdf.js.map +7 -0
- package/dist/document-tools/environment.js +136 -0
- package/dist/document-tools/environment.js.map +7 -0
- package/dist/document-tools/file-shares.js +112 -0
- package/dist/document-tools/file-shares.js.map +7 -0
- package/dist/document-tools/frozen-copy.js +27 -0
- package/dist/document-tools/frozen-copy.js.map +7 -0
- package/dist/document-tools/index.cjs +101 -101
- package/dist/document-tools/index.d.ts +1 -1
- package/dist/document-tools/index.js +26 -148
- package/dist/document-tools/index.js.map +7 -1
- package/dist/document-tools/markup-download.js +51 -0
- package/dist/document-tools/markup-download.js.map +7 -0
- package/dist/document-tools/markup-store.js +138 -0
- package/dist/document-tools/markup-store.js.map +7 -0
- package/dist/document-tools/markup-transfer.js +88 -0
- package/dist/document-tools/markup-transfer.js.map +7 -0
- package/dist/document-tools/production.js +147 -0
- package/dist/document-tools/production.js.map +7 -0
- package/dist/document-tools/saved-signature.js +90 -0
- package/dist/document-tools/saved-signature.js.map +7 -0
- package/dist/document-tools/signature-requests.js +310 -0
- package/dist/document-tools/signature-requests.js.map +7 -0
- package/dist/document-tools/signing.js +127 -0
- package/dist/document-tools/signing.js.map +7 -0
- package/dist/document-tools/useDocumentBytes.js +38 -0
- package/dist/document-tools/useDocumentBytes.js.map +7 -0
- package/dist/document-tools/useDocumentMarkup.js +154 -0
- package/dist/document-tools/useDocumentMarkup.js.map +7 -0
- package/dist/document-tools/useIsOnline.js +13 -0
- package/dist/document-tools/useIsOnline.js.map +7 -0
- package/dist/document-tools/verification.js +60 -0
- package/dist/document-tools/verification.js.map +7 -0
- package/dist/documents/DocumentReview.js +220 -0
- package/dist/documents/DocumentReview.js.map +7 -0
- package/dist/documents/DraftTitleControls.js +41 -0
- package/dist/documents/DraftTitleControls.js.map +7 -0
- package/dist/documents/InlineMicButton.js +90 -0
- package/dist/documents/InlineMicButton.js.map +7 -0
- package/dist/documents/MicRecordingOverlay.js +29 -0
- package/dist/documents/MicRecordingOverlay.js.map +7 -0
- package/dist/documents/MicWaveformIndicator.js +68 -0
- package/dist/documents/MicWaveformIndicator.js.map +7 -0
- package/dist/documents/PhotoCapture.js +120 -0
- package/dist/documents/PhotoCapture.js.map +7 -0
- package/dist/documents/VideoCapture.js +129 -0
- package/dist/documents/VideoCapture.js.map +7 -0
- package/dist/documents/VoiceNoteRecorder.js +166 -0
- package/dist/documents/VoiceNoteRecorder.js.map +7 -0
- package/dist/documents/audio-segmenter.js +63 -0
- package/dist/documents/audio-segmenter.js.map +7 -0
- package/dist/documents/capture-frame.js +21 -0
- package/dist/documents/capture-frame.js.map +7 -0
- package/dist/documents/chunked-recorder.js +190 -0
- package/dist/documents/chunked-recorder.js.map +7 -0
- package/dist/documents/document-download.js +53 -0
- package/dist/documents/document-download.js.map +7 -0
- package/dist/documents/document-fields.js +109 -0
- package/dist/documents/document-fields.js.map +7 -0
- package/dist/documents/documents-cache.js +110 -0
- package/dist/documents/documents-cache.js.map +7 -0
- package/dist/documents/documents-data.js +128 -0
- package/dist/documents/documents-data.js.map +7 -0
- package/dist/documents/documents-loader.js +113 -0
- package/dist/documents/documents-loader.js.map +7 -0
- package/dist/documents/documents-writes.js +448 -0
- package/dist/documents/documents-writes.js.map +7 -0
- package/dist/documents/format-elapsed.js +10 -0
- package/dist/documents/format-elapsed.js.map +7 -0
- package/dist/documents/has-video-track.js +26 -0
- package/dist/documents/has-video-track.js.map +7 -0
- package/dist/documents/index.js +266 -0
- package/dist/documents/index.js.map +7 -0
- package/dist/documents/media-error.js +18 -0
- package/dist/documents/media-error.js.map +7 -0
- package/dist/documents/offline-documents.js +160 -0
- package/dist/documents/offline-documents.js.map +7 -0
- package/dist/documents/pending-sync.js +210 -0
- package/dist/documents/pending-sync.js.map +7 -0
- package/dist/documents/processing-live.js +122 -0
- package/dist/documents/processing-live.js.map +7 -0
- package/dist/documents/processing-order.js +59 -0
- package/dist/documents/processing-order.js.map +7 -0
- package/dist/documents/processing-settle.js +21 -0
- package/dist/documents/processing-settle.js.map +7 -0
- package/dist/documents/related-documents.js +133 -0
- package/dist/documents/related-documents.js.map +7 -0
- package/dist/documents/support.js +29 -0
- package/dist/documents/support.js.map +7 -0
- package/dist/documents/upload-files.js +169 -0
- package/dist/documents/upload-files.js.map +7 -0
- package/dist/documents/useAudioRecorder.js +315 -0
- package/dist/documents/useAudioRecorder.js.map +7 -0
- package/dist/documents/useCameraStream.js +35 -0
- package/dist/documents/useCameraStream.js.map +7 -0
- package/dist/documents/useDocumentThumbnails.js +71 -0
- package/dist/documents/useDocumentThumbnails.js.map +7 -0
- package/dist/documents/useDownloadDocuments.js +90 -0
- package/dist/documents/useDownloadDocuments.js.map +7 -0
- package/dist/documents/usePassageQuotes.js +37 -0
- package/dist/documents/usePassageQuotes.js.map +7 -0
- package/dist/documents/useUploadFiles.js +165 -0
- package/dist/documents/useUploadFiles.js.map +7 -0
- package/dist/documents/useUploadFromUrls.js +63 -0
- package/dist/documents/useUploadFromUrls.js.map +7 -0
- package/dist/documents/useVideoRecorder.js +62 -0
- package/dist/documents/useVideoRecorder.js.map +7 -0
- package/dist/entities/AgentMarkers.js +61 -0
- package/dist/entities/AgentMarkers.js.map +7 -0
- package/dist/entities/DocumentEntity.js +125 -0
- package/dist/entities/DocumentEntity.js.map +7 -0
- package/dist/entities/EntityPill.js +250 -0
- package/dist/entities/EntityPill.js.map +7 -0
- package/dist/entities/ProjectEntity.js +61 -0
- package/dist/entities/ProjectEntity.js.map +7 -0
- package/dist/entities/ShieldIcon.js +49 -0
- package/dist/entities/ShieldIcon.js.map +7 -0
- package/dist/entities/TagEntity.js +79 -0
- package/dist/entities/TagEntity.js.map +7 -0
- package/dist/entities/ThreadVisibilityIcon.js +15 -0
- package/dist/entities/ThreadVisibilityIcon.js.map +7 -0
- package/dist/entities/UserEntity.js +211 -0
- package/dist/entities/UserEntity.js.map +7 -0
- package/dist/entities/VerifiedBadge.js +19 -0
- package/dist/entities/VerifiedBadge.js.map +7 -0
- package/dist/entities/agent-avatar-colors.js +26 -0
- package/dist/entities/agent-avatar-colors.js.map +7 -0
- package/dist/entities/colors.js +64 -0
- package/dist/entities/colors.js.map +7 -0
- package/dist/entities/file-type.js +151 -0
- package/dist/entities/file-type.js.map +7 -0
- package/dist/entities/index.js +100 -0
- package/dist/entities/index.js.map +7 -0
- package/dist/entities/media-type.js +61 -0
- package/dist/entities/media-type.js.map +7 -0
- package/dist/entities/registry.js +385 -0
- package/dist/entities/registry.js.map +7 -0
- package/dist/entities/status.js +43 -0
- package/dist/entities/status.js.map +7 -0
- package/dist/entities/tag-kinds.js +23 -0
- package/dist/entities/tag-kinds.js.map +7 -0
- package/dist/entities/tag-types.js +44 -0
- package/dist/entities/tag-types.js.map +7 -0
- package/dist/entities/vocabulary.js +12 -0
- package/dist/entities/vocabulary.js.map +7 -0
- package/dist/entity-extraction.js +25 -0
- package/dist/entity-extraction.js.map +7 -0
- package/dist/facts-search.js +57 -0
- package/dist/facts-search.js.map +7 -0
- package/dist/facts.js +69 -0
- package/dist/facts.js.map +7 -0
- package/dist/hooks.js +320 -0
- package/dist/hooks.js.map +7 -0
- package/dist/host/ArbiHost.js +24 -0
- package/dist/host/ArbiHost.js.map +7 -0
- package/dist/host/assistant-copy.js +54 -0
- package/dist/host/assistant-copy.js.map +7 -0
- package/dist/host/config.js +9 -0
- package/dist/host/config.js.map +7 -0
- package/dist/host/context.js +10 -0
- package/dist/host/context.js.map +7 -0
- package/dist/host/features.js +144 -0
- package/dist/host/features.js.map +7 -0
- package/dist/host/index.js +12 -0
- package/dist/host/index.js.map +7 -0
- package/dist/{chunk-DPYBZDJB.js → host/merge.js} +7 -7
- package/dist/host/merge.js.map +7 -0
- package/dist/house-template.js +40 -0
- package/dist/house-template.js.map +7 -0
- package/dist/icons/AppleIcon.js +25 -0
- package/dist/icons/AppleIcon.js.map +7 -0
- package/dist/icons/ArbiBotHeadIcon.js +46 -0
- package/dist/icons/ArbiBotHeadIcon.js.map +7 -0
- package/dist/icons/ArbiIcon.js +24 -0
- package/dist/icons/ArbiIcon.js.map +7 -0
- package/dist/icons/AudIcon.js +56 -0
- package/dist/icons/AudIcon.js.map +7 -0
- package/dist/icons/ClaudeIcon.js +28 -0
- package/dist/icons/ClaudeIcon.js.map +7 -0
- package/dist/icons/DocIcon.js +56 -0
- package/dist/icons/DocIcon.js.map +7 -0
- package/dist/icons/EmlIcon.js +57 -0
- package/dist/icons/EmlIcon.js.map +7 -0
- package/dist/icons/FireworksIcon.js +47 -0
- package/dist/icons/FireworksIcon.js.map +7 -0
- package/dist/icons/GeminiIcon.js +37 -0
- package/dist/icons/GeminiIcon.js.map +7 -0
- package/dist/icons/GitHubIcon.js +32 -0
- package/dist/icons/GitHubIcon.js.map +7 -0
- package/dist/icons/GoogleIcon.js +53 -0
- package/dist/icons/GoogleIcon.js.map +7 -0
- package/dist/icons/HtmlIcon.js +56 -0
- package/dist/icons/HtmlIcon.js.map +7 -0
- package/dist/icons/ImgIcon.js +56 -0
- package/dist/icons/ImgIcon.js.map +7 -0
- package/dist/icons/LinkedInIcon.js +25 -0
- package/dist/icons/LinkedInIcon.js.map +7 -0
- package/dist/icons/OpenAIIcon.js +28 -0
- package/dist/icons/OpenAIIcon.js.map +7 -0
- package/dist/icons/PdfIcon.js +56 -0
- package/dist/icons/PdfIcon.js.map +7 -0
- package/dist/icons/ProviderIcon.js +42 -0
- package/dist/icons/ProviderIcon.js.map +7 -0
- package/dist/icons/TxtIcon.js +56 -0
- package/dist/icons/TxtIcon.js.map +7 -0
- package/dist/icons/VidIcon.js +56 -0
- package/dist/icons/VidIcon.js.map +7 -0
- package/dist/icons/XlsIcon.js +56 -0
- package/dist/icons/XlsIcon.js.map +7 -0
- package/dist/icons/arbi-mark.js +5 -0
- package/dist/icons/arbi-mark.js.map +7 -0
- package/dist/icons/colors.js +31 -0
- package/dist/icons/colors.js.map +7 -0
- package/dist/icons/file-type.js +105 -0
- package/dist/icons/file-type.js.map +7 -0
- package/dist/icons/index.js +55 -0
- package/dist/icons/index.js.map +7 -0
- package/dist/imagecrop/ImageCropModal.js +56 -0
- package/dist/imagecrop/ImageCropModal.js.map +7 -0
- package/dist/imagecrop/ImageCropper.js +100 -0
- package/dist/imagecrop/ImageCropper.js.map +7 -0
- package/dist/imagecrop/cropImage.js +43 -0
- package/dist/imagecrop/cropImage.js.map +7 -0
- package/dist/imagecrop/index.js +13 -0
- package/dist/imagecrop/index.js.map +7 -0
- package/dist/index.cjs +1689 -1619
- package/dist/index.cjs.map +1 -1
- package/dist/{index.d-BMhTH98a.d.ts → index.d-CYXcTKYt.d.ts} +1 -0
- package/dist/index.d.ts +38 -8
- package/dist/index.js +702 -17060
- package/dist/index.js.map +7 -1
- package/dist/lazy-chunk.d-B6YDLMKI.d.ts +31 -0
- package/dist/lazy-chunk.js +46 -0
- package/dist/lazy-chunk.js.map +7 -0
- package/dist/lib/collision-padding.js +13 -0
- package/dist/lib/collision-padding.js.map +7 -0
- package/dist/lib/format-friendly-date.js +55 -0
- package/dist/lib/format-friendly-date.js.map +7 -0
- package/dist/lib/format-relative-time.js +52 -0
- package/dist/lib/format-relative-time.js.map +7 -0
- package/dist/lib/markdown-to-text.js +35 -0
- package/dist/lib/markdown-to-text.js.map +7 -0
- package/dist/lib/toast-interaction.js +9 -0
- package/dist/lib/toast-interaction.js.map +7 -0
- package/dist/lib/utils.js +9 -0
- package/dist/lib/utils.js.map +7 -0
- package/dist/mail/client.js +103 -0
- package/dist/mail/client.js.map +7 -0
- package/dist/mail/document-attachment.js +38 -0
- package/dist/mail/document-attachment.js.map +7 -0
- package/dist/mail/filing.js +132 -0
- package/dist/mail/filing.js.map +7 -0
- package/dist/mail/hooks.js +393 -0
- package/dist/mail/hooks.js.map +7 -0
- package/dist/mail/index.js +120 -0
- package/dist/mail/index.js.map +7 -0
- package/dist/mail/offline/changes.js +258 -0
- package/dist/mail/offline/changes.js.map +7 -0
- package/dist/mail/offline/confirm-sign-out.js +37 -0
- package/dist/mail/offline/confirm-sign-out.js.map +7 -0
- package/dist/mail/offline/crypto.js +26 -0
- package/dist/mail/offline/crypto.js.map +7 -0
- package/dist/mail/offline/drafts.js +69 -0
- package/dist/mail/offline/drafts.js.map +7 -0
- package/dist/mail/offline/hooks.js +104 -0
- package/dist/mail/offline/hooks.js.map +7 -0
- package/dist/mail/offline/index.js +48 -0
- package/dist/mail/offline/index.js.map +7 -0
- package/dist/mail/offline/live.js +233 -0
- package/dist/mail/offline/live.js.map +7 -0
- package/dist/mail/offline/mailbox.js +191 -0
- package/dist/mail/offline/mailbox.js.map +7 -0
- package/dist/mail/offline/outbox.js +167 -0
- package/dist/mail/offline/outbox.js.map +7 -0
- package/dist/mail/offline/reads.js +159 -0
- package/dist/mail/offline/reads.js.map +7 -0
- package/dist/mail/offline/runtime.js +100 -0
- package/dist/mail/offline/runtime.js.map +7 -0
- package/dist/mail/offline/settings.js +84 -0
- package/dist/mail/offline/settings.js.map +7 -0
- package/dist/mail/offline/store.js +29 -0
- package/dist/mail/offline/store.js.map +7 -0
- package/dist/mail/offline/sync.js +251 -0
- package/dist/mail/offline/sync.js.map +7 -0
- package/dist/mail/offline/wipe.js +19 -0
- package/dist/mail/offline/wipe.js.map +7 -0
- package/dist/mail/thread-keys.js +53 -0
- package/dist/mail/thread-keys.js.map +7 -0
- package/dist/mail/threads.js +71 -0
- package/dist/mail/threads.js.map +7 -0
- package/dist/mail/useMailClient.js +42 -0
- package/dist/mail/useMailClient.js.map +7 -0
- package/dist/model-connections.js +58 -0
- package/dist/model-connections.js.map +7 -0
- package/dist/notifications/ActivityFeed.js +70 -0
- package/dist/notifications/ActivityFeed.js.map +7 -0
- package/dist/notifications/NotificationBell.js +200 -0
- package/dist/notifications/NotificationBell.js.map +7 -0
- package/dist/notifications/Toaster.js +24 -0
- package/dist/notifications/Toaster.js.map +7 -0
- package/dist/notifications/activity-types.js +65 -0
- package/dist/notifications/activity-types.js.map +7 -0
- package/dist/notifications/bell.js +24 -0
- package/dist/notifications/bell.js.map +7 -0
- package/dist/notifications/calendar-notifications.js +79 -0
- package/dist/notifications/calendar-notifications.js.map +7 -0
- package/dist/notifications/index.js +108 -0
- package/dist/notifications/index.js.map +7 -0
- package/dist/notifications/live.js +28 -0
- package/dist/notifications/live.js.map +7 -0
- package/dist/notifications/notification-types.js +127 -0
- package/dist/notifications/notification-types.js.map +7 -0
- package/dist/{chunk-BF5KW5ZI.js → notifications/notify-store.js} +24 -74
- package/dist/notifications/notify-store.js.map +7 -0
- package/dist/notifications/server-notifications.js +452 -0
- package/dist/notifications/server-notifications.js.map +7 -0
- package/dist/notifications/useNotifications.js +34 -0
- package/dist/notifications/useNotifications.js.map +7 -0
- package/dist/offline-store/network.js +11 -0
- package/dist/offline-store/network.js.map +7 -0
- package/dist/offline-store/store.js +136 -0
- package/dist/offline-store/store.js.map +7 -0
- package/dist/offline-store/wipe.js +8 -0
- package/dist/offline-store/wipe.js.map +7 -0
- package/dist/offline.js +58 -0
- package/dist/offline.js.map +7 -0
- package/dist/people.js +122 -0
- package/dist/people.js.map +7 -0
- package/dist/projects.js +30 -0
- package/dist/projects.js.map +7 -0
- package/dist/query-client.js +63 -0
- package/dist/query-client.js.map +7 -0
- package/dist/{query-keys.d-ChgpJLPF.d.ts → query-keys.d-B1Am9tIF.d.ts} +1 -1
- package/dist/{chunk-6H3O63TQ.js → query-keys.js} +19 -32
- package/dist/query-keys.js.map +7 -0
- package/dist/query-persist.js +66 -0
- package/dist/query-persist.js.map +7 -0
- package/dist/queued-writes.js +59 -0
- package/dist/queued-writes.js.map +7 -0
- package/dist/remote-control.js +67 -0
- package/dist/remote-control.js.map +7 -0
- package/dist/search/index.js +23 -0
- package/dist/search/index.js.map +7 -0
- package/dist/search/session.js +58 -0
- package/dist/search/session.js.map +7 -0
- package/dist/search/useSemanticSearch.js +82 -0
- package/dist/search/useSemanticSearch.js.map +7 -0
- package/dist/session/chat.js +512 -0
- package/dist/session/chat.js.map +7 -0
- package/dist/session/documents.js +196 -0
- package/dist/session/documents.js.map +7 -0
- package/dist/session/drafts.js +103 -0
- package/dist/session/drafts.js.map +7 -0
- package/dist/session/index.js +123 -0
- package/dist/session/index.js.map +7 -0
- package/dist/session/layout.js +339 -0
- package/dist/session/layout.js.map +7 -0
- package/dist/session/persist.js +106 -0
- package/dist/session/persist.js.map +7 -0
- package/dist/session/session-hooks.js +53 -0
- package/dist/session/session-hooks.js.map +7 -0
- package/dist/session/signed-in.js +36 -0
- package/dist/session/signed-in.js.map +7 -0
- package/dist/session/store.js +166 -0
- package/dist/session/store.js.map +7 -0
- package/dist/session/thread-tabs.js +121 -0
- package/dist/session/thread-tabs.js.map +7 -0
- package/dist/session/ui-state-storage.js +76 -0
- package/dist/session/ui-state-storage.js.map +7 -0
- package/dist/session/workspace.js +77 -0
- package/dist/session/workspace.js.map +7 -0
- package/dist/shell/index.cjs +37 -37
- package/dist/shell/index.js +43 -10
- package/dist/shell/index.js.map +7 -1
- package/dist/skill-pack.js +111 -0
- package/dist/skill-pack.js.map +7 -0
- package/dist/storage.js +186 -0
- package/dist/storage.js.map +7 -0
- package/dist/support/index.js +35 -0
- package/dist/support/index.js.map +7 -0
- package/dist/tags.js +204 -0
- package/dist/tags.js.map +7 -0
- package/dist/ui/DebouncedInput.js +109 -0
- package/dist/ui/DebouncedInput.js.map +7 -0
- package/dist/ui/DictateContext.js +8 -0
- package/dist/ui/DictateContext.js.map +7 -0
- package/dist/ui/IconToggle.js +79 -0
- package/dist/ui/IconToggle.js.map +7 -0
- package/dist/ui/VerifiedToggle.js +38 -0
- package/dist/ui/VerifiedToggle.js.map +7 -0
- package/dist/ui/VisibilityToggle.js +103 -0
- package/dist/ui/VisibilityToggle.js.map +7 -0
- package/dist/ui/avatar.js +40 -0
- package/dist/ui/avatar.js.map +7 -0
- package/dist/ui/badge.js +28 -0
- package/dist/ui/badge.js.map +7 -0
- package/dist/ui/button.js +48 -0
- package/dist/ui/button.js.map +7 -0
- package/dist/ui/card.js +90 -0
- package/dist/ui/card.js.map +7 -0
- package/dist/ui/checkbox.js +22 -0
- package/dist/ui/checkbox.js.map +7 -0
- package/dist/ui/collapsible.js +10 -0
- package/dist/ui/collapsible.js.map +7 -0
- package/dist/ui/command.js +103 -0
- package/dist/ui/command.js.map +7 -0
- package/dist/{chunk-YNNAJJ5Z.js → ui/dialog.js} +30 -68
- package/dist/ui/dialog.js.map +7 -0
- package/dist/{chunk-47CCGUWR.js → ui/dropdown-menu.js} +40 -45
- package/dist/ui/dropdown-menu.js.map +7 -0
- package/dist/ui/hover-card.js +36 -0
- package/dist/ui/hover-card.js.map +7 -0
- package/dist/ui/index.cjs +167 -154
- package/dist/ui/index.d.ts +2 -1
- package/dist/ui/index.js +290 -9
- package/dist/ui/index.js.map +7 -1
- package/dist/ui/input.js +65 -0
- package/dist/ui/input.js.map +7 -0
- package/dist/ui/label.js +16 -0
- package/dist/ui/label.js.map +7 -0
- package/dist/ui/mark-menu.js +300 -0
- package/dist/ui/mark-menu.js.map +7 -0
- package/dist/ui/popover.js +40 -0
- package/dist/ui/popover.js.map +7 -0
- package/dist/ui/portal-container.js +17 -0
- package/dist/ui/portal-container.js.map +7 -0
- package/dist/ui/progress.js +24 -0
- package/dist/ui/progress.js.map +7 -0
- package/dist/ui/radio-group.js +29 -0
- package/dist/ui/radio-group.js.map +7 -0
- package/dist/ui/scroll-area.js +39 -0
- package/dist/ui/scroll-area.js.map +7 -0
- package/dist/ui/select.js +130 -0
- package/dist/ui/select.js.map +7 -0
- package/dist/ui/separator.js +23 -0
- package/dist/ui/separator.js.map +7 -0
- package/dist/ui/slider.js +23 -0
- package/dist/ui/slider.js.map +7 -0
- package/dist/ui/switch.js +28 -0
- package/dist/ui/switch.js.map +7 -0
- package/dist/ui/table.js +75 -0
- package/dist/ui/table.js.map +7 -0
- package/dist/ui/tabs.js +48 -0
- package/dist/ui/tabs.js.map +7 -0
- package/dist/ui/textarea.js +63 -0
- package/dist/ui/textarea.js.map +7 -0
- package/dist/ui/toggle-group.js +43 -0
- package/dist/ui/toggle-group.js.map +7 -0
- package/dist/ui/toggle.js +40 -0
- package/dist/ui/toggle.js.map +7 -0
- package/dist/ui/tooltip.js +215 -0
- package/dist/ui/tooltip.js.map +7 -0
- package/dist/usage-metered.js +8 -0
- package/dist/usage-metered.js.map +7 -0
- package/dist/useArbi.js +16 -0
- package/dist/useArbi.js.map +7 -0
- package/dist/useInstallSkillPack.js +81 -0
- package/dist/useInstallSkillPack.js.map +7 -0
- package/dist/usermenu/UserMenu.js +188 -0
- package/dist/usermenu/UserMenu.js.map +7 -0
- package/dist/usermenu/index.js +5 -0
- package/dist/usermenu/index.js.map +7 -0
- package/dist/users/index.js +15 -0
- package/dist/users/index.js.map +7 -0
- package/dist/users/user-display.js +60 -0
- package/dist/users/user-display.js.map +7 -0
- package/dist/viewers/AudioViewer.js +23 -0
- package/dist/viewers/AudioViewer.js.map +7 -0
- package/dist/viewers/DocxViewer.js +81 -0
- package/dist/viewers/DocxViewer.js.map +7 -0
- package/dist/viewers/ImageViewer.js +31 -0
- package/dist/viewers/ImageViewer.js.map +7 -0
- package/dist/viewers/PdfViewer.cjs +17 -0
- package/dist/viewers/PdfViewer.cjs.map +1 -0
- package/dist/viewers/PdfViewer.d.ts +9 -0
- package/dist/viewers/PdfViewer.js +20 -0
- package/dist/viewers/PdfViewer.js.map +7 -0
- package/dist/viewers/PdfViewerImpl.js +384 -0
- package/dist/viewers/PdfViewerImpl.js.map +7 -0
- package/dist/viewers/VideoViewer.js +31 -0
- package/dist/viewers/VideoViewer.js.map +7 -0
- package/dist/viewers/XlsxViewer.js +102 -0
- package/dist/viewers/XlsxViewer.js.map +7 -0
- package/dist/viewers/index.cjs +79 -653
- package/dist/viewers/index.cjs.map +1 -1
- package/dist/viewers/index.d.ts +3 -1
- package/dist/viewers/index.js +60 -903
- package/dist/viewers/index.js.map +7 -1
- package/dist/viewers/page-scroll.js +59 -0
- package/dist/viewers/page-scroll.js.map +7 -0
- package/dist/viewers/pdf-viewer-constants.js +9 -0
- package/dist/viewers/pdf-viewer-constants.js.map +7 -0
- package/dist/{chunk-PTOP7OHG.js → viewers/pdfjs-polyfills.js} +5 -6
- package/dist/viewers/pdfjs-polyfills.js.map +7 -0
- package/dist/viewers/selection-runs.js +38 -0
- package/dist/viewers/selection-runs.js.map +7 -0
- package/dist/viewers/usePageIntersectionObserver.js +68 -0
- package/dist/viewers/usePageIntersectionObserver.js.map +7 -0
- package/dist/viewers/useProcessedChunks.js +58 -0
- package/dist/viewers/useProcessedChunks.js.map +7 -0
- package/dist/viewers/viewer-zoom.js +163 -0
- package/dist/viewers/viewer-zoom.js.map +7 -0
- package/dist/websocket/ArbiWebSocketProvider.js +207 -0
- package/dist/websocket/ArbiWebSocketProvider.js.map +7 -0
- package/dist/websocket/context.js +14 -0
- package/dist/websocket/context.js.map +7 -0
- package/dist/websocket/hooks.js +30 -0
- package/dist/websocket/hooks.js.map +7 -0
- package/dist/websocket/index.js +22 -0
- package/dist/websocket/index.js.map +7 -0
- package/dist/websocket/live-updates.js +38 -0
- package/dist/websocket/live-updates.js.map +7 -0
- package/dist/websocket/reconnect.js +13 -0
- package/dist/websocket/reconnect.js.map +7 -0
- package/dist/websocket/store.js +58 -0
- package/dist/websocket/store.js.map +7 -0
- package/dist/workforce.js +607 -0
- package/dist/workforce.js.map +7 -0
- package/dist/workspaces/access-request.js +35 -0
- package/dist/workspaces/access-request.js.map +7 -0
- package/dist/workspaces/archive.js +59 -0
- package/dist/workspaces/archive.js.map +7 -0
- package/dist/workspaces/current.js +20 -0
- package/dist/workspaces/current.js.map +7 -0
- package/dist/workspaces/delete-workspaces.js +15 -0
- package/dist/workspaces/delete-workspaces.js.map +7 -0
- package/dist/workspaces/export-archive.js +40 -0
- package/dist/workspaces/export-archive.js.map +7 -0
- package/dist/workspaces/index.js +99 -0
- package/dist/workspaces/index.js.map +7 -0
- package/dist/workspaces/settings.js +45 -0
- package/dist/workspaces/settings.js.map +7 -0
- package/dist/workspaces/shell-workspaces.js +49 -0
- package/dist/workspaces/shell-workspaces.js.map +7 -0
- package/dist/workspaces/switch.js +234 -0
- package/dist/workspaces/switch.js.map +7 -0
- package/dist/workspaces/transfer.js +170 -0
- package/dist/workspaces/transfer.js.map +7 -0
- package/dist/workspaces/useShellWorkspaces.js +86 -0
- package/dist/workspaces/useShellWorkspaces.js.map +7 -0
- package/dist/workspaces/workspace-users.js +65 -0
- package/dist/workspaces/workspace-users.js.map +7 -0
- package/package.json +12 -4
- package/dist/PdfViewer.d-bQH9yxFg.d.ts +0 -55
- package/dist/ProductionDialog.d-CpzslFn0.d.cts +0 -51
- package/dist/annotations/freeze/index.d.cts +0 -205
- package/dist/annotations/index.d.cts +0 -360
- package/dist/artifacts/index.d.cts +0 -476
- package/dist/artifacts/redline-core.d.cts +0 -39
- package/dist/bundle-YNOX7VIL.js +0 -5
- package/dist/bundle-YNOX7VIL.js.map +0 -1
- package/dist/bundle.d-BnCSbHy2.d.cts +0 -85
- package/dist/calls/livekit/index.d.cts +0 -280
- package/dist/chunk-47CCGUWR.js.map +0 -1
- package/dist/chunk-6H3O63TQ.js.map +0 -1
- package/dist/chunk-74N436VK.js.map +0 -1
- package/dist/chunk-APZZQZ6P.js +0 -147
- package/dist/chunk-APZZQZ6P.js.map +0 -1
- package/dist/chunk-BF5KW5ZI.js.map +0 -1
- package/dist/chunk-CPQ3CU4B.js +0 -246
- package/dist/chunk-CPQ3CU4B.js.map +0 -1
- package/dist/chunk-DPYBZDJB.js.map +0 -1
- package/dist/chunk-DQALOQPI.js +0 -2766
- package/dist/chunk-DQALOQPI.js.map +0 -1
- package/dist/chunk-FZJMA32S.js +0 -1011
- package/dist/chunk-FZJMA32S.js.map +0 -1
- package/dist/chunk-H5M7FXLB.js +0 -2057
- package/dist/chunk-H5M7FXLB.js.map +0 -1
- package/dist/chunk-HDCRPPBW.js +0 -75
- package/dist/chunk-HDCRPPBW.js.map +0 -1
- package/dist/chunk-NIKPG4PW.js +0 -1128
- package/dist/chunk-NIKPG4PW.js.map +0 -1
- package/dist/chunk-NNAJLY6B.js +0 -4974
- package/dist/chunk-NNAJLY6B.js.map +0 -1
- package/dist/chunk-OYPKKHXY.js +0 -559
- package/dist/chunk-OYPKKHXY.js.map +0 -1
- package/dist/chunk-P6WLV5UY.js +0 -644
- package/dist/chunk-P6WLV5UY.js.map +0 -1
- package/dist/chunk-PTOP7OHG.js.map +0 -1
- package/dist/chunk-SN5YV6FF.js +0 -11
- package/dist/chunk-SN5YV6FF.js.map +0 -1
- package/dist/chunk-T3USOSVN.js.map +0 -1
- package/dist/chunk-T4CLW3DN.js +0 -2560
- package/dist/chunk-T4CLW3DN.js.map +0 -1
- package/dist/chunk-UW2SGTI5.js.map +0 -1
- package/dist/chunk-VSCU7K4V.js.map +0 -1
- package/dist/chunk-WL2Y2T47.js.map +0 -1
- package/dist/chunk-WUTL62MC.js.map +0 -1
- package/dist/chunk-Y3MTRA7D.js +0 -97
- package/dist/chunk-Y3MTRA7D.js.map +0 -1
- package/dist/chunk-YNNAJJ5Z.js.map +0 -1
- package/dist/document-tools/core.d.cts +0 -883
- package/dist/document-tools/index.d.cts +0 -90
- package/dist/index.d-BMhTH98a.d.cts +0 -2035
- package/dist/index.d-oR5FKZpJ.d.cts +0 -579
- package/dist/index.d.cts +0 -15893
- package/dist/model.d-CNtRWKVK.d.cts +0 -110
- package/dist/query-keys.d-ChgpJLPF.d.cts +0 -337
- package/dist/shell/index.d.cts +0 -6
- package/dist/store.d-GADDvC7w.d.cts +0 -35
- package/dist/stored-markdown.d-Bp18vrbr.d.cts +0 -125
- package/dist/ui/index.d.cts +0 -25
- package/dist/useAudioRecorder.d-B9rlMI_E.d.cts +0 -778
- package/dist/viewers/index.d.cts +0 -260
|
@@ -0,0 +1,339 @@
|
|
|
1
|
+
import {
|
|
2
|
+
closeThreadTabIn,
|
|
3
|
+
openThreadTabIn,
|
|
4
|
+
parseSavedThreadTabs,
|
|
5
|
+
renameThreadTabIn,
|
|
6
|
+
savedThreadTabs,
|
|
7
|
+
selectThreadTabIn,
|
|
8
|
+
showThreadListIn
|
|
9
|
+
} from "./thread-tabs.js";
|
|
10
|
+
const PANEL_MODES = ["main", "docked", "overlay", "popout"];
|
|
11
|
+
const defaultPinned = () => typeof window === "undefined" || window.innerWidth >= 640;
|
|
12
|
+
function defaultLayoutState() {
|
|
13
|
+
return {
|
|
14
|
+
shell: {
|
|
15
|
+
page: "home",
|
|
16
|
+
sidebar: { pinned: defaultPinned(), hovering: false, drawerOpen: false },
|
|
17
|
+
panels: { main: null, docked: null, overlay: null, popout: null, modes: {}, sizes: {} },
|
|
18
|
+
focusedArea: "main"
|
|
19
|
+
},
|
|
20
|
+
tabs: {
|
|
21
|
+
threads: [],
|
|
22
|
+
activeThread: null,
|
|
23
|
+
threadScrollRestore: null,
|
|
24
|
+
dm: [],
|
|
25
|
+
activeDm: null,
|
|
26
|
+
dmMessageId: null,
|
|
27
|
+
projects: [],
|
|
28
|
+
activeProject: null
|
|
29
|
+
},
|
|
30
|
+
views: { tabs: {}, filters: {}, values: {}, transient: {} },
|
|
31
|
+
grid: { states: {}, rowHeights: {}, labelWidths: {}, savedViews: {} }
|
|
32
|
+
};
|
|
33
|
+
}
|
|
34
|
+
const isRecord = (value) => typeof value === "object" && value !== null && !Array.isArray(value);
|
|
35
|
+
const recordOf = (value, keep) => isRecord(value) ? Object.fromEntries(Object.entries(value).filter(([, v]) => keep(v))) : {};
|
|
36
|
+
const isString = (v) => typeof v === "string";
|
|
37
|
+
const isNumber = (v) => typeof v === "number" && Number.isFinite(v);
|
|
38
|
+
const isAny = (v) => v !== void 0;
|
|
39
|
+
const isMode = (v) => PANEL_MODES.includes(v);
|
|
40
|
+
const isSize = (v) => isRecord(v) && isNumber(v.width) && isNumber(v.height);
|
|
41
|
+
const isList = (v) => Array.isArray(v);
|
|
42
|
+
const stringOrNull = (v) => isString(v) ? v : null;
|
|
43
|
+
function parseSavedLayout(saved) {
|
|
44
|
+
if (!isRecord(saved) || saved.version !== 1) return null;
|
|
45
|
+
const shell = isRecord(saved.shell) ? saved.shell : {};
|
|
46
|
+
const panels = isRecord(shell.panels) ? shell.panels : {};
|
|
47
|
+
const tabs = isRecord(saved.tabs) ? saved.tabs : {};
|
|
48
|
+
const views = isRecord(saved.views) ? saved.views : {};
|
|
49
|
+
const grid = isRecord(saved.grid) ? saved.grid : {};
|
|
50
|
+
const defaults = defaultLayoutState();
|
|
51
|
+
return {
|
|
52
|
+
version: 1,
|
|
53
|
+
migrated: isList(saved.migrated) ? saved.migrated.filter(isString) : [],
|
|
54
|
+
shell: {
|
|
55
|
+
page: isString(shell.page) ? shell.page : defaults.shell.page,
|
|
56
|
+
sidebarPinned: typeof shell.sidebarPinned === "boolean" ? shell.sidebarPinned : defaults.shell.sidebar.pinned,
|
|
57
|
+
panels: {
|
|
58
|
+
main: stringOrNull(panels.main),
|
|
59
|
+
docked: stringOrNull(panels.docked),
|
|
60
|
+
modes: recordOf(panels.modes, isMode),
|
|
61
|
+
sizes: recordOf(panels.sizes, isSize)
|
|
62
|
+
}
|
|
63
|
+
},
|
|
64
|
+
tabs: parseSavedThreadTabs(tabs.threads, tabs.activeThread),
|
|
65
|
+
views: {
|
|
66
|
+
tabs: recordOf(views.tabs, isString),
|
|
67
|
+
filters: recordOf(views.filters, isAny),
|
|
68
|
+
values: recordOf(views.values, isAny)
|
|
69
|
+
},
|
|
70
|
+
grid: {
|
|
71
|
+
states: recordOf(grid.states, isRecord),
|
|
72
|
+
rowHeights: recordOf(grid.rowHeights, isNumber),
|
|
73
|
+
labelWidths: recordOf(grid.labelWidths, isNumber),
|
|
74
|
+
savedViews: recordOf(grid.savedViews, isList)
|
|
75
|
+
}
|
|
76
|
+
};
|
|
77
|
+
}
|
|
78
|
+
function savedLayoutOf(layout, migrated) {
|
|
79
|
+
const { shell, tabs, views, grid } = layout;
|
|
80
|
+
return {
|
|
81
|
+
version: 1,
|
|
82
|
+
migrated,
|
|
83
|
+
shell: {
|
|
84
|
+
page: shell.page,
|
|
85
|
+
sidebarPinned: shell.sidebar.pinned,
|
|
86
|
+
// A panel over the page or in its own window does not come back after a reload.
|
|
87
|
+
panels: {
|
|
88
|
+
main: shell.panels.main,
|
|
89
|
+
docked: shell.panels.docked,
|
|
90
|
+
modes: shell.panels.modes,
|
|
91
|
+
sizes: shell.panels.sizes
|
|
92
|
+
}
|
|
93
|
+
},
|
|
94
|
+
tabs: { threads: savedThreadTabs(tabs.threads), activeThread: tabs.activeThread },
|
|
95
|
+
views: { tabs: views.tabs, filters: views.filters, values: views.values },
|
|
96
|
+
grid
|
|
97
|
+
};
|
|
98
|
+
}
|
|
99
|
+
function restoreLayout(current, saved) {
|
|
100
|
+
return {
|
|
101
|
+
...current,
|
|
102
|
+
shell: {
|
|
103
|
+
...current.shell,
|
|
104
|
+
page: saved.shell.page,
|
|
105
|
+
sidebar: { ...current.shell.sidebar, pinned: saved.shell.sidebarPinned },
|
|
106
|
+
panels: { ...current.shell.panels, ...saved.shell.panels }
|
|
107
|
+
},
|
|
108
|
+
tabs: { ...current.tabs, ...saved.tabs },
|
|
109
|
+
views: { ...saved.views, transient: current.views.transient },
|
|
110
|
+
grid: saved.grid
|
|
111
|
+
};
|
|
112
|
+
}
|
|
113
|
+
function openPanelIn(panels, panelId, mode) {
|
|
114
|
+
const leave = (slot) => slot === panelId ? null : slot;
|
|
115
|
+
const next = {
|
|
116
|
+
...panels,
|
|
117
|
+
main: leave(panels.main),
|
|
118
|
+
docked: leave(panels.docked),
|
|
119
|
+
overlay: leave(panels.overlay),
|
|
120
|
+
popout: leave(panels.popout),
|
|
121
|
+
modes: { ...panels.modes, [panelId]: mode }
|
|
122
|
+
};
|
|
123
|
+
if (mode === "docked") return { ...next, docked: panelId, overlay: null };
|
|
124
|
+
if (mode === "overlay") return { ...next, overlay: panelId, docked: null };
|
|
125
|
+
return { ...next, [mode]: panelId };
|
|
126
|
+
}
|
|
127
|
+
function closePanelIn(panels, panelId) {
|
|
128
|
+
const leave = (slot) => slot === panelId ? null : slot;
|
|
129
|
+
return {
|
|
130
|
+
...panels,
|
|
131
|
+
main: leave(panels.main),
|
|
132
|
+
docked: leave(panels.docked),
|
|
133
|
+
overlay: leave(panels.overlay),
|
|
134
|
+
popout: leave(panels.popout)
|
|
135
|
+
};
|
|
136
|
+
}
|
|
137
|
+
function panelPlace(panels, panelId) {
|
|
138
|
+
return PANEL_MODES.find((mode) => panels[mode] === panelId) ?? null;
|
|
139
|
+
}
|
|
140
|
+
const DOCUMENT_VIEWER_PANEL = "document-viewer";
|
|
141
|
+
const isPanelOpen = (state, panelId) => panelPlace(state.shell.panels, panelId) !== null;
|
|
142
|
+
const dmTabId = (tab) => tab.recipientId ?? "new";
|
|
143
|
+
function createArbiLayoutStore({
|
|
144
|
+
persist,
|
|
145
|
+
initial
|
|
146
|
+
} = {}) {
|
|
147
|
+
let layout = { ...defaultLayoutState(), ...initial };
|
|
148
|
+
let migrated = [];
|
|
149
|
+
let isHydrated = !persist;
|
|
150
|
+
const listeners = /* @__PURE__ */ new Set();
|
|
151
|
+
const save = () => {
|
|
152
|
+
if (persist && isHydrated) persist.save(savedLayoutOf(layout, migrated));
|
|
153
|
+
};
|
|
154
|
+
const update = (next) => {
|
|
155
|
+
if (next === layout) return;
|
|
156
|
+
const persisted = next.tabs.threads !== layout.tabs.threads || next.tabs.activeThread !== layout.tabs.activeThread || next.views.tabs !== layout.views.tabs || next.views.filters !== layout.views.filters || next.views.values !== layout.views.values || next.grid !== layout.grid || next.shell.page !== layout.shell.page || next.shell.sidebar.pinned !== layout.shell.sidebar.pinned || next.shell.panels !== layout.shell.panels;
|
|
157
|
+
layout = next;
|
|
158
|
+
listeners.forEach((listener) => listener());
|
|
159
|
+
if (persisted) save();
|
|
160
|
+
};
|
|
161
|
+
const shell = (change) => update({ ...layout, shell: { ...layout.shell, ...change } });
|
|
162
|
+
const tabs = (change) => update({ ...layout, tabs: { ...layout.tabs, ...change } });
|
|
163
|
+
const views = (change) => update({ ...layout, views: { ...layout.views, ...change } });
|
|
164
|
+
const grid = (change) => update({ ...layout, grid: { ...layout.grid, ...change } });
|
|
165
|
+
const hydration = persist ? persist.load().then(
|
|
166
|
+
(saved) => {
|
|
167
|
+
const parsed = parseSavedLayout(saved);
|
|
168
|
+
if (parsed) {
|
|
169
|
+
migrated = parsed.migrated;
|
|
170
|
+
layout = restoreLayout(layout, parsed);
|
|
171
|
+
}
|
|
172
|
+
isHydrated = true;
|
|
173
|
+
listeners.forEach((listener) => listener());
|
|
174
|
+
},
|
|
175
|
+
() => {
|
|
176
|
+
isHydrated = true;
|
|
177
|
+
listeners.forEach((listener) => listener());
|
|
178
|
+
}
|
|
179
|
+
) : Promise.resolve();
|
|
180
|
+
return {
|
|
181
|
+
getLayout: () => layout,
|
|
182
|
+
reset: () => update(defaultLayoutState()),
|
|
183
|
+
subscribe: (listener) => {
|
|
184
|
+
listeners.add(listener);
|
|
185
|
+
return () => listeners.delete(listener);
|
|
186
|
+
},
|
|
187
|
+
hydrated: () => hydration,
|
|
188
|
+
isHydrated: () => isHydrated,
|
|
189
|
+
threads: {
|
|
190
|
+
open: (conversationId, leaving) => {
|
|
191
|
+
const change = openThreadTabIn(layout.tabs, conversationId, leaving);
|
|
192
|
+
tabs(change.tabs);
|
|
193
|
+
return { tabId: change.tabId, show: change.show };
|
|
194
|
+
},
|
|
195
|
+
close: (tabId) => {
|
|
196
|
+
const change = closeThreadTabIn(layout.tabs, tabId);
|
|
197
|
+
tabs(change.tabs);
|
|
198
|
+
return change.show;
|
|
199
|
+
},
|
|
200
|
+
select: (tabId, leaving) => {
|
|
201
|
+
const change = selectThreadTabIn(layout.tabs, tabId, leaving);
|
|
202
|
+
if (change.tabs !== layout.tabs) tabs(change.tabs);
|
|
203
|
+
return change.show;
|
|
204
|
+
},
|
|
205
|
+
showList: (leaving) => tabs(showThreadListIn(layout.tabs, leaving)),
|
|
206
|
+
rename: (fromId, toId) => {
|
|
207
|
+
const next = renameThreadTabIn(layout.tabs, fromId, toId);
|
|
208
|
+
if (next !== layout.tabs) tabs(next);
|
|
209
|
+
},
|
|
210
|
+
clear: () => {
|
|
211
|
+
if (layout.tabs.threads.length > 0 || layout.tabs.activeThread !== null)
|
|
212
|
+
tabs({ threads: [], activeThread: null });
|
|
213
|
+
},
|
|
214
|
+
consumeScrollRestore: () => {
|
|
215
|
+
const value = layout.tabs.threadScrollRestore;
|
|
216
|
+
if (value !== null) tabs({ threadScrollRestore: null });
|
|
217
|
+
return value;
|
|
218
|
+
}
|
|
219
|
+
},
|
|
220
|
+
setPage: (page) => {
|
|
221
|
+
if (layout.shell.page !== page || layout.shell.focusedArea !== "main")
|
|
222
|
+
shell({ page, focusedArea: "main" });
|
|
223
|
+
},
|
|
224
|
+
setSidebar: (change) => {
|
|
225
|
+
const sidebar = { ...layout.shell.sidebar, ...change };
|
|
226
|
+
const current = layout.shell.sidebar;
|
|
227
|
+
if (sidebar.pinned !== current.pinned || sidebar.hovering !== current.hovering || sidebar.drawerOpen !== current.drawerOpen)
|
|
228
|
+
shell({ sidebar });
|
|
229
|
+
},
|
|
230
|
+
openPanel: (panelId, mode) => shell({ panels: openPanelIn(layout.shell.panels, panelId, mode), focusedArea: panelId }),
|
|
231
|
+
closePanel: (panelId) => shell({ panels: closePanelIn(layout.shell.panels, panelId), focusedArea: "main" }),
|
|
232
|
+
setPanelMode: (panelId, mode) => {
|
|
233
|
+
const panels = layout.shell.panels;
|
|
234
|
+
if (panelPlace(panels, panelId) !== null)
|
|
235
|
+
shell({ panels: openPanelIn(panels, panelId, mode), focusedArea: panelId });
|
|
236
|
+
else if (panels.modes[panelId] !== mode)
|
|
237
|
+
shell({ panels: { ...panels, modes: { ...panels.modes, [panelId]: mode } } });
|
|
238
|
+
},
|
|
239
|
+
setPanelSize: (panelId, size) => {
|
|
240
|
+
const panels = layout.shell.panels;
|
|
241
|
+
shell({ panels: { ...panels, sizes: { ...panels.sizes, [panelId]: size } } });
|
|
242
|
+
},
|
|
243
|
+
setFocusedArea: (focusedArea) => {
|
|
244
|
+
if (layout.shell.focusedArea !== focusedArea) shell({ focusedArea });
|
|
245
|
+
},
|
|
246
|
+
openDmTab: (recipientId, messageId) => {
|
|
247
|
+
const id = recipientId ?? "new";
|
|
248
|
+
const dm = layout.tabs.dm.some((tab) => dmTabId(tab) === id) ? layout.tabs.dm : [...layout.tabs.dm, { recipientId }];
|
|
249
|
+
tabs({ dm, activeDm: id, ...messageId ? { dmMessageId: messageId } : {} });
|
|
250
|
+
},
|
|
251
|
+
closeDmTab: (tabId) => {
|
|
252
|
+
const dm = layout.tabs.dm.filter((tab) => dmTabId(tab) !== tabId);
|
|
253
|
+
if (dm.length === layout.tabs.dm.length) return;
|
|
254
|
+
if (dm.length === 0) return tabs({ dm, activeDm: null });
|
|
255
|
+
if (layout.tabs.activeDm !== tabId) return tabs({ dm });
|
|
256
|
+
const index = layout.tabs.dm.findIndex((tab) => dmTabId(tab) === tabId);
|
|
257
|
+
tabs({ dm, activeDm: dmTabId(dm[Math.min(index, dm.length - 1)]) });
|
|
258
|
+
},
|
|
259
|
+
selectDmTab: (activeDm) => {
|
|
260
|
+
if (layout.tabs.activeDm !== activeDm) tabs({ activeDm });
|
|
261
|
+
},
|
|
262
|
+
clearDmTabs: () => tabs({ dm: [], activeDm: null }),
|
|
263
|
+
setDmMessageId: (dmMessageId) => {
|
|
264
|
+
if (layout.tabs.dmMessageId !== dmMessageId) tabs({ dmMessageId });
|
|
265
|
+
},
|
|
266
|
+
openProjectTab: (projectId) => tabs({
|
|
267
|
+
projects: layout.tabs.projects.includes(projectId) ? layout.tabs.projects : [...layout.tabs.projects, projectId],
|
|
268
|
+
activeProject: projectId
|
|
269
|
+
}),
|
|
270
|
+
closeProjectTab: (projectId) => {
|
|
271
|
+
const projects = layout.tabs.projects.filter((id) => id !== projectId);
|
|
272
|
+
if (projects.length === layout.tabs.projects.length) return;
|
|
273
|
+
if (layout.tabs.activeProject !== projectId) return tabs({ projects });
|
|
274
|
+
const index = layout.tabs.projects.indexOf(projectId);
|
|
275
|
+
tabs({
|
|
276
|
+
projects,
|
|
277
|
+
activeProject: projects.length ? projects[Math.min(index, projects.length - 1)] : null
|
|
278
|
+
});
|
|
279
|
+
},
|
|
280
|
+
selectProjectTab: (activeProject) => {
|
|
281
|
+
if (layout.tabs.activeProject !== activeProject) tabs({ activeProject });
|
|
282
|
+
},
|
|
283
|
+
setPageTab: (page, tab) => {
|
|
284
|
+
if (layout.views.tabs[page] !== tab) views({ tabs: { ...layout.views.tabs, [page]: tab } });
|
|
285
|
+
},
|
|
286
|
+
setViewFilter: (key, value) => views({ filters: { ...layout.views.filters, [key]: value } }),
|
|
287
|
+
setViewValue: (key, value) => {
|
|
288
|
+
if (layout.views.values[key] !== value)
|
|
289
|
+
views({ values: { ...layout.views.values, [key]: value } });
|
|
290
|
+
},
|
|
291
|
+
setTransientView: (key, value) => {
|
|
292
|
+
if (layout.views.transient[key] === value) return;
|
|
293
|
+
const transient = { ...layout.views.transient };
|
|
294
|
+
if (value === void 0) delete transient[key];
|
|
295
|
+
else transient[key] = value;
|
|
296
|
+
views({ transient });
|
|
297
|
+
},
|
|
298
|
+
setGridState: (gridId, state) => grid({ states: { ...layout.grid.states, [gridId]: state } }),
|
|
299
|
+
clearGridState: (gridId) => {
|
|
300
|
+
if (!(gridId in layout.grid.states)) return;
|
|
301
|
+
const states = { ...layout.grid.states };
|
|
302
|
+
delete states[gridId];
|
|
303
|
+
grid({ states });
|
|
304
|
+
},
|
|
305
|
+
setGridRowHeight: (gridId, height) => grid({ rowHeights: { ...layout.grid.rowHeights, [gridId]: height } }),
|
|
306
|
+
setGridLabelWidth: (gridId, width) => grid({ labelWidths: { ...layout.grid.labelWidths, [gridId]: width } }),
|
|
307
|
+
setGridSavedViews: (gridId, saved) => grid({ savedViews: { ...layout.grid.savedViews, [gridId]: saved } }),
|
|
308
|
+
resetLayout: (variant) => {
|
|
309
|
+
const fresh = defaultLayoutState();
|
|
310
|
+
update({
|
|
311
|
+
shell: {
|
|
312
|
+
...fresh.shell,
|
|
313
|
+
panels: {
|
|
314
|
+
...fresh.shell.panels,
|
|
315
|
+
modes: layout.shell.panels.modes,
|
|
316
|
+
sizes: layout.shell.panels.sizes
|
|
317
|
+
}
|
|
318
|
+
},
|
|
319
|
+
tabs: fresh.tabs,
|
|
320
|
+
views: { ...layout.views, tabs: {}, transient: {} },
|
|
321
|
+
grid: variant === "logout" ? { ...layout.grid, states: {} } : layout.grid
|
|
322
|
+
});
|
|
323
|
+
}
|
|
324
|
+
};
|
|
325
|
+
}
|
|
326
|
+
export {
|
|
327
|
+
DOCUMENT_VIEWER_PANEL,
|
|
328
|
+
closePanelIn,
|
|
329
|
+
createArbiLayoutStore,
|
|
330
|
+
defaultLayoutState,
|
|
331
|
+
dmTabId,
|
|
332
|
+
isPanelOpen,
|
|
333
|
+
openPanelIn,
|
|
334
|
+
panelPlace,
|
|
335
|
+
parseSavedLayout,
|
|
336
|
+
restoreLayout,
|
|
337
|
+
savedLayoutOf
|
|
338
|
+
};
|
|
339
|
+
//# sourceMappingURL=layout.js.map
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../../src/session/layout.ts"],
|
|
4
|
+
"sourcesContent": ["/**\n * The layout part of the session state: the shell (the page on screen, the sidebar, the panels and\n * where each one shows, the area with focus), the open tabs (threads, direct messages, projects),\n * each page's view (its tab, its filters, other view settings) and the grids' saved state. Kits and\n * the host read and change it through the session store; the parts a person arranges (the page, the\n * pinned sidebar, the panels, the thread tabs, the views, the grids) are kept across reloads by the\n * host's {@link ArbiSessionPersist}.\n */\n\nimport type { ArbiSessionPersist } from './persist'\nimport {\n closeThreadTabIn,\n openThreadTabIn,\n parseSavedThreadTabs,\n renameThreadTabIn,\n savedThreadTabs,\n selectThreadTabIn,\n showThreadListIn,\n type ArbiThreadComposer,\n type ArbiThreadTabShow,\n type ArbiThreadTabsState,\n} from './thread-tabs'\n\n/** Where a panel shows: the page's area, docked beside it, over it, or in its own window. */\nexport type ArbiPanelMode = 'main' | 'docked' | 'overlay' | 'popout'\n\nexport interface ArbiPanelsState {\n /** The panel in each place (one each): filling the page, docked, over the page, popped out. */\n main: string | null\n docked: string | null\n overlay: string | null\n popout: string | null\n /** Where each panel last showed (it opens there again). */\n modes: Readonly<Record<string, ArbiPanelMode>>\n /** A floating panel's size. */\n sizes: Readonly<Record<string, { width: number; height: number }>>\n}\n\nexport interface ArbiSidebarState {\n /** Pinned open (on wide screens; phones show a drawer). */\n pinned: boolean\n /** The rail is expanded under the pointer. */\n hovering: boolean\n /** The phone drawer is open. */\n drawerOpen: boolean\n}\n\nexport interface ArbiShellState {\n /** The page on screen (a host's page id). */\n page: string\n sidebar: ArbiSidebarState\n panels: ArbiPanelsState\n /** The area with focus: `main` or a panel id. */\n focusedArea: string\n}\n\n/** A direct-message tab: a person's or agent's id, a group chat's id, or null (a new message). */\nexport interface ArbiDmTab {\n recipientId: string | null\n}\n\nexport interface ArbiTabsState extends ArbiThreadTabsState {\n dm: readonly ArbiDmTab[]\n activeDm: string | null\n /** The message a direct-message tab scrolls to once open. */\n dmMessageId: string | null\n projects: readonly string[]\n activeProject: string | null\n}\n\nexport interface ArbiViewsState {\n /** Each page's tab, by page. */\n tabs: Readonly<Record<string, string>>\n /** Each list's quick filters, by list. */\n filters: Readonly<Record<string, unknown>>\n /** Other view settings, by key (a page's view mode, a zoom, a filter box's text). */\n values: Readonly<Record<string, unknown>>\n /** View state kept for this session only, by key (a search's results); not saved. */\n transient: Readonly<Record<string, unknown>>\n}\n\nexport interface ArbiGridLayoutState {\n /** Each grid's saved state (columns, widths, sort), by grid id. */\n states: Readonly<Record<string, unknown>>\n /** Each grid's row height. */\n rowHeights: Readonly<Record<string, number>>\n /** Each timeline's label column width. */\n labelWidths: Readonly<Record<string, number>>\n /** Views an earlier build saved on this device, by grid id (moved to user settings once). */\n savedViews: Readonly<Record<string, readonly unknown[]>>\n}\n\nexport interface ArbiLayoutState {\n shell: ArbiShellState\n tabs: ArbiTabsState\n views: ArbiViewsState\n grid: ArbiGridLayoutState\n}\n\n/** What is kept across reloads. */\nexport interface ArbiSavedLayout {\n version: 1\n /** The pieces an earlier build's own saved state was brought in for (the host's migration). */\n migrated: string[]\n shell: {\n page: string\n sidebarPinned: boolean\n panels: { main: string | null; docked: string | null } & Pick<\n ArbiPanelsState,\n 'modes' | 'sizes'\n >\n }\n /** The open thread tabs (without what was typed in them) and the one on screen. */\n tabs: Pick<ArbiThreadTabsState, 'threads' | 'activeThread'>\n views: Omit<ArbiViewsState, 'transient'>\n grid: ArbiGridLayoutState\n}\n\nconst PANEL_MODES: readonly ArbiPanelMode[] = ['main', 'docked', 'overlay', 'popout']\n\n/** Phones start with the sidebar as a drawer, wider screens pinned. */\nconst defaultPinned = () => typeof window === 'undefined' || window.innerWidth >= 640\n\nexport function defaultLayoutState(): ArbiLayoutState {\n return {\n shell: {\n page: 'home',\n sidebar: { pinned: defaultPinned(), hovering: false, drawerOpen: false },\n panels: { main: null, docked: null, overlay: null, popout: null, modes: {}, sizes: {} },\n focusedArea: 'main',\n },\n tabs: {\n threads: [],\n activeThread: null,\n threadScrollRestore: null,\n dm: [],\n activeDm: null,\n dmMessageId: null,\n projects: [],\n activeProject: null,\n },\n views: { tabs: {}, filters: {}, values: {}, transient: {} },\n grid: { states: {}, rowHeights: {}, labelWidths: {}, savedViews: {} },\n }\n}\n\nconst isRecord = (value: unknown): value is Record<string, unknown> =>\n typeof value === 'object' && value !== null && !Array.isArray(value)\n\nconst recordOf = <T>(value: unknown, keep: (entry: unknown) => entry is T): Record<string, T> =>\n isRecord(value)\n ? (Object.fromEntries(Object.entries(value).filter(([, v]) => keep(v))) as Record<string, T>)\n : {}\n\nconst isString = (v: unknown): v is string => typeof v === 'string'\nconst isNumber = (v: unknown): v is number => typeof v === 'number' && Number.isFinite(v)\nconst isAny = (v: unknown): v is unknown => v !== undefined\nconst isMode = (v: unknown): v is ArbiPanelMode => PANEL_MODES.includes(v as ArbiPanelMode)\nconst isSize = (v: unknown): v is { width: number; height: number } =>\n isRecord(v) && isNumber(v.width) && isNumber(v.height)\nconst isList = (v: unknown): v is unknown[] => Array.isArray(v)\nconst stringOrNull = (v: unknown): string | null => (isString(v) ? v : null)\n\n/**\n * A saved layout as this build reads it: whatever an earlier or a broken save left is dropped\n * rather than read. Never throws; null when there is nothing usable.\n */\nexport function parseSavedLayout(saved: unknown): ArbiSavedLayout | null {\n if (!isRecord(saved) || saved.version !== 1) return null\n const shell = isRecord(saved.shell) ? saved.shell : {}\n const panels = isRecord(shell.panels) ? shell.panels : {}\n const tabs = isRecord(saved.tabs) ? saved.tabs : {}\n const views = isRecord(saved.views) ? saved.views : {}\n const grid = isRecord(saved.grid) ? saved.grid : {}\n const defaults = defaultLayoutState()\n return {\n version: 1,\n migrated: isList(saved.migrated) ? saved.migrated.filter(isString) : [],\n shell: {\n page: isString(shell.page) ? shell.page : defaults.shell.page,\n sidebarPinned:\n typeof shell.sidebarPinned === 'boolean'\n ? shell.sidebarPinned\n : defaults.shell.sidebar.pinned,\n panels: {\n main: stringOrNull(panels.main),\n docked: stringOrNull(panels.docked),\n modes: recordOf(panels.modes, isMode),\n sizes: recordOf(panels.sizes, isSize),\n },\n },\n tabs: parseSavedThreadTabs(tabs.threads, tabs.activeThread),\n views: {\n tabs: recordOf(views.tabs, isString),\n filters: recordOf(views.filters, isAny),\n values: recordOf(views.values, isAny),\n },\n grid: {\n states: recordOf(grid.states, isRecord),\n rowHeights: recordOf(grid.rowHeights, isNumber),\n labelWidths: recordOf(grid.labelWidths, isNumber),\n savedViews: recordOf(grid.savedViews, isList),\n },\n }\n}\n\n/** What of a layout is saved. */\nexport function savedLayoutOf(layout: ArbiLayoutState, migrated: string[]): ArbiSavedLayout {\n const { shell, tabs, views, grid } = layout\n return {\n version: 1,\n migrated,\n shell: {\n page: shell.page,\n sidebarPinned: shell.sidebar.pinned,\n // A panel over the page or in its own window does not come back after a reload.\n panels: {\n main: shell.panels.main,\n docked: shell.panels.docked,\n modes: shell.panels.modes,\n sizes: shell.panels.sizes,\n },\n },\n tabs: { threads: savedThreadTabs(tabs.threads), activeThread: tabs.activeThread },\n views: { tabs: views.tabs, filters: views.filters, values: views.values },\n grid,\n }\n}\n\n/** The layout a saved one restores (the parts not saved keep their current values). */\nexport function restoreLayout(current: ArbiLayoutState, saved: ArbiSavedLayout): ArbiLayoutState {\n return {\n ...current,\n shell: {\n ...current.shell,\n page: saved.shell.page,\n sidebar: { ...current.shell.sidebar, pinned: saved.shell.sidebarPinned },\n panels: { ...current.shell.panels, ...saved.shell.panels },\n },\n tabs: { ...current.tabs, ...saved.tabs },\n views: { ...saved.views, transient: current.views.transient },\n grid: saved.grid,\n }\n}\n\n// \u2500\u2500 Changes \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\n/** Show a panel in a place: it leaves the place it was in, and what was in that place closes. */\nexport function openPanelIn(\n panels: ArbiPanelsState,\n panelId: string,\n mode: ArbiPanelMode\n): ArbiPanelsState {\n const leave = (slot: string | null) => (slot === panelId ? null : slot)\n const next: ArbiPanelsState = {\n ...panels,\n main: leave(panels.main),\n docked: leave(panels.docked),\n overlay: leave(panels.overlay),\n popout: leave(panels.popout),\n modes: { ...panels.modes, [panelId]: mode },\n }\n // Docked and over the page are both the secondary surface beside the page: one at a time.\n if (mode === 'docked') return { ...next, docked: panelId, overlay: null }\n if (mode === 'overlay') return { ...next, overlay: panelId, docked: null }\n return { ...next, [mode]: panelId }\n}\n\nexport function closePanelIn(panels: ArbiPanelsState, panelId: string): ArbiPanelsState {\n const leave = (slot: string | null) => (slot === panelId ? null : slot)\n return {\n ...panels,\n main: leave(panels.main),\n docked: leave(panels.docked),\n overlay: leave(panels.overlay),\n popout: leave(panels.popout),\n }\n}\n\n/** Where a panel shows now, or null while it is closed. */\nexport function panelPlace(panels: ArbiPanelsState, panelId: string): ArbiPanelMode | null {\n return PANEL_MODES.find((mode) => panels[mode] === panelId) ?? null\n}\n\n/**\n * The panel that shows the session's `viewingDocument` (a host that shows documents in a panel\n * gives it this id): kits open a document with the environment's `openDocument` and close it here.\n */\nexport const DOCUMENT_VIEWER_PANEL = 'document-viewer'\n\n/** Whether a panel is open (anywhere). */\nexport const isPanelOpen = (state: { shell: ArbiShellState }, panelId: string): boolean =>\n panelPlace(state.shell.panels, panelId) !== null\n\nexport const dmTabId = (tab: ArbiDmTab): string => tab.recipientId ?? 'new'\n\n/** The actions on the layout (part of {@link ArbiSessionStore}). */\nexport interface ArbiLayoutActions {\n /** Show a page; the focus goes to the page area. */\n setPage(page: string): void\n setSidebar(change: Partial<ArbiSidebarState>): void\n /** Show a panel in a place (`mode`), focused. */\n openPanel(panelId: string, mode: ArbiPanelMode): void\n closePanel(panelId: string): void\n /** Where a panel shows: an open one moves there, a closed one opens there next time. */\n setPanelMode(panelId: string, mode: ArbiPanelMode): void\n setPanelSize(panelId: string, size: { width: number; height: number }): void\n setFocusedArea(area: string): void\n /** Open (or show) a direct-message tab, optionally scrolled to a message. */\n openDmTab(recipientId: string | null, messageId?: string): void\n closeDmTab(tabId: string): void\n /** null: no direct-message tab (the panel's own). */\n selectDmTab(tabId: string | null): void\n clearDmTabs(): void\n setDmMessageId(messageId: string | null): void\n openProjectTab(projectId: string): void\n closeProjectTab(projectId: string): void\n /** null: the projects list. */\n selectProjectTab(projectId: string | null): void\n setPageTab(page: string, tab: string): void\n setViewFilter(key: string, value: unknown): void\n setViewValue(key: string, value: unknown): void\n /** Set (or with `undefined`, drop) view state kept for this session only. */\n setTransientView(key: string, value: unknown): void\n setGridState(gridId: string, state: unknown): void\n clearGridState(gridId: string): void\n setGridRowHeight(gridId: string, height: number): void\n setGridLabelWidth(gridId: string, width: number): void\n setGridSavedViews(gridId: string, views: readonly unknown[]): void\n /**\n * Start over: a sign-in shows the home page with the sidebar at its default and no panel, tab\n * or page tab open; a sign-out also forgets the grids.\n */\n resetLayout(variant: 'login' | 'logout'): void\n}\n\n/**\n * The thread tabs' changes on a layout store. Each takes the composer being left (saved into the tab\n * on screen) and says what the composer shows next; the session store applies that to whatever\n * holds the composer (`ArbiSessionStore.openThreadTab` and the like are built on these).\n */\nexport interface ArbiThreadTabsController {\n open(\n conversationId: string | null,\n leaving: ArbiThreadComposer\n ): { tabId: string; show: ArbiThreadTabShow }\n close(tabId: string): ArbiThreadTabShow\n select(tabId: string, leaving: ArbiThreadComposer): ArbiThreadTabShow\n showList(leaving: ArbiThreadComposer): void\n /** The tab of `fromId` is now `toId`'s (a new chat got its id). */\n rename(fromId: string, toId: string): void\n clear(): void\n /** The scroll position the last tab switch brought back (once; null after). */\n consumeScrollRestore(): number | null\n}\n\n/** A store of the layout alone; the session stores are built on it. */\nexport interface ArbiLayoutStore extends ArbiLayoutActions {\n getLayout(): ArbiLayoutState\n /** Back to the defaults, everything (unit tests; a reset from an error screen). */\n reset(): void\n subscribe(listener: () => void): () => void\n /** Resolves once the saved layout has been read (at once without a `persist`). */\n hydrated(): Promise<void>\n isHydrated(): boolean\n /** The thread tabs' changes (not session actions: the session store's apply them). */\n threads: ArbiThreadTabsController\n}\n\nexport interface ArbiLayoutStoreOptions {\n persist?: ArbiSessionPersist<ArbiSavedLayout>\n /** The layout to start from (unit tests, a host's initial state); a saved one replaces it. */\n initial?: Partial<ArbiLayoutState>\n}\n\nexport function createArbiLayoutStore({\n persist,\n initial,\n}: ArbiLayoutStoreOptions = {}): ArbiLayoutStore {\n let layout: ArbiLayoutState = { ...defaultLayoutState(), ...initial }\n let migrated: string[] = []\n let isHydrated = !persist\n const listeners = new Set<() => void>()\n const save = () => {\n // Nothing is saved before the saved layout is read: it would overwrite it with the defaults.\n if (persist && isHydrated) persist.save(savedLayoutOf(layout, migrated))\n }\n const update = (next: ArbiLayoutState) => {\n if (next === layout) return\n const persisted =\n next.tabs.threads !== layout.tabs.threads ||\n next.tabs.activeThread !== layout.tabs.activeThread ||\n next.views.tabs !== layout.views.tabs ||\n next.views.filters !== layout.views.filters ||\n next.views.values !== layout.views.values ||\n next.grid !== layout.grid ||\n next.shell.page !== layout.shell.page ||\n next.shell.sidebar.pinned !== layout.shell.sidebar.pinned ||\n next.shell.panels !== layout.shell.panels\n layout = next\n listeners.forEach((listener) => listener())\n if (persisted) save()\n }\n const shell = (change: Partial<ArbiShellState>) =>\n update({ ...layout, shell: { ...layout.shell, ...change } })\n const tabs = (change: Partial<ArbiTabsState>) =>\n update({ ...layout, tabs: { ...layout.tabs, ...change } })\n const views = (change: Partial<ArbiViewsState>) =>\n update({ ...layout, views: { ...layout.views, ...change } })\n const grid = (change: Partial<ArbiGridLayoutState>) =>\n update({ ...layout, grid: { ...layout.grid, ...change } })\n\n const hydration: Promise<void> = persist\n ? persist.load().then(\n (saved) => {\n const parsed = parseSavedLayout(saved)\n if (parsed) {\n migrated = parsed.migrated\n layout = restoreLayout(layout, parsed)\n }\n isHydrated = true\n listeners.forEach((listener) => listener())\n },\n () => {\n isHydrated = true\n listeners.forEach((listener) => listener())\n }\n )\n : Promise.resolve()\n\n return {\n getLayout: () => layout,\n reset: () => update(defaultLayoutState()),\n subscribe: (listener) => {\n listeners.add(listener)\n return () => listeners.delete(listener)\n },\n hydrated: () => hydration,\n isHydrated: () => isHydrated,\n threads: {\n open: (conversationId, leaving) => {\n const change = openThreadTabIn(layout.tabs, conversationId, leaving)\n tabs(change.tabs)\n return { tabId: change.tabId, show: change.show }\n },\n close: (tabId) => {\n const change = closeThreadTabIn(layout.tabs, tabId)\n tabs(change.tabs)\n return change.show\n },\n select: (tabId, leaving) => {\n const change = selectThreadTabIn(layout.tabs, tabId, leaving)\n if (change.tabs !== layout.tabs) tabs(change.tabs)\n return change.show\n },\n showList: (leaving) => tabs(showThreadListIn(layout.tabs, leaving)),\n rename: (fromId, toId) => {\n const next = renameThreadTabIn(layout.tabs, fromId, toId)\n if (next !== layout.tabs) tabs(next)\n },\n clear: () => {\n if (layout.tabs.threads.length > 0 || layout.tabs.activeThread !== null)\n tabs({ threads: [], activeThread: null })\n },\n consumeScrollRestore: () => {\n const value = layout.tabs.threadScrollRestore\n if (value !== null) tabs({ threadScrollRestore: null })\n return value\n },\n },\n setPage: (page) => {\n if (layout.shell.page !== page || layout.shell.focusedArea !== 'main')\n shell({ page, focusedArea: 'main' })\n },\n setSidebar: (change) => {\n const sidebar = { ...layout.shell.sidebar, ...change }\n const current = layout.shell.sidebar\n if (\n sidebar.pinned !== current.pinned ||\n sidebar.hovering !== current.hovering ||\n sidebar.drawerOpen !== current.drawerOpen\n )\n shell({ sidebar })\n },\n openPanel: (panelId, mode) =>\n shell({ panels: openPanelIn(layout.shell.panels, panelId, mode), focusedArea: panelId }),\n closePanel: (panelId) =>\n shell({ panels: closePanelIn(layout.shell.panels, panelId), focusedArea: 'main' }),\n setPanelMode: (panelId, mode) => {\n const panels = layout.shell.panels\n if (panelPlace(panels, panelId) !== null)\n shell({ panels: openPanelIn(panels, panelId, mode), focusedArea: panelId })\n else if (panels.modes[panelId] !== mode)\n shell({ panels: { ...panels, modes: { ...panels.modes, [panelId]: mode } } })\n },\n setPanelSize: (panelId, size) => {\n const panels = layout.shell.panels\n shell({ panels: { ...panels, sizes: { ...panels.sizes, [panelId]: size } } })\n },\n setFocusedArea: (focusedArea) => {\n if (layout.shell.focusedArea !== focusedArea) shell({ focusedArea })\n },\n openDmTab: (recipientId, messageId) => {\n const id = recipientId ?? 'new'\n const dm = layout.tabs.dm.some((tab) => dmTabId(tab) === id)\n ? layout.tabs.dm\n : [...layout.tabs.dm, { recipientId }]\n tabs({ dm, activeDm: id, ...(messageId ? { dmMessageId: messageId } : {}) })\n },\n closeDmTab: (tabId) => {\n const dm = layout.tabs.dm.filter((tab) => dmTabId(tab) !== tabId)\n if (dm.length === layout.tabs.dm.length) return\n if (dm.length === 0) return tabs({ dm, activeDm: null })\n if (layout.tabs.activeDm !== tabId) return tabs({ dm })\n // The tab beside the closed one shows.\n const index = layout.tabs.dm.findIndex((tab) => dmTabId(tab) === tabId)\n tabs({ dm, activeDm: dmTabId(dm[Math.min(index, dm.length - 1)]) })\n },\n selectDmTab: (activeDm) => {\n if (layout.tabs.activeDm !== activeDm) tabs({ activeDm })\n },\n clearDmTabs: () => tabs({ dm: [], activeDm: null }),\n setDmMessageId: (dmMessageId) => {\n if (layout.tabs.dmMessageId !== dmMessageId) tabs({ dmMessageId })\n },\n openProjectTab: (projectId) =>\n tabs({\n projects: layout.tabs.projects.includes(projectId)\n ? layout.tabs.projects\n : [...layout.tabs.projects, projectId],\n activeProject: projectId,\n }),\n closeProjectTab: (projectId) => {\n const projects = layout.tabs.projects.filter((id) => id !== projectId)\n if (projects.length === layout.tabs.projects.length) return\n if (layout.tabs.activeProject !== projectId) return tabs({ projects })\n const index = layout.tabs.projects.indexOf(projectId)\n tabs({\n projects,\n activeProject: projects.length ? projects[Math.min(index, projects.length - 1)] : null,\n })\n },\n selectProjectTab: (activeProject) => {\n if (layout.tabs.activeProject !== activeProject) tabs({ activeProject })\n },\n setPageTab: (page, tab) => {\n if (layout.views.tabs[page] !== tab) views({ tabs: { ...layout.views.tabs, [page]: tab } })\n },\n setViewFilter: (key, value) => views({ filters: { ...layout.views.filters, [key]: value } }),\n setViewValue: (key, value) => {\n if (layout.views.values[key] !== value)\n views({ values: { ...layout.views.values, [key]: value } })\n },\n setTransientView: (key, value) => {\n if (layout.views.transient[key] === value) return\n const transient = { ...layout.views.transient }\n if (value === undefined) delete transient[key]\n else transient[key] = value\n views({ transient })\n },\n setGridState: (gridId, state) => grid({ states: { ...layout.grid.states, [gridId]: state } }),\n clearGridState: (gridId) => {\n if (!(gridId in layout.grid.states)) return\n const states = { ...layout.grid.states }\n delete states[gridId]\n grid({ states })\n },\n setGridRowHeight: (gridId, height) =>\n grid({ rowHeights: { ...layout.grid.rowHeights, [gridId]: height } }),\n setGridLabelWidth: (gridId, width) =>\n grid({ labelWidths: { ...layout.grid.labelWidths, [gridId]: width } }),\n setGridSavedViews: (gridId, saved) =>\n grid({ savedViews: { ...layout.grid.savedViews, [gridId]: saved } }),\n resetLayout: (variant) => {\n const fresh = defaultLayoutState()\n update({\n shell: {\n ...fresh.shell,\n panels: {\n ...fresh.shell.panels,\n modes: layout.shell.panels.modes,\n sizes: layout.shell.panels.sizes,\n },\n },\n tabs: fresh.tabs,\n views: { ...layout.views, tabs: {}, transient: {} },\n grid: variant === 'logout' ? { ...layout.grid, states: {} } : layout.grid,\n })\n },\n }\n}\n"],
|
|
5
|
+
"mappings": "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",
|
|
6
|
+
"names": []
|
|
7
|
+
}
|
|
@@ -0,0 +1,106 @@
|
|
|
1
|
+
function createDebouncedWriter({
|
|
2
|
+
write,
|
|
3
|
+
delayMs,
|
|
4
|
+
maxWaitMs,
|
|
5
|
+
onError
|
|
6
|
+
}) {
|
|
7
|
+
const queue = /* @__PURE__ */ new Map();
|
|
8
|
+
const run = (key, value) => {
|
|
9
|
+
try {
|
|
10
|
+
void Promise.resolve(write(key, value)).catch((error) => onError?.(key, error));
|
|
11
|
+
} catch (error) {
|
|
12
|
+
onError?.(key, error);
|
|
13
|
+
}
|
|
14
|
+
};
|
|
15
|
+
const flush = (key) => {
|
|
16
|
+
const entry = queue.get(key);
|
|
17
|
+
if (!entry) return;
|
|
18
|
+
clearTimeout(entry.timer);
|
|
19
|
+
queue.delete(key);
|
|
20
|
+
run(key, entry.value);
|
|
21
|
+
};
|
|
22
|
+
return {
|
|
23
|
+
schedule(key, value) {
|
|
24
|
+
const now = Date.now();
|
|
25
|
+
const existing = queue.get(key);
|
|
26
|
+
if (existing) clearTimeout(existing.timer);
|
|
27
|
+
const firstQueuedAt = existing?.firstQueuedAt ?? now;
|
|
28
|
+
const wait = Math.max(0, Math.min(delayMs, firstQueuedAt + maxWaitMs - now));
|
|
29
|
+
queue.set(key, { value, firstQueuedAt, timer: setTimeout(() => flush(key), wait) });
|
|
30
|
+
},
|
|
31
|
+
pending: (key) => queue.get(key)?.value,
|
|
32
|
+
cancel(key) {
|
|
33
|
+
const entry = queue.get(key);
|
|
34
|
+
if (!entry) return;
|
|
35
|
+
clearTimeout(entry.timer);
|
|
36
|
+
queue.delete(key);
|
|
37
|
+
},
|
|
38
|
+
flushAll() {
|
|
39
|
+
for (const key of Array.from(queue.keys())) flush(key);
|
|
40
|
+
}
|
|
41
|
+
};
|
|
42
|
+
}
|
|
43
|
+
function flushOnPageExit(writer) {
|
|
44
|
+
if (typeof window === "undefined" || typeof document === "undefined") return () => {
|
|
45
|
+
};
|
|
46
|
+
const flush = () => writer.flushAll();
|
|
47
|
+
const onVisibility = () => {
|
|
48
|
+
if (document.visibilityState === "hidden") writer.flushAll();
|
|
49
|
+
};
|
|
50
|
+
window.addEventListener("beforeunload", flush);
|
|
51
|
+
window.addEventListener("pagehide", flush);
|
|
52
|
+
document.addEventListener("visibilitychange", onVisibility);
|
|
53
|
+
return () => {
|
|
54
|
+
window.removeEventListener("beforeunload", flush);
|
|
55
|
+
window.removeEventListener("pagehide", flush);
|
|
56
|
+
document.removeEventListener("visibilitychange", onVisibility);
|
|
57
|
+
};
|
|
58
|
+
}
|
|
59
|
+
function createStoragePersist({
|
|
60
|
+
storage,
|
|
61
|
+
key,
|
|
62
|
+
parse = (saved) => saved,
|
|
63
|
+
migrate,
|
|
64
|
+
delayMs = 250,
|
|
65
|
+
maxWaitMs = 1e3
|
|
66
|
+
}) {
|
|
67
|
+
const writer = createDebouncedWriter({
|
|
68
|
+
write: (k, value) => storage.set(k, value),
|
|
69
|
+
delayMs,
|
|
70
|
+
maxWaitMs,
|
|
71
|
+
onError: (k, error) => console.error(`[session] Failed to save ${k}:`, error)
|
|
72
|
+
});
|
|
73
|
+
flushOnPageExit(writer);
|
|
74
|
+
const read = async () => {
|
|
75
|
+
const pending = writer.pending(key);
|
|
76
|
+
const raw = pending ?? await storage.get(key);
|
|
77
|
+
if (raw === null || raw === void 0) return null;
|
|
78
|
+
return parse(JSON.parse(raw));
|
|
79
|
+
};
|
|
80
|
+
return {
|
|
81
|
+
async load() {
|
|
82
|
+
try {
|
|
83
|
+
const saved = await read();
|
|
84
|
+
if (!migrate) return saved;
|
|
85
|
+
const migrated = await migrate(saved);
|
|
86
|
+
if (migrated !== null && migrated !== saved)
|
|
87
|
+
await storage.set(key, JSON.stringify(migrated));
|
|
88
|
+
return migrated;
|
|
89
|
+
} catch (error) {
|
|
90
|
+
console.warn("[session] The saved layout could not be read; starting from defaults", error);
|
|
91
|
+
return null;
|
|
92
|
+
}
|
|
93
|
+
},
|
|
94
|
+
save: (value) => writer.schedule(key, JSON.stringify(value)),
|
|
95
|
+
async clear() {
|
|
96
|
+
writer.cancel(key);
|
|
97
|
+
await storage.remove(key);
|
|
98
|
+
}
|
|
99
|
+
};
|
|
100
|
+
}
|
|
101
|
+
export {
|
|
102
|
+
createDebouncedWriter,
|
|
103
|
+
createStoragePersist,
|
|
104
|
+
flushOnPageExit
|
|
105
|
+
};
|
|
106
|
+
//# sourceMappingURL=persist.js.map
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../../src/session/persist.ts"],
|
|
4
|
+
"sourcesContent": ["/**\n * Keeping the session's layout across reloads: a host gives the session store a\n * {@link ArbiSessionPersist} (where the saved layout is read and written), and the store reads it\n * once at start and writes it after each change. {@link createStoragePersist} makes one from any\n * key-value storage (IndexedDB, `localStorage`), writing at most once per quiet period and on page\n * exit, so a stream of changes (dragging a column) is one write and a reload never loses the last.\n */\n\n/** Where a session store keeps its saved layout. */\nexport interface ArbiSessionPersist<T = unknown> {\n /** The saved value, or null when none (or it cannot be read). Never rejects. */\n load(): Promise<T | null>\n /** Save the latest value (may be written later; the latest one wins). */\n save(value: T): void\n /** Forget the saved value (signing out). */\n clear?(): Promise<void>\n}\n\n/** A key-value storage, asynchronous or not (IndexedDB, `localStorage`). */\nexport interface ArbiKeyValueStorage {\n get(key: string): Promise<string | null> | string | null\n set(key: string, value: string): Promise<void> | void\n remove(key: string): Promise<void> | void\n}\n\nexport interface DebouncedWriterOptions {\n /** Performs the write. Errors are reported through `onError`, never thrown to the caller. */\n write: (key: string, value: string) => Promise<void> | void\n /** Trailing-edge quiet period. */\n delayMs: number\n /** Longest a pending value may wait from its first unwritten change. */\n maxWaitMs: number\n onError?: (key: string, error: unknown) => void\n}\n\nexport interface DebouncedWriter {\n /** Queue `value` as the latest value of `key`. */\n schedule: (key: string, value: string) => void\n /** The value queued for `key` but not yet written, if any. */\n pending: (key: string) => string | undefined\n /** Drop the queued value of `key` without writing it. */\n cancel: (key: string) => void\n /** Write every queued value now. */\n flushAll: () => void\n}\n\ninterface Pending {\n value: string\n timer: ReturnType<typeof setTimeout>\n /** When the first change not yet written was queued. */\n firstQueuedAt: number\n}\n\n/**\n * Per-key debounced writer. Rapid successive writes of one key collapse into a single\n * trailing-edge write `delayMs` after the last call; `maxWaitMs` caps how long a steady stream of\n * changes can postpone it.\n */\nexport function createDebouncedWriter({\n write,\n delayMs,\n maxWaitMs,\n onError,\n}: DebouncedWriterOptions): DebouncedWriter {\n const queue = new Map<string, Pending>()\n\n const run = (key: string, value: string) => {\n try {\n void Promise.resolve(write(key, value)).catch((error: unknown) => onError?.(key, error))\n } catch (error) {\n onError?.(key, error)\n }\n }\n\n const flush = (key: string) => {\n const entry = queue.get(key)\n if (!entry) return\n clearTimeout(entry.timer)\n queue.delete(key)\n run(key, entry.value)\n }\n\n return {\n schedule(key, value) {\n const now = Date.now()\n const existing = queue.get(key)\n if (existing) clearTimeout(existing.timer)\n const firstQueuedAt = existing?.firstQueuedAt ?? now\n const wait = Math.max(0, Math.min(delayMs, firstQueuedAt + maxWaitMs - now))\n queue.set(key, { value, firstQueuedAt, timer: setTimeout(() => flush(key), wait) })\n },\n pending: (key) => queue.get(key)?.value,\n cancel(key) {\n const entry = queue.get(key)\n if (!entry) return\n clearTimeout(entry.timer)\n queue.delete(key)\n },\n flushAll() {\n for (const key of Array.from(queue.keys())) flush(key)\n },\n }\n}\n\n/**\n * Flush `writer` whenever the page may be about to go away: `pagehide`, `visibilitychange` to\n * hidden (often the last event a mobile browser delivers) and `beforeunload`. Returns a function\n * that removes the listeners.\n */\nexport function flushOnPageExit(writer: Pick<DebouncedWriter, 'flushAll'>): () => void {\n if (typeof window === 'undefined' || typeof document === 'undefined') return () => {}\n const flush = () => writer.flushAll()\n const onVisibility = () => {\n if (document.visibilityState === 'hidden') writer.flushAll()\n }\n window.addEventListener('beforeunload', flush)\n window.addEventListener('pagehide', flush)\n document.addEventListener('visibilitychange', onVisibility)\n return () => {\n window.removeEventListener('beforeunload', flush)\n window.removeEventListener('pagehide', flush)\n document.removeEventListener('visibilitychange', onVisibility)\n }\n}\n\nexport interface StoragePersistOptions<T> {\n storage: ArbiKeyValueStorage\n /** The storage key. */\n key: string\n /** Read a value saved under `key` by an earlier build (default: as JSON). Never throws. */\n parse?: (saved: unknown) => T | null\n /**\n * Bring in what an earlier build saved elsewhere: called on every load with what is saved under\n * `key` (null: nothing yet), it returns the value to start from. A value other than the one given\n * is saved under `key` at once, so each piece is brought in once.\n */\n migrate?: (saved: T | null) => Promise<T | null>\n /** Quiet period before a write (default 250 ms), and the longest wait (default 1 s). */\n delayMs?: number\n maxWaitMs?: number\n}\n\n/** A {@link ArbiSessionPersist} on a key-value storage, debounced and flushed on page exit. */\nexport function createStoragePersist<T>({\n storage,\n key,\n parse = (saved) => saved as T,\n migrate,\n delayMs = 250,\n maxWaitMs = 1000,\n}: StoragePersistOptions<T>): ArbiSessionPersist<T> {\n const writer = createDebouncedWriter({\n write: (k, value) => storage.set(k, value),\n delayMs,\n maxWaitMs,\n onError: (k, error) => console.error(`[session] Failed to save ${k}:`, error),\n })\n flushOnPageExit(writer)\n const read = async (): Promise<T | null> => {\n // A queued write is the latest value.\n const pending = writer.pending(key)\n const raw = pending ?? (await storage.get(key))\n if (raw === null || raw === undefined) return null\n return parse(JSON.parse(raw))\n }\n return {\n async load() {\n try {\n const saved = await read()\n if (!migrate) return saved\n const migrated = await migrate(saved)\n if (migrated !== null && migrated !== saved)\n await storage.set(key, JSON.stringify(migrated))\n return migrated\n } catch (error) {\n console.warn('[session] The saved layout could not be read; starting from defaults', error)\n return null\n }\n },\n save: (value) => writer.schedule(key, JSON.stringify(value)),\n async clear() {\n writer.cancel(key)\n await storage.remove(key)\n },\n }\n}\n"],
|
|
5
|
+
"mappings": "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",
|
|
6
|
+
"names": []
|
|
7
|
+
}
|
|
@@ -0,0 +1,53 @@
|
|
|
1
|
+
import { useCallback, useSyncExternalStore } from "react";
|
|
2
|
+
import { useArbiHost } from "../host/config.js";
|
|
3
|
+
import { OWN_SESSION_SLOT } from "../host/merge.js";
|
|
4
|
+
import { createArbiSessionStore } from "./store.js";
|
|
5
|
+
import { createSealedDraftStorage } from "./drafts.js";
|
|
6
|
+
function signedInUser(host) {
|
|
7
|
+
const state = host.arbi?.session?.getState();
|
|
8
|
+
return state?.signedIn && state.userExtId ? state.userExtId : null;
|
|
9
|
+
}
|
|
10
|
+
const createOwnStore = (host) => createArbiSessionStore(
|
|
11
|
+
{},
|
|
12
|
+
{ draftStorage: createSealedDraftStorage({ owner: () => signedInUser(host) }) }
|
|
13
|
+
);
|
|
14
|
+
let moduleDefault = null;
|
|
15
|
+
const defaultStore = () => moduleDefault ??= createArbiSessionStore();
|
|
16
|
+
function useArbiSessionStore() {
|
|
17
|
+
const host = useArbiHost();
|
|
18
|
+
if (host.session) return host.session;
|
|
19
|
+
const own = host[OWN_SESSION_SLOT];
|
|
20
|
+
if (own) return own.current ??= createOwnStore(host);
|
|
21
|
+
return defaultStore();
|
|
22
|
+
}
|
|
23
|
+
function useArbiSessionState(selector) {
|
|
24
|
+
const store = useArbiSessionStore();
|
|
25
|
+
const select = () => selector(store.getState());
|
|
26
|
+
return useSyncExternalStore(store.subscribe, select, select);
|
|
27
|
+
}
|
|
28
|
+
function useSessionView(key, fallback) {
|
|
29
|
+
const store = useArbiSessionStore();
|
|
30
|
+
const value = useArbiSessionState((state) => state.views.values[key]);
|
|
31
|
+
const set = useCallback((next) => store.setViewValue(key, next), [store, key]);
|
|
32
|
+
return [value === void 0 ? fallback : value, set];
|
|
33
|
+
}
|
|
34
|
+
function useTransientView(key, fallback) {
|
|
35
|
+
const store = useArbiSessionStore();
|
|
36
|
+
const value = useArbiSessionState((state) => state.views.transient[key]);
|
|
37
|
+
const set = useCallback((next) => store.setTransientView(key, next), [store, key]);
|
|
38
|
+
return [value === void 0 ? fallback : value, set];
|
|
39
|
+
}
|
|
40
|
+
function useSessionPageTab(page, fallback) {
|
|
41
|
+
const store = useArbiSessionStore();
|
|
42
|
+
const activeTab = useArbiSessionState((state) => state.views.tabs[page]) || fallback;
|
|
43
|
+
const setActiveTab = useCallback((tab) => store.setPageTab(page, tab), [store, page]);
|
|
44
|
+
return { activeTab, setActiveTab };
|
|
45
|
+
}
|
|
46
|
+
export {
|
|
47
|
+
useArbiSessionState,
|
|
48
|
+
useArbiSessionStore,
|
|
49
|
+
useSessionPageTab,
|
|
50
|
+
useSessionView,
|
|
51
|
+
useTransientView
|
|
52
|
+
};
|
|
53
|
+
//# sourceMappingURL=session-hooks.js.map
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../../src/session/session-hooks.ts"],
|
|
4
|
+
"sourcesContent": ["/**\n * The session state the blocks share (see `./store`). A host passes its own {@link ArbiSessionStore}\n * as the host configuration's `session` (ARBI-frontend backs it with its zustand store). Without\n * one, each top-level `<ArbiHost>` keeps an in-memory one, and blocks rendered with no host share a\n * module default, so a standalone block still coordinates with its siblings. A host's own store\n * keeps the composers' drafts across reloads, sealed to the person signed in on the host's `Arbi`\n * and only for them; the module default (no host, so no one signed in) keeps them in memory.\n */\n\nimport { useCallback, useSyncExternalStore } from 'react'\nimport { useArbiHost, type ArbiHostConfig } from '../host/config'\nimport { OWN_SESSION_SLOT } from '../host/merge'\nimport { createArbiSessionStore, type ArbiSessionState, type ArbiSessionStore } from './store'\nimport { createSealedDraftStorage } from './drafts'\n\n/** Who is signed in on the host's `Arbi` (its session), `null` when no one is. */\nfunction signedInUser(host: ArbiHostConfig): string | null {\n const state = host.arbi?.session?.getState()\n return state?.signedIn && state.userExtId ? state.userExtId : null\n}\n\n/** A host's own session: in memory, with its drafts kept sealed for the signed-in person. */\nconst createOwnStore = (host: ArbiHostConfig) =>\n createArbiSessionStore(\n {},\n { draftStorage: createSealedDraftStorage({ owner: () => signedInUser(host) }) }\n )\n\nlet moduleDefault: ArbiSessionStore | null = null\nconst defaultStore = () => (moduleDefault ??= createArbiSessionStore())\n\n/** The session store: its setters, and `getState()` for the state as of now (in callbacks). */\nexport function useArbiSessionStore(): ArbiSessionStore {\n const host = useArbiHost()\n if (host.session) return host.session\n const own = (host as Record<string, unknown>)[OWN_SESSION_SLOT] as\n { current: ArbiSessionStore | null } | undefined\n if (own) return (own.current ??= createOwnStore(host))\n return defaultStore()\n}\n\n/**\n * A slice of the session state; re-renders when it changes. The selector returns a value from the\n * state or a primitive (a new object each call would never settle).\n */\nexport function useArbiSessionState<T>(selector: (state: ArbiSessionState) => T): T {\n const store = useArbiSessionStore()\n const select = () => selector(store.getState())\n return useSyncExternalStore(store.subscribe, select, select)\n}\n\n/**\n * A view setting kept in the session and saved across reloads (`views.values`: a page's view\n * mode, a zoom, a filter box's text), and its setter. `fallback` while none is set.\n */\nexport function useSessionView<T>(key: string, fallback: T): [T, (value: T) => void] {\n const store = useArbiSessionStore()\n const value = useArbiSessionState((state) => state.views.values[key]) as T | undefined\n const set = useCallback((next: T) => store.setViewValue(key, next), [store, key])\n return [value === undefined ? fallback : value, set]\n}\n\n/**\n * View state kept for this session only (`views.transient`: a search's results, a one-shot\n * request), and its setter (`undefined` drops it). `fallback` while none is set.\n */\nexport function useTransientView<T>(key: string, fallback: T): [T, (value: T | undefined) => void] {\n const store = useArbiSessionStore()\n const value = useArbiSessionState((state) => state.views.transient[key]) as T | undefined\n const set = useCallback((next: T | undefined) => store.setTransientView(key, next), [store, key])\n return [value === undefined ? fallback : value, set]\n}\n\n/** A page's selected tab, kept across reloads; the host supplies its default tab. */\nexport function useSessionPageTab(\n page: string,\n fallback: string\n): {\n activeTab: string\n setActiveTab: (tab: string) => void\n} {\n const store = useArbiSessionStore()\n const activeTab = useArbiSessionState((state) => state.views.tabs[page]) || fallback\n const setActiveTab = useCallback((tab: string) => store.setPageTab(page, tab), [store, page])\n return { activeTab, setActiveTab }\n}\n"],
|
|
5
|
+
"mappings": "AASA,SAAS,aAAa,4BAA4B;AAClD,SAAS,mBAAwC;AACjD,SAAS,wBAAwB;AACjC,SAAS,8BAA4E;AACrF,SAAS,gCAAgC;AAGzC,SAAS,aAAa,MAAqC;AACzD,QAAM,QAAQ,KAAK,MAAM,SAAS,SAAS;AAC3C,SAAO,OAAO,YAAY,MAAM,YAAY,MAAM,YAAY;AAChE;AAGA,MAAM,iBAAiB,CAAC,SACtB;AAAA,EACE,CAAC;AAAA,EACD,EAAE,cAAc,yBAAyB,EAAE,OAAO,MAAM,aAAa,IAAI,EAAE,CAAC,EAAE;AAChF;AAEF,IAAI,gBAAyC;AAC7C,MAAM,eAAe,MAAO,kBAAkB,uBAAuB;AAG9D,SAAS,sBAAwC;AACtD,QAAM,OAAO,YAAY;AACzB,MAAI,KAAK,QAAS,QAAO,KAAK;AAC9B,QAAM,MAAO,KAAiC,gBAAgB;AAE9D,MAAI,IAAK,QAAQ,IAAI,YAAY,eAAe,IAAI;AACpD,SAAO,aAAa;AACtB;AAMO,SAAS,oBAAuB,UAA6C;AAClF,QAAM,QAAQ,oBAAoB;AAClC,QAAM,SAAS,MAAM,SAAS,MAAM,SAAS,CAAC;AAC9C,SAAO,qBAAqB,MAAM,WAAW,QAAQ,MAAM;AAC7D;AAMO,SAAS,eAAkB,KAAa,UAAsC;AACnF,QAAM,QAAQ,oBAAoB;AAClC,QAAM,QAAQ,oBAAoB,CAAC,UAAU,MAAM,MAAM,OAAO,GAAG,CAAC;AACpE,QAAM,MAAM,YAAY,CAAC,SAAY,MAAM,aAAa,KAAK,IAAI,GAAG,CAAC,OAAO,GAAG,CAAC;AAChF,SAAO,CAAC,UAAU,SAAY,WAAW,OAAO,GAAG;AACrD;AAMO,SAAS,iBAAoB,KAAa,UAAkD;AACjG,QAAM,QAAQ,oBAAoB;AAClC,QAAM,QAAQ,oBAAoB,CAAC,UAAU,MAAM,MAAM,UAAU,GAAG,CAAC;AACvE,QAAM,MAAM,YAAY,CAAC,SAAwB,MAAM,iBAAiB,KAAK,IAAI,GAAG,CAAC,OAAO,GAAG,CAAC;AAChG,SAAO,CAAC,UAAU,SAAY,WAAW,OAAO,GAAG;AACrD;AAGO,SAAS,kBACd,MACA,UAIA;AACA,QAAM,QAAQ,oBAAoB;AAClC,QAAM,YAAY,oBAAoB,CAAC,UAAU,MAAM,MAAM,KAAK,IAAI,CAAC,KAAK;AAC5E,QAAM,eAAe,YAAY,CAAC,QAAgB,MAAM,WAAW,MAAM,GAAG,GAAG,CAAC,OAAO,IAAI,CAAC;AAC5F,SAAO,EAAE,WAAW,aAAa;AACnC;",
|
|
6
|
+
"names": []
|
|
7
|
+
}
|