@remit/web-client 0.0.325 → 0.0.327
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/harness/index.html +50 -0
- package/dist/harness/vite-preset.d.ts +10 -0
- package/dist/harness/vite-preset.js +151 -0
- package/dist/spellcheck/languages.d.ts +33 -0
- package/dist/spellcheck/languages.js +66 -0
- package/dist/spellcheck/vite-plugin.d.ts +43 -0
- package/dist/spellcheck/vite-plugin.js +294 -0
- package/dist/spellcheck/worker-stub.d.ts +15 -0
- package/dist/spellcheck/worker-stub.js +33 -0
- package/dist/src/auth/AccountMenu.d.ts +1 -0
- package/dist/src/auth/AccountMenu.js +4 -0
- package/dist/src/auth/AccountSession.d.ts +14 -0
- package/dist/src/auth/AccountSession.js +12 -0
- package/dist/src/auth/BetterAuthShell.d.ts +18 -0
- package/dist/src/auth/BetterAuthShell.js +88 -0
- package/dist/src/auth/SessionRateLimited.d.ts +12 -0
- package/dist/src/auth/SessionRateLimited.js +10 -0
- package/dist/src/auth/SignInAgain.d.ts +1 -0
- package/dist/src/auth/SignInAgain.js +6 -0
- package/dist/src/auth/account-menu-mode.d.ts +13 -0
- package/dist/src/auth/account-menu-mode.js +15 -0
- package/dist/src/auth/amplify-config.d.ts +9 -0
- package/dist/src/auth/amplify-config.js +43 -0
- package/dist/src/auth/auth-error.d.ts +42 -0
- package/dist/src/auth/auth-error.js +81 -0
- package/dist/src/auth/auth-interceptor.d.ts +12 -0
- package/dist/src/auth/auth-interceptor.js +24 -0
- package/dist/src/auth/better-auth/BetterAuthAccount.d.ts +7 -0
- package/dist/src/auth/better-auth/BetterAuthAccount.js +18 -0
- package/dist/src/auth/better-auth-config.d.ts +43 -0
- package/dist/src/auth/better-auth-config.js +215 -0
- package/dist/src/auth/better-auth-provider.d.ts +7 -0
- package/dist/src/auth/better-auth-provider.js +15 -0
- package/dist/src/auth/cognito/CognitoAccount.d.ts +8 -0
- package/dist/src/auth/cognito/CognitoAccount.js +32 -0
- package/dist/src/auth/cognito/CognitoShell.d.ts +6 -0
- package/dist/src/auth/cognito/CognitoShell.js +204 -0
- package/dist/src/auth/cognito/cognito-token.d.ts +9 -0
- package/dist/src/auth/cognito/cognito-token.js +36 -0
- package/dist/src/auth/cognito-provider.d.ts +8 -0
- package/dist/src/auth/cognito-provider.js +17 -0
- package/dist/src/auth/combined-provider.d.ts +2 -0
- package/dist/src/auth/combined-provider.js +27 -0
- package/dist/src/auth/provider.d.ts +51 -0
- package/dist/src/auth/provider.js +18 -0
- package/dist/src/auth/session-state.d.ts +29 -0
- package/dist/src/auth/session-state.js +16 -0
- package/dist/src/auth/sign-out-visibility.d.ts +5 -0
- package/dist/src/auth/sign-out-visibility.js +1 -0
- package/dist/src/components/calendar/AgendaStrip.d.ts +64 -0
- package/dist/src/components/calendar/AgendaStrip.js +19 -0
- package/dist/src/components/calendar/AgendaView.d.ts +42 -0
- package/dist/src/components/calendar/AgendaView.js +131 -0
- package/dist/src/components/calendar/CalendarComposePane.d.ts +49 -0
- package/dist/src/components/calendar/CalendarComposePane.js +8 -0
- package/dist/src/components/calendar/CalendarComposeSeed.d.ts +7 -0
- package/dist/src/components/calendar/CalendarComposeSeed.js +19 -0
- package/dist/src/components/calendar/CalendarEventPane.d.ts +48 -0
- package/dist/src/components/calendar/CalendarEventPane.js +48 -0
- package/dist/src/components/calendar/CalendarShell.d.ts +43 -0
- package/dist/src/components/calendar/CalendarShell.js +35 -0
- package/dist/src/components/calendar/CalendarUnavailable.d.ts +13 -0
- package/dist/src/components/calendar/CalendarUnavailable.js +24 -0
- package/dist/src/components/calendar/CalendarViewPlaceholder.d.ts +1 -0
- package/dist/src/components/calendar/CalendarViewPlaceholder.js +5 -0
- package/dist/src/components/calendar/CalendarWaiting.d.ts +25 -0
- package/dist/src/components/calendar/CalendarWaiting.js +14 -0
- package/dist/src/components/calendar/CalendarWorkspace.d.ts +49 -0
- package/dist/src/components/calendar/CalendarWorkspace.js +65 -0
- package/dist/src/components/calendar/ChangeCalendarSuggestion.d.ts +5 -0
- package/dist/src/components/calendar/ChangeCalendarSuggestion.js +66 -0
- package/dist/src/components/calendar/OpenCalendarEvent.d.ts +20 -0
- package/dist/src/components/calendar/OpenCalendarEvent.js +169 -0
- package/dist/src/components/calendar/PendingSuggestions.d.ts +9 -0
- package/dist/src/components/calendar/PendingSuggestions.js +50 -0
- package/dist/src/components/calendar/WriteCalendarEvent.d.ts +13 -0
- package/dist/src/components/calendar/WriteCalendarEvent.js +59 -0
- package/dist/src/components/calendar/calendar-story-fixtures.d.ts +21 -0
- package/dist/src/components/calendar/calendar-story-fixtures.js +95 -0
- package/dist/src/components/calendar/calendar-story-server.d.ts +37 -0
- package/dist/src/components/calendar/calendar-story-server.js +108 -0
- package/dist/src/components/compose/AddressField.d.ts +13 -0
- package/dist/src/components/compose/AddressField.js +23 -0
- package/dist/src/components/compose/ComposeForm.d.ts +31 -0
- package/dist/src/components/compose/ComposeForm.js +925 -0
- package/dist/src/components/compose/ComposeProvider.d.ts +38 -0
- package/dist/src/components/compose/ComposeProvider.js +101 -0
- package/dist/src/components/compose/ComposeSmtpMissingBanner.d.ts +8 -0
- package/dist/src/components/compose/ComposeSmtpMissingBanner.js +10 -0
- package/dist/src/components/compose/ConversationCompose.d.ts +17 -0
- package/dist/src/components/compose/ConversationCompose.js +46 -0
- package/dist/src/components/compose/FromSelector.d.ts +7 -0
- package/dist/src/components/compose/FromSelector.js +29 -0
- package/dist/src/components/compose/FullCompose.d.ts +6 -0
- package/dist/src/components/compose/FullCompose.js +38 -0
- package/dist/src/components/compose/MobileComposeSheet.d.ts +1 -0
- package/dist/src/components/compose/MobileComposeSheet.js +65 -0
- package/dist/src/components/compose/compose-spellcheck.d.ts +17 -0
- package/dist/src/components/compose/compose-spellcheck.js +43 -0
- package/dist/src/components/compose/compose-title.d.ts +9 -0
- package/dist/src/components/compose/compose-title.js +9 -0
- package/dist/src/components/compose/mail-sync-off-refusal.d.ts +1 -0
- package/dist/src/components/compose/mail-sync-off-refusal.js +7 -0
- package/dist/src/components/compose/quoted-message.d.ts +59 -0
- package/dist/src/components/compose/quoted-message.js +162 -0
- package/dist/src/components/compose/reply-with-times.d.ts +6 -0
- package/dist/src/components/compose/reply-with-times.js +12 -0
- package/dist/src/components/config-import/ConfigImportWizard.d.ts +24 -0
- package/dist/src/components/config-import/ConfigImportWizard.js +425 -0
- package/dist/src/components/config-import/config-import.fixtures.d.ts +27 -0
- package/dist/src/components/config-import/config-import.fixtures.js +167 -0
- package/dist/src/components/config-import/steps.d.ts +100 -0
- package/dist/src/components/config-import/steps.js +143 -0
- package/dist/src/components/layout/AppShellSkeleton.d.ts +9 -0
- package/dist/src/components/layout/AppShellSkeleton.js +12 -0
- package/dist/src/components/layout/ComposeFab.d.ts +12 -0
- package/dist/src/components/layout/ComposeFab.js +21 -0
- package/dist/src/components/layout/Drawer.d.ts +28 -0
- package/dist/src/components/layout/Drawer.js +37 -0
- package/dist/src/components/layout/MailShell.d.ts +51 -0
- package/dist/src/components/layout/MailShell.js +39 -0
- package/dist/src/components/layout/MailTopBar.d.ts +14 -0
- package/dist/src/components/layout/MailTopBar.js +44 -0
- package/dist/src/components/mail/AuthenticityBanner.d.ts +14 -0
- package/dist/src/components/mail/AuthenticityBanner.js +18 -0
- package/dist/src/components/mail/AutoMovedIndicator.d.ts +20 -0
- package/dist/src/components/mail/AutoMovedIndicator.js +25 -0
- package/dist/src/components/mail/BlockedImagesNotice.d.ts +17 -0
- package/dist/src/components/mail/BlockedImagesNotice.js +8 -0
- package/dist/src/components/mail/BriefPane.d.ts +33 -0
- package/dist/src/components/mail/BriefPane.js +255 -0
- package/dist/src/components/mail/BulkRunProvider.d.ts +90 -0
- package/dist/src/components/mail/BulkRunProvider.js +203 -0
- package/dist/src/components/mail/ConversationView.d.ts +52 -0
- package/dist/src/components/mail/ConversationView.js +279 -0
- package/dist/src/components/mail/DailyBrief.d.ts +46 -0
- package/dist/src/components/mail/DailyBrief.js +584 -0
- package/dist/src/components/mail/DeleteConfirmDialog.d.ts +25 -0
- package/dist/src/components/mail/DeleteConfirmDialog.js +70 -0
- package/dist/src/components/mail/DraftsView.d.ts +15 -0
- package/dist/src/components/mail/DraftsView.js +84 -0
- package/dist/src/components/mail/EmptyTrashBar.d.ts +47 -0
- package/dist/src/components/mail/EmptyTrashBar.js +73 -0
- package/dist/src/components/mail/FlaggedList.d.ts +20 -0
- package/dist/src/components/mail/FlaggedList.js +173 -0
- package/dist/src/components/mail/FlaggedPane.d.ts +29 -0
- package/dist/src/components/mail/FlaggedPane.js +225 -0
- package/dist/src/components/mail/IntelligenceDrawer.d.ts +19 -0
- package/dist/src/components/mail/IntelligenceDrawer.js +16 -0
- package/dist/src/components/mail/IntelligencePane.d.ts +59 -0
- package/dist/src/components/mail/IntelligencePane.js +130 -0
- package/dist/src/components/mail/LabelApplyTrigger.d.ts +15 -0
- package/dist/src/components/mail/LabelApplyTrigger.js +29 -0
- package/dist/src/components/mail/MailListHeader.d.ts +102 -0
- package/dist/src/components/mail/MailListHeader.js +303 -0
- package/dist/src/components/mail/MailNav.d.ts +17 -0
- package/dist/src/components/mail/MailNav.js +20 -0
- package/dist/src/components/mail/MailSidebarAdapter.d.ts +23 -0
- package/dist/src/components/mail/MailSidebarAdapter.js +161 -0
- package/dist/src/components/mail/MailViewChrome.d.ts +54 -0
- package/dist/src/components/mail/MailViewChrome.js +43 -0
- package/dist/src/components/mail/MailboxPane.d.ts +36 -0
- package/dist/src/components/mail/MailboxPane.js +698 -0
- package/dist/src/components/mail/MessageActionMenu.d.ts +36 -0
- package/dist/src/components/mail/MessageActionMenu.js +129 -0
- package/dist/src/components/mail/MessageAttachments.d.ts +21 -0
- package/dist/src/components/mail/MessageAttachments.js +96 -0
- package/dist/src/components/mail/MessageBody.d.ts +72 -0
- package/dist/src/components/mail/MessageBody.js +68 -0
- package/dist/src/components/mail/MessageBodyErrorBanner.d.ts +20 -0
- package/dist/src/components/mail/MessageBodyErrorBanner.js +29 -0
- package/dist/src/components/mail/MessageCard.d.ts +29 -0
- package/dist/src/components/mail/MessageCard.js +77 -0
- package/dist/src/components/mail/MessageList.d.ts +130 -0
- package/dist/src/components/mail/MessageList.js +896 -0
- package/dist/src/components/mail/MessageListItem.d.ts +32 -0
- package/dist/src/components/mail/MessageListItem.js +41 -0
- package/dist/src/components/mail/MessageRow.d.ts +57 -0
- package/dist/src/components/mail/MessageRow.js +137 -0
- package/dist/src/components/mail/MessageSettlementAlert.d.ts +27 -0
- package/dist/src/components/mail/MessageSettlementAlert.js +79 -0
- package/dist/src/components/mail/MessageToolbar.d.ts +58 -0
- package/dist/src/components/mail/MessageToolbar.js +80 -0
- package/dist/src/components/mail/MobileMessageBar.d.ts +25 -0
- package/dist/src/components/mail/MobileMessageBar.js +61 -0
- package/dist/src/components/mail/MoveToTrigger.d.ts +30 -0
- package/dist/src/components/mail/MoveToTrigger.js +114 -0
- package/dist/src/components/mail/NavMenuButton.d.ts +1 -0
- package/dist/src/components/mail/NavMenuButton.js +17 -0
- package/dist/src/components/mail/OutboxPane.d.ts +27 -0
- package/dist/src/components/mail/OutboxPane.js +247 -0
- package/dist/src/components/mail/PullToRefresh.d.ts +12 -0
- package/dist/src/components/mail/PullToRefresh.js +12 -0
- package/dist/src/components/mail/RawMessageView.d.ts +18 -0
- package/dist/src/components/mail/RawMessageView.js +30 -0
- package/dist/src/components/mail/RoleAppointmentPromptProvider.d.ts +39 -0
- package/dist/src/components/mail/RoleAppointmentPromptProvider.js +137 -0
- package/dist/src/components/mail/SelectionWizardHost.d.ts +110 -0
- package/dist/src/components/mail/SelectionWizardHost.js +721 -0
- package/dist/src/components/mail/SpamRescue.d.ts +17 -0
- package/dist/src/components/mail/SpamRescue.js +64 -0
- package/dist/src/components/mail/SwipeableMessageRow.d.ts +31 -0
- package/dist/src/components/mail/SwipeableMessageRow.js +69 -0
- package/dist/src/components/mail/ThreadListInteraction.d.ts +106 -0
- package/dist/src/components/mail/ThreadListInteraction.js +319 -0
- package/dist/src/components/mail/bulk-run-state.d.ts +37 -0
- package/dist/src/components/mail/bulk-run-state.js +64 -0
- package/dist/src/components/mail/intelligence-story-calendar.d.ts +7 -0
- package/dist/src/components/mail/intelligence-story-calendar.js +17 -0
- package/dist/src/components/mail/message-body-error-banner-content.d.ts +31 -0
- package/dist/src/components/mail/message-body-error-banner-content.js +70 -0
- package/dist/src/components/mail/organize-run-state.d.ts +26 -0
- package/dist/src/components/mail/organize-run-state.js +24 -0
- package/dist/src/components/mail/selection-wizard-run-controls.d.ts +66 -0
- package/dist/src/components/mail/selection-wizard-run-controls.js +65 -0
- package/dist/src/components/mail/useModifierSelect.d.ts +35 -0
- package/dist/src/components/mail/useModifierSelect.js +75 -0
- package/dist/src/components/onboarding/OnboardingWizard.d.ts +83 -0
- package/dist/src/components/onboarding/OnboardingWizard.js +661 -0
- package/dist/src/components/onboarding/credential-steps.d.ts +58 -0
- package/dist/src/components/onboarding/credential-steps.js +198 -0
- package/dist/src/components/self-update/SelfUpdateOverlay.d.ts +1 -0
- package/dist/src/components/self-update/SelfUpdateOverlay.js +25 -0
- package/dist/src/components/settings/AccountFormPanel.d.ts +29 -0
- package/dist/src/components/settings/AccountFormPanel.js +337 -0
- package/dist/src/components/settings/AccountServices.d.ts +6 -0
- package/dist/src/components/settings/AccountServices.js +100 -0
- package/dist/src/components/settings/AccountServicesCard.d.ts +16 -0
- package/dist/src/components/settings/AccountServicesCard.js +13 -0
- package/dist/src/components/settings/AdvancedNavIcon.d.ts +1 -0
- package/dist/src/components/settings/AdvancedNavIcon.js +17 -0
- package/dist/src/components/settings/CalendarCreateCard.d.ts +12 -0
- package/dist/src/components/settings/CalendarCreateCard.js +42 -0
- package/dist/src/components/settings/CalendarDetailsForm.d.ts +15 -0
- package/dist/src/components/settings/CalendarDetailsForm.js +34 -0
- package/dist/src/components/settings/CalendarFeedCard.d.ts +18 -0
- package/dist/src/components/settings/CalendarFeedCard.js +58 -0
- package/dist/src/components/settings/CalendarFeedPanel.d.ts +13 -0
- package/dist/src/components/settings/CalendarFeedPanel.js +7 -0
- package/dist/src/components/settings/CalendarSettingsPanel.d.ts +13 -0
- package/dist/src/components/settings/CalendarSettingsPanel.js +21 -0
- package/dist/src/components/settings/CalendarSubscribeCard.d.ts +11 -0
- package/dist/src/components/settings/CalendarSubscribeCard.js +30 -0
- package/dist/src/components/settings/CalendarSubscriptionStatus.d.ts +12 -0
- package/dist/src/components/settings/CalendarSubscriptionStatus.js +20 -0
- package/dist/src/components/settings/ConfigExportCard.d.ts +18 -0
- package/dist/src/components/settings/ConfigExportCard.js +16 -0
- package/dist/src/components/settings/ConfigTransferPanel.d.ts +15 -0
- package/dist/src/components/settings/ConfigTransferPanel.js +55 -0
- package/dist/src/components/settings/DangerZone.d.ts +1 -0
- package/dist/src/components/settings/DangerZone.js +8 -0
- package/dist/src/components/settings/DeleteAccountDialog.d.ts +13 -0
- package/dist/src/components/settings/DeleteAccountDialog.js +62 -0
- package/dist/src/components/settings/DeleteFolderDialog.d.ts +21 -0
- package/dist/src/components/settings/DeleteFolderDialog.js +116 -0
- package/dist/src/components/settings/FilterActionError.d.ts +8 -0
- package/dist/src/components/settings/FilterActionError.js +10 -0
- package/dist/src/components/settings/FilterEditor.d.ts +22 -0
- package/dist/src/components/settings/FilterEditor.js +143 -0
- package/dist/src/components/settings/FilterEditorSurface.d.ts +18 -0
- package/dist/src/components/settings/FilterEditorSurface.js +18 -0
- package/dist/src/components/settings/FiltersList.d.ts +31 -0
- package/dist/src/components/settings/FiltersList.js +58 -0
- package/dist/src/components/settings/LabelsList.d.ts +15 -0
- package/dist/src/components/settings/LabelsList.js +37 -0
- package/dist/src/components/settings/SelfUpdatePanel.d.ts +1 -0
- package/dist/src/components/settings/SelfUpdatePanel.js +19 -0
- package/dist/src/components/settings/TimeZoneSelect.d.ts +12 -0
- package/dist/src/components/settings/TimeZoneSelect.js +10 -0
- package/dist/src/components/settings/TlsRootCaDownload.d.ts +1 -0
- package/dist/src/components/settings/TlsRootCaDownload.js +15 -0
- package/dist/src/components/settings/WarningsNavIcon.d.ts +1 -0
- package/dist/src/components/settings/WarningsNavIcon.js +8 -0
- package/dist/src/components/settings/WarningsPanel.d.ts +21 -0
- package/dist/src/components/settings/WarningsPanel.js +93 -0
- package/dist/src/components/settings/account-form-helpers.d.ts +53 -0
- package/dist/src/components/settings/account-form-helpers.js +78 -0
- package/dist/src/components/ui/AppVersion.d.ts +12 -0
- package/dist/src/components/ui/AppVersion.js +19 -0
- package/dist/src/components/ui/BugReportButton.d.ts +6 -0
- package/dist/src/components/ui/BugReportButton.js +11 -0
- package/dist/src/components/ui/ErrorBannerProvider.d.ts +27 -0
- package/dist/src/components/ui/ErrorBannerProvider.js +82 -0
- package/dist/src/components/ui/FatalErrorOverlay.d.ts +31 -0
- package/dist/src/components/ui/FatalErrorOverlay.js +71 -0
- package/dist/src/components/ui/error-banners.d.ts +43 -0
- package/dist/src/components/ui/error-banners.js +69 -0
- package/dist/src/components/ui/folder-role-refusal.d.ts +29 -0
- package/dist/src/components/ui/folder-role-refusal.js +44 -0
- package/dist/src/components/ui/placement-refusal.d.ts +31 -0
- package/dist/src/components/ui/placement-refusal.js +39 -0
- package/dist/src/hooks/calendar/agenda-window.d.ts +110 -0
- package/dist/src/hooks/calendar/agenda-window.js +159 -0
- package/dist/src/hooks/calendar/draft.d.ts +59 -0
- package/dist/src/hooks/calendar/draft.js +142 -0
- package/dist/src/hooks/calendar/index.d.ts +24 -0
- package/dist/src/hooks/calendar/index.js +24 -0
- package/dist/src/hooks/calendar/instance.d.ts +61 -0
- package/dist/src/hooks/calendar/instance.js +145 -0
- package/dist/src/hooks/calendar/recurrence-rule.d.ts +29 -0
- package/dist/src/hooks/calendar/recurrence-rule.js +159 -0
- package/dist/src/hooks/calendar/resource.d.ts +14 -0
- package/dist/src/hooks/calendar/resource.js +87 -0
- package/dist/src/hooks/calendar/selection.d.ts +38 -0
- package/dist/src/hooks/calendar/selection.js +54 -0
- package/dist/src/hooks/calendar/suggestion-draft.d.ts +11 -0
- package/dist/src/hooks/calendar/suggestion-draft.js +45 -0
- package/dist/src/hooks/calendar/useCalendarCollectionWrites.d.ts +26 -0
- package/dist/src/hooks/calendar/useCalendarCollectionWrites.js +75 -0
- package/dist/src/hooks/calendar/useCalendarEvent.d.ts +8 -0
- package/dist/src/hooks/calendar/useCalendarEvent.js +32 -0
- package/dist/src/hooks/calendar/useCalendarEvents.d.ts +58 -0
- package/dist/src/hooks/calendar/useCalendarEvents.js +128 -0
- package/dist/src/hooks/calendar/useCalendarFeed.d.ts +29 -0
- package/dist/src/hooks/calendar/useCalendarFeed.js +115 -0
- package/dist/src/hooks/calendar/useCalendarFreeBusy.d.ts +15 -0
- package/dist/src/hooks/calendar/useCalendarFreeBusy.js +61 -0
- package/dist/src/hooks/calendar/useCalendarJump.d.ts +24 -0
- package/dist/src/hooks/calendar/useCalendarJump.js +95 -0
- package/dist/src/hooks/calendar/useCalendarSubscriptions.d.ts +17 -0
- package/dist/src/hooks/calendar/useCalendarSubscriptions.js +66 -0
- package/dist/src/hooks/calendar/useCalendarSuggestions.d.ts +45 -0
- package/dist/src/hooks/calendar/useCalendarSuggestions.js +171 -0
- package/dist/src/hooks/calendar/useCalendarWrites.d.ts +44 -0
- package/dist/src/hooks/calendar/useCalendarWrites.js +109 -0
- package/dist/src/hooks/calendar/useCalendars.d.ts +20 -0
- package/dist/src/hooks/calendar/useCalendars.js +30 -0
- package/dist/src/hooks/calendar/useDraftClashes.d.ts +15 -0
- package/dist/src/hooks/calendar/useDraftClashes.js +68 -0
- package/dist/src/hooks/calendar/window.d.ts +57 -0
- package/dist/src/hooks/calendar/window.js +135 -0
- package/dist/src/hooks/queries/keys.d.ts +5 -0
- package/dist/src/hooks/queries/keys.js +5 -0
- package/dist/src/hooks/use-system-update.d.ts +40 -0
- package/dist/src/hooks/use-system-update.js +237 -0
- package/dist/src/hooks/useApplyLabel.d.ts +17 -0
- package/dist/src/hooks/useApplyLabel.js +41 -0
- package/dist/src/hooks/useArchiveMailbox.d.ts +74 -0
- package/dist/src/hooks/useArchiveMailbox.js +120 -0
- package/dist/src/hooks/useAutoMovedBadge.d.ts +56 -0
- package/dist/src/hooks/useAutoMovedBadge.js +86 -0
- package/dist/src/hooks/useBriefSections.d.ts +70 -0
- package/dist/src/hooks/useBriefSections.js +210 -0
- package/dist/src/hooks/useCalendarData.d.ts +37 -0
- package/dist/src/hooks/useCalendarData.js +23 -0
- package/dist/src/hooks/useClauseSuggestions.d.ts +14 -0
- package/dist/src/hooks/useClauseSuggestions.js +39 -0
- package/dist/src/hooks/useComposeAttachments.d.ts +20 -0
- package/dist/src/hooks/useComposeAttachments.js +72 -0
- package/dist/src/hooks/useComposeLanguages.d.ts +11 -0
- package/dist/src/hooks/useComposeLanguages.js +44 -0
- package/dist/src/hooks/useCreateMailbox.d.ts +40 -0
- package/dist/src/hooks/useCreateMailbox.js +123 -0
- package/dist/src/hooks/useCurrentMailboxName.d.ts +39 -0
- package/dist/src/hooks/useCurrentMailboxName.js +109 -0
- package/dist/src/hooks/useDebouncedValue.d.ts +1 -0
- package/dist/src/hooks/useDebouncedValue.js +9 -0
- package/dist/src/hooks/useDeleteFolder.d.ts +36 -0
- package/dist/src/hooks/useDeleteFolder.js +274 -0
- package/dist/src/hooks/useDeleteMessages.d.ts +32 -0
- package/dist/src/hooks/useDeleteMessages.js +162 -0
- package/dist/src/hooks/useDeleteOutcome.d.ts +14 -0
- package/dist/src/hooks/useDeleteOutcome.js +46 -0
- package/dist/src/hooks/useEmptyTrash.d.ts +16 -0
- package/dist/src/hooks/useEmptyTrash.js +130 -0
- package/dist/src/hooks/useEscalatedActions.d.ts +83 -0
- package/dist/src/hooks/useEscalatedActions.js +175 -0
- package/dist/src/hooks/useFilters.d.ts +57 -0
- package/dist/src/hooks/useFilters.js +147 -0
- package/dist/src/hooks/useFolderLabelTranslator.d.ts +6 -0
- package/dist/src/hooks/useFolderLabelTranslator.js +11 -0
- package/dist/src/hooks/useFollowFocusOpen.d.ts +28 -0
- package/dist/src/hooks/useFollowFocusOpen.js +52 -0
- package/dist/src/hooks/useInitialSyncProgress.d.ts +41 -0
- package/dist/src/hooks/useInitialSyncProgress.js +111 -0
- package/dist/src/hooks/useInlineImages.d.ts +16 -0
- package/dist/src/hooks/useInlineImages.js +52 -0
- package/dist/src/hooks/useIntelligenceCalendar.d.ts +20 -0
- package/dist/src/hooks/useIntelligenceCalendar.js +230 -0
- package/dist/src/hooks/useIntelligenceData.d.ts +58 -0
- package/dist/src/hooks/useIntelligenceData.js +242 -0
- package/dist/src/hooks/useIntelligenceDrawer.d.ts +21 -0
- package/dist/src/hooks/useIntelligenceDrawer.js +22 -0
- package/dist/src/hooks/useIntelligenceSurface.d.ts +44 -0
- package/dist/src/hooks/useIntelligenceSurface.js +57 -0
- package/dist/src/hooks/useIsDark.d.ts +8 -0
- package/dist/src/hooks/useIsDark.js +21 -0
- package/dist/src/hooks/useKeyboardNavigation.d.ts +57 -0
- package/dist/src/hooks/useKeyboardNavigation.js +61 -0
- package/dist/src/hooks/useLabels.d.ts +40 -0
- package/dist/src/hooks/useLabels.js +98 -0
- package/dist/src/hooks/useLayoutTier.d.ts +33 -0
- package/dist/src/hooks/useLayoutTier.js +33 -0
- package/dist/src/hooks/useMailboxAccount.d.ts +18 -0
- package/dist/src/hooks/useMailboxAccount.js +48 -0
- package/dist/src/hooks/useMailboxNameIndex.d.ts +2 -0
- package/dist/src/hooks/useMailboxNameIndex.js +21 -0
- package/dist/src/hooks/useMarkAsRead.d.ts +59 -0
- package/dist/src/hooks/useMarkAsRead.js +206 -0
- package/dist/src/hooks/useMatchSample.d.ts +30 -0
- package/dist/src/hooks/useMatchSample.js +74 -0
- package/dist/src/hooks/useMediaQuery.d.ts +11 -0
- package/dist/src/hooks/useMediaQuery.js +12 -0
- package/dist/src/hooks/useMessageBodyContent.d.ts +148 -0
- package/dist/src/hooks/useMessageBodyContent.js +272 -0
- package/dist/src/hooks/useMoveMessages.d.ts +27 -0
- package/dist/src/hooks/useMoveMessages.js +128 -0
- package/dist/src/hooks/useOrganizeJob.d.ts +39 -0
- package/dist/src/hooks/useOrganizeJob.js +95 -0
- package/dist/src/hooks/useRailPanels.d.ts +17 -0
- package/dist/src/hooks/useRailPanels.js +94 -0
- package/dist/src/hooks/useRedirectEnded.d.ts +41 -0
- package/dist/src/hooks/useRedirectEnded.js +106 -0
- package/dist/src/hooks/useRefreshControl.d.ts +97 -0
- package/dist/src/hooks/useRefreshControl.js +234 -0
- package/dist/src/hooks/useReportSpam.d.ts +102 -0
- package/dist/src/hooks/useReportSpam.js +173 -0
- package/dist/src/hooks/useRescueCandidates.d.ts +15 -0
- package/dist/src/hooks/useRescueCandidates.js +41 -0
- package/dist/src/hooks/useResultCount.d.ts +26 -0
- package/dist/src/hooks/useResultCount.js +40 -0
- package/dist/src/hooks/useResultFolderIndex.d.ts +8 -0
- package/dist/src/hooks/useResultFolderIndex.js +45 -0
- package/dist/src/hooks/useReturnFromRedirect.d.ts +19 -0
- package/dist/src/hooks/useReturnFromRedirect.js +38 -0
- package/dist/src/hooks/useRulePreview.d.ts +28 -0
- package/dist/src/hooks/useRulePreview.js +77 -0
- package/dist/src/hooks/useSaveDraft.d.ts +31 -0
- package/dist/src/hooks/useSaveDraft.js +183 -0
- package/dist/src/hooks/useSearchScope.d.ts +15 -0
- package/dist/src/hooks/useSearchScope.js +30 -0
- package/dist/src/hooks/useSearchSuggestions.d.ts +12 -0
- package/dist/src/hooks/useSearchSuggestions.js +77 -0
- package/dist/src/hooks/useSearchTokenContext.d.ts +16 -0
- package/dist/src/hooks/useSearchTokenContext.js +26 -0
- package/dist/src/hooks/useSelectedSubjects.d.ts +6 -0
- package/dist/src/hooks/useSelectedSubjects.js +62 -0
- package/dist/src/hooks/useSignature.d.ts +9 -0
- package/dist/src/hooks/useSignature.js +47 -0
- package/dist/src/hooks/useSpamMatchCounts.d.ts +15 -0
- package/dist/src/hooks/useSpamMatchCounts.js +74 -0
- package/dist/src/hooks/useStaleAccountSync.d.ts +101 -0
- package/dist/src/hooks/useStaleAccountSync.js +252 -0
- package/dist/src/hooks/useStarredThreads.d.ts +42 -0
- package/dist/src/hooks/useStarredThreads.js +100 -0
- package/dist/src/hooks/useThreadActions.d.ts +41 -0
- package/dist/src/hooks/useThreadActions.js +64 -0
- package/dist/src/hooks/useThreadMessageIds.d.ts +10 -0
- package/dist/src/hooks/useThreadMessageIds.js +22 -0
- package/dist/src/hooks/useThreadRow.d.ts +23 -0
- package/dist/src/hooks/useThreadRow.js +40 -0
- package/dist/src/hooks/useToggleStar.d.ts +31 -0
- package/dist/src/hooks/useToggleStar.js +96 -0
- package/dist/src/hooks/useToggleTrusted.d.ts +23 -0
- package/dist/src/hooks/useToggleTrusted.js +100 -0
- package/dist/src/hooks/useTriageLayer.d.ts +80 -0
- package/dist/src/hooks/useTriageLayer.js +99 -0
- package/dist/src/hooks/useTriggerSync.d.ts +30 -0
- package/dist/src/hooks/useTriggerSync.js +42 -0
- package/dist/src/hooks/useUpdateAddressFlags.d.ts +18 -0
- package/dist/src/hooks/useUpdateAddressFlags.js +93 -0
- package/dist/src/hooks/useUpdateFilter.d.ts +16 -0
- package/dist/src/hooks/useUpdateFilter.js +45 -0
- package/dist/src/hooks/useVisualViewport.d.ts +13 -0
- package/dist/src/hooks/useVisualViewport.js +37 -0
- package/dist/src/hooks/useWarningsAttention.d.ts +9 -0
- package/dist/src/hooks/useWarningsAttention.js +31 -0
- package/dist/src/index.css +27 -0
- package/dist/src/lib/account-order.d.ts +3 -0
- package/dist/src/lib/account-order.js +6 -0
- package/dist/src/lib/adjacent-message.d.ts +9 -0
- package/dist/src/lib/adjacent-message.js +19 -0
- package/dist/src/lib/api.d.ts +35 -0
- package/dist/src/lib/api.js +73 -0
- package/dist/src/lib/app-info.d.ts +24 -0
- package/dist/src/lib/app-info.js +26 -0
- package/dist/src/lib/attachment-download.d.ts +63 -0
- package/dist/src/lib/attachment-download.js +130 -0
- package/dist/src/lib/auto-moved.d.ts +46 -0
- package/dist/src/lib/auto-moved.js +82 -0
- package/dist/src/lib/autodiscovery.d.ts +42 -0
- package/dist/src/lib/autodiscovery.js +320 -0
- package/dist/src/lib/brief-criteria.d.ts +69 -0
- package/dist/src/lib/brief-criteria.js +62 -0
- package/dist/src/lib/brief.d.ts +98 -0
- package/dist/src/lib/brief.js +164 -0
- package/dist/src/lib/bug-report.d.ts +67 -0
- package/dist/src/lib/bug-report.js +212 -0
- package/dist/src/lib/bulk-action-copy.d.ts +67 -0
- package/dist/src/lib/bulk-action-copy.js +106 -0
- package/dist/src/lib/bulk-actions.d.ts +228 -0
- package/dist/src/lib/bulk-actions.js +242 -0
- package/dist/src/lib/calendar-collection-copy.d.ts +7 -0
- package/dist/src/lib/calendar-collection-copy.js +12 -0
- package/dist/src/lib/calendar-density.d.ts +26 -0
- package/dist/src/lib/calendar-density.js +31 -0
- package/dist/src/lib/calendar-feed-copy.d.ts +14 -0
- package/dist/src/lib/calendar-feed-copy.js +16 -0
- package/dist/src/lib/calendar-feed-url.d.ts +9 -0
- package/dist/src/lib/calendar-feed-url.js +11 -0
- package/dist/src/lib/calendar-format.d.ts +25 -0
- package/dist/src/lib/calendar-format.js +57 -0
- package/dist/src/lib/calendar-report.d.ts +4 -0
- package/dist/src/lib/calendar-report.js +15 -0
- package/dist/src/lib/calendar-route.d.ts +93 -0
- package/dist/src/lib/calendar-route.js +145 -0
- package/dist/src/lib/calendar-subscription.d.ts +6 -0
- package/dist/src/lib/calendar-subscription.js +8 -0
- package/dist/src/lib/calendar-suggestion.d.ts +56 -0
- package/dist/src/lib/calendar-suggestion.js +165 -0
- package/dist/src/lib/client.d.ts +2 -0
- package/dist/src/lib/client.js +30 -0
- package/dist/src/lib/compose-attachment-controller.d.ts +90 -0
- package/dist/src/lib/compose-attachment-controller.js +359 -0
- package/dist/src/lib/config-import.d.ts +136 -0
- package/dist/src/lib/config-import.js +371 -0
- package/dist/src/lib/console-errors.d.ts +16 -0
- package/dist/src/lib/console-errors.js +80 -0
- package/dist/src/lib/conversation-target.d.ts +16 -0
- package/dist/src/lib/conversation-target.js +1 -0
- package/dist/src/lib/dedupe-thread-messages.d.ts +14 -0
- package/dist/src/lib/dedupe-thread-messages.js +23 -0
- package/dist/src/lib/delete-folder.d.ts +66 -0
- package/dist/src/lib/delete-folder.js +110 -0
- package/dist/src/lib/display-category.d.ts +18 -0
- package/dist/src/lib/display-category.js +20 -0
- package/dist/src/lib/drafts.d.ts +50 -0
- package/dist/src/lib/drafts.js +91 -0
- package/dist/src/lib/error-classifier.d.ts +155 -0
- package/dist/src/lib/error-classifier.js +213 -0
- package/dist/src/lib/escalation-label.d.ts +18 -0
- package/dist/src/lib/escalation-label.js +20 -0
- package/dist/src/lib/fatal-error.d.ts +68 -0
- package/dist/src/lib/fatal-error.js +88 -0
- package/dist/src/lib/filter-report.d.ts +2 -0
- package/dist/src/lib/filter-report.js +13 -0
- package/dist/src/lib/flagged-criteria.d.ts +36 -0
- package/dist/src/lib/flagged-criteria.js +22 -0
- package/dist/src/lib/folder-failure.d.ts +2 -0
- package/dist/src/lib/folder-failure.js +8 -0
- package/dist/src/lib/folder-roles.d.ts +33 -0
- package/dist/src/lib/folder-roles.js +83 -0
- package/dist/src/lib/format.d.ts +156 -0
- package/dist/src/lib/format.js +269 -0
- package/dist/src/lib/fresh-mailbox-count.d.ts +76 -0
- package/dist/src/lib/fresh-mailbox-count.js +37 -0
- package/dist/src/lib/hot-sync-window.d.ts +28 -0
- package/dist/src/lib/hot-sync-window.js +41 -0
- package/dist/src/lib/i18n.d.ts +2 -0
- package/dist/src/lib/i18n.js +29 -0
- package/dist/src/lib/inbox-filters.d.ts +76 -0
- package/dist/src/lib/inbox-filters.js +95 -0
- package/dist/src/lib/intelligence-pref.d.ts +43 -0
- package/dist/src/lib/intelligence-pref.js +41 -0
- package/dist/src/lib/json.d.ts +8 -0
- package/dist/src/lib/json.js +10 -0
- package/dist/src/lib/junk-destination.d.ts +15 -0
- package/dist/src/lib/junk-destination.js +24 -0
- package/dist/src/lib/list-focus.d.ts +14 -0
- package/dist/src/lib/list-focus.js +21 -0
- package/dist/src/lib/list-header-chrome.d.ts +40 -0
- package/dist/src/lib/list-header-chrome.js +12 -0
- package/dist/src/lib/list-narrowing.d.ts +35 -0
- package/dist/src/lib/list-narrowing.js +133 -0
- package/dist/src/lib/list-verb-request.d.ts +43 -0
- package/dist/src/lib/list-verb-request.js +24 -0
- package/dist/src/lib/mail-context.d.ts +61 -0
- package/dist/src/lib/mail-context.js +24 -0
- package/dist/src/lib/mail-freshness.d.ts +57 -0
- package/dist/src/lib/mail-freshness.js +158 -0
- package/dist/src/lib/mail-route.d.ts +103 -0
- package/dist/src/lib/mail-route.js +115 -0
- package/dist/src/lib/mail-search.d.ts +141 -0
- package/dist/src/lib/mail-search.js +55 -0
- package/dist/src/lib/mailbox-sync-wait.d.ts +54 -0
- package/dist/src/lib/mailbox-sync-wait.js +44 -0
- package/dist/src/lib/message-attachments.d.ts +20 -0
- package/dist/src/lib/message-attachments.js +37 -0
- package/dist/src/lib/message-body-source.d.ts +30 -0
- package/dist/src/lib/message-body-source.js +30 -0
- package/dist/src/lib/move-options.d.ts +30 -0
- package/dist/src/lib/move-options.js +33 -0
- package/dist/src/lib/move-targets.d.ts +16 -0
- package/dist/src/lib/move-targets.js +61 -0
- package/dist/src/lib/network-error.d.ts +31 -0
- package/dist/src/lib/network-error.js +68 -0
- package/dist/src/lib/new-folder.d.ts +23 -0
- package/dist/src/lib/new-folder.js +41 -0
- package/dist/src/lib/onboarding-completion.d.ts +15 -0
- package/dist/src/lib/onboarding-completion.js +17 -0
- package/dist/src/lib/organize/clause-suggestions.d.ts +40 -0
- package/dist/src/lib/organize/clause-suggestions.js +61 -0
- package/dist/src/lib/organize/filter-edit-model.d.ts +47 -0
- package/dist/src/lib/organize/filter-edit-model.js +104 -0
- package/dist/src/lib/organize/filter-run.d.ts +27 -0
- package/dist/src/lib/organize/filter-run.js +27 -0
- package/dist/src/lib/organize/filter-status.d.ts +30 -0
- package/dist/src/lib/organize/filter-status.js +84 -0
- package/dist/src/lib/organize/label-delete-copy.d.ts +11 -0
- package/dist/src/lib/organize/label-delete-copy.js +17 -0
- package/dist/src/lib/organize/organize-model.d.ts +110 -0
- package/dist/src/lib/organize/organize-model.js +81 -0
- package/dist/src/lib/organize/organize-poll.d.ts +11 -0
- package/dist/src/lib/organize/organize-poll.js +21 -0
- package/dist/src/lib/organize/rule-model.d.ts +69 -0
- package/dist/src/lib/organize/rule-model.js +98 -0
- package/dist/src/lib/organize/search-to-rule.d.ts +19 -0
- package/dist/src/lib/organize/search-to-rule.js +65 -0
- package/dist/src/lib/outbox-search.d.ts +34 -0
- package/dist/src/lib/outbox-search.js +26 -0
- package/dist/src/lib/outbox-status.d.ts +47 -0
- package/dist/src/lib/outbox-status.js +45 -0
- package/dist/src/lib/provider-presets.d.ts +16 -0
- package/dist/src/lib/provider-presets.js +82 -0
- package/dist/src/lib/quarantine-entries.d.ts +15 -0
- package/dist/src/lib/quarantine-entries.js +40 -0
- package/dist/src/lib/query-error-handler.d.ts +21 -0
- package/dist/src/lib/query-error-handler.js +30 -0
- package/dist/src/lib/recent-searches.d.ts +2 -0
- package/dist/src/lib/recent-searches.js +37 -0
- package/dist/src/lib/recipient-suggestions.d.ts +2 -0
- package/dist/src/lib/recipient-suggestions.js +11 -0
- package/dist/src/lib/request-breadcrumbs.d.ts +59 -0
- package/dist/src/lib/request-breadcrumbs.js +114 -0
- package/dist/src/lib/rescue-candidates.d.ts +17 -0
- package/dist/src/lib/rescue-candidates.js +27 -0
- package/dist/src/lib/rescue-telemetry.d.ts +26 -0
- package/dist/src/lib/rescue-telemetry.js +32 -0
- package/dist/src/lib/result-count.d.ts +43 -0
- package/dist/src/lib/result-count.js +37 -0
- package/dist/src/lib/result-folder.d.ts +57 -0
- package/dist/src/lib/result-folder.js +67 -0
- package/dist/src/lib/route-breadcrumbs.d.ts +27 -0
- package/dist/src/lib/route-breadcrumbs.js +36 -0
- package/dist/src/lib/row-settlement.d.ts +11 -0
- package/dist/src/lib/row-settlement.js +20 -0
- package/dist/src/lib/rum-adapter.d.ts +4 -0
- package/dist/src/lib/rum-adapter.js +84 -0
- package/dist/src/lib/search-conversion.d.ts +17 -0
- package/dist/src/lib/search-conversion.js +17 -0
- package/dist/src/lib/search-params.d.ts +23 -0
- package/dist/src/lib/search-params.js +58 -0
- package/dist/src/lib/search-query.d.ts +1 -0
- package/dist/src/lib/search-query.js +10 -0
- package/dist/src/lib/search-result.d.ts +10 -0
- package/dist/src/lib/search-result.js +34 -0
- package/dist/src/lib/search-scope.d.ts +94 -0
- package/dist/src/lib/search-scope.js +86 -0
- package/dist/src/lib/search-suggestions.d.ts +98 -0
- package/dist/src/lib/search-suggestions.js +202 -0
- package/dist/src/lib/search-surface.d.ts +30 -0
- package/dist/src/lib/search-surface.js +23 -0
- package/dist/src/lib/search-token-index.d.ts +43 -0
- package/dist/src/lib/search-token-index.js +92 -0
- package/dist/src/lib/search-tokens.d.ts +136 -0
- package/dist/src/lib/search-tokens.js +206 -0
- package/dist/src/lib/search-view.d.ts +53 -0
- package/dist/src/lib/search-view.js +71 -0
- package/dist/src/lib/selection-account-scope.d.ts +18 -0
- package/dist/src/lib/selection-account-scope.js +26 -0
- package/dist/src/lib/selection-mode.d.ts +17 -0
- package/dist/src/lib/selection-mode.js +14 -0
- package/dist/src/lib/self-update-state.d.ts +156 -0
- package/dist/src/lib/self-update-state.js +384 -0
- package/dist/src/lib/sender-address.d.ts +24 -0
- package/dist/src/lib/sender-address.js +28 -0
- package/dist/src/lib/session-storage.d.ts +1 -0
- package/dist/src/lib/session-storage.js +8 -0
- package/dist/src/lib/spam-offer.d.ts +69 -0
- package/dist/src/lib/spam-offer.js +90 -0
- package/dist/src/lib/stale-build.d.ts +10 -0
- package/dist/src/lib/stale-build.js +24 -0
- package/dist/src/lib/starred-rows.d.ts +24 -0
- package/dist/src/lib/starred-rows.js +32 -0
- package/dist/src/lib/sync-warning-entries.d.ts +4 -0
- package/dist/src/lib/sync-warning-entries.js +22 -0
- package/dist/src/lib/telemetry-context.d.ts +3 -0
- package/dist/src/lib/telemetry-context.js +6 -0
- package/dist/src/lib/telemetry.d.ts +7 -0
- package/dist/src/lib/telemetry.js +6 -0
- package/dist/src/lib/theme-preference.d.ts +16 -0
- package/dist/src/lib/theme-preference.js +40 -0
- package/dist/src/lib/theme.d.ts +11 -0
- package/dist/src/lib/theme.js +31 -0
- package/dist/src/lib/thread-cache.d.ts +41 -0
- package/dist/src/lib/thread-cache.js +34 -0
- package/dist/src/lib/thread-list-cache.d.ts +51 -0
- package/dist/src/lib/thread-list-cache.js +51 -0
- package/dist/src/lib/thread-search-tokens.d.ts +61 -0
- package/dist/src/lib/thread-search-tokens.js +116 -0
- package/dist/src/lib/wizard-selection.d.ts +27 -0
- package/dist/src/lib/wizard-selection.js +17 -0
- package/dist/src/main.d.ts +1 -0
- package/dist/src/main.js +9 -0
- package/dist/src/routeTree.gen.d.ts +1596 -0
- package/dist/src/routeTree.gen.js +414 -0
- package/dist/src/router.d.ts +12 -0
- package/dist/src/router.js +40 -0
- package/dist/src/routes/__root.d.ts +2 -0
- package/dist/src/routes/__root.js +46 -0
- package/dist/src/routes/calendar/$view.$date/$calendarObjectId/$recurrenceId.d.ts +13 -0
- package/dist/src/routes/calendar/$view.$date/$calendarObjectId/$recurrenceId.js +18 -0
- package/dist/src/routes/calendar/$view.$date/$calendarObjectId/index.d.ts +13 -0
- package/dist/src/routes/calendar/$view.$date/$calendarObjectId/index.js +15 -0
- package/dist/src/routes/calendar/$view.$date/$calendarObjectId.d.ts +13 -0
- package/dist/src/routes/calendar/$view.$date/$calendarObjectId.js +12 -0
- package/dist/src/routes/calendar/$view.$date/index.d.ts +18 -0
- package/dist/src/routes/calendar/$view.$date/index.js +16 -0
- package/dist/src/routes/calendar/$view.$date/new.d.ts +13 -0
- package/dist/src/routes/calendar/$view.$date/new.js +19 -0
- package/dist/src/routes/calendar/$view.$date/suggestion.$suggestionId.d.ts +13 -0
- package/dist/src/routes/calendar/$view.$date/suggestion.$suggestionId.js +15 -0
- package/dist/src/routes/calendar/$view.$date.d.ts +13 -0
- package/dist/src/routes/calendar/$view.$date.js +69 -0
- package/dist/src/routes/calendar/index.d.ts +13 -0
- package/dist/src/routes/calendar/index.js +22 -0
- package/dist/src/routes/calendar.d.ts +14 -0
- package/dist/src/routes/calendar.js +68 -0
- package/dist/src/routes/import.d.ts +1 -0
- package/dist/src/routes/import.js +45 -0
- package/dist/src/routes/index.d.ts +1 -0
- package/dist/src/routes/index.js +6 -0
- package/dist/src/routes/mail/$mailboxId/$threadId/$messageId/$mode.{-$outboxMessageId}.d.ts +29 -0
- package/dist/src/routes/mail/$mailboxId/$threadId/$messageId/$mode.{-$outboxMessageId}.js +12 -0
- package/dist/src/routes/mail/$mailboxId/$threadId/$messageId.d.ts +19 -0
- package/dist/src/routes/mail/$mailboxId/$threadId/$messageId.js +22 -0
- package/dist/src/routes/mail/$mailboxId/$threadId/index.d.ts +19 -0
- package/dist/src/routes/mail/$mailboxId/$threadId/index.js +13 -0
- package/dist/src/routes/mail/$mailboxId/$threadId.d.ts +19 -0
- package/dist/src/routes/mail/$mailboxId/$threadId.js +11 -0
- package/dist/src/routes/mail/$mailboxId/compose.{-$outboxMessageId}.d.ts +19 -0
- package/dist/src/routes/mail/$mailboxId/compose.{-$outboxMessageId}.js +11 -0
- package/dist/src/routes/mail/$mailboxId/index.d.ts +19 -0
- package/dist/src/routes/mail/$mailboxId/index.js +9 -0
- package/dist/src/routes/mail/$mailboxId.d.ts +19 -0
- package/dist/src/routes/mail/$mailboxId.js +26 -0
- package/dist/src/routes/mail/brief/$threadId/$messageId/$mode.{-$outboxMessageId}.d.ts +29 -0
- package/dist/src/routes/mail/brief/$threadId/$messageId/$mode.{-$outboxMessageId}.js +24 -0
- package/dist/src/routes/mail/brief/$threadId/$messageId.d.ts +19 -0
- package/dist/src/routes/mail/brief/$threadId/$messageId.js +22 -0
- package/dist/src/routes/mail/brief/$threadId/index.d.ts +19 -0
- package/dist/src/routes/mail/brief/$threadId/index.js +13 -0
- package/dist/src/routes/mail/brief/$threadId.d.ts +19 -0
- package/dist/src/routes/mail/brief/$threadId.js +15 -0
- package/dist/src/routes/mail/brief/compose.{-$outboxMessageId}.d.ts +19 -0
- package/dist/src/routes/mail/brief/compose.{-$outboxMessageId}.js +19 -0
- package/dist/src/routes/mail/brief/index.d.ts +19 -0
- package/dist/src/routes/mail/brief/index.js +13 -0
- package/dist/src/routes/mail/brief.d.ts +19 -0
- package/dist/src/routes/mail/brief.js +27 -0
- package/dist/src/routes/mail/flagged/$threadId/$messageId/$mode.{-$outboxMessageId}.d.ts +29 -0
- package/dist/src/routes/mail/flagged/$threadId/$messageId/$mode.{-$outboxMessageId}.js +12 -0
- package/dist/src/routes/mail/flagged/$threadId/$messageId.d.ts +19 -0
- package/dist/src/routes/mail/flagged/$threadId/$messageId.js +22 -0
- package/dist/src/routes/mail/flagged/$threadId/index.d.ts +19 -0
- package/dist/src/routes/mail/flagged/$threadId/index.js +13 -0
- package/dist/src/routes/mail/flagged/$threadId.d.ts +19 -0
- package/dist/src/routes/mail/flagged/$threadId.js +15 -0
- package/dist/src/routes/mail/flagged/compose.{-$outboxMessageId}.d.ts +19 -0
- package/dist/src/routes/mail/flagged/compose.{-$outboxMessageId}.js +10 -0
- package/dist/src/routes/mail/flagged/index.d.ts +19 -0
- package/dist/src/routes/mail/flagged/index.js +9 -0
- package/dist/src/routes/mail/flagged.d.ts +19 -0
- package/dist/src/routes/mail/flagged.js +26 -0
- package/dist/src/routes/mail/index.d.ts +37 -0
- package/dist/src/routes/mail/index.js +13 -0
- package/dist/src/routes/mail/outbox/compose.{-$outboxMessageId}.d.ts +19 -0
- package/dist/src/routes/mail/outbox/compose.{-$outboxMessageId}.js +14 -0
- package/dist/src/routes/mail/outbox/draft/$outboxMessageId.d.ts +19 -0
- package/dist/src/routes/mail/outbox/draft/$outboxMessageId.js +18 -0
- package/dist/src/routes/mail/outbox/index.d.ts +19 -0
- package/dist/src/routes/mail/outbox/index.js +9 -0
- package/dist/src/routes/mail/outbox.d.ts +19 -0
- package/dist/src/routes/mail/outbox.js +22 -0
- package/dist/src/routes/mail.d.ts +16 -0
- package/dist/src/routes/mail.js +187 -0
- package/dist/src/routes/onboarding.d.ts +7 -0
- package/dist/src/routes/onboarding.js +35 -0
- package/dist/src/routes/settings/-shared/help-copy.d.ts +5 -0
- package/dist/src/routes/settings/-shared/help-copy.js +7 -0
- package/dist/src/routes/settings/accounts.d.ts +38 -0
- package/dist/src/routes/settings/accounts.js +396 -0
- package/dist/src/routes/settings/advanced.d.ts +1 -0
- package/dist/src/routes/settings/advanced.js +28 -0
- package/dist/src/routes/settings/appearance.d.ts +1 -0
- package/dist/src/routes/settings/appearance.js +61 -0
- package/dist/src/routes/settings/calendars.d.ts +1 -0
- package/dist/src/routes/settings/calendars.js +44 -0
- package/dist/src/routes/settings/filters.d.ts +5 -0
- package/dist/src/routes/settings/filters.js +88 -0
- package/dist/src/routes/settings/folders.d.ts +1 -0
- package/dist/src/routes/settings/folders.js +142 -0
- package/dist/src/routes/settings/index.d.ts +1 -0
- package/dist/src/routes/settings/index.js +5 -0
- package/dist/src/routes/settings/labels.d.ts +1 -0
- package/dist/src/routes/settings/labels.js +71 -0
- package/dist/src/routes/settings/senders.d.ts +6 -0
- package/dist/src/routes/settings/senders.js +202 -0
- package/dist/src/routes/settings/suggested-vips.d.ts +1 -0
- package/dist/src/routes/settings/suggested-vips.js +10 -0
- package/dist/src/routes/settings/warnings.d.ts +1 -0
- package/dist/src/routes/settings/warnings.js +20 -0
- package/dist/src/routes/settings.d.ts +14 -0
- package/dist/src/routes/settings.js +64 -0
- package/dist/src/routing/browsed-list.d.ts +28 -0
- package/dist/src/routing/browsed-list.js +61 -0
- package/dist/src/routing/calendar.d.ts +69 -0
- package/dist/src/routing/calendar.js +152 -0
- package/dist/src/routing/compose.d.ts +52 -0
- package/dist/src/routing/compose.js +139 -0
- package/dist/src/routing/fragment.d.ts +64 -0
- package/dist/src/routing/fragment.js +112 -0
- package/dist/src/routing/index.d.ts +14 -0
- package/dist/src/routing/index.js +14 -0
- package/dist/src/routing/nav-link.d.ts +28 -0
- package/dist/src/routing/nav-link.js +9 -0
- package/dist/src/routing/nav-selection.d.ts +13 -0
- package/dist/src/routing/nav-selection.js +29 -0
- package/dist/src/routing/open-thread.d.ts +65 -0
- package/dist/src/routing/open-thread.js +100 -0
- package/dist/src/routing/outbox-draft.d.ts +13 -0
- package/dist/src/routing/outbox-draft.js +37 -0
- package/dist/src/routing/reply.d.ts +102 -0
- package/dist/src/routing/reply.js +238 -0
- package/dist/src/routing/search-field.d.ts +45 -0
- package/dist/src/routing/search-field.js +67 -0
- package/dist/src/routing/search-mirror.d.ts +63 -0
- package/dist/src/routing/search-mirror.js +120 -0
- package/dist/src/routing/search-navigation.d.ts +16 -0
- package/dist/src/routing/search-navigation.js +32 -0
- package/dist/src/routing/sections.d.ts +16 -0
- package/dist/src/routing/sections.js +33 -0
- package/dist/src/routing/wizard-history.d.ts +83 -0
- package/dist/src/routing/wizard-history.js +153 -0
- package/dist/src/runtime-config.d.ts +59 -0
- package/dist/src/runtime-config.js +42 -0
- package/dist/src/shell/index.d.ts +17 -0
- package/dist/src/shell/index.js +61 -0
- package/package.json +145 -127
- package/harness/build.mjs +0 -121
- package/harness/index.html +0 -52
- package/harness/vite-preset.ts +0 -31
- package/index.html +0 -54
- package/spellcheck/empty-build.test.ts +0 -160
- package/spellcheck/languages.test.ts +0 -80
- package/spellcheck/languages.ts +0 -86
- package/spellcheck/vite-plugin-licence.test.ts +0 -140
- package/spellcheck/vite-plugin.test.ts +0 -230
- package/spellcheck/vite-plugin.ts +0 -385
- package/spellcheck/worker-stub.ts +0 -36
- package/src/auth/AccountMenu.tsx +0 -10
- package/src/auth/AccountSession.tsx +0 -19
- package/src/auth/BetterAuthShell.tsx +0 -233
- package/src/auth/SessionRateLimited.stories.tsx +0 -26
- package/src/auth/SessionRateLimited.tsx +0 -39
- package/src/auth/SignInAgain.tsx +0 -18
- package/src/auth/account-menu-mode.test.ts +0 -64
- package/src/auth/account-menu-mode.ts +0 -28
- package/src/auth/amplify-config.test.ts +0 -50
- package/src/auth/amplify-config.ts +0 -59
- package/src/auth/auth-error.test.ts +0 -129
- package/src/auth/auth-error.ts +0 -120
- package/src/auth/auth-interceptor.test.ts +0 -104
- package/src/auth/auth-interceptor.ts +0 -28
- package/src/auth/better-auth/BetterAuthAccount.tsx +0 -25
- package/src/auth/better-auth-config.ts +0 -253
- package/src/auth/better-auth-provider.tsx +0 -20
- package/src/auth/better-auth-token.test.ts +0 -349
- package/src/auth/cognito/CognitoAccount.tsx +0 -48
- package/src/auth/cognito/CognitoShell.tsx +0 -266
- package/src/auth/cognito/cognito-token.test.ts +0 -106
- package/src/auth/cognito/cognito-token.ts +0 -47
- package/src/auth/cognito-provider.tsx +0 -22
- package/src/auth/cognito-sign-in.stories.tsx +0 -90
- package/src/auth/combined-provider.tsx +0 -42
- package/src/auth/composition.test.ts +0 -59
- package/src/auth/email-sign-in.stories.tsx +0 -128
- package/src/auth/provider.tsx +0 -68
- package/src/auth/session-gate.render.test.ts +0 -77
- package/src/auth/session-state.test.ts +0 -66
- package/src/auth/session-state.ts +0 -41
- package/src/auth/sign-out-visibility.test.ts +0 -40
- package/src/auth/sign-out-visibility.ts +0 -10
- package/src/auth/sign-up-disabled.test.ts +0 -23
- package/src/components/calendar/AgendaStrip.stories.tsx +0 -291
- package/src/components/calendar/AgendaStrip.tsx +0 -162
- package/src/components/calendar/AgendaView.stories.tsx +0 -112
- package/src/components/calendar/AgendaView.tsx +0 -241
- package/src/components/calendar/CalendarComposePane.stories.tsx +0 -151
- package/src/components/calendar/CalendarComposePane.tsx +0 -127
- package/src/components/calendar/CalendarComposeSeed.tsx +0 -35
- package/src/components/calendar/CalendarEventPane.stories.tsx +0 -200
- package/src/components/calendar/CalendarEventPane.tsx +0 -167
- package/src/components/calendar/CalendarShell.stories.tsx +0 -177
- package/src/components/calendar/CalendarShell.tsx +0 -83
- package/src/components/calendar/CalendarUnavailable.tsx +0 -56
- package/src/components/calendar/CalendarViewPlaceholder.stories.tsx +0 -41
- package/src/components/calendar/CalendarViewPlaceholder.tsx +0 -17
- package/src/components/calendar/CalendarWaiting.tsx +0 -102
- package/src/components/calendar/CalendarWorkspace.stories.tsx +0 -374
- package/src/components/calendar/CalendarWorkspace.tsx +0 -258
- package/src/components/calendar/ChangeCalendarSuggestion.stories.tsx +0 -187
- package/src/components/calendar/ChangeCalendarSuggestion.tsx +0 -159
- package/src/components/calendar/OpenCalendarEvent.stories.tsx +0 -273
- package/src/components/calendar/OpenCalendarEvent.tsx +0 -353
- package/src/components/calendar/PendingSuggestions.tsx +0 -100
- package/src/components/calendar/WriteCalendarEvent.stories.tsx +0 -90
- package/src/components/calendar/WriteCalendarEvent.tsx +0 -104
- package/src/components/calendar/agenda-address.render.test.ts +0 -493
- package/src/components/calendar/agenda-strip.render.test.ts +0 -241
- package/src/components/calendar/calendar-app.stories.tsx +0 -122
- package/src/components/calendar/calendar-story-fixtures.ts +0 -118
- package/src/components/calendar/calendar-story-server.tsx +0 -157
- package/src/components/calendar/calendar-workspace.render.test.ts +0 -221
- package/src/components/calendar/calendar-write-flow.render.test.ts +0 -373
- package/src/components/calendar/change-suggestion-first.render.test.ts +0 -304
- package/src/components/calendar/pending-suggestions.render.test.ts +0 -206
- package/src/components/compose/AddressField.tsx +0 -64
- package/src/components/compose/ComposeForm.tsx +0 -1427
- package/src/components/compose/ComposeProvider.tsx +0 -174
- package/src/components/compose/ComposeSmtpMissingBanner.tsx +0 -25
- package/src/components/compose/ConversationCompose.tsx +0 -88
- package/src/components/compose/FromSelector.render.test.ts +0 -99
- package/src/components/compose/FromSelector.stories.tsx +0 -61
- package/src/components/compose/FromSelector.tsx +0 -74
- package/src/components/compose/FullCompose.tsx +0 -93
- package/src/components/compose/MobileComposeSheet.tsx +0 -134
- package/src/components/compose/attachment-only-source.render.test.ts +0 -234
- package/src/components/compose/compose-inline-image.render.test.ts +0 -542
- package/src/components/compose/compose-send-stops-autosave.render.test.ts +0 -328
- package/src/components/compose/compose-spellcheck-failure.render.test.ts +0 -114
- package/src/components/compose/compose-spellcheck.test.ts +0 -157
- package/src/components/compose/compose-spellcheck.ts +0 -56
- package/src/components/compose/compose-starts-a-second-message.render.test.ts +0 -171
- package/src/components/compose/compose-title.ts +0 -10
- package/src/components/compose/compose.stories.tsx +0 -405
- package/src/components/compose/draft-discard-failure.render.test.ts +0 -138
- package/src/components/compose/forward-autosave-is-not-fatal.render.test.ts +0 -358
- package/src/components/compose/mail-sync-off-refusal.ts +0 -7
- package/src/components/compose/mobile-header-stays-expanded.render.test.ts +0 -229
- package/src/components/compose/quote-leaves-with-the-send.render.test.ts +0 -235
- package/src/components/compose/quoted-message.test.ts +0 -158
- package/src/components/compose/quoted-message.ts +0 -216
- package/src/components/compose/reopened-draft-writes-nothing.render.test.ts +0 -148
- package/src/components/compose/reply-all-on-resumed-draft.render.test.ts +0 -250
- package/src/components/compose/reply-with-times.ts +0 -22
- package/src/components/compose/send-from-mail-off-account.render.test.ts +0 -173
- package/src/components/compose/send-poll-server-error.render.test.ts +0 -120
- package/src/components/compose/send-watch-outlives-sent.render.test.ts +0 -121
- package/src/components/config-import/ConfigImportWizard.flow.test.ts +0 -326
- package/src/components/config-import/ConfigImportWizard.tsx +0 -721
- package/src/components/config-import/config-import.fixtures.ts +0 -254
- package/src/components/config-import/config-import.stories.tsx +0 -486
- package/src/components/config-import/steps.import-failure.test.ts +0 -91
- package/src/components/config-import/steps.tsx +0 -784
- package/src/components/config-import/steps.viewport.test.ts +0 -216
- package/src/components/layout/AppShellSkeleton.tsx +0 -53
- package/src/components/layout/ComposeFab.tsx +0 -22
- package/src/components/layout/Drawer.focus.test.ts +0 -253
- package/src/components/layout/Drawer.tsx +0 -108
- package/src/components/layout/MailShell.tsx +0 -106
- package/src/components/layout/MailTopBar.tsx +0 -99
- package/src/components/layout/mail-shell.stories.tsx +0 -142
- package/src/components/mail/AuthenticityBanner.tsx +0 -45
- package/src/components/mail/AutoMovedIndicator.tsx +0 -53
- package/src/components/mail/BlockedImagesNotice.render.test.ts +0 -114
- package/src/components/mail/BlockedImagesNotice.tsx +0 -63
- package/src/components/mail/BriefPane.tsx +0 -477
- package/src/components/mail/BulkRunProvider.tsx +0 -344
- package/src/components/mail/ConversationView.tsx +0 -519
- package/src/components/mail/DailyBrief.scope.test.ts +0 -76
- package/src/components/mail/DailyBrief.tsx +0 -1094
- package/src/components/mail/DeleteConfirmDialog.render.test.ts +0 -412
- package/src/components/mail/DeleteConfirmDialog.tsx +0 -143
- package/src/components/mail/DraftsView.tsx +0 -255
- package/src/components/mail/EmptyTrashBar.render.test.ts +0 -133
- package/src/components/mail/EmptyTrashBar.tsx +0 -181
- package/src/components/mail/FlaggedList.tsx +0 -359
- package/src/components/mail/FlaggedPane.tsx +0 -473
- package/src/components/mail/IntelligenceDrawer.tsx +0 -52
- package/src/components/mail/IntelligencePane.render.test.ts +0 -116
- package/src/components/mail/IntelligencePane.test.ts +0 -16
- package/src/components/mail/IntelligencePane.tsx +0 -391
- package/src/components/mail/LabelApplyTrigger.tsx +0 -67
- package/src/components/mail/MailListHeader.chrome-stability.render.test.ts +0 -323
- package/src/components/mail/MailListHeader.tsx +0 -613
- package/src/components/mail/MailNav.tsx +0 -70
- package/src/components/mail/MailSidebarAdapter.tsx +0 -319
- package/src/components/mail/MailViewChrome.tsx +0 -124
- package/src/components/mail/MailboxPane.tsx +0 -1285
- package/src/components/mail/MessageActionMenu.tsx +0 -296
- package/src/components/mail/MessageAttachments.interaction.test.ts +0 -245
- package/src/components/mail/MessageAttachments.tsx +0 -188
- package/src/components/mail/MessageBody.blocked-sender.test.ts +0 -193
- package/src/components/mail/MessageBody.tsx +0 -226
- package/src/components/mail/MessageBodyErrorBanner.render.test.ts +0 -85
- package/src/components/mail/MessageBodyErrorBanner.test.ts +0 -56
- package/src/components/mail/MessageBodyErrorBanner.tsx +0 -90
- package/src/components/mail/MessageCard.blocked-sender.test.ts +0 -246
- package/src/components/mail/MessageCard.tsx +0 -430
- package/src/components/mail/MessageList.move-guard.test.ts +0 -64
- package/src/components/mail/MessageList.run-reporting.test.ts +0 -87
- package/src/components/mail/MessageList.tsx +0 -1383
- package/src/components/mail/MessageListItem.test.ts +0 -153
- package/src/components/mail/MessageListItem.tsx +0 -106
- package/src/components/mail/MessageRow.render.test.ts +0 -54
- package/src/components/mail/MessageRow.tsx +0 -269
- package/src/components/mail/MessageSettlementAlert.render.test.ts +0 -182
- package/src/components/mail/MessageSettlementAlert.tsx +0 -126
- package/src/components/mail/MessageToolbar.interaction.test.ts +0 -250
- package/src/components/mail/MessageToolbar.render.test.ts +0 -124
- package/src/components/mail/MessageToolbar.tsx +0 -215
- package/src/components/mail/MobileMessageBar.tsx +0 -140
- package/src/components/mail/MoveToTrigger.render.test.ts +0 -310
- package/src/components/mail/MoveToTrigger.tsx +0 -298
- package/src/components/mail/NavMenuButton.tsx +0 -25
- package/src/components/mail/OutboxPane.tsx +0 -584
- package/src/components/mail/PullToRefresh.tsx +0 -24
- package/src/components/mail/RawMessageView.tsx +0 -84
- package/src/components/mail/RoleAppointmentPromptProvider.render.test.ts +0 -294
- package/src/components/mail/RoleAppointmentPromptProvider.tsx +0 -251
- package/src/components/mail/SelectionWizardHost.search-entry.test.ts +0 -81
- package/src/components/mail/SelectionWizardHost.tsx +0 -1078
- package/src/components/mail/SpamRescue.tsx +0 -126
- package/src/components/mail/SwipeableMessageRow.modifier-select.test.ts +0 -243
- package/src/components/mail/SwipeableMessageRow.render.test.ts +0 -110
- package/src/components/mail/SwipeableMessageRow.tsx +0 -160
- package/src/components/mail/ThreadListInteraction.test.ts +0 -546
- package/src/components/mail/ThreadListInteraction.tsx +0 -538
- package/src/components/mail/authenticity-warning.stories.tsx +0 -116
- package/src/components/mail/blocked-images-notice.stories.tsx +0 -90
- package/src/components/mail/brief-server-sections.render.test.ts +0 -656
- package/src/components/mail/bulk-run-state.test.ts +0 -101
- package/src/components/mail/bulk-run-state.ts +0 -99
- package/src/components/mail/conversation-reply-identity.render.test.ts +0 -307
- package/src/components/mail/conversation-reply-reach.render.test.ts +0 -414
- package/src/components/mail/daily-brief.stories.tsx +0 -264
- package/src/components/mail/delete-open-message-keeps-the-list.render.test.ts +0 -154
- package/src/components/mail/detail-surface.stories.tsx +0 -171
- package/src/components/mail/drafts.stories.tsx +0 -61
- package/src/components/mail/empty-trash-bar.stories.tsx +0 -121
- package/src/components/mail/enter-cursor-late-open.render.test.ts +0 -197
- package/src/components/mail/filtered-empty-state.render.test.ts +0 -240
- package/src/components/mail/flagged-search-reach.render.test.ts +0 -272
- package/src/components/mail/flagged.stories.tsx +0 -159
- package/src/components/mail/intelligence-auto-open-pref.render.test.ts +0 -412
- package/src/components/mail/intelligence-drawer.stories.tsx +0 -353
- package/src/components/mail/intelligence-shortcut-surface.render.test.ts +0 -373
- package/src/components/mail/intelligence-story-calendar.ts +0 -19
- package/src/components/mail/intelligence-surface-reach.render.test.ts +0 -220
- package/src/components/mail/mail-pickers.stories.tsx +0 -82
- package/src/components/mail/message-body-error-banner-content.ts +0 -87
- package/src/components/mail/message-gone.stories.tsx +0 -44
- package/src/components/mail/offer-times-reply.render.test.ts +0 -557
- package/src/components/mail/organize-run-state.test.ts +0 -115
- package/src/components/mail/organize-run-state.ts +0 -44
- package/src/components/mail/outbox.stories.tsx +0 -59
- package/src/components/mail/reclassify-remove-override.render.test.ts +0 -138
- package/src/components/mail/reply-verbs-reach.render.test.ts +0 -235
- package/src/components/mail/search.stories.tsx +0 -280
- package/src/components/mail/selection-wizard-run-controls.test.ts +0 -231
- package/src/components/mail/selection-wizard-run-controls.ts +0 -101
- package/src/components/mail/selection-wizard.stories.tsx +0 -160
- package/src/components/mail/spam-offer-server-count.render.test.ts +0 -349
- package/src/components/mail/two-window-listeners-one-key.render.test.ts +0 -593
- package/src/components/mail/useModifierSelect.render.test.ts +0 -223
- package/src/components/mail/useModifierSelect.ts +0 -100
- package/src/components/onboarding/OnboardingWizard.flow.test.ts +0 -709
- package/src/components/onboarding/OnboardingWizard.tsx +0 -1599
- package/src/components/onboarding/credential-steps.tsx +0 -441
- package/src/components/onboarding/onboarding-servers.stories.tsx +0 -49
- package/src/components/onboarding/onboarding.stories.tsx +0 -550
- package/src/components/overlay-escape.render.test.ts +0 -155
- package/src/components/self-update/SelfUpdateOverlay.tsx +0 -45
- package/src/components/settings/AccountFormPanel.render.test.ts +0 -269
- package/src/components/settings/AccountFormPanel.test.ts +0 -37
- package/src/components/settings/AccountFormPanel.tsx +0 -949
- package/src/components/settings/AccountServices.render.test.ts +0 -257
- package/src/components/settings/AccountServices.tsx +0 -181
- package/src/components/settings/AccountServicesCard.stories.tsx +0 -71
- package/src/components/settings/AccountServicesCard.tsx +0 -76
- package/src/components/settings/AdvancedNavIcon.tsx +0 -23
- package/src/components/settings/CalendarCreateCard.stories.tsx +0 -33
- package/src/components/settings/CalendarCreateCard.tsx +0 -149
- package/src/components/settings/CalendarDetailsForm.stories.tsx +0 -57
- package/src/components/settings/CalendarDetailsForm.tsx +0 -136
- package/src/components/settings/CalendarFeedCard.render.test.ts +0 -154
- package/src/components/settings/CalendarFeedCard.stories.tsx +0 -152
- package/src/components/settings/CalendarFeedCard.tsx +0 -289
- package/src/components/settings/CalendarFeedPanel.tsx +0 -38
- package/src/components/settings/CalendarSettingsPanel.tsx +0 -60
- package/src/components/settings/CalendarSubscribeCard.stories.tsx +0 -89
- package/src/components/settings/CalendarSubscribeCard.tsx +0 -115
- package/src/components/settings/CalendarSubscriptionStatus.stories.tsx +0 -77
- package/src/components/settings/CalendarSubscriptionStatus.tsx +0 -87
- package/src/components/settings/ConfigExportCard.tsx +0 -114
- package/src/components/settings/ConfigTransferPanel.tsx +0 -72
- package/src/components/settings/DangerZone.tsx +0 -30
- package/src/components/settings/DeleteAccountDialog.render.test.ts +0 -47
- package/src/components/settings/DeleteAccountDialog.tsx +0 -224
- package/src/components/settings/DeleteFolderDialog.render.test.ts +0 -836
- package/src/components/settings/DeleteFolderDialog.tsx +0 -406
- package/src/components/settings/FilterActionError.render.test.ts +0 -46
- package/src/components/settings/FilterActionError.stories.tsx +0 -50
- package/src/components/settings/FilterActionError.tsx +0 -40
- package/src/components/settings/FilterEditor.render.test.ts +0 -307
- package/src/components/settings/FilterEditor.tsx +0 -364
- package/src/components/settings/FilterEditorSurface.tsx +0 -65
- package/src/components/settings/FiltersList.render.test.ts +0 -202
- package/src/components/settings/FiltersList.stories.tsx +0 -113
- package/src/components/settings/FiltersList.tsx +0 -191
- package/src/components/settings/LabelsList.stories.tsx +0 -134
- package/src/components/settings/LabelsList.tsx +0 -112
- package/src/components/settings/SelfUpdatePanel.tsx +0 -47
- package/src/components/settings/TimeZoneSelect.tsx +0 -43
- package/src/components/settings/TlsRootCaDownload.render.test.ts +0 -37
- package/src/components/settings/TlsRootCaDownload.tsx +0 -33
- package/src/components/settings/WarningsNavIcon.tsx +0 -12
- package/src/components/settings/WarningsPanel.dom.test.ts +0 -201
- package/src/components/settings/WarningsPanel.render.test.ts +0 -56
- package/src/components/settings/WarningsPanel.tsx +0 -244
- package/src/components/settings/account-form-helpers.test.ts +0 -172
- package/src/components/settings/account-form-helpers.ts +0 -105
- package/src/components/settings/accounts.stories.tsx +0 -386
- package/src/components/settings/advanced.stories.tsx +0 -40
- package/src/components/settings/appearance.stories.tsx +0 -33
- package/src/components/settings/calendar-collection-cards.render.test.ts +0 -149
- package/src/components/settings/calendar-feed-flow.render.test.ts +0 -449
- package/src/components/settings/folders.stories.tsx +0 -89
- package/src/components/settings/label-delete-confirm.stories.tsx +0 -83
- package/src/components/settings/self-update.stories.tsx +0 -288
- package/src/components/settings/senders.stories.tsx +0 -155
- package/src/components/settings/settings-filter.stories.tsx +0 -145
- package/src/components/settings/warnings.stories.tsx +0 -290
- package/src/components/ui/AppVersion.stories.tsx +0 -31
- package/src/components/ui/AppVersion.tsx +0 -57
- package/src/components/ui/BugReportButton.stories.tsx +0 -19
- package/src/components/ui/BugReportButton.tsx +0 -20
- package/src/components/ui/ErrorBannerProvider.render.test.ts +0 -85
- package/src/components/ui/ErrorBannerProvider.tsx +0 -134
- package/src/components/ui/FatalErrorOverlay.render.test.ts +0 -66
- package/src/components/ui/FatalErrorOverlay.stories.tsx +0 -55
- package/src/components/ui/FatalErrorOverlay.tsx +0 -158
- package/src/components/ui/banner-way-out.test.ts +0 -71
- package/src/components/ui/error-banners.test.ts +0 -186
- package/src/components/ui/error-banners.ts +0 -121
- package/src/components/ui/folder-role-refusal.test.ts +0 -124
- package/src/components/ui/folder-role-refusal.ts +0 -69
- package/src/components/ui/placement-refusal.test.ts +0 -98
- package/src/components/ui/placement-refusal.ts +0 -71
- package/src/hooks/bulk-chunking.render.test.ts +0 -157
- package/src/hooks/calendar/agenda-window.test.ts +0 -392
- package/src/hooks/calendar/agenda-window.ts +0 -210
- package/src/hooks/calendar/calendar-collections.render.test.ts +0 -281
- package/src/hooks/calendar/calendar-reads.render.test.ts +0 -265
- package/src/hooks/calendar/calendar-writes.render.test.ts +0 -326
- package/src/hooks/calendar/draft.test.ts +0 -537
- package/src/hooks/calendar/draft.ts +0 -204
- package/src/hooks/calendar/index.ts +0 -122
- package/src/hooks/calendar/instance.test.ts +0 -206
- package/src/hooks/calendar/instance.ts +0 -224
- package/src/hooks/calendar/recurrence-rule.test.ts +0 -134
- package/src/hooks/calendar/recurrence-rule.ts +0 -177
- package/src/hooks/calendar/resource.test.ts +0 -141
- package/src/hooks/calendar/resource.ts +0 -104
- package/src/hooks/calendar/selection.ts +0 -110
- package/src/hooks/calendar/suggestion-draft.ts +0 -77
- package/src/hooks/calendar/useCalendarCollectionWrites.ts +0 -131
- package/src/hooks/calendar/useCalendarEvent.ts +0 -46
- package/src/hooks/calendar/useCalendarEvents.ts +0 -195
- package/src/hooks/calendar/useCalendarFeed.ts +0 -163
- package/src/hooks/calendar/useCalendarFreeBusy.ts +0 -80
- package/src/hooks/calendar/useCalendarJump.ts +0 -117
- package/src/hooks/calendar/useCalendarSubscriptions.ts +0 -103
- package/src/hooks/calendar/useCalendarSuggestions.ts +0 -279
- package/src/hooks/calendar/useCalendarWrites.ts +0 -177
- package/src/hooks/calendar/useCalendars.ts +0 -59
- package/src/hooks/calendar/useDraftClashes.ts +0 -93
- package/src/hooks/calendar/window.test.ts +0 -189
- package/src/hooks/calendar/window.ts +0 -188
- package/src/hooks/cross-account-bulk.render.test.ts +0 -164
- package/src/hooks/escalated-run-lifetime.render.test.ts +0 -349
- package/src/hooks/escalated-run-refusal.render.test.ts +0 -373
- package/src/hooks/escalated-run-survives-navigation.render.test.ts +0 -524
- package/src/hooks/intelligence-calendar.render.test.ts +0 -497
- package/src/hooks/intelligence-drawer.render.test.ts +0 -99
- package/src/hooks/mutation-optimism.test.ts +0 -278
- package/src/hooks/queries/keys.ts +0 -9
- package/src/hooks/refusal-escalation.render.test.ts +0 -243
- package/src/hooks/signed-out-poll-is-not-fatal.render.test.ts +0 -126
- package/src/hooks/stale-account-sync-visibility.test.ts +0 -166
- package/src/hooks/update-restart-escalation.render.test.ts +0 -340
- package/src/hooks/use-system-update.test.ts +0 -686
- package/src/hooks/use-system-update.ts +0 -341
- package/src/hooks/useApplyLabel.ts +0 -71
- package/src/hooks/useArchiveMailbox.ts +0 -162
- package/src/hooks/useAutoMovedBadge.ts +0 -145
- package/src/hooks/useBriefSections.ts +0 -320
- package/src/hooks/useCalendarData.ts +0 -94
- package/src/hooks/useClauseSuggestions.ts +0 -57
- package/src/hooks/useComposeAttachments.ts +0 -108
- package/src/hooks/useComposeLanguages.ts +0 -69
- package/src/hooks/useCreateMailbox.render.test.ts +0 -233
- package/src/hooks/useCreateMailbox.ts +0 -153
- package/src/hooks/useCurrentMailboxName.ts +0 -128
- package/src/hooks/useDebouncedValue.ts +0 -12
- package/src/hooks/useDeleteFolder.ts +0 -380
- package/src/hooks/useDeleteMessages.test.ts +0 -62
- package/src/hooks/useDeleteMessages.ts +0 -260
- package/src/hooks/useDeleteOutcome.ts +0 -70
- package/src/hooks/useEmptyTrash.render.test.ts +0 -194
- package/src/hooks/useEmptyTrash.ts +0 -191
- package/src/hooks/useEscalatedActions.test.ts +0 -36
- package/src/hooks/useEscalatedActions.ts +0 -334
- package/src/hooks/useFilters.test.ts +0 -106
- package/src/hooks/useFilters.ts +0 -188
- package/src/hooks/useFolderLabelTranslator.ts +0 -19
- package/src/hooks/useFollowFocusOpen.render.test.ts +0 -145
- package/src/hooks/useFollowFocusOpen.ts +0 -81
- package/src/hooks/useInitialSyncProgress.render.test.ts +0 -314
- package/src/hooks/useInitialSyncProgress.ts +0 -134
- package/src/hooks/useInlineImages.ts +0 -93
- package/src/hooks/useIntelligenceCalendar.ts +0 -394
- package/src/hooks/useIntelligenceData.test.ts +0 -403
- package/src/hooks/useIntelligenceData.ts +0 -325
- package/src/hooks/useIntelligenceDrawer.ts +0 -54
- package/src/hooks/useIntelligenceSurface.ts +0 -103
- package/src/hooks/useIsDark.ts +0 -27
- package/src/hooks/useKeyboardNavigation.ts +0 -130
- package/src/hooks/useLabels.ts +0 -124
- package/src/hooks/useLayoutTier.test.ts +0 -96
- package/src/hooks/useLayoutTier.ts +0 -60
- package/src/hooks/useMailboxAccount.ts +0 -67
- package/src/hooks/useMailboxNameIndex.ts +0 -32
- package/src/hooks/useMarkAsRead.test.ts +0 -307
- package/src/hooks/useMarkAsRead.ts +0 -333
- package/src/hooks/useMatchSample.ts +0 -104
- package/src/hooks/useMediaQuery.ts +0 -13
- package/src/hooks/useMessageBodyContent.test.ts +0 -370
- package/src/hooks/useMessageBodyContent.ts +0 -388
- package/src/hooks/useMoveMessages.ts +0 -193
- package/src/hooks/useOrganizeJob.render.test.ts +0 -190
- package/src/hooks/useOrganizeJob.ts +0 -146
- package/src/hooks/useRailPanels.ts +0 -128
- package/src/hooks/useRedirectEnded.ts +0 -116
- package/src/hooks/useRefreshControl.test.ts +0 -287
- package/src/hooks/useRefreshControl.ts +0 -347
- package/src/hooks/useReportSpam.escalation.test.ts +0 -135
- package/src/hooks/useReportSpam.render.test.ts +0 -113
- package/src/hooks/useReportSpam.test.ts +0 -115
- package/src/hooks/useReportSpam.ts +0 -244
- package/src/hooks/useRescueCandidates.test.ts +0 -194
- package/src/hooks/useRescueCandidates.ts +0 -48
- package/src/hooks/useResultCount.render.test.ts +0 -161
- package/src/hooks/useResultCount.ts +0 -68
- package/src/hooks/useResultFolderIndex.ts +0 -88
- package/src/hooks/useReturnFromRedirect.ts +0 -41
- package/src/hooks/useRulePreview.ts +0 -122
- package/src/hooks/useSaveDraft.ts +0 -244
- package/src/hooks/useSearchScope.ts +0 -46
- package/src/hooks/useSearchSuggestions.ts +0 -126
- package/src/hooks/useSearchTokenContext.ts +0 -28
- package/src/hooks/useSelectedSubjects.ts +0 -79
- package/src/hooks/useSignature.ts +0 -69
- package/src/hooks/useSpamMatchCounts.ts +0 -102
- package/src/hooks/useStaleAccountSync.test.ts +0 -300
- package/src/hooks/useStaleAccountSync.ts +0 -325
- package/src/hooks/useStarredThreads.test.ts +0 -209
- package/src/hooks/useStarredThreads.ts +0 -146
- package/src/hooks/useThreadActions.star.test.ts +0 -200
- package/src/hooks/useThreadActions.ts +0 -127
- package/src/hooks/useThreadMessageIds.ts +0 -33
- package/src/hooks/useThreadRow.ts +0 -49
- package/src/hooks/useToggleStar.test.ts +0 -131
- package/src/hooks/useToggleStar.ts +0 -164
- package/src/hooks/useToggleTrusted.test.ts +0 -106
- package/src/hooks/useToggleTrusted.ts +0 -157
- package/src/hooks/useTriageLayer.ts +0 -167
- package/src/hooks/useTriggerSync.test.ts +0 -18
- package/src/hooks/useTriggerSync.ts +0 -64
- package/src/hooks/useUpdateAddressFlags.ts +0 -152
- package/src/hooks/useUpdateFilter.ts +0 -56
- package/src/hooks/useVisualViewport.render.test.ts +0 -63
- package/src/hooks/useVisualViewport.ts +0 -51
- package/src/hooks/useWarningsAttention.ts +0 -37
- package/src/index.css +0 -28
- package/src/index.css.test.ts +0 -97
- package/src/kit-stylesheets.test.ts +0 -64
- package/src/lib/account-order.test.ts +0 -74
- package/src/lib/account-order.ts +0 -13
- package/src/lib/adjacent-message.test.ts +0 -34
- package/src/lib/adjacent-message.ts +0 -20
- package/src/lib/api.ts +0 -121
- package/src/lib/app-info.ts +0 -32
- package/src/lib/attachment-download.test.ts +0 -207
- package/src/lib/attachment-download.ts +0 -195
- package/src/lib/auto-moved.test.ts +0 -234
- package/src/lib/auto-moved.ts +0 -103
- package/src/lib/autodiscovery.test.ts +0 -47
- package/src/lib/autodiscovery.ts +0 -354
- package/src/lib/brief-chip-query.test.ts +0 -85
- package/src/lib/brief-criteria.test.ts +0 -168
- package/src/lib/brief-criteria.ts +0 -129
- package/src/lib/brief.test.ts +0 -493
- package/src/lib/brief.ts +0 -205
- package/src/lib/bug-report.test.ts +0 -487
- package/src/lib/bug-report.ts +0 -320
- package/src/lib/bulk-action-copy.test.ts +0 -123
- package/src/lib/bulk-action-copy.ts +0 -182
- package/src/lib/bulk-actions.test.ts +0 -612
- package/src/lib/bulk-actions.ts +0 -400
- package/src/lib/calendar-collection-copy.test.ts +0 -23
- package/src/lib/calendar-collection-copy.ts +0 -21
- package/src/lib/calendar-density.ts +0 -46
- package/src/lib/calendar-feed-copy.ts +0 -29
- package/src/lib/calendar-feed-url.ts +0 -14
- package/src/lib/calendar-format.ts +0 -74
- package/src/lib/calendar-report.ts +0 -21
- package/src/lib/calendar-route.test.ts +0 -224
- package/src/lib/calendar-route.ts +0 -197
- package/src/lib/calendar-subscription.ts +0 -11
- package/src/lib/calendar-suggestion.test.ts +0 -189
- package/src/lib/calendar-suggestion.ts +0 -263
- package/src/lib/calendar-suggestion.west.test.ts +0 -61
- package/src/lib/client.test.ts +0 -114
- package/src/lib/client.ts +0 -33
- package/src/lib/compose-attachment-controller.test.ts +0 -352
- package/src/lib/compose-attachment-controller.ts +0 -519
- package/src/lib/config-import.test.ts +0 -339
- package/src/lib/config-import.ts +0 -512
- package/src/lib/console-errors.test.ts +0 -64
- package/src/lib/console-errors.ts +0 -92
- package/src/lib/conversation-target.ts +0 -17
- package/src/lib/dedupe-thread-messages.test.ts +0 -79
- package/src/lib/dedupe-thread-messages.ts +0 -26
- package/src/lib/delete-folder.test.ts +0 -304
- package/src/lib/delete-folder.ts +0 -188
- package/src/lib/desktop-breakpoint.test.ts +0 -76
- package/src/lib/display-category.test.ts +0 -32
- package/src/lib/display-category.ts +0 -24
- package/src/lib/drafts.test.ts +0 -218
- package/src/lib/drafts.ts +0 -122
- package/src/lib/error-classifier.test.ts +0 -434
- package/src/lib/error-classifier.ts +0 -260
- package/src/lib/escalation-label.test.ts +0 -49
- package/src/lib/escalation-label.ts +0 -32
- package/src/lib/fatal-error.test.ts +0 -78
- package/src/lib/fatal-error.ts +0 -165
- package/src/lib/filter-report.ts +0 -19
- package/src/lib/flagged-criteria.test.ts +0 -114
- package/src/lib/flagged-criteria.ts +0 -62
- package/src/lib/folder-failure.test.ts +0 -29
- package/src/lib/folder-failure.ts +0 -10
- package/src/lib/folder-roles.test.ts +0 -152
- package/src/lib/folder-roles.ts +0 -110
- package/src/lib/format.test.ts +0 -470
- package/src/lib/format.ts +0 -397
- package/src/lib/fresh-mailbox-count.test.ts +0 -145
- package/src/lib/fresh-mailbox-count.ts +0 -114
- package/src/lib/hot-sync-window.test.ts +0 -59
- package/src/lib/hot-sync-window.ts +0 -48
- package/src/lib/i18n.ts +0 -36
- package/src/lib/inbox-filters.test.ts +0 -134
- package/src/lib/inbox-filters.ts +0 -154
- package/src/lib/intelligence-pref.test.ts +0 -201
- package/src/lib/intelligence-pref.ts +0 -71
- package/src/lib/json.ts +0 -11
- package/src/lib/junk-destination.test.ts +0 -40
- package/src/lib/junk-destination.ts +0 -37
- package/src/lib/list-focus.test.ts +0 -25
- package/src/lib/list-focus.ts +0 -24
- package/src/lib/list-header-chrome.ts +0 -55
- package/src/lib/list-narrowing.test.ts +0 -88
- package/src/lib/list-narrowing.ts +0 -172
- package/src/lib/list-verb-request.test.ts +0 -124
- package/src/lib/list-verb-request.ts +0 -62
- package/src/lib/mail-context.ts +0 -91
- package/src/lib/mail-freshness.test.ts +0 -165
- package/src/lib/mail-freshness.tsx +0 -244
- package/src/lib/mail-route.test.ts +0 -261
- package/src/lib/mail-route.ts +0 -140
- package/src/lib/mail-search.ts +0 -69
- package/src/lib/mailbox-sync-wait.test.ts +0 -186
- package/src/lib/mailbox-sync-wait.ts +0 -102
- package/src/lib/message-attachments.test.ts +0 -163
- package/src/lib/message-attachments.ts +0 -70
- package/src/lib/message-body-source.test.ts +0 -115
- package/src/lib/message-body-source.ts +0 -51
- package/src/lib/move-options.test.ts +0 -154
- package/src/lib/move-options.ts +0 -60
- package/src/lib/move-targets.test.ts +0 -235
- package/src/lib/move-targets.ts +0 -70
- package/src/lib/network-error.ts +0 -74
- package/src/lib/new-folder.test.ts +0 -127
- package/src/lib/new-folder.ts +0 -59
- package/src/lib/onboarding-completion.test.ts +0 -48
- package/src/lib/onboarding-completion.ts +0 -23
- package/src/lib/organize/clause-suggestions.test.ts +0 -114
- package/src/lib/organize/clause-suggestions.ts +0 -89
- package/src/lib/organize/filter-edit-model.test.ts +0 -271
- package/src/lib/organize/filter-edit-model.ts +0 -129
- package/src/lib/organize/filter-run.test.ts +0 -79
- package/src/lib/organize/filter-run.ts +0 -48
- package/src/lib/organize/filter-status.test.ts +0 -120
- package/src/lib/organize/filter-status.ts +0 -115
- package/src/lib/organize/label-delete-copy.test.ts +0 -21
- package/src/lib/organize/label-delete-copy.ts +0 -22
- package/src/lib/organize/organize-model.test.ts +0 -209
- package/src/lib/organize/organize-model.ts +0 -198
- package/src/lib/organize/organize-poll.test.ts +0 -37
- package/src/lib/organize/organize-poll.ts +0 -28
- package/src/lib/organize/rule-model.test.ts +0 -211
- package/src/lib/organize/rule-model.ts +0 -140
- package/src/lib/organize/search-to-rule.test.ts +0 -142
- package/src/lib/organize/search-to-rule.ts +0 -105
- package/src/lib/outbox-search.test.ts +0 -75
- package/src/lib/outbox-search.ts +0 -58
- package/src/lib/outbox-status.test.ts +0 -79
- package/src/lib/outbox-status.ts +0 -79
- package/src/lib/provider-presets.test.ts +0 -51
- package/src/lib/provider-presets.ts +0 -94
- package/src/lib/quarantine-entries.test.ts +0 -77
- package/src/lib/quarantine-entries.ts +0 -46
- package/src/lib/query-error-handler.test.ts +0 -87
- package/src/lib/query-error-handler.ts +0 -41
- package/src/lib/query-escalation.integration.test.ts +0 -139
- package/src/lib/recent-searches.test.ts +0 -53
- package/src/lib/recent-searches.ts +0 -34
- package/src/lib/recipient-suggestions.test.ts +0 -109
- package/src/lib/recipient-suggestions.ts +0 -15
- package/src/lib/request-breadcrumbs.test.ts +0 -162
- package/src/lib/request-breadcrumbs.ts +0 -138
- package/src/lib/rescue-candidates.test.ts +0 -94
- package/src/lib/rescue-candidates.ts +0 -35
- package/src/lib/rescue-telemetry.ts +0 -55
- package/src/lib/result-count.test.ts +0 -97
- package/src/lib/result-count.ts +0 -57
- package/src/lib/result-folder.test.ts +0 -133
- package/src/lib/result-folder.ts +0 -111
- package/src/lib/route-breadcrumbs.test.ts +0 -41
- package/src/lib/route-breadcrumbs.ts +0 -45
- package/src/lib/route-search-query.test.ts +0 -70
- package/src/lib/row-settlement.ts +0 -28
- package/src/lib/rum-adapter.test.ts +0 -195
- package/src/lib/rum-adapter.ts +0 -107
- package/src/lib/search-conversion.ts +0 -23
- package/src/lib/search-params.test.ts +0 -77
- package/src/lib/search-params.ts +0 -59
- package/src/lib/search-query.test.ts +0 -24
- package/src/lib/search-query.ts +0 -11
- package/src/lib/search-result.test.ts +0 -20
- package/src/lib/search-result.ts +0 -55
- package/src/lib/search-scope.test.ts +0 -174
- package/src/lib/search-scope.ts +0 -140
- package/src/lib/search-suggestions.test.ts +0 -249
- package/src/lib/search-suggestions.ts +0 -296
- package/src/lib/search-surface.test.ts +0 -74
- package/src/lib/search-surface.ts +0 -34
- package/src/lib/search-token-index.test.ts +0 -232
- package/src/lib/search-token-index.ts +0 -120
- package/src/lib/search-tokens.test.ts +0 -454
- package/src/lib/search-tokens.ts +0 -319
- package/src/lib/search-view.test.ts +0 -320
- package/src/lib/search-view.ts +0 -97
- package/src/lib/selection-account-scope.ts +0 -40
- package/src/lib/selection-mode.test.ts +0 -34
- package/src/lib/selection-mode.ts +0 -24
- package/src/lib/self-update-state.test.ts +0 -552
- package/src/lib/self-update-state.ts +0 -658
- package/src/lib/sender-address.test.ts +0 -60
- package/src/lib/sender-address.ts +0 -36
- package/src/lib/session-storage.ts +0 -7
- package/src/lib/spam-offer.test.ts +0 -192
- package/src/lib/spam-offer.ts +0 -163
- package/src/lib/stale-build.test.ts +0 -52
- package/src/lib/stale-build.ts +0 -36
- package/src/lib/starred-rows.test.ts +0 -67
- package/src/lib/starred-rows.ts +0 -32
- package/src/lib/sync-warning-entries.ts +0 -33
- package/src/lib/telemetry-context.tsx +0 -9
- package/src/lib/telemetry.ts +0 -17
- package/src/lib/theme-preference.ts +0 -46
- package/src/lib/theme.ts +0 -33
- package/src/lib/thread-cache.test.ts +0 -65
- package/src/lib/thread-cache.ts +0 -76
- package/src/lib/thread-list-cache.test.ts +0 -147
- package/src/lib/thread-list-cache.ts +0 -119
- package/src/lib/thread-search-tokens.test.ts +0 -196
- package/src/lib/thread-search-tokens.ts +0 -177
- package/src/lib/wizard-selection.test.ts +0 -50
- package/src/lib/wizard-selection.ts +0 -43
- package/src/main.tsx +0 -10
- package/src/mocks/story-frame/AppStory.tsx +0 -62
- package/src/mocks/story-frame/calendar-window.ts +0 -21
- package/src/mocks/story-frame/compose-world.ts +0 -191
- package/src/mocks/story-frame/mail-handlers.ts +0 -556
- package/src/mocks/story-frame/mail-world.ts +0 -447
- package/src/mocks/story-frame/onboarding-handlers.ts +0 -97
- package/src/mocks/story-frame/session.tsx +0 -19
- package/src/mocks/story-frame/touch.ts +0 -22
- package/src/routeTree.gen.ts +0 -1279
- package/src/router.tsx +0 -59
- package/src/routes/__root.tsx +0 -92
- package/src/routes/calendar/$view.$date/$calendarObjectId/$recurrenceId.tsx +0 -26
- package/src/routes/calendar/$view.$date/$calendarObjectId/index.tsx +0 -18
- package/src/routes/calendar/$view.$date/$calendarObjectId.tsx +0 -15
- package/src/routes/calendar/$view.$date/index.tsx +0 -25
- package/src/routes/calendar/$view.$date/new.tsx +0 -20
- package/src/routes/calendar/$view.$date/suggestion.$suggestionId.tsx +0 -22
- package/src/routes/calendar/$view.$date.tsx +0 -170
- package/src/routes/calendar/-calendar-tree.test.ts +0 -285
- package/src/routes/calendar/index.tsx +0 -27
- package/src/routes/calendar.tsx +0 -99
- package/src/routes/import.tsx +0 -51
- package/src/routes/index.tsx +0 -7
- package/src/routes/mail/$mailboxId/$threadId/$messageId/$mode.{-$outboxMessageId}.tsx +0 -15
- package/src/routes/mail/$mailboxId/$threadId/$messageId.tsx +0 -23
- package/src/routes/mail/$mailboxId/$threadId/index.tsx +0 -14
- package/src/routes/mail/$mailboxId/$threadId.tsx +0 -12
- package/src/routes/mail/$mailboxId/compose.{-$outboxMessageId}.tsx +0 -14
- package/src/routes/mail/$mailboxId/index.tsx +0 -10
- package/src/routes/mail/$mailboxId.tsx +0 -38
- package/src/routes/mail/brief/$threadId/$messageId/$mode.{-$outboxMessageId}.tsx +0 -27
- package/src/routes/mail/brief/$threadId/$messageId.tsx +0 -23
- package/src/routes/mail/brief/$threadId/index.tsx +0 -14
- package/src/routes/mail/brief/$threadId.tsx +0 -16
- package/src/routes/mail/brief/compose.{-$outboxMessageId}.tsx +0 -22
- package/src/routes/mail/brief/index.tsx +0 -14
- package/src/routes/mail/brief.tsx +0 -52
- package/src/routes/mail/flagged/$threadId/$messageId/$mode.{-$outboxMessageId}.tsx +0 -15
- package/src/routes/mail/flagged/$threadId/$messageId.tsx +0 -23
- package/src/routes/mail/flagged/$threadId/index.tsx +0 -14
- package/src/routes/mail/flagged/$threadId.tsx +0 -16
- package/src/routes/mail/flagged/compose.{-$outboxMessageId}.tsx +0 -13
- package/src/routes/mail/flagged/index.tsx +0 -10
- package/src/routes/mail/flagged.tsx +0 -51
- package/src/routes/mail/index.tsx +0 -14
- package/src/routes/mail/outbox/compose.{-$outboxMessageId}.tsx +0 -17
- package/src/routes/mail/outbox/draft/$outboxMessageId.tsx +0 -19
- package/src/routes/mail/outbox/index.tsx +0 -10
- package/src/routes/mail/outbox.tsx +0 -32
- package/src/routes/mail.tsx +0 -262
- package/src/routes/onboarding.tsx +0 -47
- package/src/routes/settings/-accounts.test.ts +0 -340
- package/src/routes/settings/-filters.test.ts +0 -209
- package/src/routes/settings/-senders-remove-flag.render.test.ts +0 -105
- package/src/routes/settings/-shared/help-copy.tsx +0 -91
- package/src/routes/settings/accounts.tsx +0 -692
- package/src/routes/settings/advanced.tsx +0 -57
- package/src/routes/settings/appearance.tsx +0 -118
- package/src/routes/settings/calendars.tsx +0 -134
- package/src/routes/settings/filters.tsx +0 -259
- package/src/routes/settings/folders.tsx +0 -330
- package/src/routes/settings/index.tsx +0 -5
- package/src/routes/settings/labels.tsx +0 -242
- package/src/routes/settings/senders.tsx +0 -444
- package/src/routes/settings/suggested-vips.tsx +0 -10
- package/src/routes/settings/warnings.tsx +0 -36
- package/src/routes/settings.tsx +0 -87
- package/src/routing/browsed-list.ts +0 -76
- package/src/routing/calendar-fragment.test.ts +0 -66
- package/src/routing/calendar.ts +0 -250
- package/src/routing/compose-press-opens.render.test.ts +0 -179
- package/src/routing/compose.ts +0 -181
- package/src/routing/fragment.render.test.ts +0 -98
- package/src/routing/fragment.test.ts +0 -113
- package/src/routing/fragment.ts +0 -145
- package/src/routing/index.ts +0 -93
- package/src/routing/nav-link.tsx +0 -64
- package/src/routing/nav-selection.ts +0 -26
- package/src/routing/open-thread.ts +0 -157
- package/src/routing/outbox-draft.ts +0 -44
- package/src/routing/reply.ts +0 -335
- package/src/routing/search-field.render.test.ts +0 -216
- package/src/routing/search-field.ts +0 -85
- package/src/routing/search-mirror-convergence.render.test.ts +0 -198
- package/src/routing/search-mirror-detail.render.test.ts +0 -226
- package/src/routing/search-mirror.ts +0 -130
- package/src/routing/search-navigation.ts +0 -43
- package/src/routing/sections.ts +0 -55
- package/src/routing/wizard-history.test.ts +0 -163
- package/src/routing/wizard-history.ts +0 -219
- package/src/runtime-config.test.ts +0 -43
- package/src/runtime-config.ts +0 -104
- package/src/shell/index.tsx +0 -101
- package/src/test-support/bulk-run.ts +0 -13
- package/src/test-support/dom.ts +0 -232
- package/src/test-support/fixtures.ts +0 -109
- package/src/test-support/http.ts +0 -82
- package/src/test-support/intelligence-surface.ts +0 -42
- package/src/test-support/list-search-binding.ts +0 -34
- package/src/test-support/test-bundle-app.ts +0 -102
- package/src/test-support/thread-router.ts +0 -54
- package/vite.base.ts +0 -61
- /package/{src → dist/src}/auth/auth.css +0 -0
- /package/{src → dist/src}/auth/cognito/cognito.css +0 -0
- /package/{src → dist/src}/vite-env.d.ts +0 -0
|
@@ -1,1094 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* DailyBrief — unified cross-account message digest.
|
|
3
|
-
*
|
|
4
|
-
* Renders one section per message category (Personal / Transactional /
|
|
5
|
-
* Newsletter / Marketing / Social / Automated / Unclassified) from the GET
|
|
6
|
-
* /threads endpoint. Starred mail is not a section — Flagged is a virtual
|
|
7
|
-
* mailbox in the nav. The brief defaults to the cross-account aggregate, and
|
|
8
|
-
* `MailListHeader` provides the title, unread count, and search.
|
|
9
|
-
*
|
|
10
|
-
* The brief paginates by section, not as a whole. Each section is its own
|
|
11
|
-
* category-scoped request for its newest rows plus one count of the whole
|
|
12
|
-
* category, so a header states how much mail that category holds rather than how
|
|
13
|
-
* many of a shared 50-row window fell into it, and a category whose mail is all
|
|
14
|
-
* older than that window still has a section with rows in it (#312). "Show all"
|
|
15
|
-
* hands the reader to the brief's own filtered list for that category; nothing
|
|
16
|
-
* here loads a mailbox.
|
|
17
|
-
*
|
|
18
|
-
* Sections are the unsearched brief only. A search is one request and one flat
|
|
19
|
-
* list in the server's order — sender matches first, then mentions, each newest
|
|
20
|
-
* first across every category: sectioning the matches would order
|
|
21
|
-
* them by category first and recency second, putting last spring's newsletter
|
|
22
|
-
* above a mail that arrived this morning.
|
|
23
|
-
*
|
|
24
|
-
* The list's filter surface is the kit `BriefSections`: categories, attribute
|
|
25
|
-
* chips and the account source group, in a panel the list header's caret opens
|
|
26
|
-
* over the rows. `FilterPanelProvider` shares that panel's open state between
|
|
27
|
-
* the caret and the sheet, the same shape `MailViewChrome` gives the mailbox and
|
|
28
|
-
* Starred views. The list draws those controls but applies none of them: the
|
|
29
|
-
* category, the account pill and every chip a parameter can express travel with
|
|
30
|
-
* the section requests, and the two that cannot ("From contacts", "Today") are
|
|
31
|
-
* applied here alongside the residual tokens (#314). The account pill is a
|
|
32
|
-
* parameter rather than a pass over the rows because a count taken over every
|
|
33
|
-
* account is not the size of a list showing one, which is what used to take the
|
|
34
|
-
* number off every header (#1136). The phone search takeover reads the same
|
|
35
|
-
* selection and the same rows, so a filter set on one surface holds on the
|
|
36
|
-
* other. Under a query the chips are terms of that query — see
|
|
37
|
-
* `briefChipFilters` — so what narrows the list is readable and editable in the
|
|
38
|
-
* search field.
|
|
39
|
-
*
|
|
40
|
-
* Multi-select is the mailbox list's, not a copy of it: the same
|
|
41
|
-
* `ThreadListInteraction` cursor and `useSelection` state, and the same
|
|
42
|
-
* `SelectionTopBar` in place of the pane header. A shift-range spans the rendered rows in
|
|
43
|
-
* document order, so it crosses category sections exactly as the eye reads
|
|
44
|
-
* them and never picks up a row behind a collapsed header or one the section's
|
|
45
|
-
* page did not reach. Folder-scoped verbs (Move, Apply label, Organize) resolve their
|
|
46
|
-
* account and source folder from the selection — see
|
|
47
|
-
* `resolveBriefSelectionScope`.
|
|
48
|
-
*
|
|
49
|
-
* Loading: skeleton rows on first paint, per-section from then on, and the rows
|
|
50
|
-
* already on screen stay put while the same predicate is re-fetched.
|
|
51
|
-
* Error: a section whose own request never got an answer says so in its own
|
|
52
|
-
* place and the rest of the brief stands. A 5xx is not that case — the API
|
|
53
|
-
* breaking escalates globally (`shouldEscalate`, #1059), and nothing here softens
|
|
54
|
-
* it.
|
|
55
|
-
* Empty: "You're caught up", but only once the server confirms no sync is
|
|
56
|
-
* running — while one is, the same empty list says it is still syncing.
|
|
57
|
-
*/
|
|
58
|
-
import { mailboxOperationsListMailboxesOptions } from "@remit/api-http-client/@tanstack/react-query.gen.ts";
|
|
59
|
-
import type {
|
|
60
|
-
RemitImapAccountResponse,
|
|
61
|
-
RemitImapMessageCategory,
|
|
62
|
-
RemitImapThreadMessageResponse,
|
|
63
|
-
} from "@remit/api-http-client/types.gen.ts";
|
|
64
|
-
import {
|
|
65
|
-
type BriefCategoryFilter,
|
|
66
|
-
BriefEmpty,
|
|
67
|
-
type BriefFilterId,
|
|
68
|
-
BriefSections,
|
|
69
|
-
briefChipCategory,
|
|
70
|
-
briefChipFilters,
|
|
71
|
-
briefFilterConfig,
|
|
72
|
-
briefFilterHasTerm,
|
|
73
|
-
clearBriefFiltersInQuery,
|
|
74
|
-
FilterPanelProvider,
|
|
75
|
-
type FilterSheetProps,
|
|
76
|
-
type FilterSheetSource,
|
|
77
|
-
isBriefCategory,
|
|
78
|
-
KeyboardHintBar,
|
|
79
|
-
matchesBriefFilters,
|
|
80
|
-
partitionSpamResults,
|
|
81
|
-
RefreshButton,
|
|
82
|
-
SECTION_ROW_CAP,
|
|
83
|
-
type SearchResult,
|
|
84
|
-
type SelectionRestriction,
|
|
85
|
-
SelectionTopBar,
|
|
86
|
-
SpamResultsOffer,
|
|
87
|
-
setBriefCategoryInQuery,
|
|
88
|
-
type ThreadRowData,
|
|
89
|
-
type ThreadSection,
|
|
90
|
-
toggleBriefFilterInQuery,
|
|
91
|
-
} from "@remit/ui";
|
|
92
|
-
import { useQueries } from "@tanstack/react-query";
|
|
93
|
-
import { AlertCircle, RefreshCw } from "lucide-react";
|
|
94
|
-
import {
|
|
95
|
-
type ReactNode,
|
|
96
|
-
type RefObject,
|
|
97
|
-
useCallback,
|
|
98
|
-
useMemo,
|
|
99
|
-
useState,
|
|
100
|
-
} from "react";
|
|
101
|
-
import { useJunkMailbox } from "@/hooks/useArchiveMailbox";
|
|
102
|
-
import { useBriefSearchRows, useBriefSections } from "@/hooks/useBriefSections";
|
|
103
|
-
import {
|
|
104
|
-
isSyncingPhase,
|
|
105
|
-
useInitialSyncProgress,
|
|
106
|
-
} from "@/hooks/useInitialSyncProgress";
|
|
107
|
-
import { useLabelList } from "@/hooks/useLabels";
|
|
108
|
-
import { useLayoutTier } from "@/hooks/useLayoutTier";
|
|
109
|
-
import { useIsDesktop } from "@/hooks/useMediaQuery";
|
|
110
|
-
import { useRefreshControl } from "@/hooks/useRefreshControl";
|
|
111
|
-
import { useSearchTokenContext } from "@/hooks/useSearchTokenContext";
|
|
112
|
-
import { useSpamMatchCounts } from "@/hooks/useSpamMatchCounts";
|
|
113
|
-
import type { TriageContextUpdate } from "@/hooks/useTriageLayer";
|
|
114
|
-
import { sortAccountsByCreatedAt } from "@/lib/account-order";
|
|
115
|
-
import {
|
|
116
|
-
BRIEF_CATEGORIES,
|
|
117
|
-
type BriefCategoryResult,
|
|
118
|
-
briefSections,
|
|
119
|
-
matchesSearchTokens,
|
|
120
|
-
toThreadRowData,
|
|
121
|
-
} from "@/lib/brief";
|
|
122
|
-
import {
|
|
123
|
-
briefClientOnlyFilters,
|
|
124
|
-
briefCountsMatchRows,
|
|
125
|
-
briefCriteria,
|
|
126
|
-
} from "@/lib/brief-criteria";
|
|
127
|
-
import { isServerError } from "@/lib/error-classifier";
|
|
128
|
-
import { junkDestination } from "@/lib/junk-destination";
|
|
129
|
-
import type { ListHeaderChrome } from "@/lib/list-header-chrome";
|
|
130
|
-
import { useMailContext } from "@/lib/mail-context";
|
|
131
|
-
import { useMailFreshness } from "@/lib/mail-freshness";
|
|
132
|
-
import { shouldRequestResultCount } from "@/lib/result-count";
|
|
133
|
-
import { junkMailboxIds } from "@/lib/result-folder";
|
|
134
|
-
import { rowToSearchResult } from "@/lib/search-result";
|
|
135
|
-
import { showInlineSearchResults } from "@/lib/search-surface";
|
|
136
|
-
import { parseSearchTokens } from "@/lib/search-tokens";
|
|
137
|
-
import { resolveSelectionAccountScope } from "@/lib/selection-account-scope";
|
|
138
|
-
import { spamOfferFromCounts } from "@/lib/spam-offer";
|
|
139
|
-
import { dedupeByThread } from "@/lib/starred-rows";
|
|
140
|
-
import { wizardSelectionFrom } from "@/lib/wizard-selection";
|
|
141
|
-
import {
|
|
142
|
-
type OpenThreadTarget,
|
|
143
|
-
type SelectionWizardControl,
|
|
144
|
-
useGoToSection,
|
|
145
|
-
useScopeSearchToMailbox,
|
|
146
|
-
useSelectionWizard,
|
|
147
|
-
} from "@/routing";
|
|
148
|
-
import { LabelApplyTrigger } from "./LabelApplyTrigger";
|
|
149
|
-
import { MailListHeader, type MailListHeaderProps } from "./MailListHeader";
|
|
150
|
-
import type { MessageListCommands } from "./MessageList";
|
|
151
|
-
import { MessageRow } from "./MessageRow";
|
|
152
|
-
import { SelectionWizardHost } from "./SelectionWizardHost";
|
|
153
|
-
import {
|
|
154
|
-
type OpenMessageOptions,
|
|
155
|
-
ThreadListInteraction,
|
|
156
|
-
useThreadListSelection,
|
|
157
|
-
} from "./ThreadListInteraction";
|
|
158
|
-
|
|
159
|
-
/* Rows one category's own list renders once the brief is narrowed to it — the
|
|
160
|
-
"show all" destination, which is a page of that category rather than the whole
|
|
161
|
-
of it. */
|
|
162
|
-
const CATEGORY_PAGE_SIZE = 50;
|
|
163
|
-
|
|
164
|
-
/* One page of matches for a searched brief. The server orders the whole match
|
|
165
|
-
set; this is how much of the front of it the list renders. */
|
|
166
|
-
const SEARCH_PAGE_SIZE = 200;
|
|
167
|
-
|
|
168
|
-
/* The brief asks for no sections while it is answering a search. */
|
|
169
|
-
const NO_CATEGORIES: RemitImapMessageCategory[] = [];
|
|
170
|
-
|
|
171
|
-
// ---------------------------------------------------------------------------
|
|
172
|
-
// Skeleton
|
|
173
|
-
// ---------------------------------------------------------------------------
|
|
174
|
-
|
|
175
|
-
const SectionSkeleton = () => (
|
|
176
|
-
<div className="animate-pulse">
|
|
177
|
-
{Array.from({ length: 3 }).map((_, i) => (
|
|
178
|
-
<div
|
|
179
|
-
// biome-ignore lint/suspicious/noArrayIndexKey: skeleton rows have no stable id
|
|
180
|
-
key={i}
|
|
181
|
-
className="flex items-start gap-3 py-2 pl-5 pr-4 border-b border-line"
|
|
182
|
-
>
|
|
183
|
-
<div className="size-7 rounded-full bg-surface-sunken shrink-0 mt-0.5" />
|
|
184
|
-
<div className="flex-1 space-y-1.5">
|
|
185
|
-
<div className="flex justify-between gap-2">
|
|
186
|
-
<div className="h-3.5 bg-surface-sunken rounded w-28" />
|
|
187
|
-
<div className="h-3 bg-surface-sunken rounded w-12" />
|
|
188
|
-
</div>
|
|
189
|
-
<div className="h-3.5 bg-surface-sunken rounded w-48" />
|
|
190
|
-
<div className="h-3 bg-surface-sunken rounded w-full" />
|
|
191
|
-
</div>
|
|
192
|
-
</div>
|
|
193
|
-
))}
|
|
194
|
-
</div>
|
|
195
|
-
);
|
|
196
|
-
|
|
197
|
-
// ---------------------------------------------------------------------------
|
|
198
|
-
// Error banner (per-account connection failure)
|
|
199
|
-
// ---------------------------------------------------------------------------
|
|
200
|
-
|
|
201
|
-
interface ErrorBannerProps {
|
|
202
|
-
accountEmail: string;
|
|
203
|
-
accountId: string;
|
|
204
|
-
}
|
|
205
|
-
|
|
206
|
-
const ErrorBanner = ({ accountEmail }: ErrorBannerProps) => {
|
|
207
|
-
const goToSection = useGoToSection();
|
|
208
|
-
return (
|
|
209
|
-
<div className="flex items-center gap-2 px-row-inset py-2 border-b border-line bg-danger-soft/40 text-xs text-danger">
|
|
210
|
-
<AlertCircle className="size-3.5 shrink-0" />
|
|
211
|
-
<span className="flex-1 truncate">{accountEmail} can't connect</span>
|
|
212
|
-
<button
|
|
213
|
-
type="button"
|
|
214
|
-
onClick={() => goToSection("accounts")}
|
|
215
|
-
className="shrink-0 underline text-danger hover:opacity-80"
|
|
216
|
-
>
|
|
217
|
-
Reconnect
|
|
218
|
-
</button>
|
|
219
|
-
</div>
|
|
220
|
-
);
|
|
221
|
-
};
|
|
222
|
-
|
|
223
|
-
// ---------------------------------------------------------------------------
|
|
224
|
-
// Selection surface (the mailbox list's, mounted on the brief)
|
|
225
|
-
// ---------------------------------------------------------------------------
|
|
226
|
-
|
|
227
|
-
export interface BriefSelectionScope {
|
|
228
|
-
/** Owning account, when every selected row shares one. */
|
|
229
|
-
accountId?: string;
|
|
230
|
-
/** Source folder, when every selected row shares one. */
|
|
231
|
-
mailboxId?: string;
|
|
232
|
-
/** Which scope the selection spans more of than those verbs can take. */
|
|
233
|
-
restriction?: SelectionRestriction;
|
|
234
|
-
/** Why folder-scoped verbs are withheld, in the toolbar's own words. */
|
|
235
|
-
moveDisabledHint?: string;
|
|
236
|
-
}
|
|
237
|
-
|
|
238
|
-
/**
|
|
239
|
-
* The account and source folder a brief selection resolves to.
|
|
240
|
-
*
|
|
241
|
-
* The mailbox list gets these from the route and scopes Move, Apply label and
|
|
242
|
-
* Organize to them. The brief spans accounts and folders, so it resolves them
|
|
243
|
-
* from the selection itself and withholds those verbs — with the reason on
|
|
244
|
-
* screen — whenever the selection spans more than one. Delete and mark-read
|
|
245
|
-
* carry no such scope and are always offered.
|
|
246
|
-
*
|
|
247
|
-
* Pure so the guard is unit-testable without a DOM.
|
|
248
|
-
*/
|
|
249
|
-
export const resolveBriefSelectionScope = (
|
|
250
|
-
rows: readonly ThreadRowData[],
|
|
251
|
-
selectedIds: ReadonlySet<string>,
|
|
252
|
-
): BriefSelectionScope => {
|
|
253
|
-
if (selectedIds.size === 0) return {};
|
|
254
|
-
const selected = rows.filter((row) => selectedIds.has(row.id));
|
|
255
|
-
const account = resolveSelectionAccountScope(
|
|
256
|
-
selected.map((row) => row.accountId),
|
|
257
|
-
);
|
|
258
|
-
if (account.restriction) return account;
|
|
259
|
-
const mailboxIds = new Set<string>();
|
|
260
|
-
for (const row of selected) {
|
|
261
|
-
if (row.mailboxId) mailboxIds.add(row.mailboxId);
|
|
262
|
-
}
|
|
263
|
-
if (mailboxIds.size > 1) {
|
|
264
|
-
return {
|
|
265
|
-
accountId: account.accountId,
|
|
266
|
-
restriction: "spansFolders",
|
|
267
|
-
moveDisabledHint: `Move only works within one folder — this selection spans ${mailboxIds.size} folders`,
|
|
268
|
-
};
|
|
269
|
-
}
|
|
270
|
-
return {
|
|
271
|
-
accountId: account.accountId,
|
|
272
|
-
mailboxId: mailboxIds.size === 1 ? [...mailboxIds][0] : undefined,
|
|
273
|
-
};
|
|
274
|
-
};
|
|
275
|
-
|
|
276
|
-
interface BriefSelectionChromeProps {
|
|
277
|
-
/** Everything the header needs when no selection is active. */
|
|
278
|
-
header: Omit<
|
|
279
|
-
MailListHeaderProps,
|
|
280
|
-
"children" | "selectionBar" | "paneOverlay"
|
|
281
|
-
>;
|
|
282
|
-
/** The rows the list is showing, for resolving the selection's scope. */
|
|
283
|
-
rows: readonly ThreadRowData[];
|
|
284
|
-
/** The wizard every verb on this bar opens, shared with the keyboard layer. */
|
|
285
|
-
wizard: SelectionWizardControl;
|
|
286
|
-
children: ReactNode;
|
|
287
|
-
}
|
|
288
|
-
|
|
289
|
-
/**
|
|
290
|
-
* The brief's selection chrome: the same surface the mailbox list raises, in
|
|
291
|
-
* the same place. The pane header carries the count and the verbs from the
|
|
292
|
-
* first ticked row. The selection itself comes from the enclosing
|
|
293
|
-
* `ThreadListInteraction`, so the brief and the mailbox list run one model.
|
|
294
|
-
*/
|
|
295
|
-
function BriefSelectionChrome({
|
|
296
|
-
header,
|
|
297
|
-
rows,
|
|
298
|
-
wizard,
|
|
299
|
-
children,
|
|
300
|
-
}: BriefSelectionChromeProps) {
|
|
301
|
-
const {
|
|
302
|
-
selectedIds,
|
|
303
|
-
selectedCount,
|
|
304
|
-
exitSelection,
|
|
305
|
-
orderedIds,
|
|
306
|
-
allSelected,
|
|
307
|
-
toggleAllLoaded,
|
|
308
|
-
} = useThreadListSelection();
|
|
309
|
-
|
|
310
|
-
const scope = useMemo(
|
|
311
|
-
() => resolveBriefSelectionScope(rows, selectedIds),
|
|
312
|
-
[rows, selectedIds],
|
|
313
|
-
);
|
|
314
|
-
const { junkMailboxId } = useJunkMailbox(scope.accountId);
|
|
315
|
-
const { labels } = useLabelList(scope.accountId);
|
|
316
|
-
|
|
317
|
-
const selectedMessageIds = useMemo(
|
|
318
|
-
() => Array.from(selectedIds),
|
|
319
|
-
[selectedIds],
|
|
320
|
-
);
|
|
321
|
-
// The ticked rows as the wizard reads them — the sample under every screen
|
|
322
|
-
// that names a match, and the senders its properties prefill reads.
|
|
323
|
-
const wizardSelection = useMemo(
|
|
324
|
-
() => wizardSelectionFrom(rows, selectedIds),
|
|
325
|
-
[rows, selectedIds],
|
|
326
|
-
);
|
|
327
|
-
|
|
328
|
-
const junkDestinationId = junkDestination(junkMailboxId, scope.mailboxId);
|
|
329
|
-
|
|
330
|
-
// One select-all for both surfaces: the desktop toolbar and the touch sheet
|
|
331
|
-
// offer the same control over the same rendered rows, so the verb a phone
|
|
332
|
-
// can reach is the verb a desktop can reach.
|
|
333
|
-
const selectAll = useMemo(
|
|
334
|
-
() =>
|
|
335
|
-
orderedIds.length > 0
|
|
336
|
-
? {
|
|
337
|
-
checked: allSelected,
|
|
338
|
-
indeterminate: selectedCount > 0 && !allSelected,
|
|
339
|
-
onChange: toggleAllLoaded,
|
|
340
|
-
}
|
|
341
|
-
: undefined,
|
|
342
|
-
[orderedIds.length, allSelected, selectedCount, toggleAllLoaded],
|
|
343
|
-
);
|
|
344
|
-
|
|
345
|
-
// The bar shows one notice at a time, so the scope restriction rides in as
|
|
346
|
-
// a notice — the same fold-in the mailbox list does.
|
|
347
|
-
const notice = scope.moveDisabledHint
|
|
348
|
-
? { tone: "warning" as const, text: scope.moveDisabledHint }
|
|
349
|
-
: undefined;
|
|
350
|
-
|
|
351
|
-
const selectionBar = (chrome: ListHeaderChrome) => (
|
|
352
|
-
<SelectionTopBar
|
|
353
|
-
title={chrome.title}
|
|
354
|
-
navSlot={chrome.navSlot}
|
|
355
|
-
titleMeta={chrome.titleMeta}
|
|
356
|
-
searchSlot={chrome.searchSlot}
|
|
357
|
-
searchField={chrome.searchField}
|
|
358
|
-
idleSlot={chrome.makeFilterSlot}
|
|
359
|
-
count={selectedCount}
|
|
360
|
-
onCancel={exitSelection}
|
|
361
|
-
onDelete={() => wizard.start("delete")}
|
|
362
|
-
onMove={() => wizard.start("move")}
|
|
363
|
-
onOrganize={() => wizard.start("organize")}
|
|
364
|
-
onJunk={junkDestinationId ? () => wizard.start("junk") : undefined}
|
|
365
|
-
onMarkRead={() => wizard.start("markRead")}
|
|
366
|
-
overflowSlot={
|
|
367
|
-
scope.accountId &&
|
|
368
|
-
scope.mailboxId &&
|
|
369
|
-
selectedCount > 0 &&
|
|
370
|
-
labels.length > 0 ? (
|
|
371
|
-
<LabelApplyTrigger
|
|
372
|
-
accountId={scope.accountId}
|
|
373
|
-
mailboxId={scope.mailboxId}
|
|
374
|
-
messageIds={selectedMessageIds}
|
|
375
|
-
/>
|
|
376
|
-
) : undefined
|
|
377
|
-
}
|
|
378
|
-
selectAll={selectAll}
|
|
379
|
-
notice={notice}
|
|
380
|
-
/>
|
|
381
|
-
);
|
|
382
|
-
|
|
383
|
-
// Mounted as the pane's overlay rather than beside the header: the brief hands
|
|
384
|
-
// its body over to the search results panel while a query is being typed, and
|
|
385
|
-
// the wizard is not part of the body it hands over. The overlay slot also puts
|
|
386
|
-
// it inside the list header's chrome, which is where the converted query it
|
|
387
|
-
// opens on comes from.
|
|
388
|
-
return (
|
|
389
|
-
<MailListHeader
|
|
390
|
-
{...header}
|
|
391
|
-
selectionBar={selectionBar}
|
|
392
|
-
paneOverlay={
|
|
393
|
-
<SelectionWizardHost
|
|
394
|
-
verb={wizard.verb}
|
|
395
|
-
accountId={scope.accountId}
|
|
396
|
-
mailboxId={scope.mailboxId}
|
|
397
|
-
selection={wizardSelection}
|
|
398
|
-
selectionRestriction={scope.restriction}
|
|
399
|
-
onFinished={exitSelection}
|
|
400
|
-
/>
|
|
401
|
-
}
|
|
402
|
-
>
|
|
403
|
-
{children}
|
|
404
|
-
</MailListHeader>
|
|
405
|
-
);
|
|
406
|
-
}
|
|
407
|
-
|
|
408
|
-
// ---------------------------------------------------------------------------
|
|
409
|
-
// Main component
|
|
410
|
-
// ---------------------------------------------------------------------------
|
|
411
|
-
|
|
412
|
-
interface DailyBriefProps {
|
|
413
|
-
accounts: RemitImapAccountResponse[];
|
|
414
|
-
selectedMessageId?: string;
|
|
415
|
-
/**
|
|
416
|
-
* Opens a row. Every row the brief renders names its thread, so the row the
|
|
417
|
-
* search widened in from another folder opens by exactly the same route as one
|
|
418
|
-
* from the unified inbox.
|
|
419
|
-
*/
|
|
420
|
-
onOpenThread?: (
|
|
421
|
-
target: OpenThreadTarget,
|
|
422
|
-
options?: OpenMessageOptions,
|
|
423
|
-
) => void;
|
|
424
|
-
/** Where the list publishes the commands the keyboard layer drives. */
|
|
425
|
-
commandsRef?: RefObject<MessageListCommands | null>;
|
|
426
|
-
/** Cursor / selection / display order, reported up to the triage layer. */
|
|
427
|
-
onTriageContextChange?: (context: TriageContextUpdate) => void;
|
|
428
|
-
onDeleteMessages: (messageIds: string[]) => void;
|
|
429
|
-
}
|
|
430
|
-
|
|
431
|
-
export function DailyBrief({
|
|
432
|
-
accounts,
|
|
433
|
-
selectedMessageId,
|
|
434
|
-
onOpenThread,
|
|
435
|
-
commandsRef,
|
|
436
|
-
onTriageContextChange,
|
|
437
|
-
onDeleteMessages,
|
|
438
|
-
}: DailyBriefProps) {
|
|
439
|
-
const { searchQuery, searchInput, resultFolderIndex, onSearchChange } =
|
|
440
|
-
useMailContext();
|
|
441
|
-
const tokenContext = useSearchTokenContext();
|
|
442
|
-
const isDesktop = useIsDesktop();
|
|
443
|
-
const tier = useLayoutTier();
|
|
444
|
-
const wizard = useSelectionWizard();
|
|
445
|
-
const scopeSearchToMailbox = useScopeSearchToMailbox();
|
|
446
|
-
|
|
447
|
-
const nonMuted = useMemo(
|
|
448
|
-
() => sortAccountsByCreatedAt(accounts.filter((a) => !a.muted?.value)),
|
|
449
|
-
[accounts],
|
|
450
|
-
);
|
|
451
|
-
|
|
452
|
-
// "all" = the cross-account aggregate (the brief's default), and "all"
|
|
453
|
-
// categories = the full set of sections. Account switching also lives in the
|
|
454
|
-
// nav sidebar; the category also drives the flatten-when-filtered path.
|
|
455
|
-
const [selectedAccountId, setSelectedAccountId] = useState("all");
|
|
456
|
-
const [selectedCategory, setSelectedCategory] =
|
|
457
|
-
useState<BriefCategoryFilter>("all");
|
|
458
|
-
|
|
459
|
-
// Held here rather than inside the list's filter sheet: the phone search
|
|
460
|
-
// takeover narrows the same rows by the same chips, and the body is unmounted
|
|
461
|
-
// and remounted around a query being typed, which would take a set living
|
|
462
|
-
// below with it.
|
|
463
|
-
const [activeFilters, setActiveFilters] = useState<
|
|
464
|
-
ReadonlySet<BriefFilterId>
|
|
465
|
-
>(new Set());
|
|
466
|
-
const [filterExpanded, setFilterExpanded] = useState(false);
|
|
467
|
-
const toggleFilter = useCallback((id: BriefFilterId) => {
|
|
468
|
-
setActiveFilters((prev) => {
|
|
469
|
-
const next = new Set(prev);
|
|
470
|
-
if (next.has(id)) next.delete(id);
|
|
471
|
-
else next.add(id);
|
|
472
|
-
return next;
|
|
473
|
-
});
|
|
474
|
-
}, []);
|
|
475
|
-
const clearFilters = useCallback(() => setActiveFilters(new Set()), []);
|
|
476
|
-
|
|
477
|
-
const searching = searchInput.trim().length > 0;
|
|
478
|
-
|
|
479
|
-
// The committed query, split into the free text the request carries and the
|
|
480
|
-
// tokens. Free text is what turns the brief from seven category sections into
|
|
481
|
-
// one ordered list of matches, so it is read before anything downstream of it.
|
|
482
|
-
const { freeText: sq, tokens: queryTokens } = parseSearchTokens(
|
|
483
|
-
searchQuery.trim().toLowerCase(),
|
|
484
|
-
tokenContext,
|
|
485
|
-
);
|
|
486
|
-
const underQuery = sq.length > 0;
|
|
487
|
-
|
|
488
|
-
// Under a query the chips and the query are one state: a chip writes its term
|
|
489
|
-
// into the query — `is:unread`, `has:attachment`, `category:newsletter` — and
|
|
490
|
-
// a term typed by hand ticks its chip. What narrows the rows is then legible
|
|
491
|
-
// in the field, editable there, and gone when the term is deleted. The
|
|
492
|
-
// panel's own set survives a search and comes back with it, and carries the
|
|
493
|
-
// two chips the vocabulary cannot spell (see `briefChipFilters`).
|
|
494
|
-
const chipFilters = useMemo(
|
|
495
|
-
() => briefChipFilters({ query: searchInput, ownFilters: activeFilters }),
|
|
496
|
-
[searchInput, activeFilters],
|
|
497
|
-
);
|
|
498
|
-
const chipCategory = useMemo(
|
|
499
|
-
() =>
|
|
500
|
-
briefChipCategory({ query: searchInput, ownCategory: selectedCategory }),
|
|
501
|
-
[searchInput, selectedCategory],
|
|
502
|
-
);
|
|
503
|
-
|
|
504
|
-
// The same two, read off the committed query rather than the field. The chips
|
|
505
|
-
// above tick as the reader types, which is what the panel is for; the requests
|
|
506
|
-
// must not. Half-typed `is:unre` would otherwise fire a fresh burst of section
|
|
507
|
-
// requests on the way to `is:unread`, and the whole point of counting on a
|
|
508
|
-
// deliberate act is that nothing here rides a keystroke.
|
|
509
|
-
const requestFilters = useMemo(
|
|
510
|
-
() => briefChipFilters({ query: searchQuery, ownFilters: activeFilters }),
|
|
511
|
-
[searchQuery, activeFilters],
|
|
512
|
-
);
|
|
513
|
-
const requestCategory = useMemo(
|
|
514
|
-
() =>
|
|
515
|
-
briefChipCategory({ query: searchQuery, ownCategory: selectedCategory }),
|
|
516
|
-
[searchQuery, selectedCategory],
|
|
517
|
-
);
|
|
518
|
-
|
|
519
|
-
const toggleChip = useCallback(
|
|
520
|
-
(id: BriefFilterId) => {
|
|
521
|
-
if (!searching || !briefFilterHasTerm(id)) {
|
|
522
|
-
toggleFilter(id);
|
|
523
|
-
return;
|
|
524
|
-
}
|
|
525
|
-
const next = toggleBriefFilterInQuery(searchInput, id);
|
|
526
|
-
if (next !== undefined) onSearchChange(next);
|
|
527
|
-
},
|
|
528
|
-
[searching, searchInput, onSearchChange, toggleFilter],
|
|
529
|
-
);
|
|
530
|
-
|
|
531
|
-
const selectChipCategory = useCallback(
|
|
532
|
-
(category: BriefCategoryFilter) => {
|
|
533
|
-
if (!searching) {
|
|
534
|
-
setSelectedCategory(category);
|
|
535
|
-
return;
|
|
536
|
-
}
|
|
537
|
-
onSearchChange(setBriefCategoryInQuery(searchInput, category));
|
|
538
|
-
},
|
|
539
|
-
[searching, searchInput, onSearchChange],
|
|
540
|
-
);
|
|
541
|
-
|
|
542
|
-
// The way to a section's whole category: the brief's own list, narrowed to
|
|
543
|
-
// that category, which is a request for it rather than more of a window
|
|
544
|
-
// already fetched. Offered only at the "all" scope — inside one category the
|
|
545
|
-
// list already is the destination.
|
|
546
|
-
const showAllSection = useMemo(
|
|
547
|
-
() =>
|
|
548
|
-
requestCategory === "all" && !underQuery
|
|
549
|
-
? (sectionId: string) => {
|
|
550
|
-
if (isBriefCategory(sectionId)) selectChipCategory(sectionId);
|
|
551
|
-
}
|
|
552
|
-
: undefined,
|
|
553
|
-
[requestCategory, underQuery, selectChipCategory],
|
|
554
|
-
);
|
|
555
|
-
|
|
556
|
-
const clearChips = useCallback(() => {
|
|
557
|
-
setSelectedCategory("all");
|
|
558
|
-
setSelectedAccountId("all");
|
|
559
|
-
clearFilters();
|
|
560
|
-
if (searching) onSearchChange(clearBriefFiltersInQuery(searchInput));
|
|
561
|
-
}, [searching, searchInput, onSearchChange, clearFilters]);
|
|
562
|
-
|
|
563
|
-
// --- Per-account mailbox list for unread counts and error detection ---
|
|
564
|
-
const mailboxQueries = useQueries({
|
|
565
|
-
queries: nonMuted.map((account) => ({
|
|
566
|
-
...mailboxOperationsListMailboxesOptions({
|
|
567
|
-
path: { accountId: account.accountId },
|
|
568
|
-
}),
|
|
569
|
-
staleTime: Infinity,
|
|
570
|
-
// A 4xx here is the account's own problem (IMAP down, auth expired) and
|
|
571
|
-
// renders the inline "Reconnect" banner below — opt it out of the global
|
|
572
|
-
// fatal overlay. A 5xx is OUR API breaking, not the account, and still
|
|
573
|
-
// escalates globally (meta.softError is ignored for 5xx — #1059).
|
|
574
|
-
meta: { softError: true },
|
|
575
|
-
})),
|
|
576
|
-
});
|
|
577
|
-
|
|
578
|
-
// Build accountId → unseen map for source counts
|
|
579
|
-
const unseenByAccount = useMemo<Map<string, number>>(() => {
|
|
580
|
-
const map = new Map<string, number>();
|
|
581
|
-
for (let i = 0; i < nonMuted.length; i++) {
|
|
582
|
-
const accountId = nonMuted[i].accountId;
|
|
583
|
-
const mailboxes = mailboxQueries[i]?.data?.items ?? [];
|
|
584
|
-
const total = mailboxes.reduce(
|
|
585
|
-
(sum, mb) => sum + (mb.unseenCount ?? 0),
|
|
586
|
-
0,
|
|
587
|
-
);
|
|
588
|
-
map.set(accountId, total);
|
|
589
|
-
}
|
|
590
|
-
return map;
|
|
591
|
-
}, [nonMuted, mailboxQueries]);
|
|
592
|
-
|
|
593
|
-
// Per-account connection failures: accounts whose mailbox list failed for a
|
|
594
|
-
// reason that is genuinely the account's (e.g. IMAP down, auth expired) — a
|
|
595
|
-
// 4xx. A first-party 5xx is OUR API breaking, not the account being
|
|
596
|
-
// unreachable, so it must NOT render the misleading "can't connect /
|
|
597
|
-
// Reconnect" banner; the global escalation overlay (QueryCache.onError)
|
|
598
|
-
// handles it instead.
|
|
599
|
-
const failedAccounts = useMemo<RemitImapAccountResponse[]>(() => {
|
|
600
|
-
return nonMuted.filter((_, i) => {
|
|
601
|
-
const query = mailboxQueries[i];
|
|
602
|
-
if (!query?.isError) return false;
|
|
603
|
-
return !isServerError(query.error);
|
|
604
|
-
});
|
|
605
|
-
}, [nonMuted, mailboxQueries]);
|
|
606
|
-
|
|
607
|
-
// --- The brief's rows ---
|
|
608
|
-
// The chips and the tokens as request parameters. The category is not among
|
|
609
|
-
// them: each section is its own category-scoped request, and the category
|
|
610
|
-
// chip decides which sections are on screen rather than narrowing a shared
|
|
611
|
-
// one.
|
|
612
|
-
const { criteria: chipCriteria, residual: residualTokens } = useMemo(
|
|
613
|
-
() =>
|
|
614
|
-
briefCriteria(
|
|
615
|
-
requestCategory,
|
|
616
|
-
requestFilters,
|
|
617
|
-
queryTokens,
|
|
618
|
-
selectedAccountId === "all" ? undefined : selectedAccountId,
|
|
619
|
-
),
|
|
620
|
-
[requestCategory, requestFilters, queryTokens, selectedAccountId],
|
|
621
|
-
);
|
|
622
|
-
const shownCategories = useMemo<RemitImapMessageCategory[]>(
|
|
623
|
-
() =>
|
|
624
|
-
requestCategory === "all" ? [...BRIEF_CATEGORIES] : [requestCategory],
|
|
625
|
-
[requestCategory],
|
|
626
|
-
);
|
|
627
|
-
// Under a query the category is a parameter again rather than a section
|
|
628
|
-
// scope: there is one request, and the chip narrows it.
|
|
629
|
-
const searchCriteria = useMemo(
|
|
630
|
-
() => ({
|
|
631
|
-
...chipCriteria,
|
|
632
|
-
query: sq,
|
|
633
|
-
...(requestCategory === "all" ? {} : { category: [requestCategory] }),
|
|
634
|
-
}),
|
|
635
|
-
[chipCriteria, sq, requestCategory],
|
|
636
|
-
);
|
|
637
|
-
// The tokens no parameter carries narrow the rows after they arrive, so while
|
|
638
|
-
// one is active the count is of a wider set than the list and the sections
|
|
639
|
-
// show no number at all. The account pills are no longer among them: the
|
|
640
|
-
// request carries the account, so the count narrows with the list (#1136).
|
|
641
|
-
const counted = briefCountsMatchRows({
|
|
642
|
-
residual: residualTokens,
|
|
643
|
-
attributes: requestFilters,
|
|
644
|
-
});
|
|
645
|
-
|
|
646
|
-
const {
|
|
647
|
-
sections: sectionRows,
|
|
648
|
-
isLoading: sectionsLoading,
|
|
649
|
-
isError: sectionsError,
|
|
650
|
-
refetch: refetchSections,
|
|
651
|
-
} = useBriefSections({
|
|
652
|
-
categories: underQuery ? NO_CATEGORIES : shownCategories,
|
|
653
|
-
criteria: chipCriteria,
|
|
654
|
-
limit: requestCategory === "all" ? SECTION_ROW_CAP : CATEGORY_PAGE_SIZE,
|
|
655
|
-
counted,
|
|
656
|
-
});
|
|
657
|
-
|
|
658
|
-
// A search is answered by one request and rendered as one list. Splitting the
|
|
659
|
-
// matches into category sections orders them by category first and recency
|
|
660
|
-
// second, which puts a newsletter from last spring above a mail that arrived
|
|
661
|
-
// this morning — the reading the search is asked to give (#312).
|
|
662
|
-
const {
|
|
663
|
-
rows: searchRows,
|
|
664
|
-
isLoading: searchLoading,
|
|
665
|
-
isError: searchError,
|
|
666
|
-
refetch: refetchSearch,
|
|
667
|
-
} = useBriefSearchRows(searchCriteria, SEARCH_PAGE_SIZE, underQuery);
|
|
668
|
-
|
|
669
|
-
const isLoading = underQuery ? searchLoading : sectionsLoading;
|
|
670
|
-
const isError = underQuery ? searchError : sectionsError;
|
|
671
|
-
const refetch = useCallback(() => {
|
|
672
|
-
if (underQuery) {
|
|
673
|
-
refetchSearch();
|
|
674
|
-
return;
|
|
675
|
-
}
|
|
676
|
-
refetchSections();
|
|
677
|
-
}, [underQuery, refetchSearch, refetchSections]);
|
|
678
|
-
|
|
679
|
-
// What the request could not carry: the two chips no endpoint takes a
|
|
680
|
-
// parameter for ("From contacts", "Today"), and the residual tokens
|
|
681
|
-
// (`before:`, `after:`, `in:`, `account:`). Everything else — the account
|
|
682
|
-
// pill, mute, the free text, `from:` and `subject:` — was answered over the
|
|
683
|
-
// whole scope by the request itself, and the order the rows arrived in is
|
|
684
|
-
// kept: narrowing never re-sorts.
|
|
685
|
-
const clientOnlyFilters = useMemo(
|
|
686
|
-
() => briefClientOnlyFilters(requestFilters),
|
|
687
|
-
[requestFilters],
|
|
688
|
-
);
|
|
689
|
-
const narrowRows = useCallback(
|
|
690
|
-
(rows: RemitImapThreadMessageResponse[]): ThreadRowData[] =>
|
|
691
|
-
// One row per conversation, because that is what the server counted:
|
|
692
|
-
// `count` is thread-distinct, and a list keying on messageId puts twelve
|
|
693
|
-
// rows under a header reading one. Collapsed before anything reads a
|
|
694
|
-
// length, so the rows and the number are the same unit.
|
|
695
|
-
dedupeByThread(rows)
|
|
696
|
-
.map(toThreadRowData)
|
|
697
|
-
.filter(
|
|
698
|
-
(t) =>
|
|
699
|
-
matchesBriefFilters(t, clientOnlyFilters) &&
|
|
700
|
-
matchesSearchTokens(t, residualTokens),
|
|
701
|
-
),
|
|
702
|
-
[clientOnlyFilters, residualTokens],
|
|
703
|
-
);
|
|
704
|
-
|
|
705
|
-
const briefRows = useMemo<BriefCategoryResult[]>(
|
|
706
|
-
() =>
|
|
707
|
-
sectionRows.map((section) => ({
|
|
708
|
-
category: section.category,
|
|
709
|
-
total: section.total,
|
|
710
|
-
atCap: section.atCap,
|
|
711
|
-
loading: section.loading,
|
|
712
|
-
failed: section.failed,
|
|
713
|
-
rows: narrowRows(section.rows),
|
|
714
|
-
})),
|
|
715
|
-
[sectionRows, narrowRows],
|
|
716
|
-
);
|
|
717
|
-
|
|
718
|
-
const matchRows = useMemo<ThreadRowData[]>(
|
|
719
|
-
() => narrowRows(searchRows),
|
|
720
|
-
[searchRows, narrowRows],
|
|
721
|
-
);
|
|
722
|
-
|
|
723
|
-
// Each section answers for itself, so a retry is that section's own request.
|
|
724
|
-
const retrySection = useCallback(
|
|
725
|
-
(sectionId: string) => {
|
|
726
|
-
sectionRows.find((section) => section.category === sectionId)?.retry();
|
|
727
|
-
},
|
|
728
|
-
[sectionRows],
|
|
729
|
-
);
|
|
730
|
-
|
|
731
|
-
const filteredRows = useMemo<ThreadRowData[]>(
|
|
732
|
-
() =>
|
|
733
|
-
underQuery ? matchRows : briefRows.flatMap((section) => section.rows),
|
|
734
|
-
[underQuery, matchRows, briefRows],
|
|
735
|
-
);
|
|
736
|
-
|
|
737
|
-
// A search reaches every folder, Spam included, and the brief is the one
|
|
738
|
-
// global-scope view whose own rows stand in for the read-only results panel
|
|
739
|
-
// once the query commits. The panel held Spam out and offered a way to it
|
|
740
|
-
// instead (`MailListHeader`'s `spamOffer`); the brief's own body has to do the
|
|
741
|
-
// same, or a committed search surfaces junk mail inline and drops the way back
|
|
742
|
-
// to it. A bare token query (e.g. `is:unread`) never reaches search mode, so
|
|
743
|
-
// there is nothing to hold out.
|
|
744
|
-
// What the offer states is the server's count of every junk folder the search
|
|
745
|
-
// reached, one request each, summed — not the junk share of the page below
|
|
746
|
-
// it, which is a page length wearing a folder total's clothes (#313). The
|
|
747
|
-
// page's own junk rows still decide what is held out of the list, and where
|
|
748
|
-
// "Go to Spam" lands whenever no count ranks the folders.
|
|
749
|
-
const junkIds = useMemo(
|
|
750
|
-
() => junkMailboxIds(resultFolderIndex),
|
|
751
|
-
[resultFolderIndex],
|
|
752
|
-
);
|
|
753
|
-
const spamCounts = useSpamMatchCounts({
|
|
754
|
-
criteria: searchCriteria,
|
|
755
|
-
junkMailboxIds: junkIds,
|
|
756
|
-
// The same two gates the mailbox list counts under: criteria the request
|
|
757
|
-
// carried in full, and free text long enough for the index to answer
|
|
758
|
-
// without a folder scan per character.
|
|
759
|
-
enabled:
|
|
760
|
-
counted &&
|
|
761
|
-
shouldRequestResultCount({
|
|
762
|
-
hasSearchQuery: underQuery,
|
|
763
|
-
freeText: sq,
|
|
764
|
-
residualTokenCount: residualTokens.length,
|
|
765
|
-
}),
|
|
766
|
-
});
|
|
767
|
-
|
|
768
|
-
const { spamIds, briefSpamOffer } = useMemo(() => {
|
|
769
|
-
const none = { spamIds: undefined, briefSpamOffer: undefined };
|
|
770
|
-
if (!sq) return none;
|
|
771
|
-
const asResults = filteredRows.map((row) =>
|
|
772
|
-
rowToSearchResult(row, resultFolderIndex),
|
|
773
|
-
);
|
|
774
|
-
const { spam } = partitionSpamResults(asResults);
|
|
775
|
-
// Per folder, not a total: with no count to rank them by, this is the only
|
|
776
|
-
// evidence of which account's Spam holds the mail, and a button landing on
|
|
777
|
-
// the wrong one shows "No matches" over rows this page is holding out.
|
|
778
|
-
const pageRowsByMailbox = new Map<string, number>();
|
|
779
|
-
for (const result of spam) {
|
|
780
|
-
if (!result.mailboxId) continue;
|
|
781
|
-
pageRowsByMailbox.set(
|
|
782
|
-
result.mailboxId,
|
|
783
|
-
(pageRowsByMailbox.get(result.mailboxId) ?? 0) + 1,
|
|
784
|
-
);
|
|
785
|
-
}
|
|
786
|
-
const offer = spamOfferFromCounts(spamCounts, { pageRowsByMailbox });
|
|
787
|
-
if (spam.length === 0 && !offer) return none;
|
|
788
|
-
return {
|
|
789
|
-
spamIds:
|
|
790
|
-
spam.length > 0 ? new Set(spam.map((result) => result.id)) : undefined,
|
|
791
|
-
briefSpamOffer: offer,
|
|
792
|
-
};
|
|
793
|
-
}, [filteredRows, sq, resultFolderIndex, spamCounts]);
|
|
794
|
-
|
|
795
|
-
const sections = useMemo<ThreadSection[]>(() => {
|
|
796
|
-
const keep = (rows: ThreadRowData[]): ThreadRowData[] =>
|
|
797
|
-
spamIds === undefined ? rows : rows.filter((row) => !spamIds.has(row.id));
|
|
798
|
-
// One unlabelled section under a query: the body renders it flat, so the
|
|
799
|
-
// matches stay in the single order the server put them in.
|
|
800
|
-
if (underQuery) return [{ id: "matches", threads: keep(matchRows) }];
|
|
801
|
-
return briefSections(
|
|
802
|
-
briefRows.map((section) => ({
|
|
803
|
-
...section,
|
|
804
|
-
rows: keep(section.rows),
|
|
805
|
-
})),
|
|
806
|
-
);
|
|
807
|
-
}, [underQuery, matchRows, briefRows, spamIds]);
|
|
808
|
-
|
|
809
|
-
// A committed query puts rows the widened cross-folder search found into the
|
|
810
|
-
// body, and those messages are in folders the brief itself never loads. They
|
|
811
|
-
// open like any other row: what the address carries is the thread, which
|
|
812
|
-
// every row names, and the conversation is fetched by it (#635).
|
|
813
|
-
const openRow = useCallback(
|
|
814
|
-
(id: string, options?: OpenMessageOptions) => {
|
|
815
|
-
const threadId = filteredRows.find((row) => row.id === id)?.threadId;
|
|
816
|
-
if (!threadId) return;
|
|
817
|
-
onOpenThread?.({ threadId, messageId: id }, options);
|
|
818
|
-
},
|
|
819
|
-
[filteredRows, onOpenThread],
|
|
820
|
-
);
|
|
821
|
-
|
|
822
|
-
// The results panel; each result carries the thread it belongs to.
|
|
823
|
-
const openResult = useCallback(
|
|
824
|
-
(result: SearchResult) => {
|
|
825
|
-
const threadId =
|
|
826
|
-
result.threadId ??
|
|
827
|
-
filteredRows.find((row) => row.id === result.id)?.threadId;
|
|
828
|
-
if (!threadId) return;
|
|
829
|
-
onOpenThread?.({ threadId, messageId: result.id });
|
|
830
|
-
},
|
|
831
|
-
[filteredRows, onOpenThread],
|
|
832
|
-
);
|
|
833
|
-
|
|
834
|
-
const accountSources = useMemo<FilterSheetSource[]>(() => {
|
|
835
|
-
if (nonMuted.length <= 1) return [];
|
|
836
|
-
return [
|
|
837
|
-
{ id: "all", label: "All", active: selectedAccountId === "all" },
|
|
838
|
-
...nonMuted.map((account) => ({
|
|
839
|
-
id: account.accountId,
|
|
840
|
-
label: account.email.split("@")[0] ?? account.email,
|
|
841
|
-
count: unseenByAccount.get(account.accountId),
|
|
842
|
-
active: selectedAccountId === account.accountId,
|
|
843
|
-
})),
|
|
844
|
-
];
|
|
845
|
-
}, [nonMuted, unseenByAccount, selectedAccountId]);
|
|
846
|
-
|
|
847
|
-
const mutedCount = useMemo(
|
|
848
|
-
() => accounts.filter((a) => a.muted?.value).length,
|
|
849
|
-
[accounts],
|
|
850
|
-
);
|
|
851
|
-
|
|
852
|
-
const totalUnseen = useMemo(
|
|
853
|
-
() => Array.from(unseenByAccount.values()).reduce((a, b) => a + b, 0),
|
|
854
|
-
[unseenByAccount],
|
|
855
|
-
);
|
|
856
|
-
|
|
857
|
-
// Every non-muted account the brief aggregates — refreshing it means
|
|
858
|
-
// refreshing all of them, same as the accounts the "caught up" reading
|
|
859
|
-
// above already spans.
|
|
860
|
-
const refreshAccountIds = useMemo(
|
|
861
|
-
() => nonMuted.map((account) => account.accountId),
|
|
862
|
-
[nonMuted],
|
|
863
|
-
);
|
|
864
|
-
const { hasNewMail } = useMailFreshness();
|
|
865
|
-
const {
|
|
866
|
-
state: refreshState,
|
|
867
|
-
errorMessage: refreshError,
|
|
868
|
-
refresh: onRefreshBrief,
|
|
869
|
-
} = useRefreshControl(refreshAccountIds, { onSettled: () => refetch() });
|
|
870
|
-
// Memoized: this element is a dep of `MailListHeader`'s own `chrome` memo
|
|
871
|
-
// (via the `refreshControl` prop), so a fresh element identity every render
|
|
872
|
-
// would defeat that memo and re-render every chrome consumer with it.
|
|
873
|
-
const refreshControl = useMemo(
|
|
874
|
-
() => (
|
|
875
|
-
<RefreshButton
|
|
876
|
-
state={refreshState}
|
|
877
|
-
onRefresh={onRefreshBrief}
|
|
878
|
-
label="Refresh daily brief"
|
|
879
|
-
errorMessage={refreshError}
|
|
880
|
-
hasUpdate={hasNewMail(refreshAccountIds)}
|
|
881
|
-
/>
|
|
882
|
-
),
|
|
883
|
-
[refreshState, onRefreshBrief, refreshError, hasNewMail, refreshAccountIds],
|
|
884
|
-
);
|
|
885
|
-
|
|
886
|
-
// The phone search takeover renders the rows the list renders: the same
|
|
887
|
-
// requests answered the category and the chips, so a second pass here would
|
|
888
|
-
// narrow one surface by a criterion the other already applied to the whole
|
|
889
|
-
// scope.
|
|
890
|
-
const searchResults = useMemo<SearchResult[]>(
|
|
891
|
-
() => filteredRows.map((row) => rowToSearchResult(row, resultFolderIndex)),
|
|
892
|
-
[filteredRows, resultFolderIndex],
|
|
893
|
-
);
|
|
894
|
-
|
|
895
|
-
const filterConfig = useMemo<Omit<FilterSheetProps, "children">>(() => {
|
|
896
|
-
const preset = briefFilterConfig(
|
|
897
|
-
accountSources.map((s) => ({
|
|
898
|
-
id: s.id,
|
|
899
|
-
label: s.label,
|
|
900
|
-
count: s.count,
|
|
901
|
-
active: s.active,
|
|
902
|
-
})),
|
|
903
|
-
);
|
|
904
|
-
return {
|
|
905
|
-
categories: preset.categories,
|
|
906
|
-
filters: preset.filters,
|
|
907
|
-
sources: preset.sources,
|
|
908
|
-
sourcesNote: mutedCount > 0 ? `+${mutedCount} muted` : undefined,
|
|
909
|
-
selectedCategory: chipCategory,
|
|
910
|
-
activeFilters: chipFilters,
|
|
911
|
-
expanded: filterExpanded,
|
|
912
|
-
onExpandedChange: setFilterExpanded,
|
|
913
|
-
onSelectCategory: (id: string) =>
|
|
914
|
-
selectChipCategory(id as BriefCategoryFilter),
|
|
915
|
-
onSelectSource: setSelectedAccountId,
|
|
916
|
-
onToggleFilter: (id: string) => toggleChip(id as BriefFilterId),
|
|
917
|
-
onClear: clearChips,
|
|
918
|
-
};
|
|
919
|
-
}, [
|
|
920
|
-
accountSources,
|
|
921
|
-
mutedCount,
|
|
922
|
-
chipCategory,
|
|
923
|
-
chipFilters,
|
|
924
|
-
filterExpanded,
|
|
925
|
-
toggleChip,
|
|
926
|
-
selectChipCategory,
|
|
927
|
-
clearChips,
|
|
928
|
-
]);
|
|
929
|
-
|
|
930
|
-
// The brief is genuinely empty (caught up) only when nothing is narrowing the
|
|
931
|
-
// view: no account source and no search — free text or token. When a
|
|
932
|
-
// source/search yields nothing, the list says so instead, so the narrowing
|
|
933
|
-
// is still visible as the reason.
|
|
934
|
-
const caughtUp =
|
|
935
|
-
sections.length === 0 &&
|
|
936
|
-
selectedAccountId === "all" &&
|
|
937
|
-
sq.length === 0 &&
|
|
938
|
-
queryTokens.length === 0;
|
|
939
|
-
|
|
940
|
-
// "Caught up" is a claim about the user's mail, so it may only be made once
|
|
941
|
-
// the server has confirmed no sync is running (#452). The config snapshot
|
|
942
|
-
// that carries these accounts is fetched once (staleTime Infinity), so its
|
|
943
|
-
// syncPhase is a seed rather than a reading: it says a sync WAS running when
|
|
944
|
-
// the accounts loaded, which is enough to start the live poll before the list
|
|
945
|
-
// paints — the post-onboarding case that produced the false claim.
|
|
946
|
-
const briefAccountIds = useMemo(
|
|
947
|
-
() => nonMuted.map((a) => a.accountId),
|
|
948
|
-
[nonMuted],
|
|
949
|
-
);
|
|
950
|
-
const seededSyncing = useMemo(
|
|
951
|
-
() => nonMuted.some((a) => isSyncingPhase(a.syncPhase)),
|
|
952
|
-
[nonMuted],
|
|
953
|
-
);
|
|
954
|
-
const syncProgress = useInitialSyncProgress(
|
|
955
|
-
briefAccountIds,
|
|
956
|
-
caughtUp || seededSyncing,
|
|
957
|
-
);
|
|
958
|
-
|
|
959
|
-
const briefSkeleton = (
|
|
960
|
-
<div className="h-full overflow-y-auto">
|
|
961
|
-
<SectionSkeleton />
|
|
962
|
-
<SectionSkeleton />
|
|
963
|
-
</div>
|
|
964
|
-
);
|
|
965
|
-
|
|
966
|
-
// The filter sheet lives in the list body, so it is on screen only when the
|
|
967
|
-
// rows are. The caret reads the same answer and stands down everywhere else,
|
|
968
|
-
// rather than opening nothing over a skeleton or an empty state.
|
|
969
|
-
const showsRows = !isLoading && !isError && !caughtUp;
|
|
970
|
-
|
|
971
|
-
// A search does not take the panel down — the chips compose into the query
|
|
972
|
-
// rather than competing with it. The one window where the brief's own body is
|
|
973
|
-
// not on screen is the results panel, which owns the pane while a
|
|
974
|
-
// first query is still being typed; the caret stands down for exactly that,
|
|
975
|
-
// on the same answer the header swaps the body on.
|
|
976
|
-
const resultsPanelOwnsBody = showInlineSearchResults({
|
|
977
|
-
tier,
|
|
978
|
-
hasLiveInput: searching,
|
|
979
|
-
hasCommittedQuery: searchQuery.trim().length > 0,
|
|
980
|
-
bodyRendersCommittedResults: true,
|
|
981
|
-
});
|
|
982
|
-
|
|
983
|
-
const stateBody = showsRows ? (
|
|
984
|
-
<div className="flex h-full min-h-0 flex-col">
|
|
985
|
-
{briefSpamOffer && (
|
|
986
|
-
<SpamResultsOffer
|
|
987
|
-
count={briefSpamOffer.count}
|
|
988
|
-
onScopeToSpam={() =>
|
|
989
|
-
scopeSearchToMailbox(briefSpamOffer.mailboxId, searchQuery)
|
|
990
|
-
}
|
|
991
|
-
/>
|
|
992
|
-
)}
|
|
993
|
-
<div className="min-h-0 flex-1">
|
|
994
|
-
<BriefSections
|
|
995
|
-
sections={sections}
|
|
996
|
-
briefCategory={chipCategory}
|
|
997
|
-
Row={MessageRow}
|
|
998
|
-
selectedThreadId={selectedMessageId}
|
|
999
|
-
onSelectThread={openRow}
|
|
1000
|
-
onShowAllSection={showAllSection}
|
|
1001
|
-
onRetrySection={retrySection}
|
|
1002
|
-
flat={underQuery}
|
|
1003
|
-
onSelectBriefCategory={selectChipCategory}
|
|
1004
|
-
sources={accountSources}
|
|
1005
|
-
sourcesNote={mutedCount > 0 ? `+${mutedCount} muted` : undefined}
|
|
1006
|
-
onSelectSource={setSelectedAccountId}
|
|
1007
|
-
activeFilters={chipFilters}
|
|
1008
|
-
onToggleFilter={toggleChip}
|
|
1009
|
-
onClearFilters={clearChips}
|
|
1010
|
-
/>
|
|
1011
|
-
</div>
|
|
1012
|
-
</div>
|
|
1013
|
-
) : isLoading ? (
|
|
1014
|
-
briefSkeleton
|
|
1015
|
-
) : isError ? (
|
|
1016
|
-
<div className="flex h-full flex-col items-center justify-center gap-3 py-12 text-sm text-fg-muted">
|
|
1017
|
-
<AlertCircle className="size-8 text-danger" />
|
|
1018
|
-
<p>Couldn't load your messages</p>
|
|
1019
|
-
<button
|
|
1020
|
-
type="button"
|
|
1021
|
-
onClick={() => refetch()}
|
|
1022
|
-
className="flex items-center gap-1 text-accent underline text-xs"
|
|
1023
|
-
>
|
|
1024
|
-
<RefreshCw className="size-3.5" />
|
|
1025
|
-
Try again
|
|
1026
|
-
</button>
|
|
1027
|
-
</div>
|
|
1028
|
-
) : syncProgress.resolved ? (
|
|
1029
|
-
<BriefEmpty
|
|
1030
|
-
sync={
|
|
1031
|
-
syncProgress.syncing
|
|
1032
|
-
? { synced: syncProgress.synced, total: syncProgress.total }
|
|
1033
|
-
: undefined
|
|
1034
|
-
}
|
|
1035
|
-
/>
|
|
1036
|
-
) : (
|
|
1037
|
-
briefSkeleton
|
|
1038
|
-
);
|
|
1039
|
-
|
|
1040
|
-
// The cursor and selection wrap the whole pane, not just the list body: the
|
|
1041
|
-
// selection toolbar takes the header's place while rows are selected, so it
|
|
1042
|
-
// has to sit inside the same provider the rows do. The filter panel spans the
|
|
1043
|
-
// same pane for the same reason — the caret is in the header, the panel is
|
|
1044
|
-
// above the rows.
|
|
1045
|
-
return (
|
|
1046
|
-
<FilterPanelProvider hasSheet={showsRows && !resultsPanelOwnsBody}>
|
|
1047
|
-
<ThreadListInteraction
|
|
1048
|
-
selectedMessageId={selectedMessageId}
|
|
1049
|
-
rows={filteredRows}
|
|
1050
|
-
onOpen={openRow}
|
|
1051
|
-
onDeleteMessages={onDeleteMessages}
|
|
1052
|
-
onSelectionVerb={wizard.start}
|
|
1053
|
-
commandsRef={commandsRef}
|
|
1054
|
-
onTriageContextChange={onTriageContextChange}
|
|
1055
|
-
>
|
|
1056
|
-
<BriefSelectionChrome
|
|
1057
|
-
wizard={wizard}
|
|
1058
|
-
header={{
|
|
1059
|
-
title: "Daily brief",
|
|
1060
|
-
unreadCount: totalUnseen,
|
|
1061
|
-
footer: isDesktop ? <KeyboardHintBar /> : undefined,
|
|
1062
|
-
searchFilter: filterConfig,
|
|
1063
|
-
searchResults,
|
|
1064
|
-
searchLoading: isLoading,
|
|
1065
|
-
onSelectSearchResult: openResult,
|
|
1066
|
-
// The read-only results panel holds spam out of the same
|
|
1067
|
-
// committed search this body does, so it states the same
|
|
1068
|
-
// server-counted number rather than counting its own page.
|
|
1069
|
-
spamOffer: briefSpamOffer,
|
|
1070
|
-
// The body already narrows to the committed query (the server
|
|
1071
|
-
// `query` on every section request, plus `matchesSearchTokens` for
|
|
1072
|
-
// the residue), so a committed search is a selectable list here
|
|
1073
|
-
// exactly as it is on the mailbox route (#212) — the results
|
|
1074
|
-
// panel stays for the typing/uncommitted state only.
|
|
1075
|
-
searchResultsInBody: true,
|
|
1076
|
-
refreshControl,
|
|
1077
|
-
}}
|
|
1078
|
-
rows={filteredRows}
|
|
1079
|
-
>
|
|
1080
|
-
<div className="flex h-full flex-col">
|
|
1081
|
-
{failedAccounts.map((account) => (
|
|
1082
|
-
<ErrorBanner
|
|
1083
|
-
key={account.accountId}
|
|
1084
|
-
accountEmail={account.email}
|
|
1085
|
-
accountId={account.accountId}
|
|
1086
|
-
/>
|
|
1087
|
-
))}
|
|
1088
|
-
<div className="min-h-0 flex-1">{stateBody}</div>
|
|
1089
|
-
</div>
|
|
1090
|
-
</BriefSelectionChrome>
|
|
1091
|
-
</ThreadListInteraction>
|
|
1092
|
-
</FilterPanelProvider>
|
|
1093
|
-
);
|
|
1094
|
-
}
|