From e67b893ae48bd08db39eca7cf9943f79fdefe739 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Burak=20Kaan=20K=C3=B6se?= Date: Mon, 29 Sep 2025 11:16:14 +0200 Subject: [PATCH 001/312] Initial WinUI switch. --- Directory.Packages.props | 37 +- .../Wino.Authentication.csproj | 2 +- ...ckgroundTaskRegistrationFailedException.cs | 8 - .../Interfaces/IBackgroundTaskService.cs | 17 - Wino.Core.UWP/Dispatcher.cs | 19 - .../Extensions/CompositionExtensions.Size.cs | 126 - .../Services/BackgroundTaskService.cs | 62 - Wino.Core.UWP/Wino.Core.UWP.csproj | 72 - Wino.Core.UWP/WinoApplication.cs | 267 - .../Wino.Core.ViewModels.csproj | 2 +- .../Activation/ActivationHandler.cs | 0 .../AppThemes/Acrylic.xaml | 4 +- .../AppThemes/Clouds.xaml | 2 +- .../AppThemes/Custom.xaml | 2 +- .../AppThemes/Forest.xaml | 2 +- .../AppThemes/Garden.xaml | 2 +- .../AppThemes/Mica.xaml | 2 +- .../AppThemes/Nighty.xaml | 2 +- .../AppThemes/Snowflake.xaml | 2 +- .../AppThemes/TestTheme.xaml | 0 .../Assets/FileTypes/type_archive.png | Bin .../Assets/FileTypes/type_audio.png | Bin .../Assets/FileTypes/type_executable.png | Bin .../Assets/FileTypes/type_html.png | Bin .../Assets/FileTypes/type_image.png | Bin .../Assets/FileTypes/type_none.png | Bin .../Assets/FileTypes/type_other.png | Bin .../Assets/FileTypes/type_pdf.png | Bin .../Assets/FileTypes/type_rar.png | Bin .../Assets/FileTypes/type_video.png | Bin .../Assets/Providers/Gmail.png | Bin .../Assets/Providers/IMAP4.png | Bin .../Assets/Providers/Office 365.png | Bin .../Assets/Providers/Outlook.png | Bin .../Assets/Providers/Yahoo.png | Bin .../Assets/Providers/iCloud.png | Bin .../Assets/WinoIcons.ttf | Bin .../BackgroundImages/Acrylic.jpg | Bin .../BackgroundImages/Clouds.jpg | Bin .../BackgroundImages/Forest.jpg | Bin .../BackgroundImages/Garden.jpg | Bin .../BackgroundImages/Mica.jpg | Bin .../BackgroundImages/Nighty.jpg | Bin .../BackgroundImages/Snowflake.jpg | Bin .../BasePage.cs | 8 +- .../AccountCreationDialogControl.xaml | 0 .../AccountCreationDialogControl.xaml.cs | 14 +- .../Controls/ControlConstants.cs | 0 .../Controls/CustomWrapPanel.cs | 4 +- .../Controls/EqualGridPanel.cs | 4 +- .../Controls/WinoAppTitleBar.xaml | 0 .../Controls/WinoAppTitleBar.xaml.cs | 4 +- .../Controls/WinoFontIcon.cs | 6 +- .../Controls/WinoFontIconSource.cs | 4 +- .../Controls/WinoInfoBar.cs | 2 +- .../Controls/WinoNavigationViewItem.cs | 4 +- .../Converters/GridLengthConverter.cs | 4 +- .../Converters/HexToColorBrushConverter.cs | 7 +- .../Converters/ReverseBooleanConverter.cs | 2 +- .../ReverseBooleanToVisibilityConverter.cs | 4 +- .../CoreGeneric.xaml | 0 .../CoreGeneric.xaml.cs | 2 +- .../CoreUWPContainerSetup.cs | 3 +- .../Dialogs/AccountCreationDialog.xaml | 0 .../Dialogs/AccountCreationDialog.xaml.cs | 4 +- .../Dialogs/AccountPickerDialog.xaml | 0 .../Dialogs/AccountPickerDialog.xaml.cs | 2 +- ...CustomMessageDialogInformationContainer.cs | 0 .../Dialogs/CustomThemeBuilderDialog.xaml | 0 .../Dialogs/CustomThemeBuilderDialog.xaml.cs | 6 +- .../Dialogs/NewAccountDialog.xaml | 0 .../Dialogs/NewAccountDialog.xaml.cs | 4 +- .../Dialogs/TextInputDialog.xaml | 0 .../Dialogs/TextInputDialog.xaml.cs | 4 +- Wino.Core.WinUI/Dispatcher.cs | 19 + .../Extensions/AnimationExtensions.cs | 4 +- .../Extensions/CompositionEnums.cs | 0 .../CompositionExtensions.Implicit.cs | 10 +- .../Extensions/ElementThemeExtensions.cs | 2 +- .../Extensions/StartupTaskStateExtensions.cs | 0 .../Extensions/StorageFileExtensions.cs | 0 .../Extensions/UIExtensions.cs | 0 .../Extensions/UtilExtensions.cs | 10 +- .../Extensions/WebViewExtensions.cs | 0 .../Helpers/WinoVisualTreeHelper.cs | 4 +- .../Helpers/XamlHelpers.cs | 13 +- .../Interfaces/IWinoShellWindow.cs | 11 + .../Models/Personalization/CustomAppTheme.cs | 0 .../Personalization/PreDefinedAppTheme.cs | 0 .../Models/Personalization/SystemAppTheme.cs | 0 .../AppThemePreviewTemplateSelector.cs | 4 +- .../CustomWinoMessageDialogIconSelector.cs | 4 +- .../Selectors/FileAttachmentTypeSelector.cs | 4 +- .../NavigationMenuTemplateSelector.cs | 4 +- .../Services/ApplicationResourceManager.cs | 2 +- .../Services/ClipboardService.cs | 0 .../Services/ConfigurationService.cs | 0 .../Services/DialogServiceBase.cs | 4 +- .../Services/FileService.cs | 0 .../Services/KeyPressService.cs | 2 +- .../Services/NativeAppService.cs | 4 +- .../Services/NavigationServiceBase.cs | 4 +- .../Services/NotificationBuilder.cs | 2 +- .../Services/PreferencesService.cs | 0 .../Services/PrintService.cs | 0 .../Services/StartupBehaviorService.cs | 0 .../Services/StatePersistenceService.cs | 9 +- .../Services/StoreManagementService.cs | 0 .../Services/StoreRatingService.cs | 0 .../Services/ThemeService.cs | 13 +- .../Services/ThumbnailService.cs | 0 .../Services/UnderlyingThemeService.cs | 0 .../Services/WinoServerConnectionManager.cs | 0 .../Styles/Colors.xaml | 0 .../Styles/ContentPresenters.xaml | 0 .../Styles/Converters.xaml | 0 .../Styles/CustomMessageDialogStyles.xaml | 0 .../Styles/CustomMessageDialogStyles.xaml.cs | 2 +- .../Styles/DataTemplates.xaml | 0 .../Styles/DataTemplates.xaml.cs | 2 +- .../Styles/FontIcons.xaml | 0 .../Styles/IconTemplates.xaml | 0 .../Styles/SharedStyles.xaml | 0 .../Styles/WinoInfoBar.xaml | 0 .../Abstract/ManageAccountsPageAbstract.cs | 0 .../Abstract/SettingOptionsPageAbstract.cs | 0 .../Views/Abstract/SettingsPageAbstract.cs | 0 .../Views/Abstract/SettingsPageBase.cs | 2 +- .../Views/ManageAccountsPage.xaml | 0 .../Views/ManageAccountsPage.xaml.cs | 4 +- .../Views/SettingOptionsPage.xaml | 0 .../Views/SettingOptionsPage.xaml.cs | 0 .../Views/SettingsPage.xaml | 0 .../Views/SettingsPage.xaml.cs | 4 +- Wino.Core.WinUI/Wino.Core.WinUI.csproj | 89 + Wino.Core.WinUI/WinoApplication.cs | 129 + Wino.Core/Wino.Core.csproj | 2 +- Wino.Mail.ViewModels/AppShellViewModel.cs | 20 - .../Wino.Mail.ViewModels.csproj | 2 +- .../Activation/DefaultActivationHandler.cs | 22 + .../Activation/FileActivationHandler.cs | 67 + .../Activation/ProtocolActivationHandler.cs | 59 + .../ToastNotificationActivationHandler.cs | 76 + Wino.Mail.WinUI/App.xaml | 26 + Wino.Mail.WinUI/App.xaml.cs | 97 + Wino.Mail.WinUI/AppShell.xaml | 472 ++ Wino.Mail.WinUI/AppShell.xaml.cs | 327 + .../Assets/BadgeLogo.scale-100.png | Bin 0 -> 209 bytes .../Assets/BadgeLogo.scale-125.png | Bin 0 -> 238 bytes .../Assets/BadgeLogo.scale-150.png | Bin 0 -> 286 bytes .../Assets/BadgeLogo.scale-200.png | Bin 0 -> 360 bytes .../Assets/BadgeLogo.scale-400.png | Bin 0 -> 673 bytes Wino.Mail.WinUI/Assets/EML/eml.png | Bin 0 -> 8387 bytes .../Assets/LargeTile.scale-100.png | Bin 0 -> 9108 bytes .../Assets/LargeTile.scale-125.png | Bin 0 -> 12474 bytes .../Assets/LargeTile.scale-150.png | Bin 0 -> 17147 bytes .../Assets/LargeTile.scale-200.png | Bin 0 -> 27045 bytes .../Assets/LargeTile.scale-400.png | Bin 0 -> 101868 bytes .../Assets/LockScreenLogo.scale-200.png | Bin 0 -> 432 bytes .../Assets/NotificationIcons/archive.png | Bin 0 -> 12379 bytes .../Assets/NotificationIcons/delete.png | Bin 0 -> 26317 bytes .../Assets/NotificationIcons/dismiss.png | Bin 0 -> 16527 bytes .../Assets/NotificationIcons/markread.png | Bin 0 -> 31920 bytes .../Assets/NotificationIcons/profile-dark.png | Bin 0 -> 2445 bytes .../NotificationIcons/profile-light.png | Bin 0 -> 2728 bytes Wino.Mail.WinUI/Assets/ReleaseNotes/1102.md | 71 + .../Assets/SmallTile.scale-100.png | Bin 0 -> 2216 bytes .../Assets/SmallTile.scale-125.png | Bin 0 -> 2887 bytes .../Assets/SmallTile.scale-150.png | Bin 0 -> 3461 bytes .../Assets/SmallTile.scale-200.png | Bin 0 -> 5062 bytes .../Assets/SmallTile.scale-400.png | Bin 0 -> 13773 bytes .../Assets/SplashScreen.scale-100.png | Bin 0 -> 9431 bytes .../Assets/SplashScreen.scale-125.png | Bin 0 -> 12977 bytes .../Assets/SplashScreen.scale-150.png | Bin 0 -> 17766 bytes .../Assets/SplashScreen.scale-200.png | Bin 0 -> 28344 bytes .../Assets/SplashScreen.scale-400.png | Bin 0 -> 104608 bytes .../Assets/Square150x150Logo.scale-100.png | Bin 0 -> 3579 bytes .../Assets/Square150x150Logo.scale-125.png | Bin 0 -> 4695 bytes .../Assets/Square150x150Logo.scale-150.png | Bin 0 -> 5964 bytes .../Assets/Square150x150Logo.scale-200.png | Bin 0 -> 8744 bytes .../Assets/Square150x150Logo.scale-400.png | Bin 0 -> 25845 bytes ...go.altform-lightunplated_targetsize-16.png | Bin 0 -> 755 bytes ...go.altform-lightunplated_targetsize-24.png | Bin 0 -> 1240 bytes ...o.altform-lightunplated_targetsize-256.png | Bin 0 -> 34154 bytes ...go.altform-lightunplated_targetsize-32.png | Bin 0 -> 1717 bytes ...go.altform-lightunplated_targetsize-48.png | Bin 0 -> 2735 bytes ...x44Logo.altform-unplated_targetsize-16.png | Bin 0 -> 755 bytes ...44Logo.altform-unplated_targetsize-256.png | Bin 0 -> 34154 bytes ...x44Logo.altform-unplated_targetsize-32.png | Bin 0 -> 1717 bytes ...x44Logo.altform-unplated_targetsize-48.png | Bin 0 -> 2735 bytes .../Assets/Square44x44Logo.scale-100.png | Bin 0 -> 1824 bytes .../Assets/Square44x44Logo.scale-125.png | Bin 0 -> 2471 bytes .../Assets/Square44x44Logo.scale-150.png | Bin 0 -> 3060 bytes .../Assets/Square44x44Logo.scale-200.png | Bin 0 -> 4304 bytes .../Assets/Square44x44Logo.scale-400.png | Bin 0 -> 11277 bytes .../Assets/Square44x44Logo.targetsize-16.png | Bin 0 -> 592 bytes .../Assets/Square44x44Logo.targetsize-24.png | Bin 0 -> 962 bytes ...x44Logo.targetsize-24_altform-unplated.png | Bin 0 -> 1240 bytes .../Assets/Square44x44Logo.targetsize-256.png | Bin 0 -> 20850 bytes .../Assets/Square44x44Logo.targetsize-32.png | Bin 0 -> 1321 bytes .../Assets/Square44x44Logo.targetsize-48.png | Bin 0 -> 2125 bytes Wino.Mail.WinUI/Assets/StoreLogo.backup.png | Bin 0 -> 1451 bytes Wino.Mail.WinUI/Assets/StoreLogo.png | Bin 0 -> 456 bytes .../Assets/StoreLogo.scale-100.png | Bin 0 -> 2870 bytes .../Assets/StoreLogo.scale-125.png | Bin 0 -> 3845 bytes .../Assets/StoreLogo.scale-150.png | Bin 0 -> 4755 bytes .../Assets/StoreLogo.scale-200.png | Bin 0 -> 6980 bytes .../Assets/StoreLogo.scale-400.png | Bin 0 -> 21123 bytes .../Assets/Wide310x150Logo.scale-100.png | Bin 0 -> 3817 bytes .../Assets/Wide310x150Logo.scale-125.png | Bin 0 -> 5042 bytes .../Assets/Wide310x150Logo.scale-150.png | Bin 0 -> 6364 bytes .../Assets/Wide310x150Logo.scale-200.png | Bin 0 -> 9431 bytes .../Assets/Wide310x150Logo.scale-400.png | Bin 0 -> 28344 bytes .../Behaviors/BindableCommandBarBehavior.cs | 199 + .../CreateMailNavigationItemBehavior.cs | 85 + .../Controls/AccountNavigationItem.cs | 62 + .../Controls/Advanced/WinoListView.cs | 418 ++ .../Controls/ImagePreviewControl.cs | 229 + .../MailItemDisplayInformationControl.xaml | 336 + .../MailItemDisplayInformationControl.xaml.cs | 218 + .../Controls/SettingsMenuItemControl.cs | 72 + .../Controls/WebViewEditorControl.cs | 358 ++ Wino.Mail.WinUI/Controls/WinoExpander.cs | 128 + .../Controls/WinoSwipeControlItems.cs | 81 + .../Dialogs/AccountReorderDialog.xaml | 85 + .../Dialogs/AccountReorderDialog.xaml.cs | 52 + .../Dialogs/CreateAccountAliasDialog.xaml | 40 + .../Dialogs/CreateAccountAliasDialog.xaml.cs | 29 + .../Dialogs/MessageSourceDialog.xaml | 28 + .../Dialogs/MessageSourceDialog.xaml.cs | 24 + Wino.Mail.WinUI/Dialogs/MoveMailDialog.xaml | 61 + .../Dialogs/MoveMailDialog.xaml.cs | 74 + .../Dialogs/NewImapSetupDialog.xaml | 25 + .../Dialogs/NewImapSetupDialog.xaml.cs | 111 + .../Dialogs/SignatureEditorDialog.xaml | 266 + .../Dialogs/SignatureEditorDialog.xaml.cs | 80 + .../SystemFolderConfigurationDialog.xaml | 100 + .../SystemFolderConfigurationDialog.xaml.cs | 71 + Wino.Mail.WinUI/JS/editor.html | 43 + Wino.Mail.WinUI/JS/editor.js | 130 + Wino.Mail.WinUI/JS/global.css | 4 + Wino.Mail.WinUI/JS/libs/darkreader.js | 3187 ++++++++++ Wino.Mail.WinUI/JS/libs/jodit.min.css | 5664 +++++++++++++++++ Wino.Mail.WinUI/JS/libs/jodit.min.js | 10 + .../JS/libs/linkify-element.min.js | 1 + Wino.Mail.WinUI/JS/libs/linkify.min.js | 1 + Wino.Mail.WinUI/JS/reader.html | 116 + Wino.Mail.WinUI/MainWindow.xaml | 17 + Wino.Mail.WinUI/MainWindow.xaml.cs | 29 + .../MenuFlyouts/AccountSelectorFlyout.cs | 58 + .../MenuFlyouts/FilterMenuFlyout.cs | 220 + .../MenuFlyouts/FolderOperationFlyout.cs | 27 + .../FolderOperationMenuFlyoutItem.cs | 11 + .../MenuFlyouts/MailOperationFlyout.cs | 27 + .../MailOperationMenuFlyoutItem.cs | 11 + .../MenuFlyouts/MoveButtonFlyout.cs | 87 + .../MenuFlyouts/WinoOperationFlyout.cs | 49 + .../MenuFlyouts/WinoOperationFlyoutItem.cs | 49 + Wino.Mail.WinUI/Package.appxmanifest | 84 + .../Properties/launchSettings.json | 10 + ...ccountProviderViewModelTemplateSelector.cs | 19 + .../AccountReorderTemplateSelector.cs | 21 + .../MailItemContainerStyleSelector.cs | 18 + ...lItemDisplayModePreviewTemplateSelector.cs | 33 + .../Selectors/MailItemDisplaySelector.cs | 21 + Wino.Mail.WinUI/Services/DialogService.cs | 195 + .../MailAuthenticatorConfiguration.cs | 31 + Wino.Mail.WinUI/Services/NavigationService.cs | 164 + Wino.Mail.WinUI/Services/ProviderService.cs | 34 + .../Services/SettingsBuilderService.cs | 22 + Wino.Mail.WinUI/ShellWindow.xaml | 27 + Wino.Mail.WinUI/ShellWindow.xaml.cs | 33 + .../Styles/ImagePreviewControl.xaml | 58 + .../Styles/ItemContainerStyles.xaml | 197 + .../Styles/WebViewEditorControl.xaml | 21 + Wino.Mail.WinUI/Styles/WinoExpanderStyle.xaml | 89 + .../Styles/WinoExpanderStyle.xaml.cs | 11 + .../Views/Abstract/AboutPageAbstract.cs | 8 + .../Abstract/AccountDetailsPageAbstract.cs | 8 + .../Abstract/AccountManagementPageAbstract.cs | 9 + .../Abstract/AliasManagementPageAbstract.cs | 6 + .../Abstract/AppPreferencesPageAbstract.cs | 6 + .../Views/Abstract/AppShellAbstract.cs | 8 + .../Views/Abstract/ComposePageAbstract.cs | 8 + .../EditAccountDetailsPageAbstract.cs | 5 + .../Views/Abstract/IdlePageAbstract.cs | 8 + .../Abstract/LanguageTimePageAbstract.cs | 6 + .../Views/Abstract/MailListPageAbstract.cs | 6 + .../Abstract/MailRenderingPageAbstract.cs | 26 + .../MergedAccountDetailsPageAbstract.cs | 8 + .../Views/Abstract/MessageListPageAbstract.cs | 6 + .../Abstract/PersonalizationPageAbstract.cs | 8 + .../Abstract/ReadComposePanePageAbstract.cs | 6 + .../SignatureManagementPageAbstract.cs | 6 + .../Views/Abstract/WelcomePageAbstract.cs | 9 + .../Views/Account/AccountDetailsPage.xaml | 254 + .../Views/Account/AccountDetailsPage.xaml.cs | 29 + .../Views/Account/AccountManagementPage.xaml | 262 + .../Account/AccountManagementPage.xaml.cs | 15 + .../Account/MergedAccountDetailsPage.xaml | 170 + .../Account/MergedAccountDetailsPage.xaml.cs | 12 + Wino.Mail.WinUI/Views/ComposePage.xaml | 707 ++ Wino.Mail.WinUI/Views/ComposePage.xaml.cs | 389 ++ Wino.Mail.WinUI/Views/IdlePage.xaml | 15 + Wino.Mail.WinUI/Views/IdlePage.xaml.cs | 11 + .../ImapSetup/AdvancedImapSetupPage.xaml | 278 + .../ImapSetup/AdvancedImapSetupPage.xaml.cs | 282 + .../ImapSetup/ImapConnectionFailedPage.xaml | 72 + .../ImapConnectionFailedPage.xaml.cs | 49 + .../ImapSetup/PreparingImapFoldersPage.xaml | 31 + .../PreparingImapFoldersPage.xaml.cs | 29 + .../ImapSetup/TestingImapConnectionPage.xaml | 104 + .../TestingImapConnectionPage.xaml.cs | 133 + .../Views/ImapSetup/WelcomeImapSetupPage.xaml | 118 + .../ImapSetup/WelcomeImapSetupPage.xaml.cs | 96 + Wino.Mail.WinUI/Views/MailListPage.xaml | 652 ++ Wino.Mail.WinUI/Views/MailListPage.xaml.cs | 501 ++ Wino.Mail.WinUI/Views/MailRenderingPage.xaml | 436 ++ .../Views/MailRenderingPage.xaml.cs | 275 + Wino.Mail.WinUI/Views/Settings/AboutPage.xaml | 186 + .../Views/Settings/AboutPage.xaml.cs | 11 + .../Views/Settings/AliasManagementPage.xaml | 180 + .../Settings/AliasManagementPage.xaml.cs | 11 + .../Views/Settings/AppPreferencesPage.xaml | 66 + .../Views/Settings/AppPreferencesPage.xaml.cs | 11 + .../Settings/EditAccountDetailsPage.xaml | 238 + .../Settings/EditAccountDetailsPage.xaml.cs | 11 + .../Views/Settings/LanguageTimePage.xaml | 36 + .../Views/Settings/LanguageTimePage.xaml.cs | 18 + .../Views/Settings/MessageListPage.xaml | 164 + .../Views/Settings/MessageListPage.xaml.cs | 11 + .../Views/Settings/PersonalizationPage.xaml | 183 + .../Settings/PersonalizationPage.xaml.cs | 11 + .../Views/Settings/ReadComposePanePage.xaml | 135 + .../Settings/ReadComposePanePage.xaml.cs | 11 + .../Settings/SignatureManagementPage.xaml | 118 + .../Settings/SignatureManagementPage.xaml.cs | 11 + Wino.Mail.WinUI/Views/WelcomePage.xaml | 24 + Wino.Mail.WinUI/Views/WelcomePage.xaml.cs | 16 + Wino.Mail.WinUI/Wino.Mail.WinUI.csproj | 253 + Wino.Mail.WinUI/app.manifest | 19 + Wino.Mail/Wino.Mail.csproj | 3 - Wino.Messages/Wino.Messaging.csproj | 2 +- Wino.Services/Wino.Services.csproj | 2 +- WinoMail.slnx | 21 +- 345 files changed, 22458 insertions(+), 746 deletions(-) delete mode 100644 Wino.Core.Domain/Exceptions/BackgroundTaskRegistrationFailedException.cs delete mode 100644 Wino.Core.Domain/Interfaces/IBackgroundTaskService.cs delete mode 100644 Wino.Core.UWP/Dispatcher.cs delete mode 100644 Wino.Core.UWP/Extensions/CompositionExtensions.Size.cs delete mode 100644 Wino.Core.UWP/Services/BackgroundTaskService.cs delete mode 100644 Wino.Core.UWP/WinoApplication.cs rename {Wino.Core.UWP => Wino.Core.WinUI}/Activation/ActivationHandler.cs (100%) rename {Wino.Core.UWP => Wino.Core.WinUI}/AppThemes/Acrylic.xaml (90%) rename {Wino.Core.UWP => Wino.Core.WinUI}/AppThemes/Clouds.xaml (96%) rename {Wino.Core.UWP => Wino.Core.WinUI}/AppThemes/Custom.xaml (98%) rename {Wino.Core.UWP => Wino.Core.WinUI}/AppThemes/Forest.xaml (95%) rename {Wino.Core.UWP => Wino.Core.WinUI}/AppThemes/Garden.xaml (96%) rename {Wino.Core.UWP => Wino.Core.WinUI}/AppThemes/Mica.xaml (95%) rename {Wino.Core.UWP => Wino.Core.WinUI}/AppThemes/Nighty.xaml (96%) rename {Wino.Core.UWP => Wino.Core.WinUI}/AppThemes/Snowflake.xaml (96%) rename {Wino.Core.UWP => Wino.Core.WinUI}/AppThemes/TestTheme.xaml (100%) rename {Wino.Core.UWP => Wino.Core.WinUI}/Assets/FileTypes/type_archive.png (100%) rename {Wino.Core.UWP => Wino.Core.WinUI}/Assets/FileTypes/type_audio.png (100%) rename {Wino.Core.UWP => Wino.Core.WinUI}/Assets/FileTypes/type_executable.png (100%) rename {Wino.Core.UWP => Wino.Core.WinUI}/Assets/FileTypes/type_html.png (100%) rename {Wino.Core.UWP => Wino.Core.WinUI}/Assets/FileTypes/type_image.png (100%) rename {Wino.Core.UWP => Wino.Core.WinUI}/Assets/FileTypes/type_none.png (100%) rename {Wino.Core.UWP => Wino.Core.WinUI}/Assets/FileTypes/type_other.png (100%) rename {Wino.Core.UWP => Wino.Core.WinUI}/Assets/FileTypes/type_pdf.png (100%) rename {Wino.Core.UWP => Wino.Core.WinUI}/Assets/FileTypes/type_rar.png (100%) rename {Wino.Core.UWP => Wino.Core.WinUI}/Assets/FileTypes/type_video.png (100%) rename {Wino.Core.UWP => Wino.Core.WinUI}/Assets/Providers/Gmail.png (100%) rename {Wino.Core.UWP => Wino.Core.WinUI}/Assets/Providers/IMAP4.png (100%) rename {Wino.Core.UWP => Wino.Core.WinUI}/Assets/Providers/Office 365.png (100%) rename {Wino.Core.UWP => Wino.Core.WinUI}/Assets/Providers/Outlook.png (100%) rename {Wino.Core.UWP => Wino.Core.WinUI}/Assets/Providers/Yahoo.png (100%) rename {Wino.Core.UWP => Wino.Core.WinUI}/Assets/Providers/iCloud.png (100%) rename {Wino.Core.UWP => Wino.Core.WinUI}/Assets/WinoIcons.ttf (100%) rename {Wino.Core.UWP => Wino.Core.WinUI}/BackgroundImages/Acrylic.jpg (100%) rename {Wino.Core.UWP => Wino.Core.WinUI}/BackgroundImages/Clouds.jpg (100%) rename {Wino.Core.UWP => Wino.Core.WinUI}/BackgroundImages/Forest.jpg (100%) rename {Wino.Core.UWP => Wino.Core.WinUI}/BackgroundImages/Garden.jpg (100%) rename {Wino.Core.UWP => Wino.Core.WinUI}/BackgroundImages/Mica.jpg (100%) rename {Wino.Core.UWP => Wino.Core.WinUI}/BackgroundImages/Nighty.jpg (100%) rename {Wino.Core.UWP => Wino.Core.WinUI}/BackgroundImages/Snowflake.jpg (100%) rename {Wino.Core.UWP => Wino.Core.WinUI}/BasePage.cs (93%) rename {Wino.Core.UWP => Wino.Core.WinUI}/Controls/AccountCreationDialogControl.xaml (100%) rename {Wino.Core.UWP => Wino.Core.WinUI}/Controls/AccountCreationDialogControl.xaml.cs (80%) rename {Wino.Core.UWP => Wino.Core.WinUI}/Controls/ControlConstants.cs (100%) rename {Wino.Core.UWP => Wino.Core.WinUI}/Controls/CustomWrapPanel.cs (97%) rename {Wino.Core.UWP => Wino.Core.WinUI}/Controls/EqualGridPanel.cs (97%) rename {Wino.Core.UWP => Wino.Core.WinUI}/Controls/WinoAppTitleBar.xaml (100%) rename {Wino.Core.UWP => Wino.Core.WinUI}/Controls/WinoAppTitleBar.xaml.cs (99%) rename {Wino.Core.UWP => Wino.Core.WinUI}/Controls/WinoFontIcon.cs (93%) rename {Wino.Core.UWP => Wino.Core.WinUI}/Controls/WinoFontIconSource.cs (87%) rename {Wino.Core.UWP => Wino.Core.WinUI}/Controls/WinoInfoBar.cs (99%) rename {Wino.Core.UWP => Wino.Core.WinUI}/Controls/WinoNavigationViewItem.cs (96%) rename {Wino.Core.UWP => Wino.Core.WinUI}/Converters/GridLengthConverter.cs (91%) rename {Wino.Core.UWP => Wino.Core.WinUI}/Converters/HexToColorBrushConverter.cs (96%) rename {Wino.Core.UWP => Wino.Core.WinUI}/Converters/ReverseBooleanConverter.cs (93%) rename {Wino.Core.UWP => Wino.Core.WinUI}/Converters/ReverseBooleanToVisibilityConverter.cs (89%) rename {Wino.Core.UWP => Wino.Core.WinUI}/CoreGeneric.xaml (100%) rename {Wino.Core.UWP => Wino.Core.WinUI}/CoreGeneric.xaml.cs (82%) rename {Wino.Core.UWP => Wino.Core.WinUI}/CoreUWPContainerSetup.cs (95%) rename {Wino.Core.UWP => Wino.Core.WinUI}/Dialogs/AccountCreationDialog.xaml (100%) rename {Wino.Core.UWP => Wino.Core.WinUI}/Dialogs/AccountCreationDialog.xaml.cs (97%) rename {Wino.Core.UWP => Wino.Core.WinUI}/Dialogs/AccountPickerDialog.xaml (100%) rename {Wino.Core.UWP => Wino.Core.WinUI}/Dialogs/AccountPickerDialog.xaml.cs (94%) rename {Wino.Core.UWP => Wino.Core.WinUI}/Dialogs/CustomMessageDialogInformationContainer.cs (100%) rename {Wino.Core.UWP => Wino.Core.WinUI}/Dialogs/CustomThemeBuilderDialog.xaml (100%) rename {Wino.Core.UWP => Wino.Core.WinUI}/Dialogs/CustomThemeBuilderDialog.xaml.cs (91%) rename {Wino.Core.UWP => Wino.Core.WinUI}/Dialogs/NewAccountDialog.xaml (100%) rename {Wino.Core.UWP => Wino.Core.WinUI}/Dialogs/NewAccountDialog.xaml.cs (99%) rename {Wino.Core.UWP => Wino.Core.WinUI}/Dialogs/TextInputDialog.xaml (100%) rename {Wino.Core.UWP => Wino.Core.WinUI}/Dialogs/TextInputDialog.xaml.cs (94%) create mode 100644 Wino.Core.WinUI/Dispatcher.cs rename {Wino.Core.UWP => Wino.Core.WinUI}/Extensions/AnimationExtensions.cs (98%) rename {Wino.Core.UWP => Wino.Core.WinUI}/Extensions/CompositionEnums.cs (100%) rename {Wino.Core.UWP => Wino.Core.WinUI}/Extensions/CompositionExtensions.Implicit.cs (97%) rename {Wino.Core.UWP => Wino.Core.WinUI}/Extensions/ElementThemeExtensions.cs (96%) rename {Wino.Core.UWP => Wino.Core.WinUI}/Extensions/StartupTaskStateExtensions.cs (100%) rename {Wino.Core.UWP => Wino.Core.WinUI}/Extensions/StorageFileExtensions.cs (100%) rename {Wino.Core.UWP => Wino.Core.WinUI}/Extensions/UIExtensions.cs (100%) rename {Wino.Core.UWP => Wino.Core.WinUI}/Extensions/UtilExtensions.cs (95%) rename {Wino.Core.UWP => Wino.Core.WinUI}/Extensions/WebViewExtensions.cs (100%) rename {Wino.Core.UWP => Wino.Core.WinUI}/Helpers/WinoVisualTreeHelper.cs (96%) rename {Wino.Core.UWP => Wino.Core.WinUI}/Helpers/XamlHelpers.cs (98%) create mode 100644 Wino.Core.WinUI/Interfaces/IWinoShellWindow.cs rename {Wino.Core.UWP => Wino.Core.WinUI}/Models/Personalization/CustomAppTheme.cs (100%) rename {Wino.Core.UWP => Wino.Core.WinUI}/Models/Personalization/PreDefinedAppTheme.cs (100%) rename {Wino.Core.UWP => Wino.Core.WinUI}/Models/Personalization/SystemAppTheme.cs (100%) rename {Wino.Core.UWP => Wino.Core.WinUI}/Selectors/AppThemePreviewTemplateSelector.cs (91%) rename {Wino.Core.UWP => Wino.Core.WinUI}/Selectors/CustomWinoMessageDialogIconSelector.cs (95%) rename {Wino.Core.UWP => Wino.Core.WinUI}/Selectors/FileAttachmentTypeSelector.cs (96%) rename {Wino.Core.UWP => Wino.Core.WinUI}/Selectors/NavigationMenuTemplateSelector.cs (97%) rename {Wino.Core.UWP => Wino.Core.WinUI}/Services/ApplicationResourceManager.cs (97%) rename {Wino.Core.UWP => Wino.Core.WinUI}/Services/ClipboardService.cs (100%) rename {Wino.Core.UWP => Wino.Core.WinUI}/Services/ConfigurationService.cs (100%) rename {Wino.Core.UWP => Wino.Core.WinUI}/Services/DialogServiceBase.cs (99%) rename {Wino.Core.UWP => Wino.Core.WinUI}/Services/FileService.cs (100%) rename {Wino.Core.UWP => Wino.Core.WinUI}/Services/KeyPressService.cs (94%) rename {Wino.Core.UWP => Wino.Core.WinUI}/Services/NativeAppService.cs (98%) rename {Wino.Core.UWP => Wino.Core.WinUI}/Services/NavigationServiceBase.cs (90%) rename {Wino.Core.UWP => Wino.Core.WinUI}/Services/NotificationBuilder.cs (99%) rename {Wino.Core.UWP => Wino.Core.WinUI}/Services/PreferencesService.cs (100%) rename {Wino.Core.UWP => Wino.Core.WinUI}/Services/PrintService.cs (100%) rename {Wino.Core.UWP => Wino.Core.WinUI}/Services/StartupBehaviorService.cs (100%) rename {Wino.Core.UWP => Wino.Core.WinUI}/Services/StatePersistenceService.cs (94%) rename {Wino.Core.UWP => Wino.Core.WinUI}/Services/StoreManagementService.cs (100%) rename {Wino.Core.UWP => Wino.Core.WinUI}/Services/StoreRatingService.cs (100%) rename {Wino.Core.UWP => Wino.Core.WinUI}/Services/ThemeService.cs (98%) rename {Wino.Core.UWP => Wino.Core.WinUI}/Services/ThumbnailService.cs (100%) rename {Wino.Core.UWP => Wino.Core.WinUI}/Services/UnderlyingThemeService.cs (100%) rename {Wino.Core.UWP => Wino.Core.WinUI}/Services/WinoServerConnectionManager.cs (100%) rename {Wino.Core.UWP => Wino.Core.WinUI}/Styles/Colors.xaml (100%) rename {Wino.Core.UWP => Wino.Core.WinUI}/Styles/ContentPresenters.xaml (100%) rename {Wino.Core.UWP => Wino.Core.WinUI}/Styles/Converters.xaml (100%) rename {Wino.Core.UWP => Wino.Core.WinUI}/Styles/CustomMessageDialogStyles.xaml (100%) rename {Wino.Core.UWP => Wino.Core.WinUI}/Styles/CustomMessageDialogStyles.xaml.cs (86%) rename {Wino.Core.UWP => Wino.Core.WinUI}/Styles/DataTemplates.xaml (100%) rename {Wino.Core.UWP => Wino.Core.WinUI}/Styles/DataTemplates.xaml.cs (85%) rename {Wino.Core.UWP => Wino.Core.WinUI}/Styles/FontIcons.xaml (100%) rename {Wino.Core.UWP => Wino.Core.WinUI}/Styles/IconTemplates.xaml (100%) rename {Wino.Core.UWP => Wino.Core.WinUI}/Styles/SharedStyles.xaml (100%) rename {Wino.Core.UWP => Wino.Core.WinUI}/Styles/WinoInfoBar.xaml (100%) rename {Wino.Core.UWP => Wino.Core.WinUI}/Views/Abstract/ManageAccountsPageAbstract.cs (100%) rename {Wino.Core.UWP => Wino.Core.WinUI}/Views/Abstract/SettingOptionsPageAbstract.cs (100%) rename {Wino.Core.UWP => Wino.Core.WinUI}/Views/Abstract/SettingsPageAbstract.cs (100%) rename {Wino.Core.UWP => Wino.Core.WinUI}/Views/Abstract/SettingsPageBase.cs (94%) rename {Wino.Core.UWP => Wino.Core.WinUI}/Views/ManageAccountsPage.xaml (100%) rename {Wino.Core.UWP => Wino.Core.WinUI}/Views/ManageAccountsPage.xaml.cs (97%) rename {Wino.Core.UWP => Wino.Core.WinUI}/Views/SettingOptionsPage.xaml (100%) rename {Wino.Core.UWP => Wino.Core.WinUI}/Views/SettingOptionsPage.xaml.cs (100%) rename {Wino.Core.UWP => Wino.Core.WinUI}/Views/SettingsPage.xaml (100%) rename {Wino.Core.UWP => Wino.Core.WinUI}/Views/SettingsPage.xaml.cs (97%) create mode 100644 Wino.Core.WinUI/Wino.Core.WinUI.csproj create mode 100644 Wino.Core.WinUI/WinoApplication.cs create mode 100644 Wino.Mail.WinUI/Activation/DefaultActivationHandler.cs create mode 100644 Wino.Mail.WinUI/Activation/FileActivationHandler.cs create mode 100644 Wino.Mail.WinUI/Activation/ProtocolActivationHandler.cs create mode 100644 Wino.Mail.WinUI/Activation/ToastNotificationActivationHandler.cs create mode 100644 Wino.Mail.WinUI/App.xaml create mode 100644 Wino.Mail.WinUI/App.xaml.cs create mode 100644 Wino.Mail.WinUI/AppShell.xaml create mode 100644 Wino.Mail.WinUI/AppShell.xaml.cs create mode 100644 Wino.Mail.WinUI/Assets/BadgeLogo.scale-100.png create mode 100644 Wino.Mail.WinUI/Assets/BadgeLogo.scale-125.png create mode 100644 Wino.Mail.WinUI/Assets/BadgeLogo.scale-150.png create mode 100644 Wino.Mail.WinUI/Assets/BadgeLogo.scale-200.png create mode 100644 Wino.Mail.WinUI/Assets/BadgeLogo.scale-400.png create mode 100644 Wino.Mail.WinUI/Assets/EML/eml.png create mode 100644 Wino.Mail.WinUI/Assets/LargeTile.scale-100.png create mode 100644 Wino.Mail.WinUI/Assets/LargeTile.scale-125.png create mode 100644 Wino.Mail.WinUI/Assets/LargeTile.scale-150.png create mode 100644 Wino.Mail.WinUI/Assets/LargeTile.scale-200.png create mode 100644 Wino.Mail.WinUI/Assets/LargeTile.scale-400.png create mode 100644 Wino.Mail.WinUI/Assets/LockScreenLogo.scale-200.png create mode 100644 Wino.Mail.WinUI/Assets/NotificationIcons/archive.png create mode 100644 Wino.Mail.WinUI/Assets/NotificationIcons/delete.png create mode 100644 Wino.Mail.WinUI/Assets/NotificationIcons/dismiss.png create mode 100644 Wino.Mail.WinUI/Assets/NotificationIcons/markread.png create mode 100644 Wino.Mail.WinUI/Assets/NotificationIcons/profile-dark.png create mode 100644 Wino.Mail.WinUI/Assets/NotificationIcons/profile-light.png create mode 100644 Wino.Mail.WinUI/Assets/ReleaseNotes/1102.md create mode 100644 Wino.Mail.WinUI/Assets/SmallTile.scale-100.png create mode 100644 Wino.Mail.WinUI/Assets/SmallTile.scale-125.png create mode 100644 Wino.Mail.WinUI/Assets/SmallTile.scale-150.png create mode 100644 Wino.Mail.WinUI/Assets/SmallTile.scale-200.png create mode 100644 Wino.Mail.WinUI/Assets/SmallTile.scale-400.png create mode 100644 Wino.Mail.WinUI/Assets/SplashScreen.scale-100.png create mode 100644 Wino.Mail.WinUI/Assets/SplashScreen.scale-125.png create mode 100644 Wino.Mail.WinUI/Assets/SplashScreen.scale-150.png create mode 100644 Wino.Mail.WinUI/Assets/SplashScreen.scale-200.png create mode 100644 Wino.Mail.WinUI/Assets/SplashScreen.scale-400.png create mode 100644 Wino.Mail.WinUI/Assets/Square150x150Logo.scale-100.png create mode 100644 Wino.Mail.WinUI/Assets/Square150x150Logo.scale-125.png create mode 100644 Wino.Mail.WinUI/Assets/Square150x150Logo.scale-150.png create mode 100644 Wino.Mail.WinUI/Assets/Square150x150Logo.scale-200.png create mode 100644 Wino.Mail.WinUI/Assets/Square150x150Logo.scale-400.png create mode 100644 Wino.Mail.WinUI/Assets/Square44x44Logo.altform-lightunplated_targetsize-16.png create mode 100644 Wino.Mail.WinUI/Assets/Square44x44Logo.altform-lightunplated_targetsize-24.png create mode 100644 Wino.Mail.WinUI/Assets/Square44x44Logo.altform-lightunplated_targetsize-256.png create mode 100644 Wino.Mail.WinUI/Assets/Square44x44Logo.altform-lightunplated_targetsize-32.png create mode 100644 Wino.Mail.WinUI/Assets/Square44x44Logo.altform-lightunplated_targetsize-48.png create mode 100644 Wino.Mail.WinUI/Assets/Square44x44Logo.altform-unplated_targetsize-16.png create mode 100644 Wino.Mail.WinUI/Assets/Square44x44Logo.altform-unplated_targetsize-256.png create mode 100644 Wino.Mail.WinUI/Assets/Square44x44Logo.altform-unplated_targetsize-32.png create mode 100644 Wino.Mail.WinUI/Assets/Square44x44Logo.altform-unplated_targetsize-48.png create mode 100644 Wino.Mail.WinUI/Assets/Square44x44Logo.scale-100.png create mode 100644 Wino.Mail.WinUI/Assets/Square44x44Logo.scale-125.png create mode 100644 Wino.Mail.WinUI/Assets/Square44x44Logo.scale-150.png create mode 100644 Wino.Mail.WinUI/Assets/Square44x44Logo.scale-200.png create mode 100644 Wino.Mail.WinUI/Assets/Square44x44Logo.scale-400.png create mode 100644 Wino.Mail.WinUI/Assets/Square44x44Logo.targetsize-16.png create mode 100644 Wino.Mail.WinUI/Assets/Square44x44Logo.targetsize-24.png create mode 100644 Wino.Mail.WinUI/Assets/Square44x44Logo.targetsize-24_altform-unplated.png create mode 100644 Wino.Mail.WinUI/Assets/Square44x44Logo.targetsize-256.png create mode 100644 Wino.Mail.WinUI/Assets/Square44x44Logo.targetsize-32.png create mode 100644 Wino.Mail.WinUI/Assets/Square44x44Logo.targetsize-48.png create mode 100644 Wino.Mail.WinUI/Assets/StoreLogo.backup.png create mode 100644 Wino.Mail.WinUI/Assets/StoreLogo.png create mode 100644 Wino.Mail.WinUI/Assets/StoreLogo.scale-100.png create mode 100644 Wino.Mail.WinUI/Assets/StoreLogo.scale-125.png create mode 100644 Wino.Mail.WinUI/Assets/StoreLogo.scale-150.png create mode 100644 Wino.Mail.WinUI/Assets/StoreLogo.scale-200.png create mode 100644 Wino.Mail.WinUI/Assets/StoreLogo.scale-400.png create mode 100644 Wino.Mail.WinUI/Assets/Wide310x150Logo.scale-100.png create mode 100644 Wino.Mail.WinUI/Assets/Wide310x150Logo.scale-125.png create mode 100644 Wino.Mail.WinUI/Assets/Wide310x150Logo.scale-150.png create mode 100644 Wino.Mail.WinUI/Assets/Wide310x150Logo.scale-200.png create mode 100644 Wino.Mail.WinUI/Assets/Wide310x150Logo.scale-400.png create mode 100644 Wino.Mail.WinUI/Behaviors/BindableCommandBarBehavior.cs create mode 100644 Wino.Mail.WinUI/Behaviors/CreateMailNavigationItemBehavior.cs create mode 100644 Wino.Mail.WinUI/Controls/AccountNavigationItem.cs create mode 100644 Wino.Mail.WinUI/Controls/Advanced/WinoListView.cs create mode 100644 Wino.Mail.WinUI/Controls/ImagePreviewControl.cs create mode 100644 Wino.Mail.WinUI/Controls/MailItemDisplayInformationControl.xaml create mode 100644 Wino.Mail.WinUI/Controls/MailItemDisplayInformationControl.xaml.cs create mode 100644 Wino.Mail.WinUI/Controls/SettingsMenuItemControl.cs create mode 100644 Wino.Mail.WinUI/Controls/WebViewEditorControl.cs create mode 100644 Wino.Mail.WinUI/Controls/WinoExpander.cs create mode 100644 Wino.Mail.WinUI/Controls/WinoSwipeControlItems.cs create mode 100644 Wino.Mail.WinUI/Dialogs/AccountReorderDialog.xaml create mode 100644 Wino.Mail.WinUI/Dialogs/AccountReorderDialog.xaml.cs create mode 100644 Wino.Mail.WinUI/Dialogs/CreateAccountAliasDialog.xaml create mode 100644 Wino.Mail.WinUI/Dialogs/CreateAccountAliasDialog.xaml.cs create mode 100644 Wino.Mail.WinUI/Dialogs/MessageSourceDialog.xaml create mode 100644 Wino.Mail.WinUI/Dialogs/MessageSourceDialog.xaml.cs create mode 100644 Wino.Mail.WinUI/Dialogs/MoveMailDialog.xaml create mode 100644 Wino.Mail.WinUI/Dialogs/MoveMailDialog.xaml.cs create mode 100644 Wino.Mail.WinUI/Dialogs/NewImapSetupDialog.xaml create mode 100644 Wino.Mail.WinUI/Dialogs/NewImapSetupDialog.xaml.cs create mode 100644 Wino.Mail.WinUI/Dialogs/SignatureEditorDialog.xaml create mode 100644 Wino.Mail.WinUI/Dialogs/SignatureEditorDialog.xaml.cs create mode 100644 Wino.Mail.WinUI/Dialogs/SystemFolderConfigurationDialog.xaml create mode 100644 Wino.Mail.WinUI/Dialogs/SystemFolderConfigurationDialog.xaml.cs create mode 100644 Wino.Mail.WinUI/JS/editor.html create mode 100644 Wino.Mail.WinUI/JS/editor.js create mode 100644 Wino.Mail.WinUI/JS/global.css create mode 100644 Wino.Mail.WinUI/JS/libs/darkreader.js create mode 100644 Wino.Mail.WinUI/JS/libs/jodit.min.css create mode 100644 Wino.Mail.WinUI/JS/libs/jodit.min.js create mode 100644 Wino.Mail.WinUI/JS/libs/linkify-element.min.js create mode 100644 Wino.Mail.WinUI/JS/libs/linkify.min.js create mode 100644 Wino.Mail.WinUI/JS/reader.html create mode 100644 Wino.Mail.WinUI/MainWindow.xaml create mode 100644 Wino.Mail.WinUI/MainWindow.xaml.cs create mode 100644 Wino.Mail.WinUI/MenuFlyouts/AccountSelectorFlyout.cs create mode 100644 Wino.Mail.WinUI/MenuFlyouts/FilterMenuFlyout.cs create mode 100644 Wino.Mail.WinUI/MenuFlyouts/FolderOperationFlyout.cs create mode 100644 Wino.Mail.WinUI/MenuFlyouts/FolderOperationMenuFlyoutItem.cs create mode 100644 Wino.Mail.WinUI/MenuFlyouts/MailOperationFlyout.cs create mode 100644 Wino.Mail.WinUI/MenuFlyouts/MailOperationMenuFlyoutItem.cs create mode 100644 Wino.Mail.WinUI/MenuFlyouts/MoveButtonFlyout.cs create mode 100644 Wino.Mail.WinUI/MenuFlyouts/WinoOperationFlyout.cs create mode 100644 Wino.Mail.WinUI/MenuFlyouts/WinoOperationFlyoutItem.cs create mode 100644 Wino.Mail.WinUI/Package.appxmanifest create mode 100644 Wino.Mail.WinUI/Properties/launchSettings.json create mode 100644 Wino.Mail.WinUI/Selectors/AccountProviderViewModelTemplateSelector.cs create mode 100644 Wino.Mail.WinUI/Selectors/AccountReorderTemplateSelector.cs create mode 100644 Wino.Mail.WinUI/Selectors/MailItemContainerStyleSelector.cs create mode 100644 Wino.Mail.WinUI/Selectors/MailItemDisplayModePreviewTemplateSelector.cs create mode 100644 Wino.Mail.WinUI/Selectors/MailItemDisplaySelector.cs create mode 100644 Wino.Mail.WinUI/Services/DialogService.cs create mode 100644 Wino.Mail.WinUI/Services/MailAuthenticatorConfiguration.cs create mode 100644 Wino.Mail.WinUI/Services/NavigationService.cs create mode 100644 Wino.Mail.WinUI/Services/ProviderService.cs create mode 100644 Wino.Mail.WinUI/Services/SettingsBuilderService.cs create mode 100644 Wino.Mail.WinUI/ShellWindow.xaml create mode 100644 Wino.Mail.WinUI/ShellWindow.xaml.cs create mode 100644 Wino.Mail.WinUI/Styles/ImagePreviewControl.xaml create mode 100644 Wino.Mail.WinUI/Styles/ItemContainerStyles.xaml create mode 100644 Wino.Mail.WinUI/Styles/WebViewEditorControl.xaml create mode 100644 Wino.Mail.WinUI/Styles/WinoExpanderStyle.xaml create mode 100644 Wino.Mail.WinUI/Styles/WinoExpanderStyle.xaml.cs create mode 100644 Wino.Mail.WinUI/Views/Abstract/AboutPageAbstract.cs create mode 100644 Wino.Mail.WinUI/Views/Abstract/AccountDetailsPageAbstract.cs create mode 100644 Wino.Mail.WinUI/Views/Abstract/AccountManagementPageAbstract.cs create mode 100644 Wino.Mail.WinUI/Views/Abstract/AliasManagementPageAbstract.cs create mode 100644 Wino.Mail.WinUI/Views/Abstract/AppPreferencesPageAbstract.cs create mode 100644 Wino.Mail.WinUI/Views/Abstract/AppShellAbstract.cs create mode 100644 Wino.Mail.WinUI/Views/Abstract/ComposePageAbstract.cs create mode 100644 Wino.Mail.WinUI/Views/Abstract/EditAccountDetailsPageAbstract.cs create mode 100644 Wino.Mail.WinUI/Views/Abstract/IdlePageAbstract.cs create mode 100644 Wino.Mail.WinUI/Views/Abstract/LanguageTimePageAbstract.cs create mode 100644 Wino.Mail.WinUI/Views/Abstract/MailListPageAbstract.cs create mode 100644 Wino.Mail.WinUI/Views/Abstract/MailRenderingPageAbstract.cs create mode 100644 Wino.Mail.WinUI/Views/Abstract/MergedAccountDetailsPageAbstract.cs create mode 100644 Wino.Mail.WinUI/Views/Abstract/MessageListPageAbstract.cs create mode 100644 Wino.Mail.WinUI/Views/Abstract/PersonalizationPageAbstract.cs create mode 100644 Wino.Mail.WinUI/Views/Abstract/ReadComposePanePageAbstract.cs create mode 100644 Wino.Mail.WinUI/Views/Abstract/SignatureManagementPageAbstract.cs create mode 100644 Wino.Mail.WinUI/Views/Abstract/WelcomePageAbstract.cs create mode 100644 Wino.Mail.WinUI/Views/Account/AccountDetailsPage.xaml create mode 100644 Wino.Mail.WinUI/Views/Account/AccountDetailsPage.xaml.cs create mode 100644 Wino.Mail.WinUI/Views/Account/AccountManagementPage.xaml create mode 100644 Wino.Mail.WinUI/Views/Account/AccountManagementPage.xaml.cs create mode 100644 Wino.Mail.WinUI/Views/Account/MergedAccountDetailsPage.xaml create mode 100644 Wino.Mail.WinUI/Views/Account/MergedAccountDetailsPage.xaml.cs create mode 100644 Wino.Mail.WinUI/Views/ComposePage.xaml create mode 100644 Wino.Mail.WinUI/Views/ComposePage.xaml.cs create mode 100644 Wino.Mail.WinUI/Views/IdlePage.xaml create mode 100644 Wino.Mail.WinUI/Views/IdlePage.xaml.cs create mode 100644 Wino.Mail.WinUI/Views/ImapSetup/AdvancedImapSetupPage.xaml create mode 100644 Wino.Mail.WinUI/Views/ImapSetup/AdvancedImapSetupPage.xaml.cs create mode 100644 Wino.Mail.WinUI/Views/ImapSetup/ImapConnectionFailedPage.xaml create mode 100644 Wino.Mail.WinUI/Views/ImapSetup/ImapConnectionFailedPage.xaml.cs create mode 100644 Wino.Mail.WinUI/Views/ImapSetup/PreparingImapFoldersPage.xaml create mode 100644 Wino.Mail.WinUI/Views/ImapSetup/PreparingImapFoldersPage.xaml.cs create mode 100644 Wino.Mail.WinUI/Views/ImapSetup/TestingImapConnectionPage.xaml create mode 100644 Wino.Mail.WinUI/Views/ImapSetup/TestingImapConnectionPage.xaml.cs create mode 100644 Wino.Mail.WinUI/Views/ImapSetup/WelcomeImapSetupPage.xaml create mode 100644 Wino.Mail.WinUI/Views/ImapSetup/WelcomeImapSetupPage.xaml.cs create mode 100644 Wino.Mail.WinUI/Views/MailListPage.xaml create mode 100644 Wino.Mail.WinUI/Views/MailListPage.xaml.cs create mode 100644 Wino.Mail.WinUI/Views/MailRenderingPage.xaml create mode 100644 Wino.Mail.WinUI/Views/MailRenderingPage.xaml.cs create mode 100644 Wino.Mail.WinUI/Views/Settings/AboutPage.xaml create mode 100644 Wino.Mail.WinUI/Views/Settings/AboutPage.xaml.cs create mode 100644 Wino.Mail.WinUI/Views/Settings/AliasManagementPage.xaml create mode 100644 Wino.Mail.WinUI/Views/Settings/AliasManagementPage.xaml.cs create mode 100644 Wino.Mail.WinUI/Views/Settings/AppPreferencesPage.xaml create mode 100644 Wino.Mail.WinUI/Views/Settings/AppPreferencesPage.xaml.cs create mode 100644 Wino.Mail.WinUI/Views/Settings/EditAccountDetailsPage.xaml create mode 100644 Wino.Mail.WinUI/Views/Settings/EditAccountDetailsPage.xaml.cs create mode 100644 Wino.Mail.WinUI/Views/Settings/LanguageTimePage.xaml create mode 100644 Wino.Mail.WinUI/Views/Settings/LanguageTimePage.xaml.cs create mode 100644 Wino.Mail.WinUI/Views/Settings/MessageListPage.xaml create mode 100644 Wino.Mail.WinUI/Views/Settings/MessageListPage.xaml.cs create mode 100644 Wino.Mail.WinUI/Views/Settings/PersonalizationPage.xaml create mode 100644 Wino.Mail.WinUI/Views/Settings/PersonalizationPage.xaml.cs create mode 100644 Wino.Mail.WinUI/Views/Settings/ReadComposePanePage.xaml create mode 100644 Wino.Mail.WinUI/Views/Settings/ReadComposePanePage.xaml.cs create mode 100644 Wino.Mail.WinUI/Views/Settings/SignatureManagementPage.xaml create mode 100644 Wino.Mail.WinUI/Views/Settings/SignatureManagementPage.xaml.cs create mode 100644 Wino.Mail.WinUI/Views/WelcomePage.xaml create mode 100644 Wino.Mail.WinUI/Views/WelcomePage.xaml.cs create mode 100644 Wino.Mail.WinUI/Wino.Mail.WinUI.csproj create mode 100644 Wino.Mail.WinUI/app.manifest diff --git a/Directory.Packages.props b/Directory.Packages.props index c6262929..b800ef26 100644 --- a/Directory.Packages.props +++ b/Directory.Packages.props @@ -3,21 +3,20 @@ true - + - - - - - - - - - - - + + + + + + + + + + @@ -25,21 +24,21 @@ - + - + + - - + - + @@ -51,7 +50,6 @@ - @@ -64,5 +62,8 @@ + + + \ No newline at end of file diff --git a/Wino.Authentication/Wino.Authentication.csproj b/Wino.Authentication/Wino.Authentication.csproj index 3c7c77ce..1e54291a 100644 --- a/Wino.Authentication/Wino.Authentication.csproj +++ b/Wino.Authentication/Wino.Authentication.csproj @@ -1,6 +1,6 @@  - net9.0 + net10.0 win-x86;win-x64;win-arm64 Wino.Authentication x86;x64;arm64 diff --git a/Wino.Core.Domain/Exceptions/BackgroundTaskRegistrationFailedException.cs b/Wino.Core.Domain/Exceptions/BackgroundTaskRegistrationFailedException.cs deleted file mode 100644 index 1a8ac966..00000000 --- a/Wino.Core.Domain/Exceptions/BackgroundTaskRegistrationFailedException.cs +++ /dev/null @@ -1,8 +0,0 @@ -using System; - -namespace Wino.Core.Domain.Exceptions; - -/// -/// An exception thrown when the background task registration is failed. -/// -public class BackgroundTaskRegistrationFailedException : Exception { } diff --git a/Wino.Core.Domain/Interfaces/IBackgroundTaskService.cs b/Wino.Core.Domain/Interfaces/IBackgroundTaskService.cs deleted file mode 100644 index 651ee659..00000000 --- a/Wino.Core.Domain/Interfaces/IBackgroundTaskService.cs +++ /dev/null @@ -1,17 +0,0 @@ -using System.Threading.Tasks; - -namespace Wino.Core.Domain.Interfaces; - -public interface IBackgroundTaskService -{ - /// - /// Unregisters all background tasks once. - /// This is used to clean up the background tasks when the app is updated. - /// - void UnregisterAllBackgroundTask(); - - /// - /// Registers required background tasks. - /// - Task RegisterBackgroundTasksAsync(); -} diff --git a/Wino.Core.UWP/Dispatcher.cs b/Wino.Core.UWP/Dispatcher.cs deleted file mode 100644 index 34b5b576..00000000 --- a/Wino.Core.UWP/Dispatcher.cs +++ /dev/null @@ -1,19 +0,0 @@ -using System; -using System.Threading.Tasks; -using Windows.UI.Core; -using Wino.Core.Domain.Interfaces; - -namespace Wino.Core.UWP; - -public class UWPDispatcher : IDispatcher -{ - private readonly CoreDispatcher _coreDispatcher; - - public UWPDispatcher(CoreDispatcher coreDispatcher) - { - _coreDispatcher = coreDispatcher; - } - - public Task ExecuteOnUIThread(Action action) - => _coreDispatcher.RunAsync(CoreDispatcherPriority.Normal, () => action()).AsTask(); -} diff --git a/Wino.Core.UWP/Extensions/CompositionExtensions.Size.cs b/Wino.Core.UWP/Extensions/CompositionExtensions.Size.cs deleted file mode 100644 index 93bcb248..00000000 --- a/Wino.Core.UWP/Extensions/CompositionExtensions.Size.cs +++ /dev/null @@ -1,126 +0,0 @@ -using System; -using System.Numerics; -using System.Threading.Tasks; -using Windows.UI.Composition; -using Windows.UI.Xaml; - -namespace Wino.Extensions; - -public static partial class CompositionExtensions -{ - public static void StartSizeAnimation(this UIElement element, Vector2? from = null, Vector2? to = null, - double duration = 800, int delay = 0, CompositionEasingFunction easing = null, Action completed = null, - AnimationIterationBehavior iterationBehavior = AnimationIterationBehavior.Count) - { - CompositionScopedBatch batch = null; - - var visual = element.Visual(); - var compositor = visual.Compositor; - - if (completed != null) - { - batch = compositor.CreateScopedBatch(CompositionBatchTypes.Animation); - batch.Completed += (s, e) => completed(); - } - - if (to == null) - { - to = Vector2.One; - } - - visual.StartAnimation("Size", - compositor.CreateVector2KeyFrameAnimation(from, to.Value, duration, delay, easing, iterationBehavior)); - - batch?.End(); - } - - public static void StartSizeAnimation(this Visual visual, Vector2? from = null, Vector2? to = null, - double duration = 800, int delay = 0, CompositionEasingFunction easing = null, Action completed = null, - AnimationIterationBehavior iterationBehavior = AnimationIterationBehavior.Count) - { - CompositionScopedBatch batch = null; - var compositor = visual.Compositor; - - if (completed != null) - { - batch = compositor.CreateScopedBatch(CompositionBatchTypes.Animation); - batch.Completed += (s, e) => completed(); - } - - if (to == null) - { - to = Vector2.One; - } - - visual.StartAnimation("Size", - compositor.CreateVector2KeyFrameAnimation(from, to.Value, duration, delay, easing, iterationBehavior)); - - batch?.End(); - } - - public static Task StartSizeAnimationAsync(this UIElement element, Vector2? from = null, Vector2? to = null, - double duration = 800, int delay = 0, CompositionEasingFunction easing = null, - AnimationIterationBehavior iterationBehavior = AnimationIterationBehavior.Count) - { - CompositionScopedBatch batch; - - var visual = element.Visual(); - var compositor = visual.Compositor; - - var taskSource = new TaskCompletionSource(); - - void Completed(object o, CompositionBatchCompletedEventArgs e) - { - batch.Completed -= Completed; - taskSource.SetResult(true); - } - - batch = compositor.CreateScopedBatch(CompositionBatchTypes.Animation); - batch.Completed += Completed; - - if (to == null) - { - to = Vector2.One; - } - - visual.StartAnimation("Size", - compositor.CreateVector2KeyFrameAnimation(from, to.Value, duration, delay, easing, iterationBehavior)); - - batch.End(); - - return taskSource.Task; - } - - public static Task StartSizeAnimationAsync(this Visual visual, Vector2? from = null, Vector2? to = null, - double duration = 800, int delay = 0, CompositionEasingFunction easing = null, - AnimationIterationBehavior iterationBehavior = AnimationIterationBehavior.Count) - { - CompositionScopedBatch batch; - - var compositor = visual.Compositor; - - var taskSource = new TaskCompletionSource(); - - void Completed(object o, CompositionBatchCompletedEventArgs e) - { - batch.Completed -= Completed; - taskSource.SetResult(true); - } - - batch = compositor.CreateScopedBatch(CompositionBatchTypes.Animation); - batch.Completed += Completed; - - if (to == null) - { - to = Vector2.One; - } - - visual.StartAnimation("Size", - compositor.CreateVector2KeyFrameAnimation(from, to.Value, duration, delay, easing, iterationBehavior)); - - batch.End(); - - return taskSource.Task; - } - -} diff --git a/Wino.Core.UWP/Services/BackgroundTaskService.cs b/Wino.Core.UWP/Services/BackgroundTaskService.cs deleted file mode 100644 index 829f1b8f..00000000 --- a/Wino.Core.UWP/Services/BackgroundTaskService.cs +++ /dev/null @@ -1,62 +0,0 @@ -using System; -using System.Linq; -using System.Threading.Tasks; -using Serilog; -using Windows.ApplicationModel.Background; -using Wino.Core.Domain.Interfaces; - -namespace Wino.Core.UWP.Services; - -public class BackgroundTaskService : IBackgroundTaskService -{ - private const string IsBackgroundTasksUnregisteredKey = nameof(IsBackgroundTasksUnregisteredKey); - public const string ToastNotificationActivationHandlerTaskName = "ToastNotificationActivationHandlerTask"; - - private readonly IConfigurationService _configurationService; - - public BackgroundTaskService(IConfigurationService configurationService) - { - _configurationService = configurationService; - } - - public void UnregisterAllBackgroundTask() - { - if (_configurationService.Get(IsBackgroundTasksUnregisteredKey, false)) - { - foreach (var task in BackgroundTaskRegistration.AllTasks) - { - task.Value.Unregister(true); - } - - Log.Information("Unregistered all background tasks."); - _configurationService.Set(IsBackgroundTasksUnregisteredKey, true); - } - } - - public Task RegisterBackgroundTasksAsync() - { - return RegisterToastNotificationHandlerBackgroundTaskAsync(); - } - - public async Task RegisterToastNotificationHandlerBackgroundTaskAsync() - { - // If background task is already registered, do nothing. - if (BackgroundTaskRegistration.AllTasks.Any(i => i.Value.Name.Equals(ToastNotificationActivationHandlerTaskName))) - return; - - // Otherwise request access - BackgroundAccessStatus status = await BackgroundExecutionManager.RequestAccessAsync(); - - // Create the background task - BackgroundTaskBuilder builder = new BackgroundTaskBuilder() - { - Name = ToastNotificationActivationHandlerTaskName - }; - - // Assign the toast action trigger - builder.SetTrigger(new ToastNotificationActionTrigger()); - - // And register the task - BackgroundTaskRegistration registration = builder.Register(); - } -} diff --git a/Wino.Core.UWP/Wino.Core.UWP.csproj b/Wino.Core.UWP/Wino.Core.UWP.csproj index e6b2d5af..563450be 100644 --- a/Wino.Core.UWP/Wino.Core.UWP.csproj +++ b/Wino.Core.UWP/Wino.Core.UWP.csproj @@ -12,78 +12,6 @@ 10.0.18362.0 True - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/Wino.Core.UWP/WinoApplication.cs b/Wino.Core.UWP/WinoApplication.cs deleted file mode 100644 index 6cdaa9dc..00000000 --- a/Wino.Core.UWP/WinoApplication.cs +++ /dev/null @@ -1,267 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Globalization; -using System.IO; -using System.Linq; -using System.Threading.Tasks; -using CommunityToolkit.Mvvm.Messaging; -using Microsoft.Extensions.DependencyInjection; -using Nito.AsyncEx; -using Serilog; -using Windows.ApplicationModel; -using Windows.ApplicationModel.Activation; -using Windows.ApplicationModel.AppService; -using Windows.ApplicationModel.Core; -using Windows.Foundation.Metadata; -using Windows.Globalization; -using Windows.Storage; -using Windows.UI; -using Windows.UI.Core.Preview; -using Windows.UI.ViewManagement; -using Windows.UI.Xaml; -using Windows.UI.Xaml.Controls; -using Wino.Activation; -using Wino.Core.Domain; -using Wino.Core.Domain.Interfaces; -using Wino.Core.Domain.Models.Translations; -using Wino.Messaging.Client.Shell; -using Wino.Services; - -namespace Wino.Core.UWP; - -public abstract class WinoApplication : Application, IRecipient -{ - public new static WinoApplication Current => (WinoApplication)Application.Current; - public const string WinoLaunchLogPrefix = "[Wino Launch] "; - - public IServiceProvider Services { get; } - protected IWinoLogger LogInitializer { get; } - protected IApplicationConfiguration AppConfiguration { get; } - protected IWinoServerConnectionManager AppServiceConnectionManager { get; } - public IThemeService ThemeService { get; } - public IUnderlyingThemeService UnderlyingThemeService { get; } - public IThumbnailService ThumbnailService { get; } - protected IDatabaseService DatabaseService { get; } - protected ITranslationService TranslationService { get; } - - protected WinoApplication() - { - ConfigurePrelaunch(); - - Services = ConfigureServices(); - - AppDomain.CurrentDomain.UnhandledException += CurrentDomain_UnhandledException; - TaskScheduler.UnobservedTaskException += OnUnobservedTaskException; - UnhandledException += OnAppUnhandledException; - - Resuming += OnResuming; - Suspending += OnSuspending; - - LogInitializer = Services.GetService(); - AppConfiguration = Services.GetService(); - - AppServiceConnectionManager = Services.GetService>(); - ThemeService = Services.GetService(); - DatabaseService = Services.GetService(); - TranslationService = Services.GetService(); - UnderlyingThemeService = Services.GetService(); - ThumbnailService = Services.GetService(); - - // Make sure the paths are setup on app start. - AppConfiguration.ApplicationDataFolderPath = ApplicationData.Current.LocalFolder.Path; - AppConfiguration.PublisherSharedFolderPath = ApplicationData.Current.GetPublisherCacheFolder(ApplicationConfiguration.SharedFolderName).Path; - AppConfiguration.ApplicationTempFolderPath = ApplicationData.Current.TemporaryFolder.Path; - - ConfigureLogging(); - } - - private void CurrentDomain_UnhandledException(object sender, System.UnhandledExceptionEventArgs e) - => Log.Fatal(e.ExceptionObject as Exception, "AppDomain Unhandled Exception"); - - private void OnUnobservedTaskException(object sender, UnobservedTaskExceptionEventArgs e) - => Log.Error(e.Exception, "Unobserved Task Exception"); - - private void OnAppUnhandledException(object sender, Windows.UI.Xaml.UnhandledExceptionEventArgs e) - { - Log.Fatal(e.Exception, "Unhandled Exception"); - e.Handled = true; - } - - protected abstract void OnApplicationCloseRequested(object sender, SystemNavigationCloseRequestedPreviewEventArgs e); - protected abstract IEnumerable GetActivationHandlers(); - protected abstract ActivationHandler GetDefaultActivationHandler(); - protected override void OnWindowCreated(WindowCreatedEventArgs args) - { - base.OnWindowCreated(args); - - ConfigureTitleBar(); - - LogActivation($"OnWindowCreated -> IsWindowNull: {args.Window == null}"); - - TryRegisterAppCloseChange(); - } - - public IEnumerable GetActivationServices() - { - yield return DatabaseService; - yield return TranslationService; - yield return ThemeService; - } - - public Task InitializeServicesAsync() => GetActivationServices().Select(a => a.InitializeAsync()).WhenAll(); - - public bool IsInteractiveLaunchArgs(object args) => args is IActivatedEventArgs; - - public void LogActivation(string log) => Log.Information($"{WinoLaunchLogPrefix}{log}"); - - private void ConfigureTitleBar() - { - var coreTitleBar = CoreApplication.GetCurrentView().TitleBar; - var applicationViewTitleBar = ApplicationView.GetForCurrentView().TitleBar; - - // Extend shell content into core window to meet design requirements. - coreTitleBar.ExtendViewIntoTitleBar = true; - - // Change system buttons and background colors to meet design requirements. - applicationViewTitleBar.ButtonBackgroundColor = Colors.Transparent; - applicationViewTitleBar.BackgroundColor = Colors.Transparent; - applicationViewTitleBar.ButtonInactiveBackgroundColor = Colors.Transparent; - applicationViewTitleBar.ButtonForegroundColor = Colors.White; - } - - public async Task ActivateWinoAsync(object args) - { - await InitializeServicesAsync(); - - if (IsInteractiveLaunchArgs(args)) - { - if (Window.Current.Content == null) - { - var mainFrame = new Frame(); - - Window.Current.Content = mainFrame; - - await ThemeService.InitializeAsync(); - } - } - - await HandleActivationAsync(args); - - if (IsInteractiveLaunchArgs(args)) - { - Window.Current.Activate(); - - LogActivation("Window activated"); - } - } - - public async Task HandleActivationAsync(object activationArgs) - { - if (GetActivationHandlers() != null) - { - var activationHandler = GetActivationHandlers().FirstOrDefault(h => h.CanHandle(activationArgs)) ?? null; - - if (activationHandler != null) - { - await activationHandler.HandleAsync(activationArgs); - } - } - - if (IsInteractiveLaunchArgs(activationArgs)) - { - var defaultHandler = GetDefaultActivationHandler(); - - if (defaultHandler.CanHandle(activationArgs)) - { - await defaultHandler.HandleAsync(activationArgs); - } - } - } - - protected override async void OnLaunched(LaunchActivatedEventArgs args) - { - LogActivation($"OnLaunched -> {args.GetType().Name}, Kind -> {args.Kind}, PreviousExecutionState -> {args.PreviousExecutionState}, IsPrelaunch -> {args.PrelaunchActivated}"); - - if (!args.PrelaunchActivated) - { - await ActivateWinoAsync(args); - } - } - - protected override async void OnFileActivated(FileActivatedEventArgs args) - { - base.OnFileActivated(args); - - LogActivation($"OnFileActivated -> ItemCount: {args.Files.Count}, Kind: {args.Kind}, PreviousExecutionState: {args.PreviousExecutionState}"); - - await ActivateWinoAsync(args); - } - - protected override async void OnActivated(IActivatedEventArgs args) - { - base.OnActivated(args); - - Log.Information($"OnActivated -> {args.GetType().Name}, Kind -> {args.Kind}, Prev Execution State -> {args.PreviousExecutionState}"); - - await ActivateWinoAsync(args); - } - - private void TryRegisterAppCloseChange() - { - try - { - var systemNavigationManagerPreview = SystemNavigationManagerPreview.GetForCurrentView(); - - systemNavigationManagerPreview.CloseRequested -= OnApplicationCloseRequested; - systemNavigationManagerPreview.CloseRequested += OnApplicationCloseRequested; - } - catch { } - } - - private void ConfigurePrelaunch() - { - if (ApiInformation.IsMethodPresent("Windows.ApplicationModel.Core.CoreApplication", "EnablePrelaunch")) - CoreApplication.EnablePrelaunch(true); - } - - public virtual async void OnResuming(object sender, object e) - { - // App Service connection was lost on suspension. - // We must restore it. - // Server might be running already, but re-launching it will trigger a new connection attempt. - - try - { - await AppServiceConnectionManager.ConnectAsync(); - } - catch (OperationCanceledException) - { - // Ignore - } - catch (Exception ex) - { - Log.Error(ex, "Failed to connect to server after resuming the app."); - } - } - public virtual void OnSuspending(object sender, SuspendingEventArgs e) { } - - public abstract IServiceProvider ConfigureServices(); - - public void ConfigureLogging() - { - string logFilePath = Path.Combine(ApplicationData.Current.LocalFolder.Path, Constants.ClientLogFile); - LogInitializer.SetupLogger(logFilePath); - } - - public virtual void OnLanguageChanged(AppLanguageModel languageModel) - { - var newCulture = new CultureInfo(languageModel.Code); - - ApplicationLanguages.PrimaryLanguageOverride = languageModel.Code; - - CultureInfo.DefaultThreadCurrentCulture = newCulture; - CultureInfo.DefaultThreadCurrentUICulture = newCulture; - } - - public void Receive(LanguageChanged message) => OnLanguageChanged(TranslationService.CurrentLanguageModel); -} diff --git a/Wino.Core.ViewModels/Wino.Core.ViewModels.csproj b/Wino.Core.ViewModels/Wino.Core.ViewModels.csproj index f0cce77b..50912473 100644 --- a/Wino.Core.ViewModels/Wino.Core.ViewModels.csproj +++ b/Wino.Core.ViewModels/Wino.Core.ViewModels.csproj @@ -1,6 +1,6 @@  - net9.0 + net10.0 x86;x64;arm64 win-x86;win-x64;win-arm64 true diff --git a/Wino.Core.UWP/Activation/ActivationHandler.cs b/Wino.Core.WinUI/Activation/ActivationHandler.cs similarity index 100% rename from Wino.Core.UWP/Activation/ActivationHandler.cs rename to Wino.Core.WinUI/Activation/ActivationHandler.cs diff --git a/Wino.Core.UWP/AppThemes/Acrylic.xaml b/Wino.Core.WinUI/AppThemes/Acrylic.xaml similarity index 90% rename from Wino.Core.UWP/AppThemes/Acrylic.xaml rename to Wino.Core.WinUI/AppThemes/Acrylic.xaml index fb84bf43..cd1ee7fb 100644 --- a/Wino.Core.UWP/AppThemes/Acrylic.xaml +++ b/Wino.Core.WinUI/AppThemes/Acrylic.xaml @@ -2,7 +2,7 @@ xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" xmlns:local="using:Microsoft.UI.Xaml.Media" - xmlns:xaml="using:Windows.UI.Xaml"> + xmlns:xaml="using:Microsoft.UI.Xaml"> Acrylic False @@ -17,7 +17,6 @@ @@ -28,7 +27,6 @@ diff --git a/Wino.Core.UWP/AppThemes/Clouds.xaml b/Wino.Core.WinUI/AppThemes/Clouds.xaml similarity index 96% rename from Wino.Core.UWP/AppThemes/Clouds.xaml rename to Wino.Core.WinUI/AppThemes/Clouds.xaml index ca234cc1..75210457 100644 --- a/Wino.Core.UWP/AppThemes/Clouds.xaml +++ b/Wino.Core.WinUI/AppThemes/Clouds.xaml @@ -1,7 +1,7 @@  + xmlns:xaml="using:Microsoft.UI.Xaml"> Clouds ms-appx:///Wino.Core.UWP/BackgroundImages/Clouds.jpg diff --git a/Wino.Core.UWP/AppThemes/Custom.xaml b/Wino.Core.WinUI/AppThemes/Custom.xaml similarity index 98% rename from Wino.Core.UWP/AppThemes/Custom.xaml rename to Wino.Core.WinUI/AppThemes/Custom.xaml index 71bbf1a3..97df0020 100644 --- a/Wino.Core.UWP/AppThemes/Custom.xaml +++ b/Wino.Core.WinUI/AppThemes/Custom.xaml @@ -1,7 +1,7 @@  + xmlns:xaml="using:Microsoft.UI.Xaml"> Custom ms-appdata:///local/CustomWallpaper.jpg diff --git a/Wino.Core.UWP/AppThemes/Forest.xaml b/Wino.Core.WinUI/AppThemes/Forest.xaml similarity index 95% rename from Wino.Core.UWP/AppThemes/Forest.xaml rename to Wino.Core.WinUI/AppThemes/Forest.xaml index 63ab19a1..c39bfdf6 100644 --- a/Wino.Core.UWP/AppThemes/Forest.xaml +++ b/Wino.Core.WinUI/AppThemes/Forest.xaml @@ -1,7 +1,7 @@  + xmlns:xaml="using:Microsoft.UI.Xaml"> Forest ms-appx:///Wino.Core.UWP/BackgroundImages/Forest.jpg diff --git a/Wino.Core.UWP/AppThemes/Garden.xaml b/Wino.Core.WinUI/AppThemes/Garden.xaml similarity index 96% rename from Wino.Core.UWP/AppThemes/Garden.xaml rename to Wino.Core.WinUI/AppThemes/Garden.xaml index cf238b79..b3763e48 100644 --- a/Wino.Core.UWP/AppThemes/Garden.xaml +++ b/Wino.Core.WinUI/AppThemes/Garden.xaml @@ -1,7 +1,7 @@  + xmlns:xaml="using:Microsoft.UI.Xaml"> Garden ms-appx:///Wino.Core.UWP/BackgroundImages/Garden.jpg diff --git a/Wino.Core.UWP/AppThemes/Mica.xaml b/Wino.Core.WinUI/AppThemes/Mica.xaml similarity index 95% rename from Wino.Core.UWP/AppThemes/Mica.xaml rename to Wino.Core.WinUI/AppThemes/Mica.xaml index 302451b4..4e907af8 100644 --- a/Wino.Core.UWP/AppThemes/Mica.xaml +++ b/Wino.Core.WinUI/AppThemes/Mica.xaml @@ -1,7 +1,7 @@  + xmlns:xaml="using:Microsoft.UI.Xaml"> Mica True diff --git a/Wino.Core.UWP/AppThemes/Nighty.xaml b/Wino.Core.WinUI/AppThemes/Nighty.xaml similarity index 96% rename from Wino.Core.UWP/AppThemes/Nighty.xaml rename to Wino.Core.WinUI/AppThemes/Nighty.xaml index 51de8e5f..99c94e63 100644 --- a/Wino.Core.UWP/AppThemes/Nighty.xaml +++ b/Wino.Core.WinUI/AppThemes/Nighty.xaml @@ -1,7 +1,7 @@  + xmlns:xaml="using:Microsoft.UI.Xaml"> Nighty ms-appx:///Wino.Core.UWP/BackgroundImages/Nighty.jpg diff --git a/Wino.Core.UWP/AppThemes/Snowflake.xaml b/Wino.Core.WinUI/AppThemes/Snowflake.xaml similarity index 96% rename from Wino.Core.UWP/AppThemes/Snowflake.xaml rename to Wino.Core.WinUI/AppThemes/Snowflake.xaml index 3358e139..63631e04 100644 --- a/Wino.Core.UWP/AppThemes/Snowflake.xaml +++ b/Wino.Core.WinUI/AppThemes/Snowflake.xaml @@ -1,7 +1,7 @@  + xmlns:xaml="using:Microsoft.UI.Xaml"> Snowflake ms-appx:///Wino.Core.UWP/BackgroundImages/Snowflake.jpg diff --git a/Wino.Core.UWP/AppThemes/TestTheme.xaml b/Wino.Core.WinUI/AppThemes/TestTheme.xaml similarity index 100% rename from Wino.Core.UWP/AppThemes/TestTheme.xaml rename to Wino.Core.WinUI/AppThemes/TestTheme.xaml diff --git a/Wino.Core.UWP/Assets/FileTypes/type_archive.png b/Wino.Core.WinUI/Assets/FileTypes/type_archive.png similarity index 100% rename from Wino.Core.UWP/Assets/FileTypes/type_archive.png rename to Wino.Core.WinUI/Assets/FileTypes/type_archive.png diff --git a/Wino.Core.UWP/Assets/FileTypes/type_audio.png b/Wino.Core.WinUI/Assets/FileTypes/type_audio.png similarity index 100% rename from Wino.Core.UWP/Assets/FileTypes/type_audio.png rename to Wino.Core.WinUI/Assets/FileTypes/type_audio.png diff --git a/Wino.Core.UWP/Assets/FileTypes/type_executable.png b/Wino.Core.WinUI/Assets/FileTypes/type_executable.png similarity index 100% rename from Wino.Core.UWP/Assets/FileTypes/type_executable.png rename to Wino.Core.WinUI/Assets/FileTypes/type_executable.png diff --git a/Wino.Core.UWP/Assets/FileTypes/type_html.png b/Wino.Core.WinUI/Assets/FileTypes/type_html.png similarity index 100% rename from Wino.Core.UWP/Assets/FileTypes/type_html.png rename to Wino.Core.WinUI/Assets/FileTypes/type_html.png diff --git a/Wino.Core.UWP/Assets/FileTypes/type_image.png b/Wino.Core.WinUI/Assets/FileTypes/type_image.png similarity index 100% rename from Wino.Core.UWP/Assets/FileTypes/type_image.png rename to Wino.Core.WinUI/Assets/FileTypes/type_image.png diff --git a/Wino.Core.UWP/Assets/FileTypes/type_none.png b/Wino.Core.WinUI/Assets/FileTypes/type_none.png similarity index 100% rename from Wino.Core.UWP/Assets/FileTypes/type_none.png rename to Wino.Core.WinUI/Assets/FileTypes/type_none.png diff --git a/Wino.Core.UWP/Assets/FileTypes/type_other.png b/Wino.Core.WinUI/Assets/FileTypes/type_other.png similarity index 100% rename from Wino.Core.UWP/Assets/FileTypes/type_other.png rename to Wino.Core.WinUI/Assets/FileTypes/type_other.png diff --git a/Wino.Core.UWP/Assets/FileTypes/type_pdf.png b/Wino.Core.WinUI/Assets/FileTypes/type_pdf.png similarity index 100% rename from Wino.Core.UWP/Assets/FileTypes/type_pdf.png rename to Wino.Core.WinUI/Assets/FileTypes/type_pdf.png diff --git a/Wino.Core.UWP/Assets/FileTypes/type_rar.png b/Wino.Core.WinUI/Assets/FileTypes/type_rar.png similarity index 100% rename from Wino.Core.UWP/Assets/FileTypes/type_rar.png rename to Wino.Core.WinUI/Assets/FileTypes/type_rar.png diff --git a/Wino.Core.UWP/Assets/FileTypes/type_video.png b/Wino.Core.WinUI/Assets/FileTypes/type_video.png similarity index 100% rename from Wino.Core.UWP/Assets/FileTypes/type_video.png rename to Wino.Core.WinUI/Assets/FileTypes/type_video.png diff --git a/Wino.Core.UWP/Assets/Providers/Gmail.png b/Wino.Core.WinUI/Assets/Providers/Gmail.png similarity index 100% rename from Wino.Core.UWP/Assets/Providers/Gmail.png rename to Wino.Core.WinUI/Assets/Providers/Gmail.png diff --git a/Wino.Core.UWP/Assets/Providers/IMAP4.png b/Wino.Core.WinUI/Assets/Providers/IMAP4.png similarity index 100% rename from Wino.Core.UWP/Assets/Providers/IMAP4.png rename to Wino.Core.WinUI/Assets/Providers/IMAP4.png diff --git a/Wino.Core.UWP/Assets/Providers/Office 365.png b/Wino.Core.WinUI/Assets/Providers/Office 365.png similarity index 100% rename from Wino.Core.UWP/Assets/Providers/Office 365.png rename to Wino.Core.WinUI/Assets/Providers/Office 365.png diff --git a/Wino.Core.UWP/Assets/Providers/Outlook.png b/Wino.Core.WinUI/Assets/Providers/Outlook.png similarity index 100% rename from Wino.Core.UWP/Assets/Providers/Outlook.png rename to Wino.Core.WinUI/Assets/Providers/Outlook.png diff --git a/Wino.Core.UWP/Assets/Providers/Yahoo.png b/Wino.Core.WinUI/Assets/Providers/Yahoo.png similarity index 100% rename from Wino.Core.UWP/Assets/Providers/Yahoo.png rename to Wino.Core.WinUI/Assets/Providers/Yahoo.png diff --git a/Wino.Core.UWP/Assets/Providers/iCloud.png b/Wino.Core.WinUI/Assets/Providers/iCloud.png similarity index 100% rename from Wino.Core.UWP/Assets/Providers/iCloud.png rename to Wino.Core.WinUI/Assets/Providers/iCloud.png diff --git a/Wino.Core.UWP/Assets/WinoIcons.ttf b/Wino.Core.WinUI/Assets/WinoIcons.ttf similarity index 100% rename from Wino.Core.UWP/Assets/WinoIcons.ttf rename to Wino.Core.WinUI/Assets/WinoIcons.ttf diff --git a/Wino.Core.UWP/BackgroundImages/Acrylic.jpg b/Wino.Core.WinUI/BackgroundImages/Acrylic.jpg similarity index 100% rename from Wino.Core.UWP/BackgroundImages/Acrylic.jpg rename to Wino.Core.WinUI/BackgroundImages/Acrylic.jpg diff --git a/Wino.Core.UWP/BackgroundImages/Clouds.jpg b/Wino.Core.WinUI/BackgroundImages/Clouds.jpg similarity index 100% rename from Wino.Core.UWP/BackgroundImages/Clouds.jpg rename to Wino.Core.WinUI/BackgroundImages/Clouds.jpg diff --git a/Wino.Core.UWP/BackgroundImages/Forest.jpg b/Wino.Core.WinUI/BackgroundImages/Forest.jpg similarity index 100% rename from Wino.Core.UWP/BackgroundImages/Forest.jpg rename to Wino.Core.WinUI/BackgroundImages/Forest.jpg diff --git a/Wino.Core.UWP/BackgroundImages/Garden.jpg b/Wino.Core.WinUI/BackgroundImages/Garden.jpg similarity index 100% rename from Wino.Core.UWP/BackgroundImages/Garden.jpg rename to Wino.Core.WinUI/BackgroundImages/Garden.jpg diff --git a/Wino.Core.UWP/BackgroundImages/Mica.jpg b/Wino.Core.WinUI/BackgroundImages/Mica.jpg similarity index 100% rename from Wino.Core.UWP/BackgroundImages/Mica.jpg rename to Wino.Core.WinUI/BackgroundImages/Mica.jpg diff --git a/Wino.Core.UWP/BackgroundImages/Nighty.jpg b/Wino.Core.WinUI/BackgroundImages/Nighty.jpg similarity index 100% rename from Wino.Core.UWP/BackgroundImages/Nighty.jpg rename to Wino.Core.WinUI/BackgroundImages/Nighty.jpg diff --git a/Wino.Core.UWP/BackgroundImages/Snowflake.jpg b/Wino.Core.WinUI/BackgroundImages/Snowflake.jpg similarity index 100% rename from Wino.Core.UWP/BackgroundImages/Snowflake.jpg rename to Wino.Core.WinUI/BackgroundImages/Snowflake.jpg diff --git a/Wino.Core.UWP/BasePage.cs b/Wino.Core.WinUI/BasePage.cs similarity index 93% rename from Wino.Core.UWP/BasePage.cs rename to Wino.Core.WinUI/BasePage.cs index c39e454c..74835584 100644 --- a/Wino.Core.UWP/BasePage.cs +++ b/Wino.Core.WinUI/BasePage.cs @@ -3,9 +3,9 @@ using System.Diagnostics; using System.Diagnostics.CodeAnalysis; using CommunityToolkit.Mvvm.Messaging; using Microsoft.Extensions.DependencyInjection; -using Windows.UI.Xaml; -using Windows.UI.Xaml.Controls; -using Windows.UI.Xaml.Navigation; +using Microsoft.UI.Xaml; +using Microsoft.UI.Xaml.Controls; +using Microsoft.UI.Xaml.Navigation; using Wino.Core.ViewModels; using Wino.Messaging.Client.Shell; @@ -35,7 +35,7 @@ public abstract class BasePage : BasePage where T : CoreBaseViewModel protected BasePage() { - ViewModel.Dispatcher = new UWPDispatcher(Dispatcher); + ViewModel.Dispatcher = new WinUIDispatcher(DispatcherQueue); Loaded += PageLoaded; Unloaded += PageUnloaded; diff --git a/Wino.Core.UWP/Controls/AccountCreationDialogControl.xaml b/Wino.Core.WinUI/Controls/AccountCreationDialogControl.xaml similarity index 100% rename from Wino.Core.UWP/Controls/AccountCreationDialogControl.xaml rename to Wino.Core.WinUI/Controls/AccountCreationDialogControl.xaml diff --git a/Wino.Core.UWP/Controls/AccountCreationDialogControl.xaml.cs b/Wino.Core.WinUI/Controls/AccountCreationDialogControl.xaml.cs similarity index 80% rename from Wino.Core.UWP/Controls/AccountCreationDialogControl.xaml.cs rename to Wino.Core.WinUI/Controls/AccountCreationDialogControl.xaml.cs index 0cd1c098..fa08c732 100644 --- a/Wino.Core.UWP/Controls/AccountCreationDialogControl.xaml.cs +++ b/Wino.Core.WinUI/Controls/AccountCreationDialogControl.xaml.cs @@ -2,8 +2,8 @@ using System.Threading.Tasks; using CommunityToolkit.Mvvm.Messaging; using Microsoft.Extensions.DependencyInjection; -using Windows.UI.Xaml; -using Windows.UI.Xaml.Controls; +using Microsoft.UI.Xaml; +using Microsoft.UI.Xaml.Controls; using Wino.Core.Domain.Enums; using Wino.Core.Domain.Interfaces; using Wino.Messaging.UI; @@ -48,21 +48,21 @@ public sealed partial class AccountCreationDialogControl : UserControl, IRecipie await Dispatcher.RunAsync(Windows.UI.Core.CoreDispatcherPriority.Normal, () => { - AuthHelpDialogButton.Visibility = Windows.UI.Xaml.Visibility.Visible; + AuthHelpDialogButton.Visibility = Microsoft.UI.Xaml.Visibility.Visible; }); } - private void ControlLoaded(object sender, Windows.UI.Xaml.RoutedEventArgs e) + private void ControlLoaded(object sender, Microsoft.UI.Xaml.RoutedEventArgs e) { WeakReferenceMessenger.Default.Register(this); } - private void ControlUnloaded(object sender, Windows.UI.Xaml.RoutedEventArgs e) + private void ControlUnloaded(object sender, Microsoft.UI.Xaml.RoutedEventArgs e) { WeakReferenceMessenger.Default.UnregisterAll(this); } - private async void CopyClicked(object sender, Windows.UI.Xaml.RoutedEventArgs e) + private async void CopyClicked(object sender, Microsoft.UI.Xaml.RoutedEventArgs e) { if (string.IsNullOrEmpty(copyClipboardURL)) return; @@ -71,5 +71,5 @@ public sealed partial class AccountCreationDialogControl : UserControl, IRecipie } - private void CancelButtonClicked(object sender, Windows.UI.Xaml.RoutedEventArgs e) => CancelClicked?.Invoke(this, null); + private void CancelButtonClicked(object sender, Microsoft.UI.Xaml.RoutedEventArgs e) => CancelClicked?.Invoke(this, null); } diff --git a/Wino.Core.UWP/Controls/ControlConstants.cs b/Wino.Core.WinUI/Controls/ControlConstants.cs similarity index 100% rename from Wino.Core.UWP/Controls/ControlConstants.cs rename to Wino.Core.WinUI/Controls/ControlConstants.cs diff --git a/Wino.Core.UWP/Controls/CustomWrapPanel.cs b/Wino.Core.WinUI/Controls/CustomWrapPanel.cs similarity index 97% rename from Wino.Core.UWP/Controls/CustomWrapPanel.cs rename to Wino.Core.WinUI/Controls/CustomWrapPanel.cs index af875259..dd863ad5 100644 --- a/Wino.Core.UWP/Controls/CustomWrapPanel.cs +++ b/Wino.Core.WinUI/Controls/CustomWrapPanel.cs @@ -3,8 +3,8 @@ namespace Wino.Core.UWP.Controls { using Windows.Foundation; - using Windows.UI.Xaml; - using Windows.UI.Xaml.Controls; + using Microsoft.UI.Xaml; + using Microsoft.UI.Xaml.Controls; namespace CustomControls { diff --git a/Wino.Core.UWP/Controls/EqualGridPanel.cs b/Wino.Core.WinUI/Controls/EqualGridPanel.cs similarity index 97% rename from Wino.Core.UWP/Controls/EqualGridPanel.cs rename to Wino.Core.WinUI/Controls/EqualGridPanel.cs index e87eee1f..653d84f4 100644 --- a/Wino.Core.UWP/Controls/EqualGridPanel.cs +++ b/Wino.Core.WinUI/Controls/EqualGridPanel.cs @@ -1,6 +1,6 @@ using Windows.Foundation; -using Windows.UI.Xaml; -using Windows.UI.Xaml.Controls; +using Microsoft.UI.Xaml; +using Microsoft.UI.Xaml.Controls; namespace Wino.Core.UWP.Controls; diff --git a/Wino.Core.UWP/Controls/WinoAppTitleBar.xaml b/Wino.Core.WinUI/Controls/WinoAppTitleBar.xaml similarity index 100% rename from Wino.Core.UWP/Controls/WinoAppTitleBar.xaml rename to Wino.Core.WinUI/Controls/WinoAppTitleBar.xaml diff --git a/Wino.Core.UWP/Controls/WinoAppTitleBar.xaml.cs b/Wino.Core.WinUI/Controls/WinoAppTitleBar.xaml.cs similarity index 99% rename from Wino.Core.UWP/Controls/WinoAppTitleBar.xaml.cs rename to Wino.Core.WinUI/Controls/WinoAppTitleBar.xaml.cs index 734650a6..e8945435 100644 --- a/Wino.Core.UWP/Controls/WinoAppTitleBar.xaml.cs +++ b/Wino.Core.WinUI/Controls/WinoAppTitleBar.xaml.cs @@ -1,7 +1,7 @@ using System.Windows.Input; using Windows.Foundation; -using Windows.UI.Xaml; -using Windows.UI.Xaml.Controls; +using Microsoft.UI.Xaml; +using Microsoft.UI.Xaml.Controls; using Wino.Core.Domain.Enums; namespace Wino.Core.UWP.Controls; diff --git a/Wino.Core.UWP/Controls/WinoFontIcon.cs b/Wino.Core.WinUI/Controls/WinoFontIcon.cs similarity index 93% rename from Wino.Core.UWP/Controls/WinoFontIcon.cs rename to Wino.Core.WinUI/Controls/WinoFontIcon.cs index da9fe61e..345e7853 100644 --- a/Wino.Core.UWP/Controls/WinoFontIcon.cs +++ b/Wino.Core.WinUI/Controls/WinoFontIcon.cs @@ -1,5 +1,5 @@ -using Windows.UI.Xaml; -using Windows.UI.Xaml.Controls; +using Microsoft.UI.Xaml; +using Microsoft.UI.Xaml.Controls; namespace Wino.Core.UWP.Controls; @@ -116,7 +116,7 @@ public partial class WinoFontIcon : FontIcon public WinoFontIcon() { - FontFamily = new Windows.UI.Xaml.Media.FontFamily("ms-appx:///Wino.Core.UWP/Assets/WinoIcons.ttf#WinoIcons"); + FontFamily = new Microsoft.UI.Xaml.Media.FontFamily("/Wino.Core.WinUI/Assets/WinoIcons.ttf#WinoIcons"); FontSize = 32; } diff --git a/Wino.Core.UWP/Controls/WinoFontIconSource.cs b/Wino.Core.WinUI/Controls/WinoFontIconSource.cs similarity index 87% rename from Wino.Core.UWP/Controls/WinoFontIconSource.cs rename to Wino.Core.WinUI/Controls/WinoFontIconSource.cs index 7b2b0d1a..0472c9f7 100644 --- a/Wino.Core.UWP/Controls/WinoFontIconSource.cs +++ b/Wino.Core.WinUI/Controls/WinoFontIconSource.cs @@ -1,4 +1,4 @@ -using Windows.UI.Xaml; +using Microsoft.UI.Xaml; using Wino.Core.UWP.Controls; namespace Wino.Controls; @@ -15,7 +15,7 @@ public partial class WinoFontIconSource : Microsoft.UI.Xaml.Controls.FontIconSou public WinoFontIconSource() { - FontFamily = new Windows.UI.Xaml.Media.FontFamily("ms-appx:///Assets/WinoIcons.ttf#WinoIcons"); + FontFamily = new Microsoft.UI.Xaml.Media.FontFamily("ms-appx:///Assets/WinoIcons.ttf#WinoIcons"); FontSize = 32; } diff --git a/Wino.Core.UWP/Controls/WinoInfoBar.cs b/Wino.Core.WinUI/Controls/WinoInfoBar.cs similarity index 99% rename from Wino.Core.UWP/Controls/WinoInfoBar.cs rename to Wino.Core.WinUI/Controls/WinoInfoBar.cs index 4b6f60b0..c8635799 100644 --- a/Wino.Core.UWP/Controls/WinoInfoBar.cs +++ b/Wino.Core.WinUI/Controls/WinoInfoBar.cs @@ -2,7 +2,7 @@ using System.Numerics; using CommunityToolkit.WinUI.Animations; using Microsoft.UI.Xaml.Controls; -using Windows.UI.Xaml; +using Microsoft.UI.Xaml; using Wino.Core.Domain.Enums; namespace Wino.Core.UWP.Controls; diff --git a/Wino.Core.UWP/Controls/WinoNavigationViewItem.cs b/Wino.Core.WinUI/Controls/WinoNavigationViewItem.cs similarity index 96% rename from Wino.Core.UWP/Controls/WinoNavigationViewItem.cs rename to Wino.Core.WinUI/Controls/WinoNavigationViewItem.cs index 10e5149a..84faa937 100644 --- a/Wino.Core.UWP/Controls/WinoNavigationViewItem.cs +++ b/Wino.Core.WinUI/Controls/WinoNavigationViewItem.cs @@ -1,7 +1,7 @@ using System.Numerics; using Microsoft.UI.Xaml.Controls; -using Windows.UI.Xaml; -using Windows.UI.Xaml.Hosting; +using Microsoft.UI.Xaml; +using Microsoft.UI.Xaml.Hosting; namespace Wino.Core.UWP.Controls; diff --git a/Wino.Core.UWP/Converters/GridLengthConverter.cs b/Wino.Core.WinUI/Converters/GridLengthConverter.cs similarity index 91% rename from Wino.Core.UWP/Converters/GridLengthConverter.cs rename to Wino.Core.WinUI/Converters/GridLengthConverter.cs index 367e2f0e..1f7bd7ca 100644 --- a/Wino.Core.UWP/Converters/GridLengthConverter.cs +++ b/Wino.Core.WinUI/Converters/GridLengthConverter.cs @@ -1,6 +1,6 @@ using System; -using Windows.UI.Xaml; -using Windows.UI.Xaml.Data; +using Microsoft.UI.Xaml; +using Microsoft.UI.Xaml.Data; namespace Wino.Converters; diff --git a/Wino.Core.UWP/Converters/HexToColorBrushConverter.cs b/Wino.Core.WinUI/Converters/HexToColorBrushConverter.cs similarity index 96% rename from Wino.Core.UWP/Converters/HexToColorBrushConverter.cs rename to Wino.Core.WinUI/Converters/HexToColorBrushConverter.cs index a1ece0a4..6b9ec6a1 100644 --- a/Wino.Core.UWP/Converters/HexToColorBrushConverter.cs +++ b/Wino.Core.WinUI/Converters/HexToColorBrushConverter.cs @@ -1,9 +1,10 @@ using System; using System.Globalization; +using Microsoft.UI; +using Microsoft.UI.Xaml; +using Microsoft.UI.Xaml.Data; +using Microsoft.UI.Xaml.Media; using Windows.UI; -using Windows.UI.Xaml; -using Windows.UI.Xaml.Data; -using Windows.UI.Xaml.Media; namespace Wino.Core.UWP.Converters; diff --git a/Wino.Core.UWP/Converters/ReverseBooleanConverter.cs b/Wino.Core.WinUI/Converters/ReverseBooleanConverter.cs similarity index 93% rename from Wino.Core.UWP/Converters/ReverseBooleanConverter.cs rename to Wino.Core.WinUI/Converters/ReverseBooleanConverter.cs index 1e5a9f06..f251c4cc 100644 --- a/Wino.Core.UWP/Converters/ReverseBooleanConverter.cs +++ b/Wino.Core.WinUI/Converters/ReverseBooleanConverter.cs @@ -1,5 +1,5 @@ using System; -using Windows.UI.Xaml.Data; +using Microsoft.UI.Xaml.Data; namespace Wino.Converters; diff --git a/Wino.Core.UWP/Converters/ReverseBooleanToVisibilityConverter.cs b/Wino.Core.WinUI/Converters/ReverseBooleanToVisibilityConverter.cs similarity index 89% rename from Wino.Core.UWP/Converters/ReverseBooleanToVisibilityConverter.cs rename to Wino.Core.WinUI/Converters/ReverseBooleanToVisibilityConverter.cs index 39e2e0c3..56723386 100644 --- a/Wino.Core.UWP/Converters/ReverseBooleanToVisibilityConverter.cs +++ b/Wino.Core.WinUI/Converters/ReverseBooleanToVisibilityConverter.cs @@ -1,6 +1,6 @@ using System; -using Windows.UI.Xaml; -using Windows.UI.Xaml.Data; +using Microsoft.UI.Xaml; +using Microsoft.UI.Xaml.Data; namespace Wino.Converters; diff --git a/Wino.Core.UWP/CoreGeneric.xaml b/Wino.Core.WinUI/CoreGeneric.xaml similarity index 100% rename from Wino.Core.UWP/CoreGeneric.xaml rename to Wino.Core.WinUI/CoreGeneric.xaml diff --git a/Wino.Core.UWP/CoreGeneric.xaml.cs b/Wino.Core.WinUI/CoreGeneric.xaml.cs similarity index 82% rename from Wino.Core.UWP/CoreGeneric.xaml.cs rename to Wino.Core.WinUI/CoreGeneric.xaml.cs index a480b6a2..bdc34987 100644 --- a/Wino.Core.UWP/CoreGeneric.xaml.cs +++ b/Wino.Core.WinUI/CoreGeneric.xaml.cs @@ -1,4 +1,4 @@ -using Windows.UI.Xaml; +using Microsoft.UI.Xaml; namespace Wino.Core.UWP; diff --git a/Wino.Core.UWP/CoreUWPContainerSetup.cs b/Wino.Core.WinUI/CoreUWPContainerSetup.cs similarity index 95% rename from Wino.Core.UWP/CoreUWPContainerSetup.cs rename to Wino.Core.WinUI/CoreUWPContainerSetup.cs index 5869d67e..ed55061a 100644 --- a/Wino.Core.UWP/CoreUWPContainerSetup.cs +++ b/Wino.Core.WinUI/CoreUWPContainerSetup.cs @@ -1,6 +1,6 @@ using Microsoft.Extensions.DependencyInjection; +using Microsoft.UI.Xaml; using Windows.ApplicationModel.AppService; -using Windows.UI.Xaml; using Wino.Core.Domain.Interfaces; using Wino.Core.UWP.Services; using Wino.Core.ViewModels; @@ -21,7 +21,6 @@ public static class CoreUWPContainerSetup services.AddSingleton(); services.AddSingleton(); services.AddSingleton(); - services.AddSingleton(); services.AddSingleton(); services.AddSingleton(); services.AddSingleton(); diff --git a/Wino.Core.UWP/Dialogs/AccountCreationDialog.xaml b/Wino.Core.WinUI/Dialogs/AccountCreationDialog.xaml similarity index 100% rename from Wino.Core.UWP/Dialogs/AccountCreationDialog.xaml rename to Wino.Core.WinUI/Dialogs/AccountCreationDialog.xaml diff --git a/Wino.Core.UWP/Dialogs/AccountCreationDialog.xaml.cs b/Wino.Core.WinUI/Dialogs/AccountCreationDialog.xaml.cs similarity index 97% rename from Wino.Core.UWP/Dialogs/AccountCreationDialog.xaml.cs rename to Wino.Core.WinUI/Dialogs/AccountCreationDialog.xaml.cs index f10fbc1d..833d4725 100644 --- a/Wino.Core.UWP/Dialogs/AccountCreationDialog.xaml.cs +++ b/Wino.Core.WinUI/Dialogs/AccountCreationDialog.xaml.cs @@ -1,7 +1,7 @@ using System.Threading; using System.Threading.Tasks; -using Windows.UI.Xaml; -using Windows.UI.Xaml.Controls; +using Microsoft.UI.Xaml; +using Microsoft.UI.Xaml.Controls; using Wino.Core.Domain.Enums; using Wino.Core.Domain.Interfaces; diff --git a/Wino.Core.UWP/Dialogs/AccountPickerDialog.xaml b/Wino.Core.WinUI/Dialogs/AccountPickerDialog.xaml similarity index 100% rename from Wino.Core.UWP/Dialogs/AccountPickerDialog.xaml rename to Wino.Core.WinUI/Dialogs/AccountPickerDialog.xaml diff --git a/Wino.Core.UWP/Dialogs/AccountPickerDialog.xaml.cs b/Wino.Core.WinUI/Dialogs/AccountPickerDialog.xaml.cs similarity index 94% rename from Wino.Core.UWP/Dialogs/AccountPickerDialog.xaml.cs rename to Wino.Core.WinUI/Dialogs/AccountPickerDialog.xaml.cs index f07a4071..0802be5f 100644 --- a/Wino.Core.UWP/Dialogs/AccountPickerDialog.xaml.cs +++ b/Wino.Core.WinUI/Dialogs/AccountPickerDialog.xaml.cs @@ -1,5 +1,5 @@ using System.Collections.Generic; -using Windows.UI.Xaml.Controls; +using Microsoft.UI.Xaml.Controls; using Wino.Core.Domain.Entities.Shared; namespace Wino.Dialogs; diff --git a/Wino.Core.UWP/Dialogs/CustomMessageDialogInformationContainer.cs b/Wino.Core.WinUI/Dialogs/CustomMessageDialogInformationContainer.cs similarity index 100% rename from Wino.Core.UWP/Dialogs/CustomMessageDialogInformationContainer.cs rename to Wino.Core.WinUI/Dialogs/CustomMessageDialogInformationContainer.cs diff --git a/Wino.Core.UWP/Dialogs/CustomThemeBuilderDialog.xaml b/Wino.Core.WinUI/Dialogs/CustomThemeBuilderDialog.xaml similarity index 100% rename from Wino.Core.UWP/Dialogs/CustomThemeBuilderDialog.xaml rename to Wino.Core.WinUI/Dialogs/CustomThemeBuilderDialog.xaml diff --git a/Wino.Core.UWP/Dialogs/CustomThemeBuilderDialog.xaml.cs b/Wino.Core.WinUI/Dialogs/CustomThemeBuilderDialog.xaml.cs similarity index 91% rename from Wino.Core.UWP/Dialogs/CustomThemeBuilderDialog.xaml.cs rename to Wino.Core.WinUI/Dialogs/CustomThemeBuilderDialog.xaml.cs index d50dcc89..b446fe5f 100644 --- a/Wino.Core.UWP/Dialogs/CustomThemeBuilderDialog.xaml.cs +++ b/Wino.Core.WinUI/Dialogs/CustomThemeBuilderDialog.xaml.cs @@ -1,8 +1,8 @@ using System; using CommunityToolkit.WinUI.Helpers; using Microsoft.Extensions.DependencyInjection; -using Windows.UI.Xaml.Controls; -using Windows.UI.Xaml.Media; +using Microsoft.UI.Xaml.Controls; +using Microsoft.UI.Xaml.Media; using Wino.Core.Domain.Interfaces; using Wino.Core.UWP; @@ -43,7 +43,7 @@ public sealed partial class CustomThemeBuilderDialog : ContentDialog } } - private async void BrowseWallpaperClicked(object sender, Windows.UI.Xaml.RoutedEventArgs e) + private async void BrowseWallpaperClicked(object sender, Microsoft.UI.Xaml.RoutedEventArgs e) { var dialogService = WinoApplication.Current.Services.GetService(); diff --git a/Wino.Core.UWP/Dialogs/NewAccountDialog.xaml b/Wino.Core.WinUI/Dialogs/NewAccountDialog.xaml similarity index 100% rename from Wino.Core.UWP/Dialogs/NewAccountDialog.xaml rename to Wino.Core.WinUI/Dialogs/NewAccountDialog.xaml diff --git a/Wino.Core.UWP/Dialogs/NewAccountDialog.xaml.cs b/Wino.Core.WinUI/Dialogs/NewAccountDialog.xaml.cs similarity index 99% rename from Wino.Core.UWP/Dialogs/NewAccountDialog.xaml.cs rename to Wino.Core.WinUI/Dialogs/NewAccountDialog.xaml.cs index a2fafc04..a14c8226 100644 --- a/Wino.Core.UWP/Dialogs/NewAccountDialog.xaml.cs +++ b/Wino.Core.WinUI/Dialogs/NewAccountDialog.xaml.cs @@ -2,8 +2,8 @@ using System.Collections.Generic; using System.Linq; using Windows.System; -using Windows.UI.Xaml; -using Windows.UI.Xaml.Controls; +using Microsoft.UI.Xaml; +using Microsoft.UI.Xaml.Controls; using Wino.Core.Domain.Enums; using Wino.Core.Domain.Interfaces; using Wino.Core.Domain.Models.Accounts; diff --git a/Wino.Core.UWP/Dialogs/TextInputDialog.xaml b/Wino.Core.WinUI/Dialogs/TextInputDialog.xaml similarity index 100% rename from Wino.Core.UWP/Dialogs/TextInputDialog.xaml rename to Wino.Core.WinUI/Dialogs/TextInputDialog.xaml diff --git a/Wino.Core.UWP/Dialogs/TextInputDialog.xaml.cs b/Wino.Core.WinUI/Dialogs/TextInputDialog.xaml.cs similarity index 94% rename from Wino.Core.UWP/Dialogs/TextInputDialog.xaml.cs rename to Wino.Core.WinUI/Dialogs/TextInputDialog.xaml.cs index c0fabef2..b0572f22 100644 --- a/Wino.Core.UWP/Dialogs/TextInputDialog.xaml.cs +++ b/Wino.Core.WinUI/Dialogs/TextInputDialog.xaml.cs @@ -1,5 +1,5 @@ -using Windows.UI.Xaml; -using Windows.UI.Xaml.Controls; +using Microsoft.UI.Xaml; +using Microsoft.UI.Xaml.Controls; namespace Wino.Dialogs; diff --git a/Wino.Core.WinUI/Dispatcher.cs b/Wino.Core.WinUI/Dispatcher.cs new file mode 100644 index 00000000..3a8a391c --- /dev/null +++ b/Wino.Core.WinUI/Dispatcher.cs @@ -0,0 +1,19 @@ +using System; +using System.Threading.Tasks; +using CommunityToolkit.WinUI; +using Microsoft.UI.Dispatching; +using Wino.Core.Domain.Interfaces; + +namespace Wino.Core.UWP; + +public class WinUIDispatcher : IDispatcher +{ + private readonly DispatcherQueue _coreDispatcher; + + public WinUIDispatcher(DispatcherQueue coreDispatcher) + { + _coreDispatcher = coreDispatcher; + } + + public Task ExecuteOnUIThread(Action action) => _coreDispatcher.EnqueueAsync(action, DispatcherQueuePriority.Normal); +} diff --git a/Wino.Core.UWP/Extensions/AnimationExtensions.cs b/Wino.Core.WinUI/Extensions/AnimationExtensions.cs similarity index 98% rename from Wino.Core.UWP/Extensions/AnimationExtensions.cs rename to Wino.Core.WinUI/Extensions/AnimationExtensions.cs index 12c4d7d0..39d8db58 100644 --- a/Wino.Core.UWP/Extensions/AnimationExtensions.cs +++ b/Wino.Core.WinUI/Extensions/AnimationExtensions.cs @@ -5,8 +5,8 @@ using System.Numerics; using System.Text; using System.Threading.Tasks; using Windows.UI.Composition; -using Windows.UI.Xaml; -using Windows.UI.Xaml.Media.Animation; +using Microsoft.UI.Xaml; +using Microsoft.UI.Xaml.Media.Animation; namespace Wino.Extensions; diff --git a/Wino.Core.UWP/Extensions/CompositionEnums.cs b/Wino.Core.WinUI/Extensions/CompositionEnums.cs similarity index 100% rename from Wino.Core.UWP/Extensions/CompositionEnums.cs rename to Wino.Core.WinUI/Extensions/CompositionEnums.cs diff --git a/Wino.Core.UWP/Extensions/CompositionExtensions.Implicit.cs b/Wino.Core.WinUI/Extensions/CompositionExtensions.Implicit.cs similarity index 97% rename from Wino.Core.UWP/Extensions/CompositionExtensions.Implicit.cs rename to Wino.Core.WinUI/Extensions/CompositionExtensions.Implicit.cs index 17d1b0fb..ce6ce24f 100644 --- a/Wino.Core.UWP/Extensions/CompositionExtensions.Implicit.cs +++ b/Wino.Core.WinUI/Extensions/CompositionExtensions.Implicit.cs @@ -1,12 +1,8 @@ using System; -using System.Collections.Generic; -using System.Linq; using System.Numerics; -using System.Text; -using System.Threading.Tasks; -using Windows.UI.Composition; -using Windows.UI.Xaml; -using Windows.UI.Xaml.Hosting; +using Microsoft.UI.Composition; +using Microsoft.UI.Xaml; +using Microsoft.UI.Xaml.Hosting; namespace Wino.Extensions; diff --git a/Wino.Core.UWP/Extensions/ElementThemeExtensions.cs b/Wino.Core.WinUI/Extensions/ElementThemeExtensions.cs similarity index 96% rename from Wino.Core.UWP/Extensions/ElementThemeExtensions.cs rename to Wino.Core.WinUI/Extensions/ElementThemeExtensions.cs index 4413a2a6..6102830f 100644 --- a/Wino.Core.UWP/Extensions/ElementThemeExtensions.cs +++ b/Wino.Core.WinUI/Extensions/ElementThemeExtensions.cs @@ -1,4 +1,4 @@ -using Windows.UI.Xaml; +using Microsoft.UI.Xaml; using Wino.Core.Domain.Enums; namespace Wino.Core.UWP.Extensions; diff --git a/Wino.Core.UWP/Extensions/StartupTaskStateExtensions.cs b/Wino.Core.WinUI/Extensions/StartupTaskStateExtensions.cs similarity index 100% rename from Wino.Core.UWP/Extensions/StartupTaskStateExtensions.cs rename to Wino.Core.WinUI/Extensions/StartupTaskStateExtensions.cs diff --git a/Wino.Core.UWP/Extensions/StorageFileExtensions.cs b/Wino.Core.WinUI/Extensions/StorageFileExtensions.cs similarity index 100% rename from Wino.Core.UWP/Extensions/StorageFileExtensions.cs rename to Wino.Core.WinUI/Extensions/StorageFileExtensions.cs diff --git a/Wino.Core.UWP/Extensions/UIExtensions.cs b/Wino.Core.WinUI/Extensions/UIExtensions.cs similarity index 100% rename from Wino.Core.UWP/Extensions/UIExtensions.cs rename to Wino.Core.WinUI/Extensions/UIExtensions.cs diff --git a/Wino.Core.UWP/Extensions/UtilExtensions.cs b/Wino.Core.WinUI/Extensions/UtilExtensions.cs similarity index 95% rename from Wino.Core.UWP/Extensions/UtilExtensions.cs rename to Wino.Core.WinUI/Extensions/UtilExtensions.cs index 6360a5df..5e1f280f 100644 --- a/Wino.Core.UWP/Extensions/UtilExtensions.cs +++ b/Wino.Core.WinUI/Extensions/UtilExtensions.cs @@ -1,12 +1,12 @@ using System; using System.Collections.Generic; using System.Linq; +using Microsoft.UI.Composition; +using Microsoft.UI.Xaml; +using Microsoft.UI.Xaml.Controls; +using Microsoft.UI.Xaml.Hosting; +using Microsoft.UI.Xaml.Media; using Windows.Foundation; -using Windows.UI.Composition; -using Windows.UI.Xaml; -using Windows.UI.Xaml.Controls; -using Windows.UI.Xaml.Hosting; -using Windows.UI.Xaml.Media; namespace Wino.Extensions; diff --git a/Wino.Core.UWP/Extensions/WebViewExtensions.cs b/Wino.Core.WinUI/Extensions/WebViewExtensions.cs similarity index 100% rename from Wino.Core.UWP/Extensions/WebViewExtensions.cs rename to Wino.Core.WinUI/Extensions/WebViewExtensions.cs diff --git a/Wino.Core.UWP/Helpers/WinoVisualTreeHelper.cs b/Wino.Core.WinUI/Helpers/WinoVisualTreeHelper.cs similarity index 96% rename from Wino.Core.UWP/Helpers/WinoVisualTreeHelper.cs rename to Wino.Core.WinUI/Helpers/WinoVisualTreeHelper.cs index 86f8181c..39c96cd7 100644 --- a/Wino.Core.UWP/Helpers/WinoVisualTreeHelper.cs +++ b/Wino.Core.WinUI/Helpers/WinoVisualTreeHelper.cs @@ -1,6 +1,6 @@ using System.Collections.Generic; -using Windows.UI.Xaml; -using Windows.UI.Xaml.Media; +using Microsoft.UI.Xaml; +using Microsoft.UI.Xaml.Media; namespace Wino.Helpers; diff --git a/Wino.Core.UWP/Helpers/XamlHelpers.cs b/Wino.Core.WinUI/Helpers/XamlHelpers.cs similarity index 98% rename from Wino.Core.UWP/Helpers/XamlHelpers.cs rename to Wino.Core.WinUI/Helpers/XamlHelpers.cs index 721b45d5..77797c4f 100644 --- a/Wino.Core.UWP/Helpers/XamlHelpers.cs +++ b/Wino.Core.WinUI/Helpers/XamlHelpers.cs @@ -2,14 +2,15 @@ using System.Globalization; using System.Linq; using CommunityToolkit.WinUI.Helpers; +using Microsoft.UI; +using Microsoft.UI.Text; +using Microsoft.UI.Xaml; using Microsoft.UI.Xaml.Controls; +using Microsoft.UI.Xaml.Controls.Primitives; +using Microsoft.UI.Xaml.Markup; +using Microsoft.UI.Xaml.Media; using Windows.UI; using Windows.UI.Text; -using Windows.UI.Xaml; -using Windows.UI.Xaml.Controls; -using Windows.UI.Xaml.Controls.Primitives; -using Windows.UI.Xaml.Markup; -using Windows.UI.Xaml.Media; using Wino.Core.Domain; using Wino.Core.Domain.Entities.Shared; using Wino.Core.Domain.Enums; @@ -295,7 +296,7 @@ public static class XamlHelpers "" + "" + pathMarkup + ""; - var path = XamlReader.Load(xaml) as Windows.UI.Xaml.Shapes.Path; + var path = XamlReader.Load(xaml) as Microsoft.UI.Xaml.Shapes.Path; Geometry geometry = path.Data; path.Data = null; diff --git a/Wino.Core.WinUI/Interfaces/IWinoShellWindow.cs b/Wino.Core.WinUI/Interfaces/IWinoShellWindow.cs new file mode 100644 index 00000000..2a504fdf --- /dev/null +++ b/Wino.Core.WinUI/Interfaces/IWinoShellWindow.cs @@ -0,0 +1,11 @@ +using Microsoft.UI.Xaml; +using Microsoft.UI.Xaml.Controls; + +namespace Wino.Core.WinUI.Interfaces; + +public interface IWinoShellWindow +{ + void HandleAppActivation(LaunchActivatedEventArgs args); + Microsoft.UI.Xaml.Controls.TitleBar GetTitleBar(); + Frame GetMainFrame(); +} diff --git a/Wino.Core.UWP/Models/Personalization/CustomAppTheme.cs b/Wino.Core.WinUI/Models/Personalization/CustomAppTheme.cs similarity index 100% rename from Wino.Core.UWP/Models/Personalization/CustomAppTheme.cs rename to Wino.Core.WinUI/Models/Personalization/CustomAppTheme.cs diff --git a/Wino.Core.UWP/Models/Personalization/PreDefinedAppTheme.cs b/Wino.Core.WinUI/Models/Personalization/PreDefinedAppTheme.cs similarity index 100% rename from Wino.Core.UWP/Models/Personalization/PreDefinedAppTheme.cs rename to Wino.Core.WinUI/Models/Personalization/PreDefinedAppTheme.cs diff --git a/Wino.Core.UWP/Models/Personalization/SystemAppTheme.cs b/Wino.Core.WinUI/Models/Personalization/SystemAppTheme.cs similarity index 100% rename from Wino.Core.UWP/Models/Personalization/SystemAppTheme.cs rename to Wino.Core.WinUI/Models/Personalization/SystemAppTheme.cs diff --git a/Wino.Core.UWP/Selectors/AppThemePreviewTemplateSelector.cs b/Wino.Core.WinUI/Selectors/AppThemePreviewTemplateSelector.cs similarity index 91% rename from Wino.Core.UWP/Selectors/AppThemePreviewTemplateSelector.cs rename to Wino.Core.WinUI/Selectors/AppThemePreviewTemplateSelector.cs index 6ed85638..e2462e6e 100644 --- a/Wino.Core.UWP/Selectors/AppThemePreviewTemplateSelector.cs +++ b/Wino.Core.WinUI/Selectors/AppThemePreviewTemplateSelector.cs @@ -1,5 +1,5 @@ -using Windows.UI.Xaml; -using Windows.UI.Xaml.Controls; +using Microsoft.UI.Xaml; +using Microsoft.UI.Xaml.Controls; using Wino.Core.UWP.Models.Personalization; namespace Wino.Core.UWP.Selectors; diff --git a/Wino.Core.UWP/Selectors/CustomWinoMessageDialogIconSelector.cs b/Wino.Core.WinUI/Selectors/CustomWinoMessageDialogIconSelector.cs similarity index 95% rename from Wino.Core.UWP/Selectors/CustomWinoMessageDialogIconSelector.cs rename to Wino.Core.WinUI/Selectors/CustomWinoMessageDialogIconSelector.cs index bed04e3f..2187228c 100644 --- a/Wino.Core.UWP/Selectors/CustomWinoMessageDialogIconSelector.cs +++ b/Wino.Core.WinUI/Selectors/CustomWinoMessageDialogIconSelector.cs @@ -1,6 +1,6 @@ using System; -using Windows.UI.Xaml; -using Windows.UI.Xaml.Controls; +using Microsoft.UI.Xaml; +using Microsoft.UI.Xaml.Controls; using Wino.Core.Domain.Enums; namespace Wino.Core.UWP.Selectors; diff --git a/Wino.Core.UWP/Selectors/FileAttachmentTypeSelector.cs b/Wino.Core.WinUI/Selectors/FileAttachmentTypeSelector.cs similarity index 96% rename from Wino.Core.UWP/Selectors/FileAttachmentTypeSelector.cs rename to Wino.Core.WinUI/Selectors/FileAttachmentTypeSelector.cs index 1bef19a3..79740e8d 100644 --- a/Wino.Core.UWP/Selectors/FileAttachmentTypeSelector.cs +++ b/Wino.Core.WinUI/Selectors/FileAttachmentTypeSelector.cs @@ -1,5 +1,5 @@ -using Windows.UI.Xaml; -using Windows.UI.Xaml.Controls; +using Microsoft.UI.Xaml; +using Microsoft.UI.Xaml.Controls; using Wino.Core.Domain.Enums; namespace Wino.Core.UWP.Selectors; diff --git a/Wino.Core.UWP/Selectors/NavigationMenuTemplateSelector.cs b/Wino.Core.WinUI/Selectors/NavigationMenuTemplateSelector.cs similarity index 97% rename from Wino.Core.UWP/Selectors/NavigationMenuTemplateSelector.cs rename to Wino.Core.WinUI/Selectors/NavigationMenuTemplateSelector.cs index 516f82ca..483db210 100644 --- a/Wino.Core.UWP/Selectors/NavigationMenuTemplateSelector.cs +++ b/Wino.Core.WinUI/Selectors/NavigationMenuTemplateSelector.cs @@ -1,5 +1,5 @@ -using Windows.UI.Xaml; -using Windows.UI.Xaml.Controls; +using Microsoft.UI.Xaml; +using Microsoft.UI.Xaml.Controls; using Wino.Core.Domain.MenuItems; namespace Wino.Core.UWP.Selectors; diff --git a/Wino.Core.UWP/Services/ApplicationResourceManager.cs b/Wino.Core.WinUI/Services/ApplicationResourceManager.cs similarity index 97% rename from Wino.Core.UWP/Services/ApplicationResourceManager.cs rename to Wino.Core.WinUI/Services/ApplicationResourceManager.cs index d572c9e8..d2996d10 100644 --- a/Wino.Core.UWP/Services/ApplicationResourceManager.cs +++ b/Wino.Core.WinUI/Services/ApplicationResourceManager.cs @@ -1,5 +1,5 @@ using System.Linq; -using Windows.UI.Xaml; +using Microsoft.UI.Xaml; using Wino.Core.Domain.Interfaces; using Wino.Core.UWP; diff --git a/Wino.Core.UWP/Services/ClipboardService.cs b/Wino.Core.WinUI/Services/ClipboardService.cs similarity index 100% rename from Wino.Core.UWP/Services/ClipboardService.cs rename to Wino.Core.WinUI/Services/ClipboardService.cs diff --git a/Wino.Core.UWP/Services/ConfigurationService.cs b/Wino.Core.WinUI/Services/ConfigurationService.cs similarity index 100% rename from Wino.Core.UWP/Services/ConfigurationService.cs rename to Wino.Core.WinUI/Services/ConfigurationService.cs diff --git a/Wino.Core.UWP/Services/DialogServiceBase.cs b/Wino.Core.WinUI/Services/DialogServiceBase.cs similarity index 99% rename from Wino.Core.UWP/Services/DialogServiceBase.cs rename to Wino.Core.WinUI/Services/DialogServiceBase.cs index afb431df..0159ba0c 100644 --- a/Wino.Core.UWP/Services/DialogServiceBase.cs +++ b/Wino.Core.WinUI/Services/DialogServiceBase.cs @@ -7,8 +7,8 @@ using Serilog; using Windows.Storage; using Windows.Storage.AccessCache; using Windows.Storage.Pickers; -using Windows.UI.Xaml; -using Windows.UI.Xaml.Controls; +using Microsoft.UI.Xaml; +using Microsoft.UI.Xaml.Controls; using Wino.Core.Domain; using Wino.Core.Domain.Enums; using Wino.Core.Domain.Interfaces; diff --git a/Wino.Core.UWP/Services/FileService.cs b/Wino.Core.WinUI/Services/FileService.cs similarity index 100% rename from Wino.Core.UWP/Services/FileService.cs rename to Wino.Core.WinUI/Services/FileService.cs diff --git a/Wino.Core.UWP/Services/KeyPressService.cs b/Wino.Core.WinUI/Services/KeyPressService.cs similarity index 94% rename from Wino.Core.UWP/Services/KeyPressService.cs rename to Wino.Core.WinUI/Services/KeyPressService.cs index 664682ee..5fe3e3f1 100644 --- a/Wino.Core.UWP/Services/KeyPressService.cs +++ b/Wino.Core.WinUI/Services/KeyPressService.cs @@ -1,6 +1,6 @@ using Windows.System; using Windows.UI.Core; -using Windows.UI.Xaml; +using Microsoft.UI.Xaml; using Wino.Core.Domain.Interfaces; namespace Wino.Core.UWP.Services; diff --git a/Wino.Core.UWP/Services/NativeAppService.cs b/Wino.Core.WinUI/Services/NativeAppService.cs similarity index 98% rename from Wino.Core.UWP/Services/NativeAppService.cs rename to Wino.Core.WinUI/Services/NativeAppService.cs index eb38b19e..b05ca9a3 100644 --- a/Wino.Core.UWP/Services/NativeAppService.cs +++ b/Wino.Core.WinUI/Services/NativeAppService.cs @@ -10,8 +10,8 @@ using Wino.Core.Domain.Interfaces; #if WINDOWS_UWP -using Windows.UI.Xaml; -using Windows.UI.Xaml.Controls; +using Microsoft.UI.Xaml; +using Microsoft.UI.Xaml.Controls; #endif namespace Wino.Services; diff --git a/Wino.Core.UWP/Services/NavigationServiceBase.cs b/Wino.Core.WinUI/Services/NavigationServiceBase.cs similarity index 90% rename from Wino.Core.UWP/Services/NavigationServiceBase.cs rename to Wino.Core.WinUI/Services/NavigationServiceBase.cs index 4e2fcf37..f476c561 100644 --- a/Wino.Core.UWP/Services/NavigationServiceBase.cs +++ b/Wino.Core.WinUI/Services/NavigationServiceBase.cs @@ -1,6 +1,6 @@ using System; -using Windows.UI.Xaml.Controls; -using Windows.UI.Xaml.Media.Animation; +using Microsoft.UI.Xaml.Controls; +using Microsoft.UI.Xaml.Media.Animation; using Wino.Core.Domain.Models.Navigation; namespace Wino.Core.UWP.Services; diff --git a/Wino.Core.UWP/Services/NotificationBuilder.cs b/Wino.Core.WinUI/Services/NotificationBuilder.cs similarity index 99% rename from Wino.Core.UWP/Services/NotificationBuilder.cs rename to Wino.Core.WinUI/Services/NotificationBuilder.cs index 722979c3..73d3d7d2 100644 --- a/Wino.Core.UWP/Services/NotificationBuilder.cs +++ b/Wino.Core.WinUI/Services/NotificationBuilder.cs @@ -4,7 +4,7 @@ using System.IO; using System.Linq; using System.Threading.Tasks; using CommunityToolkit.Mvvm.Messaging; -using CommunityToolkit.WinUI.Notifications; +using Microsoft.Toolkit.Uwp.Notifications; using Serilog; using Windows.Data.Xml.Dom; using Windows.UI.Notifications; diff --git a/Wino.Core.UWP/Services/PreferencesService.cs b/Wino.Core.WinUI/Services/PreferencesService.cs similarity index 100% rename from Wino.Core.UWP/Services/PreferencesService.cs rename to Wino.Core.WinUI/Services/PreferencesService.cs diff --git a/Wino.Core.UWP/Services/PrintService.cs b/Wino.Core.WinUI/Services/PrintService.cs similarity index 100% rename from Wino.Core.UWP/Services/PrintService.cs rename to Wino.Core.WinUI/Services/PrintService.cs diff --git a/Wino.Core.UWP/Services/StartupBehaviorService.cs b/Wino.Core.WinUI/Services/StartupBehaviorService.cs similarity index 100% rename from Wino.Core.UWP/Services/StartupBehaviorService.cs rename to Wino.Core.WinUI/Services/StartupBehaviorService.cs diff --git a/Wino.Core.UWP/Services/StatePersistenceService.cs b/Wino.Core.WinUI/Services/StatePersistenceService.cs similarity index 94% rename from Wino.Core.UWP/Services/StatePersistenceService.cs rename to Wino.Core.WinUI/Services/StatePersistenceService.cs index b04707eb..c47d6bd1 100644 --- a/Wino.Core.UWP/Services/StatePersistenceService.cs +++ b/Wino.Core.WinUI/Services/StatePersistenceService.cs @@ -3,6 +3,7 @@ using System.ComponentModel; using CommunityToolkit.Mvvm.ComponentModel; using Wino.Core.Domain.Enums; using Wino.Core.Domain.Interfaces; +using Wino.Core.UWP; namespace Wino.Services; @@ -133,11 +134,5 @@ public class StatePersistenceService : ObservableObject, IStatePersistanceServic } } - private void UpdateAppCoreWindowTitle() - { - var appView = Windows.UI.ViewManagement.ApplicationView.GetForCurrentView(); - - if (appView != null) - appView.Title = CoreWindowTitle; - } + private void UpdateAppCoreWindowTitle() => WinoApplication.MainWindow.Title = CoreWindowTitle; } diff --git a/Wino.Core.UWP/Services/StoreManagementService.cs b/Wino.Core.WinUI/Services/StoreManagementService.cs similarity index 100% rename from Wino.Core.UWP/Services/StoreManagementService.cs rename to Wino.Core.WinUI/Services/StoreManagementService.cs diff --git a/Wino.Core.UWP/Services/StoreRatingService.cs b/Wino.Core.WinUI/Services/StoreRatingService.cs similarity index 100% rename from Wino.Core.UWP/Services/StoreRatingService.cs rename to Wino.Core.WinUI/Services/StoreRatingService.cs diff --git a/Wino.Core.UWP/Services/ThemeService.cs b/Wino.Core.WinUI/Services/ThemeService.cs similarity index 98% rename from Wino.Core.UWP/Services/ThemeService.cs rename to Wino.Core.WinUI/Services/ThemeService.cs index 522f4ffd..91bf8465 100644 --- a/Wino.Core.UWP/Services/ThemeService.cs +++ b/Wino.Core.WinUI/Services/ThemeService.cs @@ -8,19 +8,20 @@ using System.Text.Json; using System.Threading.Tasks; using CommunityToolkit.Mvvm.Messaging; using CommunityToolkit.WinUI.Helpers; +using Microsoft.UI; +using Microsoft.UI.Xaml; +using Microsoft.UI.Xaml.Controls; +using Microsoft.UI.Xaml.Markup; +using Microsoft.UI.Xaml.Media; using Windows.Storage; -using Windows.UI; using Windows.UI.ViewManagement; -using Windows.UI.Xaml; -using Windows.UI.Xaml.Controls; -using Windows.UI.Xaml.Markup; -using Windows.UI.Xaml.Media; using Wino.Core.Domain; using Wino.Core.Domain.Enums; using Wino.Core.Domain.Exceptions; using Wino.Core.Domain.Interfaces; using Wino.Core.Domain.Models; using Wino.Core.Domain.Models.Personalization; +using Wino.Core.UWP; using Wino.Core.UWP.Extensions; using Wino.Core.UWP.Models.Personalization; using Wino.Core.UWP.Services; @@ -161,7 +162,7 @@ public class ThemeService : IThemeService // Save reference as this might be null when the user is in another app - mainApplicationFrame = Window.Current.Content as Frame; + mainApplicationFrame = WinoApplication.MainWindow.Content as Frame; if (mainApplicationFrame == null) return; diff --git a/Wino.Core.UWP/Services/ThumbnailService.cs b/Wino.Core.WinUI/Services/ThumbnailService.cs similarity index 100% rename from Wino.Core.UWP/Services/ThumbnailService.cs rename to Wino.Core.WinUI/Services/ThumbnailService.cs diff --git a/Wino.Core.UWP/Services/UnderlyingThemeService.cs b/Wino.Core.WinUI/Services/UnderlyingThemeService.cs similarity index 100% rename from Wino.Core.UWP/Services/UnderlyingThemeService.cs rename to Wino.Core.WinUI/Services/UnderlyingThemeService.cs diff --git a/Wino.Core.UWP/Services/WinoServerConnectionManager.cs b/Wino.Core.WinUI/Services/WinoServerConnectionManager.cs similarity index 100% rename from Wino.Core.UWP/Services/WinoServerConnectionManager.cs rename to Wino.Core.WinUI/Services/WinoServerConnectionManager.cs diff --git a/Wino.Core.UWP/Styles/Colors.xaml b/Wino.Core.WinUI/Styles/Colors.xaml similarity index 100% rename from Wino.Core.UWP/Styles/Colors.xaml rename to Wino.Core.WinUI/Styles/Colors.xaml diff --git a/Wino.Core.UWP/Styles/ContentPresenters.xaml b/Wino.Core.WinUI/Styles/ContentPresenters.xaml similarity index 100% rename from Wino.Core.UWP/Styles/ContentPresenters.xaml rename to Wino.Core.WinUI/Styles/ContentPresenters.xaml diff --git a/Wino.Core.UWP/Styles/Converters.xaml b/Wino.Core.WinUI/Styles/Converters.xaml similarity index 100% rename from Wino.Core.UWP/Styles/Converters.xaml rename to Wino.Core.WinUI/Styles/Converters.xaml diff --git a/Wino.Core.UWP/Styles/CustomMessageDialogStyles.xaml b/Wino.Core.WinUI/Styles/CustomMessageDialogStyles.xaml similarity index 100% rename from Wino.Core.UWP/Styles/CustomMessageDialogStyles.xaml rename to Wino.Core.WinUI/Styles/CustomMessageDialogStyles.xaml diff --git a/Wino.Core.UWP/Styles/CustomMessageDialogStyles.xaml.cs b/Wino.Core.WinUI/Styles/CustomMessageDialogStyles.xaml.cs similarity index 86% rename from Wino.Core.UWP/Styles/CustomMessageDialogStyles.xaml.cs rename to Wino.Core.WinUI/Styles/CustomMessageDialogStyles.xaml.cs index 68d108bd..ae121634 100644 --- a/Wino.Core.UWP/Styles/CustomMessageDialogStyles.xaml.cs +++ b/Wino.Core.WinUI/Styles/CustomMessageDialogStyles.xaml.cs @@ -1,4 +1,4 @@ -using Windows.UI.Xaml; +using Microsoft.UI.Xaml; namespace Wino.Core.UWP.Styles; diff --git a/Wino.Core.UWP/Styles/DataTemplates.xaml b/Wino.Core.WinUI/Styles/DataTemplates.xaml similarity index 100% rename from Wino.Core.UWP/Styles/DataTemplates.xaml rename to Wino.Core.WinUI/Styles/DataTemplates.xaml diff --git a/Wino.Core.UWP/Styles/DataTemplates.xaml.cs b/Wino.Core.WinUI/Styles/DataTemplates.xaml.cs similarity index 85% rename from Wino.Core.UWP/Styles/DataTemplates.xaml.cs rename to Wino.Core.WinUI/Styles/DataTemplates.xaml.cs index b83047fc..1179966d 100644 --- a/Wino.Core.UWP/Styles/DataTemplates.xaml.cs +++ b/Wino.Core.WinUI/Styles/DataTemplates.xaml.cs @@ -1,4 +1,4 @@ -using Windows.UI.Xaml; +using Microsoft.UI.Xaml; namespace Wino.Core.UWP.Styles; diff --git a/Wino.Core.UWP/Styles/FontIcons.xaml b/Wino.Core.WinUI/Styles/FontIcons.xaml similarity index 100% rename from Wino.Core.UWP/Styles/FontIcons.xaml rename to Wino.Core.WinUI/Styles/FontIcons.xaml diff --git a/Wino.Core.UWP/Styles/IconTemplates.xaml b/Wino.Core.WinUI/Styles/IconTemplates.xaml similarity index 100% rename from Wino.Core.UWP/Styles/IconTemplates.xaml rename to Wino.Core.WinUI/Styles/IconTemplates.xaml diff --git a/Wino.Core.UWP/Styles/SharedStyles.xaml b/Wino.Core.WinUI/Styles/SharedStyles.xaml similarity index 100% rename from Wino.Core.UWP/Styles/SharedStyles.xaml rename to Wino.Core.WinUI/Styles/SharedStyles.xaml diff --git a/Wino.Core.UWP/Styles/WinoInfoBar.xaml b/Wino.Core.WinUI/Styles/WinoInfoBar.xaml similarity index 100% rename from Wino.Core.UWP/Styles/WinoInfoBar.xaml rename to Wino.Core.WinUI/Styles/WinoInfoBar.xaml diff --git a/Wino.Core.UWP/Views/Abstract/ManageAccountsPageAbstract.cs b/Wino.Core.WinUI/Views/Abstract/ManageAccountsPageAbstract.cs similarity index 100% rename from Wino.Core.UWP/Views/Abstract/ManageAccountsPageAbstract.cs rename to Wino.Core.WinUI/Views/Abstract/ManageAccountsPageAbstract.cs diff --git a/Wino.Core.UWP/Views/Abstract/SettingOptionsPageAbstract.cs b/Wino.Core.WinUI/Views/Abstract/SettingOptionsPageAbstract.cs similarity index 100% rename from Wino.Core.UWP/Views/Abstract/SettingOptionsPageAbstract.cs rename to Wino.Core.WinUI/Views/Abstract/SettingOptionsPageAbstract.cs diff --git a/Wino.Core.UWP/Views/Abstract/SettingsPageAbstract.cs b/Wino.Core.WinUI/Views/Abstract/SettingsPageAbstract.cs similarity index 100% rename from Wino.Core.UWP/Views/Abstract/SettingsPageAbstract.cs rename to Wino.Core.WinUI/Views/Abstract/SettingsPageAbstract.cs diff --git a/Wino.Core.UWP/Views/Abstract/SettingsPageBase.cs b/Wino.Core.WinUI/Views/Abstract/SettingsPageBase.cs similarity index 94% rename from Wino.Core.UWP/Views/Abstract/SettingsPageBase.cs rename to Wino.Core.WinUI/Views/Abstract/SettingsPageBase.cs index efb19ffa..b4246735 100644 --- a/Wino.Core.UWP/Views/Abstract/SettingsPageBase.cs +++ b/Wino.Core.WinUI/Views/Abstract/SettingsPageBase.cs @@ -1,4 +1,4 @@ -using Windows.UI.Xaml; +using Microsoft.UI.Xaml; using Wino.Core.UWP; using Wino.Core.ViewModels; diff --git a/Wino.Core.UWP/Views/ManageAccountsPage.xaml b/Wino.Core.WinUI/Views/ManageAccountsPage.xaml similarity index 100% rename from Wino.Core.UWP/Views/ManageAccountsPage.xaml rename to Wino.Core.WinUI/Views/ManageAccountsPage.xaml diff --git a/Wino.Core.UWP/Views/ManageAccountsPage.xaml.cs b/Wino.Core.WinUI/Views/ManageAccountsPage.xaml.cs similarity index 97% rename from Wino.Core.UWP/Views/ManageAccountsPage.xaml.cs rename to Wino.Core.WinUI/Views/ManageAccountsPage.xaml.cs index a3da8717..b9efc311 100644 --- a/Wino.Core.UWP/Views/ManageAccountsPage.xaml.cs +++ b/Wino.Core.WinUI/Views/ManageAccountsPage.xaml.cs @@ -3,8 +3,8 @@ using System.Collections.ObjectModel; using System.Linq; using CommunityToolkit.Mvvm.Messaging; using MoreLinq; -using Windows.UI.Xaml.Media.Animation; -using Windows.UI.Xaml.Navigation; +using Microsoft.UI.Xaml.Media.Animation; +using Microsoft.UI.Xaml.Navigation; using Wino.Core.Domain; using Wino.Core.Domain.Enums; using Wino.Core.UWP.Views.Abstract; diff --git a/Wino.Core.UWP/Views/SettingOptionsPage.xaml b/Wino.Core.WinUI/Views/SettingOptionsPage.xaml similarity index 100% rename from Wino.Core.UWP/Views/SettingOptionsPage.xaml rename to Wino.Core.WinUI/Views/SettingOptionsPage.xaml diff --git a/Wino.Core.UWP/Views/SettingOptionsPage.xaml.cs b/Wino.Core.WinUI/Views/SettingOptionsPage.xaml.cs similarity index 100% rename from Wino.Core.UWP/Views/SettingOptionsPage.xaml.cs rename to Wino.Core.WinUI/Views/SettingOptionsPage.xaml.cs diff --git a/Wino.Core.UWP/Views/SettingsPage.xaml b/Wino.Core.WinUI/Views/SettingsPage.xaml similarity index 100% rename from Wino.Core.UWP/Views/SettingsPage.xaml rename to Wino.Core.WinUI/Views/SettingsPage.xaml diff --git a/Wino.Core.UWP/Views/SettingsPage.xaml.cs b/Wino.Core.WinUI/Views/SettingsPage.xaml.cs similarity index 97% rename from Wino.Core.UWP/Views/SettingsPage.xaml.cs rename to Wino.Core.WinUI/Views/SettingsPage.xaml.cs index 84e8c4db..266e1191 100644 --- a/Wino.Core.UWP/Views/SettingsPage.xaml.cs +++ b/Wino.Core.WinUI/Views/SettingsPage.xaml.cs @@ -2,8 +2,8 @@ using System.Linq; using CommunityToolkit.Mvvm.Messaging; using MoreLinq; -using Windows.UI.Xaml.Media.Animation; -using Windows.UI.Xaml.Navigation; +using Microsoft.UI.Xaml.Media.Animation; +using Microsoft.UI.Xaml.Navigation; using Wino.Core.Domain; using Wino.Core.Domain.Enums; using Wino.Mail.ViewModels.Data; diff --git a/Wino.Core.WinUI/Wino.Core.WinUI.csproj b/Wino.Core.WinUI/Wino.Core.WinUI.csproj new file mode 100644 index 00000000..e1afcf2f --- /dev/null +++ b/Wino.Core.WinUI/Wino.Core.WinUI.csproj @@ -0,0 +1,89 @@ + + + net10.0-windows10.0.19041.0 + 10.0.17763.0 + Wino.Core.WinUI + x86;x64;arm64 + win-x86;win-x64;win-arm64 + true + + + + MSBuild:Compile + + + MSBuild:Compile + + + MSBuild:Compile + + + MSBuild:Compile + + + MSBuild:Compile + + + MSBuild:Compile + + + MSBuild:Compile + + + MSBuild:Compile + + + MSBuild:Compile + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/Wino.Core.WinUI/WinoApplication.cs b/Wino.Core.WinUI/WinoApplication.cs new file mode 100644 index 00000000..864e3f41 --- /dev/null +++ b/Wino.Core.WinUI/WinoApplication.cs @@ -0,0 +1,129 @@ +using System; +using System.Collections.Generic; +using System.Globalization; +using System.IO; +using System.Linq; +using System.Threading.Tasks; +using CommunityToolkit.Mvvm.Messaging; +using Microsoft.Extensions.DependencyInjection; +using Microsoft.UI.Xaml; +using Microsoft.Windows.Globalization; +using Nito.AsyncEx; +using Serilog; +using Windows.ApplicationModel.Activation; +using Windows.ApplicationModel.AppService; +using Windows.ApplicationModel.Core; +using Windows.Foundation.Metadata; +using Windows.Storage; +using Wino.Core.Domain; +using Wino.Core.Domain.Interfaces; +using Wino.Core.Domain.Models.Translations; +using Wino.Messaging.Client.Shell; +using Wino.Services; +using WinUIEx; + +namespace Wino.Core.UWP; + +public abstract class WinoApplication : Application, IRecipient +{ + public new static WinoApplication Current => (WinoApplication)Application.Current; + public const string WinoLaunchLogPrefix = "[Wino Launch] "; + + public IServiceProvider Services { get; } + protected IWinoLogger LogInitializer { get; } + protected IApplicationConfiguration AppConfiguration { get; } + protected IWinoServerConnectionManager AppServiceConnectionManager { get; } + public IThemeService ThemeService { get; } + public IUnderlyingThemeService UnderlyingThemeService { get; } + public IThumbnailService ThumbnailService { get; } + protected IDatabaseService DatabaseService { get; } + protected ITranslationService TranslationService { get; } + + public static WindowEx MainWindow { get; set; } + + protected WinoApplication() + { + ConfigurePrelaunch(); + + Services = ConfigureServices(); + + AppDomain.CurrentDomain.UnhandledException += CurrentDomain_UnhandledException; + TaskScheduler.UnobservedTaskException += OnUnobservedTaskException; + UnhandledException += OnAppUnhandledException; + + LogInitializer = Services.GetService(); + AppConfiguration = Services.GetService(); + + AppServiceConnectionManager = Services.GetService>(); + ThemeService = Services.GetService(); + DatabaseService = Services.GetService(); + TranslationService = Services.GetService(); + UnderlyingThemeService = Services.GetService(); + ThumbnailService = Services.GetService(); + + // Make sure the paths are setup on app start. + AppConfiguration.ApplicationDataFolderPath = ApplicationData.Current.LocalFolder.Path; + AppConfiguration.PublisherSharedFolderPath = ApplicationData.Current.GetPublisherCacheFolder(ApplicationConfiguration.SharedFolderName).Path; + AppConfiguration.ApplicationTempFolderPath = ApplicationData.Current.TemporaryFolder.Path; + + ConfigureLogging(); + } + + private void CurrentDomain_UnhandledException(object sender, System.UnhandledExceptionEventArgs e) + => Log.Fatal(e.ExceptionObject as Exception, "AppDomain Unhandled Exception"); + + private void OnUnobservedTaskException(object sender, UnobservedTaskExceptionEventArgs e) + => Log.Error(e.Exception, "Unobserved Task Exception"); + + private void OnAppUnhandledException(object sender, Microsoft.UI.Xaml.UnhandledExceptionEventArgs e) + { + Log.Fatal(e.Exception, "Unhandled Exception"); + e.Handled = true; + } + + public IEnumerable GetActivationServices() + { + yield return DatabaseService; + yield return TranslationService; + yield return ThemeService; + } + + public Task InitializeServicesAsync() => GetActivationServices().Select(a => a.InitializeAsync()).WhenAll(); + + public bool IsInteractiveLaunchArgs(object args) => args is IActivatedEventArgs; + + public void LogActivation(string log) => Log.Information($"{WinoLaunchLogPrefix}{log}"); + + protected override void OnLaunched(Microsoft.UI.Xaml.LaunchActivatedEventArgs args) + { + base.OnLaunched(args); + + LogActivation("OnLaunched."); + } + + private void ConfigurePrelaunch() + { + if (ApiInformation.IsMethodPresent("Windows.ApplicationModel.Core.CoreApplication", "EnablePrelaunch")) + CoreApplication.EnablePrelaunch(true); + } + + public abstract IServiceProvider ConfigureServices(); + + public void ConfigureLogging() + { + string logFilePath = Path.Combine(ApplicationData.Current.LocalFolder.Path, Constants.ClientLogFile); + LogInitializer.SetupLogger(logFilePath); + } + + public virtual void OnLanguageChanged(AppLanguageModel languageModel) + { + var newCulture = new CultureInfo(languageModel.Code); + + ApplicationLanguages.PrimaryLanguageOverride = languageModel.Code; + + CultureInfo.DefaultThreadCurrentCulture = newCulture; + CultureInfo.DefaultThreadCurrentUICulture = newCulture; + } + + public void Receive(LanguageChanged message) => OnLanguageChanged(TranslationService.CurrentLanguageModel); +} diff --git a/Wino.Core/Wino.Core.csproj b/Wino.Core/Wino.Core.csproj index 4c44cde9..6e02c9c2 100644 --- a/Wino.Core/Wino.Core.csproj +++ b/Wino.Core/Wino.Core.csproj @@ -1,6 +1,6 @@  - net9.0 + net10.0 win-x86;win-x64;win-arm64 Wino.Core x86;x64;arm64 diff --git a/Wino.Mail.ViewModels/AppShellViewModel.cs b/Wino.Mail.ViewModels/AppShellViewModel.cs index 8bccc626..089acd49 100644 --- a/Wino.Mail.ViewModels/AppShellViewModel.cs +++ b/Wino.Mail.ViewModels/AppShellViewModel.cs @@ -74,7 +74,6 @@ public partial class AppShellViewModel : MailBaseViewModel, private readonly INotificationBuilder _notificationBuilder; private readonly IWinoRequestDelegator _winoRequestDelegator; private readonly IMailDialogService _dialogService; - private readonly IBackgroundTaskService _backgroundTaskService; private readonly IMimeFileService _mimeFileService; private readonly INativeAppService _nativeAppService; @@ -87,7 +86,6 @@ public partial class AppShellViewModel : MailBaseViewModel, public AppShellViewModel(IMailDialogService dialogService, INavigationService navigationService, - IBackgroundTaskService backgroundTaskService, IMimeFileService mimeFileService, INativeAppService nativeAppService, IMailService mailService, @@ -122,7 +120,6 @@ public partial class AppShellViewModel : MailBaseViewModel, _configurationService = configurationService; _startupBehaviorService = startupBehaviorService; - _backgroundTaskService = backgroundTaskService; _mimeFileService = mimeFileService; _nativeAppService = nativeAppService; _mailService = mailService; @@ -248,7 +245,6 @@ public partial class AppShellViewModel : MailBaseViewModel, } await MakeSureEnableStartupLaunchAsync(); - await ConfigureBackgroundTasksAsync(); } private async Task MakeSureEnableStartupLaunchAsync() @@ -291,22 +287,6 @@ public partial class AppShellViewModel : MailBaseViewModel, } } - private async Task ConfigureBackgroundTasksAsync() - { - try - { - // This will only unregister once. Safe to execute multiple times. - _backgroundTaskService.UnregisterAllBackgroundTask(); - - await _backgroundTaskService.RegisterBackgroundTasksAsync(); - } - catch (Exception ex) - { - Log.Error(ex, "Failed to configure background tasks."); - - _dialogService.InfoBarMessage(Translator.Info_BackgroundExecutionUnknownErrorTitle, Translator.Info_BackgroundExecutionUnknownErrorMessage, InfoBarMessageType.Error); - } - } private async Task ForceAllAccountSynchronizationsAsync() { diff --git a/Wino.Mail.ViewModels/Wino.Mail.ViewModels.csproj b/Wino.Mail.ViewModels/Wino.Mail.ViewModels.csproj index 7cbcd411..aa7c3f2f 100644 --- a/Wino.Mail.ViewModels/Wino.Mail.ViewModels.csproj +++ b/Wino.Mail.ViewModels/Wino.Mail.ViewModels.csproj @@ -1,6 +1,6 @@  - net9.0 + net10.0 x86;x64;arm64 win-x86;win-x64;win-arm64 true diff --git a/Wino.Mail.WinUI/Activation/DefaultActivationHandler.cs b/Wino.Mail.WinUI/Activation/DefaultActivationHandler.cs new file mode 100644 index 00000000..b2b9d3a3 --- /dev/null +++ b/Wino.Mail.WinUI/Activation/DefaultActivationHandler.cs @@ -0,0 +1,22 @@ +using System.Threading.Tasks; +using Windows.ApplicationModel.Activation; +using Microsoft.UI.Xaml; +using Microsoft.UI.Xaml.Controls; +using Microsoft.UI.Xaml.Media.Animation; +using Wino.Views; + +namespace Wino.Activation; + +internal class DefaultActivationHandler : ActivationHandler +{ + protected override Task HandleInternalAsync(IActivatedEventArgs args) + { + (Window.Current.Content as Frame).Navigate(typeof(AppShell), null, new DrillInNavigationTransitionInfo()); + + return Task.CompletedTask; + } + + // Only navigate if Frame content doesn't exist. + protected override bool CanHandleInternal(IActivatedEventArgs args) + => (Window.Current?.Content as Frame)?.Content == null; +} diff --git a/Wino.Mail.WinUI/Activation/FileActivationHandler.cs b/Wino.Mail.WinUI/Activation/FileActivationHandler.cs new file mode 100644 index 00000000..f01b09ad --- /dev/null +++ b/Wino.Mail.WinUI/Activation/FileActivationHandler.cs @@ -0,0 +1,67 @@ +using System; +using System.IO; +using System.Linq; +using System.Threading.Tasks; +using Windows.ApplicationModel.Activation; +using Windows.Storage; +using Microsoft.UI.Xaml; +using Microsoft.UI.Xaml.Controls; +using Microsoft.UI.Xaml.Media.Animation; +using Wino.Core.Domain.Enums; +using Wino.Core.Domain.Interfaces; +using Wino.Core.UWP.Extensions; +using Wino.Views; + +namespace Wino.Activation; + +internal class FileActivationHandler : ActivationHandler +{ + private readonly INativeAppService _nativeAppService; + private readonly IMimeFileService _mimeFileService; + private readonly IStatePersistanceService _statePersistanceService; + private readonly INavigationService _winoNavigationService; + + public FileActivationHandler(INativeAppService nativeAppService, + IMimeFileService mimeFileService, + IStatePersistanceService statePersistanceService, + INavigationService winoNavigationService) + { + _nativeAppService = nativeAppService; + _mimeFileService = mimeFileService; + _statePersistanceService = statePersistanceService; + _winoNavigationService = winoNavigationService; + } + + protected override async Task HandleInternalAsync(FileActivatedEventArgs args) + { + // Always handle the last item passed. + // Multiple files are not supported. + + var file = args.Files.Last() as StorageFile; + + // Only EML files are supported now. + var fileExtension = Path.GetExtension(file.Path); + + if (string.Equals(fileExtension, ".eml", StringComparison.OrdinalIgnoreCase)) + { + var fileBytes = await file.ToByteArrayAsync(); + var directoryName = Path.GetDirectoryName(file.Path); + + var messageInformation = await _mimeFileService.GetMimeMessageInformationAsync(fileBytes, directoryName).ConfigureAwait(false); + + if (_nativeAppService.IsAppRunning()) + { + // TODO: Activate another Window and go to mail rendering page. + _winoNavigationService.Navigate(WinoPage.MailRenderingPage, messageInformation, NavigationReferenceFrame.RenderingFrame); + } + else + { + _statePersistanceService.ShouldShiftMailRenderingDesign = true; + (Window.Current.Content as Frame).Navigate(typeof(MailRenderingPage), messageInformation, new DrillInNavigationTransitionInfo()); + } + } + } + + protected override bool CanHandleInternal(FileActivatedEventArgs args) => args.Files.Any(); + +} diff --git a/Wino.Mail.WinUI/Activation/ProtocolActivationHandler.cs b/Wino.Mail.WinUI/Activation/ProtocolActivationHandler.cs new file mode 100644 index 00000000..9692ea20 --- /dev/null +++ b/Wino.Mail.WinUI/Activation/ProtocolActivationHandler.cs @@ -0,0 +1,59 @@ +using System; +using System.Threading.Tasks; +using CommunityToolkit.Mvvm.Messaging; +using Windows.ApplicationModel.Activation; +using Wino.Core.Domain.Interfaces; +using Wino.Core.Domain.Models.Launch; +using Wino.Messaging.Client.Shell; + +namespace Wino.Activation; + +internal class ProtocolActivationHandler : ActivationHandler +{ + private const string MailtoProtocolTag = "mailto:"; + + private readonly INativeAppService _nativeAppService; + private readonly ILaunchProtocolService _launchProtocolService; + + public ProtocolActivationHandler(INativeAppService nativeAppService, ILaunchProtocolService launchProtocolService) + { + _nativeAppService = nativeAppService; + _launchProtocolService = launchProtocolService; + } + + protected override Task HandleInternalAsync(ProtocolActivatedEventArgs args) + { + // Check URI prefix. + var protocolString = args.Uri.AbsoluteUri; + + if (protocolString.StartsWith(MailtoProtocolTag)) + { + // mailto activation. Try to parse params. + _launchProtocolService.MailToUri = new MailToUri(protocolString); + + if (_nativeAppService.IsAppRunning()) + { + // Just send publish a message. Shell will continue. + WeakReferenceMessenger.Default.Send(new MailtoProtocolMessageRequested()); + } + } + + return Task.CompletedTask; + } + + protected override bool CanHandleInternal(ProtocolActivatedEventArgs args) + { + // Validate the URI scheme. + + try + { + var uriGet = args.Uri; + } + catch (UriFormatException) + { + return false; + } + + return base.CanHandleInternal(args); + } +} diff --git a/Wino.Mail.WinUI/Activation/ToastNotificationActivationHandler.cs b/Wino.Mail.WinUI/Activation/ToastNotificationActivationHandler.cs new file mode 100644 index 00000000..436f8800 --- /dev/null +++ b/Wino.Mail.WinUI/Activation/ToastNotificationActivationHandler.cs @@ -0,0 +1,76 @@ +using System; +using System.Threading.Tasks; +using CommunityToolkit.Mvvm.Messaging; +using Microsoft.Extensions.DependencyInjection; +using Microsoft.Toolkit.Uwp.Notifications; +using Serilog; +using Windows.ApplicationModel.Activation; +using Wino.Core.Domain; +using Wino.Core.Domain.Interfaces; +using Wino.Mail.WinUI; +using Wino.Messaging.Client.Accounts; + +namespace Wino.Activation; + +/// +/// This handler will only handle the toasts that runs on foreground. +/// Background executions are not handled here like mark as read or delete. +/// +internal class ToastNotificationActivationHandler : ActivationHandler +{ + private readonly IMailService _mailService; + private readonly IFolderService _folderService; + + private ToastArguments _toastArguments; + + public ToastNotificationActivationHandler(IMailService mailService, + IFolderService folderService) + { + _mailService = mailService; + _folderService = folderService; + } + + protected override async Task HandleInternalAsync(ToastNotificationActivatedEventArgs args) + { + // Create the mail item navigation event. + // If the app is running, it'll be picked up by the Messenger. + // Otherwise we'll save it and handle it when the shell loads all accounts. + + // Parse the mail unique id and perform above actions. + if (Guid.TryParse(_toastArguments[Constants.ToastMailUniqueIdKey], out Guid mailItemUniqueId)) + { + var account = await _mailService.GetMailAccountByUniqueIdAsync(mailItemUniqueId).ConfigureAwait(false); + if (account == null) return; + + var mailItem = await _mailService.GetSingleMailItemAsync(mailItemUniqueId).ConfigureAwait(false); + if (mailItem == null) return; + + var message = new AccountMenuItemExtended(mailItem.AssignedFolder.Id, mailItem); + + // Delegate this event to LaunchProtocolService so app shell can pick it up on launch if app doesn't work. + var launchProtocolService = App.Current.Services.GetService(); + launchProtocolService.LaunchParameter = message; + + // Send the messsage anyways. Launch protocol service will be ignored if the message is picked up by subscriber shell. + WeakReferenceMessenger.Default.Send(message); + } + } + + protected override bool CanHandleInternal(ToastNotificationActivatedEventArgs args) + { + try + { + _toastArguments = ToastArguments.Parse(args.Argument); + + return + _toastArguments.Contains(Constants.ToastMailUniqueIdKey) && + _toastArguments.Contains(Constants.ToastActionKey); + } + catch (Exception ex) + { + Log.Error(ex, "Couldn't handle parsing toast notification arguments for foreground navigate."); + } + + return false; + } +} diff --git a/Wino.Mail.WinUI/App.xaml b/Wino.Mail.WinUI/App.xaml new file mode 100644 index 00000000..42ccc5c7 --- /dev/null +++ b/Wino.Mail.WinUI/App.xaml @@ -0,0 +1,26 @@ + + + + + + + + + + + + + + + + + + + + diff --git a/Wino.Mail.WinUI/App.xaml.cs b/Wino.Mail.WinUI/App.xaml.cs new file mode 100644 index 00000000..8c154d87 --- /dev/null +++ b/Wino.Mail.WinUI/App.xaml.cs @@ -0,0 +1,97 @@ +using System; +using System.Text; +using CommunityToolkit.Mvvm.Messaging; +using Microsoft.Extensions.DependencyInjection; +using Wino.Core.Domain.Interfaces; +using Wino.Core.UWP; +using Wino.Core.WinUI.Interfaces; +using Wino.Mail.Services; +using Wino.Mail.ViewModels; +using Wino.Messaging.Server; +using Wino.Services; +namespace Wino.Mail.WinUI; + +public partial class App : WinoApplication, IRecipient +{ + public App() + { + InitializeComponent(); + + Encoding.RegisterProvider(CodePagesEncodingProvider.Instance); + + WeakReferenceMessenger.Default.Register(this); + } + + #region Dependency Injection + + + private void RegisterUWPServices(IServiceCollection services) + { + services.AddSingleton(); + services.AddSingleton(); + services.AddTransient(); + services.AddTransient(); + services.AddSingleton(); + } + + private void RegisterViewModels(IServiceCollection services) + { + services.AddSingleton(typeof(AppShellViewModel)); + + services.AddTransient(typeof(MailListPageViewModel)); + services.AddTransient(typeof(MailRenderingPageViewModel)); + services.AddTransient(typeof(AccountManagementViewModel)); + services.AddTransient(typeof(WelcomePageViewModel)); + + services.AddTransient(typeof(ComposePageViewModel)); + services.AddTransient(typeof(IdlePageViewModel)); + + services.AddTransient(typeof(EditAccountDetailsPageViewModel)); + services.AddTransient(typeof(AccountDetailsPageViewModel)); + services.AddTransient(typeof(SignatureManagementPageViewModel)); + services.AddTransient(typeof(MessageListPageViewModel)); + services.AddTransient(typeof(ReadComposePanePageViewModel)); + services.AddTransient(typeof(MergedAccountDetailsPageViewModel)); + services.AddTransient(typeof(LanguageTimePageViewModel)); + services.AddTransient(typeof(AppPreferencesPageViewModel)); + services.AddTransient(typeof(AliasManagementPageViewModel)); + } + + #endregion + + public override IServiceProvider ConfigureServices() + { + var services = new ServiceCollection(); + + services.RegisterViewModelService(); + services.RegisterSharedServices(); + services.RegisterCoreUWPServices(); + services.RegisterCoreViewModels(); + + RegisterUWPServices(services); + RegisterViewModels(services); + + return services.BuildServiceProvider(); + } + + + protected override async void OnLaunched(Microsoft.UI.Xaml.LaunchActivatedEventArgs args) + { + // TODO: Check app relaunch mutex before loading anything. + + MainWindow = new ShellWindow(); + + await InitializeServicesAsync(); + + if (MainWindow is not IWinoShellWindow shellWindow) throw new ArgumentException("MainWindow must implement IWinoShellWindow"); + + shellWindow.HandleAppActivation(args); + + MainWindow.Activate(); + } + + public async void Receive(NewMailSynchronizationRequested message) + { + // TODO: Trigger new sync. + } +} diff --git a/Wino.Mail.WinUI/AppShell.xaml b/Wino.Mail.WinUI/AppShell.xaml new file mode 100644 index 00000000..3df3fb3d --- /dev/null +++ b/Wino.Mail.WinUI/AppShell.xaml @@ -0,0 +1,472 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/Wino.Mail.WinUI/AppShell.xaml.cs b/Wino.Mail.WinUI/AppShell.xaml.cs new file mode 100644 index 00000000..5f1fd91e --- /dev/null +++ b/Wino.Mail.WinUI/AppShell.xaml.cs @@ -0,0 +1,327 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Threading.Tasks; +using CommunityToolkit.Mvvm.Input; +using CommunityToolkit.Mvvm.Messaging; +using CommunityToolkit.WinUI; +using Microsoft.UI.Xaml; +using Microsoft.UI.Xaml.Controls; +using Microsoft.UI.Xaml.Controls.Primitives; +using Microsoft.UI.Xaml.Input; +using Windows.Foundation; +using Wino.Core.Domain; +using Wino.Core.Domain.Entities.Mail; +using Wino.Core.Domain.Enums; +using Wino.Core.Domain.Interfaces; +using Wino.Core.Domain.Models.Folders; +using Wino.Core.Domain.Models.MailItem; +using Wino.Core.Domain.Models.Navigation; +using Wino.Core.UWP.Controls; +using Wino.Extensions; +using Wino.Mail.ViewModels.Data; +using Wino.MenuFlyouts; +using Wino.MenuFlyouts.Context; +using Wino.Messaging.Client.Accounts; +using Wino.Messaging.Client.Mails; +using Wino.Messaging.Client.Shell; +using Wino.Views.Abstract; + +namespace Wino.Views; + +public sealed partial class AppShell : AppShellAbstract, + IRecipient, + IRecipient, + IRecipient, + IRecipient +{ + public AppShell() : base() + { + InitializeComponent(); + } + + private async void ItemDroppedOnFolder(object sender, DragEventArgs e) + { + // Validate package content. + if (sender is WinoNavigationViewItem droppedContainer) + { + droppedContainer.IsDraggingItemOver = false; + + if (CanContinueDragDrop(droppedContainer, e)) + { + if (droppedContainer.DataContext is IBaseFolderMenuItem draggingFolder) + { + var mailCopies = new List(); + + var dragPackage = e.DataView.Properties[nameof(MailDragPackage)] as MailDragPackage; + e.AcceptedOperation = Windows.ApplicationModel.DataTransfer.DataPackageOperation.Move; + + // Extract mail copies from IMailItem. + // ThreadViewModels will be divided into pieces. + + foreach (var item in dragPackage.DraggingMails) + { + if (item is MailItemViewModel singleMailItemViewModel) + { + mailCopies.Add(singleMailItemViewModel.MailCopy); + } + else if (item is ThreadMailItemViewModel threadViewModel) + { + mailCopies.AddRange(threadViewModel.GetMailCopies()); + } + } + + await ViewModel.PerformMoveOperationAsync(mailCopies, draggingFolder); + } + } + } + } + + private void ItemDragLeaveFromFolder(object sender, DragEventArgs e) + { + if (sender is WinoNavigationViewItem leavingContainer) + { + leavingContainer.IsDraggingItemOver = false; + } + } + + private bool CanContinueDragDrop(WinoNavigationViewItem interactingContainer, DragEventArgs args) + { + // TODO: Maybe override caption with some information why the validation failed? + // Note: Caption has a max length. It may be trimmed in some languages. + + if (interactingContainer == null || !args.DataView.Properties.ContainsKey(nameof(MailDragPackage))) return false; + + var dragPackage = args.DataView.Properties[nameof(MailDragPackage)] as MailDragPackage; + + // Invalid package. + if (!dragPackage.DraggingMails.Any()) return false; + + // Check whether source and target folder are the same. + if (interactingContainer.IsSelected) return false; + + // Check if the interacting container is a folder. + if (!(interactingContainer.DataContext is IBaseFolderMenuItem folderMenuItem)) return false; + + // Check if the folder is a move target. + if (!folderMenuItem.IsMoveTarget) return false; + + // Check whether the moving item's account has at least one same as the target folder's account. + var draggedAccountIds = folderMenuItem.HandlingFolders.Select(a => a.MailAccountId); + + if (!dragPackage.DraggingMails.Any(a => draggedAccountIds.Contains(a.AssignedAccount.Id))) return false; + + return true; + } + + private void ItemDragEnterOnFolder(object sender, DragEventArgs e) + { + // Validate package content. + if (sender is WinoNavigationViewItem droppedContainer && CanContinueDragDrop(droppedContainer, e)) + { + droppedContainer.IsDraggingItemOver = true; + + var draggingFolder = droppedContainer.DataContext as IBaseFolderMenuItem; + + e.AcceptedOperation = Windows.ApplicationModel.DataTransfer.DataPackageOperation.Move; + e.DragUIOverride.Caption = string.Format(Translator.DragMoveToFolderCaption, draggingFolder.FolderName); + } + } + + public async void Receive(AccountMenuItemExtended message) + { + await Dispatcher.RunAsync(Windows.UI.Core.CoreDispatcherPriority.High, async () => + { + if (message.FolderId == default) return; + + if (ViewModel.MenuItems.TryGetFolderMenuItem(message.FolderId, out IBaseFolderMenuItem foundMenuItem)) + { + foundMenuItem.Expand(); + + await ViewModel.NavigateFolderAsync(foundMenuItem); + + navigationView.SelectedItem = foundMenuItem; + + if (message.NavigateMailItem == null) return; + + // At this point folder is navigated and items are loaded. + WeakReferenceMessenger.Default.Send(new MailItemNavigationRequested(message.NavigateMailItem.UniqueId, ScrollToItem: true)); + } + else if (ViewModel.MenuItems.TryGetAccountMenuItem(message.NavigateMailItem.AssignedAccount.Id, out IAccountMenuItem accountMenuItem)) + { + // Loaded account is different. First change the folder items and navigate. + + await ViewModel.ChangeLoadedAccountAsync(accountMenuItem, navigateInbox: false); + + // Find the folder. + + if (ViewModel.MenuItems.TryGetFolderMenuItem(message.FolderId, out IBaseFolderMenuItem accountFolderMenuItem)) + { + accountFolderMenuItem.Expand(); + + await ViewModel.NavigateFolderAsync(accountFolderMenuItem); + + navigationView.SelectedItem = accountFolderMenuItem; + + // At this point folder is navigated and items are loaded. + WeakReferenceMessenger.Default.Send(new MailItemNavigationRequested(message.NavigateMailItem.UniqueId, ScrollToItem: true)); + } + } + }); + } + + private async void MenuSelectionChanged(Microsoft.UI.Xaml.Controls.NavigationView sender, Microsoft.UI.Xaml.Controls.NavigationViewSelectionChangedEventArgs args) + { + if (args.SelectedItem is IMenuItem invokedMenuItem) + { + await ViewModel.MenuItemInvokedOrSelectedAsync(invokedMenuItem); + } + } + + private async void NavigationViewItemInvoked(Microsoft.UI.Xaml.Controls.NavigationView sender, Microsoft.UI.Xaml.Controls.NavigationViewItemInvokedEventArgs args) + { + // SelectsOnInvoked is handled in MenuSelectionChanged. + // This part is only for the items that are not selectable. + if (args.InvokedItemContainer is WinoNavigationViewItem winoNavigationViewItem) + { + if (winoNavigationViewItem.SelectsOnInvoked) return; + + await ViewModel.MenuItemInvokedOrSelectedAsync(winoNavigationViewItem.DataContext as IMenuItem); + } + } + + public void Receive(NavigateMailFolderEvent message) + { + if (message.BaseFolderMenuItem == null) return; + + if (navigationView.SelectedItem != message.BaseFolderMenuItem) + { + var navigateFolderArgs = new NavigateMailFolderEventArgs(message.BaseFolderMenuItem, message.FolderInitLoadAwaitTask); + + ViewModel.NavigationService.Navigate(WinoPage.MailListPage, navigateFolderArgs, NavigationReferenceFrame.ShellFrame); + + // Prevent double navigation. + navigationView.SelectionChanged -= MenuSelectionChanged; + navigationView.SelectedItem = message.BaseFolderMenuItem; + navigationView.SelectionChanged += MenuSelectionChanged; + } + else + { + // Complete the init task since we are already on the right page. + message.FolderInitLoadAwaitTask?.TrySetResult(true); + } + } + + private void ShellFrameContentNavigated(object sender, Microsoft.UI.Xaml.Navigation.NavigationEventArgs e) + { + // => RealAppBar.ShellFrameContent = (e.Content as BasePage).ShellContent; + + // TODO: WinUI3: Update shell content. Just remove it. + } + + private void BackButtonClicked(WinoAppTitleBar sender, RoutedEventArgs args) + { + WeakReferenceMessenger.Default.Send(new ClearMailSelectionsRequested()); + WeakReferenceMessenger.Default.Send(new DisposeRenderingFrameRequested()); + } + + private async void MenuItemContextRequested(UIElement sender, ContextRequestedEventArgs args) + { + // Delegate this request to ViewModel. + // VM will prepare available actions for this folder and show Menu Flyout. + + if (sender is WinoNavigationViewItem menuItem && + menuItem.DataContext is IBaseFolderMenuItem baseFolderMenuItem && + baseFolderMenuItem.IsMoveTarget && + args.TryGetPosition(sender, out Point p)) + { + args.Handled = true; + + var source = new TaskCompletionSource(); + + var actions = ViewModel.GetFolderContextMenuActions(baseFolderMenuItem); + var flyout = new FolderOperationFlyout(actions, source); + + flyout.ShowAt(menuItem, new FlyoutShowOptions() + { + ShowMode = FlyoutShowMode.Standard, + Position = new Point(p.X + 30, p.Y - 20) + }); + + var operation = await source.Task; + + flyout.Dispose(); + + // No action selected. + if (operation == null) return; + + await ViewModel.PerformFolderOperationAsync(operation.Operation, baseFolderMenuItem); + } + } + + public void Receive(CreateNewMailWithMultipleAccountsRequested message) + { + // Find the NewMail menu item container. + + var container = navigationView.ContainerFromMenuItem(ViewModel.CreateMailMenuItem); + + var flyout = new AccountSelectorFlyout(message.AllAccounts, ViewModel.CreateNewMailForAsync); + + flyout.ShowAt(container, new FlyoutShowOptions() + { + ShowMode = FlyoutShowMode.Auto, + Placement = FlyoutPlacementMode.Right + }); + } + + private void NavigationPaneOpening(Microsoft.UI.Xaml.Controls.NavigationView sender, object args) + { + // It's annoying that NavigationView doesn't respect expansion state of the items in Minimal display mode. + // Expanded items are collaped, and users need to expand them again. + // Regardless of the reason, we will expand the selected item if it's a folder with parent account for visibility. + + if (sender.DisplayMode == Microsoft.UI.Xaml.Controls.NavigationViewDisplayMode.Minimal && sender.SelectedItem is IFolderMenuItem selectedFolderMenuItem) + { + selectedFolderMenuItem.Expand(); + } + } + + /// + /// InfoBar message is requested. + /// + public async void Receive(InfoBarMessageRequested message) + { + await DispatcherQueue.EnqueueAsync(async () => + { + if (string.IsNullOrEmpty(message.ActionButtonTitle) || message.Action == null) + { + ShellInfoBar.ActionButton = null; + } + else + { + ShellInfoBar.ActionButton = new Button() + { + Content = message.ActionButtonTitle, + Command = new RelayCommand(message.Action) + }; + } + + ShellInfoBar.Message = message.Message; + ShellInfoBar.Title = message.Title; + ShellInfoBar.Severity = message.Severity.AsMUXCInfoBarSeverity(); + ShellInfoBar.IsOpen = true; + }); + } + + private void NavigationViewDisplayModeChanged(Microsoft.UI.Xaml.Controls.NavigationView sender, Microsoft.UI.Xaml.Controls.NavigationViewDisplayModeChangedEventArgs args) + { + if (args.DisplayMode == Microsoft.UI.Xaml.Controls.NavigationViewDisplayMode.Minimal) + { + ShellFrame.Margin = new Thickness(7, 0, 0, 0); + } + else + { + ShellFrame.Margin = new Thickness(0); + } + } +} diff --git a/Wino.Mail.WinUI/Assets/BadgeLogo.scale-100.png b/Wino.Mail.WinUI/Assets/BadgeLogo.scale-100.png new file mode 100644 index 0000000000000000000000000000000000000000..1534c12e58608fe889e3d36949d19c9888b9c92c GIT binary patch literal 209 zcmeAS@N?(olHy`uVBq!ia0vp^5+KaM1|%Pp+x`GjoCO|{#S9F5he4R}c>anMpkTA7 zi(^Q|oVQc%ay2OMv~qv@w|)(u)uw4_*`F7ExWmEqymUoqVV$q8M1mQ@SxS>~c( z|MRevOINnz32`pr)H!@tIh1xSfBN;Ul#YXr!}gDt*GV%~eQt~^XLLKPzI_>I!rWKZ z7g!%eO0L~9v8E<_jbaUx%cU9mdlf1UJfE_tLt~3O+v%4MrSA&`Q-RK5@O1TaS?83{ F1OUwUPm2Hm literal 0 HcmV?d00001 diff --git a/Wino.Mail.WinUI/Assets/BadgeLogo.scale-125.png b/Wino.Mail.WinUI/Assets/BadgeLogo.scale-125.png new file mode 100644 index 0000000000000000000000000000000000000000..534de07533ad54a73545e8a4808a486c7ec0688b GIT binary patch literal 238 zcmeAS@N?(olHy`uVBq!ia0vp^av;pX1|+Qw)-3{3oCO|{#S9F5he4R}c>anMpx^>e z7srr_Id8At=4(*kV7PGW&;NL{%!?d~`7^X1FJ1E_;Zo7*1qJqhGH|_c;E9|kAEg)7_`ssy_jcjG{;B*` k>s`?ehy54Yv>lXwdn2OuO~~f^K({h@y85}Sb4q9e0FvipGynhq literal 0 HcmV?d00001 diff --git a/Wino.Mail.WinUI/Assets/BadgeLogo.scale-150.png b/Wino.Mail.WinUI/Assets/BadgeLogo.scale-150.png new file mode 100644 index 0000000000000000000000000000000000000000..0470789a179e82bbc63bf74cdd20a0ad56f90427 GIT binary patch literal 286 zcmeAS@N?(olHy`uVBq!ia0vp^Dj>|k1|%Oc%$NbBI14-?iy0XB4ude`@%$AjK*0;1 zE{-7;bKc&#$=71Q!Fs{)<^TViPNf*|GPkZXY5V;s&M#~2u`f4uPD(onD`-BS`?yb= zL!hKut3ynOwaT6Ks>u!MHL6WvNuP3zR~Ry05?TU%zWipxEn==qYo2@Yv{%)cRXAvH gUBCZRPkJWzu_rYX0}B!jfqrA~boFyt=akR{00^pV2mk;8 literal 0 HcmV?d00001 diff --git a/Wino.Mail.WinUI/Assets/BadgeLogo.scale-200.png b/Wino.Mail.WinUI/Assets/BadgeLogo.scale-200.png new file mode 100644 index 0000000000000000000000000000000000000000..842c6f842108797e8449e3fcd01e7d6f6a9b271e GIT binary patch literal 360 zcmV-u0hj)XP)pG8c9S!RCt{2nb8iyFbG98>Hq(-t|k~p+6pZ#U^p*o_uxIUHZaR0 zIK?`EgxAIM0g!Q~QK(ti0z1B3 z1D1f-@Rgqep2Jt%ZelJeU`+~G^A%{ds@_kaPcH-^aevWjTRn1XC1|H-7fZ%%545V` zg&~6Y_ z1f&CyW;K=sRwp-&YD^1gjh(C25DV;@muE%T0;dLj>21XlIQ^7DQjMX2_2U(eNLRo* zJZ5xT6?)NAa7?Qjw|^anM1_q{J zPZ!6KiaBrR-u63eAi(PQ>HmKt6MoIKrzZR6m)d*|64@GXF2%fXSK|lPpr&8EZ}^yw zC^+!Ihy)>f{eAH_-g3-1B3S3e#H3chHh)q>L!(UM@%YP4YJ%+f+iz<*IJmEC`p?27 zrOA6YjFCxe<;~l{3JQ<(t`wht`?a|5cq;3cTg=5TMfWXT-Eec^nUpKlZ1eZ+eH8 zHV6veh`T*Wn{l!GecP~RZpO{;EkA_t7BQ}pw%ZfZ?9(vaI`@i_3e%nz`Ndh@!K@WL zc5Z>Z!7LU0_l$y%6fmxCl{a3j%PYL0=!4kh{dFmbH}t=A+k?wjx-^6wete%&Hf6$Rr6zsln2vgI(xg)842?(p6k9n9=h$5|B*6w+8y literal 0 HcmV?d00001 diff --git a/Wino.Mail.WinUI/Assets/EML/eml.png b/Wino.Mail.WinUI/Assets/EML/eml.png new file mode 100644 index 0000000000000000000000000000000000000000..7aeeb98f680a9cccc59adc61f2ae29496ba04415 GIT binary patch literal 8387 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 literal 0 HcmV?d00001 diff --git a/Wino.Mail.WinUI/Assets/LargeTile.scale-100.png b/Wino.Mail.WinUI/Assets/LargeTile.scale-100.png new file mode 100644 index 0000000000000000000000000000000000000000..aca6e4e2b447424f6fdd6494843b6739833203b2 GIT binary patch literal 9108 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 E0mOj44*&oF literal 0 HcmV?d00001 diff --git a/Wino.Mail.WinUI/Assets/LargeTile.scale-150.png b/Wino.Mail.WinUI/Assets/LargeTile.scale-150.png new file mode 100644 index 0000000000000000000000000000000000000000..1ed2a001d418a585b34186fcc46e09c710c031dd GIT binary patch literal 17147 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 z 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 z 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 literal 0 HcmV?d00001 diff --git a/Wino.Mail.WinUI/Assets/LockScreenLogo.scale-200.png b/Wino.Mail.WinUI/Assets/LockScreenLogo.scale-200.png new file mode 100644 index 0000000000000000000000000000000000000000..7440f0d4bf7c7e26e4e36328738c68e624ee851e GIT binary patch literal 432 zcmeAS@N?(olHy`uVBq!ia0vp^1|ZDA1|-9oezr3(FqV6|IEGZ*x-#9g>~Mkr+x6^F zy~CDX2QIMs&Gcs3RnRBoxBA!*(Mfw0KTCYuYk0WlEIV>qBmPl! zq4ukrvfADX@#p8fbLY(H47N+k`FZ(FZh?cDro7>{8mkBO3>^oaIx`3!Jl)Qq)HI!+ z(S=1{o~eT)&W^=Ea8C`-17(Jv5(nHFJ{dOjGdxLVkY_y6&S1whfuFI4MM0kF0f&cO zPDVpV%nz;Id$>+0Ga5e9625-JcI)oq=#Pa3p^>8BB}21BUw@eN!-6@w%X+^`+Vn?! zryu|3T>kVWNBYyBc=7Y6H#s1Ah!OI_nezW zXTqOdkv2Az6KKBV=$yHdF^R3Fqw(TZEoNSZX>reXJ#bwX42%f|Pgg&ebxsLQ010xn AssI20 literal 0 HcmV?d00001 diff --git a/Wino.Mail.WinUI/Assets/NotificationIcons/archive.png b/Wino.Mail.WinUI/Assets/NotificationIcons/archive.png new file mode 100644 index 0000000000000000000000000000000000000000..40dc3dd1e04fb08ad84a9911276f354c68e775d5 GIT binary patch literal 12379 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 W9=Mp;59o!HiS{-FNqVKIi8=kMmgH$8jE~n@0}q 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

XuWpGcE}D*?KGu2dLqj zmH8mD7I=PVU?Xtx54blJ+ZWrYJKTzYd(2gP`geHbI2cR?t^9pnVEQ8v#?+{Z6zg@t zuh)oT2Hpe?ycL#)X(vC!f}eCNuJ{x2*jMx!^r$o8U4jCHLms%p!@4WJZ^e(g>be9O zQ6LhJk}Zb;uJa1|3~;m3cIL=T!(XDFu&G4Oo>5f#pm7iql=kMVh>KO4>p&TTRlSfQ zyG`{6vFb3qk$-rR2S9#e{3SILB<*&@#*l;^nJ>Hh(s`k&$1 z$qCsDLKjOyBdrBcywCCgfjn{IEg88mYYmv9C~V45E^-qF|2G^@fa7eZW^k^y@Qhjh zFt%1FK#^)go5u8Rfy3ysWiCHcto&WaH+2I_4h=mi{0kkICo_`tE-!_cD%3PSEd!wO z#lcCWY70Phl}^nJ0OVIgdoUs(H9xIhcYO_PBX@sxnPIxJ;{fcV082rK$R7}cH{l17 zJeX#GZ%i-j7Z?C&cTsR&y3_!?ZU5u+LkDu`z(v=A7d!eT>Ih0jEL^{V#r;n+-L_;9 z)|ezc_f7OawH;2p3{(oYJ8%iwe+L7Agxp=>XTG)sHXlkdh~GdbYb6ahbi-vL@bj%B z*CJ30fDm{vStl$@EOI-{0ncBxqk04w>O4PGx0e&X2k)Kn)6-7t(n&}M93^^nEGjTg>Prp zC;PIm*#usOwnX&Oj={=@j0G18NuaQo{IKOqmvjNisLXHZ2)^m{mr+@CLQ5`d=vL1W&q3k0>!x3bgU%=*yjbUg0 E51TlVod5s; literal 0 HcmV?d00001 diff --git a/Wino.Mail.WinUI/Assets/NotificationIcons/dismiss.png b/Wino.Mail.WinUI/Assets/NotificationIcons/dismiss.png new file mode 100644 index 0000000000000000000000000000000000000000..63086036e4a09415db32ac0cd072acf8f41ef15e GIT binary patch literal 16527 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 Nc-r(-(Mg9J{|lQ#z;^%u literal 0 HcmV?d00001 diff --git a/Wino.Mail.WinUI/Assets/NotificationIcons/profile-dark.png b/Wino.Mail.WinUI/Assets/NotificationIcons/profile-dark.png new file mode 100644 index 0000000000000000000000000000000000000000..114b3af6f97b37ecd4a451195614899e394920b7 GIT binary patch literal 2445 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 ir App Preferences -> Default Search Mode to change it + +![Default Search Mode](https://www.winomail.app/blog-resources/release-1-10-2/online_search_2.webp) + +## Live changes for IMAP and stability improvements. + +For IMAP servers that support [IDLE command](https://datatracker.ietf.org/doc/html/rfc2177.html) live changes to Inbox folder will be listened with minimum effort. This means that whenever you recieve a mail or some flag (read/unread etc.) changes in your Inbox folder, changes are immidiately reflected to Wino without requiring a synchronization. + +On top of that; this update brings significant stability and performance improvements to all IMAP servers. We have reworked our IMAP synchronizers to be more resource efficient and performant. + +## iCloud and Yahoo on setup dialog + +Account setup dialog is more streamlined in this version. Now it supports iCloud and Yahoo; with an additional helping links to create app-specific password to login with Wino. This is the first effort to make setting up accounts easier for users and there will be more in the future. + +![New IMAP Providers](https://www.winomail.app/blog-resources/release-1-10-2/imap_providers.webp) + +## Gmail Archive Functionality + +In reality, Archive folder is a virtual folder in Gmail that doesn't exist. For Gmail, archiving means 'it doesn't belong to Inbox' or putting in words as Google "something that does not have Inbox label". Due to limitations in Wino Mail's architecture and lack of support in Gmail API; Archive functionality used to work by moving the mails you marked as 'archived' to your special archive folder you have configured in account settings. This behavior is no longer exists and archiving/unarchiving will work as it is in Gmail web UI. + +Starting from this version you will be able to see "Archive" folder for your Gmail accounts and all your archived mails will be synchronized on your next sync. (If you don't see the folder, relaunch the app after doing a synchronization.) + +![Archive folder for Gmail](https://www.winomail.app/blog-resources/release-1-10-2/gmail_archive.webp) + +## Additional Bugfixes and Improvements + +As always, this major release has a lot of overall bugfixes for the application. + +* Fixed 410 GONE error for Outlook. +* Fixed 404 NOT FOUND error for Gmail. If your local cache is expired and Wino can't store the state of your mails, it will re-synchronize everything to keep state healthy. +* AppCenter SDK is removed. Logging and analytics are migrated to Azure App Insights. +* Diagnostic ID is implemented to track user errors better. If you had an error in the app and share the Diagnostic Id under Settings -> About -> Diagnostics, we can easily track down the issue you had to provide better help. +* Fixed the issue with dates and times are not translated properly to selected application language. +* Prevented moving mails in linked accounts when users try to move multiple mails that belong to different accounts. +* Implemented IMAP setup dialog validations to notify users during IMAP account creation for missing fields. +* Displaying "You" for received mails instead of your full mail address by @Tiktack in https://github.com/bkaankose/Wino-Mail/pull/566 +* Automatically saving drafts on app close to prevent data loss by @Tiktack in https://github.com/bkaankose/Wino-Mail/pull/546 +* Displaying full message (MIME) source by @Tiktack in https://github.com/bkaankose/Wino-Mail/pull/541 +* Clearing rendered text selection when changing mails by @Tiktack in https://github.com/bkaankose/Wino-Mail/pull/543 +* Creating a shared web editor component by @Tiktack in https://github.com/bkaankose/Wino-Mail/pull/578 +* Clickable plaintext links and fixes to dark mode by @KamilDev in https://github.com/bkaankose/Wino-Mail/pull/488 diff --git a/Wino.Mail.WinUI/Assets/SmallTile.scale-100.png b/Wino.Mail.WinUI/Assets/SmallTile.scale-100.png new file mode 100644 index 0000000000000000000000000000000000000000..f0d5239073292dd2b301a7a91c0211ddac98f80f GIT binary patch literal 2216 zcmb7`=Q|q;1H}_HQ&OqD8;T-Ui#BG>+KSkuXpD;zTrpbvwJv&Ti%>yPwQEagqpC4# zyQon`Z9%LGLA~yO@V+0;InViip67Q`9-2R31M!0Z005hjp`O)cKKNJ6jF)ax=O}U+ zENDZAU;qHz^{;?E0p%zFfZ5SVPa6@Izn%9a+1ZY-=VI+gcp+|ZfQV{QOfi!t-LQg9 zfXwK5ikr9`OTD#|SG)ZG!Y3aOULy_1{WT{q0W>*BNE_dW&_l*l%127abINWiLMzJJ zr(1Ie25_gCp*{H8k7-4vi+AlI$)TIH1_1JHg^fZhO~Zr=0!Ez>X^ljAc5aisyC)r!An# zvQG{o>|eImqdhm4OdV-?>oa(v#-j$)oqxF7ELrL?b_BCQ;4` zxC|smiC6v<;LJ$7;vCGHD%9}XeqNJ?6QemdVru-!&4)cR35y$Vy7wh#B#}{|4)u*( zP!CM-onn6?`DOJ<;Vs^3hN(gcKkLnEpzB_U6Wzp`N|Vj$HiJEB6ZN)H!31Asmhc!n zM3vX@Tme~o500KEMLy4Lf*_E`Wkut*{!7^tk%u!i+NfjzRSh&G>Jfyg+&>$(XhlXY z7N=yes!HZ3;(%mnyY~#-5l|c`v#+8JI>}|*0=3y8c~m~>`IXrmtCLunk&Nr!aMpY< zyUWQ+=;0MK*)17(63?<}=+6B8T3}sXmjw|+Us#=UBWxK!*p!&2b~uNc9}R6R`L6l> z417XN5cy4`V4VUp?3mnRU})F=h4Kn4>t~jpPM5grn*k0?BFAAHCl-sj4>m`DH+E|E zm+86c))_iLCS!__fF+g4-SPTiEri$zv~2i{FWmEeSt%x`?V9fG99z*k*txjD5_c!O zVR>I{nU{ei$&;cPT0KvJd)&d+9KoC6>PQ2)$wbl(2Ux9B_FGC9!mxWmLD*P1&yr+6 zU(Vi!ro|fHA@H9~#+C$Jbj^U~G?@uODH!PEj}a&cOwNpi8iL0POuuHLJu)#sqrRUX zF%eqkeh86g{k#PzWEwX$&a_fKmY84U3%eOVv{w#zI_~ChXx7jRk5~{eoaK=-O|eNoeHzLx#9b8vw9 zG(Wb|q_WIXnykbvOb|b`JQ*k{k6Pr-{=F+ErpOm>Em*agGEWh*i$<*w`W=8?1gVU*xl@F$##G1JlG<>NqBEgBZ{UWzYX>@(p@lw=KpIR)Fze%8(`Z`|!vqvHxn2O0D)!wZghB%UG0P4tclS zA>R*r^{LSO0{j|TE`+isti3S;{IFvzh*4D%c0+qJ3J;Em{femA-t6}QrSyj9kKGc8 zK)XCoJyDe)o(sJ?(f}AWC#r$5{A#@8&#TwgA+_W;2%+w+7he+mV=7p#{cT5gtmJ*r z=LX7@o2rUYQ4+P=<3A%oeG2zui@xv6o^=;~I;mqc|CUv>>ZcY#jdzd` zDi(e7b&rrmC)X5o95LA0Xv4$Bzo;77I$~1KY?`dD{RfS1?SpibK$^RQr=_Q0cr*Jw z0Gl71L%L=qeTA;Z;Fb5YG#rS287gDS7-Tf<-(55D=#SVKsdz?^bay zeIiR*{USxfyXfkcbRCTC7gs46$t^!Lfo>Wn-91v;Lk}fbaAXL=SA8-_zB}~4`N6*B zAY%$m+vi(>CZ}vgeB_+e;tQuwjad>zY`{--kxt5Y$e-n2)>2V15r{} zIq@v;$d>P&T`!!2Yn(b3W;EEtXzkcCQQK)bhxfP>2JYE+=E0R+Q!Z?&RsNK7F!i)9 z?eoKIPo`1Wv%5_)XiiS;o7r0H#q|rDks;N0J^WD+E^a@{2Dav(T)iHZlJeG}fmk}>leeg#2oM=dbPEDxt4&FXD6v8M9 z`D*)3Mwz?K+uDWy)Sji8#aP)%!+XjwS-;9J5ycL6a>Zaw8AmxBnio7Q0p>ELGe3)F z!68K=45l53N~xX!mw=iw$8Za|yi`(!r^oFKAh)SL3JiW3;Fxd*S;Q#CWF(%Ow7P)4 zOi1l^=r~Xzh(^DN5GSBNu|3Z5V{-ku2P(KlZpyaPV7=}xn_h{>&S+W|TsAWL>sL>7 z=;-KN@B)jAFP4zizut(bgzT=&f@fref&9e?8C_b0;ze4;up;Byw!DqJFr3;sZL6R< z@gbaP6Q0h}>Q{w#l}Y+RoYCV^MqEvAjDG5~C2K9>)+Ez$w$y(o%S-s#Ew#1)t0r!R zWN58p)zIb0_TN)4{v>;?d6^PhrvrxsULwf^84KIl)JB*S)}RG&tVHHsa|OGN!_CazapO2%>&GBq9c|(HjzXrhUhpJOG%xU+;C-U6h6bfAmoH0 zc_FKt3O+A9Yml*h)}^CiL0dHyD97(FMc!!NG~z)0U*uU5x3?!N*u BD--|# literal 0 HcmV?d00001 diff --git a/Wino.Mail.WinUI/Assets/SmallTile.scale-125.png b/Wino.Mail.WinUI/Assets/SmallTile.scale-125.png new file mode 100644 index 0000000000000000000000000000000000000000..4a0404cfcd2e7c34142b6f493c71b38957934354 GIT binary patch literal 2887 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 literal 0 HcmV?d00001 diff --git a/Wino.Mail.WinUI/Assets/SmallTile.scale-400.png b/Wino.Mail.WinUI/Assets/SmallTile.scale-400.png new file mode 100644 index 0000000000000000000000000000000000000000..c931a5dddfe6bc11f3cdb675412054d5a577d319 GIT binary patch literal 13773 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 J%~#`~{|5>+!!!T@ literal 0 HcmV?d00001 diff --git a/Wino.Mail.WinUI/Assets/SplashScreen.scale-100.png b/Wino.Mail.WinUI/Assets/SplashScreen.scale-100.png new file mode 100644 index 0000000000000000000000000000000000000000..23c8f14701d74c2014dc07c36a5158e8b5366308 GIT binary patch literal 9431 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 KMNUMnLSTZ1F{~^A literal 0 HcmV?d00001 diff --git a/Wino.Mail.WinUI/Assets/Square44x44Logo.altform-lightunplated_targetsize-32.png b/Wino.Mail.WinUI/Assets/Square44x44Logo.altform-lightunplated_targetsize-32.png new file mode 100644 index 0000000000000000000000000000000000000000..a6e4b0a2ff2eaff8eb3a5a4cbd9d98e8b1f83be4 GIT binary patch literal 1717 zcmV;m21@yfP)pLXGugsRCt`VS4(VERT%!xeazf>b_%8CQ3_%!B(B5-Q9%NMu);_p zMx&SrxN+ga@You6Mi(xODL^5?0W_pOB2Dukw4A3;%3^4$;Djjdu5}Z@b<644p zMM}UR%!}7bc;?;HxH?%uk~AT4m@n7*gNDY#g!1H=fN)%FTf0<&`@T;baN2`g5 zd8`3>R6}1F@M`3hNsuYxU=xrEL-pPnEFv^lJ=eH0hXN0vDL>^ZR0z+7p>r3!>VlE6 zVphr=bpoBhI+^6o@z{w;D2?`JVWeg5)F>wCFjnu_fZG?wQ2OI974<+9L>MTC>#X|u zOwz3DghDxAnwFDKRc$3?{*m=4Jh=%*YH zB82kQL=sKCfwGq%! z5i;IK0e`_JsXqY;AOfH4PU=qR=-s&!{oA*KSr)>Y8~H#z7lp0|rZEg`dKAC;4vvnx zcxrJ-=T?U;G?ic&;xHgOsXhXhnhSyeiNJ;J2RP>DFt&LY`ZHZ5m;-LxJ;h47^7kCya9WZOQ z3TLgwXlttpCjA#^oTUZ`T&jD<3vt3J;H19@ zGr~lcfEmL1Am%3^3t1lpoufv6@cv{DUzd~EQz&6$+K#RvGAGcn`qs(dxVspmJcTsl zk<<$)cO@W;G7DwJ0%_#3XX1^UJ$Ql$?8)6$7o<;X%kYDrBhLZy3k1F=0<9&b(ZM97 zGj7^$xd7@qjcLr??4vW?qr-1=O98Bl~+D*76p2hAim3SYodnolpAl}8F<#7w3kkC zLJ}VTeFlYI3rol>rlpfMcq1Ay3Q!b7Jb6DF)y!mHNQptInhMNqJgcFmmS8B(^D<^xN>0%iyvHu zE~hwdm4hS3#Vvi+>^mdRX-4`RJ>6vq`f~ZdiY`N?RlwwxqI1J5KW`seS5e2Xa$x9O z;jK&Cg`PdC<$H$&Wi;V?h`tBzR~ypnG?oA9lMK989?{&&Ui literal 0 HcmV?d00001 diff --git a/Wino.Mail.WinUI/Assets/Square44x44Logo.altform-lightunplated_targetsize-48.png b/Wino.Mail.WinUI/Assets/Square44x44Logo.altform-lightunplated_targetsize-48.png new file mode 100644 index 0000000000000000000000000000000000000000..07514cc25758410c76a71376d84ba4153bd318b8 GIT binary patch literal 2735 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 KMNUMnLSTZ1F{~^A literal 0 HcmV?d00001 diff --git a/Wino.Mail.WinUI/Assets/Square44x44Logo.altform-unplated_targetsize-32.png b/Wino.Mail.WinUI/Assets/Square44x44Logo.altform-unplated_targetsize-32.png new file mode 100644 index 0000000000000000000000000000000000000000..a6e4b0a2ff2eaff8eb3a5a4cbd9d98e8b1f83be4 GIT binary patch literal 1717 zcmV;m21@yfP)pLXGugsRCt`VS4(VERT%!xeazf>b_%8CQ3_%!B(B5-Q9%NMu);_p zMx&SrxN+ga@You6Mi(xODL^5?0W_pOB2Dukw4A3;%3^4$;Djjdu5}Z@b<644p zMM}UR%!}7bc;?;HxH?%uk~AT4m@n7*gNDY#g!1H=fN)%FTf0<&`@T;baN2`g5 zd8`3>R6}1F@M`3hNsuYxU=xrEL-pPnEFv^lJ=eH0hXN0vDL>^ZR0z+7p>r3!>VlE6 zVphr=bpoBhI+^6o@z{w;D2?`JVWeg5)F>wCFjnu_fZG?wQ2OI974<+9L>MTC>#X|u zOwz3DghDxAnwFDKRc$3?{*m=4Jh=%*YH zB82kQL=sKCfwGq%! z5i;IK0e`_JsXqY;AOfH4PU=qR=-s&!{oA*KSr)>Y8~H#z7lp0|rZEg`dKAC;4vvnx zcxrJ-=T?U;G?ic&;xHgOsXhXhnhSyeiNJ;J2RP>DFt&LY`ZHZ5m;-LxJ;h47^7kCya9WZOQ z3TLgwXlttpCjA#^oTUZ`T&jD<3vt3J;H19@ zGr~lcfEmL1Am%3^3t1lpoufv6@cv{DUzd~EQz&6$+K#RvGAGcn`qs(dxVspmJcTsl zk<<$)cO@W;G7DwJ0%_#3XX1^UJ$Ql$?8)6$7o<;X%kYDrBhLZy3k1F=0<9&b(ZM97 zGj7^$xd7@qjcLr??4vW?qr-1=O98Bl~+D*76p2hAim3SYodnolpAl}8F<#7w3kkC zLJ}VTeFlYI3rol>rlpfMcq1Ay3Q!b7Jb6DF)y!mHNQptInhMNqJgcFmmS8B(^D<^xN>0%iyvHu zE~hwdm4hS3#Vvi+>^mdRX-4`RJ>6vq`f~ZdiY`N?RlwwxqI1J5KW`seS5e2Xa$x9O z;jK&Cg`PdC<$H$&Wi;V?h`tBzR~ypnG?oA9lMK989?{&&Ui literal 0 HcmV?d00001 diff --git a/Wino.Mail.WinUI/Assets/Square44x44Logo.altform-unplated_targetsize-48.png b/Wino.Mail.WinUI/Assets/Square44x44Logo.altform-unplated_targetsize-48.png new file mode 100644 index 0000000000000000000000000000000000000000..07514cc25758410c76a71376d84ba4153bd318b8 GIT binary patch literal 2735 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 literal 0 HcmV?d00001 diff --git a/Wino.Mail.WinUI/Assets/Square44x44Logo.scale-150.png b/Wino.Mail.WinUI/Assets/Square44x44Logo.scale-150.png new file mode 100644 index 0000000000000000000000000000000000000000..1ee950afa67cffbaefc7247d6495917ae5275137 GIT binary patch literal 3060 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 literal 0 HcmV?d00001 diff --git a/Wino.Mail.WinUI/Assets/Square44x44Logo.targetsize-48.png b/Wino.Mail.WinUI/Assets/Square44x44Logo.targetsize-48.png new file mode 100644 index 0000000000000000000000000000000000000000..a2ca3afc945c55b726e953720cf37ea9b460fb1b GIT binary patch literal 2125 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 bno1(wj@u8DCVuFR|31B*4ek@pZJqxCDDe1x literal 0 HcmV?d00001 diff --git a/Wino.Mail.WinUI/Assets/StoreLogo.png b/Wino.Mail.WinUI/Assets/StoreLogo.png new file mode 100644 index 0000000000000000000000000000000000000000..a4586f26bdf7841cad10f39cdffe2aca3af252c1 GIT binary patch literal 456 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 UV0k6m?*IS*07*qoM6N<$f=SM9761SM literal 0 HcmV?d00001 diff --git a/Wino.Mail.WinUI/Assets/StoreLogo.scale-125.png b/Wino.Mail.WinUI/Assets/StoreLogo.scale-125.png new file mode 100644 index 0000000000000000000000000000000000000000..1c325127f103b0367f3f863fe65b5715a789cb0e GIT binary patch literal 3845 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 Hu0mjf*D-s+ literal 0 HcmV?d00001 diff --git a/Wino.Mail.WinUI/Assets/StoreLogo.scale-150.png b/Wino.Mail.WinUI/Assets/StoreLogo.scale-150.png new file mode 100644 index 0000000000000000000000000000000000000000..bb194ef775e32f2113d8820c911a6164c0fb3bcd GIT binary patch literal 4755 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 Xo~$29Wt@;d;Q&T=O(9jfjuHO{fT9){ literal 0 HcmV?d00001 diff --git a/Wino.Mail.WinUI/Assets/Wide310x150Logo.scale-150.png b/Wino.Mail.WinUI/Assets/Wide310x150Logo.scale-150.png new file mode 100644 index 0000000000000000000000000000000000000000..884084b3a840d0ff3818dc4008f0054142051cce GIT binary patch literal 6364 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 H@YVkTzF5hE literal 0 HcmV?d00001 diff --git a/Wino.Mail.WinUI/Assets/Wide310x150Logo.scale-200.png b/Wino.Mail.WinUI/Assets/Wide310x150Logo.scale-200.png new file mode 100644 index 0000000000000000000000000000000000000000..23c8f14701d74c2014dc07c36a5158e8b5366308 GIT binary patch literal 9431 zcmeHNXIm59)(#>dD54J{N)amv7(t}B2oFVi?_HV@n)D8Wh$zy#p@?XY%sbuU}uFe#cogz%ujUgZN#f&W%ph<|Xl@M7t7LQ;Mg=vubc_l4?2i zj0!TTkCuKa=}8Yus~xZI?RNzI^zCjuI+~8BG5CG9Ez_NnozYnK%~5I z_v1jIIa_L#aiNjH~trr z|35HHN_GVPl^^zu@}ILm-Brxrry3@dcNE{)#I*QXZ%O#ihu||DvuDK?+5#$;Ts7;^ z{Su;YK98LcpdzoWJR~@S)z5qe)C8K_N;n*mkW|9yPfv&zVr)wL>PcOJX5i-&srb?@Jd(>J!`IG#ML9 zu!4pk;^NWiWBUd|oA!f7B|+OY4to7p9)xPQN_;P>xPx~?>wnef^H_P$J4!VW z(>?WiybQY_c9-KIJN-&DyZ%^&m&`MKlV+Wkn%hbx94Wj*$%p!x-p3bxf8`YRru;Z@ z9Utb|<|aC4aQ3r9TykXV>H*_nD( zPp1=EQd9Wv!Y_<|i69HtC@G*hwc#-1l>4zY}i*Fe_J^W<6t7A1nO(c3GN(6iw6{iZ><;iE#%A_oiSb5eyU9tBHKSkPQ zTVCu^z)suM(rw0#$TS)E?$wdKHXPmH^#c*3LP5h!uV4IDmDuCzvW?vK-Ro50Q~*2E z29d;Y1;*`GENWgOf;JUKru`QmD|=(D)E@c_AY?E58puL+bo$8Xq zAdYLN1)-5hy07;x{VCN@)EmhAI zDEl4AUNc^#Q>MLmLd8=07RTu3FmO5Ujrd1PsSu3j9DHyO+TZLO>Jc0Nsmy=T$Lm1F z!AdAa)JP+@VYhzfh&pUkJ)FE0%n6^+rSNDigWRfE>*X>6iXn;Ff$p97tZ|xr0MU_q z?szz?{s5VKMokrd1psMi$6-Z)&Y-(06x?gLw!nOv$ogvJtx8Msc%WReQ(%NSkKeMr zXK3Bu5My37T5zI^fxt2Ld)Cbkbj8vN409$ka`JxPU5&PHlMRL@k8I< zru-4yP?>uXdpLK3e$J#fd}ANZFLp+nuM9h2&Cq9k@vf8hZqIGf9CzxJMU5{ujCF7l zV*N4J?(i>dmZdg;eR6oRk?W{VrHTkEw=5j~L+nW`<0Y%e<4PI|x`w5C`Mc&Q;>#_c zX-Ln@y*VW9_?$>vdk9i{$|*)KXWC$>-+f<FAa2=w#=d&8VB> z8_A-h4yWK-MlHw)fLg_TCF{zH_1bW+smT& zs;FMxt)lusnQ=GI``IjP%p+{9I{NY=J7-EXN48lTLr%8%YoD{%jTVV%XWL8b#!uJ} zh|3DE5>;*EVp+32zVJk*%_S+k*k~=D3xYi1 zSGJN2=?^>UN)0+gkuHMHqa??&{Mk9UbTa#)*zK`@P@yp&_2v<_F|PPHo{_)30gmdu zsgNeM!K~Zqgzv+LEs_DB)x}4W?${+<5fAK?=rTbvn0kLCg!mp$E=#D=ZpFjdLmkM? z%4uvwRB?QNa@iId{n@}N{$CuMcr;PfT{VGt0(pYfL=H|T`3 z-3aX3l)eq73Abk5r+i2IGfz{b=Ka&ujowrAl1rNG`JGBI)TOUl{FwNHvl*c~)iy83 zVmw%_l-!S}_PKr=W)YF@()@m5rwPKQu8<~{mf!E>1V!>iI4`#TE|~YrZR@A7h6yi6 zQ*SfKTT@?qqtKy*ZTPw2>dt1jmMb;JQky7+r)PkS`{D78mHm9Xlvv5)|HR1VVi zxZ8BqfzEL37~VYW_}O%g-5YfnigK^TFu6|edZxD~HCdT0sjZK7QWsL%bRhB|AcirI!bQZMA)6*pCM?GAMtRuVY1 zNTLE?X^BB=YWA{govH!b2Al^zWR@l*SJLil<$O_rOof!>J$t+tYp65xxNe1{$PPaI zJi_C87*4Cg$?mE}(X_0YdY++e^v`I}UIp#-Hqp14z$PgHk}iLQxCwdFjOW=^-5MkD zUFBdGdBB}3cIRCJ2|GUz4j?Qrn1(8XrFpipzFF{_q>k!%;57s}xNz?}5*cux`VAik z{r2@^o&@~_D%E{C1D?&_HxXMEA-AJy$@`LjQkf9qqrIzTmW$C>;GUli>-#OC{<(E1 zgO&FN$1RZfv?>8>p-G3L{q2;Akjq^pI-CDQiD<4lTyp1~2?(Z=xQ@8d~srKzH_R7sgkx7A5<2Q>(8d{Gos zohKpe@((_$+Rfzgt>%o%iFvkNWumpfFj_M&$Iy#i!iXF0HWo{XbqC!a+xzu#laSe^P5(OYF*zw>gy zhNS^@^E(56V<+CdiHsKv=5~Kk)4exZ`(gV&#PC$wjk2h#yH#s3kPm$cZ{fBK zTX~{mqgR68v8EY^1{wlZ(Vts3yY}IacnO1wr=LKbIxDb&(z8WM(5SoxR(enbBTU8 zCU~Zm4tr>YPL_SG4cJ5_mf9RXa!VsV>5>x?_Ai*0=sn&rE!i+1Xi)lku%#4wy&|aqwmaE=_Efc=$S#drGjry>V8ErqnVsb zjZ-rD;VDyPVe+a$2ZuB3vv}J=owHI9LjKw$Xn7>(X5(l^0YsUM7i4}5-(8vMJ4hry`{dzy5Xd{fyRC*)J9t^y38B2 z(LSd>U-x;{{4yFT)p*9%odx-mchhJzDR+i4Xk)GS#(LxQMRuJ3z6dXVUZ56(P$`=8 z$m9yU0v{X!dpz)<19zaM%2XI`iNPKC2oK`8L#%n*=Wd5qp>zs4%Dj*_$uj|rSfGdatkyoILv!j=*gaJTEBSPs=3P(jsp6>Nnv~zgQ?yxoWt?}du7^q zaZai&Q?S{(mMm*|+7RPY$xE+h6DGK@5gU71x_`7&@ya*b2Ms$~elu-gMAwgV15)d4 z#_JIYH`}*l8M=fy3Ck02k{(j1NK#9`avk03&`iE)M_LviA5 zofC{u?!9+%sQz~ib~KfK6n!6;KRVe++g)m)M(gK0V9BA-wYM}n#=E&{mdXs%sgZ<& z;G$ZsJLAc^2OTrU-{!=oE`eZ=0q}usFZ5-c;hvsZrEQh7tjx<;By2cN6XV*z5*^q? z5hE34m}McjvWW)gK>Oe)6~Bb`y{X@>DY8zI*Vji_>cp`DZLXF}8RS*;cKvO7)9v`& zAo8&2yr294b2K2PjH^}aB>E{i?rAfG7(MoN08!@F)Rna^%Ww3vr z`NE6vbK_ZrlaD2!>0H4w+bogW=d9A{vK_0n^*U3=S;*5+3q7E$Sxgt|@1(aZ|obmOWMU0Ya_SfWT~EQ^I* z{4Oz-sxq7Q%~D5pd`{r(cXqOmMM9~k{dSWfXfhC}WyLAS{jM z5@b=C>vsHBGs5Xb$~u$l8?V>C8Y7!_ty8P$CiiKFEC@=N6MRNVpKe`2OYRaQ#0YdE zTHNF+T2L_?Fb&~#e5Eg!dFq;j7~}1ojV@jmFzO@5HH$QtPbW1Pj*QJN++Pfw405nzmZ^$urik?H>@K5M1Hh~Wu=$lkml$;bd$L}gmpd)aISw+8=%npr<4)6HZP~4(#M_P%G4&r2t_|Eq8e@@d z4hl~07ZUVe_s2a(l~vmFyR6z6@(O-aI&*hal^vaaFu%*Et8>Rd1T+B4Mik~Hy#=@O$rn4)b%!ETZm=1BM&cBFqIv90IpM+sGBCqjgio)1$qQ2&Y#Xe5ZpxXmy(}oD$O= z5ps`UMc?Yx2<}^ntcZU`y+M=D0KLBNB7iO6Ql8Bx5AH}DmDSS+%-sXtOgL{i@?(^5b5fn?Oka5atB=-UU*T^HB!v&oF81lm4%^Co5Ub8mCh~lVAoe z$gHOqnTc7*DTe&QQYj+Bv1o0Q$7*fh@FW8;cu>Kby6S<3xTPRtuT?odiH?ogQ_n}I zQb2%aM#CPZPD6|uLmebI6Q zQEll4$I2>BXu)0D*7%KT=j}UO>)Qd`1dDBsS-@>>T7jVTSX0 z%c&+8&m9+L9+cMVUs`uit;-6Q)6%=I4r&JX`bv z$}!WPKniho41N093m!& z!w%ObB*6lcMX*I&2KPu$_eM?2ZvAgpF_qmOIBmM6eH`ck71L89IFde+-|?p|0E#5B0Z5 zix-LXFnA1`?8_~hH|q*32RANfnwmL~jO5P|BG|hK37%UMNepd8<54(_-M+uxDmo{@Vt2)w3snGe0k+vXwd$z0nLuk$U%%p8 z1(y15%`f{~IJqIKQu^%Y$FVpOd$a_zZVm@CygTnA$oD*xlmv^j$|9X4)8a%UFlIVB z?8ljMj^gyk^%WI$c7)i{O<8Sw0$|H|kbM_n&P7=cN?xK9jg?1U`rLV$rPFHYN+qvG z4g4KeybsQsIvjrvw~z>laSkUDNjXUUv@ZW7VjPwGU|tiRIi~*O1Z&$b*CEP`RUN+% znBBkva9_ivRsCIsG|STdCAH7in)P@FXA>KH^b;R@rIf*JiF>steOqQbxxJ` zhIc&}?r-qpfoFd?E9=XdFi#{!G|x!paD)ab8s229A;DBK1-%-pf3k$@#R8Qk<=NNr zS)$!yl+v|ub>=_4$@6Z>9)yO#3NTvMIjxD0uIy3l=jVRx;d^<8NxJ-( zH6%g{p5ouL4n&E%sPN9bn_oP<>=09yHjpcF?|D$490XC3(~8o+Co^0DZhIWg`59PV zG*;uuK-a(*`p&B~Q`Y3~pn|3bu;cp(F&mNlfg@)P&&Ii=UTyUI{4~);`nZSn#RWlTQ(JpEhQ=m!n2$h zWH|YqyWh?G9T~e58mwc=`ijzXpdYOyC!uxY{D^^_wOP`xWHL8O>g$*#?Laoc(R8kpsNfSO%R;U6gh zL-rbtwnB(EuusD|fr@jt=gnC0nDI_@^qm_|cnb?=_afwI9Pk>sksj*wt-vIL}>Tj^>vr*=qcY0gOpNd4%`#F*f$ec%!|B&a+P1WjG8g#=D zjE$E&&qo%#Ojdpie<9?h>Un`dbwr03;@+Y{%PLa%Ev;8+n{oR7c!M}RT#kmPqA?Hg zA8K*#TJ9>!tdq<(S?bg3>QRAIfrVv5x7RamXM#pSF2LAuNLgjAQLPFn-j zxAZ(ZH}GI5%Fm5N0adXAbYRWZ?jko!nf&4tv%U;lV9u%Ri5n~iU@t(($m{z{X70g$os(P%2x#qRE*nL&KPvVy(DBIKf3WG z4m5fGg6?5Im;Ziu>KQScU)5B0Nqunc3Cd>}-*QQBHSXmnwz3bgS|5z8PF>3C4=a!9 zo=UXL`q5ZB0;9-VCX}{xj{OJIknE%F=MVuJ+`rDAp&f2x3X&E0c9B*VwS2zO{0;tS zO4R|EVdxq*-W4!&(gesqQP;IuT&OpJuoXHu?wS69q$wgH<|zNgt>TMFdc(=V=E4ny z)Y8+A8e8t~;J<-*Tg~EwAhoRk{30M2Bn7;e=%hFCpWlc()Y<}{4Sws8ne%Wn$npDh zcIqkeOphT;Wj2m$ZlIevWSZosm(TH=$w~2fS60TV79_9UyX-WNFt+8|ayP@Hr0a z5c7*yoHhOiNp%xv_ir&9$8cBwhj3ZV>1RaO4JosyN;P uUuJZA0!ak|^#jew|8D#*B>#_KIO8(kkQx(%Ss?*rfm9SV6)NSeBmNI6_c1N!K`mRV5NpUIFFe@ko1 z=JFVR*Ec+Sslc^v;l!o;uEu7`XHP3kYRI=ru!^&_^CQ?h;(0|9j}7O(*PBrhLBu=u z+|d0Za{fHOvuq*T9cc2Y_&f5~6kbhSh*RR?TNwATxs{8ey`OGiw|a^yhJ|CH~RG>W3eltY-sle*Ag; z&cIvg%B+?5xq|%+R%D#QH1@!OB6BI+BD`j>p3+voXXRS|xDA9MEju*B%3C}TzOB`W zkp9^#oWuS?>oNHwq;f3Pg71WA>o7qrAeY1wF1vLH*JHo;e#CiScF&3624ZzAf1CnYGy2Nuzc;h$M*}!^!UsQ>EoSXaK z?G%m0dje|Iq;&jJ#I*wLyleeF!4DnxL>!`#c>w8WdfOCD8JKO2WZ5NEq)?)FFS79f z^JK)8n^Oy--o(}skGEHevb^N84Yvx!r8s?7mrUmu@wk9KJJ%L?-{rr1}rVAgMekJ_i zn9P~#ef#nl^3|SJT1Blqxkkz-^ww>)bE;!Js(xZmO}el4^;_M%zlf@?fDfE(2|)T3 zz10s#OMKPm^{PeRa^DX=|Ek;%*RLn17QP(!+e+NU)S-xs;<&erPGt>}d&=SP2I$|i z9YYXKy49?hMY~;|R;?P|<7E-xPBm@Qo%C!#?@RkDew3g57+X?GhGrx{KFX1=J_xC3 ztUu5S?vcUwDE7z*?R8i0!wyZq`p9Le%|fl zgYXXtp6h>mV$o8CP(LDqEQ7ZZni<`=Di4S`rDe{?a{8!*(DB*}N(dfE1hq!9-AC*f zJ2HPo>ck`QpRumM!EiLJwJtz(EklKG-mx~8&et>kP+8$XxqovVLyvM?{G zudw@OVrGMzmyR`h5pr0{LcCUYVM88J_2P=2oi+z&dTGv6_kA-ZT(;}55^{kHvp@OI zBi!@jVRno~qOwi!AWHB83(E__*`rDVmnse817 zy4c5{C;miGQAkBd|4?&&!|DE=yX`0M8r-U`m~nIKimxc^(o>h_Mz3{BU6Gx0&~yJZ z3Ew7kF*>~q^cufic5P|A1Uxw$9c?GBZ2E@}V=b}9(Z>C%Zf3jHStdcyb1QL=?)JSV z)?0ZlxX$~IZKG2t+&0fq@x=27^4@gvqs*9$^&ZUG!O)&nvEAlzOmNr10#{<#{7*ic z4ZhjHlT71(|K}HL%t5pKKvvMlw0UfW|C*Dp-_@m`6__)=maV@+Yj~(RCNIQ+?c3y)IIs1p^(Rp(51sA)0afMf~S+*sZjR9dxoAP0y57kf{y(-u1$cS=p4~zTjPVT0#B1s2Gca^*UtK4@ z$T#3J-&|e_Sk7GUDM(8wJ+OC5vaP3Ucq1rXA^i6^FGzGmqh7SKW0S2du})5Dk9!ny zpgoT=Af=^=u+TI75;a3Xd$|WRan54J+X8n>wqjo*d@T#-zgK*=9385DKYzsLiC7BR zY?ItXBu15?+#G?lQfaG!=ykqM-ht0EQrMySk)-k62be_p=K%l44br8KdEdCWM=J0# zDmZqW^=t+ma|J z_N8MwqZgXw@S-0jXSF7-M>36$nDZpR3H7vb~yjz$Em>V0mp(0;0Dv0!!r zVK02&twOxPUJzU5u2KMDZ>xJ+QJOr+TUC4G4ZeeAUmI!+&>GKC z5Ev&whXcaAX(0#OaY=J454ghj>z8<#o_TQghyW9B{Tla^Y{h$aj5>$kh+^Y-{XPt5 zR@m!fAM#F{Wl>7l!i#C|M964RU-FDUD1o=)8t@cfvrvJ^7UsAGmaw)c4)58}&X3l&Y@Q zFy=T$q#9ef>}UlN{Vdlr0F+lii#%)hs;)&PqXr*F-(-I%L8iguAUtGU<`fId*DsMT zPP4G6-?3SHuiNyiZU1FSDL$vmHbBTFLh+qhM=nGqvyYb_MpQR7i`-_IW`5a%mPjhB z9V|TOoK@%Q3u@t1sghY`Z* z$PWfm1D`z204ZyvD7k_@{pivHxMFts9Sl^z$(Apu=OA@55c7zJsf(&a5$V(iHRwiM zcu9oQ#I@wVv@eV#;ohW?n0F#r?s_-xnEfUzp>rECgiES5l1^~yyrSz==uF7e)@(iZ zejHxLGx)J4S&(_Y>n{$^w>GuX*e>TdUL$^GgQN~?M08cxH#FTQAtsH{)b{PX4;n2l5+u8yxO zFhg~SOJ&l%TY`V?KyUjy7A`MURsjDek5kvntj9yr%|7u z&1Zyty|}uty{Zd(*n=O;e?ky7tDK{6uG6YX4I#9H#ElZy;Y_F5Ujl|%j6`Qz(~Rey zRPZ1<%$P|F1+|X5F{Ole>(PM#gJIm%txQp*^Tyca>yaRFuTI{p4^i$L_1jAKZ0AJa z0*=F)(EB$~KZ+x@#DW)k`HoduXbi8PNsPQ3p(iU;vmODG2y0Eq=@rjL)i}c$i${+O z|9b43xNbLDX5X`Yw9d@Cz+)oXy!(RoBe!xO12c^;KW#<;Q0^~-&AIiEs+YvX|Nhlz zx!N6*wr^d}e;*W;0*&Jx`?A~xY`61rXr4YK+33dFRB0E;$ z0xs%CS~}V})^ex2v$DCQ=btqbvr=*3bm5{7u(|>J2SGzEj#}t%FC@ry|@1_9Z z*PvXAls_x{PiQDR{e54C0s*Z+;X^ zgl6)7G1e;S;*x(4wxau{TPPN`&1}eYj13oIG5{!BHAXR#k zE=2G^xUJm8W8Vsr$61b9K7v=+`tZ{42npKENkW;&#>OCKhva$V*+0s7{NI6OC%MCa zE>ukIf%(w1YWE!YLkGXn>&+u#_aE71aKTUbRyy)LYt}1!E83!0Rs*@&{bYPsb=b;+ z?P;#YZPwsogZ}(7G4trC-SS>cD73rm4*K*@{c4Z9sTp%XZ<76~d=A_V?8gA#hCHI? zAe@UgvamsEj{ch*(^ui%QEEJ?RYKVOyDGgGXe>4iHH)*G0;ge}HmLTC zqlAUKx41jLPdFL&#HFBN+I>Vxe4Bcf-yBZwriF$6H-7vJE&uYDf9`lIjwmE9J+!@< zFaEPrw$E0k`vWLsX}ZnWy6-M!UjBmWo%w#G=#C81*G={^ z9}1_>yOZZSw1@jl14{ zr!w!sN>6FI1{pS8GK3>ruqONh)Rpghz7bJ3w4bJvJ?}X0hVEV+oI}=52QGNld+&mN zxP5%yyLT4<#AYpyEbbW`tc1V9JW%of9qVsMSa(*ePRdC}4&MYFAWv$uvF_WTA8)^mYxOzb52fs1?srMFeHM5L=#SnOe!5o*51 z7ybbCNcbcB4=bTREuReRgEF++ZjaJOE=M|f-vs+x-F!-<*E(*3&5Q-D-Z}05QvUe< zF(5$a*J-A*yCQq0>E87X6zo8WP=Sd|M+fXvH#)|V>YZSZs zmwOE*R}`ZR(HOnQM1PZ0?fM&$Cy3DU_az*XJrC79?;z2P$G)?OBQER;c>^f|U;~4R z@){f4n-*%)(TH+!Ph)@n{pcv+MFLtmJT#`>eptyie2oXd*aeaQj@h1NG8fqWuS_Kx zJxSh;$ZSyn5ZeUWK1by?2LG(G5HjZ@vpf>ghU-`=8n zEDM(1!??qQsDHCOro(o*tayg7!I^{ilKqxF6yiI-Yc3#z<#9hFAIZ?Yx`h_jj3p({ zyqnjfp7flN7i+H9yi98yit^Ic?#tjs_Qgp>?!q=Jm8$yk#Y2)g((BH+Ug^8>#vNA34Xx`~zQ=!IKch*is=SyX2UK4e?rQ)`^_506 z|CDCcY|<;mT$Q&(WEhmbvc^K#1J=s&8&V=ubkDcZGWOE=DSstiZrB-5oe*nb&vATQ z%w8JXS*#08b>sobeW8kXgr1peO97(us66gDx`5`sI)QQ5=0;o&NPu(ryWYZbVA-ga z-tbKLfd36v*KO@nIh|z;^uXwR{SMi_iexKFB@~Tsmc{cSfw0s92vn{_42sCbA0>dqoVId?<{n>H)>_Nt!`hn z5P&%PmFdl2bumS~oS*IAEJh7!6F)-fl5GOTe?oOEMm0GlflnZuS3h=*8_h0%6-o`0 z$8P*oH+~%T(hglcbJ2`4#zD}EdK&}EBaLn+%44<`Qf;0O!VZ?dIWo=HJCYK4*|AjwGb-%b$&dKOM7o&puyvsogmtNH8PZC z+LLofKM2z+BwkbD&F7vsJ(06+nndJGIz@q1eC8=(-?O%E96iM)CXZd9GG=x_wk&;h zPg1X|*^61qW%?}J8zAoWT{nnXcmkLvFXf+MFppePWlb4AX}a*XLI)dExUeE!^VkmD zs4b<|i#LqB@%Lp$2Qqj^0fz`!Zl-rNod<+l?P%(PZRjl0y>@)r2AsFzc5(1eu_QJ`+CB@Ojn~&$7uc83QTGiiIZKFpLC6c&~O7b21 zq}KwJXB(=Z?!p#WB(jHj;^ZS=^e&cjQ_Mc>)$TZx0pk}uqI{JZ*Lw(0&}$hdU8Zfu z;NNG?%Vn8K_~i54wbtlcB&5R&wpDn|E-re%env-cAMgXR_k$B8HQzOQ=<{wB@#x1n z)KUB!$kNAG8KO-z(eUS+sWzMG-;9}|#{Mr+o+?5fkUeoSRth29empM2+d8b;tRK+N zsL#%mVpgCv*Yeq&cY0COIioR_K?+XS<;yp8sGCzMpyQ!_{Km}rR)*xV?= z3NjgaF`ZkgTP~%?GBv3n#Icg+P9A63ns}8g2z)WEXyi_N95F(=8!`g&QMK(r0Kcpc zRW8W9mqtWo6M@!oU(ME*AJNL(1XZ8d<#c7=Yr5uAr`u$*P_b-~?o8HGJN)#Gonn0{v%+=y z*KMLk{rT3X#oq5l)|NNgAvc;AQO&I9qutT2duZE^Do*x6|Gj|o#jAher^i*A(+oDd zE9D+;yfD%Ega>^HkjPG2O|mp zvke3)-t2umPu}o7=vtD23jzQ6M))5?D>JL~z(2+jrX)|M-tSDg%MWW}zgU(Rwj%Pss2dMj3<;Mf=AD95-{8@ruSaGFw;Yb@e^oVfB6AZR<(!xC#j zF>7UmaI7FQt7jb{b2I>~F7Za9Jbzc;4q~%CN0AVS4?Yv?ul2zLQ(EmWF>{h|ebR#5ylaKp1=P^;CTmEgFWB2m106q9b zU)%!R>;`Y3R576nnkLV=sV$Mu6~4oxZICrmqN3|Q;)@`nt%ay%v>|-&J&Xb&eK0Va z6(;tA6Jd=;Z4_4<1Z-OFE}8LwR8ORugRE~}rBNy$6K-8OcrQGd}C2-Koq5 z(%yAsdu8vRfluLjJ#c)J6t|=~!vgbdEMmP3m9UTY&Q)y}rx+jkSY>A>$&iRBF!oMa z9R8bT%_&7+=`6hNR^k-5yX9rT8X@c_zpDDk;^FtG<=z;#?Z8Z%(Up>V$sW>~lJphV zIztr^4Iziv?FB2L7g5gV+dlq~i#E-5zSg`f9dD`8R`a}s-SuNwKHVshJJ%Aj8|yp2 zj|n#ZwRxNwZO8w$n-(SBGKik@34b)wJOjm^(S4cvSG$54&j*3tvrd0|MY1dFp=|R5 zxC>3`Yv6^@@;ZIidtwS56g3W+?~7?UpJ8X>{iPzy?F}lnyVm-2ldfZ8IqZz(=0yxU z@)y6X=}A%eLd#kj+;Z-eovSE(^`#HG`4*IXW4I67lUUuA%T526- z;Pw*X)7>_BkE?Rx$`FlDDjR{!jeB3b!{B*Np9zAw== z)Fl}GnFBXEH1iOwSr6%SjnG!RlY`Kfld9&5fK_q8ns%Hur-Xiq!UtKIG#j%|1M{M* z#}^FXLhr6w37CsTAs!lNw!U-7Qv3|otXF$TdzWB_8Zh~omJ7l?(#m0H?F#9R z_@Whux`Yw~aa}pC?HZC5BW>0`hX@Okd#zbxf(qMkFeW-P-~}%X0D#7;FSy3ngcB!W zwb{=6m8N!3Z{$wB#8L2pDJ+&K%}Z`|up*LgjwE($mL4E4zUZkl)0%>;quZ!ti}~{G+xl4o6Y;@CvWa zD5_K29OhnTPMD|uCC}cXt~NqOQ{$kbT%n%BYod2BA~}w-){|~fcO7)xhqPV^v@iu) zS-vr!FmjnQJMyIDT3ie$+vt{yuc6Qd&0FISfml0l!Gk+!Eo1J-T`k8?kiUKUY=oUE zW~{xq4R}yJ;9{{29BS}^l6`nAIzVsN$16Kk8h?EY9sKh!!-*D0_!wZj{i$7u)03H0 zhXRyj-{@?8cW-(t&3bWa_td68&rn%U?@9GuLI)4ImcQ7-JAV~uE0=5vgl+FR?N^pV zzXYfc*R}S}FFT{pqEO_a&UYNIRBh4u5g9Wk(!atjbdO#=cA=_N`(J zO^$mY94dM|eyKDrd*wvT-!>0mJ`U z8aDtY8UiyOxoJs(>sg=NjZ_0SfjjtSIp_5|*>ielk|u^3)4D|!J@@m?$FUB}hCkB+>j^Y}byqfc@< zC%9oqqPF)7Nt~R?nhibL5J(WVx0;#9=J*O&<1tkS5+MhS4 z4B5UCv{h*%MmTK$y0^P_Fj)=5^x~U)5)?^bW&6-z2lH~??4A|Dle3qbdN&3+)P6X> z6Tbofl+GF%R(@Ko-eG^IjVT>`di75{9BN$Ba2BXOa9f!FH1HC{Uh_R<_SlL*u#%Nv657Jtxu@hKH_akDh>_T^7OdR)INP^;`?G*y`{@GZo$sg{Fw@I6c%}Rq zxXm}9`I9#_>Q!O^m(`D@;yttOv^vH_r%Z$%iRyRIRtHJ4yp7Jkrcb%SJyu76_Z8UJ z^c|ZZ^bF^I!#c1ztnC(jQ(k~yx|=SwB-s7y<>ayLK_hGTuw4f7y)B+{ey!Zd`rY|) zScPDU#A|$#UYv_ynmPEM`jjA$mLG|6%ib-Q)8;#EP@SW$_|qHR&j@ipid4^8Zsh;#** zZrBPSG+_@YP(f6Z~M0v_KINj_gu%Ne#wKMRAc^ zUQgK*%v74qys$Bw!b~XGQNrco--qPq&x2H$h0lXzyKjUXR6oG^TH7mh4Rf9@5Qw&G zHa1=c?1l2P5iw_veP?x${W1+!J)yV@7RN{s)P4BYcll2fbT^bEVk;LBx`Zcq%$g-J z$rClqmFTqAW4n4^wXsp;V3okgnF!pz8xVRkvm+@!yrPygbM*4|XWruC3X4D2_7i~a z()hNjz6eVgr7xuQeGF5A6fF1$Id_5A*Pg8sUG18r2Jv*D1}XOa`zS@rPlHRImkP${ ze(h(!*9}RhYjTWaTZ(4FboY~%;pTj3OBgXsd{{!f|8MQ$5wj*d*NfKXN*LT0Kkro^ zhMZTFXfyVJ@Mag)_7@|mRBj|0O7uX*7m=G(YTV+;OL(7KfuS9z*T~@%-(Oh3=JKx~ zCq|ar`c+(E_GOOYzdG==lmo$gz`TW+ett2^JL;IN=f%WJ{|EQ+R*mhDTtAM&ZaAvv*BDF=7oMuiw2N&_2S00 zrbWsvGN3Hv7I}|Hxg!w&Q*6x?&v>F*S=rx%cm8fsH@(PXLB!rX;YeEUhzcMyOsei} zWbBuko<{4a6}wY5e2p&GpJyssTZgNOi}6-69x32E;|IUKr4-u_j_;0G6Eos+bn!$i z2M<41yAZALzRajleNj7!)L&9NcS`ivGNY%!&+fI<_X_Y=(-V;ChT7FLum*8=l4e}< zZAKku4s=(NW96?VD&D)ioSLEq4l{FyG@7{g(|ZB11DX)w*X~kiMgvVFTnyP%B?F-v zun*}MnhV5NVhpMBDw*1oWw&WwlHNyR_pO2*Gp9yK0b#Y&f5`P8QmclHMW(O9;|l+N zi@?}(*y)06zAjq{nwAx1+!FjfgRU#Z#I+}uH2kSmZeK4@a)1>|yh4Uc;k*#mPEXPt!L0j$0HNX9G5_)>{hgld%H36wX|r{wNgUk zqx}xguv`*&yiEMG=@E;z9dho0HI9A^M|7?8#PUPT(P{H1;*pNqB~ZmdCb=IHxu;mKQ4@&hae2~EhF4A4?e#TGGnwPY(B4$F{FIsni+JnSh`JNJ< zN>Y0qauCB0<|eFdcP=9AWpiV{$$?%T>k@@bzeRzw4#||&n5yNcIGwQob#9I z`E&(yK=?B{R$w#X>VaQPeugYSUAQO6T>))NcF*sM2l)}nNm-6juo4@`6x_N|5O#P_ zofB0(nkZx&4MPE_>YpIy9RWdZa~&hd8`_SdVQQW*CnB96pFI;rQl$=ZVE5 zg=|2i_w%6q%P={X+3?u~!#b)P_XFlU^RR&F)?U#5aYIDf>Zfx3wZh-U#dS}mdK-D= zEBCQzmCoYVLmR(GJ9{X&U*9`U+iE2zdH!L{h@+?FW?w!DPITn4ox_38h&WE zj^x#({-}Ntp!Qezb!6@0EbDAJd}Y|CO|hVQ_=iG*g_^+W-V~!^{2%(XDjyJ3YH~9l z)d_Xz z-n_r1X_-Bd3M9uk(JhCu@JURQCUf$+QuE-S3c|}at!raF%pP~HM*57e0o!f+ZzfM_ zf8Bd0yAW!{Y7!$NLIVjr+7HumK`b|dSuMtJlA(|WLbK`vhCEgpW|Ifhpm@D}*|K@Z z+&`taTEz|0@>z~p%!0CWm@tWMT-?8L{ONRHMycC)^2@A3rM?oVOccz3ZE4_idviEb zi}}eR_^*8|gdM{KXe*Mhj{yr8`nqF;;YxM`)HCmYl-+Ohale_l5D}kT;!nq|JHK%c z5qo(t`g+7j97K|8o<54_e3`yKw4nCGp_{)X?{tQ#*r8>P~aTWw6rUdQuUNvN%bri`+Tp7b(r8 za71u7Zxn2f!qDvcUNcr>&MnyG&?%1pW2xp}$W0oP#laOhM=Eqq)m=5b(L)=77fgpF z06lZK3|X6|e}zqKH+UW1_uXNUStPx`9WyE75jisD}tx1E+AdWxgMQ2d9o(0~%Pu0AL_ca3j@K#=2f;f-;?o`I6C zoy3Y)*zx;I9eEne7^B49%hJ&?tLyP0$`N0c&hZ4!+Kr3Tn@$5TA2Ga6bu-4Pgi{tA zCm#$p^N-~r?#;rJcRRd*R?I+-I&@WS$*WS-mG@`^!(5Xeh;ud5Zz@vVTObZ~0gbph zG_29I^b6FsK%{~@)9?3fPM21Q=7VLQm2Gj~^gKqZL|Y0r1%12KFR^J1%KwarL1HbX zPuD>mEE;c@PJ{>bD(tWN4vhr??FCwYnn<`4ylf63GM9YRHP8N=_1yuSgmB7*p5dLU7KkTfoW~df2Nm4vSqi->Q{79X_2CDHbwUvxcn$-I1%G-1fF~D3HDF&+PT!xO|DDpQ?;VN9(&Q z-mZWp2F=)%DvaRqalJ(Vqny%JqLWU`mpZ*rT_v1Io0pW}NUoqW@vJzBj?K}Q?>V4E z%zLad-^08(R8VEV2OQ|9dSg)m8{c%AitTx`w-8#p$*4E=>)#%l=Orfsd7yIot8tfW zq&XKjNJDmrk!glk`H{01BXwt&L8W)(^GlrcUOtifCBb*HuWe{4Pu;mToU!G&dGqnc zvM$&vkffMOGc{tg&Ih9!1B)F8M^>>wSEyWkkiONguiM*1?aWHC<-A>kmQBqcA3gmh zm&-A4CB`1@&Zz4BWAaxHp>q**25Vh59Ce}f7u~ugwHH*m{xa>&MFV`DgL->1&pokE zrscg}m$%R55z7;?_Y-NL@xTThUy@uLs)<)Bx2!XbVI#3@dm;fVH0k4 z%{ea4F5fgS<#GR%vtCJ_tbQ5ou!lk6o51cvGSA;GHQw?36z*aDAGvKkjBjyUu^YN> zgVGP*ie8=Mv>1*NNGRS|)w&yPj?2Iv_rz2F@(H0X z3F3_q0O$AUU8@isko%L!RbMo(A7VVZO{QrxG+h2paQKFGe3+(Ebh)t?i9#A3Ku<1r zwvZozHL8$1GEufg8VXqi9H2r=GMhBtxR_;HN@E=}vT2N5ER_s#t zZ1!U|{b4Nxv)B30JWI$!kz#1=?0!PClKw}1WWe@z#U9@6Y*dR@+h}oei_L1~^Qe)< zBmJKlZ8%~?_39_s9vxOYKXcW`GN|@>)X!$_kqWrU_u)v@-CU%Dfr(2Bp(UlbZ)W)> zFne3|s6$$2s^(6rG<^PsO_xH-zeJ4xj|_~x_{KF@gk~v~&@iQ!Mu<*Hll z`Fj}FeEYmft)46&AE;0GVL9Pwxw$S*_99el5$a4+aCC1BEFAem(mSh|W#YHeLRJF#Jy~wxpBp zxlHIfbr|DN2XxcH;CAe7p>XU0#l#i-n&z`OBv{{yIk=$hy-WJt@YuwZ%ZsAx> zJXh$@aR1jHj9RTW4+(4Dl;M^(PCr7pYE_1^= zs|u={ANyhUCLbKbaC-smwiYetIO2sbeA!``v0ta~*2{50&D1&#DRpHq?}t27QT=aB z=|6l?V>uaZ+BI0Id4xK4&l-HzZ=VodJ3fY=3?Z8@nk~CQOGLa6-i}N?Byd~J8#(d zO5&Rj$whbIbm+~o{n4t|FMqs{j%*UCF9ef@*Wmq%GPw*m=yLA{U)$W>YFWzX9$y7ghTV!TkZm$9m)2P zi=hj!5$%!|VcDiT!gFqySiA>y5a6DOrW8g+nlKtLf{!`u zwv_rsG+8O3w|K*2m{V-B;20yoM9o!2#7ZUFd3v8ND{Z6v%Wq@F_`rne+}no?XR#wt z6STD3*XT1Rv)`DeS$PTo!ic^@uh4U* zaH--j2yZ;XK|G?YJZ_}9^0|O(aKg^+4tDVS1>GxsRS4I~Ht9Xh62KGo;fm$2AZ*Le z9#BooRS;`K%W{c8o0}7DKikcw;TFXvC?*TOKl0=oGi-Ga2|zLKCYm&rLiNBK7?PiV znb>R#hcX8*ZJ8dst+&@hE07le8}4p8cnVL0x^*Z1R@Ljgie=#pgSU;d*kt&bNwZZbd4z z4i)#Luo^NDZN*J%vM_$P(*(taC8)4zFnZP4OTAkFpU>3YoV$#2^KYQ0oCTvxpZBcp zc9N?prBPYIL22^{>V7`rzQa1$20rYu3_42GLchM#>iKxN*^{^=(+b6_ zEy|s4M7um+CtS#PL?wdpo_srFB=1=+u4mMF(T;7kpDkXQqFDheyZ1zJP<{dSqlz zjEKXB#Z;p89Q()V*lqH(^Q>=S0_Za_nf7J9toz4e{n#q@uE(Fyb-58unejUX=ARKr z8MT6@Fby|>i4aTp@Ckd%(Gf){<4mcym?f%L7(Elcyd z^Ku=eH;gvYIaV}i&&~DY%9Vec>Xy@df&C+5PgraQSJs zFs{q(NZq?wyP!k(AYVOs4H-;0>9~15oQO^6+yQg8RMeJ@fx;4TRir{?$2?P^iczR> zKHr^Nnnk$hJC$6xq!=^T1K8=hXo@}%yshalJq86j%+A^{E6*5CNdv{L7ClESPs=~LW_F{#pl?q3XMN0j<5rukbVGRYHL zvU#>ItGMUf@G~!|#YtJoQlA+eCYg>>eMOBzn7bUyUA%*<@I_>jJI9EPqhcQrEXxO+ zAdZ=JnU4X-G^v}G5JXj2Q&^&+>2@f;;XLt$A@;TT{< zvsb_bnhUCo#*Z>DSjT4v)dbEcEk#4!T`%5X#>ctCTRv;YomBT`T1I_0uC9!>zX`Vx z-0N$bALlM1jk-8HSI+2X+(RLsPVKnl%0UtRA|<+GVMFE^l5s~$@%Y$8>zIy&n;zei zq{kbp%iU6_RuhOWM5Jw8#eW4`Gw1UJXz7l;eWN5M8U>ulW3+8P+LR5&tt<7fO>9$F z(rHa0)bacG6f?L-?SG1t+m~_=?nH6a*_u~p(#Et#0&sJC9JWJQ@NXQBvokv0ba(4a zW>^0Iy&162!roR>NnZb;<}*8@0qRw!@oskuF&_EOP2t@#w=_kS9apWdpdoG#0iTI zHN)`EP8?7i*NU1Oz-g{@<0DpKslbrA#z5+Y3#XisMNvZ;9 zRK!bT6^a+6bWI8n2ydz!^KX;rYE`?KN^buB?z-K?s3KqW^LdKJ-)=hLM__1*gO`|} zulU0_AZ)eEy<%5g^F3)=t8zV;3445#Hw&8ns7^M#2tcxOGB5c{#J|=;9r~yLN$T^D zA+4r!Lp{o!$Aq>D)mQepyH<(Tt~jMU+xrTU4mmnQgtlSahaIn;XmQ+U$MTO;J!36L zOk}u&TXWg5t4}4}1|?im=pPWisd+yMr>7_*!w!#-Nhbqlr$;UB)&zysf)yt%u+|!E zLva^5+n$)0k+dEzhC*DF5~ZJ3HtF@O<1g}=Bm5bZ0h&GSTT=;AbubH0^-!hnVGs%O z&W<>|%+i(x6RriN4x_q%&T2$y%+0;Mg#u5{YNDl}GiU=yxK))M?0ff14-syaZ)f0pRmPmDQZT|%I7Fz1*3ZTKPac{fhwB8+2#q^S?=hxEVehkoW=^mDJP8ozo}g=~ zhOWF<$P~b(Q?I2k z0FB4Dc(kl9-`k{B#qnIe+}`Rx(%~=DaIaT=8J0_$S^}MD#N{%lVoz@$-X&?ood1d- zjvCwPZ@cfN3LpP4x4#*7S8(U+gACF)ErF^i{=BmQBhba)RYxqP{wzk|WHF%M!cwAR z1c)9zC-12qezV!81}?d!H@>K4MuWQ_fFaKNO(lX71WOJ^r+9S(+#D&YKDhE{P?7GN z%;P@oxown$szdGoR$oFg+j}-PGn||uy^Sl0+ju^I;mphfk3uk$%^@WYL(?~3${2PG zoA5zxEs{^&h>2Qa%!=Gduwl?c#(#)okKCa&SNPaq_d;E{$dbKNEft6MK>M8C^n* zw2957&5kA8(1ALV_aH`cA%gdOaX~zLpML*NTFgTyS#L;4==D4L>}>_C+-oZaGC{H> zW)cbEHs$3g^rod z?Zqv_w*k>q~?;hGz{_+rcoJO0!NdLS;@0NN0p<46N1irC=WP!gizGM;b5s^-9 zt~gVX_es1Y(XzKW<(0g~hy^|qajDVsz~%(e2fJ7XehWko7i|bO2w~D7p?ejJHDl{3 zrTgh8UFOu?u#5qU_kNXq-f%gtPv?l0Jm6s7O+-L6;Md+r_?L;$&5z9Ij&90?4BrR; zo)B0Zl0ZSzx=(XIjWbFOYUiTD4VK31B@brKUkjgYKu9?}8;P|T>}?}fzrkt$Hb3z| z>?eDi;4cZg#k*)hGlYcmuxZ&CWxca%x{(V2VO&O8IRy3W@GtKEqL(1rWFTk#NLjEi z(_?$&l*~s0IgH_H%i1*qnbb^zl}v*BxK>~)`CrX;zW7hQ2-5edOfShyx0+HHK3KO^ z*`}RLn)96Wx@8*%6?xFxo+EFW>C)8xGFwQB)jLOAqBO&GRxTK8$u?DzyV3W~8!c-K zzW8;4y>@>GW&U}Natl-Whd#FF+&qFcAD;_PjdI5_V7_Sgn)H&M1Ndlma`l*KyT(Sm zTbA21hD&%J3-eXNPv8IZ682?horNXr{#3B5^^~u_LDRzCyN11;d$s;Bk$UtyOM!~o z(CH(SQ$@!r`@m3#z(S7*Kho;#5fCY*xJ@mEg(yxn_oQ3h3>_SAm00}S$a_5=0o}2& z+OQl$C!s(&M6eDYu(b3M1REfUEE8B0s1)r~qp^}cdQQGePfNEBKJkx;5m*niKW#); zpPkk@awOfO?Za}aGRSkTN%mrZL z(biQx^*2Zv2v5}nhWD#`-S*~uNkd?OUYO&?@$E9Tn*wyXtQ!{pV8;0nxG5h?TRZ0W zmNn|BYu7i?9kzgRT!LV`e4ra&#TC*SbRN&$!E0>WGi>l0r%J@57+Ok^b%nEi4Kc=k zUA9!P!7;>aLyCB;wp?|%lW4?T`ttI!$TKGgHk_{FEwLoWsEs=BdrtN|bJ*_&cvSy# zuN3%29`*H64_7iPVM_1>&>`5-O){^4bjz|3UHgCSeEC0=`}_ZNPUVzPNy=I|MT8_n zghS}OBkE*dMs}I8XJ>TMW*O>T$T~77g&AX;v5YZN#xgNU#w-{$#xjh_GWO+rkI(n> z!}l-v{&Mc$=E411p4at!Uf1IpTV3nzxq)wK*0itYrl0!v4R6EZ;aYRXS$S@vnGNjG`uf#A?2O7A$`C2n%Iuq7%wC2^SFmE+7b+XHHo z-MygqbD!71=N-(IHTsAA&4%Q-zu=Q^uEh-s#TE)*c1HLj6w*??Tp{H-4H-{aL`i<|;ef3CPr zxIlM8>MPp}HI(yBIVgp*SmBg_YCp22q-lC?A}W~j0itv1I?2K(;dbIPbo4-fp8 zSmpHgtxlE$<}F9IA*HI;7=6@rt`1D<%lSNhC;A$EYxTfFCSxC?AT-#`qEh@VAfJg! zyBm$3VNB5ExBQnXsteRPRt}rca+)3PMG|M(g3l26L8#UUP5bc2hbxky-i_JVKbeA; z?O@`%?Ar^q~lYylq^GAAj<{CLwdMiU& z*q7|r9@@w-w-E*C1#ciFY`wLcc56G&z~Oj1MQpcS;=(^IoQ1L$UVHIX!MEG8`xP6{ z?YFwur&nHYhexu^UgLvi0;sDquVnnzU&p%?hDc)?o-dov1T`;Tyewa7Gk}$Kzzc_J z=CPxredV-PICZvulQ&zM*j3C^XY6Kno>RLllx@-E_(E@v7mrA+jg3ATj`R0~#Ch3; zunN0dbt4oCjz>M`?tkMJc(ykMSNmAEWhnC9u)>GmkObf z2({)RuehA^*RWq)D=H`3 zg}g}Ybnu!wlDkIX4;`%@G=c8uebsUdyCBu5w>F4U?FywCi_oPV6-`$yIR`PSv+TD zT@6UP5_Q+09H#AnlOJ)0mor?~aGo9JZwCRe4H+%$F6K`LEav6sU%N@A<~;R2?OTb< zxdB#jX=)D`J!gm?Gb0HuCTe&-UBRW{s}0QJY??fPr6-NRN}355JU)~a@;v5qA7yZj zhF5$Q2dq4`advm(Vuzu>mfk^#Sd%VQ_&hl&%DQ!NvuZdg-qRMW%fKNFaOP&ORWP2o zI;n5%2aE58;H$j@4_4pLW>#C)OAW63HyX5i38mF5;o6PmrNVwLzoJNF;xt6S|OPlH|ILq_{2gED{z5RVA7EdW@Kxxdu%a zYz7>lUV9$3#^0oVr|l04{%xp-Wwt0|PPwI(WRi$!K=d{_DoMK<%i7lk86!V4}%Y!|@#mx>HB$)^m!!3jp&W0K{L*Sv&j+qmj ze-wcT@ISi)C8Y(8q;L=Eah5i}i`3M7R@*qnp>^$ZaUqmtPmmO{8MBxLJv%8Jv{NYLX2+7ol{ycegI&xtLGLoBH zL^#tBsu-27qJUehi}O;#zj~2Zil}GP1O;Ldey@+46!iKJjs<5w2u4R>B!{prV%!TqRbEO)-P^V*S->I8RBl5W86T~5u(?`j(z_};_dmf zJc?)VTYHB@SsBybn;;smY-D6 zq#NTuw{fK?(*LQ}GMXXO1%9tA)>H*7_r=bs2t4iy2Nx5HajR8~5Jh^t<#x*=9q+@$ zMOS<9A4lW)OE^9iNq`0$eZ84&Y44<)2)`_=EYK#)>YLj7k^zJNbpW7VYFXW-vf5|V zn1CPFThp<3B8^9*>lL*NsK_hxG^j#z)dVRD=%k(|W)3r7Ai!VEj9td3K)>(RG3B_PoBUNGo^$F0W|{t%07>h>fvF|kTlnw{*cIhW^| zjzXL70RNmB|vwjZ2bMUR(W^T=Ljt)LSHkUH7I+eI^7id z9F9AbR`gUCX{6M=HH@?ChcP#Z9ORZK7)x7s~w1V;o zp40oLKsli9_EOK)?V+*Q&Gj+gLX9#XvVj_?t@Q|?ZOh#jj^r1;osau1HaC09SA7Fa zwkI|t5-087jds&CYGoCUB+X$fS=M#EI}3{+*H&Ybby^MbS&4{eab5s6o+7WgljNTQ}|`2Sv}51K4x{4k!_GK;e+}-Q`3K=Xt1IvxB%Hp ze&70LNgCA=dpGuymMmcVO5i&!8Bg2xgDzSPuE7@Lj_^y5?1TsFn2Z!|(T&4ToK@>->?|^tuT7Ud64vZVyP|HxXcap6l11 zkf1m>eMud(9$8=HHO*EC?s?7)_VZVZdJV#_>&m@!Id&}@Fw(H7b)AZ6w8N3$B)`KH zYINz)NgCB5oZnP2nO2&SZintzk1(|@&P!KOEh{yw$HXgv9?TyG22Z}5pm6_-e8<9C z2pSh3rN%msPFhUPwe&fY-p4%EXUt4PrRxgmQ}^rSjg2OY88v-v|t=lrzO!u0~92qVrW&M$_YRwRC#oZ^3}$nTf~%b+IT85ZdB` zIvKpb8YJ&(8={R@IzzW-t(0nNm|3c%;jG6jf1mj!cbmTP5P87k#6$opRkXXxG*-y} zk*j@wMt2Awjp2WQ>fs^KX@)Jjp~CubemE?ALSCgD7@owg4%p`&@r|>H@i~D}kHv`z zk3b1HD4&Uy7hZvFjj9#LwRk)w-qFs>VyFzB{q4wGKHydaThR#p94zD|(gTYGWF8lC z>|+G=BXg1VJd`-S z&%p;}`KjX_O@C-G{bj(!kE!nI_5EMl&jKGQAeaL${ArKyb3BbUP&%{~c@sKaR*HP;}Dyl{vWmY3YleBW% zILG=B%KfV$^MR@WMxHnF_jm{bJ^vHvBKAmy_@RpQLtw{^n#5K&fn;T|ks5&p`7`Q( zxz2?jn?pmT#NqTi0h8V#UOjX`WYT{J4!jLNgUz6EUf5?`arvkcb*V1~Q^E=>SNS-R ztyPs>Qhm|~YGVCO%KYVTXB_lFfk66y0G&13y24>-+47>HIr>@AEI9wSMHFDXDe+A!ZRVjYBLYI3y zq##u~2J91Im~|Uha5Dff%L|c%r>KJ+nATf?9#a-1qY5O!g~J@=&3`G)u%4u0-5*|5 zzHVzfgsLW6?Ew|riRRL?Y!DdgbBrQuC=97mFCRJR#SdZtilcs^7%)txdvRt*U8IhY z>Fw)a5g|5rMNvlNHxy^$m(*+##oaW~#!hfQRZl%7LXF`w>6p*t)Pb9#e|NV8`Ur^| z%*3gyI1mPNs4=Jpofbc`8P>_C^k9&sdu)Uz69c(WoR$K4Kj_VL zM0RgyiKhjs2KN#n>$pX#^md);IT@vDN9}0m>jIO1;FbfRHT+lYh04&6v-M(t(?}QL zzSI8Rj>e2U=UX5Cf2qCpcsky<{<5eWb5S?6Fh7O+bnVipH}ZTgMDbxpN*O~=9zl2J zcfQOz^kX#`;8~r{72_jsYi@(aj-Lj6O`oWamhp38KXO6nNyc~3&hBq&#Jd6Z)HWqT zIw?FD{&B~2mq@7^Kme&5pL|qCR_Kt`|A`uUDm0iP^Ge`-RXAdeG1%2ZZvHc;vLBM4 zc_$!WC&BkpT4{6GQuR}?Kpu2A0PvmaI`pjaM9D47`u^%?*^492O~dKli;-Tz$uPko zcQ>BpyOAtTgFfd|QJs#?;QM4dNfd9k^^C?k2O2FMd@iU^)_BH#&s)x z$d#naloOK~TJ|t`F*rHwkr)IR4pY;QQZ1Xo$~@&CeZ-@hyHsT*oCLLf5RuDB{fui| zG4OjRI6n@-EivIH#H<|u4uag?N&HaFV`|m;(>|Kovcwbzs(6H@o`}xK3X@3P$ z5?Bs#)e4nj3U=LbQR94V90J0UjR+Fd1xj%y`NMXlInD=@7C6Y=H&}(^UHX+%BIcZQ zz}yk}G-i7Sy352O&({^C#ODCjShw_tlHtQMK(H)J*=q0y-G%k26<>Yt)`ssi6C<8+ zl?6^}pBLwpJhc=i4AD2~_oRN5Uv~u}2(0kxKt_2Ud5@xeZ`CGY_2qmOFrW9k^YP0u zc9mRr)0+XwWbvN#)V?R1CDcT`kxqf%HqF%|6EB6>%UD!4(7poHhYEj;Pd6Fjxdo(L zhd`r?;GN%&rSwmza#0+}!T)QkOgX>pTm3HDwJk4lxq-u!aw!UR;n^JXVoqNSZ^Uj8 z%Xc*zuGR2CeS{yO!ZC_~%N80M$<|#zH?!)f^q{7nM|4_h)=8Tc=Rm~&x6QQa*_nPt z<08Ayg_;{22^he5$u#GgY&@iCrjW5X-q|432L;`Emg8dA}sHb~+8L zBV&nO9Iwv6W`@du+RV<0ydi#dj-!E182c()S3X?_#120Rz^x}baa?#(su>p0D(RsR z2m%;oE^_oefc*&Ux^3S#f=s6#IREC&j)?+6x)hsOeJKan{}U?)*z11Bku0#tA;z&i zS9(Muc7ifVsA*+lWAybN;oRDn>47Apw8$(B`GrOUqOZ>m(zMqr`I=i&xs@-HIV8Ie zBq<|e8XmUPU0Ua8G1`TqBX#WL`%|Jy^K|hzOVpCdS!?IE+AKn~8#9Cc8f) zwHve21@Bt0$^aW$=1IVzo{+;JgI6MH$j`BQr*svfW&B@i--yF~{pBSbo;v30c@l<5 z2{|+~`AJXCfvuU=`18{`?d)#>6W-ga_qTA~S=we@W&Ymv{qWiGJdV`dwD=y-(|pk^ z2c%cVw;pe3vynG@hh-9u(RuTPM5sb_)EhS>!Qm$8Ak-ZrCm&)18#%Kvj?w^fgLB8J zeH}})7ROL$mV<&WBZDlOUTl#=TQ3O&y&6Ca`xTgVtXbS~Wi6T$JCBQK8Ri1h-doN5 zyWUvRa8@?TnNqJ;b($1$zfam%?+}CVtMgp53&UV(k{ooMgfgh@%~@c;z^$jPH@6AGfwgb5ik76sQn-blq-%~J8ZswJQ4Td*`by-U zcpj1fyFZ}(wBuoyk;MqF1fe@tZD&zSTNc!KK%|!qOKS}Z#3km2 z_LjMc@rHKjd+R|-Ba$VP^GzpN{nC5ER9KefnmDX7rh)b zWFrQxJvb$^P3wuI-eg)%f^cdo)hK}TNwN3!>mHxWEv;QScDVn zM*&E~JSse3Si;U%vBf;b3cRunFLR{_5E`GgMAh}8+gpW=WH>`fp13+5kJb!DAe4-+ zcpy(ZC#H|U);`-GasrR;G!bN}{DFu)53Y&Q$SSvYPVkbZ+Rc~+#+s8%(Ii`~*;vwb zA5I;O!5k`8mur{fR2zetBPYmBosQnZ1)D-cRz_Y^Hx%;lx&EYgBNLAHSWfoZaXJK2 za1@PjL}}~qJ5X%W*w+L(m&D%}T9^ly5ZFOZ$;V4fSwesFH_Y{G4ej}j3z$?|E|KTU*C=P=2(g{M8>zQX{llCmNl3IDiR^btpsSDl!&TXC%vg{kETtWuLS&7iAdmDQzU z$Tz#X#&uLM(sL6878r+L-d|ZcxfroehIGEP9sqN&0eipJ=ag$-jb!Jtw<@x-5^jRpzKbHYHj^nZT`EQ; z&r`Sa$iwpuuVyG5h~#iJy6G@V$hAXneYhq#x#9|X@KIFcLt3(0iE8Yht43D+>qX?@ z_8I({0$sYnp`Nb%PLzA7vHLPdaWElnSmPIvq&9%epI_la6sO5K;7nwf5r3nO;e%B( z(l}ikUY%XD20_%awtG%#kK(thoY0vGmcXDy0i&BHNa}F19bI{wV08r9<)1}tnVphR zaF24I!5EKDMG5YWBn&x`iAn%+(g1QE;cKG=CF2No?&#O9S~f5g5^*@}oV=Kw@o^^9 z6wHevVR384iYxJ;2L&mBu+HW$6Jv~-i95<{T^IiyO{CGb2lolf^2(`NbnBOrDa=;? z-RkWI@Z45rCz<#=Xlz21#u0)zog_|8Q}T8P>8i}UhD+pkY)(#%VU18in3R5@C_;W*WfpxHV9DaJ|NEbH^^eL$b_uzSx)k6{c~_Fs8%6H+f+>` zv22!eorVrQm{f5>g59)^(%$K6%-stbZV@FKb`D-X-`SgNYW5KUr7U0Y-fFpLbiFaR z<0g6(hrhR&wCsr*XpIqiVB;b_TmJ$Ii4YBQ($#dHrwTUR{L;T-x?GbOG=cQ%ee9IG zW&5dGf9`F#ZeC$3EC}2)N|sGC+wnwi(~;XhcRQ66b;?F>uQnu4b!{jmpHh}cHqf9b zQzmRLSS73Un8gfRa}HC^1@Iajqlb#Mz>di^QwWnUBJb!VY5{4r2;mLhjn!CoJJopG zGi{V<+LgW#8qn*bo!+n3^TEpEdj`1b+9>@X6pC39p|zU==mq;xXa%3tO&XcYt?_SW1oY4Wyo88 zmF1PGB=8fW=d>`_^y^xxpv7R03$&#rYO4|#lk5gv{76biu9qj1!dUENABNioR7Y-9 z8j(tenjhSSHl+j<0taZ8y61xR7 zwixK5zewdSwyY5SG)6bdd#NVEuTodnUs|X95K7-3Rz&^Ke&w>vyFh{D-|V9ia)Ua; zpikXgEL@n=(XahnAf5GHm7Uq7;>`8i%Z9gKZK>A6C#|`kzNudC-{DIm7CxxL$Njd} z6Slig$V!01L}`veSn=u$C&xWpT_>gf&9!&7HpfzO{kMceR@lX!OH@dH_D3ViC0p)` z-cUHj-IwvrS++O*PR`b)(mVc)g$ZoV87kFM$FN~-P3884l*GAr#mv>tfLuH&DL7GM zAE@!1sE?mjdvkzlvvCO6qM(W*EpRvL7vK-Tb5v9Z1J$~yfCkPT>;(V-p5H}lIlza& zM2j=Pa{%xl;Q8~^zpwra)4wk9FLVA?iT|&P_;UyJXi@d_K9#S)5(o(NA4^+{D)YM! F{|`6k1nvL; literal 0 HcmV?d00001 diff --git a/Wino.Mail.WinUI/Behaviors/BindableCommandBarBehavior.cs b/Wino.Mail.WinUI/Behaviors/BindableCommandBarBehavior.cs new file mode 100644 index 00000000..bc7967b1 --- /dev/null +++ b/Wino.Mail.WinUI/Behaviors/BindableCommandBarBehavior.cs @@ -0,0 +1,199 @@ +using System.Collections; +using System.Collections.Specialized; +using System.Windows.Input; +using CommunityToolkit.WinUI; +using Microsoft.Extensions.DependencyInjection; +using Microsoft.UI.Xaml; +using Microsoft.UI.Xaml.Controls; +using Microsoft.UI.Xaml.Controls.Primitives; +using Microsoft.Xaml.Interactivity; +using Wino.Core.Domain.Interfaces; +using Wino.Core.Domain.Models.Menus; +using Wino.Core.UWP.Controls; +using Wino.Helpers; +using Wino.Mail.WinUI; + +namespace Wino.Behaviors; + +public partial class BindableCommandBarBehavior : Behavior +{ + private readonly IPreferencesService _preferencesService = App.Current.Services.GetService(); + public static readonly DependencyProperty PrimaryCommandsProperty = DependencyProperty.Register( + "PrimaryCommands", typeof(object), typeof(BindableCommandBarBehavior), + new PropertyMetadata(null, UpdateCommands)); + + [GeneratedDependencyProperty] + public partial ICommand ItemClickedCommand { get; set; } + + public object PrimaryCommands + { + get { return GetValue(PrimaryCommandsProperty); } + set { SetValue(PrimaryCommandsProperty, value); } + } + + protected override void OnDetaching() + { + base.OnDetaching(); + + AttachChanges(false); + + if (PrimaryCommands is IEnumerable enumerable) + { + foreach (var item in enumerable) + { + if (item is ButtonBase button) + { + button.Click -= Button_Click; + } + } + } + } + + private void UpdatePrimaryCommands() + { + if (AssociatedObject == null) + return; + + if (PrimaryCommands == null) + return; + + if (AssociatedObject.PrimaryCommands is IEnumerable enumerableObjects) + { + foreach (var item in enumerableObjects) + { + if (item is ButtonBase button) + { + button.Click -= Button_Click; + } + } + } + + if (AssociatedObject.SecondaryCommands is IEnumerable secondaryObject) + { + foreach (var item in secondaryObject) + { + if (item is ButtonBase button) + { + button.Click -= Button_Click; + } + } + } + + AssociatedObject.PrimaryCommands.Clear(); + AssociatedObject.SecondaryCommands.Clear(); + + if (PrimaryCommands is not IEnumerable enumerable) return; + + foreach (var command in enumerable) + { + if (command is MailOperationMenuItem mailOperationMenuItem) + { + ICommandBarElement menuItem = null; + + if (mailOperationMenuItem.Operation == Core.Domain.Enums.MailOperation.Seperator) + { + menuItem = new AppBarSeparator(); + } + else + { + var label = XamlHelpers.GetOperationString(mailOperationMenuItem.Operation); + var labelPosition = string.IsNullOrWhiteSpace(label) || !_preferencesService.IsShowActionLabelsEnabled ? + CommandBarLabelPosition.Collapsed : CommandBarLabelPosition.Default; + menuItem = new AppBarButton + { + Width = double.NaN, + MinWidth = 40, + Icon = new WinoFontIcon() { Glyph = ControlConstants.WinoIconFontDictionary[XamlHelpers.GetWinoIconGlyph(mailOperationMenuItem.Operation)] }, + Label = label, + LabelPosition = labelPosition, + DataContext = mailOperationMenuItem, + }; + + if (!string.IsNullOrWhiteSpace(label)) + { + var toolTip = new ToolTip + { + Content = label + }; + ToolTipService.SetToolTip((DependencyObject)menuItem, toolTip); + } + + ((AppBarButton)menuItem).Click -= Button_Click; + ((AppBarButton)menuItem).Click += Button_Click; + } + + if (mailOperationMenuItem.IsSecondaryMenuPreferred) + { + AssociatedObject.SecondaryCommands.Add(menuItem); + } + else + { + AssociatedObject.PrimaryCommands.Add(menuItem); + } + } + + //if (dependencyObject is ICommandBarElement icommandBarElement) + //{ + // if (dependencyObject is ButtonBase button) + // { + // button.Click -= Button_Click; + // button.Click += Button_Click; + // } + + // if (command is MailOperationMenuItem mailOperationMenuItem) + // { + + // } + //} + } + } + + private void Button_Click(object sender, RoutedEventArgs e) + { + ItemClickedCommand?.Execute(((ButtonBase)sender).DataContext); + } + + protected override void OnAttached() + { + base.OnAttached(); + + AttachChanges(true); + + UpdatePrimaryCommands(); + } + + private void PrimaryCommandsCollectionChanged(object sender, NotifyCollectionChangedEventArgs e) + { + UpdatePrimaryCommands(); + } + + private static void UpdateCommands(DependencyObject dependencyObject, + DependencyPropertyChangedEventArgs dependencyPropertyChangedEventArgs) + { + if (dependencyObject is not BindableCommandBarBehavior behavior) return; + + if (dependencyPropertyChangedEventArgs.OldValue is INotifyCollectionChanged oldList) + { + oldList.CollectionChanged -= behavior.PrimaryCommandsCollectionChanged; + } + + behavior.AttachChanges(true); + behavior.UpdatePrimaryCommands(); + } + + private void AttachChanges(bool register) + { + if (PrimaryCommands is null) return; + + if (PrimaryCommands is INotifyCollectionChanged collectionChanged) + { + if (register) + { + collectionChanged.CollectionChanged -= PrimaryCommandsCollectionChanged; + collectionChanged.CollectionChanged += PrimaryCommandsCollectionChanged; + } + else + collectionChanged.CollectionChanged -= PrimaryCommandsCollectionChanged; + } + } +} diff --git a/Wino.Mail.WinUI/Behaviors/CreateMailNavigationItemBehavior.cs b/Wino.Mail.WinUI/Behaviors/CreateMailNavigationItemBehavior.cs new file mode 100644 index 00000000..2da72d6d --- /dev/null +++ b/Wino.Mail.WinUI/Behaviors/CreateMailNavigationItemBehavior.cs @@ -0,0 +1,85 @@ +using System.Collections.ObjectModel; +using Microsoft.Xaml.Interactivity; +using Microsoft.UI.Xaml; +using Wino.Core.Domain.Interfaces; +using Wino.Core.UWP.Controls; + +namespace Wino.Behaviors; + +public class CreateMailNavigationItemBehavior : Behavior +{ + public IMenuItem SelectedMenuItem + { + get { return (IMenuItem)GetValue(SelectedMenuItemProperty); } + set { SetValue(SelectedMenuItemProperty, value); } + } + + public ObservableCollection MenuItems + { + get { return (ObservableCollection)GetValue(MenuItemsProperty); } + set { SetValue(MenuItemsProperty, value); } + } + + public static readonly DependencyProperty MenuItemsProperty = DependencyProperty.Register(nameof(MenuItems), typeof(ObservableCollection), typeof(CreateMailNavigationItemBehavior), new PropertyMetadata(null, OnMenuItemsChanged)); + public static readonly DependencyProperty SelectedMenuItemProperty = DependencyProperty.Register(nameof(SelectedMenuItem), typeof(IMenuItem), typeof(CreateMailNavigationItemBehavior), new PropertyMetadata(null, OnSelectedMenuItemChanged)); + + public CreateMailNavigationItemBehavior() + { + + } + + protected override void OnAttached() + { + base.OnAttached(); + } + + protected override void OnDetaching() + { + base.OnDetaching(); + } + + private static void OnMenuItemsChanged(DependencyObject dependencyObject, DependencyPropertyChangedEventArgs dependencyPropertyChangedEventArgs) + { + if (dependencyObject is CreateMailNavigationItemBehavior behavior) + { + if (dependencyPropertyChangedEventArgs.NewValue != null) + behavior.RegisterMenuItemChanges(); + + behavior.ManageAccounts(); + } + } + + private void RegisterMenuItemChanges() + { + if (MenuItems != null) + { + MenuItems.CollectionChanged -= MenuCollectionUpdated; + MenuItems.CollectionChanged += MenuCollectionUpdated; + } + } + + private void MenuCollectionUpdated(object sender, System.Collections.Specialized.NotifyCollectionChangedEventArgs e) + { + ManageAccounts(); + } + + private static void OnSelectedMenuItemChanged(DependencyObject dependencyObject, DependencyPropertyChangedEventArgs dependencyPropertyChangedEventArgs) + { + if (dependencyObject is CreateMailNavigationItemBehavior behavior) + { + behavior.ManageAccounts(); + } + } + + private void ManageAccounts() + { + if (MenuItems == null) return; + + AssociatedObject.MenuItems.Clear(); + + if (SelectedMenuItem == null) + { + // ?? + } + } +} diff --git a/Wino.Mail.WinUI/Controls/AccountNavigationItem.cs b/Wino.Mail.WinUI/Controls/AccountNavigationItem.cs new file mode 100644 index 00000000..528733fb --- /dev/null +++ b/Wino.Mail.WinUI/Controls/AccountNavigationItem.cs @@ -0,0 +1,62 @@ +using System.Numerics; +using Microsoft.UI.Xaml.Controls; +using Microsoft.UI.Xaml; +using Wino.Core.Domain.Interfaces; +using Wino.Core.UWP.Controls; + +namespace Wino.Controls; + +public partial class AccountNavigationItem : WinoNavigationViewItem +{ + + public static readonly DependencyProperty IsActiveAccountProperty = DependencyProperty.Register(nameof(IsActiveAccount), typeof(bool), typeof(AccountNavigationItem), new PropertyMetadata(false, new PropertyChangedCallback(OnIsActiveAccountChanged))); + public static readonly DependencyProperty BindingDataProperty = DependencyProperty.Register(nameof(BindingData), typeof(IAccountMenuItem), typeof(AccountNavigationItem), new PropertyMetadata(null)); + + + public bool IsActiveAccount + { + get { return (bool)GetValue(IsActiveAccountProperty); } + set { SetValue(IsActiveAccountProperty, value); } + } + + public IAccountMenuItem BindingData + { + get { return (IAccountMenuItem)GetValue(BindingDataProperty); } + set { SetValue(BindingDataProperty, value); } + } + + private const string PART_NavigationViewItemMenuItemsHost = "NavigationViewItemMenuItemsHost"; + private const string PART_SelectionIndicator = "CustomSelectionIndicator"; + + private ItemsRepeater _itemsRepeater; + private Microsoft.UI.Xaml.Shapes.Rectangle _selectionIndicator; + + public AccountNavigationItem() + { + DefaultStyleKey = typeof(AccountNavigationItem); + } + + protected override void OnApplyTemplate() + { + base.OnApplyTemplate(); + + _itemsRepeater = GetTemplateChild(PART_NavigationViewItemMenuItemsHost) as ItemsRepeater; + _selectionIndicator = GetTemplateChild(PART_SelectionIndicator) as Microsoft.UI.Xaml.Shapes.Rectangle; + + UpdateSelectionBorder(); + } + + private static void OnIsActiveAccountChanged(DependencyObject obj, DependencyPropertyChangedEventArgs args) + { + if (obj is AccountNavigationItem control) + control.UpdateSelectionBorder(); + } + + private void UpdateSelectionBorder() + { + if (_selectionIndicator == null) return; + + _selectionIndicator.Scale = IsActiveAccount ? new Vector3(1, 1, 1) : new Vector3(0, 0, 0); + _selectionIndicator.Visibility = IsActiveAccount ? Visibility.Visible : Visibility.Collapsed; + } +} diff --git a/Wino.Mail.WinUI/Controls/Advanced/WinoListView.cs b/Wino.Mail.WinUI/Controls/Advanced/WinoListView.cs new file mode 100644 index 00000000..f6dbcdbc --- /dev/null +++ b/Wino.Mail.WinUI/Controls/Advanced/WinoListView.cs @@ -0,0 +1,418 @@ +using System; +using System.Linq; +using System.Threading.Tasks; +using System.Windows.Input; +using CommunityToolkit.Mvvm.Messaging; +using MoreLinq; +using Serilog; +using Microsoft.UI.Xaml; +using Microsoft.UI.Xaml.Controls; +using Wino.Core.Domain.Enums; +using Wino.Core.Domain.Models.MailItem; +using Wino.Extensions; +using Wino.Mail.ViewModels.Data; +using Wino.Mail.ViewModels.Messages; + +namespace Wino.Controls.Advanced; + +///

+/// Custom ListView control that handles multiple selection with Extended/Multiple selection mode +/// and supports threads. +/// +public partial class WinoListView : ListView, IDisposable +{ + private ILogger logger = Log.ForContext(); + + private const string PART_ScrollViewer = "ScrollViewer"; + private ScrollViewer internalScrollviewer; + + /// + /// Gets or sets whether this ListView belongs to thread items. + /// This is important for detecting selected items etc. + /// + public bool IsThreadListView + { + get { return (bool)GetValue(IsThreadListViewProperty); } + set { SetValue(IsThreadListViewProperty, value); } + } + + public ICommand ItemDeletedCommand + { + get { return (ICommand)GetValue(ItemDeletedCommandProperty); } + set { SetValue(ItemDeletedCommandProperty, value); } + } + + public ICommand LoadMoreCommand + { + get { return (ICommand)GetValue(LoadMoreCommandProperty); } + set { SetValue(LoadMoreCommandProperty, value); } + } + + public bool IsThreadScrollingEnabled + { + get { return (bool)GetValue(IsThreadScrollingEnabledProperty); } + set { SetValue(IsThreadScrollingEnabledProperty, value); } + } + + public static readonly DependencyProperty IsThreadScrollingEnabledProperty = DependencyProperty.Register(nameof(IsThreadScrollingEnabled), typeof(bool), typeof(WinoListView), new PropertyMetadata(false)); + public static readonly DependencyProperty LoadMoreCommandProperty = DependencyProperty.Register(nameof(LoadMoreCommand), typeof(ICommand), typeof(WinoListView), new PropertyMetadata(null)); + public static readonly DependencyProperty IsThreadListViewProperty = DependencyProperty.Register(nameof(IsThreadListView), typeof(bool), typeof(WinoListView), new PropertyMetadata(false, new PropertyChangedCallback(OnIsThreadViewChanged))); + public static readonly DependencyProperty ItemDeletedCommandProperty = DependencyProperty.Register(nameof(ItemDeletedCommand), typeof(ICommand), typeof(WinoListView), new PropertyMetadata(null)); + + public WinoListView() + { + CanDragItems = true; + IsItemClickEnabled = true; + IsMultiSelectCheckBoxEnabled = true; + IsRightTapEnabled = true; + SelectionMode = ListViewSelectionMode.Extended; + ShowsScrollingPlaceholders = false; + SingleSelectionFollowsFocus = true; + + DragItemsCompleted += ItemDragCompleted; + DragItemsStarting += ItemDragStarting; + SelectionChanged += SelectedItemsChanged; + ProcessKeyboardAccelerators += ProcessDelKey; + } + + protected override void OnApplyTemplate() + { + base.OnApplyTemplate(); + + internalScrollviewer = GetTemplateChild(PART_ScrollViewer) as ScrollViewer; + + if (internalScrollviewer == null) + { + logger.Warning("WinoListView does not have an internal ScrollViewer. Infinite scrolling behavior might be effected."); + return; + } + + internalScrollviewer.ViewChanged -= InternalScrollVeiwerViewChanged; + internalScrollviewer.ViewChanged += InternalScrollVeiwerViewChanged; + } + + private static void OnIsThreadViewChanged(DependencyObject obj, DependencyPropertyChangedEventArgs args) + { + if (obj is WinoListView winoListView) + { + winoListView.AdjustThreadViewContainerVisuals(); + } + } + + private void AdjustThreadViewContainerVisuals() + { + if (IsThreadListView) + { + ItemContainerTransitions.Clear(); + } + } + + private double lastestRaisedOffset = 0; + private int lastItemSize = 0; + + // TODO: This is buggy. Does not work all the time. Debug. + + private void InternalScrollVeiwerViewChanged(object sender, ScrollViewerViewChangedEventArgs e) + { + if (internalScrollviewer == null) return; + + // No need to raise init request if there are no items in the list. + if (Items.Count == 0) return; + + // If the scrolling is finished, check the current viewport height. + if (e.IsIntermediate) + { + var currentOffset = internalScrollviewer.VerticalOffset; + var maxOffset = internalScrollviewer.ScrollableHeight; + + if (currentOffset + 10 >= maxOffset && lastestRaisedOffset != maxOffset && Items.Count != lastItemSize) + { + // We must load more. + lastestRaisedOffset = maxOffset; + lastItemSize = Items.Count; + + LoadMoreCommand?.Execute(null); + } + } + } + + private void ProcessDelKey(UIElement sender, Microsoft.UI.Xaml.Input.ProcessKeyboardAcceleratorEventArgs args) + { + if (args.Key == Windows.System.VirtualKey.Delete) + { + args.Handled = true; + + ItemDeletedCommand?.Execute(MailOperation.SoftDelete); + } + } + + private void ItemDragCompleted(ListViewBase sender, DragItemsCompletedEventArgs args) + { + if (args.Items.Any(a => a is MailItemViewModel)) + { + args.Items.Cast().ForEach(a => a.IsCustomFocused = false); + } + } + + private void ItemDragStarting(object sender, DragItemsStartingEventArgs args) + { + // Dragging multiple mails from different accounts/folders are supported with the condition below: + // All mails belongs to the drag will be matched on the dropped folder's account. + // Meaning that if users drag 1 mail from Account A/Inbox and 1 mail from Account B/Inbox, + // and drop to Account A/Inbox, the mail from Account B/Inbox will NOT be moved. + + if (IsThreadListView) + { + var allItems = args.Items.Cast(); + + // Highlight all items + allItems.ForEach(a => a.IsCustomFocused = true); + + // Set native drag arg properties. + + var dragPackage = new MailDragPackage(allItems.Cast()); + + args.Data.Properties.Add(nameof(MailDragPackage), dragPackage); + } + else + { + var dragPackage = new MailDragPackage(args.Items.Cast()); + + args.Data.Properties.Add(nameof(MailDragPackage), dragPackage); + } + } + + public void ChangeSelectionMode(ListViewSelectionMode selectionMode) + { + SelectionMode = selectionMode; + + if (!IsThreadListView) + { + Items.Where(a => a is ThreadMailItemViewModel).Cast().ForEach(c => + { + var threadListView = GetThreadInternalListView(c); + + if (threadListView != null) + { + threadListView.SelectionMode = selectionMode; + } + }); + } + } + + /// + /// Finds the container for given mail item and adds it to selected items. + /// + /// Mail to be added to selected items. + /// Whether selection was successful or not. + public bool SelectMailItemContainer(MailItemViewModel mailItemViewModel) + { + var itemContainer = ContainerFromItem(mailItemViewModel); + + // This item might be in thread container. + if (itemContainer == null) + { + bool found = false; + + Items.OfType().ForEach(c => + { + if (!found) + { + var threadListView = GetThreadInternalListView(c); + + if (threadListView != null) + found = threadListView.SelectMailItemContainer(mailItemViewModel); + } + }); + + return found; + } + + SelectedItems.Add(mailItemViewModel); + return true; + } + + /// + /// Recursively clears all selections except the given mail. + /// + /// Exceptional mail item to be not unselected. + /// Whether expansion states of thread containers should stay as it is or not. + public void ClearSelections(MailItemViewModel exceptViewModel = null, bool preserveThreadExpanding = false) + { + SelectedItems.Clear(); + + Items.Where(a => a is ThreadMailItemViewModel).Cast().ForEach(c => + { + var threadListView = GetThreadInternalListView(c); + + if (threadListView == null) + return; + + if (exceptViewModel != null) + { + if (!threadListView.SelectedItems.Contains(exceptViewModel)) + { + if (!preserveThreadExpanding) + { + c.IsThreadExpanded = false; + } + + threadListView.SelectedItems.Clear(); + } + } + else + { + if (!preserveThreadExpanding) + { + c.IsThreadExpanded = false; + } + + threadListView.SelectedItems.Clear(); + } + }); + } + + /// + /// Recursively selects all mails, including thread items. + /// + public void SelectAllWino() + { + SelectAll(); + + Items.Where(a => a is ThreadMailItemViewModel).Cast().ForEach(c => + { + c.IsThreadExpanded = true; + + var threadListView = GetThreadInternalListView(c); + + threadListView?.SelectAll(); + }); + } + + // SelectedItems changed. + private void SelectedItemsChanged(object sender, SelectionChangedEventArgs e) + { + if (e.RemovedItems != null) + { + foreach (var removedItem in e.RemovedItems) + { + if (removedItem is MailItemViewModel removedMailItemViewModel) + { + // Mail item un-selected. + + removedMailItemViewModel.IsSelected = false; + WeakReferenceMessenger.Default.Send(new MailItemSelectionRemovedEvent(removedMailItemViewModel)); + } + else if (removedItem is ThreadMailItemViewModel removedThreadItemViewModel) + { + removedThreadItemViewModel.IsThreadExpanded = false; + } + } + } + + if (e.AddedItems != null) + { + foreach (var addedItem in e.AddedItems) + { + if (addedItem is MailItemViewModel addedMailItemViewModel) + { + // Mail item selected. + + addedMailItemViewModel.IsSelected = true; + + WeakReferenceMessenger.Default.Send(new MailItemSelectedEvent(addedMailItemViewModel)); + } + else if (addedItem is ThreadMailItemViewModel threadMailItemViewModel) + { + if (IsThreadScrollingEnabled) + { + if (internalScrollviewer != null && ContainerFromItem(threadMailItemViewModel) is FrameworkElement threadFrameworkElement) + { + internalScrollviewer.ScrollToElement(threadFrameworkElement, true, true, bringToTopOrLeft: true); + } + } + + // Try to select first item. + if (GetThreadInternalListView(threadMailItemViewModel) is WinoListView internalListView) + { + internalListView.SelectFirstItem(); + } + } + } + } + + if (!IsThreadListView) + { + if (SelectionMode == ListViewSelectionMode.Extended && SelectedItems.Count == 1) + { + // Only 1 single item is selected in extended mode for main list view. + // We should un-select all thread items. + + Items.Where(a => a is ThreadMailItemViewModel).Cast().ForEach(c => + { + // c.IsThreadExpanded = false; + + var threadListView = GetThreadInternalListView(c); + + threadListView?.SelectedItems.Clear(); + }); + } + } + } + + public async void SelectFirstItem() + { + if (Items.Count > 0) + { + if (Items[0] is MailItemViewModel firstMailItemViewModel) + { + // Make sure the invisible container is realized. + await Task.Delay(250); + + if (ContainerFromItem(firstMailItemViewModel) is ListViewItem firstItemContainer) + { + firstItemContainer.IsSelected = true; + } + + firstMailItemViewModel.IsSelected = true; + } + } + } + + private WinoListView GetThreadInternalListView(ThreadMailItemViewModel threadMailItemViewModel) + { + var itemContainer = ContainerFromItem(threadMailItemViewModel); + + if (itemContainer is ListViewItem listItem) + { + var expander = listItem.GetChildByName("ThreadExpander"); + + if (expander != null) + return expander.Content as WinoListView; + } + + return null; + } + + public void Dispose() + { + DragItemsCompleted -= ItemDragCompleted; + DragItemsStarting -= ItemDragStarting; + SelectionChanged -= SelectedItemsChanged; + ProcessKeyboardAccelerators -= ProcessDelKey; + + if (internalScrollviewer != null) + { + internalScrollviewer.ViewChanged -= InternalScrollVeiwerViewChanged; + } + + foreach (var item in Items) + { + if (item is ThreadMailItemViewModel threadMailItemViewModel) + { + var threadListView = GetThreadInternalListView(threadMailItemViewModel); + threadListView?.Dispose(); + } + } + } +} diff --git a/Wino.Mail.WinUI/Controls/ImagePreviewControl.cs b/Wino.Mail.WinUI/Controls/ImagePreviewControl.cs new file mode 100644 index 00000000..72fd737a --- /dev/null +++ b/Wino.Mail.WinUI/Controls/ImagePreviewControl.cs @@ -0,0 +1,229 @@ +using System; +using System.Diagnostics; +using System.IO; +using System.Text.RegularExpressions; +using System.Threading; +using System.Threading.Tasks; +using Fernandezja.ColorHashSharp; +using Microsoft.UI.Xaml; +using Microsoft.UI.Xaml.Controls; +using Microsoft.UI.Xaml.Media; +using Microsoft.UI.Xaml.Media.Imaging; +using Microsoft.UI.Xaml.Shapes; +using Windows.UI; +using Wino.Mail.WinUI; + +namespace Wino.Controls; + +public partial class ImagePreviewControl : Control +{ + private const string PART_EllipseInitialsGrid = "EllipseInitialsGrid"; + private const string PART_InitialsTextBlock = "InitialsTextBlock"; + private const string PART_KnownHostImage = "KnownHostImage"; + private const string PART_Ellipse = "Ellipse"; + private const string PART_FaviconSquircle = "FaviconSquircle"; + private const string PART_FaviconImage = "FaviconImage"; + + #region Dependency Properties + + public static readonly DependencyProperty FromNameProperty = DependencyProperty.Register(nameof(FromName), typeof(string), typeof(ImagePreviewControl), new PropertyMetadata(string.Empty, OnInformationChanged)); + public static readonly DependencyProperty FromAddressProperty = DependencyProperty.Register(nameof(FromAddress), typeof(string), typeof(ImagePreviewControl), new PropertyMetadata(string.Empty, OnInformationChanged)); + public static readonly DependencyProperty SenderContactPictureProperty = DependencyProperty.Register(nameof(SenderContactPicture), typeof(string), typeof(ImagePreviewControl), new PropertyMetadata(string.Empty, new PropertyChangedCallback(OnInformationChanged))); + public static readonly DependencyProperty ThumbnailUpdatedEventProperty = DependencyProperty.Register(nameof(ThumbnailUpdatedEvent), typeof(bool), typeof(ImagePreviewControl), new PropertyMetadata(false, new PropertyChangedCallback(OnInformationChanged))); + + public bool ThumbnailUpdatedEvent + { + get { return (bool)GetValue(ThumbnailUpdatedEventProperty); } + set { SetValue(ThumbnailUpdatedEventProperty, value); } + } + + /// + /// Gets or sets base64 string of the sender contact picture. + /// + public string SenderContactPicture + { + get { return (string)GetValue(SenderContactPictureProperty); } + set { SetValue(SenderContactPictureProperty, value); } + } + + public string FromName + { + get { return (string)GetValue(FromNameProperty); } + set { SetValue(FromNameProperty, value); } + } + + public string FromAddress + { + get { return (string)GetValue(FromAddressProperty); } + set { SetValue(FromAddressProperty, value); } + } + + #endregion + + private Ellipse Ellipse; + private Grid InitialsGrid; + private TextBlock InitialsTextblock; + private Image KnownHostImage; + private Border FaviconSquircle; + private Image FaviconImage; + private CancellationTokenSource contactPictureLoadingCancellationTokenSource; + + public ImagePreviewControl() + { + DefaultStyleKey = nameof(ImagePreviewControl); + } + + protected override void OnApplyTemplate() + { + base.OnApplyTemplate(); + + InitialsGrid = GetTemplateChild(PART_EllipseInitialsGrid) as Grid; + InitialsTextblock = GetTemplateChild(PART_InitialsTextBlock) as TextBlock; + KnownHostImage = GetTemplateChild(PART_KnownHostImage) as Image; + Ellipse = GetTemplateChild(PART_Ellipse) as Ellipse; + FaviconSquircle = GetTemplateChild(PART_FaviconSquircle) as Border; + FaviconImage = GetTemplateChild(PART_FaviconImage) as Image; + + UpdateInformation(); + } + + private static void OnInformationChanged(DependencyObject obj, DependencyPropertyChangedEventArgs args) + { + if (obj is ImagePreviewControl control) + control.UpdateInformation(); + } + + private async void UpdateInformation() + { + if ((KnownHostImage == null && FaviconSquircle == null) || InitialsGrid == null || InitialsTextblock == null || (string.IsNullOrEmpty(FromName) && string.IsNullOrEmpty(FromAddress))) + return; + + // Cancel active image loading if exists. + if (!contactPictureLoadingCancellationTokenSource?.IsCancellationRequested ?? false) + { + contactPictureLoadingCancellationTokenSource.Cancel(); + } + + string contactPicture = SenderContactPicture; + + var isAvatarThumbnail = false; + + if (string.IsNullOrEmpty(contactPicture) && !string.IsNullOrEmpty(FromAddress)) + { + contactPicture = await App.Current.ThumbnailService.GetThumbnailAsync(FromAddress); + isAvatarThumbnail = true; + } + + if (!string.IsNullOrEmpty(contactPicture)) + { + if (isAvatarThumbnail && FaviconSquircle != null && FaviconImage != null) + { + // Show favicon in squircle + FaviconSquircle.Visibility = Visibility.Visible; + InitialsGrid.Visibility = Visibility.Collapsed; + KnownHostImage.Visibility = Visibility.Collapsed; + + var bitmapImage = await GetBitmapImageAsync(contactPicture); + + if (bitmapImage != null) + { + FaviconImage.Source = bitmapImage; + } + } + else + { + // Show normal avatar (tondo) + FaviconSquircle.Visibility = Visibility.Collapsed; + KnownHostImage.Visibility = Visibility.Collapsed; + InitialsGrid.Visibility = Visibility.Visible; + contactPictureLoadingCancellationTokenSource = new CancellationTokenSource(); + try + { + var brush = await GetContactImageBrushAsync(contactPicture); + + if (brush != null) + { + if (!contactPictureLoadingCancellationTokenSource?.Token.IsCancellationRequested ?? false) + { + Ellipse.Fill = brush; + InitialsTextblock.Text = string.Empty; + } + } + } + catch (Exception) + { + Debugger.Break(); + } + } + } + else + { + FaviconSquircle.Visibility = Visibility.Collapsed; + KnownHostImage.Visibility = Visibility.Collapsed; + InitialsGrid.Visibility = Visibility.Visible; + + var colorHash = new ColorHash(); + var rgb = colorHash.Rgb(FromAddress); + + Ellipse.Fill = new SolidColorBrush(Color.FromArgb(rgb.A, rgb.R, rgb.G, rgb.B)); + InitialsTextblock.Text = ExtractInitialsFromName(FromName); + } + } + + private static async Task GetContactImageBrushAsync(string base64) + { + // Load the image from base64 string. + + var bitmapImage = await GetBitmapImageAsync(base64); + + if (bitmapImage == null) return null; + + return new ImageBrush() { ImageSource = bitmapImage }; + } + + private static async Task GetBitmapImageAsync(string base64) + { + try + { + var bitmapImage = new BitmapImage(); + var imageArray = Convert.FromBase64String(base64); + var imageStream = new MemoryStream(imageArray); + var randomAccessImageStream = imageStream.AsRandomAccessStream(); + randomAccessImageStream.Seek(0); + await bitmapImage.SetSourceAsync(randomAccessImageStream); + return bitmapImage; + } + catch (Exception) { } + + return null; + } + + public string ExtractInitialsFromName(string name) + { + // Change from name to from address in case of name doesn't exists. + if (string.IsNullOrEmpty(name)) + { + name = FromAddress; + } + + // first remove all: punctuation, separator chars, control chars, and numbers (unicode style regexes) + string initials = Regex.Replace(name, @"[\p{P}\p{S}\p{C}\p{N}]+", ""); + + // Replacing all possible whitespace/separator characters (unicode style), with a single, regular ascii space. + initials = Regex.Replace(initials, @"\p{Z}+", " "); + + // Remove all Sr, Jr, I, II, III, IV, V, VI, VII, VIII, IX at the end of names + initials = Regex.Replace(initials.Trim(), @"\s+(?:[JS]R|I{1,3}|I[VX]|VI{0,3})$", "", RegexOptions.IgnoreCase); + + // Extract up to 2 initials from the remaining cleaned name. + initials = Regex.Replace(initials, @"^(\p{L})[^\s]*(?:\s+(?:\p{L}+\s+(?=\p{L}))?(?:(\p{L})\p{L}*)?)?$", "$1$2").Trim(); + + if (initials.Length > 2) + { + // Worst case scenario, everything failed, just grab the first two letters of what we have left. + initials = initials.Substring(0, 2); + } + + return initials.ToUpperInvariant(); + } +} diff --git a/Wino.Mail.WinUI/Controls/MailItemDisplayInformationControl.xaml b/Wino.Mail.WinUI/Controls/MailItemDisplayInformationControl.xaml new file mode 100644 index 00000000..92d3332a --- /dev/null +++ b/Wino.Mail.WinUI/Controls/MailItemDisplayInformationControl.xaml @@ -0,0 +1,336 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/Wino.Mail.WinUI/Controls/MailItemDisplayInformationControl.xaml.cs b/Wino.Mail.WinUI/Controls/MailItemDisplayInformationControl.xaml.cs new file mode 100644 index 00000000..c3a10c83 --- /dev/null +++ b/Wino.Mail.WinUI/Controls/MailItemDisplayInformationControl.xaml.cs @@ -0,0 +1,218 @@ +using System.Linq; +using System.Numerics; +using System.Windows.Input; +using CommunityToolkit.WinUI; +using Microsoft.UI.Xaml; +using Microsoft.UI.Xaml.Controls; +using Wino.Core.Domain; +using Wino.Core.Domain.Entities.Mail; +using Wino.Core.Domain.Enums; +using Wino.Core.Domain.Models.MailItem; +using Wino.Extensions; +using Wino.Mail.ViewModels.Data; + +namespace Wino.Controls; + +public sealed partial class MailItemDisplayInformationControl : UserControl +{ + public ImagePreviewControl GetImagePreviewControl() => ContactImage; + + public bool IsRunningHoverAction { get; set; } + + public static readonly DependencyProperty DisplayModeProperty = DependencyProperty.Register(nameof(DisplayMode), typeof(MailListDisplayMode), typeof(MailItemDisplayInformationControl), new PropertyMetadata(MailListDisplayMode.Spacious)); + public static readonly DependencyProperty ShowPreviewTextProperty = DependencyProperty.Register(nameof(ShowPreviewText), typeof(bool), typeof(MailItemDisplayInformationControl), new PropertyMetadata(true)); + public static readonly DependencyProperty IsCustomFocusedProperty = DependencyProperty.Register(nameof(IsCustomFocused), typeof(bool), typeof(MailItemDisplayInformationControl), new PropertyMetadata(false)); + public static readonly DependencyProperty IsAvatarVisibleProperty = DependencyProperty.Register(nameof(IsAvatarVisible), typeof(bool), typeof(MailItemDisplayInformationControl), new PropertyMetadata(true)); + public static readonly DependencyProperty IsSubjectVisibleProperty = DependencyProperty.Register(nameof(IsSubjectVisible), typeof(bool), typeof(MailItemDisplayInformationControl), new PropertyMetadata(true)); + public static readonly DependencyProperty ConnectedExpanderProperty = DependencyProperty.Register(nameof(ConnectedExpander), typeof(WinoExpander), typeof(MailItemDisplayInformationControl), new PropertyMetadata(null)); + public static readonly DependencyProperty LeftHoverActionProperty = DependencyProperty.Register(nameof(LeftHoverAction), typeof(MailOperation), typeof(MailItemDisplayInformationControl), new PropertyMetadata(MailOperation.None)); + public static readonly DependencyProperty CenterHoverActionProperty = DependencyProperty.Register(nameof(CenterHoverAction), typeof(MailOperation), typeof(MailItemDisplayInformationControl), new PropertyMetadata(MailOperation.None)); + public static readonly DependencyProperty RightHoverActionProperty = DependencyProperty.Register(nameof(RightHoverAction), typeof(MailOperation), typeof(MailItemDisplayInformationControl), new PropertyMetadata(MailOperation.None)); + public static readonly DependencyProperty HoverActionExecutedCommandProperty = DependencyProperty.Register(nameof(HoverActionExecutedCommand), typeof(ICommand), typeof(MailItemDisplayInformationControl), new PropertyMetadata(null)); + public static readonly DependencyProperty MailItemProperty = DependencyProperty.Register(nameof(MailItem), typeof(IMailItem), typeof(MailItemDisplayInformationControl), new PropertyMetadata(null, new PropertyChangedCallback(OnMailItemChanged))); + public static readonly DependencyProperty IsHoverActionsEnabledProperty = DependencyProperty.Register(nameof(IsHoverActionsEnabled), typeof(bool), typeof(MailItemDisplayInformationControl), new PropertyMetadata(true)); + public static readonly DependencyProperty Prefer24HourTimeFormatProperty = DependencyProperty.Register(nameof(Prefer24HourTimeFormat), typeof(bool), typeof(MailItemDisplayInformationControl), new PropertyMetadata(false)); + public static readonly DependencyProperty IsThreadExpanderVisibleProperty = DependencyProperty.Register(nameof(IsThreadExpanderVisible), typeof(bool), typeof(MailItemDisplayInformationControl), new PropertyMetadata(false)); + public static readonly DependencyProperty IsThreadExpandedProperty = DependencyProperty.Register(nameof(IsThreadExpanded), typeof(bool), typeof(MailItemDisplayInformationControl), new PropertyMetadata(false)); + public static readonly DependencyProperty IsThumbnailUpdatedProperty = DependencyProperty.Register(nameof(IsThumbnailUpdated), typeof(bool), typeof(MailItemDisplayInformationControl), new PropertyMetadata(false)); + + public bool IsThumbnailUpdated + { + get { return (bool)GetValue(IsThumbnailUpdatedProperty); } + set { SetValue(IsThumbnailUpdatedProperty, value); } + } + + public bool IsThreadExpanded + { + get { return (bool)GetValue(IsThreadExpandedProperty); } + set { SetValue(IsThreadExpandedProperty, value); } + } + + public bool IsThreadExpanderVisible + { + get { return (bool)GetValue(IsThreadExpanderVisibleProperty); } + set { SetValue(IsThreadExpanderVisibleProperty, value); } + } + + public bool Prefer24HourTimeFormat + { + get { return (bool)GetValue(Prefer24HourTimeFormatProperty); } + set { SetValue(Prefer24HourTimeFormatProperty, value); } + } + + public bool IsHoverActionsEnabled + { + get { return (bool)GetValue(IsHoverActionsEnabledProperty); } + set { SetValue(IsHoverActionsEnabledProperty, value); } + } + + public IMailItem MailItem + { + get { return (IMailItem)GetValue(MailItemProperty); } + set { SetValue(MailItemProperty, value); } + } + + public ICommand HoverActionExecutedCommand + { + get { return (ICommand)GetValue(HoverActionExecutedCommandProperty); } + set { SetValue(HoverActionExecutedCommandProperty, value); } + } + + public MailOperation LeftHoverAction + { + get { return (MailOperation)GetValue(LeftHoverActionProperty); } + set { SetValue(LeftHoverActionProperty, value); } + } + + public MailOperation CenterHoverAction + { + get { return (MailOperation)GetValue(CenterHoverActionProperty); } + set { SetValue(CenterHoverActionProperty, value); } + } + + public MailOperation RightHoverAction + { + get { return (MailOperation)GetValue(RightHoverActionProperty); } + set { SetValue(RightHoverActionProperty, value); } + } + + public WinoExpander ConnectedExpander + { + get { return (WinoExpander)GetValue(ConnectedExpanderProperty); } + set { SetValue(ConnectedExpanderProperty, value); } + } + + public bool IsSubjectVisible + { + get { return (bool)GetValue(IsSubjectVisibleProperty); } + set { SetValue(IsSubjectVisibleProperty, value); } + } + + public bool IsAvatarVisible + { + get { return (bool)GetValue(IsAvatarVisibleProperty); } + set { SetValue(IsAvatarVisibleProperty, value); } + } + + public bool IsCustomFocused + { + get { return (bool)GetValue(IsCustomFocusedProperty); } + set { SetValue(IsCustomFocusedProperty, value); } + } + + public bool ShowPreviewText + { + get { return (bool)GetValue(ShowPreviewTextProperty); } + set { SetValue(ShowPreviewTextProperty, value); } + } + + public MailListDisplayMode DisplayMode + { + get { return (MailListDisplayMode)GetValue(DisplayModeProperty); } + set { SetValue(DisplayModeProperty, value); } + } + + public MailItemDisplayInformationControl() + { + this.InitializeComponent(); + + var compositor = this.Visual().Compositor; + + var leftBackgroundVisual = compositor.CreateSpriteVisual(); + RootContainerVisualWrapper.SetChildVisual(leftBackgroundVisual); + MainContentContainer.EnableImplicitAnimation(VisualPropertyType.Offset, 400); + + RootContainer.EnableImplicitAnimation(VisualPropertyType.Offset, 400); + ContentGrid.EnableImplicitAnimation(VisualPropertyType.Offset, 400); + ContentStackpanel.EnableImplicitAnimation(VisualPropertyType.Offset, 400); + IconsContainer.EnableImplicitAnimation(VisualPropertyType.Offset, 400); + + RootContainerVisualWrapper.SizeChanged += (s, e) => leftBackgroundVisual.Size = e.NewSize.ToVector2(); + } + + private static void OnMailItemChanged(DependencyObject obj, DependencyPropertyChangedEventArgs args) + { + if (obj is MailItemDisplayInformationControl control) + { + control.UpdateInformation(); + } + } + + private void UpdateInformation() + { + if (MailItem == null) return; + + TitleText.Text = string.IsNullOrWhiteSpace(MailItem.Subject) ? Translator.MailItemNoSubject : MailItem.Subject; + } + + private void ControlPointerEntered(object sender, Microsoft.UI.Xaml.Input.PointerRoutedEventArgs e) + { + if (IsHoverActionsEnabled) + { + HoverActionButtons.Visibility = Visibility.Visible; + UnreadContainer.Visibility = Visibility.Collapsed; + } + } + + private void ControlPointerExited(object sender, Microsoft.UI.Xaml.Input.PointerRoutedEventArgs e) + { + if (IsHoverActionsEnabled) + { + HoverActionButtons.Visibility = Visibility.Collapsed; + UnreadContainer.Visibility = Visibility.Visible; + } + } + + private void ExecuteHoverAction(MailOperation operation) + { + IsRunningHoverAction = true; + + MailOperationPreperationRequest package = null; + + if (MailItem is MailCopy mailCopy) + package = new MailOperationPreperationRequest(operation, mailCopy, toggleExecution: true); + else if (MailItem is ThreadMailItemViewModel threadMailItemViewModel) + package = new MailOperationPreperationRequest(operation, threadMailItemViewModel.GetMailCopies(), toggleExecution: true); + else if (MailItem is ThreadMailItem threadMailItem) + package = new MailOperationPreperationRequest(operation, threadMailItem.ThreadItems.Cast().Select(a => a.MailCopy), toggleExecution: true); + + if (package == null) return; + + HoverActionExecutedCommand?.Execute(package); + } + + private void FirstActionClicked(object sender, RoutedEventArgs e) + { + ExecuteHoverAction(LeftHoverAction); + } + + private void SecondActionClicked(object sender, RoutedEventArgs e) + { + ExecuteHoverAction(CenterHoverAction); + } + + private void ThirdActionClicked(object sender, RoutedEventArgs e) + { + ExecuteHoverAction(RightHoverAction); + } +} diff --git a/Wino.Mail.WinUI/Controls/SettingsMenuItemControl.cs b/Wino.Mail.WinUI/Controls/SettingsMenuItemControl.cs new file mode 100644 index 00000000..49473ab7 --- /dev/null +++ b/Wino.Mail.WinUI/Controls/SettingsMenuItemControl.cs @@ -0,0 +1,72 @@ +using System; +using System.Windows.Input; +using Microsoft.UI.Xaml; +using Microsoft.UI.Xaml.Controls; + +namespace Wino.Controls; + +/// +/// Templated button for each setting in Settings Dialog. +/// +public partial class SettingsMenuItemControl : Control +{ + public string Title + { + get { return (string)GetValue(TitleProperty); } + set { SetValue(TitleProperty, value); } + } + + public string Description + { + get { return (string)GetValue(DescriptionProperty); } + set { SetValue(DescriptionProperty, value); } + } + + public FrameworkElement Icon + { + get { return (FrameworkElement)GetValue(IconProperty); } + set { SetValue(IconProperty, value); } + } + + + public ICommand Command + { + get { return (ICommand)GetValue(CommandProperty); } + set { SetValue(CommandProperty, value); } + } + + + + public object CommandParameter + { + get { return (object)GetValue(CommandParameterProperty); } + set { SetValue(CommandParameterProperty, value); } + } + + public bool IsClickable + { + get { return (bool)GetValue(IsClickableProperty); } + set { SetValue(IsClickableProperty, value); } + } + + public bool IsNavigateIconVisible + { + get { return (bool)GetValue(IsNavigateIconVisibleProperty); } + set { SetValue(IsNavigateIconVisibleProperty, value); } + } + + public FrameworkElement SideContent + { + get { return (FrameworkElement)GetValue(SideContentProperty); } + set { SetValue(SideContentProperty, value); } + } + + public static readonly DependencyProperty CommandParameterProperty = DependencyProperty.Register(nameof(CommandParameter), typeof(object), typeof(SettingsMenuItemControl), new PropertyMetadata(null)); + public static readonly DependencyProperty SideContentProperty = DependencyProperty.Register(nameof(SideContent), typeof(FrameworkElement), typeof(SettingsMenuItemControl), new PropertyMetadata(null)); + public static readonly DependencyProperty IsClickableProperty = DependencyProperty.Register(nameof(IsClickable), typeof(bool), typeof(SettingsMenuItemControl), new PropertyMetadata(true)); + public static readonly DependencyProperty CommandProperty = DependencyProperty.Register(nameof(Command), typeof(ICommand), typeof(SettingsMenuItemControl), new PropertyMetadata(null)); + public static readonly DependencyProperty IconProperty = DependencyProperty.Register(nameof(Icon), typeof(FrameworkElement), typeof(SettingsMenuItemControl), new PropertyMetadata(null)); + public static readonly DependencyProperty DescriptionProperty = DependencyProperty.Register(nameof(Description), typeof(string), typeof(SettingsMenuItemControl), new PropertyMetadata(string.Empty)); + public static readonly DependencyProperty TitleProperty = DependencyProperty.Register(nameof(Title), typeof(string), typeof(SettingsMenuItemControl), new PropertyMetadata(string.Empty)); + public static readonly DependencyProperty IsNavigateIconVisibleProperty = DependencyProperty.Register(nameof(IsNavigateIconVisible), typeof(bool), typeof(SettingsMenuItemControl), new PropertyMetadata(true)); +} diff --git a/Wino.Mail.WinUI/Controls/WebViewEditorControl.cs b/Wino.Mail.WinUI/Controls/WebViewEditorControl.cs new file mode 100644 index 00000000..41c0e35b --- /dev/null +++ b/Wino.Mail.WinUI/Controls/WebViewEditorControl.cs @@ -0,0 +1,358 @@ +using System; +using System.Collections.Generic; +using System.Text.Json; +using System.Threading.Tasks; +using CommunityToolkit.WinUI; +using Microsoft.Extensions.DependencyInjection; +using Microsoft.UI.Xaml; +using Microsoft.UI.Xaml.Controls; +using Microsoft.Web.WebView2.Core; +using Windows.UI.ViewManagement.Core; +using Wino.Core.Domain; +using Wino.Core.Domain.Interfaces; +using Wino.Core.Domain.Models; +using Wino.Core.Domain.Models.Reader; +using Wino.Core.UWP; +using Wino.Core.UWP.Extensions; +using Wino.Mail.WinUI; + +namespace Wino.Mail.Controls; + +public sealed partial class WebViewEditorControl : Control, IDisposable +{ + private readonly INativeAppService _nativeAppService = App.Current.Services.GetService(); + private readonly IFontService _fontService = App.Current.Services.GetService(); + private readonly IPreferencesService _preferencesService = App.Current.Services.GetService(); + + [GeneratedDependencyProperty] + public partial bool IsEditorDarkMode { get; set; } + async partial void OnIsEditorDarkModeChanged(bool newValue) + { + await UpdateEditorThemeAsync(); + } + + [GeneratedDependencyProperty] + public partial bool IsEditorBold { get; set; } + private bool _isEditorBoldInternal; + async partial void OnIsEditorBoldChanged(bool newValue) + { + if (newValue != _isEditorBoldInternal) + { + await _chromium.ExecuteScriptFunctionSafeAsync("editor.execCommand", JsonSerializer.Serialize("bold", BasicTypesJsonContext.Default.String)); + } + } + + [GeneratedDependencyProperty] + public partial bool IsEditorItalic { get; set; } + private bool _isEditorItalicInternal; + async partial void OnIsEditorItalicChanged(bool newValue) + { + if (newValue != _isEditorItalicInternal) + { + await _chromium.ExecuteScriptFunctionSafeAsync("editor.execCommand", JsonSerializer.Serialize("italic", BasicTypesJsonContext.Default.String)); + } + } + + [GeneratedDependencyProperty] + public partial bool IsEditorUnderline { get; set; } + private bool _isEditorUnderlineInternal; + async partial void OnIsEditorUnderlineChanged(bool newValue) + { + if (newValue != _isEditorUnderlineInternal) + { + await _chromium.ExecuteScriptFunctionSafeAsync("editor.execCommand", JsonSerializer.Serialize("underline", BasicTypesJsonContext.Default.String)); + } + } + + [GeneratedDependencyProperty] + public partial bool IsEditorStrikethrough { get; set; } + private bool _isEditorStrikethroughInternal; + async partial void OnIsEditorStrikethroughChanged(bool newValue) + { + if (newValue != _isEditorStrikethroughInternal) + { + await _chromium.ExecuteScriptFunctionSafeAsync("editor.execCommand", JsonSerializer.Serialize("strikethrough", BasicTypesJsonContext.Default.String)); + } + } + + [GeneratedDependencyProperty] + public partial bool IsEditorOl { get; set; } + private bool _isEditorOlInternal; + async partial void OnIsEditorOlChanged(bool newValue) + { + if (newValue != _isEditorOlInternal) + { + await _chromium.ExecuteScriptFunctionSafeAsync("editor.execCommand", JsonSerializer.Serialize("insertorderedlist", BasicTypesJsonContext.Default.String)); + } + } + + [GeneratedDependencyProperty] + public partial bool IsEditorUl { get; set; } + private bool _isEditorUlInternal; + async partial void OnIsEditorUlChanged(bool newValue) + { + if (newValue != _isEditorUlInternal) + { + await _chromium.ExecuteScriptFunctionSafeAsync("editor.execCommand", JsonSerializer.Serialize("insertunorderedlist", BasicTypesJsonContext.Default.String)); + } + } + + [GeneratedDependencyProperty(DefaultValue = true)] + public partial bool IsEditorIndentEnabled { get; private set; } + + [GeneratedDependencyProperty] + public partial bool IsEditorOutdentEnabled { get; private set; } + + [GeneratedDependencyProperty] + public partial int EditorAlignmentSelectedIndex { get; set; } + private int _editorAlignmentSelectedIndexInternal; + async partial void OnEditorAlignmentSelectedIndexChanged(int newValue) + { + if (newValue != _editorAlignmentSelectedIndexInternal) + { + var alignmentAction = newValue switch + { + 0 => "justifyleft", + 1 => "justifycenter", + 2 => "justifyright", + 3 => "justifyfull", + _ => throw new ArgumentOutOfRangeException(nameof(newValue)) + }; + + await _chromium.ExecuteScriptFunctionSafeAsync("editor.execCommand", JsonSerializer.Serialize(alignmentAction, BasicTypesJsonContext.Default.String)); + } + } + + [GeneratedDependencyProperty] + public partial bool IsEditorWebViewEditor { get; set; } + + async partial void OnIsEditorWebViewEditorChanged(bool newValue) + { + await _chromium.ExecuteScriptFunctionSafeAsync("toggleToolbar", JsonSerializer.Serialize(newValue, BasicTypesJsonContext.Default.Boolean)); + } + + private const string PART_WebView = "WebView"; + private WebView2 _chromium; + private bool _disposedValue; + private readonly TaskCompletionSource _domLoadedTask = new(); + + public WebViewEditorControl() + { + this.DefaultStyleKey = typeof(WebViewEditorControl); + + IsEditorDarkMode = WinoApplication.Current.UnderlyingThemeService.IsUnderlyingThemeDark(); + } + + protected override async void OnApplyTemplate() + { + base.OnApplyTemplate(); + + _chromium = GetTemplateChild(PART_WebView) as WebView2; + + await InitializeComponent(); + } + + private async Task InitializeComponent() + { + Environment.SetEnvironmentVariable("WEBVIEW2_DEFAULT_BACKGROUND_COLOR", "00FFFFFF"); + Environment.SetEnvironmentVariable("WEBVIEW2_ADDITIONAL_BROWSER_ARGUMENTS", "--enable-features=OverlayScrollbar,msOverlayScrollbarWinStyle,msOverlayScrollbarWinStyleAnimation"); + _chromium.CoreWebView2Initialized += ChromiumInitialized; + + await _chromium.EnsureCoreWebView2Async(); + } + + public async void EditorIndentAsync() + { + await _chromium.ExecuteScriptFunctionSafeAsync("editor.execCommand", JsonSerializer.Serialize("indent", BasicTypesJsonContext.Default.String)); + } + + public async void EditorOutdentAsync() + { + await _chromium.ExecuteScriptFunctionSafeAsync("editor.execCommand", JsonSerializer.Serialize("outdent", BasicTypesJsonContext.Default.String)); + } + + public void ToggleEditorTheme() + { + IsEditorDarkMode = !IsEditorDarkMode; + } + + public async Task GetHtmlBodyAsync() + { + var editorContent = await _chromium.ExecuteScriptFunctionSafeAsync("GetHTMLContent"); + + return JsonSerializer.Deserialize(editorContent, BasicTypesJsonContext.Default.String); + } + + public async void ShowImagePicker() + { + await _chromium.ExecuteScriptFunctionSafeAsync("imageInput.click"); + } + + public async Task InsertImagesAsync(List images) + { + await _chromium.ExecuteScriptFunctionSafeAsync("insertImages", JsonSerializer.Serialize(images, DomainModelsJsonContext.Default.ListImageInfo)); + } + + public async void ShowEmojiPicker() + { + CoreInputView.GetForCurrentView().TryShow(CoreInputViewKind.Emoji); + + await FocusEditorAsync(focusControlAsWell: true); + } + + public WebView2 GetUnderlyingWebView() => _chromium; + + public async Task RenderHtmlAsync(string htmlBody) + { + await _domLoadedTask.Task; + + await UpdateEditorThemeAsync(); + await InitializeEditorAsync(); + + await _chromium.ExecuteScriptFunctionAsync("RenderHTML", parameters: JsonSerializer.Serialize(string.IsNullOrEmpty(htmlBody) ? " " : htmlBody, BasicTypesJsonContext.Default.String)); + } + + private async Task InitializeEditorAsync() + { + var fonts = _fontService.GetFonts(); + var composerFont = _preferencesService.ComposerFont; + int composerFontSize = _preferencesService.ComposerFontSize; + var readerFont = _preferencesService.ReaderFont; + int readerFontSize = _preferencesService.ReaderFontSize; + return await _chromium.ExecuteScriptFunctionAsync("initializeJodit", false, + JsonSerializer.Serialize(fonts, BasicTypesJsonContext.Default.ListString), + JsonSerializer.Serialize(composerFont, BasicTypesJsonContext.Default.String), + JsonSerializer.Serialize(composerFontSize, BasicTypesJsonContext.Default.Int32), + JsonSerializer.Serialize(readerFont, BasicTypesJsonContext.Default.String), + JsonSerializer.Serialize(readerFontSize, BasicTypesJsonContext.Default.Int32)); + } + + private async void ChromiumInitialized(WebView2 sender, CoreWebView2InitializedEventArgs args) + { + var editorBundlePath = (await _nativeAppService.GetEditorBundlePathAsync()).Replace("editor.html", string.Empty); + + _chromium.CoreWebView2.SetVirtualHostNameToFolderMapping("app.editor", editorBundlePath, CoreWebView2HostResourceAccessKind.Allow); + _chromium.Source = new Uri("https://app.editor/editor.html"); + + _chromium.CoreWebView2.DOMContentLoaded += DomLoaded; + + _chromium.CoreWebView2.WebMessageReceived += ScriptMessageReceived; + } + + public async Task UpdateEditorThemeAsync() + { + await _domLoadedTask.Task; + + if (IsEditorDarkMode) + { + _chromium.CoreWebView2.Profile.PreferredColorScheme = CoreWebView2PreferredColorScheme.Dark; + await _chromium.ExecuteScriptFunctionSafeAsync("SetDarkEditor"); + } + else + { + _chromium.CoreWebView2.Profile.PreferredColorScheme = CoreWebView2PreferredColorScheme.Light; + await _chromium.ExecuteScriptFunctionSafeAsync("SetLightEditor"); + } + } + + /// + /// Places the cursor in the composer. + /// + /// Whether control itself should be focused as well or not. + public async Task FocusEditorAsync(bool focusControlAsWell) + { + await _chromium.ExecuteScriptSafeAsync("editor.selection.setCursorIn(editor.editor.firstChild, true)"); + + if (focusControlAsWell) + { + _chromium.Focus(FocusState.Keyboard); + _chromium.Focus(FocusState.Programmatic); + } + } + + private void ScriptMessageReceived(CoreWebView2 sender, CoreWebView2WebMessageReceivedEventArgs args) + { + var change = JsonSerializer.Deserialize(args.WebMessageAsJson, DomainModelsJsonContext.Default.WebViewMessage); + + if (change.Type == "bold") + { + _isEditorBoldInternal = change.Value == "true"; + IsEditorBold = _isEditorBoldInternal; + } + else if (change.Type == "italic") + { + _isEditorItalicInternal = change.Value == "true"; + IsEditorItalic = _isEditorItalicInternal; + } + else if (change.Type == "underline") + { + _isEditorUnderlineInternal = change.Value == "true"; + IsEditorUnderline = _isEditorUnderlineInternal; + } + else if (change.Type == "strikethrough") + { + _isEditorStrikethroughInternal = change.Value == "true"; + IsEditorStrikethrough = _isEditorStrikethroughInternal; + } + else if (change.Type == "ol") + { + _isEditorOlInternal = change.Value == "true"; + IsEditorOl = _isEditorOlInternal; + } + else if (change.Type == "ul") + { + _isEditorUlInternal = change.Value == "true"; + IsEditorUl = _isEditorUlInternal; + } + else if (change.Type == "indent") + { + IsEditorIndentEnabled = change.Value != "disabled"; + } + else if (change.Type == "outdent") + { + IsEditorOutdentEnabled = change.Value != "disabled"; + } + else if (change.Type == "alignment") + { + var parsedValue = change.Value switch + { + "jodit-icon_left" => 0, + "jodit-icon_center" => 1, + "jodit-icon_right" => 2, + "jodit-icon_justify" => 3, + _ => 0 + }; + _editorAlignmentSelectedIndexInternal = parsedValue; + EditorAlignmentSelectedIndex = _editorAlignmentSelectedIndexInternal; + } + } + + private void DomLoaded(CoreWebView2 sender, CoreWebView2DOMContentLoadedEventArgs args) => _domLoadedTask.TrySetResult(true); + + private void Dispose(bool disposing) + { + if (!_disposedValue) + { + if (disposing && _chromium != null) + { + _chromium.CoreWebView2Initialized -= ChromiumInitialized; + + if (_chromium.CoreWebView2 != null) + { + _chromium.CoreWebView2.DOMContentLoaded -= DomLoaded; + _chromium.CoreWebView2.WebMessageReceived -= ScriptMessageReceived; + } + + _chromium.Close(); + } + _disposedValue = true; + } + } + + public void Dispose() + { + // Do not change this code. Put cleanup code in 'Dispose(bool disposing)' method + Dispose(disposing: true); + GC.SuppressFinalize(this); + } +} diff --git a/Wino.Mail.WinUI/Controls/WinoExpander.cs b/Wino.Mail.WinUI/Controls/WinoExpander.cs new file mode 100644 index 00000000..4b9acfc3 --- /dev/null +++ b/Wino.Mail.WinUI/Controls/WinoExpander.cs @@ -0,0 +1,128 @@ +using CommunityToolkit.Diagnostics; +using Microsoft.UI.Xaml; +using Microsoft.UI.Xaml.Controls; +using Microsoft.UI.Xaml.Hosting; +using Microsoft.UI.Xaml.Markup; + +namespace Wino.Controls; + +[ContentProperty(Name = nameof(Content))] +public partial class WinoExpander : Control +{ + private const string PART_HeaderGrid = "HeaderGrid"; + private const string PART_ContentAreaWrapper = "ContentAreaWrapper"; + private const string PART_ContentArea = "ContentArea"; + + private ContentControl HeaderGrid; + private ContentControl ContentArea; + private Grid ContentAreaWrapper; + + public static readonly DependencyProperty HeaderProperty = DependencyProperty.Register(nameof(Header), typeof(UIElement), typeof(WinoExpander), new PropertyMetadata(null)); + public static readonly DependencyProperty ContentProperty = DependencyProperty.Register(nameof(Content), typeof(UIElement), typeof(WinoExpander), new PropertyMetadata(null)); + public static readonly DependencyProperty IsExpandedProperty = DependencyProperty.Register(nameof(IsExpanded), typeof(bool), typeof(WinoExpander), new PropertyMetadata(false, new PropertyChangedCallback(OnIsExpandedChanged))); + public static readonly DependencyProperty TemplateSettingsProperty = DependencyProperty.Register(nameof(TemplateSettings), typeof(WinoExpanderTemplateSettings), typeof(WinoExpander), new PropertyMetadata(new WinoExpanderTemplateSettings())); + + public UIElement Content + { + get { return (UIElement)GetValue(ContentProperty); } + set { SetValue(ContentProperty, value); } + } + + public WinoExpanderTemplateSettings TemplateSettings + { + get { return (WinoExpanderTemplateSettings)GetValue(TemplateSettingsProperty); } + set { SetValue(TemplateSettingsProperty, value); } + } + + public bool IsExpanded + { + get { return (bool)GetValue(IsExpandedProperty); } + set { SetValue(IsExpandedProperty, value); } + } + + public UIElement Header + { + get { return (UIElement)GetValue(HeaderProperty); } + set { SetValue(HeaderProperty, value); } + } + + protected override void OnApplyTemplate() + { + base.OnApplyTemplate(); + + HeaderGrid = GetTemplateChild(PART_HeaderGrid) as ContentControl; + ContentAreaWrapper = GetTemplateChild(PART_ContentAreaWrapper) as Grid; + ContentArea = GetTemplateChild(PART_ContentArea) as ContentControl; + + Guard.IsNotNull(HeaderGrid, nameof(HeaderGrid)); + Guard.IsNotNull(ContentAreaWrapper, nameof(ContentAreaWrapper)); + Guard.IsNotNull(ContentArea, nameof(ContentArea)); + + var clipComposition = ElementCompositionPreview.GetElementVisual(ContentAreaWrapper); + clipComposition.Clip = clipComposition.Compositor.CreateInsetClip(); + + ContentAreaWrapper.SizeChanged += ContentSizeChanged; + HeaderGrid.Tapped += HeaderTapped; + } + + private void ContentSizeChanged(object sender, SizeChangedEventArgs e) + { + TemplateSettings.ContentHeight = e.NewSize.Height; + TemplateSettings.NegativeContentHeight = -1 * (double)e.NewSize.Height; + } + + private void HeaderTapped(object sender, Microsoft.UI.Xaml.Input.TappedRoutedEventArgs e) + { + // Tapped is delegated from executing hover action like flag or delete. + // No need to toggle the expander. + + if (Header is MailItemDisplayInformationControl itemDisplayInformationControl && + itemDisplayInformationControl.IsRunningHoverAction) + { + itemDisplayInformationControl.IsRunningHoverAction = false; + return; + } + + IsExpanded = !IsExpanded; + } + + private static void OnIsExpandedChanged(DependencyObject obj, DependencyPropertyChangedEventArgs args) + { + if (obj is WinoExpander control) + control.UpdateVisualStates(); + } + + private void UpdateVisualStates() + { + VisualStateManager.GoToState(this, IsExpanded ? "Expanded" : "Collapsed", true); + } +} + +#region Settings + +public class WinoExpanderTemplateSettings : DependencyObject +{ + public static readonly DependencyProperty HeaderHeightProperty = DependencyProperty.Register(nameof(HeaderHeight), typeof(double), typeof(WinoExpanderTemplateSettings), new PropertyMetadata(0.0)); + public static readonly DependencyProperty ContentHeightProperty = DependencyProperty.Register(nameof(ContentHeight), typeof(double), typeof(WinoExpanderTemplateSettings), new PropertyMetadata(0.0)); + public static readonly DependencyProperty NegativeContentHeightProperty = DependencyProperty.Register(nameof(NegativeContentHeight), typeof(double), typeof(WinoExpanderTemplateSettings), new PropertyMetadata(0.0)); + + public double NegativeContentHeight + { + get { return (double)GetValue(NegativeContentHeightProperty); } + set { SetValue(NegativeContentHeightProperty, value); } + } + + public double HeaderHeight + { + get { return (double)GetValue(HeaderHeightProperty); } + set { SetValue(HeaderHeightProperty, value); } + } + + public double ContentHeight + { + get { return (double)GetValue(ContentHeightProperty); } + set { SetValue(ContentHeightProperty, value); } + } +} + +#endregion diff --git a/Wino.Mail.WinUI/Controls/WinoSwipeControlItems.cs b/Wino.Mail.WinUI/Controls/WinoSwipeControlItems.cs new file mode 100644 index 00000000..3d6e836e --- /dev/null +++ b/Wino.Mail.WinUI/Controls/WinoSwipeControlItems.cs @@ -0,0 +1,81 @@ +using System.Linq; +using Microsoft.UI.Xaml.Controls; +using Microsoft.UI.Xaml; +using Wino.Core.Domain.Enums; +using Wino.Core.Domain.Models.MailItem; +using Wino.Helpers; +using Wino.Mail.ViewModels.Data; + +namespace Wino.Controls; + +public partial class WinoSwipeControlItems : SwipeItems +{ + public static readonly DependencyProperty SwipeOperationProperty = DependencyProperty.Register(nameof(SwipeOperation), typeof(MailOperation), typeof(WinoSwipeControlItems), new PropertyMetadata(default(MailOperation), new PropertyChangedCallback(OnItemsChanged))); + public static readonly DependencyProperty MailItemProperty = DependencyProperty.Register(nameof(MailItem), typeof(IMailItem), typeof(WinoSwipeControlItems), new PropertyMetadata(null)); + + public IMailItem MailItem + { + get { return (IMailItem)GetValue(MailItemProperty); } + set { SetValue(MailItemProperty, value); } + } + + + public MailOperation SwipeOperation + { + get { return (MailOperation)GetValue(SwipeOperationProperty); } + set { SetValue(SwipeOperationProperty, value); } + } + + private static void OnItemsChanged(DependencyObject obj, DependencyPropertyChangedEventArgs args) + { + if (obj is WinoSwipeControlItems control) + { + control.BuildSwipeItems(); + } + } + + private void BuildSwipeItems() + { + this.Clear(); + + var swipeItem = GetSwipeItem(SwipeOperation); + + this.Add(swipeItem); + } + + private SwipeItem GetSwipeItem(MailOperation operation) + { + if (MailItem == null) return null; + + var finalOperation = operation; + + bool isSingleItem = MailItem is MailItemViewModel; + + if (isSingleItem) + { + var singleItem = MailItem as MailItemViewModel; + + if (operation == MailOperation.MarkAsRead && singleItem.IsRead) + finalOperation = MailOperation.MarkAsUnread; + else if (operation == MailOperation.MarkAsUnread && !singleItem.IsRead) + finalOperation = MailOperation.MarkAsRead; + } + else + { + var threadItem = MailItem as ThreadMailItemViewModel; + + if (operation == MailOperation.MarkAsRead && threadItem.ThreadItems.All(a => a.IsRead)) + finalOperation = MailOperation.MarkAsUnread; + else if (operation == MailOperation.MarkAsUnread && threadItem.ThreadItems.All(a => !a.IsRead)) + finalOperation = MailOperation.MarkAsRead; + } + + var item = new SwipeItem() + { + IconSource = new WinoFontIconSource() { Icon = XamlHelpers.GetWinoIconGlyph(finalOperation) }, + Text = XamlHelpers.GetOperationString(finalOperation), + }; + + return item; + } +} diff --git a/Wino.Mail.WinUI/Dialogs/AccountReorderDialog.xaml b/Wino.Mail.WinUI/Dialogs/AccountReorderDialog.xaml new file mode 100644 index 00000000..459463d2 --- /dev/null +++ b/Wino.Mail.WinUI/Dialogs/AccountReorderDialog.xaml @@ -0,0 +1,85 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/Wino.Mail.WinUI/Dialogs/AccountReorderDialog.xaml.cs b/Wino.Mail.WinUI/Dialogs/AccountReorderDialog.xaml.cs new file mode 100644 index 00000000..d9b7815a --- /dev/null +++ b/Wino.Mail.WinUI/Dialogs/AccountReorderDialog.xaml.cs @@ -0,0 +1,52 @@ +using System.Collections.ObjectModel; +using System.Linq; +using Microsoft.Extensions.DependencyInjection; +using Microsoft.UI.Xaml.Controls; +using Wino.Core.Domain.Interfaces; +using Wino.Mail.WinUI; + +namespace Wino.Dialogs; + +public sealed partial class AccountReorderDialog : ContentDialog +{ + public ObservableCollection Accounts { get; } + + private int count; + private bool isOrdering = false; + + private readonly IAccountService _accountService = App.Current.Services.GetService(); + + public AccountReorderDialog(ObservableCollection accounts) + { + Accounts = accounts; + + count = accounts.Count; + + InitializeComponent(); + } + + private void DialogOpened(ContentDialog sender, ContentDialogOpenedEventArgs args) + { + Accounts.CollectionChanged -= AccountsChanged; + Accounts.CollectionChanged += AccountsChanged; + } + + private void DialogClosed(ContentDialog sender, ContentDialogClosedEventArgs args) => Accounts.CollectionChanged -= AccountsChanged; + + private async void AccountsChanged(object sender, System.Collections.Specialized.NotifyCollectionChangedEventArgs e) + { + if (count - 1 == Accounts.Count) + isOrdering = true; + + if (count == Accounts.Count && isOrdering) + { + // Order is completed. Apply changes. + + var dict = Accounts.ToDictionary(a => a.StartupEntityId, a => Accounts.IndexOf(a)); + + await _accountService.UpdateAccountOrdersAsync(dict); + + isOrdering = false; + } + } +} diff --git a/Wino.Mail.WinUI/Dialogs/CreateAccountAliasDialog.xaml b/Wino.Mail.WinUI/Dialogs/CreateAccountAliasDialog.xaml new file mode 100644 index 00000000..2e18c01b --- /dev/null +++ b/Wino.Mail.WinUI/Dialogs/CreateAccountAliasDialog.xaml @@ -0,0 +1,40 @@ + + + + + + + + + + + + + + + + + diff --git a/Wino.Mail.WinUI/Dialogs/CreateAccountAliasDialog.xaml.cs b/Wino.Mail.WinUI/Dialogs/CreateAccountAliasDialog.xaml.cs new file mode 100644 index 00000000..9b090941 --- /dev/null +++ b/Wino.Mail.WinUI/Dialogs/CreateAccountAliasDialog.xaml.cs @@ -0,0 +1,29 @@ +using System; +using Microsoft.UI.Xaml.Controls; +using Wino.Core.Domain.Entities.Mail; +using Wino.Core.Domain.Interfaces; + +namespace Wino.Dialogs; + +public sealed partial class CreateAccountAliasDialog : ContentDialog, ICreateAccountAliasDialog +{ + public MailAccountAlias CreatedAccountAlias { get; set; } + public CreateAccountAliasDialog() + { + InitializeComponent(); + } + + private void CreateClicked(ContentDialog sender, ContentDialogButtonClickEventArgs args) + { + CreatedAccountAlias = new MailAccountAlias + { + AliasAddress = AliasTextBox.Text.Trim(), + ReplyToAddress = ReplyToTextBox.Text.Trim(), + Id = Guid.NewGuid(), + IsPrimary = false, + IsVerified = false + }; + + Hide(); + } +} diff --git a/Wino.Mail.WinUI/Dialogs/MessageSourceDialog.xaml b/Wino.Mail.WinUI/Dialogs/MessageSourceDialog.xaml new file mode 100644 index 00000000..4a747d75 --- /dev/null +++ b/Wino.Mail.WinUI/Dialogs/MessageSourceDialog.xaml @@ -0,0 +1,28 @@ + + + + 1200 + + + + + + diff --git a/Wino.Mail.WinUI/Dialogs/MessageSourceDialog.xaml.cs b/Wino.Mail.WinUI/Dialogs/MessageSourceDialog.xaml.cs new file mode 100644 index 00000000..c93eed91 --- /dev/null +++ b/Wino.Mail.WinUI/Dialogs/MessageSourceDialog.xaml.cs @@ -0,0 +1,24 @@ +using Microsoft.Extensions.DependencyInjection; +using Microsoft.UI.Xaml.Controls; +using Wino.Core.Domain.Interfaces; +using Wino.Mail.WinUI; + + +namespace Wino.Mail.Dialogs; + +public sealed partial class MessageSourceDialog : ContentDialog +{ + private readonly IClipboardService _clipboardService = App.Current.Services.GetService(); + public string MessageSource { get; set; } + public bool Copied { get; set; } + public MessageSourceDialog() + { + this.InitializeComponent(); + } + + private void ContentDialog_PrimaryButtonClick(ContentDialog sender, ContentDialogButtonClickEventArgs args) + { + _clipboardService.CopyClipboardAsync(MessageSource); + Copied = true; + } +} diff --git a/Wino.Mail.WinUI/Dialogs/MoveMailDialog.xaml b/Wino.Mail.WinUI/Dialogs/MoveMailDialog.xaml new file mode 100644 index 00000000..3b62b109 --- /dev/null +++ b/Wino.Mail.WinUI/Dialogs/MoveMailDialog.xaml @@ -0,0 +1,61 @@ + + + + 600 + 600 + 756 + 756 + + + + + + + + + + + + + + + + + + + + + + diff --git a/Wino.Mail.WinUI/Dialogs/MoveMailDialog.xaml.cs b/Wino.Mail.WinUI/Dialogs/MoveMailDialog.xaml.cs new file mode 100644 index 00000000..0cb6d1f8 --- /dev/null +++ b/Wino.Mail.WinUI/Dialogs/MoveMailDialog.xaml.cs @@ -0,0 +1,74 @@ +using System.Collections.Generic; +using Microsoft.UI.Xaml; +using Microsoft.UI.Xaml.Controls; +using Wino.Core.Domain; +using Wino.Core.Domain.Models.Folders; + +namespace Wino.Dialogs; + +public sealed partial class MoveMailDialog : ContentDialog +{ + public IMailItemFolder SelectedFolder + { + get { return (IMailItemFolder)GetValue(SelectedFolderProperty); } + set { SetValue(SelectedFolderProperty, value); } + } + + public static readonly DependencyProperty SelectedFolderProperty = DependencyProperty.Register(nameof(SelectedFolder), typeof(IMailItemFolder), typeof(MoveMailDialog), new PropertyMetadata(null, OnSelectedFolderChanged)); + + + public List FolderList { get; set; } + + public MoveMailDialog(List allFolders) + { + InitializeComponent(); + + if (allFolders == null) return; + + FolderList = allFolders; + } + + private static void OnSelectedFolderChanged(DependencyObject obj, DependencyPropertyChangedEventArgs args) + { + if (obj is MoveMailDialog dialog) + { + dialog.VerifySelection(); + } + } + + private void VerifySelection() + { + if (SelectedFolder != null) + { + // Don't select non-move capable folders like Categories or More. + + if (!SelectedFolder.IsMoveTarget) + { + // Warn users for only proper mail folders. Not ghost folders. + InvalidFolderText.Visibility = Visibility.Visible; + InvalidFolderText.Text = string.Format(Translator.MoveMailDialog_InvalidFolderMessage, SelectedFolder.FolderName); + + if (FolderTreeView.SelectedItem != null) + { + // Toggle the expansion for the selected container if available. + // I don't like the expand arrow touch area. It's better this way. + + if (FolderTreeView.ContainerFromItem(FolderTreeView.SelectedItem) is Microsoft.UI.Xaml.Controls.TreeViewItem container) + { + container.IsExpanded = !container.IsExpanded; + } + } + SelectedFolder = null; + } + else + { + Hide(); + } + } + } + + private void CancelClicked(ContentDialog sender, ContentDialogButtonClickEventArgs args) + { + Hide(); + } +} diff --git a/Wino.Mail.WinUI/Dialogs/NewImapSetupDialog.xaml b/Wino.Mail.WinUI/Dialogs/NewImapSetupDialog.xaml new file mode 100644 index 00000000..f161ddd3 --- /dev/null +++ b/Wino.Mail.WinUI/Dialogs/NewImapSetupDialog.xaml @@ -0,0 +1,25 @@ + + + + 0,0,0,0 + + 1920 + + + + + diff --git a/Wino.Mail.WinUI/Dialogs/NewImapSetupDialog.xaml.cs b/Wino.Mail.WinUI/Dialogs/NewImapSetupDialog.xaml.cs new file mode 100644 index 00000000..e0f8703d --- /dev/null +++ b/Wino.Mail.WinUI/Dialogs/NewImapSetupDialog.xaml.cs @@ -0,0 +1,111 @@ +using System; +using System.Threading; +using System.Threading.Tasks; +using CommunityToolkit.Mvvm.Messaging; +using Microsoft.UI.Xaml.Controls; +using Microsoft.UI.Xaml.Media.Animation; +using Wino.Core.Domain.Entities.Shared; +using Wino.Core.Domain.Enums; +using Wino.Core.Domain.Interfaces; +using Wino.Core.Domain.Models.Accounts; +using Wino.Messaging.Client.Mails; +using Wino.Views.ImapSetup; + +namespace Wino.Dialogs; + +public enum ImapSetupState +{ + Welcome, + AutoDiscovery, + TestingConnection, + PreparingFolder +} + +public sealed partial class NewImapSetupDialog : ContentDialog, + IRecipient, + IRecipient, + IRecipient, + IImapAccountCreationDialog +{ + private TaskCompletionSource _getServerInfoTaskCompletionSource = new TaskCompletionSource(); + private TaskCompletionSource dialogOpened = new TaskCompletionSource(); + private bool isDismissRequested = false; + + public NewImapSetupDialog() + { + InitializeComponent(); + } + + // Not used for now. + public AccountCreationDialogState State { get; set; } + + public void Complete(bool cancel) + { + if (!_getServerInfoTaskCompletionSource.Task.IsCompleted) + _getServerInfoTaskCompletionSource.TrySetResult(null); + + isDismissRequested = true; + + Hide(); + } + + public Task GetCustomServerInformationAsync() => _getServerInfoTaskCompletionSource.Task; + + public async void Receive(ImapSetupBackNavigationRequested message) + { + // Frame go back + if (message.PageType == null) + { + if (ImapFrame.CanGoBack) + { + // Go back using Dispatcher to allow navigations in OnNavigatedTo. + await Dispatcher.RunAsync(Windows.UI.Core.CoreDispatcherPriority.Normal, () => + { + ImapFrame.GoBack(); + }); + } + } + else + { + ImapFrame.Navigate(message.PageType, message.Parameter, new SlideNavigationTransitionInfo() { Effect = SlideNavigationTransitionEffect.FromLeft }); + } + } + + public void Receive(ImapSetupNavigationRequested message) + { + ImapFrame.Navigate(message.PageType, message.Parameter, new SlideNavigationTransitionInfo() { Effect = SlideNavigationTransitionEffect.FromRight }); + } + + public void Receive(ImapSetupDismissRequested message) => _getServerInfoTaskCompletionSource.TrySetResult(message.CompletedServerInformation); + + public async Task ShowDialogAsync(CancellationTokenSource cancellationTokenSource) + { + Opened += DialogOpened; + + _ = ShowAsync(); + + await dialogOpened.Task; + } + + private void DialogOpened(ContentDialog sender, ContentDialogOpenedEventArgs args) + { + Opened -= DialogOpened; + + dialogOpened?.SetResult(true); + } + + public void ShowPreparingFolders() + { + ImapFrame.Navigate(typeof(PreparingImapFoldersPage), new SlideNavigationTransitionInfo() { Effect = SlideNavigationTransitionEffect.FromLeft }); + } + + public void StartImapConnectionSetup(MailAccount account) => ImapFrame.Navigate(typeof(WelcomeImapSetupPage), account, new DrillInNavigationTransitionInfo()); + public void StartImapConnectionSetup(AccountCreationDialogResult accountCreationDialogResult) => ImapFrame.Navigate(typeof(WelcomeImapSetupPage), accountCreationDialogResult, new DrillInNavigationTransitionInfo()); + + private void ImapSetupDialogClosed(ContentDialog sender, ContentDialogClosedEventArgs args) => WeakReferenceMessenger.Default.UnregisterAll(this); + + private void ImapSetupDialogOpened(ContentDialog sender, ContentDialogOpenedEventArgs args) => WeakReferenceMessenger.Default.RegisterAll(this); + + // Don't hide the dialog unless dismiss is requested from the inner pages specifically. + private void OnDialogClosing(ContentDialog sender, ContentDialogClosingEventArgs args) => args.Cancel = !isDismissRequested; +} diff --git a/Wino.Mail.WinUI/Dialogs/SignatureEditorDialog.xaml b/Wino.Mail.WinUI/Dialogs/SignatureEditorDialog.xaml new file mode 100644 index 00000000..774c0e72 --- /dev/null +++ b/Wino.Mail.WinUI/Dialogs/SignatureEditorDialog.xaml @@ -0,0 +1,266 @@ + + + + 1200 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/Wino.Mail.WinUI/Dialogs/SignatureEditorDialog.xaml.cs b/Wino.Mail.WinUI/Dialogs/SignatureEditorDialog.xaml.cs new file mode 100644 index 00000000..310bc12e --- /dev/null +++ b/Wino.Mail.WinUI/Dialogs/SignatureEditorDialog.xaml.cs @@ -0,0 +1,80 @@ +using System; +using System.Text.RegularExpressions; +using Microsoft.UI.Xaml.Controls; +using Wino.Core.Domain; +using Wino.Core.Domain.Entities.Mail; + +namespace Wino.Dialogs; + +public sealed partial class SignatureEditorDialog : ContentDialog +{ + public AccountSignature Result; + + public SignatureEditorDialog() + { + InitializeComponent(); + + SignatureNameTextBox.Header = Translator.SignatureEditorDialog_SignatureName_TitleNew; + + // TODO: Should be added additional logic to enable/disable primary button when webview content changed. + IsPrimaryButtonEnabled = true; + } + + public SignatureEditorDialog(AccountSignature signatureModel) + { + InitializeComponent(); + + SignatureNameTextBox.Text = signatureModel.Name.Trim(); + SignatureNameTextBox.Header = string.Format(Translator.SignatureEditorDialog_SignatureName_TitleEdit, signatureModel.Name); + + Result = new AccountSignature + { + Id = signatureModel.Id, + Name = signatureModel.Name, + MailAccountId = signatureModel.MailAccountId, + HtmlBody = signatureModel.HtmlBody + }; + + // TODO: Should be added additional logic to enable/disable primary button when webview content changed. + IsPrimaryButtonEnabled = true; + } + + private async void SignatureDialogOpened(ContentDialog sender, ContentDialogOpenedEventArgs args) + { + await WebViewEditor.RenderHtmlAsync(Result?.HtmlBody ?? string.Empty); + } + + private void DialogClosed(ContentDialog sender, ContentDialogClosedEventArgs args) + { + WebViewEditor.Dispose(); + } + + private async void SaveClicked(ContentDialog sender, ContentDialogButtonClickEventArgs args) + { + var newSignature = Regex.Unescape(await WebViewEditor.GetHtmlBodyAsync()); + + if (Result == null) + { + Result = new AccountSignature + { + Id = Guid.NewGuid(), + Name = SignatureNameTextBox.Text.Trim(), + HtmlBody = newSignature + }; + } + else + { + Result.Name = SignatureNameTextBox.Text.Trim(); + Result.HtmlBody = newSignature; + } + + Hide(); + } + + private void CancelClicked(ContentDialog sender, ContentDialogButtonClickEventArgs args) + { + Hide(); + } + + private void SignatureNameTextBoxTextChanged(object sender, TextChangedEventArgs e) => IsPrimaryButtonEnabled = !string.IsNullOrWhiteSpace(SignatureNameTextBox.Text); +} diff --git a/Wino.Mail.WinUI/Dialogs/SystemFolderConfigurationDialog.xaml b/Wino.Mail.WinUI/Dialogs/SystemFolderConfigurationDialog.xaml new file mode 100644 index 00000000..51f82af3 --- /dev/null +++ b/Wino.Mail.WinUI/Dialogs/SystemFolderConfigurationDialog.xaml @@ -0,0 +1,100 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/Wino.Mail.WinUI/Dialogs/SystemFolderConfigurationDialog.xaml.cs b/Wino.Mail.WinUI/Dialogs/SystemFolderConfigurationDialog.xaml.cs new file mode 100644 index 00000000..75a4df16 --- /dev/null +++ b/Wino.Mail.WinUI/Dialogs/SystemFolderConfigurationDialog.xaml.cs @@ -0,0 +1,71 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using Microsoft.UI.Xaml.Controls; +using Wino.Core.Domain; +using Wino.Core.Domain.Entities.Mail; +using Wino.Core.Domain.Enums; +using Wino.Core.Domain.Exceptions; +using Wino.Core.Domain.Models.Folders; + +namespace Wino.Dialogs; + +public sealed partial class SystemFolderConfigurationDialog : ContentDialog +{ + private bool canDismissDialog = false; + + public SystemFolderConfiguration Configuration { get; set; } + public List AvailableFolders { get; } + + public MailItemFolder Sent { get; set; } + public MailItemFolder Draft { get; set; } + public MailItemFolder Archive { get; set; } + public MailItemFolder Junk { get; set; } + public MailItemFolder Trash { get; set; } + + public SystemFolderConfigurationDialog(List availableFolders) + { + InitializeComponent(); + + AvailableFolders = availableFolders; + + Sent = AvailableFolders.Find(a => a.SpecialFolderType == Core.Domain.Enums.SpecialFolderType.Sent); + Draft = AvailableFolders.Find(a => a.SpecialFolderType == Core.Domain.Enums.SpecialFolderType.Draft); + Archive = AvailableFolders.Find(a => a.SpecialFolderType == Core.Domain.Enums.SpecialFolderType.Archive); + Junk = AvailableFolders.Find(a => a.SpecialFolderType == Core.Domain.Enums.SpecialFolderType.Junk); + Trash = AvailableFolders.Find(a => a.SpecialFolderType == Core.Domain.Enums.SpecialFolderType.Deleted); + } + + private void DialogClosing(ContentDialog sender, ContentDialogClosingEventArgs args) + { + args.Cancel = !canDismissDialog; + } + + private void CancelClicked(ContentDialog sender, ContentDialogButtonClickEventArgs args) + => canDismissDialog = true; + + private void SaveClicked(ContentDialog sender, ContentDialogButtonClickEventArgs args) + { + ValidationErrorTextBlock.Text = string.Empty; + + var allSpecialFolders = new List() + { + Sent, Draft, Archive, Trash, Junk + }; + + if (allSpecialFolders.Any(a => a != null && a.SpecialFolderType == SpecialFolderType.Inbox)) + ValidationErrorTextBlock.Text = Translator.SystemFolderConfigDialogValidation_InboxSelected; + + if (new HashSet(allSpecialFolders.Where(a => a != null).Select(x => x.Id)).Count != allSpecialFolders.Where(a => a != null).Count()) + ValidationErrorTextBlock.Text = Translator.SystemFolderConfigDialogValidation_DuplicateSystemFolders; + + // Check if we can save. + if (string.IsNullOrEmpty(ValidationErrorTextBlock.Text)) + { + var configuration = new SystemFolderConfiguration(Sent, Draft, Archive, Trash, Junk); + + canDismissDialog = true; + Configuration = configuration; + } + } +} diff --git a/Wino.Mail.WinUI/JS/editor.html b/Wino.Mail.WinUI/JS/editor.html new file mode 100644 index 00000000..d979daa6 --- /dev/null +++ b/Wino.Mail.WinUI/JS/editor.html @@ -0,0 +1,43 @@ + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/Wino.Mail.WinUI/JS/editor.js b/Wino.Mail.WinUI/JS/editor.js new file mode 100644 index 00000000..f2e55a7a --- /dev/null +++ b/Wino.Mail.WinUI/JS/editor.js @@ -0,0 +1,130 @@ +const joditConfig = { + "useSearch": false, + "toolbar": true, + "buttons": "bold,italic,underline,strikethrough,brush,ul,ol,font,fontsize,paragraph,image,link,indent,outdent,align,lineHeight,table", + "inline": true, + "toolbarAdaptive": false, + "toolbarInlineForSelection": false, + "showCharsCounter": false, + "showWordsCounter": false, + "showXPathInStatusbar": false, + "link": { + "processVideoLink": false + }, + "disablePlugins": "add-new-line,backspace", + "showPlaceholder": false, + "uploader": { + "insertImageAsBase64URI": true + }, + "enter": "DIV" +} + +// This method should be called first all the time. +function initializeJodit(fonts, defaultComposerFont, defaultComposerFontSize, defaultReaderFont, defaultReaderFontSize) { + const fontsWithFallabckObject = fonts.reduce((acc, font) => { acc[`'${font}',Arial,sans-serif`] = font; return acc; }, {}); + const mergedConfig = { + ...joditConfig, + controls: { + font: { + list: Jodit.atom(fontsWithFallabckObject) + } + }, + style: { font: `${defaultReaderFontSize}px ${defaultReaderFont}` }, + } + + Jodit.plugins.add('inlineFonts', jodit => { + jodit.events.on('afterEnter', e => { + const current = jodit.selection.current().parentNode; + current.style.fontFamily = `'${defaultComposerFont}',Arial,sans-serif`; + current.style.fontSize = `${defaultComposerFontSize}px`; + }); + }); + + // Don't add const/let/var here, it should be global + editor = Jodit.make("#editor", mergedConfig); + + // Handle the image input change event + imageInput.addEventListener('change', () => { + const file = imageInput.files[0]; + if (file) { + const reader = new FileReader(); + reader.onload = function (event) { + const base64Image = event.target.result; + insertImages([{ data: base64Image, name: file.name }]); + }; + reader.readAsDataURL(file); + } + }); + + // Listeners for button events + const disabledButtons = ["indent", "outdent"]; + const ariaPressedButtons = ["bold", "italic", "underline", "strikethrough", "ul", "ol"]; + + const alignmentButton = document.querySelector(`[ref='left']`).firstChild.firstChild; + const alignmentObserver = new MutationObserver(function () { + const value = alignmentButton.firstChild.getAttribute('class').split(' ')[0]; + window.chrome.webview.postMessage({ type: 'alignment', value: value }); + }); + alignmentObserver.observe(alignmentButton, { childList: true, attributes: true, attributeFilter: ["class"] }); + + const ariaObservers = ariaPressedButtons.map(button => { + const buttonContainer = document.querySelector(`[ref='${button}']`); + const observer = new MutationObserver(function () { pressedChanged(buttonContainer) }); + observer.observe(buttonContainer.firstChild, { attributes: true, attributeFilter: ["aria-pressed"] }); + + return observer; + }); + + const disabledObservers = disabledButtons.map(button => { + const buttonContainer = document.querySelector(`[ref='${button}']`); + const observer = new MutationObserver(function () { disabledButtonChanged(buttonContainer) }); + observer.observe(buttonContainer.firstChild, { attributes: true, attributeFilter: ["disabled"] }); + + return observer; + }); + + function pressedChanged(buttonContainer) { + const ref = buttonContainer.getAttribute('ref'); + const value = buttonContainer.firstChild.getAttribute('aria-pressed'); + window.chrome.webview.postMessage({ type: ref, value: value }); + } + + function disabledButtonChanged(buttonContainer) { + const ref = buttonContainer.getAttribute('ref'); + const value = buttonContainer.firstChild.getAttribute('disabled'); + window.chrome.webview.postMessage({ type: ref, value: value }); + } +} + +function RenderHTML(htmlString) { + editor.s.insertHTML(htmlString); + editor.synchronizeValues(); +} + +function GetHTMLContent() { + return editor.value; +} + +function SetLightEditor() { + DarkReader.disable(); +} + +function SetDarkEditor() { + DarkReader.enable(); +} + +function toggleToolbar(enable) { + const toolbar = document.querySelector('.jodit-toolbar__box'); + if (enable) { + toolbar.style.display = 'flex'; + } + else { + toolbar.style.display = 'none'; + } +} + +function insertImages(imagesInfo) { + imagesInfo.forEach(imageInfo => { + editor.selection.insertHTML(`${imageInfo.name}`); + }); +}; diff --git a/Wino.Mail.WinUI/JS/global.css b/Wino.Mail.WinUI/JS/global.css new file mode 100644 index 00000000..c20569f5 --- /dev/null +++ b/Wino.Mail.WinUI/JS/global.css @@ -0,0 +1,4 @@ +* { + scrollbar-color: auto !important; + scrollbar-width: thin !important; +} diff --git a/Wino.Mail.WinUI/JS/libs/darkreader.js b/Wino.Mail.WinUI/JS/libs/darkreader.js new file mode 100644 index 00000000..6e45c600 --- /dev/null +++ b/Wino.Mail.WinUI/JS/libs/darkreader.js @@ -0,0 +1,3187 @@ +/** + * Dark Reader v4.9.1 + * https://darkreader.org/ + */ + +(function (global, factory) { + typeof exports === 'object' && typeof module !== 'undefined' ? factory(exports) : + typeof define === 'function' && define.amd ? define(['exports'], factory) : + (global = global || self, factory(global.DarkReader = {})); +}(this, (function (exports) { 'use strict'; + + /*! ***************************************************************************** + Copyright (c) Microsoft Corporation. All rights reserved. + Licensed under the Apache License, Version 2.0 (the "License"); you may not use + this file except in compliance with the License. You may obtain a copy of the + License at http://www.apache.org/licenses/LICENSE-2.0 + + THIS CODE IS PROVIDED ON AN *AS IS* BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + KIND, EITHER EXPRESS OR IMPLIED, INCLUDING WITHOUT LIMITATION ANY IMPLIED + WARRANTIES OR CONDITIONS OF TITLE, FITNESS FOR A PARTICULAR PURPOSE, + MERCHANTABLITY OR NON-INFRINGEMENT. + + See the Apache Version 2.0 License for specific language governing permissions + and limitations under the License. + ***************************************************************************** */ + + var __assign = function() { + __assign = Object.assign || function __assign(t) { + for (var s, i = 1, n = arguments.length; i < n; i++) { + s = arguments[i]; + for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p)) t[p] = s[p]; + } + return t; + }; + return __assign.apply(this, arguments); + }; + + function __awaiter(thisArg, _arguments, P, generator) { + return new (P || (P = Promise))(function (resolve, reject) { + function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } } + function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } } + function step(result) { result.done ? resolve(result.value) : new P(function (resolve) { resolve(result.value); }).then(fulfilled, rejected); } + step((generator = generator.apply(thisArg, _arguments || [])).next()); + }); + } + + function __generator(thisArg, body) { + var _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g; + return g = { next: verb(0), "throw": verb(1), "return": verb(2) }, typeof Symbol === "function" && (g[Symbol.iterator] = function() { return this; }), g; + function verb(n) { return function (v) { return step([n, v]); }; } + function step(op) { + if (f) throw new TypeError("Generator is already executing."); + while (_) try { + if (f = 1, y && (t = op[0] & 2 ? y["return"] : op[0] ? y["throw"] || ((t = y["return"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done) return t; + if (y = 0, t) op = [op[0] & 2, t.value]; + switch (op[0]) { + case 0: case 1: t = op; break; + case 4: _.label++; return { value: op[1], done: false }; + case 5: _.label++; y = op[1]; op = [0]; continue; + case 7: op = _.ops.pop(); _.trys.pop(); continue; + default: + if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { _ = 0; continue; } + if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) { _.label = op[1]; break; } + if (op[0] === 6 && _.label < t[1]) { _.label = t[1]; t = op; break; } + if (t && _.label < t[2]) { _.label = t[2]; _.ops.push(op); break; } + if (t[2]) _.ops.pop(); + _.trys.pop(); continue; + } + op = body.call(thisArg, _); + } catch (e) { op = [6, e]; y = 0; } finally { f = t = 0; } + if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true }; + } + } + + function isFirefox() { + return navigator.userAgent.includes('Firefox'); + } + function isMacOS() { + return navigator.platform.toLowerCase().startsWith('mac'); + } + function isDeepSelectorSupported() { + try { + document.querySelector('x /deep/ x'); + return true; + } + catch (err) { + return false; + } + } + function isHostSelectorSupported() { + try { + document.querySelector(':host x'); + return true; + } + catch (err) { + return false; + } + } + function isDefinedSelectorSupported() { + try { + document.querySelector(':defined'); + return true; + } + catch (err) { + return false; + } + } + + function getOKResponse(url, mimeType) { + return __awaiter(this, void 0, void 0, function () { + var response; + return __generator(this, function (_a) { + switch (_a.label) { + case 0: return [4, fetch(url, { + cache: 'force-cache', + credentials: 'omit', + })]; + case 1: + response = _a.sent(); + if (isFirefox() && mimeType === 'text/css' && url.startsWith('moz-extension://') && url.endsWith('.css')) { + return [2, response]; + } + if (mimeType && !response.headers.get('Content-Type').startsWith(mimeType)) { + throw new Error("Mime type mismatch when loading " + url); + } + if (!response.ok) { + throw new Error("Unable to load " + url + " " + response.status + " " + response.statusText); + } + return [2, response]; + } + }); + }); + } + function loadAsDataURL(url, mimeType) { + return __awaiter(this, void 0, void 0, function () { + var response; + return __generator(this, function (_a) { + switch (_a.label) { + case 0: return [4, getOKResponse(url, mimeType)]; + case 1: + response = _a.sent(); + return [4, readResponseAsDataURL(response)]; + case 2: return [2, _a.sent()]; + } + }); + }); + } + function readResponseAsDataURL(response) { + return __awaiter(this, void 0, void 0, function () { + var blob, dataURL; + return __generator(this, function (_a) { + switch (_a.label) { + case 0: return [4, response.blob()]; + case 1: + blob = _a.sent(); + return [4, (new Promise(function (resolve) { + var reader = new FileReader(); + reader.onloadend = function () { return resolve(reader.result); }; + reader.readAsDataURL(blob); + }))]; + case 2: + dataURL = _a.sent(); + return [2, dataURL]; + } + }); + }); + } + + var throwCORSError = function (url) { return __awaiter(void 0, void 0, void 0, function () { + return __generator(this, function (_a) { + return [2, Promise.reject(new Error([ + 'Embedded Dark Reader cannot access a cross-origin resource', + url, + 'Overview your URLs and CORS policies or use', + '`DarkReader.setFetchMethod(fetch: (url) => Promise))`.', + 'See if using `DarkReader.setFetchMethod(window.fetch)`', + 'before `DarkReader.enable()` works.' + ].join(' ')))]; + }); + }); }; + var fetcher = throwCORSError; + function setFetchMethod(fetch) { + if (fetch) { + fetcher = fetch; + } + else { + fetcher = throwCORSError; + } + } + function callFetchMethod(url) { + return __awaiter(this, void 0, void 0, function () { + return __generator(this, function (_a) { + switch (_a.label) { + case 0: return [4, fetcher(url)]; + case 1: return [2, _a.sent()]; + } + }); + }); + } + + if (!window.chrome) { + window.chrome = {}; + } + if (!chrome.runtime) { + chrome.runtime = {}; + } + var messageListeners = new Set(); + function sendMessage() { + var args = []; + for (var _i = 0; _i < arguments.length; _i++) { + args[_i] = arguments[_i]; + } + return __awaiter(this, void 0, void 0, function () { + var id_1, _a, url, responseType, response, text_1, error_1; + return __generator(this, function (_b) { + switch (_b.label) { + case 0: + if (!(args[0] && args[0].type === 'fetch')) return [3, 8]; + id_1 = args[0].id; + _b.label = 1; + case 1: + _b.trys.push([1, 7, , 8]); + _a = args[0].data, url = _a.url, responseType = _a.responseType; + return [4, callFetchMethod(url)]; + case 2: + response = _b.sent(); + if (!(responseType === 'data-url')) return [3, 4]; + return [4, readResponseAsDataURL(response)]; + case 3: + text_1 = _b.sent(); + return [3, 6]; + case 4: return [4, response.text()]; + case 5: + text_1 = _b.sent(); + _b.label = 6; + case 6: + messageListeners.forEach(function (cb) { return cb({ type: 'fetch-response', data: text_1, error: null, id: id_1 }); }); + return [3, 8]; + case 7: + error_1 = _b.sent(); + console.error(error_1); + messageListeners.forEach(function (cb) { return cb({ type: 'fetch-response', data: null, error: error_1, id: id_1 }); }); + return [3, 8]; + case 8: return [2]; + } + }); + }); + } + function addMessageListener(callback) { + messageListeners.add(callback); + } + if (typeof chrome.runtime.sendMessage === 'function') { + var nativeSendMessage_1 = chrome.runtime.sendMessage; + chrome.runtime.sendMessage = function () { + var args = []; + for (var _i = 0; _i < arguments.length; _i++) { + args[_i] = arguments[_i]; + } + sendMessage.apply(void 0, args); + nativeSendMessage_1.apply(chrome.runtime, args); + }; + } + else { + chrome.runtime.sendMessage = sendMessage; + } + if (!chrome.runtime.onMessage) { + chrome.runtime.onMessage = {}; + } + if (typeof chrome.runtime.onMessage.addListener === 'function') { + var nativeAddListener_1 = chrome.runtime.onMessage.addListener; + chrome.runtime.onMessage.addListener = function () { + var args = []; + for (var _i = 0; _i < arguments.length; _i++) { + args[_i] = arguments[_i]; + } + addMessageListener.apply(void 0, args); + nativeAddListener_1.apply(chrome.runtime.onMessage, args); + }; + } + else { + chrome.runtime.onMessage.addListener = addMessageListener; + } + + var ThemeEngines = { + cssFilter: 'cssFilter', + svgFilter: 'svgFilter', + staticTheme: 'staticTheme', + dynamicTheme: 'dynamicTheme', + }; + + function parseURL(url) { + var a = document.createElement('a'); + a.href = url; + return a; + } + function getAbsoluteURL($base, $relative) { + if ($relative.match(/^.*?\/\//) || $relative.match(/^data\:/)) { + if ($relative.startsWith('//')) { + return "" + location.protocol + $relative; + } + return $relative; + } + var b = parseURL($base); + if ($relative.startsWith('/')) { + var u_1 = parseURL(b.protocol + "//" + b.host + $relative); + return u_1.href; + } + var pathParts = b.pathname.split('/').concat($relative.split('/')).filter(function (p) { return p; }); + var backwardIndex; + while ((backwardIndex = pathParts.indexOf('..')) > 0) { + pathParts.splice(backwardIndex - 1, 2); + } + var u = parseURL(b.protocol + "//" + b.host + "/" + pathParts.join('/')); + return u.href; + } + + function logInfo() { + var args = []; + for (var _i = 0; _i < arguments.length; _i++) { + args[_i] = arguments[_i]; + } + } + function logWarn() { + var args = []; + for (var _i = 0; _i < arguments.length; _i++) { + args[_i] = arguments[_i]; + } + } + + function iterateCSSRules(rules, iterate) { + Array.from(rules) + .forEach(function (rule) { + if (rule instanceof CSSMediaRule) { + var media = Array.from(rule.media); + if (media.includes('screen') || media.includes('all') || !(media.includes('print') || media.includes('speech'))) { + iterateCSSRules(rule.cssRules, iterate); + } + } + else if (rule instanceof CSSStyleRule) { + iterate(rule); + } + else if (rule instanceof CSSImportRule) { + try { + iterateCSSRules(rule.styleSheet.cssRules, iterate); + } + catch (err) { + logWarn(err); + } + } + else { + logWarn("CSSRule type not supported", rule); + } + }); + } + function iterateCSSDeclarations(style, iterate) { + Array.from(style).forEach(function (property) { + var value = style.getPropertyValue(property).trim(); + if (!value) { + return; + } + iterate(property, value); + }); + } + function isCSSVariable(property) { + return property.startsWith('--') && !property.startsWith('--darkreader'); + } + function getCSSVariables(rules) { + var variables = new Map(); + rules && iterateCSSRules(rules, function (rule) { + rule.style && iterateCSSDeclarations(rule.style, function (property, value) { + if (isCSSVariable(property)) { + variables.set(property, value); + } + }); + }); + return variables; + } + function getElementCSSVariables(element) { + var variables = new Map(); + iterateCSSDeclarations(element.style, function (property, value) { + if (isCSSVariable(property)) { + variables.set(property, value); + } + }); + return variables; + } + var cssURLRegex = /url\((('.+?')|(".+?")|([^\)]*?))\)/g; + var cssImportRegex = /@import (url\()?(('.+?')|(".+?")|([^\)]*?))\)?;?/g; + function getCSSURLValue(cssURL) { + return cssURL.replace(/^url\((.*)\)$/, '$1').replace(/^"(.*)"$/, '$1').replace(/^'(.*)'$/, '$1'); + } + function getCSSBaseBath(url) { + var cssURL = parseURL(url); + return cssURL.protocol + "//" + cssURL.host + cssURL.pathname.replace(/\?.*$/, '').replace(/(\/)([^\/]+)$/i, '$1'); + } + function replaceCSSRelativeURLsWithAbsolute($css, cssBasePath) { + return $css.replace(cssURLRegex, function (match) { + var pathValue = getCSSURLValue(match); + return "url(\"" + getAbsoluteURL(cssBasePath, pathValue) + "\")"; + }); + } + var cssCommentsRegex = /\/\*[\s\S]*?\*\//g; + function removeCSSComments($css) { + return $css.replace(cssCommentsRegex, ''); + } + var fontFaceRegex = /@font-face\s*{[^}]*}/g; + function replaceCSSFontFace($css) { + return $css.replace(fontFaceRegex, ''); + } + var varRegex = /var\((--[^\s,]+),?\s*([^\(\)]*(\([^\(\)]*\)[^\(\)]*)*\s*)\)/g; + function replaceCSSVariables(value, variables) { + var missing = false; + var result = value.replace(varRegex, function (match, name, fallback) { + if (variables.has(name)) { + return variables.get(name); + } + else if (fallback) { + return fallback; + } + else { + logWarn("Variable " + name + " not found"); + missing = true; + } + return match; + }); + if (missing) { + return result; + } + if (result.match(varRegex)) { + return replaceCSSVariables(result, variables); + } + return result; + } + + function throttle(callback) { + var pending = false; + var frameId = null; + var lastArgs; + var throttled = (function () { + var args = []; + for (var _i = 0; _i < arguments.length; _i++) { + args[_i] = arguments[_i]; + } + lastArgs = args; + if (frameId) { + pending = true; + } + else { + callback.apply(void 0, lastArgs); + frameId = requestAnimationFrame(function () { + frameId = null; + if (pending) { + callback.apply(void 0, lastArgs); + pending = false; + } + }); + } + }); + var cancel = function () { + cancelAnimationFrame(frameId); + pending = false; + frameId = null; + }; + return Object.assign(throttled, { cancel: cancel }); + } + function createAsyncTasksQueue() { + var tasks = []; + var frameId = null; + function runTasks() { + var task; + while (task = tasks.shift()) { + task(); + } + frameId = null; + } + function add(task) { + tasks.push(task); + if (!frameId) { + frameId = requestAnimationFrame(runTasks); + } + } + function cancel() { + tasks.splice(0); + cancelAnimationFrame(frameId); + frameId = null; + } + return { add: add, cancel: cancel }; + } + + function getDuration(time) { + var duration = 0; + if (time.seconds) { + duration += time.seconds * 1000; + } + if (time.minutes) { + duration += time.minutes * 60 * 1000; + } + if (time.hours) { + duration += time.hours * 60 * 60 * 1000; + } + if (time.days) { + duration += time.days * 24 * 60 * 60 * 1000; + } + return duration; + } + + function removeNode(node) { + node && node.parentNode && node.parentNode.removeChild(node); + } + function watchForNodePosition(node, _a) { + var _b = _a.onRestore, onRestore = _b === void 0 ? Function.prototype : _b, _c = _a.watchParent, watchParent = _c === void 0 ? true : _c, _d = _a.watchSibling, watchSibling = _d === void 0 ? false : _d; + var MAX_ATTEMPTS_COUNT = 10; + var ATTEMPTS_INTERVAL = getDuration({ seconds: 10 }); + var prevSibling = node.previousSibling; + var parent = node.parentNode; + if (!parent) { + logWarn('Unable to watch for node position: parent element not found', node, prevSibling); + return { stop: Function.prototype }; + } + var attempts = 0; + var start = null; + var restore = throttle(function () { + attempts++; + var now = Date.now(); + if (start == null) { + start = now; + } + else if (attempts >= MAX_ATTEMPTS_COUNT) { + if (now - start < ATTEMPTS_INTERVAL) { + logWarn('Node position watcher stopped: some script conflicts with Dark Reader and can cause high CPU usage', node, prevSibling); + stop(); + return; + } + start = now; + attempts = 1; + } + if (prevSibling && prevSibling.parentNode !== parent) { + logWarn('Unable to restore node position: sibling was removed', node, prevSibling, parent); + stop(); + return; + } + logWarn('Node was removed, restoring it\'s position', node, prevSibling, parent); + parent.insertBefore(node, prevSibling ? prevSibling.nextSibling : parent.firstChild); + onRestore && onRestore(); + }); + var observer = new MutationObserver(function () { + if ((watchParent && !node.parentNode) || + (watchSibling && node.previousSibling !== prevSibling)) { + restore(); + observer.takeRecords(); + } + }); + var run = function () { + observer.observe(parent, { childList: true }); + }; + var stop = function () { + observer.disconnect(); + }; + run(); + return { run: run, stop: stop }; + } + function iterateShadowNodes(root, iterator) { + var walker = document.createTreeWalker(root, NodeFilter.SHOW_ELEMENT, { + acceptNode: function (node) { + return node.shadowRoot == null ? NodeFilter.FILTER_SKIP : NodeFilter.FILTER_ACCEPT; + } + }, false); + for (var node = (root.shadowRoot ? walker.currentNode : walker.nextNode()); node != null; node = walker.nextNode()) { + iterator(node); + iterateShadowNodes(node.shadowRoot, iterator); + } + } + + function hslToRGB(_a) { + var h = _a.h, s = _a.s, l = _a.l, _b = _a.a, a = _b === void 0 ? 1 : _b; + if (s === 0) { + var _c = [l, l, l].map(function (x) { return Math.round(x * 255); }), r_1 = _c[0], b_1 = _c[1], g_1 = _c[2]; + return { r: r_1, g: g_1, b: b_1, a: a }; + } + var c = (1 - Math.abs(2 * l - 1)) * s; + var x = c * (1 - Math.abs((h / 60) % 2 - 1)); + var m = l - c / 2; + var _d = (h < 60 ? [c, x, 0] : + h < 120 ? [x, c, 0] : + h < 180 ? [0, c, x] : + h < 240 ? [0, x, c] : + h < 300 ? [x, 0, c] : + [c, 0, x]).map(function (n) { return Math.round((n + m) * 255); }), r = _d[0], g = _d[1], b = _d[2]; + return { r: r, g: g, b: b, a: a }; + } + function rgbToHSL(_a) { + var r255 = _a.r, g255 = _a.g, b255 = _a.b, _b = _a.a, a = _b === void 0 ? 1 : _b; + var r = r255 / 255; + var g = g255 / 255; + var b = b255 / 255; + var max = Math.max(r, g, b); + var min = Math.min(r, g, b); + var c = max - min; + var l = (max + min) / 2; + if (c === 0) { + return { h: 0, s: 0, l: l, a: a }; + } + var h = (max === r ? (((g - b) / c) % 6) : + max === g ? ((b - r) / c + 2) : + ((r - g) / c + 4)) * 60; + if (h < 0) { + h += 360; + } + var s = c / (1 - Math.abs(2 * l - 1)); + return { h: h, s: s, l: l, a: a }; + } + function toFixed(n, digits) { + if (digits === void 0) { digits = 0; } + var fixed = n.toFixed(digits); + if (digits === 0) { + return fixed; + } + var dot = fixed.indexOf('.'); + if (dot >= 0) { + var zerosMatch = fixed.match(/0+$/); + if (zerosMatch) { + if (zerosMatch.index === dot + 1) { + return fixed.substring(0, dot); + } + return fixed.substring(0, zerosMatch.index); + } + } + return fixed; + } + function rgbToString(rgb) { + var r = rgb.r, g = rgb.g, b = rgb.b, a = rgb.a; + if (a != null && a < 1) { + return "rgba(" + toFixed(r) + ", " + toFixed(g) + ", " + toFixed(b) + ", " + toFixed(a, 2) + ")"; + } + return "rgb(" + toFixed(r) + ", " + toFixed(g) + ", " + toFixed(b) + ")"; + } + function rgbToHexString(_a) { + var r = _a.r, g = _a.g, b = _a.b, a = _a.a; + return "#" + (a != null && a < 1 ? [r, g, b, Math.round(a * 255)] : [r, g, b]).map(function (x) { + return "" + (x < 16 ? '0' : '') + x.toString(16); + }).join(''); + } + var rgbMatch = /^rgba?\([^\(\)]+\)$/; + var hslMatch = /^hsla?\([^\(\)]+\)$/; + var hexMatch = /^#[0-9a-f]+$/i; + function parse($color) { + var c = $color.trim().toLowerCase(); + if (c.match(rgbMatch)) { + return parseRGB(c); + } + if (c.match(hslMatch)) { + return parseHSL(c); + } + if (c.match(hexMatch)) { + return parseHex(c); + } + if (knownColors.has(c)) { + return getColorByName(c); + } + if (systemColors.has(c)) { + return getSystemColor(c); + } + if ($color === 'transparent') { + return { r: 0, g: 0, b: 0, a: 0 }; + } + throw new Error("Unable to parse " + $color); + } + function getNumbersFromString(str, splitter, range, units) { + var raw = str.split(splitter).filter(function (x) { return x; }); + var unitsList = Object.entries(units); + var numbers = raw.map(function (r) { return r.trim(); }).map(function (r, i) { + var n; + var unit = unitsList.find(function (_a) { + var u = _a[0]; + return r.endsWith(u); + }); + if (unit) { + n = parseFloat(r.substring(0, r.length - unit[0].length)) / unit[1] * range[i]; + } + else { + n = parseFloat(r); + } + if (range[i] > 1) { + return Math.round(n); + } + return n; + }); + return numbers; + } + var rgbSplitter = /rgba?|\(|\)|\/|,|\s/ig; + var rgbRange = [255, 255, 255, 1]; + var rgbUnits = { '%': 100 }; + function parseRGB($rgb) { + var _a = getNumbersFromString($rgb, rgbSplitter, rgbRange, rgbUnits), r = _a[0], g = _a[1], b = _a[2], _b = _a[3], a = _b === void 0 ? 1 : _b; + return { r: r, g: g, b: b, a: a }; + } + var hslSplitter = /hsla?|\(|\)|\/|,|\s/ig; + var hslRange = [360, 1, 1, 1]; + var hslUnits = { '%': 100, 'deg': 360, 'rad': 2 * Math.PI, 'turn': 1 }; + function parseHSL($hsl) { + var _a = getNumbersFromString($hsl, hslSplitter, hslRange, hslUnits), h = _a[0], s = _a[1], l = _a[2], _b = _a[3], a = _b === void 0 ? 1 : _b; + return hslToRGB({ h: h, s: s, l: l, a: a }); + } + function parseHex($hex) { + var h = $hex.substring(1); + switch (h.length) { + case 3: + case 4: { + var _a = [0, 1, 2].map(function (i) { return parseInt("" + h[i] + h[i], 16); }), r = _a[0], g = _a[1], b = _a[2]; + var a = h.length === 3 ? 1 : (parseInt("" + h[3] + h[3], 16) / 255); + return { r: r, g: g, b: b, a: a }; + } + case 6: + case 8: { + var _b = [0, 2, 4].map(function (i) { return parseInt(h.substring(i, i + 2), 16); }), r = _b[0], g = _b[1], b = _b[2]; + var a = h.length === 6 ? 1 : (parseInt(h.substring(6, 8), 16) / 255); + return { r: r, g: g, b: b, a: a }; + } + } + throw new Error("Unable to parse " + $hex); + } + function getColorByName($color) { + var n = knownColors.get($color); + return { + r: (n >> 16) & 255, + g: (n >> 8) & 255, + b: (n >> 0) & 255, + a: 1 + }; + } + function getSystemColor($color) { + var n = systemColors.get($color); + return { + r: (n >> 16) & 255, + g: (n >> 8) & 255, + b: (n >> 0) & 255, + a: 1 + }; + } + var knownColors = new Map(Object.entries({ + aliceblue: 0xf0f8ff, + antiquewhite: 0xfaebd7, + aqua: 0x00ffff, + aquamarine: 0x7fffd4, + azure: 0xf0ffff, + beige: 0xf5f5dc, + bisque: 0xffe4c4, + black: 0x000000, + blanchedalmond: 0xffebcd, + blue: 0x0000ff, + blueviolet: 0x8a2be2, + brown: 0xa52a2a, + burlywood: 0xdeb887, + cadetblue: 0x5f9ea0, + chartreuse: 0x7fff00, + chocolate: 0xd2691e, + coral: 0xff7f50, + cornflowerblue: 0x6495ed, + cornsilk: 0xfff8dc, + crimson: 0xdc143c, + cyan: 0x00ffff, + darkblue: 0x00008b, + darkcyan: 0x008b8b, + darkgoldenrod: 0xb8860b, + darkgray: 0xa9a9a9, + darkgrey: 0xa9a9a9, + darkgreen: 0x006400, + darkkhaki: 0xbdb76b, + darkmagenta: 0x8b008b, + darkolivegreen: 0x556b2f, + darkorange: 0xff8c00, + darkorchid: 0x9932cc, + darkred: 0x8b0000, + darksalmon: 0xe9967a, + darkseagreen: 0x8fbc8f, + darkslateblue: 0x483d8b, + darkslategray: 0x2f4f4f, + darkslategrey: 0x2f4f4f, + darkturquoise: 0x00ced1, + darkviolet: 0x9400d3, + deeppink: 0xff1493, + deepskyblue: 0x00bfff, + dimgray: 0x696969, + dimgrey: 0x696969, + dodgerblue: 0x1e90ff, + firebrick: 0xb22222, + floralwhite: 0xfffaf0, + forestgreen: 0x228b22, + fuchsia: 0xff00ff, + gainsboro: 0xdcdcdc, + ghostwhite: 0xf8f8ff, + gold: 0xffd700, + goldenrod: 0xdaa520, + gray: 0x808080, + grey: 0x808080, + green: 0x008000, + greenyellow: 0xadff2f, + honeydew: 0xf0fff0, + hotpink: 0xff69b4, + indianred: 0xcd5c5c, + indigo: 0x4b0082, + ivory: 0xfffff0, + khaki: 0xf0e68c, + lavender: 0xe6e6fa, + lavenderblush: 0xfff0f5, + lawngreen: 0x7cfc00, + lemonchiffon: 0xfffacd, + lightblue: 0xadd8e6, + lightcoral: 0xf08080, + lightcyan: 0xe0ffff, + lightgoldenrodyellow: 0xfafad2, + lightgray: 0xd3d3d3, + lightgrey: 0xd3d3d3, + lightgreen: 0x90ee90, + lightpink: 0xffb6c1, + lightsalmon: 0xffa07a, + lightseagreen: 0x20b2aa, + lightskyblue: 0x87cefa, + lightslategray: 0x778899, + lightslategrey: 0x778899, + lightsteelblue: 0xb0c4de, + lightyellow: 0xffffe0, + lime: 0x00ff00, + limegreen: 0x32cd32, + linen: 0xfaf0e6, + magenta: 0xff00ff, + maroon: 0x800000, + mediumaquamarine: 0x66cdaa, + mediumblue: 0x0000cd, + mediumorchid: 0xba55d3, + mediumpurple: 0x9370db, + mediumseagreen: 0x3cb371, + mediumslateblue: 0x7b68ee, + mediumspringgreen: 0x00fa9a, + mediumturquoise: 0x48d1cc, + mediumvioletred: 0xc71585, + midnightblue: 0x191970, + mintcream: 0xf5fffa, + mistyrose: 0xffe4e1, + moccasin: 0xffe4b5, + navajowhite: 0xffdead, + navy: 0x000080, + oldlace: 0xfdf5e6, + olive: 0x808000, + olivedrab: 0x6b8e23, + orange: 0xffa500, + orangered: 0xff4500, + orchid: 0xda70d6, + palegoldenrod: 0xeee8aa, + palegreen: 0x98fb98, + paleturquoise: 0xafeeee, + palevioletred: 0xdb7093, + papayawhip: 0xffefd5, + peachpuff: 0xffdab9, + peru: 0xcd853f, + pink: 0xffc0cb, + plum: 0xdda0dd, + powderblue: 0xb0e0e6, + purple: 0x800080, + rebeccapurple: 0x663399, + red: 0xff0000, + rosybrown: 0xbc8f8f, + royalblue: 0x4169e1, + saddlebrown: 0x8b4513, + salmon: 0xfa8072, + sandybrown: 0xf4a460, + seagreen: 0x2e8b57, + seashell: 0xfff5ee, + sienna: 0xa0522d, + silver: 0xc0c0c0, + skyblue: 0x87ceeb, + slateblue: 0x6a5acd, + slategray: 0x708090, + slategrey: 0x708090, + snow: 0xfffafa, + springgreen: 0x00ff7f, + steelblue: 0x4682b4, + tan: 0xd2b48c, + teal: 0x008080, + thistle: 0xd8bfd8, + tomato: 0xff6347, + turquoise: 0x40e0d0, + violet: 0xee82ee, + wheat: 0xf5deb3, + white: 0xffffff, + whitesmoke: 0xf5f5f5, + yellow: 0xffff00, + yellowgreen: 0x9acd32, + })); + var systemColors = new Map(Object.entries({ + ActiveBorder: 0x3b99fc, + ActiveCaption: 0x000000, + AppWorkspace: 0xaaaaaa, + Background: 0x6363ce, + ButtonFace: 0xffffff, + ButtonHighlight: 0xe9e9e9, + ButtonShadow: 0x9fa09f, + ButtonText: 0x000000, + CaptionText: 0x000000, + GrayText: 0x7f7f7f, + Highlight: 0xb2d7ff, + HighlightText: 0x000000, + InactiveBorder: 0xffffff, + InactiveCaption: 0xffffff, + InactiveCaptionText: 0x000000, + InfoBackground: 0xfbfcc5, + InfoText: 0x000000, + Menu: 0xf6f6f6, + MenuText: 0xffffff, + Scrollbar: 0xaaaaaa, + ThreeDDarkShadow: 0x000000, + ThreeDFace: 0xc0c0c0, + ThreeDHighlight: 0xffffff, + ThreeDLightShadow: 0xffffff, + ThreeDShadow: 0x000000, + Window: 0xececec, + WindowFrame: 0xaaaaaa, + WindowText: 0x000000, + '-webkit-focus-ring-color': 0xe59700 + }).map(function (_a) { + var key = _a[0], value = _a[1]; + return [key.toLowerCase(), value]; + })); + + function scale(x, inLow, inHigh, outLow, outHigh) { + return (x - inLow) * (outHigh - outLow) / (inHigh - inLow) + outLow; + } + function clamp(x, min, max) { + return Math.min(max, Math.max(min, x)); + } + function multiplyMatrices(m1, m2) { + var result = []; + for (var i = 0; i < m1.length; i++) { + result[i] = []; + for (var j = 0; j < m2[0].length; j++) { + var sum = 0; + for (var k = 0; k < m1[0].length; k++) { + sum += m1[i][k] * m2[k][j]; + } + result[i][j] = sum; + } + } + return result; + } + + function getMatches(regex, input, group) { + if (group === void 0) { group = 0; } + var matches = []; + var m; + while (m = regex.exec(input)) { + matches.push(m[group]); + } + return matches; + } + + function createFilterMatrix(config) { + var m = Matrix.identity(); + if (config.sepia !== 0) { + m = multiplyMatrices(m, Matrix.sepia(config.sepia / 100)); + } + if (config.grayscale !== 0) { + m = multiplyMatrices(m, Matrix.grayscale(config.grayscale / 100)); + } + if (config.contrast !== 100) { + m = multiplyMatrices(m, Matrix.contrast(config.contrast / 100)); + } + if (config.brightness !== 100) { + m = multiplyMatrices(m, Matrix.brightness(config.brightness / 100)); + } + if (config.mode === 1) { + m = multiplyMatrices(m, Matrix.invertNHue()); + } + return m; + } + function applyColorMatrix(_a, matrix) { + var r = _a[0], g = _a[1], b = _a[2]; + var rgb = [[r / 255], [g / 255], [b / 255], [1], [1]]; + var result = multiplyMatrices(matrix, rgb); + return [0, 1, 2].map(function (i) { return clamp(Math.round(result[i][0] * 255), 0, 255); }); + } + var Matrix = { + identity: function () { + return [ + [1, 0, 0, 0, 0], + [0, 1, 0, 0, 0], + [0, 0, 1, 0, 0], + [0, 0, 0, 1, 0], + [0, 0, 0, 0, 1] + ]; + }, + invertNHue: function () { + return [ + [0.333, -0.667, -0.667, 0, 1], + [-0.667, 0.333, -0.667, 0, 1], + [-0.667, -0.667, 0.333, 0, 1], + [0, 0, 0, 1, 0], + [0, 0, 0, 0, 1] + ]; + }, + brightness: function (v) { + return [ + [v, 0, 0, 0, 0], + [0, v, 0, 0, 0], + [0, 0, v, 0, 0], + [0, 0, 0, 1, 0], + [0, 0, 0, 0, 1] + ]; + }, + contrast: function (v) { + var t = (1 - v) / 2; + return [ + [v, 0, 0, 0, t], + [0, v, 0, 0, t], + [0, 0, v, 0, t], + [0, 0, 0, 1, 0], + [0, 0, 0, 0, 1] + ]; + }, + sepia: function (v) { + return [ + [(0.393 + 0.607 * (1 - v)), (0.769 - 0.769 * (1 - v)), (0.189 - 0.189 * (1 - v)), 0, 0], + [(0.349 - 0.349 * (1 - v)), (0.686 + 0.314 * (1 - v)), (0.168 - 0.168 * (1 - v)), 0, 0], + [(0.272 - 0.272 * (1 - v)), (0.534 - 0.534 * (1 - v)), (0.131 + 0.869 * (1 - v)), 0, 0], + [0, 0, 0, 1, 0], + [0, 0, 0, 0, 1] + ]; + }, + grayscale: function (v) { + return [ + [(0.2126 + 0.7874 * (1 - v)), (0.7152 - 0.7152 * (1 - v)), (0.0722 - 0.0722 * (1 - v)), 0, 0], + [(0.2126 - 0.2126 * (1 - v)), (0.7152 + 0.2848 * (1 - v)), (0.0722 - 0.0722 * (1 - v)), 0, 0], + [(0.2126 - 0.2126 * (1 - v)), (0.7152 - 0.7152 * (1 - v)), (0.0722 + 0.9278 * (1 - v)), 0, 0], + [0, 0, 0, 1, 0], + [0, 0, 0, 0, 1] + ]; + }, + }; + + var colorModificationCache = new Map(); + function clearColorModificationCache() { + colorModificationCache.clear(); + } + function modifyColorWithCache(rgb, filter, modifyHSL) { + var fnCache; + if (colorModificationCache.has(modifyHSL)) { + fnCache = colorModificationCache.get(modifyHSL); + } + else { + fnCache = new Map(); + colorModificationCache.set(modifyHSL, fnCache); + } + var id = Object.entries(rgb) + .concat(Object.entries(filter).filter(function (_a) { + var key = _a[0]; + return ['mode', 'brightness', 'contrast', 'grayscale', 'sepia'].indexOf(key) >= 0; + })) + .map(function (_a) { + var key = _a[0], value = _a[1]; + return key + ":" + value; + }) + .join(';'); + if (fnCache.has(id)) { + return fnCache.get(id); + } + var hsl = rgbToHSL(rgb); + var modified = modifyHSL(hsl); + var _a = hslToRGB(modified), r = _a.r, g = _a.g, b = _a.b, a = _a.a; + var matrix = createFilterMatrix(filter); + var _b = applyColorMatrix([r, g, b], matrix), rf = _b[0], gf = _b[1], bf = _b[2]; + var color = (a === 1 ? + rgbToHexString({ r: rf, g: gf, b: bf }) : + rgbToString({ r: rf, g: gf, b: bf, a: a })); + fnCache.set(id, color); + return color; + } + function noopHSL(hsl) { + return hsl; + } + function modifyColor(rgb, theme) { + return modifyColorWithCache(rgb, theme, noopHSL); + } + function modifyLightModeHSL(_a) { + var h = _a.h, s = _a.s, l = _a.l, a = _a.a; + var lMin = 0; + var lMid = 0.4; + var lMax = 0.9; + var sNeutralLim = 0.36; + var lNeutralDark = 0.2; + var lNeutralLight = 0.8; + var sColored = 0.16; + var hColoredL0 = 205; + var hColoredL1 = 40; + var lx = scale(l, 0, 1, lMin, lMax); + var hx = h; + var sx = s; + var isNeutral = l < lNeutralDark || l > lNeutralLight || s < sNeutralLim; + if (isNeutral) { + sx = (l < lMid ? + scale(l, 0, lMid, sColored, 0) : + scale(l, lMid, 1, 0, sColored)); + hx = (l < lMid ? hColoredL0 : hColoredL1); + } + return { h: hx, s: sx, l: lx, a: a }; + } + function modifyBgHSL(_a) { + var h = _a.h, s = _a.s, l = _a.l, a = _a.a; + var lMin = 0.1; + var lMaxS0 = 0.25; + var lMaxS1 = 0.4; + var sNeutralLim = 0.12; + var lNeutralLight = 0.8; + var sColored = 0.05; + var hColored = 205; + var hBlue0 = 200; + var hBlue1 = 280; + var lMax = scale(s, 0, 1, lMaxS0, lMaxS1); + var lx = (l < lMax ? + l : + l < 0.5 ? + lMax : + scale(l, 0.5, 1, lMax, lMin)); + var isNeutral = (l >= lNeutralLight && h > hBlue0 && h < hBlue1) || s < sNeutralLim; + var hx = h; + var sx = s; + if (isNeutral) { + sx = sColored; + hx = hColored; + } + return { h: hx, s: sx, l: lx, a: a }; + } + function modifyBackgroundColor(rgb, filter) { + if (filter.mode === 0) { + return modifyColorWithCache(rgb, filter, modifyLightModeHSL); + } + return modifyColorWithCache(rgb, __assign(__assign({}, filter), { mode: 0 }), modifyBgHSL); + } + function modifyFgHSL(_a) { + var h = _a.h, s = _a.s, l = _a.l, a = _a.a; + var lMax = 0.9; + var lMinS0 = 0.7; + var lMinS1 = 0.6; + var sNeutralLim = 0.24; + var lNeutralDark = 0.2; + var sColored = 0.10; + var hColored = 40; + var hBlue0 = 205; + var hBlue1 = 245; + var hBlueMax = 220; + var lBlueMin = 0.7; + var isBlue = h > hBlue0 && h <= hBlue1; + var lMin = scale(s, 0, 1, isBlue ? scale(h, hBlue0, hBlue1, lMinS0, lBlueMin) : lMinS0, lMinS1); + var lx = (l < 0.5 ? + scale(l, 0, 0.5, lMax, lMin) : + l < lMin ? + lMin : + l); + var hx = h; + var sx = s; + if (isBlue) { + hx = scale(hx, hBlue0, hBlue1, hBlue0, hBlueMax); + } + var isNeutral = l < lNeutralDark || s < sNeutralLim; + if (isNeutral) { + sx = sColored; + hx = hColored; + } + return { h: hx, s: sx, l: lx, a: a }; + } + function modifyForegroundColor(rgb, filter) { + if (filter.mode === 0) { + return modifyColorWithCache(rgb, filter, modifyLightModeHSL); + } + return modifyColorWithCache(rgb, __assign(__assign({}, filter), { mode: 0 }), modifyFgHSL); + } + function modifyBorderHSL(_a) { + var h = _a.h, s = _a.s, l = _a.l, a = _a.a; + var lMinS0 = 0.2; + var lMinS1 = 0.3; + var lMaxS0 = 0.4; + var lMaxS1 = 0.5; + var lMin = scale(s, 0, 1, lMinS0, lMinS1); + var lMax = scale(s, 0, 1, lMaxS0, lMaxS1); + var lx = scale(l, 0, 1, lMax, lMin); + return { h: h, s: s, l: lx, a: a }; + } + function modifyBorderColor(rgb, filter) { + if (filter.mode === 0) { + return modifyColorWithCache(rgb, filter, modifyLightModeHSL); + } + return modifyColorWithCache(rgb, __assign(__assign({}, filter), { mode: 0 }), modifyBorderHSL); + } + function modifyShadowColor(rgb, filter) { + return modifyBackgroundColor(rgb, filter); + } + function modifyGradientColor(rgb, filter) { + return modifyBackgroundColor(rgb, filter); + } + + function getURLHost(url) { + return url.match(/^(.*?\/{2,3})?(.+?)(\/|$)/)[2]; + } + + function createTextStyle(config) { + var lines = []; + lines.push('* {'); + if (config.useFont && config.fontFamily) { + lines.push(" font-family: " + config.fontFamily + " !important;"); + } + if (config.textStroke > 0) { + lines.push(" -webkit-text-stroke: " + config.textStroke + "px !important;"); + lines.push(" text-stroke: " + config.textStroke + "px !important;"); + } + lines.push('}'); + return lines.join('\n'); + } + + var FilterMode; + (function (FilterMode) { + FilterMode[FilterMode["light"] = 0] = "light"; + FilterMode[FilterMode["dark"] = 1] = "dark"; + })(FilterMode || (FilterMode = {})); + function getCSSFilterValue(config) { + var filters = []; + if (config.mode === FilterMode.dark) { + filters.push('invert(100%) hue-rotate(180deg)'); + } + if (config.brightness !== 100) { + filters.push("brightness(" + config.brightness + "%)"); + } + if (config.contrast !== 100) { + filters.push("contrast(" + config.contrast + "%)"); + } + if (config.grayscale !== 0) { + filters.push("grayscale(" + config.grayscale + "%)"); + } + if (config.sepia !== 0) { + filters.push("sepia(" + config.sepia + "%)"); + } + if (filters.length === 0) { + return null; + } + return filters.join(' '); + } + + function toSVGMatrix(matrix) { + return matrix.slice(0, 4).map(function (m) { return m.map(function (m) { return m.toFixed(3); }).join(' '); }).join(' '); + } + function getSVGFilterMatrixValue(config) { + return toSVGMatrix(createFilterMatrix(config)); + } + + var counter = 0; + var resolvers = new Map(); + var rejectors = new Map(); + function bgFetch(request) { + return new Promise(function (resolve, reject) { + var id = ++counter; + resolvers.set(id, resolve); + rejectors.set(id, reject); + chrome.runtime.sendMessage({ type: 'fetch', data: request, id: id }); + }); + } + chrome.runtime.onMessage.addListener(function (_a) { + var type = _a.type, data = _a.data, error = _a.error, id = _a.id; + if (type === 'fetch-response') { + var resolve = resolvers.get(id); + var reject = rejectors.get(id); + resolvers.delete(id); + rejectors.delete(id); + if (error) { + reject && reject(error); + } + else { + resolve && resolve(data); + } + } + }); + + function getImageDetails(url) { + return __awaiter(this, void 0, void 0, function () { + var dataURL, image, info; + return __generator(this, function (_a) { + switch (_a.label) { + case 0: + if (!url.startsWith('data:')) return [3, 1]; + dataURL = url; + return [3, 3]; + case 1: return [4, getImageDataURL(url)]; + case 2: + dataURL = _a.sent(); + _a.label = 3; + case 3: return [4, urlToImage(dataURL)]; + case 4: + image = _a.sent(); + info = analyzeImage(image); + return [2, __assign({ src: url, dataURL: dataURL, width: image.naturalWidth, height: image.naturalHeight }, info)]; + } + }); + }); + } + function getImageDataURL(url) { + return __awaiter(this, void 0, void 0, function () { + return __generator(this, function (_a) { + switch (_a.label) { + case 0: + if (!(getURLHost(url) === location.host)) return [3, 2]; + return [4, loadAsDataURL(url)]; + case 1: return [2, _a.sent()]; + case 2: return [4, bgFetch({ url: url, responseType: 'data-url' })]; + case 3: return [2, _a.sent()]; + } + }); + }); + } + function urlToImage(url) { + return __awaiter(this, void 0, void 0, function () { + return __generator(this, function (_a) { + return [2, new Promise(function (resolve, reject) { + var image = new Image(); + image.onload = function () { return resolve(image); }; + image.onerror = function () { return reject("Unable to load image " + url); }; + image.src = url; + })]; + }); + }); + } + function analyzeImage(image) { + var MAX_ANALIZE_PIXELS_COUNT = 32 * 32; + var naturalPixelsCount = image.naturalWidth * image.naturalHeight; + var k = Math.min(1, Math.sqrt(MAX_ANALIZE_PIXELS_COUNT / naturalPixelsCount)); + var width = Math.max(1, Math.round(image.naturalWidth * k)); + var height = Math.max(1, Math.round(image.naturalHeight * k)); + var canvas = document.createElement('canvas'); + canvas.width = width; + canvas.height = height; + var context = canvas.getContext('2d'); + context.imageSmoothingEnabled = false; + context.drawImage(image, 0, 0, width, height); + var imageData = context.getImageData(0, 0, width, height); + var d = imageData.data; + var TRANSPARENT_ALPHA_THRESHOLD = 0.05; + var DARK_LIGHTNESS_THRESHOLD = 0.4; + var LIGHT_LIGHTNESS_THRESHOLD = 0.7; + var transparentPixelsCount = 0; + var darkPixelsCount = 0; + var lightPixelsCount = 0; + var i, x, y; + var r, g, b, a; + var l, min, max; + for (y = 0; y < height; y++) { + for (x = 0; x < width; x++) { + i = 4 * (y * width + x); + r = d[i + 0] / 255; + g = d[i + 1] / 255; + b = d[i + 2] / 255; + a = d[i + 3] / 255; + if (a < TRANSPARENT_ALPHA_THRESHOLD) { + transparentPixelsCount++; + } + else { + min = Math.min(r, g, b); + max = Math.max(r, g, b); + l = (max + min) / 2; + if (l < DARK_LIGHTNESS_THRESHOLD) { + darkPixelsCount++; + } + if (l > LIGHT_LIGHTNESS_THRESHOLD) { + lightPixelsCount++; + } + } + } + } + var totalPixelsCount = width * height; + var opaquePixelsCount = totalPixelsCount - transparentPixelsCount; + var DARK_IMAGE_THRESHOLD = 0.7; + var LIGHT_IMAGE_THRESHOLD = 0.7; + var TRANSPARENT_IMAGE_THRESHOLD = 0.1; + var LARGE_IMAGE_PIXELS_COUNT = 800 * 600; + return { + isDark: ((darkPixelsCount / opaquePixelsCount) >= DARK_IMAGE_THRESHOLD), + isLight: ((lightPixelsCount / opaquePixelsCount) >= LIGHT_IMAGE_THRESHOLD), + isTransparent: ((transparentPixelsCount / totalPixelsCount) >= TRANSPARENT_IMAGE_THRESHOLD), + isLarge: (naturalPixelsCount >= LARGE_IMAGE_PIXELS_COUNT), + }; + } + function getFilteredImageDataURL(_a, filter) { + var dataURL = _a.dataURL, width = _a.width, height = _a.height; + var matrix = getSVGFilterMatrixValue(filter); + var svg = [ + "", + '', + '', + "", + '', + '', + "", + '', + ].join(''); + var bytes = new Uint8Array(svg.length); + for (var i = 0; i < svg.length; i++) { + bytes[i] = svg.charCodeAt(i); + } + var blob = new Blob([bytes], { type: 'image/svg+xml' }); + var objectURL = URL.createObjectURL(blob); + return objectURL; + } + + function getModifiableCSSDeclaration(property, value, rule, isCancelled) { + var important = Boolean(rule && rule.style && rule.style.getPropertyPriority(property)); + var sourceValue = value; + if (property.startsWith('--')) { + return null; + } + else if ((property.indexOf('color') >= 0 && property !== '-webkit-print-color-adjust') || + property === 'fill' || + property === 'stroke') { + var modifier = getColorModifier(property, value); + if (modifier) { + return { property: property, value: modifier, important: important, sourceValue: sourceValue }; + } + } + else if (property === 'background-image') { + var modifier = getBgImageModifier(property, value, rule, isCancelled); + if (modifier) { + return { property: property, value: modifier, important: important, sourceValue: sourceValue }; + } + } + else if (property.indexOf('shadow') >= 0) { + var modifier = getShadowModifier(property, value); + if (modifier) { + return { property: property, value: modifier, important: important, sourceValue: sourceValue }; + } + } + return null; + } + function getModifiedUserAgentStyle(filter, isIFrame) { + var lines = []; + if (!isIFrame) { + lines.push('html {'); + lines.push(" background-color: " + modifyBackgroundColor({ r: 255, g: 255, b: 255 }, filter) + " !important;"); + lines.push('}'); + } + lines.push((isIFrame ? '' : 'html, body, ') + "input, textarea, select, button {"); + lines.push(" background-color: " + modifyBackgroundColor({ r: 255, g: 255, b: 255 }, filter) + ";"); + lines.push('}'); + lines.push('html, body, input, textarea, select, button {'); + lines.push(" border-color: " + modifyBorderColor({ r: 76, g: 76, b: 76 }, filter) + ";"); + lines.push(" color: " + modifyForegroundColor({ r: 0, g: 0, b: 0 }, filter) + ";"); + lines.push('}'); + lines.push('a {'); + lines.push(" color: " + modifyForegroundColor({ r: 0, g: 64, b: 255 }, filter) + ";"); + lines.push('}'); + lines.push('table {'); + lines.push(" border-color: " + modifyBorderColor({ r: 128, g: 128, b: 128 }, filter) + ";"); + lines.push('}'); + lines.push('::placeholder {'); + lines.push(" color: " + modifyForegroundColor({ r: 169, g: 169, b: 169 }, filter) + ";"); + lines.push('}'); + ['::selection', '::-moz-selection'].forEach(function (selection) { + lines.push(selection + " {"); + lines.push(" background-color: " + modifyBackgroundColor({ r: 0, g: 96, b: 212 }, filter) + ";"); + lines.push(" color: " + modifyForegroundColor({ r: 255, g: 255, b: 255 }, filter) + ";"); + lines.push('}'); + }); + lines.push('input:-webkit-autofill,'); + lines.push('textarea:-webkit-autofill,'); + lines.push('select:-webkit-autofill {'); + lines.push(" background-color: " + modifyBackgroundColor({ r: 250, g: 255, b: 189 }, filter) + " !important;"); + lines.push(" color: " + modifyForegroundColor({ r: 0, g: 0, b: 0 }, filter) + " !important;"); + lines.push('}'); + if (!isMacOS()) { + lines.push('::-webkit-scrollbar {'); + lines.push(" background-color: " + modifyBackgroundColor({ r: 241, g: 241, b: 241 }, filter) + ";"); + lines.push(" color: " + modifyForegroundColor({ r: 96, g: 96, b: 96 }, filter) + ";"); + lines.push('}'); + lines.push('::-webkit-scrollbar-thumb {'); + lines.push(" background-color: " + modifyBackgroundColor({ r: 193, g: 193, b: 193 }, filter) + ";"); + lines.push('}'); + lines.push('::-webkit-scrollbar-thumb:hover {'); + lines.push(" background-color: " + modifyBackgroundColor({ r: 166, g: 166, b: 166 }, filter) + ";"); + lines.push('}'); + lines.push('::-webkit-scrollbar-thumb:active {'); + lines.push(" background-color: " + modifyBackgroundColor({ r: 96, g: 96, b: 96 }, filter) + ";"); + lines.push('}'); + lines.push('::-webkit-scrollbar-corner {'); + lines.push(" background-color: " + modifyBackgroundColor({ r: 255, g: 255, b: 255 }, filter) + ";"); + lines.push('}'); + lines.push('* {'); + lines.push(" scrollbar-color: " + modifyBackgroundColor({ r: 193, g: 193, b: 193 }, filter) + " " + modifyBackgroundColor({ r: 241, g: 241, b: 241 }, filter) + ";"); + lines.push('}'); + } + return lines.join('\n'); + } + function getModifiedFallbackStyle(filter, _a) { + var strict = _a.strict; + var lines = []; + lines.push("html, body, " + (strict ? 'body *' : 'body > *') + " {"); + lines.push(" background-color: " + modifyBackgroundColor({ r: 255, g: 255, b: 255 }, filter) + " !important;"); + lines.push(" border-color: " + modifyBorderColor({ r: 64, g: 64, b: 64 }, filter) + " !important;"); + lines.push(" color: " + modifyForegroundColor({ r: 0, g: 0, b: 0 }, filter) + " !important;"); + lines.push('}'); + return lines.join('\n'); + } + var unparsableColors = new Set([ + 'inherit', + 'transparent', + 'initial', + 'currentcolor', + 'none', + ]); + var colorParseCache = new Map(); + function parseColorWithCache($color) { + $color = $color.trim(); + if (colorParseCache.has($color)) { + return colorParseCache.get($color); + } + var color = parse($color); + colorParseCache.set($color, color); + return color; + } + function tryParseColor($color) { + try { + return parseColorWithCache($color); + } + catch (err) { + return null; + } + } + function getColorModifier(prop, value) { + if (unparsableColors.has(value.toLowerCase())) { + return value; + } + try { + var rgb_1 = parseColorWithCache(value); + if (prop.indexOf('background') >= 0) { + return function (filter) { return modifyBackgroundColor(rgb_1, filter); }; + } + if (prop.indexOf('border') >= 0 || prop.indexOf('outline') >= 0) { + return function (filter) { return modifyBorderColor(rgb_1, filter); }; + } + return function (filter) { return modifyForegroundColor(rgb_1, filter); }; + } + catch (err) { + logWarn('Color parse error', err); + return null; + } + } + var gradientRegex = /[\-a-z]+gradient\(([^\(\)]*(\(([^\(\)]*(\(.*?\)))*[^\(\)]*\))){0,15}[^\(\)]*\)/g; + var imageDetailsCache = new Map(); + var awaitingForImageLoading = new Map(); + function getBgImageModifier(prop, value, rule, isCancelled) { + var _this = this; + try { + var gradients = getMatches(gradientRegex, value); + var urls = getMatches(cssURLRegex, value); + if (urls.length === 0 && gradients.length === 0) { + return value; + } + var getIndices = function (matches) { + var index = 0; + return matches.map(function (match) { + var valueIndex = value.indexOf(match, index); + index = valueIndex + match.length; + return { match: match, index: valueIndex }; + }); + }; + var matches_1 = getIndices(urls).map(function (i) { return (__assign({ type: 'url' }, i)); }) + .concat(getIndices(gradients).map(function (i) { return (__assign({ type: 'gradient' }, i)); })) + .sort(function (a, b) { return a.index - b.index; }); + var getGradientModifier_1 = function (gradient) { + var match = gradient.match(/^(.*-gradient)\((.*)\)$/); + var type = match[1]; + var content = match[2]; + var partsRegex = /([^\(\),]+(\([^\(\)]*(\([^\(\)]*\)*[^\(\)]*)?\))?[^\(\),]*),?/g; + var colorStopRegex = /^(from|color-stop|to)\(([^\(\)]*?,\s*)?(.*?)\)$/; + var parts = getMatches(partsRegex, content, 1).map(function (part) { + part = part.trim(); + var rgb = tryParseColor(part); + if (rgb) { + return function (filter) { return modifyGradientColor(rgb, filter); }; + } + var space = part.lastIndexOf(' '); + rgb = tryParseColor(part.substring(0, space)); + if (rgb) { + return function (filter) { return modifyGradientColor(rgb, filter) + " " + part.substring(space + 1); }; + } + var colorStopMatch = part.match(colorStopRegex); + if (colorStopMatch) { + rgb = tryParseColor(colorStopMatch[3]); + if (rgb) { + return function (filter) { return colorStopMatch[1] + "(" + (colorStopMatch[2] ? colorStopMatch[2] + ", " : '') + modifyGradientColor(rgb, filter) + ")"; }; + } + } + return function () { return part; }; + }); + return function (filter) { + return type + "(" + parts.map(function (modify) { return modify(filter); }).join(', ') + ")"; + }; + }; + var getURLModifier_1 = function (urlValue) { + var url = getCSSURLValue(urlValue); + if (rule.parentStyleSheet.href) { + var basePath = getCSSBaseBath(rule.parentStyleSheet.href); + url = getAbsoluteURL(basePath, url); + } + else if (rule.parentStyleSheet.ownerNode && rule.parentStyleSheet.ownerNode.baseURI) { + url = getAbsoluteURL(rule.parentStyleSheet.ownerNode.baseURI, url); + } + else { + url = getAbsoluteURL(location.origin, url); + } + var absoluteValue = "url(\"" + url + "\")"; + return function (filter) { return __awaiter(_this, void 0, void 0, function () { + var imageDetails, awaiters_1, err_1, bgImageValue; + return __generator(this, function (_a) { + switch (_a.label) { + case 0: + if (!imageDetailsCache.has(url)) return [3, 1]; + imageDetails = imageDetailsCache.get(url); + return [3, 7]; + case 1: + _a.trys.push([1, 6, , 7]); + if (!awaitingForImageLoading.has(url)) return [3, 3]; + awaiters_1 = awaitingForImageLoading.get(url); + return [4, new Promise(function (resolve) { return awaiters_1.push(resolve); })]; + case 2: + imageDetails = _a.sent(); + if (!imageDetails) { + return [2, null]; + } + return [3, 5]; + case 3: + awaitingForImageLoading.set(url, []); + return [4, getImageDetails(url)]; + case 4: + imageDetails = _a.sent(); + imageDetailsCache.set(url, imageDetails); + awaitingForImageLoading.get(url).forEach(function (resolve) { return resolve(imageDetails); }); + awaitingForImageLoading.delete(url); + _a.label = 5; + case 5: + if (isCancelled()) { + return [2, null]; + } + return [3, 7]; + case 6: + err_1 = _a.sent(); + logWarn(err_1); + if (awaitingForImageLoading.has(url)) { + awaitingForImageLoading.get(url).forEach(function (resolve) { return resolve(null); }); + awaitingForImageLoading.delete(url); + } + return [2, absoluteValue]; + case 7: + bgImageValue = getBgImageValue_1(imageDetails, filter) || absoluteValue; + return [2, bgImageValue]; + } + }); + }); }; + }; + var getBgImageValue_1 = function (imageDetails, filter) { + var isDark = imageDetails.isDark, isLight = imageDetails.isLight, isTransparent = imageDetails.isTransparent, isLarge = imageDetails.isLarge, width = imageDetails.width; + var result; + if (isDark && isTransparent && filter.mode === 1 && !isLarge && width > 2) { + logInfo("Inverting dark image " + imageDetails.src); + var inverted = getFilteredImageDataURL(imageDetails, __assign(__assign({}, filter), { sepia: clamp(filter.sepia + 10, 0, 100) })); + result = "url(\"" + inverted + "\")"; + } + else if (isLight && !isTransparent && filter.mode === 1) { + if (isLarge) { + result = 'none'; + } + else { + logInfo("Dimming light image " + imageDetails.src); + var dimmed = getFilteredImageDataURL(imageDetails, filter); + result = "url(\"" + dimmed + "\")"; + } + } + else if (filter.mode === 0 && isLight && !isLarge) { + logInfo("Applying filter to image " + imageDetails.src); + var filtered = getFilteredImageDataURL(imageDetails, __assign(__assign({}, filter), { brightness: clamp(filter.brightness - 10, 5, 200), sepia: clamp(filter.sepia + 10, 0, 100) })); + result = "url(\"" + filtered + "\")"; + } + else { + result = null; + } + return result; + }; + var modifiers_1 = []; + var index_1 = 0; + matches_1.forEach(function (_a, i) { + var match = _a.match, type = _a.type, matchStart = _a.index; + var prefixStart = index_1; + var matchEnd = matchStart + match.length; + index_1 = matchEnd; + modifiers_1.push(function () { return value.substring(prefixStart, matchStart); }); + modifiers_1.push(type === 'url' ? getURLModifier_1(match) : getGradientModifier_1(match)); + if (i === matches_1.length - 1) { + modifiers_1.push(function () { return value.substring(matchEnd); }); + } + }); + return function (filter) { + var results = modifiers_1.map(function (modify) { return modify(filter); }); + if (results.some(function (r) { return r instanceof Promise; })) { + return Promise.all(results) + .then(function (asyncResults) { + return asyncResults.join(''); + }); + } + return results.join(''); + }; + } + catch (err) { + logWarn("Unable to parse gradient " + value, err); + return null; + } + } + function getShadowModifier(prop, value) { + try { + var index_2 = 0; + var colorMatches_1 = getMatches(/(^|\s)([a-z]+\(.+?\)|#[0-9a-f]+|[a-z]+)(.*?(inset|outset)?($|,))/ig, value, 2); + var modifiers_2 = colorMatches_1.map(function (match, i) { + var prefixIndex = index_2; + var matchIndex = value.indexOf(match, index_2); + var matchEnd = matchIndex + match.length; + index_2 = matchEnd; + var rgb = tryParseColor(match); + if (!rgb) { + return function () { return value.substring(prefixIndex, matchEnd); }; + } + return function (filter) { return "" + value.substring(prefixIndex, matchIndex) + modifyShadowColor(rgb, filter) + (i === colorMatches_1.length - 1 ? value.substring(matchEnd) : ''); }; + }); + return function (filter) { return modifiers_2.map(function (modify) { return modify(filter); }).join(''); }; + } + catch (err) { + logWarn("Unable to parse shadow " + value, err); + return null; + } + } + function cleanModificationCache() { + colorParseCache.clear(); + clearColorModificationCache(); + imageDetailsCache.clear(); + awaitingForImageLoading.clear(); + } + + var overrides = { + 'background-color': { + customProp: '--darkreader-inline-bgcolor', + cssProp: 'background-color', + dataAttr: 'data-darkreader-inline-bgcolor', + store: new WeakSet(), + }, + 'background-image': { + customProp: '--darkreader-inline-bgimage', + cssProp: 'background-image', + dataAttr: 'data-darkreader-inline-bgimage', + store: new WeakSet(), + }, + 'border-color': { + customProp: '--darkreader-inline-border', + cssProp: 'border-color', + dataAttr: 'data-darkreader-inline-border', + store: new WeakSet(), + }, + 'border-bottom-color': { + customProp: '--darkreader-inline-border-bottom', + cssProp: 'border-bottom-color', + dataAttr: 'data-darkreader-inline-border-bottom', + store: new WeakSet(), + }, + 'border-left-color': { + customProp: '--darkreader-inline-border-left', + cssProp: 'border-left-color', + dataAttr: 'data-darkreader-inline-border-left', + store: new WeakSet(), + }, + 'border-right-color': { + customProp: '--darkreader-inline-border-right', + cssProp: 'border-right-color', + dataAttr: 'data-darkreader-inline-border-right', + store: new WeakSet(), + }, + 'border-top-color': { + customProp: '--darkreader-inline-border-top', + cssProp: 'border-top-color', + dataAttr: 'data-darkreader-inline-border-top', + store: new WeakSet(), + }, + 'box-shadow': { + customProp: '--darkreader-inline-boxshadow', + cssProp: 'box-shadow', + dataAttr: 'data-darkreader-inline-boxshadow', + store: new WeakSet(), + }, + 'color': { + customProp: '--darkreader-inline-color', + cssProp: 'color', + dataAttr: 'data-darkreader-inline-color', + store: new WeakSet(), + }, + 'fill': { + customProp: '--darkreader-inline-fill', + cssProp: 'fill', + dataAttr: 'data-darkreader-inline-fill', + store: new WeakSet(), + }, + 'stroke': { + customProp: '--darkreader-inline-stroke', + cssProp: 'stroke', + dataAttr: 'data-darkreader-inline-stroke', + store: new WeakSet(), + }, + 'outline-color': { + customProp: '--darkreader-inline-outline', + cssProp: 'outline-color', + dataAttr: 'data-darkreader-inline-outline', + store: new WeakSet(), + }, + }; + var overridesList = Object.values(overrides); + var INLINE_STYLE_ATTRS = ['style', 'fill', 'stroke', 'bgcolor', 'color']; + var INLINE_STYLE_SELECTOR = INLINE_STYLE_ATTRS.map(function (attr) { return "[" + attr + "]"; }).join(', '); + function getInlineOverrideStyle() { + return overridesList.map(function (_a) { + var dataAttr = _a.dataAttr, customProp = _a.customProp, cssProp = _a.cssProp; + return [ + "[" + dataAttr + "] {", + " " + cssProp + ": var(" + customProp + ") !important;", + '}', + ].join('\n'); + }).join('\n'); + } + function expand(nodes, selector) { + var results = []; + nodes.forEach(function (n) { + if (n instanceof Element) { + if (n.matches(selector)) { + results.push(n); + } + results.push.apply(results, Array.from(n.querySelectorAll(selector))); + } + }); + return results; + } + var observers = new Map(); + function watchForInlineStyles(elementStyleDidChange, shadowRootDiscovered) { + deepWatchForInlineStyles(document.documentElement, elementStyleDidChange, shadowRootDiscovered); + iterateShadowNodes(document.documentElement, function (node) { + deepWatchForInlineStyles(node.shadowRoot, elementStyleDidChange, shadowRootDiscovered); + }); + } + function deepWatchForInlineStyles(root, elementStyleDidChange, shadowRootDiscovered) { + if (observers.has(root)) { + observers.get(root).disconnect(); + } + var observer = new MutationObserver(function (mutations) { + mutations.forEach(function (m) { + var createdInlineStyles = expand(Array.from(m.addedNodes), INLINE_STYLE_SELECTOR); + if (createdInlineStyles.length > 0) { + createdInlineStyles.forEach(function (el) { return elementStyleDidChange(el); }); + } + if (m.type === 'attributes') { + if (INLINE_STYLE_ATTRS.includes(m.attributeName)) { + elementStyleDidChange(m.target); + } + overridesList + .filter(function (_a) { + var store = _a.store, dataAttr = _a.dataAttr; + return store.has(m.target) && !m.target.hasAttribute(dataAttr); + }) + .forEach(function (_a) { + var dataAttr = _a.dataAttr; + return m.target.setAttribute(dataAttr, ''); + }); + } + }); + mutations.forEach(function (m) { + m.addedNodes.forEach(function (added) { + if (added.isConnected) { + iterateShadowNodes(added, function (n) { + shadowRootDiscovered(n.shadowRoot); + deepWatchForInlineStyles(n.shadowRoot, elementStyleDidChange, shadowRootDiscovered); + }); + } + }); + }); + }); + observer.observe(root, { + childList: true, + subtree: true, + attributes: true, + attributeFilter: INLINE_STYLE_ATTRS.concat(overridesList.map(function (_a) { + var dataAttr = _a.dataAttr; + return dataAttr; + })), + }); + observers.set(root, observer); + } + function stopWatchingForInlineStyles() { + observers.forEach(function (o) { return o.disconnect(); }); + observers.clear(); + } + var inlineStyleCache = new WeakMap(); + var filterProps = ['brightness', 'contrast', 'grayscale', 'sepia', 'mode']; + function getInlineStyleCacheKey(el, theme) { + return INLINE_STYLE_ATTRS + .map(function (attr) { return attr + "=\"" + el.getAttribute(attr) + "\""; }) + .concat(filterProps.map(function (prop) { return prop + "=\"" + theme[prop] + "\""; })) + .join(' '); + } + function overrideInlineStyle(element, theme) { + var cacheKey = getInlineStyleCacheKey(element, theme); + if (cacheKey === inlineStyleCache.get(element)) { + return; + } + var unsetProps = new Set(Object.keys(overrides)); + function setCustomProp(targetCSSProp, modifierCSSProp, cssVal) { + var _a = overrides[targetCSSProp], customProp = _a.customProp, dataAttr = _a.dataAttr; + var mod = getModifiableCSSDeclaration(modifierCSSProp, cssVal, null, null); + if (!mod) { + return; + } + var value = mod.value; + if (typeof value === 'function') { + value = value(theme); + } + element.style.setProperty(customProp, value); + if (!element.hasAttribute(dataAttr)) { + element.setAttribute(dataAttr, ''); + } + unsetProps.delete(targetCSSProp); + } + if (element.hasAttribute('bgcolor')) { + var value = element.getAttribute('bgcolor'); + if (value.match(/^[0-9a-f]{3}$/i) || value.match(/^[0-9a-f]{6}$/i)) { + value = "#" + value; + } + setCustomProp('background-color', 'background-color', value); + } + if (element.hasAttribute('color')) { + var value = element.getAttribute('color'); + if (value.match(/^[0-9a-f]{3}$/i) || value.match(/^[0-9a-f]{6}$/i)) { + value = "#" + value; + } + setCustomProp('color', 'color', value); + } + if (element.hasAttribute('fill') && element instanceof SVGElement) { + var SMALL_SVG_LIMIT = 32; + var value = element.getAttribute('fill'); + var isBg = false; + if (!(element instanceof SVGTextElement)) { + var _a = element.getBoundingClientRect(), width = _a.width, height = _a.height; + isBg = (width > SMALL_SVG_LIMIT || height > SMALL_SVG_LIMIT); + } + setCustomProp('fill', isBg ? 'background-color' : 'color', value); + } + if (element.hasAttribute('stroke')) { + var value = element.getAttribute('stroke'); + setCustomProp('stroke', element instanceof SVGLineElement || element instanceof SVGTextElement ? 'border-color' : 'color', value); + } + element.style && iterateCSSDeclarations(element.style, function (property, value) { + if (property === 'background-image' && value.indexOf('url') >= 0) { + return; + } + if (overrides.hasOwnProperty(property)) { + setCustomProp(property, property, value); + } + }); + if (element.style && element instanceof SVGTextElement && element.style.fill) { + setCustomProp('fill', 'color', element.style.getPropertyValue('fill')); + } + Array.from(unsetProps).forEach(function (cssProp) { + var _a = overrides[cssProp], store = _a.store, dataAttr = _a.dataAttr; + store.delete(element); + element.removeAttribute(dataAttr); + }); + inlineStyleCache.set(element, getInlineStyleCacheKey(element, theme)); + } + + var metaThemeColorName = 'theme-color'; + var metaThemeColorSelector = "meta[name=\"" + metaThemeColorName + "\"]"; + var srcMetaThemeColor = null; + var observer = null; + function changeMetaThemeColor(meta, theme) { + srcMetaThemeColor = srcMetaThemeColor || meta.content; + try { + var color = parse(srcMetaThemeColor); + meta.content = modifyBackgroundColor(color, theme); + } + catch (err) { + logWarn(err); + } + } + function changeMetaThemeColorWhenAvailable(theme) { + var meta = document.querySelector(metaThemeColorSelector); + if (meta) { + changeMetaThemeColor(meta, theme); + } + else { + if (observer) { + observer.disconnect(); + } + observer = new MutationObserver(function (mutations) { + loop: for (var _i = 0, mutations_1 = mutations; _i < mutations_1.length; _i++) { + var m = mutations_1[_i]; + for (var _a = 0, _b = Array.from(m.addedNodes); _a < _b.length; _a++) { + var node = _b[_a]; + if (node instanceof HTMLMetaElement && node.name === metaThemeColorName) { + observer.disconnect(); + observer = null; + changeMetaThemeColor(node, theme); + break loop; + } + } + } + }); + observer.observe(document.head, { childList: true }); + } + } + function restoreMetaThemeColor() { + if (observer) { + observer.disconnect(); + observer = null; + } + var meta = document.querySelector(metaThemeColorSelector); + if (meta && srcMetaThemeColor) { + meta.content = srcMetaThemeColor; + } + } + + var STYLE_SELECTOR = (function () { + var selectors = [ + 'html /deep/ link[rel*="stylesheet" i]:not([disabled])', + 'html /deep/ style', + ':host /deep/ link[rel*="stylesheet" i]:not([disabled])', + ':host /deep/ style', + ':host link[rel*="stylesheet" i]:not([disabled])', + ':host style', + ]; + if (!isDeepSelectorSupported()) { + selectors = selectors.map(function (s) { return s.replace('/deep/ ', ''); }); + } + if (!isHostSelectorSupported()) { + selectors = selectors.filter(function (s) { return s.startsWith(':host'); }); + } + return selectors.join(', '); + })(); + function shouldManageStyle(element) { + return (((element instanceof HTMLStyleElement) || + (element instanceof SVGStyleElement) || + (element instanceof HTMLLinkElement && + element.rel && + element.rel.toLowerCase().includes('stylesheet') && + !element.disabled)) && + !element.classList.contains('darkreader') && + element.media !== 'print'); + } + var asyncQueue = createAsyncTasksQueue(); + function manageStyle(element, _a) { + var update = _a.update, loadingStart = _a.loadingStart, loadingEnd = _a.loadingEnd; + var prevStyles = []; + var next = element; + while ((next = next.nextElementSibling) && next.matches('.darkreader')) { + prevStyles.push(next); + } + var corsCopy = prevStyles.find(function (el) { return el.matches('.darkreader--cors'); }) || null; + var syncStyle = prevStyles.find(function (el) { return el.matches('.darkreader--sync'); }) || null; + var corsCopyPositionWatcher = null; + var syncStylePositionWatcher = null; + var cancelAsyncOperations = false; + function isCancelled() { + return cancelAsyncOperations; + } + var observer = new MutationObserver(function () { + update(); + }); + var observerOptions = { attributes: true, childList: true, characterData: true }; + function containsCSSImport() { + return element instanceof HTMLStyleElement && element.textContent.trim().match(cssImportRegex); + } + function getRulesSync() { + if (corsCopy) { + return corsCopy.sheet.cssRules; + } + if (element.sheet == null) { + return null; + } + if (element instanceof HTMLLinkElement) { + try { + return element.sheet.cssRules; + } + catch (err) { + logWarn(err); + return null; + } + } + if (containsCSSImport()) { + return null; + } + return safeGetSheetRules(); + } + function insertStyle() { + if (corsCopy) { + if (element.nextSibling !== corsCopy) { + element.parentNode.insertBefore(corsCopy, element.nextSibling); + } + if (corsCopy.nextSibling !== syncStyle) { + element.parentNode.insertBefore(syncStyle, corsCopy.nextSibling); + } + } + else if (element.nextSibling !== syncStyle) { + element.parentNode.insertBefore(syncStyle, element.nextSibling); + } + } + function createSyncStyle() { + syncStyle = element instanceof SVGStyleElement ? + document.createElementNS('http://www.w3.org/2000/svg', 'style') : + document.createElement('style'); + syncStyle.classList.add('darkreader'); + syncStyle.classList.add('darkreader--sync'); + syncStyle.media = 'screen'; + } + var isLoadingRules = false; + var wasLoadingError = false; + function getRulesAsync() { + return __awaiter(this, void 0, void 0, function () { + var cssText, cssBasePath, err_1, fullCSSText, err_2; + return __generator(this, function (_a) { + switch (_a.label) { + case 0: + if (!(element instanceof HTMLLinkElement)) return [3, 6]; + if (!(element.sheet == null)) return [3, 4]; + _a.label = 1; + case 1: + _a.trys.push([1, 3, , 4]); + return [4, linkLoading(element)]; + case 2: + _a.sent(); + if (cancelAsyncOperations) { + return [2, null]; + } + return [3, 4]; + case 3: + err_1 = _a.sent(); + logWarn(err_1); + wasLoadingError = true; + return [2, null]; + case 4: + try { + if (element.sheet.cssRules != null) { + return [2, element.sheet.cssRules]; + } + } + catch (err) { + logWarn(err); + } + return [4, loadText(element.href)]; + case 5: + cssText = _a.sent(); + cssBasePath = getCSSBaseBath(element.href); + if (cancelAsyncOperations) { + return [2, null]; + } + return [3, 7]; + case 6: + if (containsCSSImport()) { + cssText = element.textContent.trim(); + cssBasePath = getCSSBaseBath(location.href); + } + else { + return [2, null]; + } + _a.label = 7; + case 7: + if (!cssText) return [3, 12]; + _a.label = 8; + case 8: + _a.trys.push([8, 10, , 11]); + return [4, replaceCSSImports(cssText, cssBasePath)]; + case 9: + fullCSSText = _a.sent(); + corsCopy = createCORSCopy(element, fullCSSText); + return [3, 11]; + case 10: + err_2 = _a.sent(); + logWarn(err_2); + return [3, 11]; + case 11: + if (corsCopy) { + corsCopyPositionWatcher = watchForNodePosition(corsCopy, { watchParent: true, watchSibling: true }); + return [2, corsCopy.sheet.cssRules]; + } + _a.label = 12; + case 12: return [2, null]; + } + }); + }); + } + function details() { + var rules = getRulesSync(); + if (!rules) { + if (isLoadingRules || wasLoadingError) { + return null; + } + isLoadingRules = true; + loadingStart(); + getRulesAsync().then(function (results) { + isLoadingRules = false; + loadingEnd(); + if (results) { + update(); + } + }).catch(function (err) { + logWarn(err); + isLoadingRules = false; + loadingEnd(); + }); + return null; + } + var variables = getCSSVariables(rules); + return { variables: variables }; + } + function getFilterKey(filter) { + return ['mode', 'brightness', 'contrast', 'grayscale', 'sepia'].map(function (p) { return p + ":" + filter[p]; }).join(';'); + } + var renderId = 0; + var rulesTextCache = new Map(); + var rulesModCache = new Map(); + var prevFilterKey = null; + var forceRestore = false; + function render(filter, variables) { + var rules = getRulesSync(); + if (!rules) { + return; + } + cancelAsyncOperations = false; + var rulesChanged = (rulesModCache.size === 0); + var notFoundCacheKeys = new Set(rulesModCache.keys()); + var filterKey = getFilterKey(filter); + var filterChanged = (filterKey !== prevFilterKey); + var modRules = []; + iterateCSSRules(rules, function (rule) { + var cssText = rule.cssText; + var textDiffersFromPrev = false; + notFoundCacheKeys.delete(cssText); + if (!rulesTextCache.has(cssText)) { + rulesTextCache.set(cssText, cssText); + textDiffersFromPrev = true; + } + var vars = null; + var varsRule = null; + if (variables.size > 0 || cssText.includes('var(')) { + var cssTextWithVariables = replaceCSSVariables(cssText, variables); + if (rulesTextCache.get(cssText) !== cssTextWithVariables) { + rulesTextCache.set(cssText, cssTextWithVariables); + textDiffersFromPrev = true; + vars = document.createElement('style'); + vars.classList.add('darkreader'); + vars.classList.add('darkreader--vars'); + vars.media = 'screen'; + vars.textContent = cssTextWithVariables; + element.parentNode.insertBefore(vars, element.nextSibling); + varsRule = vars.sheet.cssRules[0]; + } + } + if (textDiffersFromPrev) { + rulesChanged = true; + } + else { + modRules.push(rulesModCache.get(cssText)); + return; + } + var modDecs = []; + var targetRule = varsRule || rule; + targetRule && targetRule.style && iterateCSSDeclarations(targetRule.style, function (property, value) { + var mod = getModifiableCSSDeclaration(property, value, rule, isCancelled); + if (mod) { + modDecs.push(mod); + } + }); + var modRule = null; + if (modDecs.length > 0) { + modRule = { selector: rule.selectorText, declarations: modDecs }; + if (rule.parentRule instanceof CSSMediaRule) { + modRule.media = rule.parentRule.media.mediaText; + } + modRules.push(modRule); + } + rulesModCache.set(cssText, modRule); + removeNode(vars); + }); + notFoundCacheKeys.forEach(function (key) { + rulesTextCache.delete(key); + rulesModCache.delete(key); + }); + prevFilterKey = filterKey; + if (!forceRestore && !rulesChanged && !filterChanged) { + return; + } + renderId++; + forceRestore = false; + function setRule(target, index, declarations) { + var selector = declarations[0].selector; + target.insertRule(selector + " {}", index); + var style = target.cssRules.item(index).style; + declarations.forEach(function (_a) { + var property = _a.property, value = _a.value, important = _a.important, sourceValue = _a.sourceValue; + style.setProperty(property, value == null ? sourceValue : value, important ? 'important' : ''); + }); + } + var readyDeclarations = []; + var asyncDeclarations = new Map(); + var asyncDeclarationCounter = 0; + function buildStyleSheet() { + var groups = []; + readyDeclarations.forEach(function (decl, i) { + var mediaGroup; + var selectorGroup; + var prev = i === 0 ? null : readyDeclarations[i - 1]; + var isSameMedia = prev && prev.media === decl.media; + var isSameMediaAndSelector = prev && isSameMedia && prev.selector === decl.selector; + if (isSameMedia) { + mediaGroup = groups[groups.length - 1]; + } + else { + mediaGroup = []; + groups.push(mediaGroup); + } + if (isSameMediaAndSelector) { + selectorGroup = mediaGroup[mediaGroup.length - 1]; + } + else { + selectorGroup = []; + mediaGroup.push(selectorGroup); + } + selectorGroup.push(decl); + }); + if (!syncStyle) { + createSyncStyle(); + } + syncStylePositionWatcher && syncStylePositionWatcher.stop(); + insertStyle(); + var sheet = syncStyle.sheet; + for (var i = sheet.cssRules.length - 1; i >= 0; i--) { + sheet.deleteRule(i); + } + groups.forEach(function (mediaGroup) { + var media = mediaGroup[0][0].media; + var target; + if (media) { + sheet.insertRule("@media " + media + " {}", sheet.cssRules.length); + target = sheet.cssRules[sheet.cssRules.length - 1]; + } + else { + target = sheet; + } + mediaGroup.forEach(function (selectorGroup) { + var asyncItems = selectorGroup.filter(function (_a) { + var value = _a.value; + return value == null; + }); + if (asyncItems.length > 0) { + asyncItems.forEach(function (_a) { + var asyncKey = _a.asyncKey; + return asyncDeclarations.set(asyncKey, { declarations: selectorGroup, target: target, index: target.cssRules.length }); + }); + } + setRule(target, target.cssRules.length, selectorGroup); + }); + }); + if (syncStylePositionWatcher) { + syncStylePositionWatcher.run(); + } + else { + syncStylePositionWatcher = watchForNodePosition(syncStyle, { onRestore: buildStyleSheet, watchSibling: true, watchParent: true }); + } + } + function rebuildAsyncRule(key) { + var _a = asyncDeclarations.get(key), declarations = _a.declarations, target = _a.target, index = _a.index; + target.deleteRule(index); + setRule(target, index, declarations); + asyncDeclarations.delete(key); + } + modRules.filter(function (r) { return r; }).forEach(function (_a) { + var selector = _a.selector, declarations = _a.declarations, media = _a.media; + declarations.forEach(function (_a) { + var property = _a.property, value = _a.value, important = _a.important, sourceValue = _a.sourceValue; + if (typeof value === 'function') { + var modified = value(filter); + if (modified instanceof Promise) { + var index_1 = readyDeclarations.length; + var asyncKey_1 = asyncDeclarationCounter++; + readyDeclarations.push({ media: media, selector: selector, property: property, value: null, important: important, asyncKey: asyncKey_1, sourceValue: sourceValue }); + var promise = modified; + var currentRenderId_1 = renderId; + promise.then(function (asyncValue) { + if (!asyncValue || cancelAsyncOperations || currentRenderId_1 !== renderId) { + return; + } + readyDeclarations[index_1].value = asyncValue; + asyncQueue.add(function () { + if (cancelAsyncOperations || currentRenderId_1 !== renderId) { + return; + } + rebuildAsyncRule(asyncKey_1); + }); + }); + } + else { + readyDeclarations.push({ media: media, selector: selector, property: property, value: modified, important: important, sourceValue: sourceValue }); + } + } + else { + readyDeclarations.push({ media: media, selector: selector, property: property, value: value, important: important, sourceValue: sourceValue }); + } + }); + }); + buildStyleSheet(); + } + var rulesChangeKey = null; + var rulesCheckFrameId = null; + function safeGetSheetRules() { + try { + if (element.sheet == null) { + return null; + } + return element.sheet.cssRules; + } + catch (err) { + logWarn(err); + return null; + } + } + function updateRulesChangeKey() { + var rules = safeGetSheetRules(); + if (rules) { + rulesChangeKey = rules.length; + } + } + function didRulesKeyChange() { + var rules = safeGetSheetRules(); + return rules && rules.length !== rulesChangeKey; + } + function subscribeToSheetChanges() { + updateRulesChangeKey(); + unsubscribeFromSheetChanges(); + var checkForUpdate = function () { + if (didRulesKeyChange()) { + updateRulesChangeKey(); + update(); + } + rulesCheckFrameId = requestAnimationFrame(checkForUpdate); + }; + checkForUpdate(); + } + function unsubscribeFromSheetChanges() { + cancelAnimationFrame(rulesCheckFrameId); + } + function pause() { + observer.disconnect(); + cancelAsyncOperations = true; + corsCopyPositionWatcher && corsCopyPositionWatcher.stop(); + syncStylePositionWatcher && syncStylePositionWatcher.stop(); + unsubscribeFromSheetChanges(); + } + function destroy() { + pause(); + removeNode(corsCopy); + removeNode(syncStyle); + } + function watch() { + observer.observe(element, observerOptions); + if (element instanceof HTMLStyleElement) { + subscribeToSheetChanges(); + } + } + var maxMoveCount = 10; + var moveCount = 0; + function restore() { + if (!syncStyle) { + return; + } + moveCount++; + if (moveCount > maxMoveCount) { + logWarn('Style sheet was moved multiple times', element); + return; + } + logWarn('Restore style', syncStyle, element); + var shouldRestore = syncStyle.sheet == null || syncStyle.sheet.cssRules.length > 0; + insertStyle(); + if (shouldRestore) { + forceRestore = true; + updateRulesChangeKey(); + update(); + } + } + return { + details: details, + render: render, + pause: pause, + destroy: destroy, + watch: watch, + restore: restore, + }; + } + function linkLoading(link) { + return new Promise(function (resolve, reject) { + var cleanUp = function () { + link.removeEventListener('load', onLoad); + link.removeEventListener('error', onError); + }; + var onLoad = function () { + cleanUp(); + resolve(); + }; + var onError = function () { + cleanUp(); + reject("Link loading failed " + link.href); + }; + link.addEventListener('load', onLoad); + link.addEventListener('error', onError); + }); + } + function getCSSImportURL(importDeclaration) { + return getCSSURLValue(importDeclaration.substring(8).replace(/;$/, '')); + } + function loadText(url) { + return __awaiter(this, void 0, void 0, function () { + return __generator(this, function (_a) { + switch (_a.label) { + case 0: + if (!url.startsWith('data:')) return [3, 3]; + return [4, fetch(url)]; + case 1: return [4, (_a.sent()).text()]; + case 2: return [2, _a.sent()]; + case 3: return [4, bgFetch({ url: url, responseType: 'text', mimeType: 'text/css' })]; + case 4: return [2, _a.sent()]; + } + }); + }); + } + function replaceCSSImports(cssText, basePath) { + return __awaiter(this, void 0, void 0, function () { + var importMatches, _i, importMatches_1, match, importURL, absoluteURL, importedCSS, err_3; + return __generator(this, function (_a) { + switch (_a.label) { + case 0: + cssText = removeCSSComments(cssText); + cssText = replaceCSSFontFace(cssText); + cssText = replaceCSSRelativeURLsWithAbsolute(cssText, basePath); + importMatches = getMatches(cssImportRegex, cssText); + _i = 0, importMatches_1 = importMatches; + _a.label = 1; + case 1: + if (!(_i < importMatches_1.length)) return [3, 8]; + match = importMatches_1[_i]; + importURL = getCSSImportURL(match); + absoluteURL = getAbsoluteURL(basePath, importURL); + importedCSS = void 0; + _a.label = 2; + case 2: + _a.trys.push([2, 5, , 6]); + return [4, loadText(absoluteURL)]; + case 3: + importedCSS = _a.sent(); + return [4, replaceCSSImports(importedCSS, getCSSBaseBath(absoluteURL))]; + case 4: + importedCSS = _a.sent(); + return [3, 6]; + case 5: + err_3 = _a.sent(); + logWarn(err_3); + importedCSS = ''; + return [3, 6]; + case 6: + cssText = cssText.split(match).join(importedCSS); + _a.label = 7; + case 7: + _i++; + return [3, 1]; + case 8: + cssText = cssText.trim(); + return [2, cssText]; + } + }); + }); + } + function createCORSCopy(srcElement, cssText) { + if (!cssText) { + return null; + } + var cors = document.createElement('style'); + cors.classList.add('darkreader'); + cors.classList.add('darkreader--cors'); + cors.media = 'screen'; + cors.textContent = cssText; + srcElement.parentNode.insertBefore(cors, srcElement.nextSibling); + cors.sheet.disabled = true; + return cors; + } + + var observer$1 = null; + function getAllManageableStyles(nodes) { + var results = []; + Array.from(nodes).forEach(function (node) { + if (node instanceof Element) { + if (shouldManageStyle(node)) { + results.push(node); + } + } + if (node instanceof Element || node instanceof ShadowRoot) { + results.push.apply(results, Array.from(node.querySelectorAll(STYLE_SELECTOR)).filter(shouldManageStyle)); + } + }); + return results; + } + var undefinedGroups = new Map(); + var elementsDefinitionCallback; + function collectUndefinedElements(root) { + if (!isDefinedSelectorSupported()) { + return; + } + root.querySelectorAll(':not(:defined)') + .forEach(function (el) { + var tag = el.tagName.toLowerCase(); + if (!undefinedGroups.has(tag)) { + undefinedGroups.set(tag, new Set()); + customElementsWhenDefined(tag).then(function () { + if (elementsDefinitionCallback) { + var elements = undefinedGroups.get(tag); + undefinedGroups.delete(tag); + elementsDefinitionCallback(Array.from(elements)); + } + }); + } + undefinedGroups.get(tag).add(el); + }); + } + function customElementsWhenDefined(tag) { + return new Promise(function (resolve) { + if (window.customElements && typeof window.customElements.whenDefined === 'function') { + customElements.whenDefined(tag).then(resolve); + } + else { + var checkIfDefined_1 = function () { + var elements = undefinedGroups.get(tag); + if (elements && elements.size > 0) { + if (elements.values().next().value.matches(':defined')) { + resolve(); + } + else { + requestAnimationFrame(checkIfDefined_1); + } + } + }; + requestAnimationFrame(checkIfDefined_1); + } + }); + } + function watchWhenCustomElementsDefined(callback) { + elementsDefinitionCallback = callback; + } + function unsubscribeFromDefineCustomElements() { + elementsDefinitionCallback = null; + undefinedGroups.clear(); + } + var shadowObservers = new Set(); + var nodesShadowObservers = new WeakMap(); + function unsubscribeFromShadowRootChanges() { + shadowObservers.forEach(function (o) { return o.disconnect(); }); + shadowObservers.clear(); + nodesShadowObservers = new WeakMap(); + } + function watchForStyleChanges(update) { + if (observer$1) { + observer$1.disconnect(); + shadowObservers.forEach(function (o) { return o.disconnect(); }); + shadowObservers.clear(); + nodesShadowObservers = new WeakMap(); + } + function handleMutations(mutations) { + var createdStyles = new Set(); + var updatedStyles = new Set(); + var removedStyles = new Set(); + var movedStyles = new Set(); + var additions = new Set(); + var deletions = new Set(); + var styleUpdates = new Set(); + mutations.forEach(function (m) { + m.addedNodes.forEach(function (n) { return additions.add(n); }); + m.removedNodes.forEach(function (n) { return deletions.add(n); }); + if (m.type === 'attributes' && shouldManageStyle(m.target)) { + styleUpdates.add(m.target); + } + }); + var styleAdditions = getAllManageableStyles(additions); + var styleDeletions = getAllManageableStyles(deletions); + additions.forEach(function (n) { + iterateShadowNodes(n, function (host) { + var shadowStyles = getAllManageableStyles(host.shadowRoot.children); + if (shadowStyles.length > 0) { + styleAdditions.push.apply(styleAdditions, shadowStyles); + } + }); + }); + deletions.forEach(function (n) { + iterateShadowNodes(n, function (host) { + var shadowStyles = getAllManageableStyles(host.shadowRoot.children); + if (shadowStyles.length > 0) { + styleDeletions.push.apply(styleDeletions, shadowStyles); + } + }); + }); + styleDeletions.forEach(function (style) { + if (style.isConnected) { + movedStyles.add(style); + } + else { + removedStyles.add(style); + } + }); + styleUpdates.forEach(function (style) { + if (!removedStyles.has(style)) { + updatedStyles.add(style); + } + }); + styleAdditions.forEach(function (style) { + if (!(removedStyles.has(style) || movedStyles.has(style) || updatedStyles.has(style))) { + createdStyles.add(style); + } + }); + if (createdStyles.size + removedStyles.size + updatedStyles.size > 0) { + update({ + created: Array.from(createdStyles), + updated: Array.from(updatedStyles), + removed: Array.from(removedStyles), + moved: Array.from(movedStyles), + }); + } + additions.forEach(function (n) { + if (n.isConnected) { + iterateShadowNodes(n, subscribeForShadowRootChanges); + if (n instanceof Element) { + collectUndefinedElements(n); + } + } + }); + } + function subscribeForShadowRootChanges(node) { + if (nodesShadowObservers.has(node)) { + return; + } + var shadowObserver = new MutationObserver(handleMutations); + shadowObserver.observe(node.shadowRoot, mutationObserverOptions); + shadowObservers.add(shadowObserver); + nodesShadowObservers.set(node, shadowObserver); + } + var mutationObserverOptions = { childList: true, subtree: true, attributes: true, attributeFilter: ['rel', 'disabled'] }; + observer$1 = new MutationObserver(handleMutations); + observer$1.observe(document.documentElement, mutationObserverOptions); + iterateShadowNodes(document.documentElement, subscribeForShadowRootChanges); + watchWhenCustomElementsDefined(function (hosts) { + var newStyles = getAllManageableStyles(hosts.map(function (h) { return h.shadowRoot; })); + update({ created: newStyles, updated: [], removed: [], moved: [] }); + hosts.forEach(function (h) { return subscribeForShadowRootChanges(h); }); + }); + collectUndefinedElements(document); + } + function stopWatchingForStyleChanges() { + if (observer$1) { + observer$1.disconnect(); + observer$1 = null; + unsubscribeFromShadowRootChanges(); + unsubscribeFromDefineCustomElements(); + } + } + + var styleManagers = new Map(); + var variables = new Map(); + var filter = null; + var fixes = null; + var isIFrame = null; + function createOrUpdateStyle(className, root) { + if (root === void 0) { root = document.head || document; } + var style = root.querySelector("." + className); + if (!style) { + style = document.createElement('style'); + style.classList.add('darkreader'); + style.classList.add(className); + style.media = 'screen'; + } + return style; + } + var stylePositionWatchers = new Map(); + function setupStylePositionWatcher(node, alias) { + stylePositionWatchers.has(alias) && stylePositionWatchers.get(alias).stop(); + stylePositionWatchers.set(alias, watchForNodePosition(node, { watchParent: true, watchSibling: false })); + } + function stopStylePositionWatchers() { + Array.from(stylePositionWatchers.values()).forEach(function (watcher) { return watcher.stop(); }); + stylePositionWatchers.clear(); + } + function createStaticStyleOverrides() { + var fallbackStyle = createOrUpdateStyle('darkreader--fallback'); + document.head.insertBefore(fallbackStyle, document.head.firstChild); + fallbackStyle.textContent = getModifiedFallbackStyle(filter, { strict: true }); + setupStylePositionWatcher(fallbackStyle, 'fallback'); + var userAgentStyle = createOrUpdateStyle('darkreader--user-agent'); + document.head.insertBefore(userAgentStyle, fallbackStyle.nextSibling); + userAgentStyle.textContent = getModifiedUserAgentStyle(filter, isIFrame); + setupStylePositionWatcher(userAgentStyle, 'user-agent'); + var textStyle = createOrUpdateStyle('darkreader--text'); + document.head.insertBefore(textStyle, fallbackStyle.nextSibling); + if (filter.useFont || filter.textStroke > 0) { + textStyle.textContent = createTextStyle(filter); + } + else { + textStyle.textContent = ''; + } + setupStylePositionWatcher(textStyle, 'text'); + var invertStyle = createOrUpdateStyle('darkreader--invert'); + document.head.insertBefore(invertStyle, textStyle.nextSibling); + if (fixes && Array.isArray(fixes.invert) && fixes.invert.length > 0) { + invertStyle.textContent = [ + fixes.invert.join(', ') + " {", + " filter: " + getCSSFilterValue(__assign(__assign({}, filter), { contrast: filter.mode === 0 ? filter.contrast : clamp(filter.contrast - 10, 0, 100) })) + " !important;", + '}', + ].join('\n'); + } + else { + invertStyle.textContent = ''; + } + setupStylePositionWatcher(invertStyle, 'invert'); + var inlineStyle = createOrUpdateStyle('darkreader--inline'); + document.head.insertBefore(inlineStyle, invertStyle.nextSibling); + inlineStyle.textContent = getInlineOverrideStyle(); + setupStylePositionWatcher(inlineStyle, 'inline'); + var overrideStyle = createOrUpdateStyle('darkreader--override'); + document.head.appendChild(overrideStyle); + overrideStyle.textContent = fixes && fixes.css ? replaceCSSTemplates(fixes.css) : ''; + setupStylePositionWatcher(overrideStyle, 'override'); + } + var shadowRootsWithOverrides = new Set(); + function createShadowStaticStyleOverrides(root) { + var inlineStyle = createOrUpdateStyle('darkreader--inline', root); + root.insertBefore(inlineStyle, root.firstChild); + inlineStyle.textContent = getInlineOverrideStyle(); + shadowRootsWithOverrides.add(root); + } + function replaceCSSTemplates($cssText) { + return $cssText.replace(/\${(.+?)}/g, function (m0, $color) { + try { + var color = parseColorWithCache($color); + return modifyColor(color, filter); + } + catch (err) { + logWarn(err); + return $color; + } + }); + } + function cleanFallbackStyle() { + var fallback = document.head.querySelector('.darkreader--fallback'); + if (fallback) { + fallback.textContent = ''; + } + } + function createDynamicStyleOverrides() { + cancelRendering(); + updateVariables(getElementCSSVariables(document.documentElement)); + var allStyles = Array.from(document.querySelectorAll(STYLE_SELECTOR)); + iterateShadowNodes(document.documentElement, function (node) { + var shadowStyles = node.shadowRoot.querySelectorAll(STYLE_SELECTOR); + if (shadowStyles.length > 0) { + allStyles.push.apply(allStyles, Array.from(shadowStyles)); + } + }); + var newManagers = Array.from(allStyles) + .filter(function (style) { return !styleManagers.has(style) && shouldManageStyle(style); }) + .map(function (style) { return createManager(style); }); + var newVariables = newManagers + .map(function (manager) { return manager.details(); }) + .filter(function (details) { return details && details.variables.size > 0; }) + .map(function (_a) { + var variables = _a.variables; + return variables; + }); + if (newVariables.length === 0) { + styleManagers.forEach(function (manager) { return manager.render(filter, variables); }); + if (loadingStyles.size === 0) { + cleanFallbackStyle(); + } + } + else { + newVariables.forEach(function (variables) { return updateVariables(variables); }); + throttledRenderAllStyles(function () { + if (loadingStyles.size === 0) { + cleanFallbackStyle(); + } + }); + } + newManagers.forEach(function (manager) { return manager.watch(); }); + var inlineStyleElements = Array.from(document.querySelectorAll(INLINE_STYLE_SELECTOR)); + iterateShadowNodes(document.documentElement, function (node) { + var elements = node.shadowRoot.querySelectorAll(INLINE_STYLE_SELECTOR); + if (elements.length > 0) { + createShadowStaticStyleOverrides(node.shadowRoot); + inlineStyleElements.push.apply(inlineStyleElements, Array.from(elements)); + } + }); + inlineStyleElements.forEach(function (el) { return overrideInlineStyle(el, filter); }); + } + var loadingStylesCounter = 0; + var loadingStyles = new Set(); + function createManager(element) { + if (styleManagers.has(element)) { + return; + } + var loadingStyleId = ++loadingStylesCounter; + function loadingStart() { + if (!isPageLoaded() || !didDocumentShowUp) { + loadingStyles.add(loadingStyleId); + var fallbackStyle = document.querySelector('.darkreader--fallback'); + if (!fallbackStyle.textContent) { + fallbackStyle.textContent = getModifiedFallbackStyle(filter, { strict: false }); + } + } + } + function loadingEnd() { + loadingStyles.delete(loadingStyleId); + if (loadingStyles.size === 0 && isPageLoaded()) { + cleanFallbackStyle(); + } + } + function update() { + var details = manager.details(); + if (!details) { + return; + } + if (details.variables.size === 0) { + manager.render(filter, variables); + } + else { + updateVariables(details.variables); + throttledRenderAllStyles(); + } + } + var manager = manageStyle(element, { update: update, loadingStart: loadingStart, loadingEnd: loadingEnd }); + styleManagers.set(element, manager); + return manager; + } + function updateVariables(newVars) { + if (newVars.size === 0) { + return; + } + newVars.forEach(function (value, key) { return variables.set(key, value); }); + variables.forEach(function (value, key) { return variables.set(key, replaceCSSVariables(value, variables)); }); + } + function removeManager(element) { + var manager = styleManagers.get(element); + if (manager) { + manager.destroy(); + styleManagers.delete(element); + } + } + var throttledRenderAllStyles = throttle(function (callback) { + styleManagers.forEach(function (manager) { return manager.render(filter, variables); }); + callback && callback(); + }); + var cancelRendering = function () { + throttledRenderAllStyles.cancel(); + }; + function isPageLoaded() { + return document.readyState === 'complete' || document.readyState === 'interactive'; + } + function onReadyStateChange() { + if (!isPageLoaded()) { + return; + } + document.removeEventListener('readystatechange', onReadyStateChange); + if (loadingStyles.size === 0) { + cleanFallbackStyle(); + } + } + var documentVisibilityListener = null; + var didDocumentShowUp = !document.hidden; + function watchForDocumentVisibility(callback) { + var alreadyWatching = Boolean(documentVisibilityListener); + documentVisibilityListener = function () { + if (!document.hidden) { + stopWatchingForDocumentVisibility(); + callback(); + didDocumentShowUp = true; + } + }; + if (!alreadyWatching) { + document.addEventListener('visibilitychange', documentVisibilityListener); + } + } + function stopWatchingForDocumentVisibility() { + document.removeEventListener('visibilitychange', documentVisibilityListener); + documentVisibilityListener = null; + } + function createThemeAndWatchForUpdates() { + createStaticStyleOverrides(); + function runDynamicStyle() { + createDynamicStyleOverrides(); + watchForUpdates(); + } + if (document.hidden) { + watchForDocumentVisibility(runDynamicStyle); + } + else { + runDynamicStyle(); + } + changeMetaThemeColorWhenAvailable(filter); + } + function watchForUpdates() { + watchForStyleChanges(function (_a) { + var created = _a.created, updated = _a.updated, removed = _a.removed, moved = _a.moved; + var stylesToRemove = removed; + var stylesToManage = created.concat(updated).concat(moved) + .filter(function (style) { return !styleManagers.has(style); }); + var stylesToRestore = moved + .filter(function (style) { return styleManagers.has(style); }); + stylesToRemove.forEach(function (style) { return removeManager(style); }); + var newManagers = stylesToManage + .map(function (style) { return createManager(style); }); + var newVariables = newManagers + .map(function (manager) { return manager.details(); }) + .filter(function (details) { return details && details.variables.size > 0; }) + .map(function (_a) { + var variables = _a.variables; + return variables; + }); + if (newVariables.length === 0) { + newManagers.forEach(function (manager) { return manager.render(filter, variables); }); + } + else { + newVariables.forEach(function (variables) { return updateVariables(variables); }); + throttledRenderAllStyles(); + } + newManagers.forEach(function (manager) { return manager.watch(); }); + stylesToRestore.forEach(function (style) { return styleManagers.get(style).restore(); }); + }); + watchForInlineStyles(function (element) { + overrideInlineStyle(element, filter); + if (element === document.documentElement) { + var rootVariables = getElementCSSVariables(document.documentElement); + if (rootVariables.size > 0) { + updateVariables(rootVariables); + throttledRenderAllStyles(); + } + } + }, function (root) { + var inlineStyleElements = root.querySelectorAll(INLINE_STYLE_SELECTOR); + if (inlineStyleElements.length > 0) { + createShadowStaticStyleOverrides(root); + inlineStyleElements.forEach(function (el) { return overrideInlineStyle(el, filter); }); + } + }); + document.addEventListener('readystatechange', onReadyStateChange); + } + function stopWatchingForUpdates() { + styleManagers.forEach(function (manager) { return manager.pause(); }); + stopStylePositionWatchers(); + stopWatchingForStyleChanges(); + stopWatchingForInlineStyles(); + document.removeEventListener('readystatechange', onReadyStateChange); + } + function createOrUpdateDynamicTheme(filterConfig, dynamicThemeFixes, iframe) { + filter = filterConfig; + fixes = dynamicThemeFixes; + isIFrame = iframe; + if (document.head) { + createThemeAndWatchForUpdates(); + } + else { + if (!isFirefox()) { + var fallbackStyle = createOrUpdateStyle('darkreader--fallback'); + document.documentElement.appendChild(fallbackStyle); + fallbackStyle.textContent = getModifiedFallbackStyle(filter, { strict: true }); + } + var headObserver_1 = new MutationObserver(function () { + if (document.head) { + headObserver_1.disconnect(); + createThemeAndWatchForUpdates(); + } + }); + headObserver_1.observe(document, { childList: true, subtree: true }); + } + } + function removeDynamicTheme() { + cleanDynamicThemeCache(); + removeNode(document.querySelector('.darkreader--fallback')); + if (document.head) { + restoreMetaThemeColor(); + removeNode(document.head.querySelector('.darkreader--user-agent')); + removeNode(document.head.querySelector('.darkreader--text')); + removeNode(document.head.querySelector('.darkreader--invert')); + removeNode(document.head.querySelector('.darkreader--inline')); + removeNode(document.head.querySelector('.darkreader--override')); + } + shadowRootsWithOverrides.forEach(function (root) { + removeNode(root.querySelector('.darkreader--inline')); + }); + shadowRootsWithOverrides.clear(); + Array.from(styleManagers.keys()).forEach(function (el) { return removeManager(el); }); + Array.from(document.querySelectorAll('.darkreader')).forEach(removeNode); + } + function cleanDynamicThemeCache() { + stopWatchingForDocumentVisibility(); + cancelRendering(); + stopWatchingForUpdates(); + cleanModificationCache(); + } + + var defaultTheme = { + mode: 1, + brightness: 100, + contrast: 100, + grayscale: 0, + sepia: 0, + useFont: false, + fontFamily: '', + textStroke: 0, + engine: ThemeEngines.dynamicTheme, + stylesheet: '', + }; + var isIFrame$1 = (function () { + try { + return window.self !== window.top; + } + catch (err) { + console.warn(err); + return true; + } + })(); + function enable(themeOptions, fixes) { + if (themeOptions === void 0) { themeOptions = {}; } + if (fixes === void 0) { fixes = null; } + var theme = __assign(__assign({}, defaultTheme), themeOptions); + if (theme.engine !== ThemeEngines.dynamicTheme) { + throw new Error('Theme engine is not supported'); + } + createOrUpdateDynamicTheme(theme, fixes, isIFrame$1); + } + function disable() { + removeDynamicTheme(); + } + var darkScheme = matchMedia('(prefers-color-scheme: dark)'); + var store = { + themeOptions: null, + fixes: null, + }; + function handleColorScheme() { + if (darkScheme.matches) { + enable(store.themeOptions, store.fixes); + } + else { + disable(); + } + } + function auto(themeOptions, fixes) { + if (themeOptions === void 0) { themeOptions = {}; } + if (fixes === void 0) { fixes = null; } + if (themeOptions) { + store = { themeOptions: themeOptions, fixes: fixes }; + handleColorScheme(); + darkScheme.addListener(handleColorScheme); + } + else { + darkScheme.removeListener(handleColorScheme); + disable(); + } + } + var setFetchMethod$1 = setFetchMethod; + + exports.auto = auto; + exports.disable = disable; + exports.enable = enable; + exports.setFetchMethod = setFetchMethod$1; + + Object.defineProperty(exports, '__esModule', { value: true }); + +}))); diff --git a/Wino.Mail.WinUI/JS/libs/jodit.min.css b/Wino.Mail.WinUI/JS/libs/jodit.min.css new file mode 100644 index 00000000..bed4d57f --- /dev/null +++ b/Wino.Mail.WinUI/JS/libs/jodit.min.css @@ -0,0 +1,5664 @@ +.jodit-about { + padding: 20px +} + + .jodit-about a { + color: #459ce7; + text-decoration: none + } + + .jodit-about a:focus, .jodit-about a:hover { + color: #23527c; + outline: 0; + text-decoration: underline + } + + .jodit-about div { + margin-bottom: calc(var(--jd-padding-default)/2) + } + +.jodit-ui-group { + display: inline-flex; + flex: 0 0 auto; + flex-shrink: 0; + flex-wrap: wrap; + max-width: 100% +} + +.jodit-ui-group_line_true { + display: flex; + justify-content: stretch +} + +.jodit-ui-group_separated_true:not(:last-child):not(.jodit-ui-group_before-spacer_true):after { + border-left: 0; + border-right: 1px solid var(--jd-color-border); + content: ""; + cursor: default; + margin: 2px; + padding: 0 +} + +.jodit-ui-group:last-child { + border-bottom: 0 +} + +.jodit-ui-list { + display: flex; + flex-direction: column +} + +.jodit-ui-list_mode_vertical .jodit-ui-group { + background-color: transparent; + border: 0; + flex-direction: column +} + +.jodit-ui-list_mode_vertical .jodit-toolbar-button { + height: auto; + min-height: var(--jd-button-size) +} + +.jodit-ui-list_mode_vertical .jodit-toolbar-button__button { + cursor: pointer; + height: auto; + min-height: var(--jd-button-size); + width: 100% +} + +.jodit-ui-list_mode_vertical .jodit-toolbar-button__text:not(:empty) { + justify-content: left +} + +.jodit-ui-separator { + border-left: 0; + border-right: 1px solid var(--jd-color-border); + cursor: default; + margin: 2px; + padding: 0 +} + +.jodit-ui-break { + border-top: 1px solid var(--jd-color-border); + flex-basis: 100%; + height: 0 !important; + width: 0 +} + +.jodit-ui-spacer { + flex: 1 +} + +.jodit-ui-button-icon-text__icon { + display: none +} + + .jodit-ui-button-icon-text__icon:not(:empty) { + display: inline-flex + } + +.jodit-ui-button-icon-text__text { + display: none +} + + .jodit-ui-button-icon-text__text:not(:empty) { + display: inline-flex; + flex-grow: 1; + font-family: var(--jd-font-default); + font-size: var(--jd-font-size-default); + justify-content: center + } + +.jodit-ui-button-icon-text_context_menu .jodit-ui-button-icon-text__text { + justify-content: left; + padding-left: var(--jd-padding-default); + position: relative +} + + .jodit-ui-button-icon-text_context_menu .jodit-ui-button-icon-text__text:before { + border-left: 1px solid var(--jd-color-border); + content: ""; + height: 35px; + left: 0; + position: absolute; + top: calc(var(--jd-padding-default)*-1) + } + +.jodit-ui-button-icon-text__icon:not(:empty) + .jodit-ui-button-icon-text__text:not(:empty) { + margin-left: var(--jd-padding-default) +} + +.jodit-ui-button-icon-text__icon:empty + .jodit-ui-button-icon-text__text:not(:empty) { + padding: 0 var(--jd-padding-default) +} + +.jodit-ui-button-clear, .jodit-ui-button_clear { + appearance: none; + background: 0 0; + border: 0; + box-shadow: none; + box-sizing: border-box; + font-style: normal; + outline: 0; + padding: 0; + position: relative; + text-align: center; + text-decoration: none; + text-transform: none; + user-select: none +} + +.jodit-ui-button-sizes { + height: 34px; + min-width: 34px +} + + .jodit-ui-button-sizes .jodit-icon { + height: 14px; + width: 14px + } + + .jodit-ui-button-sizes button { + appearance: none; + height: 34px; + min-width: 34px; + padding: 0 + } + +.jodit-ui-button-sizes_text-icons_true button { + padding: 0 var(--jd-padding-default) +} + +.jodit-ui-button-sizes_size_tiny { + height: 16px; + min-width: 16px +} + + .jodit-ui-button-sizes_size_tiny .jodit-icon { + height: 8px; + width: 8px + } + + .jodit-ui-button-sizes_size_tiny button { + appearance: none; + height: 16px; + min-width: 16px; + padding: 0 + } + +.jodit-ui-button-sizes_size_tiny_text-icons_true button { + padding: 0 var(--jd-padding-default) +} + +.jodit-ui-button-sizes_size_xsmall { + height: 22px; + min-width: 22px +} + + .jodit-ui-button-sizes_size_xsmall .jodit-icon { + height: 10px; + width: 10px + } + + .jodit-ui-button-sizes_size_xsmall button { + appearance: none; + height: 22px; + min-width: 22px; + padding: 0 + } + +.jodit-ui-button-sizes_size_xsmall_text-icons_true button { + padding: 0 var(--jd-padding-default) +} + +.jodit-ui-button-sizes_size_small { + height: 28px; + min-width: 28px +} + + .jodit-ui-button-sizes_size_small .jodit-icon { + height: 12px; + width: 12px + } + + .jodit-ui-button-sizes_size_small button { + appearance: none; + height: 28px; + min-width: 28px; + padding: 0 + } + +.jodit-ui-button-sizes_size_small_text-icons_true button { + padding: 0 var(--jd-padding-default) +} + +.jodit-ui-button-sizes_size_large { + height: 40px; + min-width: 40px +} + + .jodit-ui-button-sizes_size_large .jodit-icon { + height: 16px; + width: 16px + } + + .jodit-ui-button-sizes_size_large button { + appearance: none; + height: 40px; + min-width: 40px; + padding: 0 + } + +.jodit-ui-button-sizes_size_large_text-icons_true button { + padding: 0 var(--jd-padding-default) +} + +.jodit-ui-button-variants_variant_outline { + border: 1px solid var(--jd-color-border) +} + +.jodit-ui-button-variants_variant_default { + background-color: #e3e3e3; + color: #212529 +} + + .jodit-ui-button-variants_variant_default svg { + fill: #212529; + stroke: #212529 + } + + .jodit-ui-button-variants_variant_default [disabled] { + opacity: .7 + } + + .jodit-ui-button-variants_variant_default:hover:not([disabled]) { + background-color: #c9cdd1; + color: #212529 + } + + .jodit-ui-button-variants_variant_default:hover:not([disabled]) svg { + fill: #212529; + stroke: #212529 + } + + .jodit-ui-button-variants_variant_default:active:not([disabled]) { + background-color: #dae0e5; + color: #212529 + } + + .jodit-ui-button-variants_variant_default:active:not([disabled]) svg { + fill: #212529; + stroke: #212529 + } + + .jodit-ui-button-variants_variant_default:focus:not([disabled]) { + outline: 1px dashed #dae0e5 + } + +.jodit-ui-button-variants_variant_primary { + background-color: #007bff; + color: #fff +} + + .jodit-ui-button-variants_variant_primary svg { + fill: #fff; + stroke: #fff + } + + .jodit-ui-button-variants_variant_primary [disabled] { + opacity: .7 + } + + .jodit-ui-button-variants_variant_primary:hover:not([disabled]) { + background-color: #0069d9; + color: #fff + } + + .jodit-ui-button-variants_variant_primary:hover:not([disabled]) svg { + fill: #fff; + stroke: #fff + } + + .jodit-ui-button-variants_variant_primary:active:not([disabled]) { + background-color: #0062cc; + color: #fff + } + + .jodit-ui-button-variants_variant_primary:active:not([disabled]) svg { + fill: #fff; + stroke: #fff + } + + .jodit-ui-button-variants_variant_primary:focus:not([disabled]) { + outline: 1px dashed #0062cc + } + +.jodit-ui-button-variants_variant_secondary { + background-color: #d8d8d8; + border-radius: 0; + color: #212529 +} + + .jodit-ui-button-variants_variant_secondary svg { + fill: #212529; + stroke: #212529 + } + + .jodit-ui-button-variants_variant_secondary [disabled] { + opacity: .7 + } + + .jodit-ui-button-variants_variant_secondary:hover:not([disabled]) { + background-color: #c9cdd1; + color: #212529 + } + + .jodit-ui-button-variants_variant_secondary:hover:not([disabled]) svg { + fill: #212529; + stroke: #212529 + } + + .jodit-ui-button-variants_variant_secondary:active:not([disabled]) { + background-color: #dae0e5; + color: #212529 + } + + .jodit-ui-button-variants_variant_secondary:active:not([disabled]) svg { + fill: #212529; + stroke: #212529 + } + + .jodit-ui-button-variants_variant_secondary:focus:not([disabled]) { + outline: 1px dashed #dae0e5 + } + +.jodit-ui-button-variants_variant_success { + background-color: #28a745; + color: #fff +} + + .jodit-ui-button-variants_variant_success svg { + fill: #fff; + stroke: #fff + } + + .jodit-ui-button-variants_variant_success [disabled] { + opacity: .7 + } + + .jodit-ui-button-variants_variant_success:hover:not([disabled]) { + background-color: #218838; + color: #fff + } + + .jodit-ui-button-variants_variant_success:hover:not([disabled]) svg { + fill: #fff; + stroke: #fff + } + + .jodit-ui-button-variants_variant_success:active:not([disabled]) { + background-color: #1e7e34; + color: #fff + } + + .jodit-ui-button-variants_variant_success:active:not([disabled]) svg { + fill: #fff; + stroke: #fff + } + + .jodit-ui-button-variants_variant_success:focus:not([disabled]) { + outline: 1px dashed #1e7e34 + } + +.jodit-ui-button-variants_variant_danger { + background-color: #dc3545; + color: #fff +} + + .jodit-ui-button-variants_variant_danger svg { + fill: #fff; + stroke: #fff + } + + .jodit-ui-button-variants_variant_danger [disabled] { + opacity: .7 + } + + .jodit-ui-button-variants_variant_danger:hover:not([disabled]) { + background-color: #c82333; + color: #fff + } + + .jodit-ui-button-variants_variant_danger:hover:not([disabled]) svg { + fill: #fff; + stroke: #fff + } + + .jodit-ui-button-variants_variant_danger:active:not([disabled]) { + background-color: #bd2130; + color: #fff + } + + .jodit-ui-button-variants_variant_danger:active:not([disabled]) svg { + fill: #fff; + stroke: #fff + } + + .jodit-ui-button-variants_variant_danger:focus:not([disabled]) { + outline: 1px dashed #bd2130 + } + +.jodit-ui-button-style { + border-radius: var(--jd-border-radius-default); + padding: 0 var(--jd-padding-default) +} + +.jodit-ui-button, .jodit-ui-button-style { + align-items: center; + color: var(--jd-color-text-icons); + display: inline-flex; + justify-content: center +} + +.jodit-ui-button { + appearance: none; + background: 0 0; + border: 0; + border-radius: var(--jd-border-radius-default); + box-shadow: none; + box-sizing: border-box; + cursor: pointer; + font-style: normal; + height: 34px; + min-width: 34px; + outline: 0; + padding: 0; + padding: 0 var(--jd-padding-default); + position: relative; + text-align: center; + text-decoration: none; + text-transform: none; + user-select: none +} + + .jodit-ui-button:focus-visible:not([disabled]), .jodit-ui-button:hover:not([disabled]) { + background-color: var(--jd-color-button-background-hover); + opacity: 1; + outline: 0 + } + + .jodit-ui-button:active:not([disabled]), .jodit-ui-button[aria-pressed=true]:not([disabled]) { + background-color: var(--jd-color-button-background-hover-opacity40); + outline: 0 + } + + .jodit-ui-button[aria-pressed=true]:hover:not([disabled]) { + background-color: var(--jd-color-button-background-hover-opacity60) + } + + .jodit-ui-button[disabled] { + opacity: .3; + pointer-events: none + } + + .jodit-ui-button .jodit-icon { + height: 14px; + width: 14px + } + + .jodit-ui-button button { + appearance: none; + height: 34px; + min-width: 34px; + padding: 0 + } + +.jodit-ui-button_text-icons_true button { + padding: 0 var(--jd-padding-default) +} + +.jodit-ui-button_size_tiny { + height: 16px; + min-width: 16px +} + + .jodit-ui-button_size_tiny .jodit-icon { + height: 8px; + width: 8px + } + + .jodit-ui-button_size_tiny button { + appearance: none; + height: 16px; + min-width: 16px; + padding: 0 + } + +.jodit-ui-button_size_tiny_text-icons_true button { + padding: 0 var(--jd-padding-default) +} + +.jodit-ui-button_size_xsmall { + height: 22px; + min-width: 22px +} + + .jodit-ui-button_size_xsmall .jodit-icon { + height: 10px; + width: 10px + } + + .jodit-ui-button_size_xsmall button { + appearance: none; + height: 22px; + min-width: 22px; + padding: 0 + } + +.jodit-ui-button_size_xsmall_text-icons_true button { + padding: 0 var(--jd-padding-default) +} + +.jodit-ui-button_size_small { + height: 28px; + min-width: 28px +} + + .jodit-ui-button_size_small .jodit-icon { + height: 12px; + width: 12px + } + + .jodit-ui-button_size_small button { + appearance: none; + height: 28px; + min-width: 28px; + padding: 0 + } + +.jodit-ui-button_size_small_text-icons_true button { + padding: 0 var(--jd-padding-default) +} + +.jodit-ui-button_size_large { + height: 40px; + min-width: 40px +} + + .jodit-ui-button_size_large .jodit-icon { + height: 16px; + width: 16px + } + + .jodit-ui-button_size_large button { + appearance: none; + height: 40px; + min-width: 40px; + padding: 0 + } + +.jodit-ui-button_size_large_text-icons_true button { + padding: 0 var(--jd-padding-default) +} + +.jodit-ui-button__icon { + display: none +} + + .jodit-ui-button__icon:not(:empty) { + display: inline-flex + } + +.jodit-ui-button__text { + display: none +} + + .jodit-ui-button__text:not(:empty) { + display: inline-flex; + flex-grow: 1; + font-family: var(--jd-font-default); + font-size: var(--jd-font-size-default); + justify-content: center + } + +.jodit-ui-button_context_menu .jodit-ui-button__text { + justify-content: left; + padding-left: var(--jd-padding-default); + position: relative +} + + .jodit-ui-button_context_menu .jodit-ui-button__text:before { + border-left: 1px solid var(--jd-color-border); + content: ""; + height: 35px; + left: 0; + position: absolute; + top: calc(var(--jd-padding-default)*-1) + } + +.jodit-ui-button__icon:not(:empty) + .jodit-ui-button__text:not(:empty) { + margin-left: var(--jd-padding-default) +} + +.jodit-ui-button__icon:empty + .jodit-ui-button__text:not(:empty) { + padding: 0 var(--jd-padding-default) +} + +.jodit-ui-button:focus:not([disabled]) { + outline: 1px dashed var(--jd-color-background-selection) +} + +.jodit-ui-button_variant_outline { + border: 1px solid var(--jd-color-border) +} + +.jodit-ui-button_variant_default { + background-color: #e3e3e3; + color: #212529 +} + + .jodit-ui-button_variant_default svg { + fill: #212529; + stroke: #212529 + } + + .jodit-ui-button_variant_default [disabled] { + opacity: .7 + } + + .jodit-ui-button_variant_default:hover:not([disabled]) { + background-color: #c9cdd1; + color: #212529 + } + + .jodit-ui-button_variant_default:hover:not([disabled]) svg { + fill: #212529; + stroke: #212529 + } + + .jodit-ui-button_variant_default:active:not([disabled]) { + background-color: #dae0e5; + color: #212529 + } + + .jodit-ui-button_variant_default:active:not([disabled]) svg { + fill: #212529; + stroke: #212529 + } + + .jodit-ui-button_variant_default:focus:not([disabled]) { + outline: 1px dashed #dae0e5 + } + +.jodit-ui-button_variant_primary { + background-color: #007bff; + color: #fff +} + + .jodit-ui-button_variant_primary svg { + fill: #fff; + stroke: #fff + } + + .jodit-ui-button_variant_primary [disabled] { + opacity: .7 + } + + .jodit-ui-button_variant_primary:hover:not([disabled]) { + background-color: #0069d9; + color: #fff + } + + .jodit-ui-button_variant_primary:hover:not([disabled]) svg { + fill: #fff; + stroke: #fff + } + + .jodit-ui-button_variant_primary:active:not([disabled]) { + background-color: #0062cc; + color: #fff + } + + .jodit-ui-button_variant_primary:active:not([disabled]) svg { + fill: #fff; + stroke: #fff + } + + .jodit-ui-button_variant_primary:focus:not([disabled]) { + outline: 1px dashed #0062cc + } + +.jodit-ui-button_variant_secondary { + background-color: #d8d8d8; + border-radius: 0; + color: #212529 +} + + .jodit-ui-button_variant_secondary svg { + fill: #212529; + stroke: #212529 + } + + .jodit-ui-button_variant_secondary [disabled] { + opacity: .7 + } + + .jodit-ui-button_variant_secondary:hover:not([disabled]) { + background-color: #c9cdd1; + color: #212529 + } + + .jodit-ui-button_variant_secondary:hover:not([disabled]) svg { + fill: #212529; + stroke: #212529 + } + + .jodit-ui-button_variant_secondary:active:not([disabled]) { + background-color: #dae0e5; + color: #212529 + } + + .jodit-ui-button_variant_secondary:active:not([disabled]) svg { + fill: #212529; + stroke: #212529 + } + + .jodit-ui-button_variant_secondary:focus:not([disabled]) { + outline: 1px dashed #dae0e5 + } + +.jodit-ui-button_variant_success { + background-color: #28a745; + color: #fff +} + + .jodit-ui-button_variant_success svg { + fill: #fff; + stroke: #fff + } + + .jodit-ui-button_variant_success [disabled] { + opacity: .7 + } + + .jodit-ui-button_variant_success:hover:not([disabled]) { + background-color: #218838; + color: #fff + } + + .jodit-ui-button_variant_success:hover:not([disabled]) svg { + fill: #fff; + stroke: #fff + } + + .jodit-ui-button_variant_success:active:not([disabled]) { + background-color: #1e7e34; + color: #fff + } + + .jodit-ui-button_variant_success:active:not([disabled]) svg { + fill: #fff; + stroke: #fff + } + + .jodit-ui-button_variant_success:focus:not([disabled]) { + outline: 1px dashed #1e7e34 + } + +.jodit-ui-button_variant_danger { + background-color: #dc3545; + color: #fff +} + + .jodit-ui-button_variant_danger svg { + fill: #fff; + stroke: #fff + } + + .jodit-ui-button_variant_danger [disabled] { + opacity: .7 + } + + .jodit-ui-button_variant_danger:hover:not([disabled]) { + background-color: #c82333; + color: #fff + } + + .jodit-ui-button_variant_danger:hover:not([disabled]) svg { + fill: #fff; + stroke: #fff + } + + .jodit-ui-button_variant_danger:active:not([disabled]) { + background-color: #bd2130; + color: #fff + } + + .jodit-ui-button_variant_danger:active:not([disabled]) svg { + fill: #fff; + stroke: #fff + } + + .jodit-ui-button_variant_danger:focus:not([disabled]) { + outline: 1px dashed #bd2130 + } + +:root { + --jd-popup-box-shadow: 0 4px 1px -2px rgba(76,76,76,.2),0 3px 3px 0 rgba(76,76,76,.15),0 1px 4px 0 rgba(76,76,76,.13) +} + +.jodit-popup { + background: 0 0; + border: 0; + box-shadow: var(--jd-popup-box-shadow); + display: inline-block; + float: none; + height: auto; + margin: 0; + max-width: none; + outline: 0; + padding: 0; + position: static; + position: fixed; + transform: translateZ(0); + width: auto; + z-index: var(--jd-z-index-popup) +} + +.jodit-popup__content { + background: var(--jd-color-background-default); + font-family: var(--jd-font-default); + font-size: var(--jd-font-size-default); + max-height: 300px; + overflow: auto; + padding: var(--jd-padding-default); + overflow-scrolling: touch +} + +.jodit-popup_padding_false .jodit-popup__content { + padding: 0 +} + +.jodit-popup_max-height_false .jodit-popup__content { + max-height: fit-content +} + +.jodit-context-menu { + background: 0 0; + border: 0; + box-shadow: var(--jd-popup-box-shadow); + display: inline-block; + float: none; + height: auto; + margin: 0; + max-width: none; + outline: 0; + padding: 0; + position: static; + position: fixed; + transform: translateZ(0); + width: auto; + z-index: var(--jd-z-index-popup); + z-index: var(--jd-z-index-context-menu) +} + +.jodit-context-menu, .jodit-context-menu__content { + font-family: var(--jd-font-default); + font-size: var(--jd-font-size-default) +} + +.jodit-context-menu__content { + background: var(--jd-color-background-default); + max-height: 300px; + overflow: auto; + padding: var(--jd-padding-default); + overflow-scrolling: touch +} + +.jodit-context-menu_padding_false .jodit-context-menu__content { + padding: 0 +} + +.jodit-context-menu_max-height_false .jodit-context-menu__content { + max-height: fit-content +} + +.jodit-context-menu .jodit-ui-button { + display: flex +} + +.jodit-context-menu button { + width: 100% +} + +.jodit-context-menu_theme_dark { + background-color: var(--jd-dark-background-color) +} + +.jodit-ui-button-group { + margin-bottom: var(--jd-padding-default) +} + +.jodit-ui-button-group__label { + color: var(--jd-color-label); + display: block; + font-size: .8em; + margin-bottom: calc(var(--jd-padding-default)/4) +} + +.jodit-ui-button-group__options { + display: flex; + justify-content: flex-start +} + +.jodit-ui-button-group .jodit-ui-button:not(:last-child) { + border-bottom-right-radius: 0; + border-top-right-radius: 0 +} + +.jodit-ui-button-group .jodit-ui-button + .jodit-ui-button { + border-bottom-left-radius: 0; + border-left: 1px solid var(--jd-color-button-background-hover-opacity40); + border-top-left-radius: 0 +} + +.jodit-ui-button-group .jodit-ui-button[aria-pressed=true]:not([disabled]) { + background-color: var(--jd-color-button-background-hover); + border-left: 0; + box-shadow: inset 0 0 3px 0 var(--jd-color-dark); + color: var(--jd-color-dark); + outline: 0 +} + + .jodit-ui-button-group .jodit-ui-button[aria-pressed=true]:not([disabled]) + .jodit-ui-button { + border: 0 + } + +:root { + --jd-tooltip-color: #fff; + --jd-tooltip-background-color: rgba(0,0,0,.7); + --jd-tooltip-sfx-shadow: rgba(0,0,0,.15); + --jd-tooltip-border-width: 0; + --jd-tooltip-border-color: #e5e5e5 +} + +.jodit-ui-tooltip { + animation-fill-mode: forwards; + animation-timing-function: ease-out; + background-clip: padding-box; + background-color: var(--jd-tooltip-background-color); + border-radius: 4px; + box-shadow: 0 0 0 var(--jd-tooltip-border-width) var(--jd-tooltip-border-color),0 8px 20px var(--jd-tooltip-border-width) var(--jd-tooltip-sfx-shadow); + color: var(--jd-tooltip-color); + font-family: var(--jd-font-default); + font-size: var(--jd-font-size-small); + line-height: 1.4; + max-width: 120px; + opacity: 0; + outline: none; + position: fixed; + text-rendering: optimizelegibility; + transform: translate(-50%,calc(var(--jd-padding-default)/2)); + transition: opacity .2s ease 0s; + user-select: none; + white-space: normal; + width: auto; + z-index: var(--jd-z-index-tooltip) +} + +@media (max-width:768px) { + .jodit-ui-tooltip { + display: none + } +} + +.jodit-ui-tooltip__content { + padding: calc(var(--jd-padding-default)/2) calc(var(--jd-padding-default)*1.5) +} + +.jodit-ui-tooltip.jodit-ui-tooltip_visible_true { + opacity: 1 +} + +.jodit-ui-block { + align-items: center; + display: flex; + justify-content: stretch; + margin-bottom: var(--jd-padding-default) +} + +.jodit-ui-block_width_full { + width: 100% +} + +.jodit-ui-block_align_full { + justify-content: space-between +} + +.jodit-ui-block_align_right { + justify-content: flex-end +} + +.jodit-ui-block_padding_true { + padding: var(--jd-padding-default) +} + +.jodit-ui-label { + color: var(--jd-color-label); + display: block; + font-size: .8em; + margin-bottom: calc(var(--jd-padding-default)/4) +} + +.jodit-ui-input { + display: flex; + flex-direction: column; + margin-bottom: var(--jd-padding-default) +} + +.jodit-ui-input__input { + appearance: none; + background-color: var(--jd-color-white); + border: 0; + border-radius: 0; + box-sizing: border-box; + font-family: var(--jd-font-default); + font-size: var(--jd-font-size-default); + height: var(--jd-input-height); + line-height: 1.2; + outline: none; + padding: 0 var(--jd-padding-default); + width: 100% +} + + .jodit-ui-input__input[disabled] { + background-color: #f0f0f0; + color: var(--jd-color-border) + } + +.jodit-ui-input__input_has-error_true { + border-color: var(--jd-color-red) +} + +.jodit-ui-input__input:focus { + outline: 0 +} + +.jodit-ui-input_theme_dark .jodit-ui-input__input { + background-color: var(--jd-color-gray) +} + +.jodit-ui-input_has-error_true .jodit-ui-input__input { + border-color: var(--jd-color-red) +} + +.jodit-ui-input__error, .jodit-ui-input__label { + color: var(--jd-color-label); + display: block; + font-size: .8em; + margin-bottom: calc(var(--jd-padding-default)/4) +} + +.jodit-ui-input__error, .jodit-ui-input_has-error_true .jodit-ui-input__label { + color: var(--jd-color-error) +} + +.jodit-ui-input__wrapper { + align-items: center; + background-color: var(--jd-color-white); + border: 1px solid var(--jd-color-border); + display: flex; + justify-content: stretch; + min-width: 200px +} + +@media (max-width:480px) { + .jodit-ui-input__wrapper { + min-width: 140px + } +} + +.jodit-ui-input_theme_dark .jodit-ui-input__wrapper { + background-color: var(--jd-color-gray); + border-color: var(--jd-color-border) +} + +.jodit-ui-input_focused_true .jodit-ui-input__wrapper { + border-color: var(--jd-color-border-selected) +} + +.jodit-ui-input__icon:not(:empty) { + align-items: center; + display: flex; + padding: 0 var(--jd-padding-default) +} + + .jodit-ui-input__icon:not(:empty) svg { + height: 16px; + width: 16px; + fill: var(--jd-color-border) + } + + .jodit-ui-input__icon:not(:empty) + .jodit-ui-input__input { + padding-left: 0 + } + +.jodit-ui-input__clear { + align-items: center; + display: flex; + opacity: .8; + padding: 0 var(--jd-padding-default) 0 0 +} + + .jodit-ui-input__clear:active { + opacity: 1; + transform: scale(1.1) + } + + .jodit-ui-input__clear svg { + height: 12px; + width: 12px; + fill: var(--jd-color-border) + } + +.jodit-ui-input_theme_dark .jodit-ui-input__clear svg, .jodit-ui-input_theme_dark .jodit-ui-input__icon svg { + fill: var(--jd-color-dark) +} + +.jodit-ui-block .jodit-ui-input { + margin-bottom: 0 +} + +.jodit-ui-select { + display: flex; + flex-direction: column; + margin-bottom: var(--jd-padding-default) +} + +.jodit-ui-select__input { + appearance: none; + background-color: var(--jd-color-white); + border: 0; + border-radius: 0; + box-sizing: border-box; + font-family: var(--jd-font-default); + font-size: var(--jd-font-size-default); + height: var(--jd-input-height); + line-height: 1.2; + outline: none; + padding: 0 var(--jd-padding-default); + width: 100% +} + + .jodit-ui-select__input[disabled] { + background-color: #f0f0f0; + color: var(--jd-color-border) + } + +.jodit-ui-select__input_has-error_true { + border-color: var(--jd-color-red) +} + +.jodit-ui-select__input:focus { + outline: 0 +} + +.jodit-ui-select_theme_dark .jodit-ui-select__input { + background-color: var(--jd-color-gray) +} + +.jodit-ui-select_has-error_true .jodit-ui-select__input { + border-color: var(--jd-color-red) +} + +.jodit-ui-select__error, .jodit-ui-select__label { + color: var(--jd-color-label); + display: block; + font-size: .8em; + margin-bottom: calc(var(--jd-padding-default)/4) +} + +.jodit-ui-select__error, .jodit-ui-select_has-error_true .jodit-ui-select__label { + color: var(--jd-color-error) +} + +.jodit-ui-select__wrapper { + align-items: center; + background-color: var(--jd-color-white); + border: 1px solid var(--jd-color-border); + display: flex; + justify-content: stretch; + min-width: 200px +} + +@media (max-width:480px) { + .jodit-ui-select__wrapper { + min-width: 140px + } +} + +.jodit-ui-select_theme_dark .jodit-ui-select__wrapper { + background-color: var(--jd-color-gray); + border-color: var(--jd-color-border) +} + +.jodit-ui-select_focused_true .jodit-ui-select__wrapper { + border-color: var(--jd-color-border-selected) +} + +.jodit-ui-select__icon:not(:empty) { + align-items: center; + display: flex; + padding: 0 var(--jd-padding-default) +} + + .jodit-ui-select__icon:not(:empty) svg { + height: 16px; + width: 16px; + fill: var(--jd-color-border) + } + + .jodit-ui-select__icon:not(:empty) + .jodit-ui-select__input { + padding-left: 0 + } + +.jodit-ui-select__clear { + align-items: center; + display: flex; + opacity: .8; + padding: 0 var(--jd-padding-default) 0 0 +} + + .jodit-ui-select__clear:active { + opacity: 1; + transform: scale(1.1) + } + + .jodit-ui-select__clear svg { + height: 12px; + width: 12px; + fill: var(--jd-color-border) + } + +.jodit-ui-select_theme_dark .jodit-ui-select__clear svg, .jodit-ui-select_theme_dark .jodit-ui-select__icon svg { + fill: var(--jd-color-dark) +} + +.jodit-ui-select__input { + background-image: url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIGlkPSJMYXllcl8xIiBkYXRhLW5hbWU9IkxheWVyIDEiIHZpZXdCb3g9IjAgMCA0Ljk1IDEwIj48ZGVmcz48c3R5bGU+LmNscy0ye2ZpbGw6IzQ0NH08L3N0eWxlPjwvZGVmcz48cGF0aCBkPSJNMCAwaDQuOTV2MTBIMHoiIHN0eWxlPSJmaWxsOiNmZmYiLz48cGF0aCBkPSJtMS40MSA0LjY3IDEuMDctMS40OSAxLjA2IDEuNDl6TTMuNTQgNS4zMyAyLjQ4IDYuODIgMS40MSA1LjMzeiIgY2xhc3M9ImNscy0yIi8+PC9zdmc+); + background-position: 98% 50%; + background-repeat: no-repeat; + padding-right: calc(var(--jd-padding-default)*2) +} + +.jodit-ui-select_size_tiny { + margin-bottom: 0 +} + + .jodit-ui-select_size_tiny .jodit-ui-select__input { + --jd-height: calc(var(--jd-input-height)/1.8); + height: var(--jd-height); + line-height: var(--jd-height) + } + +.jodit-ui-select_variant_outline .jodit-ui-select__wrapper { + border: 0 +} + + .jodit-ui-select_variant_outline .jodit-ui-select__wrapper select { + outline: 0 + } + +.jodit-ui-select_width_auto { + width: auto +} + + .jodit-ui-select_width_auto .jodit-ui-select__wrapper { + min-width: auto + } + +.jodit-ui-text-area { + display: flex; + flex-direction: column; + margin-bottom: var(--jd-padding-default); + width: 100% +} + +.jodit-ui-text-area__input { + appearance: none; + background-color: var(--jd-color-white); + border: 0; + border-radius: 0; + box-sizing: border-box; + font-family: var(--jd-font-default); + font-size: var(--jd-font-size-default); + height: var(--jd-input-height); + line-height: 1.2; + outline: none; + padding: 0 var(--jd-padding-default); + width: 100% +} + + .jodit-ui-text-area__input[disabled] { + background-color: #f0f0f0; + color: var(--jd-color-border) + } + +.jodit-ui-text-area__input_has-error_true { + border-color: var(--jd-color-red) +} + +.jodit-ui-text-area__input:focus { + outline: 0 +} + +.jodit-ui-text-area_theme_dark .jodit-ui-text-area__input { + background-color: var(--jd-color-gray) +} + +.jodit-ui-text-area_has-error_true .jodit-ui-text-area__input { + border-color: var(--jd-color-red) +} + +.jodit-ui-text-area__error, .jodit-ui-text-area__label { + color: var(--jd-color-label); + display: block; + font-size: .8em; + margin-bottom: calc(var(--jd-padding-default)/4) +} + +.jodit-ui-text-area__error, .jodit-ui-text-area_has-error_true .jodit-ui-text-area__label { + color: var(--jd-color-error) +} + +.jodit-ui-text-area__wrapper { + align-items: center; + background-color: var(--jd-color-white); + border: 1px solid var(--jd-color-border); + display: flex; + justify-content: stretch; + min-width: 200px +} + +@media (max-width:480px) { + .jodit-ui-text-area__wrapper { + min-width: 140px + } +} + +.jodit-ui-text-area_theme_dark .jodit-ui-text-area__wrapper { + background-color: var(--jd-color-gray); + border-color: var(--jd-color-border) +} + +.jodit-ui-text-area_focused_true .jodit-ui-text-area__wrapper { + border-color: var(--jd-color-border-selected) +} + +.jodit-ui-text-area__icon:not(:empty) { + align-items: center; + display: flex; + padding: 0 var(--jd-padding-default) +} + + .jodit-ui-text-area__icon:not(:empty) svg { + height: 16px; + width: 16px; + fill: var(--jd-color-border) + } + + .jodit-ui-text-area__icon:not(:empty) + .jodit-ui-text-area__input { + padding-left: 0 + } + +.jodit-ui-text-area__clear { + align-items: center; + display: flex; + opacity: .8; + padding: 0 var(--jd-padding-default) 0 0 +} + + .jodit-ui-text-area__clear:active { + opacity: 1; + transform: scale(1.1) + } + + .jodit-ui-text-area__clear svg { + height: 12px; + width: 12px; + fill: var(--jd-color-border) + } + +.jodit-ui-text-area_theme_dark .jodit-ui-text-area__clear svg, .jodit-ui-text-area_theme_dark .jodit-ui-text-area__icon svg { + fill: var(--jd-color-dark) +} + +.jodit-ui-text-area__wrapper { + flex: 1 +} + +.jodit-ui-text-area__input { + height: 100%; + min-height: 60px; + padding: var(--jd-padding-default) +} + +.jodit-ui-checkbox { + align-items: center; + display: flex; + flex-direction: row-reverse; + justify-content: flex-end; + margin-bottom: var(--jd-padding-default) +} + +.jodit-ui-checkbox__input { + margin-right: var(--jd-padding-default) +} + +.jodit-ui-checkbox_switch_true .jodit-ui-checkbox__wrapper { + display: inline-block; + height: 34px; + margin-right: var(--jd-padding-default); + position: relative; + width: 60px +} + + .jodit-ui-checkbox_switch_true .jodit-ui-checkbox__wrapper input { + height: 0; + opacity: 0; + width: 0 + } + +.jodit-ui-checkbox_switch_true .jodit-ui-checkbox__switch-slider { + background-color: #ccc; + border-radius: 34px; + cursor: pointer; + inset: 0; + position: absolute; + transition: .4s +} + + .jodit-ui-checkbox_switch_true .jodit-ui-checkbox__switch-slider:before { + background-color: #fff; + border-radius: 50%; + bottom: 4px; + content: ""; + height: 26px; + left: 4px; + position: absolute; + transition: .4s; + width: 26px + } + +.jodit-ui-checkbox_switch_true.jodit-ui-checkbox_checked_true .jodit-ui-checkbox__switch-slider { + background-color: #2196f3 +} + + .jodit-ui-checkbox_switch_true.jodit-ui-checkbox_checked_true .jodit-ui-checkbox__switch-slider:before { + transform: translateX(26px) + } + +.jodit-ui-checkbox_switch_true.jodit-ui-checkbox_focused_true .jodit-ui-checkbox__switch-slider { + box-shadow: 0 0 1px #2196f3 +} + +.jodit-ui-block .jodit-ui-checkbox { + margin-bottom: 0 +} + +.jodit-ui-file-input { + overflow: hidden; + position: relative +} + +.jodit-ui-file-input__input { + bottom: 0; + cursor: pointer; + font-size: 400px; + margin: 0 calc(var(--jd-padding-default)*-1) 0 0; + opacity: 0; + padding: 0; + position: absolute; + right: 0; + top: 0 +} + +@keyframes a { + 30% { + opacity: .6 + } + + 60% { + opacity: 0 + } + + to { + opacity: .6 + } +} + +.jodit-progress-bar { + border-radius: 1px; + height: 2px; + left: 0; + opacity: .7; + position: absolute; + top: 0; + z-index: 2147483647 +} + + .jodit-progress-bar div { + background: var(--jd-color-background-progress); + height: 2px; + position: relative; + transition: width .5s ease-out,opacity .5s linear; + will-change: width,opacity + } + + .jodit-progress-bar div:after, .jodit-progress-bar div:before { + animation: a 2s ease-out 0s infinite; + border-radius: 100%; + box-shadow: var(--jd-color-background-progress) 1px 0 6px 1px; + content: ""; + display: inline-block; + height: 2px; + opacity: .6; + position: absolute; + top: 0 + } + + .jodit-progress-bar div:before { + right: -80px; + width: 180px; + clip: rect(-6px,90px,14px,-6px) + } + + .jodit-progress-bar div:after { + right: 0; + width: 20px; + clip: rect(-6px,22px,14px,var(--jd-padding-default)) + } + +:root { + --jd-em-color-border: #b6d4fe; + --jd-em-color-bg: #cfe2ff; + --jd-em-color-color: #084298; + --jd-em-border-radius: 0.375rem; + --jd-em-padding: 0.5rem 1rem; + --jd-em-font-size: 1rem +} + +.jodit-ui-messages { + bottom: 0; + height: 0; + overflow: visible; + position: absolute; + right: 0; + width: 0; + z-index: 3 +} + +.jodit-ui-message { + background: var(--jd-em-color-bg); + border: 1px solid var(--jd-em-color-border); + border-radius: var(--jd-em-border-radius); + bottom: 0; + color: var(--jd-em-color-color); + cursor: pointer; + display: block; + font-size: var(--jd-em-font-size); + opacity: 0; + padding: var(--jd-em-padding); + position: absolute; + right: calc(var(--jd-padding-default)/2); + transition: opacity .1s linear,bottom .3s linear,transform .1s ease-out; + white-space: pre +} + +.jodit-ui-message_active_true { + opacity: 1 +} + +.jodit-ui-message:active { + transform: scale(.76) +} + +.jodit-ui-message_variant_secondary { + --jd-em-color-border: #d3d6d8; + --jd-em-color-bg: #e2e3e5; + --jd-em-color-color: #41464b +} + +.jodit-ui-message_variant_danger, .jodit-ui-message_variant_error, .jodit-ui-message_variant_secondary { + background: var(--jd-em-color-bg); + border-color: var(--jd-em-color-border); + color: var(--jd-em-color-color) +} + +.jodit-ui-message_variant_danger, .jodit-ui-message_variant_error { + --jd-em-color-border: #f5c2c7; + --jd-em-color-bg: #f8d7da; + --jd-em-color-color: #842029 +} + +.jodit-ui-message_variant_success { + --jd-em-color-border: #badbcc; + --jd-em-color-bg: #d1e7dd; + --jd-em-color-color: #0f5132; + background: var(--jd-em-color-bg); + border-color: var(--jd-em-color-border); + color: var(--jd-em-color-color) +} + +.jodit-toolbar-collection, .jodit-toolbar-editor-collection { + display: flex; + flex-direction: column +} + +.jodit-toolbar-collection_mode_horizontal, .jodit-toolbar-editor-collection_mode_horizontal { + background-image: repeating-linear-gradient(transparent 0,transparent calc(var(--jd-button-size) - 1px),var(--jd-color-border) var(--jd-button-size)); + position: relative +} + + .jodit-toolbar-collection_mode_horizontal:after, .jodit-toolbar-editor-collection_mode_horizontal:after { + background-color: var(--jd-color-background-default); + bottom: 0; + content: ""; + display: block; + height: 1px; + left: 0; + position: absolute; + width: 100% + } + +.jodit-toolbar-collection_size_tiny, .jodit-toolbar-editor-collection_size_tiny { + --jd-button-icon-size: 8px +} + + .jodit-toolbar-collection_size_tiny.jodit-toolbar-collection_mode_horizontal, .jodit-toolbar-collection_size_tiny.jodit-toolbar-editor-collection_mode_horizontal, .jodit-toolbar-editor-collection_size_tiny.jodit-toolbar-collection_mode_horizontal, .jodit-toolbar-editor-collection_size_tiny.jodit-toolbar-editor-collection_mode_horizontal { + background-image: repeating-linear-gradient(transparent 0,transparent 19px,var(--jd-color-border) 20px) + } + +.jodit-toolbar-collection_size_xsmall, .jodit-toolbar-editor-collection_size_xsmall { + --jd-button-icon-size: 10px +} + + .jodit-toolbar-collection_size_xsmall.jodit-toolbar-collection_mode_horizontal, .jodit-toolbar-collection_size_xsmall.jodit-toolbar-editor-collection_mode_horizontal, .jodit-toolbar-editor-collection_size_xsmall.jodit-toolbar-collection_mode_horizontal, .jodit-toolbar-editor-collection_size_xsmall.jodit-toolbar-editor-collection_mode_horizontal { + background-image: repeating-linear-gradient(transparent 0,transparent 25px,var(--jd-color-border) 26px) + } + +.jodit-toolbar-collection_size_small, .jodit-toolbar-editor-collection_size_small { + --jd-button-icon-size: 12px +} + + .jodit-toolbar-collection_size_small.jodit-toolbar-collection_mode_horizontal, .jodit-toolbar-collection_size_small.jodit-toolbar-editor-collection_mode_horizontal, .jodit-toolbar-editor-collection_size_small.jodit-toolbar-collection_mode_horizontal, .jodit-toolbar-editor-collection_size_small.jodit-toolbar-editor-collection_mode_horizontal { + background-image: repeating-linear-gradient(transparent 0,transparent 31px,var(--jd-color-border) 32px) + } + +.jodit-toolbar-collection_size_middle, .jodit-toolbar-editor-collection_size_middle { + --jd-button-icon-size: 14px +} + + .jodit-toolbar-collection_size_middle.jodit-toolbar-collection_mode_horizontal, .jodit-toolbar-collection_size_middle.jodit-toolbar-editor-collection_mode_horizontal, .jodit-toolbar-editor-collection_size_middle.jodit-toolbar-collection_mode_horizontal, .jodit-toolbar-editor-collection_size_middle.jodit-toolbar-editor-collection_mode_horizontal { + background-image: repeating-linear-gradient(transparent 0,transparent 37px,var(--jd-color-border) 38px) + } + +.jodit-toolbar-collection_size_large, .jodit-toolbar-editor-collection_size_large { + --jd-button-icon-size: 16px +} + + .jodit-toolbar-collection_size_large.jodit-toolbar-collection_mode_horizontal, .jodit-toolbar-collection_size_large.jodit-toolbar-editor-collection_mode_horizontal, .jodit-toolbar-editor-collection_size_large.jodit-toolbar-collection_mode_horizontal, .jodit-toolbar-editor-collection_size_large.jodit-toolbar-editor-collection_mode_horizontal { + background-image: repeating-linear-gradient(transparent 0,transparent 43px,var(--jd-color-border) 44px) + } + +.jodit-toolbar-collection_mode_vertical .jodit-ui-group, .jodit-toolbar-editor-collection_mode_vertical .jodit-ui-group { + background-color: transparent; + border: 0; + flex-direction: column +} + +.jodit-toolbar-collection_mode_vertical .jodit-toolbar-button, .jodit-toolbar-editor-collection_mode_vertical .jodit-toolbar-button { + height: auto; + min-height: var(--jd-button-size) +} + +.jodit-toolbar-collection_mode_vertical .jodit-toolbar-button__button, .jodit-toolbar-editor-collection_mode_vertical .jodit-toolbar-button__button { + cursor: pointer; + height: auto; + min-height: var(--jd-button-size); + width: 100% +} + +.jodit-toolbar-collection_mode_vertical .jodit-toolbar-button__text:not(:empty), .jodit-toolbar-editor-collection_mode_vertical .jodit-toolbar-button__text:not(:empty) { + justify-content: left +} + +.jodit-toolbar-collection .jodit-toolbar-button, .jodit-toolbar-collection .jodit-toolbar-content, .jodit-toolbar-collection .jodit-toolbar-select, .jodit-toolbar-editor-collection .jodit-toolbar-button, .jodit-toolbar-editor-collection .jodit-toolbar-content, .jodit-toolbar-editor-collection .jodit-toolbar-select { + margin: var(--jd-margin-v) 1px; + padding: 0 +} + +.jodit-dialog .jodit-toolbar-collection_mode_horizontal, .jodit-dialog .jodit-toolbar-editor-collection_mode_horizontal { + background-image: none +} + +:root { + --jd-button-trigger-size: 14px +} + +.jodit-toolbar-button { + align-items: center; + border: 1px solid transparent; + border-radius: var(--jd-border-radius-default); + display: flex; + height: 34px; + justify-content: center; + min-width: 34px; + overflow: hidden +} + +.jodit-toolbar-button__icon { + display: none +} + + .jodit-toolbar-button__icon:not(:empty) { + display: inline-flex + } + +.jodit-toolbar-button__text { + display: none +} + + .jodit-toolbar-button__text:not(:empty) { + display: inline-flex; + flex-grow: 1; + font-family: var(--jd-font-default); + font-size: var(--jd-font-size-default); + justify-content: center + } + +.jodit-toolbar-button_context_menu .jodit-toolbar-button__text { + justify-content: left; + padding-left: var(--jd-padding-default); + position: relative +} + + .jodit-toolbar-button_context_menu .jodit-toolbar-button__text:before { + border-left: 1px solid var(--jd-color-border); + content: ""; + height: 35px; + left: 0; + position: absolute; + top: calc(var(--jd-padding-default)*-1) + } + +.jodit-toolbar-button__icon:not(:empty) + .jodit-toolbar-button__text:not(:empty) { + margin-left: var(--jd-padding-default) +} + +.jodit-toolbar-button__icon:empty + .jodit-toolbar-button__text:not(:empty) { + padding: 0 var(--jd-padding-default); + padding: 0 +} + +.jodit-toolbar-button .jodit-icon { + height: 14px; + width: 14px +} + +.jodit-toolbar-button button { + appearance: none; + height: 34px; + min-width: 34px; + padding: 0 +} + +.jodit-toolbar-button_text-icons_true button { + padding: 0 var(--jd-padding-default) +} + +.jodit-toolbar-button_size_tiny { + height: 16px; + min-width: 16px +} + + .jodit-toolbar-button_size_tiny .jodit-icon { + height: 8px; + width: 8px + } + + .jodit-toolbar-button_size_tiny button { + appearance: none; + height: 16px; + min-width: 16px; + padding: 0 + } + +.jodit-toolbar-button_size_tiny_text-icons_true button { + padding: 0 var(--jd-padding-default) +} + +.jodit-toolbar-button_size_xsmall { + height: 22px; + min-width: 22px +} + + .jodit-toolbar-button_size_xsmall .jodit-icon { + height: 10px; + width: 10px + } + + .jodit-toolbar-button_size_xsmall button { + appearance: none; + height: 22px; + min-width: 22px; + padding: 0 + } + +.jodit-toolbar-button_size_xsmall_text-icons_true button { + padding: 0 var(--jd-padding-default) +} + +.jodit-toolbar-button_size_small { + height: 28px; + min-width: 28px +} + + .jodit-toolbar-button_size_small .jodit-icon { + height: 12px; + width: 12px + } + + .jodit-toolbar-button_size_small button { + appearance: none; + height: 28px; + min-width: 28px; + padding: 0 + } + +.jodit-toolbar-button_size_small_text-icons_true button { + padding: 0 var(--jd-padding-default) +} + +.jodit-toolbar-button_size_large { + height: 40px; + min-width: 40px +} + + .jodit-toolbar-button_size_large .jodit-icon { + height: 16px; + width: 16px + } + + .jodit-toolbar-button_size_large button { + appearance: none; + height: 40px; + min-width: 40px; + padding: 0 + } + +.jodit-toolbar-button_size_large_text-icons_true button { + padding: 0 var(--jd-padding-default) +} + +.jodit-toolbar-button__button { + align-items: center; + appearance: none; + background: 0 0; + border: 0; + border-radius: var(--jd-border-radius-default); + box-shadow: none; + box-sizing: border-box; + color: var(--jd-color-text-icons); + cursor: pointer; + display: inline-flex; + font-style: normal; + justify-content: center; + outline: 0; + padding: 0; + padding: 0 var(--jd-padding-default); + position: relative; + text-align: center; + text-decoration: none; + text-transform: none; + user-select: none +} + + .jodit-toolbar-button__button:focus-visible:not([disabled]), .jodit-toolbar-button__button:hover:not([disabled]) { + background-color: var(--jd-color-button-background-hover); + opacity: 1; + outline: 0 + } + + .jodit-toolbar-button__button:active:not([disabled]), .jodit-toolbar-button__button[aria-pressed=true]:not([disabled]) { + background-color: var(--jd-color-button-background-hover-opacity40); + outline: 0 + } + + .jodit-toolbar-button__button[aria-pressed=true]:hover:not([disabled]) { + background-color: var(--jd-color-button-background-hover-opacity60) + } + + .jodit-toolbar-button__button[disabled] { + opacity: .3; + pointer-events: none + } + +.jodit-toolbar-button__trigger { + align-items: center; + border-radius: 0 var(--jd-border-radius-default) var(--jd-border-radius-default) 0; + cursor: pointer; + display: flex; + height: 100%; + justify-content: center; + opacity: .4; + --jd-button-trigger-size: 14px; + width: calc(var(--jd-button-trigger-size, 14px) + 2px) +} + + .jodit-toolbar-button__trigger:focus-visible:not([disabled]), .jodit-toolbar-button__trigger:hover:not([disabled]) { + background-color: var(--jd-color-button-background-hover); + opacity: 1; + outline: 0 + } + + .jodit-toolbar-button__trigger:active:not([disabled]), .jodit-toolbar-button__trigger[aria-pressed=true]:not([disabled]) { + background-color: var(--jd-color-button-background-hover-opacity40); + outline: 0 + } + + .jodit-toolbar-button__trigger[aria-pressed=true]:hover:not([disabled]) { + background-color: var(--jd-color-button-background-hover-opacity60) + } + + .jodit-toolbar-button__trigger[disabled] { + opacity: .3; + pointer-events: none + } + + .jodit-toolbar-button__trigger svg { + width: calc(var(--jd-button-trigger-size, 14px) - 4px) + } + +.jodit-toolbar-button_size_tiny .jodit-toolbar-button__trigger { + --jd-button-trigger-size: 8px; + width: calc(var(--jd-button-trigger-size, 8px) + 2px) +} + + .jodit-toolbar-button_size_tiny .jodit-toolbar-button__trigger svg { + width: calc(var(--jd-button-trigger-size, 8px) - 4px) + } + +.jodit-toolbar-button_size_xsmall .jodit-toolbar-button__trigger { + --jd-button-trigger-size: 10px; + width: calc(var(--jd-button-trigger-size, 10px) + 2px) +} + + .jodit-toolbar-button_size_xsmall .jodit-toolbar-button__trigger svg { + width: calc(var(--jd-button-trigger-size, 10px) - 4px) + } + +.jodit-toolbar-button_size_small .jodit-toolbar-button__trigger { + --jd-button-trigger-size: 12px; + width: calc(var(--jd-button-trigger-size, 12px) + 2px) +} + + .jodit-toolbar-button_size_small .jodit-toolbar-button__trigger svg { + width: calc(var(--jd-button-trigger-size, 12px) - 4px) + } + +.jodit-toolbar-button_size_large .jodit-toolbar-button__trigger { + --jd-button-trigger-size: 16px; + width: calc(var(--jd-button-trigger-size, 16px) + 2px) +} + + .jodit-toolbar-button_size_large .jodit-toolbar-button__trigger svg { + width: calc(var(--jd-button-trigger-size, 16px) - 4px) + } + +.jodit-toolbar-button_with-trigger_true .jodit-toolbar-button__button { + border-radius: var(--jd-border-radius-default) 0 0 var(--jd-border-radius-default) +} + +.jodit-toolbar-button_with-trigger_true:hover:not([disabled]) { + border-color: var(--jd-color-border) +} + +.jodit-toolbar-button_stroke_false svg { + stroke: none +} + +.jodit-toolbar-content { + align-items: center; + appearance: none; + background: 0 0; + border: 1px solid transparent; + border-radius: var(--jd-border-radius-default); + box-shadow: none; + box-sizing: border-box; + color: var(--jd-color-text-icons); + cursor: pointer; + display: inline-flex; + font-style: normal; + height: 34px; + justify-content: center; + min-width: 34px; + outline: 0; + padding: 0; + position: relative; + text-align: center; + text-decoration: none; + text-transform: none; + user-select: none +} + + .jodit-toolbar-content:focus-visible:not([disabled]), .jodit-toolbar-content:hover:not([disabled]) { + background-color: var(--jd-color-button-background-hover); + opacity: 1; + outline: 0 + } + + .jodit-toolbar-content:active:not([disabled]), .jodit-toolbar-content[aria-pressed=true]:not([disabled]) { + background-color: var(--jd-color-button-background-hover-opacity40); + outline: 0 + } + + .jodit-toolbar-content[aria-pressed=true]:hover:not([disabled]) { + background-color: var(--jd-color-button-background-hover-opacity60) + } + + .jodit-toolbar-content[disabled] { + opacity: .3; + pointer-events: none + } + + .jodit-toolbar-content .jodit-icon { + height: 14px; + width: 14px + } + + .jodit-toolbar-content button { + appearance: none; + height: 34px; + min-width: 34px; + padding: 0 + } + +.jodit-toolbar-content_text-icons_true button { + padding: 0 var(--jd-padding-default) +} + +.jodit-toolbar-content_size_tiny { + height: 16px; + min-width: 16px +} + + .jodit-toolbar-content_size_tiny .jodit-icon { + height: 8px; + width: 8px + } + + .jodit-toolbar-content_size_tiny button { + appearance: none; + height: 16px; + min-width: 16px; + padding: 0 + } + +.jodit-toolbar-content_size_tiny_text-icons_true button { + padding: 0 var(--jd-padding-default) +} + +.jodit-toolbar-content_size_xsmall { + height: 22px; + min-width: 22px +} + + .jodit-toolbar-content_size_xsmall .jodit-icon { + height: 10px; + width: 10px + } + + .jodit-toolbar-content_size_xsmall button { + appearance: none; + height: 22px; + min-width: 22px; + padding: 0 + } + +.jodit-toolbar-content_size_xsmall_text-icons_true button { + padding: 0 var(--jd-padding-default) +} + +.jodit-toolbar-content_size_small { + height: 28px; + min-width: 28px +} + + .jodit-toolbar-content_size_small .jodit-icon { + height: 12px; + width: 12px + } + + .jodit-toolbar-content_size_small button { + appearance: none; + height: 28px; + min-width: 28px; + padding: 0 + } + +.jodit-toolbar-content_size_small_text-icons_true button { + padding: 0 var(--jd-padding-default) +} + +.jodit-toolbar-content_size_large { + height: 40px; + min-width: 40px +} + + .jodit-toolbar-content_size_large .jodit-icon { + height: 16px; + width: 16px + } + + .jodit-toolbar-content_size_large button { + appearance: none; + height: 40px; + min-width: 40px; + padding: 0 + } + +.jodit-toolbar-content_size_large_text-icons_true button { + padding: 0 var(--jd-padding-default) +} + +.jodit-toolbar-content__icon { + display: none +} + + .jodit-toolbar-content__icon:not(:empty) { + display: inline-flex + } + +.jodit-toolbar-content__text { + display: none +} + + .jodit-toolbar-content__text:not(:empty) { + display: inline-flex; + flex-grow: 1; + font-family: var(--jd-font-default); + font-size: var(--jd-font-size-default); + justify-content: center + } + +.jodit-toolbar-content_context_menu .jodit-toolbar-content__text { + justify-content: left; + padding-left: var(--jd-padding-default); + position: relative +} + + .jodit-toolbar-content_context_menu .jodit-toolbar-content__text:before { + border-left: 1px solid var(--jd-color-border); + content: ""; + height: 35px; + left: 0; + position: absolute; + top: calc(var(--jd-padding-default)*-1) + } + +.jodit-toolbar-content__icon:not(:empty) + .jodit-toolbar-content__text:not(:empty) { + margin-left: var(--jd-padding-default) +} + +.jodit-toolbar-content__icon:empty + .jodit-toolbar-content__text:not(:empty) { + padding: 0 var(--jd-padding-default) +} + +.jodit-toolbar-content:focus:not([disabled]) { + outline: 1px dashed var(--jd-color-background-selection) +} + +.jodit-toolbar-content_variant_outline { + border: 1px solid var(--jd-color-border) +} + +.jodit-toolbar-content_variant_default { + background-color: #e3e3e3; + color: #212529 +} + + .jodit-toolbar-content_variant_default svg { + fill: #212529; + stroke: #212529 + } + + .jodit-toolbar-content_variant_default [disabled] { + opacity: .7 + } + + .jodit-toolbar-content_variant_default:hover:not([disabled]) { + background-color: #c9cdd1; + color: #212529 + } + + .jodit-toolbar-content_variant_default:hover:not([disabled]) svg { + fill: #212529; + stroke: #212529 + } + + .jodit-toolbar-content_variant_default:active:not([disabled]) { + background-color: #dae0e5; + color: #212529 + } + + .jodit-toolbar-content_variant_default:active:not([disabled]) svg { + fill: #212529; + stroke: #212529 + } + + .jodit-toolbar-content_variant_default:focus:not([disabled]) { + outline: 1px dashed #dae0e5 + } + +.jodit-toolbar-content_variant_primary { + background-color: #007bff; + color: #fff +} + + .jodit-toolbar-content_variant_primary svg { + fill: #fff; + stroke: #fff + } + + .jodit-toolbar-content_variant_primary [disabled] { + opacity: .7 + } + + .jodit-toolbar-content_variant_primary:hover:not([disabled]) { + background-color: #0069d9; + color: #fff + } + + .jodit-toolbar-content_variant_primary:hover:not([disabled]) svg { + fill: #fff; + stroke: #fff + } + + .jodit-toolbar-content_variant_primary:active:not([disabled]) { + background-color: #0062cc; + color: #fff + } + + .jodit-toolbar-content_variant_primary:active:not([disabled]) svg { + fill: #fff; + stroke: #fff + } + + .jodit-toolbar-content_variant_primary:focus:not([disabled]) { + outline: 1px dashed #0062cc + } + +.jodit-toolbar-content_variant_secondary { + background-color: #d8d8d8; + border-radius: 0; + color: #212529 +} + + .jodit-toolbar-content_variant_secondary svg { + fill: #212529; + stroke: #212529 + } + + .jodit-toolbar-content_variant_secondary [disabled] { + opacity: .7 + } + + .jodit-toolbar-content_variant_secondary:hover:not([disabled]) { + background-color: #c9cdd1; + color: #212529 + } + + .jodit-toolbar-content_variant_secondary:hover:not([disabled]) svg { + fill: #212529; + stroke: #212529 + } + + .jodit-toolbar-content_variant_secondary:active:not([disabled]) { + background-color: #dae0e5; + color: #212529 + } + + .jodit-toolbar-content_variant_secondary:active:not([disabled]) svg { + fill: #212529; + stroke: #212529 + } + + .jodit-toolbar-content_variant_secondary:focus:not([disabled]) { + outline: 1px dashed #dae0e5 + } + +.jodit-toolbar-content_variant_success { + background-color: #28a745; + color: #fff +} + + .jodit-toolbar-content_variant_success svg { + fill: #fff; + stroke: #fff + } + + .jodit-toolbar-content_variant_success [disabled] { + opacity: .7 + } + + .jodit-toolbar-content_variant_success:hover:not([disabled]) { + background-color: #218838; + color: #fff + } + + .jodit-toolbar-content_variant_success:hover:not([disabled]) svg { + fill: #fff; + stroke: #fff + } + + .jodit-toolbar-content_variant_success:active:not([disabled]) { + background-color: #1e7e34; + color: #fff + } + + .jodit-toolbar-content_variant_success:active:not([disabled]) svg { + fill: #fff; + stroke: #fff + } + + .jodit-toolbar-content_variant_success:focus:not([disabled]) { + outline: 1px dashed #1e7e34 + } + +.jodit-toolbar-content_variant_danger { + background-color: #dc3545; + color: #fff +} + + .jodit-toolbar-content_variant_danger svg { + fill: #fff; + stroke: #fff + } + + .jodit-toolbar-content_variant_danger [disabled] { + opacity: .7 + } + + .jodit-toolbar-content_variant_danger:hover:not([disabled]) { + background-color: #c82333; + color: #fff + } + + .jodit-toolbar-content_variant_danger:hover:not([disabled]) svg { + fill: #fff; + stroke: #fff + } + + .jodit-toolbar-content_variant_danger:active:not([disabled]) { + background-color: #bd2130; + color: #fff + } + + .jodit-toolbar-content_variant_danger:active:not([disabled]) svg { + fill: #fff; + stroke: #fff + } + + .jodit-toolbar-content_variant_danger:focus:not([disabled]) { + outline: 1px dashed #bd2130 + } + +.jodit-toolbar-content:hover:not([disabled]) { + background-color: transparent; + opacity: 1; + outline: 0 +} + +.jodit-toolbar-select { + --jd-color-button-background-hover-opacity40: hsla(0,0%,86%,.2); + --jd-color-button-background-hover-opacity60: hsla(0,0%,86%,.1); + align-items: center; + border: 1px solid transparent; + border-radius: var(--jd-border-radius-default); + cursor: pointer; + display: flex; + height: 34px; + justify-content: center; + justify-content: space-between; + min-width: 34px; + min-width: 100px; + overflow: hidden +} + +.jodit-toolbar-select__icon { + display: none +} + + .jodit-toolbar-select__icon:not(:empty) { + display: inline-flex + } + +.jodit-toolbar-select__text { + display: none +} + + .jodit-toolbar-select__text:not(:empty) { + display: inline-flex; + flex-grow: 1; + font-family: var(--jd-font-default); + font-size: var(--jd-font-size-default); + justify-content: center + } + +.jodit-toolbar-select_context_menu .jodit-toolbar-select__text { + justify-content: left; + padding-left: var(--jd-padding-default); + position: relative +} + + .jodit-toolbar-select_context_menu .jodit-toolbar-select__text:before { + border-left: 1px solid var(--jd-color-border); + content: ""; + height: 35px; + left: 0; + position: absolute; + top: calc(var(--jd-padding-default)*-1) + } + +.jodit-toolbar-select__icon:not(:empty) + .jodit-toolbar-select__text:not(:empty) { + margin-left: var(--jd-padding-default) +} + +.jodit-toolbar-select__icon:empty + .jodit-toolbar-select__text:not(:empty) { + padding: 0 var(--jd-padding-default); + padding: 0 +} + +.jodit-toolbar-select .jodit-icon { + height: 14px; + width: 14px +} + +.jodit-toolbar-select button { + appearance: none; + height: 34px; + min-width: 34px; + padding: 0 +} + +.jodit-toolbar-select_text-icons_true button { + padding: 0 var(--jd-padding-default) +} + +.jodit-toolbar-select_size_tiny { + height: 16px; + min-width: 16px +} + + .jodit-toolbar-select_size_tiny .jodit-icon { + height: 8px; + width: 8px + } + + .jodit-toolbar-select_size_tiny button { + appearance: none; + height: 16px; + min-width: 16px; + padding: 0 + } + +.jodit-toolbar-select_size_tiny_text-icons_true button { + padding: 0 var(--jd-padding-default) +} + +.jodit-toolbar-select_size_xsmall { + height: 22px; + min-width: 22px +} + + .jodit-toolbar-select_size_xsmall .jodit-icon { + height: 10px; + width: 10px + } + + .jodit-toolbar-select_size_xsmall button { + appearance: none; + height: 22px; + min-width: 22px; + padding: 0 + } + +.jodit-toolbar-select_size_xsmall_text-icons_true button { + padding: 0 var(--jd-padding-default) +} + +.jodit-toolbar-select_size_small { + height: 28px; + min-width: 28px +} + + .jodit-toolbar-select_size_small .jodit-icon { + height: 12px; + width: 12px + } + + .jodit-toolbar-select_size_small button { + appearance: none; + height: 28px; + min-width: 28px; + padding: 0 + } + +.jodit-toolbar-select_size_small_text-icons_true button { + padding: 0 var(--jd-padding-default) +} + +.jodit-toolbar-select_size_large { + height: 40px; + min-width: 40px +} + + .jodit-toolbar-select_size_large .jodit-icon { + height: 16px; + width: 16px + } + + .jodit-toolbar-select_size_large button { + appearance: none; + height: 40px; + min-width: 40px; + padding: 0 + } + +.jodit-toolbar-select_size_large_text-icons_true button { + padding: 0 var(--jd-padding-default) +} + +.jodit-toolbar-select__button { + align-items: center; + appearance: none; + background: 0 0; + border: 0; + border-radius: var(--jd-border-radius-default); + box-shadow: none; + box-sizing: border-box; + color: var(--jd-color-text-icons); + cursor: pointer; + display: inline-flex; + font-style: normal; + justify-content: center; + outline: 0; + padding: 0; + padding: 0 var(--jd-padding-default); + position: relative; + text-align: center; + text-decoration: none; + text-transform: none; + user-select: none +} + + .jodit-toolbar-select__button:focus-visible:not([disabled]), .jodit-toolbar-select__button:hover:not([disabled]) { + background-color: var(--jd-color-button-background-hover); + opacity: 1; + outline: 0 + } + + .jodit-toolbar-select__button:active:not([disabled]), .jodit-toolbar-select__button[aria-pressed=true]:not([disabled]) { + background-color: var(--jd-color-button-background-hover-opacity40); + outline: 0 + } + + .jodit-toolbar-select__button[aria-pressed=true]:hover:not([disabled]) { + background-color: var(--jd-color-button-background-hover-opacity60) + } + + .jodit-toolbar-select__button[disabled] { + opacity: .3; + pointer-events: none + } + +.jodit-toolbar-select__trigger { + align-items: center; + border-radius: 0 var(--jd-border-radius-default) var(--jd-border-radius-default) 0; + cursor: pointer; + display: flex; + height: 100%; + justify-content: center; + opacity: .4; + --jd-button-trigger-size: 14px; + width: calc(var(--jd-button-trigger-size, 14px) + 2px) +} + + .jodit-toolbar-select__trigger:focus-visible:not([disabled]), .jodit-toolbar-select__trigger:hover:not([disabled]) { + background-color: var(--jd-color-button-background-hover); + opacity: 1; + outline: 0 + } + + .jodit-toolbar-select__trigger:active:not([disabled]), .jodit-toolbar-select__trigger[aria-pressed=true]:not([disabled]) { + background-color: var(--jd-color-button-background-hover-opacity40); + outline: 0 + } + + .jodit-toolbar-select__trigger[aria-pressed=true]:hover:not([disabled]) { + background-color: var(--jd-color-button-background-hover-opacity60) + } + + .jodit-toolbar-select__trigger[disabled] { + opacity: .3; + pointer-events: none + } + + .jodit-toolbar-select__trigger svg { + width: calc(var(--jd-button-trigger-size, 14px) - 4px) + } + +.jodit-toolbar-select_size_tiny .jodit-toolbar-select__trigger { + --jd-button-trigger-size: 8px; + width: calc(var(--jd-button-trigger-size, 8px) + 2px) +} + + .jodit-toolbar-select_size_tiny .jodit-toolbar-select__trigger svg { + width: calc(var(--jd-button-trigger-size, 8px) - 4px) + } + +.jodit-toolbar-select_size_xsmall .jodit-toolbar-select__trigger { + --jd-button-trigger-size: 10px; + width: calc(var(--jd-button-trigger-size, 10px) + 2px) +} + + .jodit-toolbar-select_size_xsmall .jodit-toolbar-select__trigger svg { + width: calc(var(--jd-button-trigger-size, 10px) - 4px) + } + +.jodit-toolbar-select_size_small .jodit-toolbar-select__trigger { + --jd-button-trigger-size: 12px; + width: calc(var(--jd-button-trigger-size, 12px) + 2px) +} + + .jodit-toolbar-select_size_small .jodit-toolbar-select__trigger svg { + width: calc(var(--jd-button-trigger-size, 12px) - 4px) + } + +.jodit-toolbar-select_size_large .jodit-toolbar-select__trigger { + --jd-button-trigger-size: 16px; + width: calc(var(--jd-button-trigger-size, 16px) + 2px) +} + + .jodit-toolbar-select_size_large .jodit-toolbar-select__trigger svg { + width: calc(var(--jd-button-trigger-size, 16px) - 4px) + } + +.jodit-toolbar-select_with-trigger_true .jodit-toolbar-button__button { + border-radius: var(--jd-border-radius-default) 0 0 var(--jd-border-radius-default) +} + +.jodit-toolbar-select_with-trigger_true:hover:not([disabled]) { + border-color: var(--jd-color-border) +} + +.jodit-toolbar-select_stroke_false svg { + stroke: none +} + +.jodit-toolbar-select:focus-visible:not([disabled]), .jodit-toolbar-select:hover:not([disabled]) { + background-color: var(--jd-color-button-background-hover); + opacity: 1; + outline: 0 +} + +.jodit-toolbar-select:active:not([disabled]), .jodit-toolbar-select[aria-pressed=true]:not([disabled]) { + background-color: var(--jd-color-button-background-hover-opacity40); + outline: 0 +} + +.jodit-toolbar-select[aria-pressed=true]:hover:not([disabled]) { + background-color: var(--jd-color-button-background-hover-opacity60) +} + +.jodit-toolbar-select[disabled] { + opacity: .3; + pointer-events: none +} + +.jodit-toolbar-select__text:not(:empty) { + justify-content: left +} + +.jodit-toolbar-select__button { + flex: 1 +} + +.jodit-toolbar__box:not(:empty) { + --jd-color-background-default: var(--jd-color-panel); + background-color: var(--jd-color-background-default); + border-bottom: 1px solid var(--jd-color-border); + border-radius: var(--jd-border-radius-default) var(--jd-border-radius-default) 0 0; + overflow: hidden +} + + .jodit-toolbar__box:not(:empty) .jodit-toolbar-editor-collection:after { + background-color: var(--jd-color-panel) + } + +.jodit-dialog { + border: 0; + box-sizing: border-box; + display: none; + font-family: var(--jd-font-default); + font-size: var(--jd-font-size-default); + height: 0; + position: absolute; + width: 0; + will-change: left,top,width,height +} + +.jodit-dialog_moved_true { + user-select: none +} + +.jodit-dialog * { + box-sizing: border-box +} + +.jodit-dialog .jodit_elfinder, .jodit-dialog .jodit_elfinder * { + box-sizing: initial +} + +.jodit-dialog__overlay { + background-color: rgba(0,0,0,.5); + display: none; + height: 100%; + left: 0; + overflow: auto; + position: fixed; + text-align: center; + top: 0; + white-space: nowrap; + width: 100%; + z-index: var(--jd-z-index-dialog-overlay) +} + +.jodit-dialog_static_true .jodit-dialog__overlay { + display: none +} + +.jodit-dialog_active_true, .jodit-dialog_modal_true .jodit-dialog__overlay { + display: block +} + +.jodit-dialog__panel { + background-color: #fff; + display: flex; + flex-flow: column nowrap; + left: 0; + max-height: 100%; + max-width: 100%; + min-height: 100px; + min-width: 200px; + position: fixed; + top: 0; + z-index: var(--jd-z-index-dialog); + --jd-box-shadow-blur: calc(var(--jd-padding-default)*2); + --jd-box-shadow-1: 0 var(--jd-padding-default) var(--jd-box-shadow-blur) rgba(0,0,0,.19); + box-shadow: var(--jd-box-shadow-1),0 6px 6px rgba(0,0,0,.23); + text-align: left; + white-space: normal +} + +@media (max-width:480px) { + .jodit-dialog:not(.jodit-dialog_adaptive_false) .jodit-dialog__panel { + height: 100% !important; + left: 0 !important; + max-width: 100%; + top: 0 !important; + width: 100% !important + } +} + +.jodit-dialog_static_true { + box-sizing: border-box; + display: block; + height: auto; + position: relative; + width: auto; + z-index: inherit +} + + .jodit-dialog_static_true .jodit-dialog__panel { + border: 1px solid var(--jd-color-border); + box-shadow: none; + left: auto !important; + position: relative; + top: auto !important; + width: 100% !important; + z-index: inherit + } + +.jodit-dialog_theme_dark, .jodit-dialog_theme_dark .jodit-dialog__panel { + background-color: var(--jd-dark-background-darknes); + color: var(--jd-dark-text-color) +} + +.jodit-dialog__header { + border-bottom: 1px solid var(--jd-color-border); + cursor: move; + display: flex; + justify-content: space-between; + min-height: 50px; + text-align: left +} + +.jodit-dialog__header-title, .jodit-dialog__header-toolbar { + align-items: center; + display: flex; + flex-shrink: 3; + font-size: 18px; + font-weight: 400; + line-height: 48px; + margin: 0; + padding: 0 var(--jd-padding-default); + vertical-align: top +} + +@media (max-width:480px) { + .jodit-dialog__header-toolbar { + padding-left: 0 + } +} + +.jodit-dialog__header-button { + color: #222; + flex-basis: 48px; + font-size: 28px; + height: 48px; + line-height: 48px; + text-align: center; + text-decoration: none; + transition: background-color .2s ease 0s +} + + .jodit-dialog__header-button:hover { + background-color: var(--jd-color-background-button-hover) + } + +.jodit-dialog__header .jodit_toolbar { + background: transparent; + border: 0; + box-shadow: none +} + + .jodit-dialog__header .jodit_toolbar > li.jodit-toolbar-button .jodit-input { + padding-left: var(--jd-padding-default); + width: auto + } + +@media (max-width:480px) { + .jodit-dialog:not(.jodit-dialog_adaptive_false) .jodit-dialog__header { + flex-direction: column + } +} + +.jodit-dialog_slim_true .jodit-dialog__header { + min-height: 10px +} + +.jodit-dialog_slim_true .jodit-dialog__header-title, .jodit-dialog_slim_true .jodit-dialog__header-toolbar { + padding: 0 calc(var(--jd-padding-default)/4) +} + +.jodit-dialog_theme_dark .jodit-dialog__header { + border-color: var(--jd-color-dark) +} + +.jodit-dialog_fullsize_true .jodit-dialog__header { + cursor: default +} + +.jodit-dialog__content { + flex: 1; + min-height: 100px; + overflow: auto +} + + .jodit-dialog__content .jodit-form__group { + margin-bottom: calc(var(--jd-padding-default)*1.5); + padding: 0 var(--jd-padding-default) + } + + .jodit-dialog__content .jodit-form__group:first-child { + margin-top: var(--jd-padding-default) + } + + .jodit-dialog__content .jodit-form__group .jodit-input_group { + border-collapse: separate; + display: table; + width: 100% + } + + .jodit-dialog__content .jodit-form__group .jodit-input_group > * { + display: table-cell; + height: 34px; + vertical-align: middle + } + + .jodit-dialog__content .jodit-form__group .jodit-input_group > input { + margin: 0 !important + } + + .jodit-dialog__content .jodit-form__group .jodit-input_group > input:not([class*=col-]) { + width: 100% + } + + .jodit-dialog__content .jodit-form__group .jodit-input_group-buttons { + font-size: 0; + vertical-align: middle; + white-space: nowrap; + width: 1% + } + + .jodit-dialog__content .jodit-form__group .jodit-input_group-buttons > .jodit-button { + border: 1px solid var(--jd-color-border); + border-radius: 0; + height: 34px; + line-height: 34px; + margin-left: -1px + } + +.jodit-dialog__footer { + display: none; + flex-wrap: nowrap; + justify-content: space-between; + padding: var(--jd-padding-default) +} + + .jodit-dialog__footer button { + margin-right: calc(var(--jd-padding-default)/2) + } + + .jodit-dialog__footer button:last-child { + margin-right: 0 + } + +.jodit-dialog__column { + display: flex +} + +.jodit-dialog__resizer { + display: none; + position: relative +} + + .jodit-dialog__resizer svg { + bottom: 0; + cursor: nwse-resize; + height: 12px; + overflow: hidden; + position: absolute; + right: 0; + width: 12px; + fill: var(--jd-color-gray-dark); + user-select: none + } + +.jodit-dialog_resizable_true .jodit-dialog__resizer { + display: block +} + +@media (max-width:480px) { + .jodit-dialog__resizer { + display: none + } +} + +.jodit-dialog_prompt { + max-width: 300px; + min-width: 200px; + padding: var(--jd-padding-default); + word-break: break-all +} + + .jodit-dialog_prompt label { + display: block; + margin-bottom: calc(var(--jd-padding-default)/2) + } + +.jodit-dialog_alert { + max-width: 300px; + min-width: 200px; + padding: var(--jd-padding-default); + word-break: break-all +} + +.jodit-dialog_footer_true .jodit-dialog__footer { + display: flex +} + +.jodit_fullsize .jodit-dialog__panel { + height: 100% !important; + inset: 0 !important; + width: 100% !important +} + + .jodit_fullsize .jodit-dialog__panel .jodit-dialog__resizer { + display: none + } + +.jodit-dialog .jodit-ui-messages { + z-index: var(--jd-z-index-dialog) +} + +:root { + --jd-image-editor-resizer-border-color: #05ff00; + --jd-image-editor-resizer-target-size: padding-default; + --jd-image-editor-resizer-target-border-color: #383838; + --jd-image-editor-resizer-target-bg-color: #8c7878 +} + +.jodit-image-editor { + height: 100%; + overflow: hidden; + padding: var(--jd-padding-default); + width: 100% +} + +@media (max-width:768px) { + .jodit-image-editor { + height: auto + } +} + +.jodit-image-editor > div, .jodit-image-editor > div > div { + height: 100% +} + +@media (max-width:768px) { + .jodit-image-editor > div, .jodit-image-editor > div > div { + height: auto; + min-height: 200px + } +} + +.jodit-image-editor * { + box-sizing: border-box +} + +.jodit-image-editor .jodit-image-editor__slider-title { + background-color: #f9f9f9; + border-bottom: 1px solid hsla(0,0%,62%,.31); + color: #333; + cursor: pointer; + font-weight: 700; + line-height: 1em; + padding: .8em 1em; + text-overflow: ellipsis; + text-shadow: #f3f3f3 0 1px 0; + user-select: none; + white-space: nowrap +} + + .jodit-image-editor .jodit-image-editor__slider-title svg { + display: inline-block; + margin-right: var(--jd-padding-default); + vertical-align: middle; + width: 16px + } + +.jodit-image-editor .jodit-image-editor__slider-content { + display: none +} + +.jodit-image-editor .jodit-image-editor__slider.jodit-image-editor_active .jodit-image-editor__slider-title { + background-color: #5d5d5d; + color: #fff; + text-shadow: #000 0 1px 0 +} + + .jodit-image-editor .jodit-image-editor__slider.jodit-image-editor_active .jodit-image-editor__slider-title svg { + fill: #fff + } + +.jodit-image-editor .jodit-image-editor__slider.jodit-image-editor_active .jodit-image-editor__slider-content { + display: block +} + +.jodit-image-editor__area { + background-color: #eee; + background-image: linear-gradient(45deg,var(--jd-color-border) 25%,transparent 25%,transparent 75%,var(--jd-color-border) 75%,var(--jd-color-border)),linear-gradient(45deg,var(--jd-color-border) 25%,transparent 25%,transparent 75%,var(--jd-color-border) 75%,var(--jd-color-border)); + background-position: 0 0,15px 15px; + background-size: 30px 30px; + display: none; + height: 100%; + overflow: hidden; + position: relative; + user-select: none; + width: 100% +} + + .jodit-image-editor__area.jodit-image-editor_active { + display: block + } + + .jodit-image-editor__area .jodit-image-editor__box { + height: 100%; + overflow: hidden; + pointer-events: none; + position: relative; + z-index: 1 + } + + .jodit-image-editor__area .jodit-image-editor__box img { + max-height: 100%; + max-width: 100%; + user-select: none + } + + .jodit-image-editor__area .jodit-image-editor__croper, .jodit-image-editor__area .jodit-image-editor__resizer { + background-repeat: no-repeat; + border: 1px solid #fff; + box-shadow: 0 0 11px #000; + height: 100px; + left: 20px; + pointer-events: none; + position: absolute; + top: var(--jd-padding-default); + width: 100px; + z-index: 2 + } + + .jodit-image-editor__area .jodit-image-editor__croper i.jodit_bottomright, .jodit-image-editor__area .jodit-image-editor__resizer i.jodit_bottomright { + background-color: var(--jd-image-editor-resizer-target-bg-color); + border: 1px solid var(--jd-image-editor-resizer-target-border-color); + border-radius: 50%; + bottom: calc(var(--jd-padding-default)*-1); + box-shadow: 0 0 11px #000; + cursor: se-resize; + display: inline-block; + height: 20px; + pointer-events: all; + position: absolute; + right: calc(var(--jd-padding-default)*-1); + width: 20px; + z-index: 4 + } + + .jodit-image-editor__area .jodit-image-editor__croper i.jodit_bottomright:active, .jodit-image-editor__area .jodit-image-editor__resizer i.jodit_bottomright:active { + border: 1px solid #ff0 + } + + .jodit-image-editor__area.jodit-image-editor__area_crop { + background: #eee; + height: 100%; + line-height: 100%; + position: relative; + text-align: center + } + + .jodit-image-editor__area.jodit-image-editor__area_crop .jodit-image-editor__box { + height: 100%; + line-height: 100%; + overflow: visible; + pointer-events: all; + text-align: left + } + + .jodit-image-editor__area.jodit-image-editor__area_crop .jodit-image-editor__box img { + height: 100%; + max-height: 100%; + max-width: 100%; + width: 100% + } + + .jodit-image-editor__area.jodit-image-editor__area_crop .jodit-image-editor__box:after { + background: hsla(0,0%,100%,.3); + content: ""; + inset: 0; + margin: auto; + position: absolute; + z-index: 1 + } + + .jodit-image-editor__area.jodit-image-editor__area_crop .jodit-image-editor__box .jodit-image-editor__croper { + cursor: move; + pointer-events: all + } + + .jodit-image-editor__area.jodit-image-editor__area_crop .jodit-image-editor__box .jodit-image-editor__croper i.jodit-image-editor__sizes { + background: rgba(0,0,0,.2); + border-radius: .4em; + bottom: -30px; + color: #fff; + display: block; + font-size: 12px; + left: 100%; + padding: 9px 6px; + position: absolute; + text-align: center; + text-shadow: none; + white-space: pre + } + + .jodit-image-editor__area.jodit-image-editor__area_crop.jodit-image-editor_active { + align-items: center; + display: flex; + justify-content: center + } + +.jodit-file-browser-files { + display: none; + height: 100%; + overflow-anchor: auto; + position: relative; + vertical-align: top +} + + .jodit-file-browser-files .jodit-button { + border-radius: 0 + } + +.jodit-file-browser-files_loading_true:before { + content: ""; + height: 100%; + left: 0; + position: absolute; + top: 0; + width: 100% +} + +.jodit-file-browser-files_loading_true:after { + animation: b 2s ease-out 0s infinite; + background: url(data:image/png;base64,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) no-repeat 50%; + background-size: 100% 100%; + content: ""; + display: inline-block; + height: var(--jd-icon-loader-size); + left: 50%; + margin-left: calc(var(--jd-icon-loader-size)/-2); + margin-top: calc(var(--jd-icon-loader-size)/-2); + opacity: .7; + position: absolute; + top: 50%; + vertical-align: middle; + width: var(--jd-icon-loader-size); + will-change: transform +} + +.jodit-file-browser-files::-webkit-scrollbar { + width: calc(var(--jd-padding-default)/2) +} + +.jodit-file-browser-files::-webkit-scrollbar-track { + box-shadow: inset 0 0 6px rgba(0,0,0,.3) +} + +.jodit-file-browser-files::-webkit-scrollbar-thumb { + background-color: #a9a9a9; + outline: 1px solid #708090 +} + +.jodit-file-browser-files_active_true { + align-content: flex-start; + display: flex; + flex-wrap: wrap; + overflow-y: auto; + padding: calc(var(--jd-padding-default)/2); + width: 100% +} + +.jodit-file-browser-files__item { + align-items: center; + border: 1px solid var(--jd-color-border); + display: flex; + font-size: 0; + height: var(--jd-col-size); + justify-content: center; + margin: calc(var(--jd-padding-default)/2); + overflow: hidden; + position: relative; + text-align: center; + transition: border .1s linear,bottom .1s linear; + width: var(--jd-col-size) +} + +@media (max-width:480px) { + .jodit-file-browser-files__item { + width: calc(50% - var(--jd-padding-default)) + } +} + +.jodit-file-browser-files__item img { + max-width: 100% +} + +.jodit-file-browser-files__item:hover { + border-color: #433b5c +} + +.jodit-file-browser-files__item_active_true { + background-color: var(--jd-color-border-active); + border-color: var(--jd-color-border-selected) +} + + .jodit-file-browser-files__item_active_true .jodit-file-browser-files__item-info { + background-color: var(--jd-color-border-active); + color: #fff; + text-shadow: none + } + +.jodit-file-browser-files__item-info { + background-color: var(--jd-info-background); + bottom: 0; + color: #333; + font-size: 14px; + left: 0; + line-height: 16px; + opacity: .85; + overflow: visible; + padding: .3em .6em; + position: absolute; + right: 0; + text-align: left; + text-shadow: #eee 0 1px 0; + transition: opacity .4s ease; + white-space: normal +} + + .jodit-file-browser-files__item-info > span { + display: block; + font-size: .75em; + overflow: hidden; + text-overflow: ellipsis; + white-space: nowrap + } + + .jodit-file-browser-files__item-info > span.jodit-file-browser-files__item-info-filename { + font-size: .9em; + font-weight: 700 + } + +.jodit-file-browser-files__item:hover:not(.jodit-file-browser-files__item_active_true) .jodit-file-browser-files__item-info { + bottom: -100px +} + +.jodit-file-browser-files_view_list { + scroll-behavior: smooth +} + + .jodit-file-browser-files_view_list a { + border-width: 0 0 1px; + display: block; + height: 26px; + line-height: 26px; + margin: 0; + text-align: left; + white-space: nowrap; + width: 100% + } + + .jodit-file-browser-files_view_list a img { + display: inline-block; + margin-left: 4px; + max-width: 16px; + min-width: 16px; + vertical-align: middle + } + + .jodit-file-browser-files_view_list a .jodit-file-browser-files__item-info { + background-color: transparent; + display: inline-block; + font-size: 0; + height: 100%; + line-height: inherit; + margin-left: 4px; + padding: 0; + position: static; + vertical-align: middle; + width: calc(100% - 20px) + } + + .jodit-file-browser-files_view_list a .jodit-file-browser-files__item-info > span { + display: inline-block; + font-size: 12px; + height: 100% + } + + .jodit-file-browser-files_view_list a .jodit-file-browser-files__item-info-filename { + width: 50% + } + + .jodit-file-browser-files_view_list a .jodit-file-browser-files__item-info-filechanged, .jodit-file-browser-files_view_list a .jodit-file-browser-files__item-info-filesize { + width: 25% + } + + .jodit-file-browser-files_view_list a:hover { + background-color: #433b5c + } + + .jodit-file-browser-files_view_list a:hover .jodit-file-browser-files__item-info { + color: #fff; + text-shadow: none + } + + .jodit-file-browser-files_view_list a:before { + content: ""; + display: inline-block; + height: 100%; + vertical-align: middle + } + +:root { + --jd-color-folder-title: #b1b1b1 +} + +.jodit-file-browser-tree { + --jd-color-background-filebrowser-folders: #3f3f3f; + display: none; + height: 100%; + overflow-anchor: auto; + position: relative; + vertical-align: top +} + + .jodit-file-browser-tree .jodit-button { + border-radius: 0 + } + +.jodit-file-browser-tree_loading_true:before { + content: ""; + height: 100%; + left: 0; + position: absolute; + top: 0; + width: 100% +} + +.jodit-file-browser-tree_loading_true:after { + animation: b 2s ease-out 0s infinite; + background: url(data:image/png;base64,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) no-repeat 50%; + background-size: 100% 100%; + content: ""; + display: inline-block; + height: var(--jd-icon-loader-size); + left: 50%; + margin-left: calc(var(--jd-icon-loader-size)/-2); + margin-top: calc(var(--jd-icon-loader-size)/-2); + opacity: .7; + position: absolute; + top: 50%; + vertical-align: middle; + width: var(--jd-icon-loader-size); + will-change: transform +} + +.jodit-file-browser-tree::-webkit-scrollbar { + width: calc(var(--jd-padding-default)/2) +} + +.jodit-file-browser-tree::-webkit-scrollbar-track { + box-shadow: inset 0 0 6px rgba(0,0,0,.3) +} + +.jodit-file-browser-tree::-webkit-scrollbar-thumb { + background-color: #a9a9a9; + outline: 1px solid #708090 +} + +.jodit-file-browser-tree_active_true { + background-color: var(--jd-color-background-filebrowser-folders); + display: flex; + flex-direction: column; + max-width: 290px; + min-width: 200px; + overflow-y: auto; + width: var(--jd-first-column); + z-index: 2 +} + +@media (max-width:480px) { + .jodit-file-browser-tree_active_true { + height: 100px; + max-width: 100%; + width: auto + } +} + +.jodit-file-browser-tree_active_true::-webkit-scrollbar { + width: calc(var(--jd-padding-default)/2) +} + +.jodit-file-browser-tree_active_true::-webkit-scrollbar-track { + box-shadow: inset 0 0 6px rgba(0,0,0,.3) +} + +.jodit-file-browser-tree_active_true::-webkit-scrollbar-thumb { + background-color: hsla(0,0%,50%,.5); + outline: 1px solid #708090 +} + +.jodit-file-browser-tree__item { + align-items: center; + border-bottom: 1px solid #474747; + color: var(--jd-color-folder-title); + display: flex; + justify-content: space-between; + min-height: 38px; + padding: calc(var(--jd-padding-default)/2) var(--jd-padding-default); + position: relative; + text-decoration: none; + transition: background-color .2s ease 0s; + word-break: break-all +} + +.jodit-file-browser-tree__item-title { + color: var(--jd-color-folder-title); + flex: 1 +} + +.jodit-file-browser-tree__item .jodit-icon_folder { + align-items: center; + display: flex; + height: calc(var(--jd-icon-size) + 4px); + justify-content: center; + margin-left: calc(var(--jd-padding-default)/2); + opacity: .3; + width: calc(var(--jd-icon-size) + 4px) +} + + .jodit-file-browser-tree__item .jodit-icon_folder svg { + height: var(--jd-icon-size); + width: var(--jd-icon-size); + fill: var(--jd-color-folder-title) !important; + stroke: var(--jd-color-folder-title) !important + } + + .jodit-file-browser-tree__item .jodit-icon_folder:hover { + background: #696969 + } + +.jodit-file-browser-tree__item:hover { + background-color: var(--jd-color-background-button-hover) +} + +.jodit-file-browser-tree__item:hover-title { + color: var(--jd-color-text) +} + +.jodit-file-browser-tree__item:hover i.jodit-icon_folder { + opacity: .6 +} + +.jodit-file-browser-tree__source-title { + background: #5a5a5a; + border-bottom: 1px solid #484848; + color: #969696; + display: block; + font-size: 12px; + padding: 2px 4px; + position: relative; + user-select: none; + word-break: break-all +} + +a + .jodit-file-browser-tree__source-title { + margin-top: var(--jd-padding-default) +} + +:root { + --jd-first-column: 31%; + --jd-cols: 4; + --jd-info-background: #e9e9e9; + --jd-icon-size: 12px; + --jd-col-size: 150px +} + +.jodit-file-browser { + display: flex; + font-family: var(--jd-font-default); + height: 100% +} + +.jodit-file-browser_no-files_true { + padding: var(--jd-padding-default) +} + +@media (max-width:480px) { + .jodit-file-browser { + flex-flow: column-reverse + } +} + +.jodit-dialog .jodit-dialog__header-title.jodit-file-browser__title-box { + align-items: center; + display: flex; + padding-left: var(--jd-padding-default) +} + +.jodit-file-browser-preview { + align-items: center; + display: flex; + height: 100%; + justify-content: center; + margin: auto; + max-height: 100%; + max-width: min(100%,1000px); + min-height: min(100%,500px); + min-width: 400px; + position: relative; + text-align: center +} + +@media (max-width:768px) { + .jodit-file-browser-preview { + height: 100%; + max-height: 100%; + max-width: 100%; + min-height: auto; + min-width: auto + } +} + +.jodit-file-browser-preview__box { + align-items: center; + display: flex; + flex-grow: 1; + justify-content: center +} + +.jodit-file-browser-preview__navigation { + cursor: pointer; + height: 100%; + left: 0; + position: absolute; + top: 0 +} + +.jodit-file-browser-preview__navigation_arrow_next { + left: auto; + right: 0 +} + +.jodit-file-browser-preview__navigation svg { + height: 45px; + position: relative; + top: 50%; + width: 45px; + fill: #9e9ba7; + transform: translateY(-50%); + transition: fill .3s linear +} + +.jodit-file-browser-preview__navigation:hover svg { + fill: #000 +} + +.jodit-file-browser-preview img { + max-height: 100%; + max-width: 100% +} + +.jodit-status-bar { + align-items: center; + background-color: var(--jd-color-panel); + border-radius: 0 0 var(--jd-border-radius-default) var(--jd-border-radius-default); + color: var(--jd-color-text-icons); + display: flex; + font-size: var(--jd-font-size-small); + height: 20px; + justify-content: flex-start; + overflow: hidden; + padding: 0 calc(var(--jd-padding-default)/2); + text-transform: uppercase +} + +.jodit-status-bar_resize-handle_true { + padding-right: 14px +} + +.jodit-status-bar:before { + content: ""; + flex: auto; + order: 1 +} + +.jodit-status-bar .jodit-status-bar__item { + line-height: 1.5714em; + margin: 0 var(--jd-padding-default) 0 0; + order: 0; + padding: 0 +} + + .jodit-status-bar .jodit-status-bar__item, .jodit-status-bar .jodit-status-bar__item > span { + font-family: var(--jd-font-default); + font-size: var(--jd-font-size-default); + font-size: var(--jd-font-size-small) + } + + .jodit-status-bar .jodit-status-bar__item.jodit-status-bar__item-right { + margin: 0 0 0 var(--jd-padding-default); + order: 2 + } + + .jodit-status-bar .jodit-status-bar__item a { + border-radius: 3px; + cursor: default; + text-decoration: none + } + + .jodit-status-bar .jodit-status-bar__item a:hover { + background-color: var(--jd-color-background-gray); + text-decoration: none + } + +.jodit-status-bar a.jodit-status-bar-link { + cursor: pointer +} + + .jodit-status-bar a.jodit-status-bar-link, .jodit-status-bar a.jodit-status-bar-link:hover, .jodit-status-bar a.jodit-status-bar-link:visited { + background-color: transparent; + color: var(--jd-color-text-icons) + } + + .jodit-status-bar a.jodit-status-bar-link:hover { + text-decoration: underline + } + +.jodit-workplace + .jodit-status-bar:not(:empty) { + border-top: 1px solid var(--jd-color-border) +} + +.jodit_disabled .jodit-status-bar { + opacity: .4 +} + +.jodit-drag-and-drop__file-box, .jodit_uploadfile_button { + border: 1px dashed var(--jd-color-gray); + margin: var(--jd-padding-default) 0; + overflow: hidden; + padding: 25px 0; + position: relative; + text-align: center; + width: 100% +} + + .jodit-drag-and-drop__file-box:hover, .jodit_uploadfile_button:hover { + background-color: var(--jd-color-background-button-hover) + } + + .jodit-drag-and-drop__file-box input, .jodit_uploadfile_button input { + cursor: pointer; + font-size: 400px; + inset: 0; + margin: 0; + opacity: 0; + padding: 0; + position: absolute + } + +@media (max-width:768px) { + .jodit-drag-and-drop__file-box { + max-width: 100%; + min-width: var(--jd-width-input-min); + width: auto + } +} + +:root { + --jd-anl-color-new-line: var(--jd-color-border); + --jd-anl-handle-size: 20px; + --jd-anl-handle-offset: calc(100% - var(--jd-anl-handle-size)) +} + +.jodit-add-new-line { + display: block; + height: 1px; + outline: none; + position: fixed; + top: 0; + z-index: 1 +} + + .jodit-add-new-line, .jodit-add-new-line * { + box-sizing: border-box + } + + .jodit-add-new-line:after { + background-color: var(--jd-anl-color-new-line); + content: ""; + display: block; + height: 1px; + width: 100% + } + + .jodit-add-new-line span { + align-items: center; + background: var(--jd-color-background-button-hover-opacity30); + border: 1px solid var(--jd-anl-color-new-line); + cursor: pointer; + display: flex; + height: var(--jd-anl-handle-size); + justify-content: center; + left: var(--jd-anl-handle-offset); + position: absolute; + top: 0; + transform: translateY(-50%); + width: var(--jd-anl-handle-size) + } + + .jodit-add-new-line span:hover { + background: var(--jd-color-background-button-hover) + } + + .jodit-add-new-line svg { + width: calc(var(--jd-anl-handle-size)/2); + fill: var(--jd-anl-color-new-line) + } + +.jodit-source__mode .jodit-add-new-line { + display: none !important +} + +:root { + --jd-color-picker-cell-size: 24px +} + +.jodit-color-picker { + margin: 0; + text-align: left; + user-select: none +} + +.jodit-color-picker__group { + display: flex; + flex-wrap: wrap; + margin-bottom: calc(var(--jd-padding-default)/2); + max-width: calc(var(--jd-color-picker-cell-size)*10); + white-space: normal +} + +.jodit-color-picker__color-item { + border: 1px solid transparent; + display: block; + height: var(--jd-color-picker-cell-size); + text-align: center; + text-decoration: none; + vertical-align: middle; + width: var(--jd-color-picker-cell-size) +} + + .jodit-color-picker__color-item:hover { + border-color: #000 + } + + .jodit-color-picker__color-item:active, .jodit-color-picker__color-item_active_true { + border: 2px solid var(--jd-color-border-selected) + } + +.jodit-color-picker__native svg { + display: inline-block; + height: 16px; + margin-right: 4px; + width: 16px +} + +.jodit-color-picker__native input { + appearance: none; + border: none; + height: 18px; + padding: 0; + width: 18px +} + + .jodit-color-picker__native input[type=color]::-webkit-color-swatch-wrapper { + padding: 0 + } + + .jodit-color-picker__native input input[type=color]::-webkit-color-swatch { + border: none + } + +.jodit-tabs { + font-family: var(--jd-font-default); + font-size: var(--jd-font-size-default) +} + + .jodit-tabs .jodit-tabs__buttons { + display: flex; + justify-content: center; + margin-bottom: var(--jd-padding-default); + margin-top: calc(var(--jd-padding-default)/2) + } + + .jodit-tabs .jodit-tabs__buttons > * { + cursor: pointer; + margin-left: calc(var(--jd-padding-default)/2) + } + + .jodit-tabs .jodit-tabs__buttons > :only-of-type { + width: 100% + } + + .jodit-tabs .jodit-tabs__buttons > :first-child { + margin-left: 0 + } + +@media (max-width:480px) { + .jodit-tabs .jodit-tabs__buttons { + display: block + } + + .jodit-tabs .jodit-tabs__buttons > * { + margin-left: 0; + width: 100% + } +} + +.jodit-tabs__button { + min-width: 80px +} + +.jodit-tabs__button_columns_3 { + width: 33.33333% +} + +.jodit-tabs__button_columns_2 { + width: 50% +} + +.jodit-tabs .jodit-tabs__wrapper .jodit-tab { + display: none +} + + .jodit-tabs .jodit-tabs__wrapper .jodit-tab.jodit-tab_active { + display: block + } + + .jodit-tabs .jodit-tabs__wrapper .jodit-tab.jodit-tab_empty { + min-height: 100px; + min-width: 220px + } + +.jodit_fullsize-box_true { + overflow: visible !important; + position: static !important; + z-index: var(--jd-z-index-full-size) !important +} + +body.jodit_fullsize-box_true, html.jodit_fullsize-box_true { + height: 0 !important; + overflow: hidden !important; + width: 0 !important +} + +html.jodit_fullsize-box_true { + position: fixed !important +} + +.jodit_fullsize { + inset: 0; + max-width: none !important; + position: absolute; + z-index: var(--jd-z-index-full-size) +} + + .jodit_fullsize .toolbar { + width: 100% !important + } + + .jodit_fullsize .jodit__area, .jodit_fullsize .jodit_editor { + height: 100% + } + +.jodit-ui-image-position-tab__lockMargin > svg, .jodit-ui-image-position-tab__lockSize > svg, .jodit-ui-image-properties-form__lockMargin > svg, .jodit-ui-image-properties-form__lockSize > svg { + display: inline-block; + height: var(--jd-icon-middle-size); + overflow: hidden; + width: var(--jd-icon-middle-size); + fill: var(--jd-color-dark); + line-height: var(--jd-icon-middle-size); + transform-origin: 0 0 !important; + vertical-align: middle +} + +.jodit-ui-image-position-tab__view-box, .jodit-ui-image-properties-form__view-box { + padding: var(--jd-padding-default) +} + +.jodit-ui-image-position-tab__imageView, .jodit-ui-image-properties-form__imageView { + align-items: center; + background-color: var(--jd-color-background-light-gray); + display: flex; + height: var(--jd-width-default); + justify-content: center; + margin: 0 0 var(--jd-padding-default); + padding: 0 +} + + .jodit-ui-image-position-tab__imageView img, .jodit-ui-image-properties-form__imageView img { + max-height: 100%; + max-width: 100% + } + +.jodit-ui-image-position-tab__imageSizes.jodit-form__group, .jodit-ui-image-properties-form__imageSizes.jodit-form__group { + align-items: center; + flex-direction: row; + margin: 0; + min-width: auto; + padding: 0 +} + + .jodit-ui-image-position-tab__imageSizes.jodit-form__group a, .jodit-ui-image-properties-form__imageSizes.jodit-form__group a { + cursor: pointer; + display: inline-block + } + +.jodit-ui-image-position-tab .jodit-form__group, .jodit-ui-image-properties-form .jodit-form__group { + padding: 0 +} + +.jodit-ui-image-position-tab__tabsBox, .jodit-ui-image-properties-form__tabsBox { + padding: 0 var(--jd-padding-default) +} + +.jodit-ui-image-properties-form_lock_true:before { + background-color: var(--jd-color-button-background-hover-opacity60); + content: ""; + height: 100%; + left: 0; + position: absolute; + top: 0; + width: 100%; + z-index: 3 +} + +.jodit-ui-image-properties-form_lock_true:after { + animation: b 2s ease-out 0s infinite; + background: url(data:image/png;base64,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) no-repeat 50%; + background-size: 100% 100%; + background-size: var(--jd-icon-loader-size); + content: ""; + display: inline-block; + height: var(--jd-icon-loader-size); + left: 50%; + margin-left: -10px; + margin-top: -10px; + position: absolute; + top: 50%; + vertical-align: middle; + width: var(--jd-icon-loader-size); + will-change: transform +} + +.jodit-popup-inline__container { + min-width: 700px; + z-index: 1300 +} + +.jodit-paste-storage { + max-width: 600px; + padding: var(--jd-padding-default) +} + +@media (max-width:768px) { + .jodit-paste-storage { + max-width: 100% + } +} + +.jodit-paste-storage > div { + border: 1px solid var(--jd-color-border); + max-height: 300px; + max-width: 100% +} + + .jodit-paste-storage > div:first-child { + margin-bottom: var(--jd-padding-default) + } + + .jodit-paste-storage > div:first-child a { + border: 1px solid transparent; + box-sizing: border-box; + color: var(--jd-color-default); + display: block; + margin: 0; + max-width: 100%; + outline: none; + overflow: hidden; + padding: calc(var(--jd-padding-default)/2); + text-decoration: none; + text-overflow: ellipsis; + white-space: pre + } + + .jodit-paste-storage > div:first-child a.jodit_active { + background-color: var(--jd-dark-background-color); + color: var(--jd-color-white) + } + + .jodit-paste-storage > div:first-child a:focus { + outline: none + } + + .jodit-paste-storage > div:last-child { + overflow: auto; + padding: var(--jd-padding-default) + } + + .jodit-paste-storage > div:last-child li, .jodit-paste-storage > div:last-child ul { + margin: 0 + } + +.jodit-placeholder { + color: var(--jd-color-placeholder); + display: block; + left: 0; + padding: var(--jd-padding-default); + pointer-events: none; + position: absolute; + top: 0; + user-select: none !important; + width: 100%; + z-index: 1 +} + +.jodit__preview-box table { + border: none; + border-collapse: collapse; + empty-cells: show; + margin-bottom: 1em; + margin-top: 1em; + max-width: 100% +} + + .jodit__preview-box table tr { + user-select: none + } + + .jodit__preview-box table tr td, .jodit__preview-box table tr th { + border: 1px solid var(--jd-color-border); + min-width: 2em; + padding: .4em; + user-select: text; + vertical-align: middle + } + +.jodit-table-resizer { + cursor: col-resize; + margin-left: calc(var(--jd-padding-default)/-2); + padding-left: calc(var(--jd-padding-default)/2); + padding-right: calc(var(--jd-padding-default)/2); + position: absolute; + z-index: 3 +} + + .jodit-table-resizer:after { + border: 0; + content: ""; + display: block; + height: 100%; + width: 0 + } + +.jodit-table-resizer_moved { + background-color: var(--jd-color-background-selection); + z-index: 2 +} + + .jodit-table-resizer_moved:after { + border-right: 1px solid moved + } + +[data-jodit_iframe_wrapper] { + display: block; + position: relative; + user-select: none +} + + [data-jodit_iframe_wrapper] iframe { + position: relative + } + + [data-jodit_iframe_wrapper]:after { + background: transparent; + content: ""; + cursor: pointer; + display: block; + inset: 0; + position: absolute; + z-index: 1 + } + + [data-jodit_iframe_wrapper][data-jodit-wrapper_active=true] iframe { + z-index: 2 + } + +.jodit_lock [data-jodit-wrapper_active=true] iframe { + z-index: 1 +} + +:root { + --jd-viewer-width: 70px; + --jd-viewer-height: 24px; + --jd-resizer-handle-size: 10px; + --jd-resizer-border-color: #98c1f1; + --jd-resizer-handle-color: #5ba4f3; + --jd-resizer-handle-hover-color: #537ebb +} + +.jodit-resizer { + font-size: 0; + height: 100px; + left: 0; + outline: 3px solid var(--jd-resizer-border-color); + pointer-events: none; + position: absolute; + top: 0; + width: 100px +} + + .jodit-resizer, .jodit-resizer * { + box-sizing: border-box + } + + .jodit-resizer > span { + background-color: var(--jd-color-placeholder); + color: var(--jd-color-white); + display: inline-block; + font-size: 12px; + height: var(--jd-viewer-height); + left: 50%; + line-height: var(--jd-viewer-height); + margin-left: calc(var(--jd-viewer-width)/-2); + margin-top: calc(var(--jd-viewer-height)/-2); + opacity: 0; + overflow: visible; + position: absolute; + text-align: center; + top: 50%; + transition: opacity .2s linear; + width: var(--jd-viewer-width) + } + + .jodit-resizer > div { + background-color: var(--jd-resizer-handle-color); + display: inline-block; + height: var(--jd-resizer-handle-size); + pointer-events: all; + position: absolute; + width: var(--jd-resizer-handle-size); + z-index: 4 + } + + .jodit-resizer > div:hover { + background-color: var(--jd-resizer-handle-hover-color) + } + + .jodit-resizer > div:first-child { + cursor: nwse-resize; + left: calc(var(--jd-resizer-handle-size)/-2); + top: calc(var(--jd-resizer-handle-size)/-2) + } + + .jodit-resizer > div:nth-child(2) { + cursor: nesw-resize; + right: calc(var(--jd-resizer-handle-size)/-2); + top: calc(var(--jd-resizer-handle-size)/-2) + } + + .jodit-resizer > div:nth-child(3) { + bottom: calc(var(--jd-resizer-handle-size)/-2); + cursor: nwse-resize; + right: calc(var(--jd-resizer-handle-size)/-2) + } + + .jodit-resizer > div:nth-child(4) { + bottom: calc(var(--jd-resizer-handle-size)/-2); + cursor: nesw-resize; + left: calc(var(--jd-resizer-handle-size)/-2) + } + +@media (max-width:768px) { + .jodit-resizer > div :root { + --jd-resizer-handle-size: calc(var(--jd-resizer-handle-size)*2) + } +} + +:root { + --jd-height-search: 30px; + --jd-width-search: 320px; + --jd-width-search-input-box: 60%; + --jd-width-search-count-box: 15%; + --jd-transform-button-active: 0.95; + --jd-timeout-button-active: 0.1s +} + +.jodit-ui-search { + height: 0; + position: absolute; + right: 0; + top: 0; + width: 0 +} + +.jodit-ui-search_sticky_true { + position: fixed +} + +.jodit-ui-search__box { + background-color: var(--jd-color-panel); + border: solid var(--jd-color-border); + border-width: 0 0 1px 1px; + display: flex; + max-width: 100vw; + padding: calc(var(--jd-padding-default)/2); + position: absolute; + right: 0; + width: var(--jd-width-search) +} + + .jodit-ui-search__box input { + background-color: transparent; + border: 0; + height: 100%; + margin: 0; + outline: none; + padding: 0 var(--jd-padding-default); + width: 100% + } + + .jodit-ui-search__box input[data-ref=replace] { + display: none + } + + .jodit-ui-search__box input:not(:focus) + input:not(:focus) { + border-top: 1px solid var(--jd-color-border) + } + +.jodit-ui-search__buttons, .jodit-ui-search__counts, .jodit-ui-search__inputs { + height: var(--jd-height-search) +} + +.jodit-ui-search__inputs { + padding-right: calc(var(--jd-padding-default)/2); + width: var(--jd-width-search-input-box) +} + +.jodit-ui-search__counts { + border-left: 1px solid var(--jd-color-border); + color: var(--jd-color-border); + width: var(--jd-width-search-count-box) +} + +.jodit-ui-search__buttons, .jodit-ui-search__counts { + align-items: center; + display: flex; + justify-content: center +} + +.jodit-ui-search__buttons { + flex: 1; + padding-left: 0 +} + + .jodit-ui-search__buttons button { + background-color: transparent; + border: 1px solid transparent; + height: 100%; + margin-right: 1%; + width: 32% + } + + .jodit-ui-search__buttons button[data-ref=replace-btn] { + border: 1px solid var(--jd-color-border); + display: none; + margin-top: 2px; + width: 100% + } + + .jodit-ui-search__buttons button:hover { + background-color: var(--jd-color-background-button-hover) + } + + .jodit-ui-search__buttons button:focus { + border: 1px solid var(--jd-color-background-selection-opacity50) + } + + .jodit-ui-search__buttons button:active { + border: 1px solid var(--jd-color-background-selection); + transform: scale(var(--jd-transform-button-active)) + } + +.jodit-ui-search_empty-query_true [data-ref=next], .jodit-ui-search_empty-query_true [data-ref=prev] { + opacity: .5 +} + +.jodit-ui-search_replace_true .jodit-ui-search__counts, .jodit-ui-search_replace_true .jodit-ui-search__inputs { + height: calc(var(--jd-height-search)*2) +} + + .jodit-ui-search_replace_true .jodit-ui-search__counts input, .jodit-ui-search_replace_true .jodit-ui-search__inputs input { + height: 50%; + transition: background-color var(--jd-timeout-button-active) linear + } + + .jodit-ui-search_replace_true .jodit-ui-search__counts input:focus, .jodit-ui-search_replace_true .jodit-ui-search__inputs input:focus { + box-shadow: inset 0 0 3px 0 var(--jd-color-border) + } + + .jodit-ui-search_replace_true .jodit-ui-search__counts input[data-ref=replace], .jodit-ui-search_replace_true .jodit-ui-search__inputs input[data-ref=replace] { + display: block + } + +.jodit-ui-search_replace_true .jodit-ui-search__buttons { + flex-wrap: wrap +} + + .jodit-ui-search_replace_true .jodit-ui-search__buttons button[data-ref=replace-btn] { + display: block + } + +::highlight(jodit-search-result), [jd-tmp-selection] { + background-color: var(--jd-color-background-selection); + color: var(--jd-color-text-selection) +} + +.jodit-container:not(.jodit_inline) { + min-height: 100px +} + + .jodit-container:not(.jodit_inline) .jodit-workplace { + display: flex; + flex-direction: column; + height: auto; + min-height: 50px; + overflow: hidden + } + + .jodit-container:not(.jodit_inline) .jodit-editor__resize { + position: relative + } + + .jodit-container:not(.jodit_inline) .jodit-editor__resize svg { + bottom: 0; + cursor: nwse-resize; + height: 12px; + overflow: hidden; + position: absolute; + right: 0; + width: 12px; + fill: var(--jd-color-gray-dark); + user-select: none + } + +.jodit-source { + background-color: var(--jd-color-source-area); + display: none; + flex: auto; + overflow: auto; + position: relative +} + + .jodit-source, .jodit-source .jodit-source__mirror-fake { + min-height: 100% + } + + .jodit-source * { + font: 12px/normal Monaco,Menlo,Ubuntu Mono,Consolas,source-code-pro,monospace + } + +.jodit-container.jodit-source__mode .jodit-wysiwyg, .jodit-container.jodit-source__mode .jodit-wysiwyg_iframe { + display: none !important +} + +.jodit-container.jodit-source__mode .jodit-source { + display: block !important +} + +.jodit-container.jodit_split_mode .jodit-workplace { + flex-flow: row nowrap +} + +.jodit-container.jodit_split_mode .jodit-source, .jodit-container.jodit_split_mode .jodit-wysiwyg, .jodit-container.jodit_split_mode .jodit-wysiwyg_iframe { + display: block !important; + flex: 1; + width: 50% +} + +.jodit-source__mirror { + background: var(--jd-color-source-area); + border: 0; + box-shadow: none; + box-sizing: border-box; + color: #f0f0f0; + height: 100%; + line-height: 1.5; + font: 12px/normal Monaco,Menlo,Ubuntu Mono,Consolas,source-code-pro,monospace; + margin: 0; + min-height: 100%; + outline: none; + overflow: auto; + padding: var(--jd-padding-default); + resize: none; + tab-size: 2em; + white-space: pre-wrap; + width: 100%; + z-index: 2 +} + + .jodit-source__mirror::selection { + background: var(--jd-color-selection-area) + } + +.jodit_sticky-dummy_toolbar { + display: none +} + +.jodit_sticky > .jodit-toolbar__box { + border-bottom: 1px solid var(--jd-color-border); + left: auto; + position: fixed; + position: sticky; + top: 0; + z-index: 3 +} + +.jodit_sticky .jodit_sticky-dummy_toolbar { + display: block +} + +.jodit-symbols { + padding: var(--jd-padding-default); + width: 460px +} + +.jodit-symbols__container { + display: flex +} + +.jodit-symbols__container_table { + width: 88% +} + +.jodit-symbols__container_preview { + width: 12% +} + +.jodit-symbols__preview { + border: 1px solid var(--jd-color-border); + font-size: 34px; + padding: 20px 0; + text-align: center +} + +.jodit-symbols__table { + border: 0; + border-spacing: 0; + table-layout: fixed +} + + .jodit-symbols__table td { + padding: 0 + } + + .jodit-symbols__table td a { + border: 1px solid transparent; + box-sizing: border-box; + color: var(--jd-color-text); + cursor: pointer; + display: inline-block; + font-size: 16px; + height: calc(var(--jd-height-element-default)*1.2); + line-height: calc(var(--jd-height-element-default)*1.2); + text-align: center; + text-decoration: none; + vertical-align: top; + width: calc(var(--jd-width-element-default)*1.2) + } + + .jodit-symbols__table td a:focus, .jodit-symbols__table td a:hover { + outline: 2px solid var(--jd-color-border) + } + +.jodit-ui-ai-assistant { + min-width: 460px; + padding: var(--jd-padding-default); + width: 100% +} + +@media (max-width:768px) { + .jodit-ui-ai-assistant { + min-width: 100% + } +} + +.jodit-ui-ai-assistant__body { + margin-bottom: 10px +} + +.jodit-ui-ai-assistant__prompt-row { + align-items: flex-start; + display: flex; + margin-bottom: 10px +} + +.jodit-ui-ai-assistant__prompt-row-label { + margin-right: 10px +} + +.jodit-ui-ai-assistant__prompt-row-input { + flex: 1; + margin-right: 10px +} + +.jodit-ui-ai-assistant__prompt-row .jodit-icon_ai_assistant { + cursor: pointer; + height: 22px; + width: 22px +} + +.jodit-ui-ai-assistant__prompt-row .jodit-ui-button { + margin-right: 10px +} + +.jodit-ui-ai-assistant__prompt-row .jodit-ui-button_ai_assistant { + margin-right: 0; + margin-top: 20px +} + +.jodit-ui-ai-assistant__results { + border-color: var(--jd-color-label); + border-style: solid; + border-width: 1px; + height: 300px; + line-height: 1.5; + max-width: 460px; + min-height: 300px; + min-width: 100%; + overflow: auto; + padding: var(--jd-padding-default); + position: relative +} + + .jodit-ui-ai-assistant__results p { + margin: 0 0 10px + } + +.jodit-ui-ai-assistant__close { + cursor: pointer; + padding: 10px; + position: absolute; + right: 0; + top: 0 +} + +.jodit-ui-ai-assistant_hide_true { + display: none +} + +.jodit-ui-ai-assistant__spinner:before { + animation: b .6s linear infinite; + border: 1px solid #ccc; + border-radius: 50%; + border-top-color: #8817c3; + box-sizing: border-box; + content: ""; + height: 30px; + left: 50%; + margin-left: -15px; + margin-top: -15px; + position: absolute; + top: 50%; + width: 30px +} + +.jodit-ui-ai-assistant__error { + color: var(--jd-color-error) +} + +/*.jodit-context table, .jodit-wysiwyg table { + border: none; + border-collapse: collapse; + empty-cells: show; + margin-bottom: 1em; + margin-top: 1em; + max-width: 100% +} + + .jodit-context table tr, .jodit-wysiwyg table tr { + user-select: none + } + + .jodit-context table tr td, .jodit-context table tr th, .jodit-wysiwyg table tr td, .jodit-wysiwyg table tr th { + border: 1px solid var(--jd-color-border); + min-width: 2em; + padding: .4em; + user-select: text; + vertical-align: middle + }*/ + +.jodit-form__inserter { + --jd-color-table-cell-background-hover: var(--jd-color-button-background-hover) +} + + .jodit-form__inserter .jodit-form__table-creator-box { + display: flex + } + +@media (max-width:768px) { + .jodit-form__inserter .jodit-form__table-creator-box { + flex-direction: column + } +} + +.jodit-form__inserter .jodit-form__table-creator-box .jodit-form__container { + font-size: 0; + margin: 0; + min-width: 180px; + padding: 0 +} + + .jodit-form__inserter .jodit-form__table-creator-box .jodit-form__container > div > span { + border: 1px solid var(--jd-color-border); + box-sizing: border-box; + display: inline-block; + height: var(--jd-height-element-default); + margin-bottom: 2px; + margin-left: 2px; + vertical-align: top; + width: var(--jd-width-element-default) + } + + .jodit-form__inserter .jodit-form__table-creator-box .jodit-form__container > div > span:first-child { + margin-left: 0 + } + + .jodit-form__inserter .jodit-form__table-creator-box .jodit-form__container > div > span.jodit_hovered { + background: var(--jd-color-table-cell-background-hover); + border-color: var(--jd-color-table-cell-background-hover) + } + +.jodit-form__inserter .jodit-form__table-creator-box .jodit-form__options { + font-size: var(--jd-font-size-default) +} + + .jodit-form__inserter .jodit-form__table-creator-box .jodit-form__options label { + padding-top: 0; + text-align: left + } + + .jodit-form__inserter .jodit-form__table-creator-box .jodit-form__options label input { + margin-right: var(--jd-padding-default) + } + +.jodit-form__inserter label { + font-size: 14px; + margin: 0; + padding: 8px; + text-align: center +} + +.jodit-xpath { + align-items: center; + display: flex; + margin-left: calc(var(--jd-padding-default)/-2) +} + +.jodit-xpath__item { + display: flex; + height: var(--jd-font-size-small); + line-height: calc(var(--jd-font-size-small) - 1px) +} + + .jodit-xpath__item a { + color: var(--jd-color-default); + font-size: var(--jd-font-size-small); + margin-left: 2px; + outline: 0; + padding: 0 3px + } + +:root { + --jd-color-white: #fff; + --jd-color-gray: #dadada; + --jd-color-gray-dark: #a5a5a5; + --jd-color-dark: #4c4c4c; + --jd-color-blue: #b5d6fd; + --jd-color-light-blue: rgba(181,214,253,.5); + --jd-color-red: #ff3b3b; + --jd-color-light-red: rgba(255,59,59,.4); + --jd-color-default: var(--jd-color-dark); + --jd-color-text: #222; + --jd-color-label: var(--jd-color-gray-dark); + --jd-color-error: var(--jd-color-red); + --jd-color-border: var(--jd-color-gray); + --jd-color-border-dark: var(--jd-color-dark); + --jd-color-border-selected: #1e88e5; + --jd-color-border-active: #b5b5b5; + --jd-color-selection: var(--jd-color-dark); + --jd-color-selection-area: #bdbdbd; + --jd-color-separator: var(--jd-color-border); + --jd-color-placeholder: var(--jd-color-gray-dark); + --jd-color-panel: #f9f9f9; + --jd-color-resizer: #c8c8c8; + --jd-color-background-default: var(--jd-color-white); + --jd-color-background-light-gray: #f5f5f6; + --jd-color-background-gray: var(--jd-color-gray); + --jd-color-background-gray-hover: #f8f8f8; + --jd-color-background-button-hover: #ecebe9; + --jd-color-background-button-hover-opacity30: hsla(40,7%,92%,.3); + --jd-color-background-progress: #b91f1f; + --jd-color-background-active: #2196f3; + --jd-color-background-selection: #b5d6fd; + --jd-color-text-selection: var(--jd-color-white); + --jd-color-background-selection-opacity50: rgba(181,214,253,.995); + --jd-color-source-area: #323232; + --jd-color-button-background-hover: #dcdcdc; + --jd-color-button-background-hover-opacity40: hsla(0,0%,86%,.4); + --jd-color-button-background-hover-opacity60: hsla(0,0%,86%,.6); + --jd-font-default: -apple-system,blinkmacsystemfont,"Segoe UI",roboto,oxygen-sans,ubuntu,cantarell,"Helvetica Neue",sans-serif; + --jd-font-size-default: 14px; + --jd-font-size-small: 11px; + --jd-color-text-icons: rgba(0,0,0,.75); + --jd-color-icon: var(--jd-color-dark); + --jd-padding-default: 8px; + --jd-border-radius-default: 3px; + --jd-icon-tiny-size: 8px; + --jd-icon-xsmall-size: 10px; + --jd-icon-small-size: 12px; + --jd-icon-middle-size: 14px; + --jd-icon-large-size: 16px; + --jd-z-index-full-size: 100000; + --jd-z-index-popup: 10000001; + --jd-z-index-dialog-overlay: 20000003; + --jd-z-index-dialog: 20000004; + --jd-z-index-context-menu: 30000005; + --jd-z-index-tooltip: 30000006; + --jd-icon-loader-size: 48px; + --jd-width-element-default: 18px; + --jd-height-element-default: 18px; + --jd-dark-background-color: #575757; + --jd-dark-background-ligher: silver; + --jd-dark-background-darknes: #353535; + --jd-dark-border-color: #444; + --jd-dark-text-color: #d1cccc; + --jd-dark-text-color-opacity80: hsla(0,5%,81%,.8); + --jd-dark-text-color-opacity50: hsla(0,5%,81%,.5); + --jd-dark-icon-color: silver; + --jd-dark-toolbar-color: #5f5c5c; + --jd-dark-toolbar-seperator-color1: rgba(81,81,81,.41); + --jd-dark-toolbar-seperator-color2: #686767; + --jd-dark-toolbar-seperator-color-opacity80: hsla(0,0%,41%,.8); + --jd-dark-toolbar-seperator-color3: hsla(0,0%,41%,.75); + --jd-dark-color-border-selected: #152f5f; + --jd-width-default: 180px; + --jd-width-input-min: var(--jd-width-default); + --jd-input-height: 32px; + --jd-button-icon-size: 14px; + --jd-margin-v: 2px; + --jd-button-df-size: calc((var(--jd-button-icon-size) - 4px)*2); + --jd-button-size: calc(var(--jd-button-icon-size) + var(--jd-button-df-size) + var(--jd-margin-v)*2); + --jd-focus-input-box-shadow: 0 0 0 0.05rem rgba(0,123,255,.25) +} + +.jodit-wysiwyg { + outline: 0 +} + + .jodit-wysiwyg ::selection, .jodit-wysiwyg::selection { + background: #b5d6fd; + color: #4c4c4c + } + +.jodit-container:not(.jodit_inline) .jodit-wysiwyg { + margin: 0; + outline: 0; + overflow-x: auto; + padding: 8px; + position: relative +} + + .jodit-container:not(.jodit_inline) .jodit-wysiwyg img { + max-width: 100%; + position: relative + } + + .jodit-container:not(.jodit_inline) .jodit-wysiwyg jodit-media { + position: relative + } + + .jodit-container:not(.jodit_inline) .jodit-wysiwyg jodit-media * { + position: relative; + z-index: 0 + } + + .jodit-container:not(.jodit_inline) .jodit-wysiwyg jodit-media:before { + content: ""; + inset: 0; + position: absolute; + z-index: 1 + } + +:root { + --jd-switche-width: 60px; + --jd-switche-height: 32px; + --jd-switche-slider-margin: 4px; + --jd-switche-slider-size: calc(var(--jd-switche-height) - var(--jd-switche-slider-margin)*2) +} + +.jodit-form { + color: var(--jd-color-default); + font-family: var(--jd-font-default); + font-size: var(--jd-font-size-default) +} + + .jodit-form.jodit_error { + border-color: var(--jd-color-error); + box-shadow: inset 0 0 3px 0 hsla(0,0%,74%,.3) + } + +@media (max-width:768px) { + .jodit-form { + min-width: 150px + } +} + +.jodit-form button { + background: #d6d6d6; + border: none; + color: var(--jd-color-dark); + cursor: pointer; + font-size: 16px; + height: 36px; + line-height: 1; + margin-bottom: var(--jd-padding-default); + margin-top: var(--jd-padding-default); + outline: none; + padding: var(--jd-padding-default); + text-decoration: none; + transition: background .2s ease 0s +} + + .jodit-form button:hover { + background-color: var(--jd-color-background-button-hover); + color: var(--jd-color-dark) + } + + .jodit-form button:active { + background: var(--jd-color-background-button-hover); + color: var(--jd-color-dark) + } + +.jodit-form label { + align-items: center; + display: flex; + margin-bottom: var(--jd-padding-default); + text-align: left; + white-space: nowrap +} + + .jodit-form label:last-child { + margin-bottom: 0 + } + +.jodit-form .jodit-form__center { + justify-content: center +} + +.jodit .jodit-input, .jodit .jodit-select, .jodit .jodit-textarea { + appearance: none; + background-color: var(--jd-color-white); + border: 1px solid var(--jd-color-border); + border-radius: 0; + box-sizing: border-box; + font-family: var(--jd-font-default); + font-size: var(--jd-font-size-default); + height: var(--jd-input-height); + line-height: 1.2; + outline: none; + padding: 0 var(--jd-padding-default); + width: 100% +} + + .jodit .jodit-input[disabled], .jodit .jodit-select[disabled], .jodit .jodit-textarea[disabled] { + background-color: #f0f0f0; + color: var(--jd-color-border) + } + +.jodit .jodit-input_has-error_true, .jodit .jodit-select_has-error_true, .jodit .jodit-textarea_has-error_true { + border-color: var(--jd-color-red) +} + +.jodit .jodit-input:focus { + border-color: #66afe9; + outline: 0 +} + +.jodit-checkbox { + border: 0; + cursor: pointer; + height: 16px; + margin: 0 calc(var(--jd-padding-default)/2) 0 0; + outline: none; + padding: 0; + position: relative; + width: 16px; + z-index: 2 +} + +.jodit-select { + background-image: url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' id='Layer_1' data-name='Layer 1' viewBox='0 0 4.95 10'%3E%3Cdefs%3E%3Cstyle%3E.cls-2{fill:%23444}%3C/style%3E%3C/defs%3E%3Cpath d='M0 0h4.95v10H0z' style='fill:%23fff'/%3E%3Cpath d='m1.41 4.67 1.07-1.49 1.06 1.49zM3.54 5.33 2.48 6.82 1.41 5.33z' class='cls-2'/%3E%3C/svg%3E"); + background-position: 98% 50%; + background-repeat: no-repeat; + padding-right: calc(var(--jd-padding-default)*2) +} + +.jodit-textarea { + height: auto +} + +.jodit-form__group, .jodit-textarea { + min-width: var(--jd-width-input-min) +} + +.jodit-form__group { + display: flex; + flex-direction: column; + margin-bottom: var(--jd-padding-default) +} + + .jodit-form__group label { + margin-bottom: calc(var(--jd-padding-default)/2) + } + +.jodit-button { + align-items: center; + background-color: var(--jd-color-background-gray); + border: 0; + border-radius: .25rem; + color: var(--jd-color-default); + cursor: pointer; + display: inline-flex; + height: calc(var(--jd-padding-default)*4); + justify-content: center; + line-height: 1; + margin: 0; + padding: 0 var(--jd-padding-default); + position: relative; + text-decoration: none; + user-select: none; + width: auto +} + + .jodit-button svg { + display: inline-block; + height: 24px; + width: 24px + } + + .jodit-button svg + span { + margin-left: calc(var(--jd-padding-default)/2) + } + + .jodit-button:active, .jodit-button:focus { + outline: 0 + } + + .jodit-button.disabled { + opacity: .7 + } + +.jodit-buttons { + display: flex; + flex-wrap: nowrap; + justify-content: space-between; + margin-bottom: var(--jd-padding-default) +} + +.jodit-button .jodit_icon, .jodit-button svg, .jodit-dialog__header .jodit_icon, .jodit-dialog__header svg { + display: inline-block; + height: 16px; + vertical-align: middle; + width: 16px +} + +.jodit-switcher-wrapper { + align-items: center; + display: flex +} + + .jodit-switcher-wrapper .jodit-switcher + span { + margin-left: var(--jd-padding-default) + } + +.jodit-switcher { + display: inline-block; + height: var(--jd-switche-height); + position: relative; + width: var(--jd-switche-width) +} + + .jodit-switcher input { + height: 0; + opacity: 0; + width: 0 + } + + .jodit-switcher .jodit-switcher__slider { + background-color: var(--jd-color-gray); + border-radius: var(--jd-switche-height); + cursor: pointer; + inset: 0; + position: absolute; + transition: .4s + } + + .jodit-switcher .jodit-switcher__slider:before { + background-color: #fff; + border-radius: 50%; + bottom: var(--jd-switche-slider-margin); + content: ""; + height: var(--jd-switche-slider-size); + left: var(--jd-switche-slider-margin); + position: absolute; + transition: .4s; + width: var(--jd-switche-slider-size) + } + +input:checked + .jodit-switcher__slider { + background-color: var(--jd-color-background-active) +} + + input:checked + .jodit-switcher__slider:before { + transform: translateX(calc(var(--jd-switche-width) - var(--jd-switche-slider-margin)*2 - var(--jd-switche-slider-size))) + } + +input:focus + .jodit-switcher__slider { + box-shadow: 0 0 1px var(--jd-color-background-active) +} + +.jodit-button-group { + display: flex +} + + .jodit-button-group input { + display: none + } + + .jodit-button-group button { + display: flex; + flex: 1; + justify-content: center; + text-align: center + } + + .jodit-button-group button + button { + margin-left: -1px + } + + .jodit-button-group button:first-child, .jodit-button-group input:first-child + button { + border-bottom-right-radius: 0; + border-right: 0; + border-top-right-radius: 0 + } + + .jodit-button-group button:last-child, .jodit-button-group input:last-child + button { + border-bottom-left-radius: 0; + border-left: 0; + border-top-left-radius: 0 + } + + .jodit-button-group input[type=checkbox]:checked + button, .jodit-button-group input[type=checkbox]:not(:checked) + button + button { + background-image: none; + box-shadow: inset 0 2px 4px rgba(0,0,0,.3),0 1px 2px rgba(0,0,0,.05) + } + +.jodit_text_icons .jodit_icon { + font-size: var(--jd-font-size-default); + width: auto +} + + .jodit_text_icons .jodit_icon:first-letter { + text-transform: uppercase + } + +.jodit_text_icons .jodit-tabs .jodit-tabs__buttons > a { + font-family: var(--jd-font-default); + width: auto +} + + .jodit_text_icons .jodit-tabs .jodit-tabs__buttons > a i { + width: auto + } + +.jodit_text_icons.jodit-dialog .jodit-button, .jodit_text_icons.jodit-dialog .jodit-dialog__header a { + color: var(--jd-color-text-icons); + font-family: var(--jd-font-default); + padding: var(--jd-padding-default); + width: auto +} + + .jodit_text_icons.jodit-dialog .jodit-button .jodit_icon, .jodit_text_icons.jodit-dialog .jodit-dialog__header a .jodit_icon { + width: auto + } + +.jodit-grid { + display: flex; + width: 100% +} + + .jodit-grid.jodit-grid_column { + flex-direction: column + } + +@media (max-width:480px) { + .jodit-grid.jodit-grid_xs-column { + flex-direction: column + } +} + +.jodit-grid [class*=jodit_col-] { + flex: 1 1 auto +} + +.jodit-grid .jodit_col-lg-5-5 { + width: 100% +} + +.jodit-grid .jodit_col-lg-4-5 { + width: 80% +} + +.jodit-grid .jodit_col-lg-3-5 { + width: 60% +} + +.jodit-grid .jodit_col-lg-2-5 { + width: 40% +} + +.jodit-grid .jodit_col-lg-1-5 { + width: 20% +} + +.jodit-grid .jodit_col-lg-4-4 { + width: 100% +} + +.jodit-grid .jodit_col-lg-3-4 { + width: 75% +} + +.jodit-grid .jodit_col-lg-2-4 { + width: 50% +} + +.jodit-grid .jodit_col-lg-1-4 { + width: 25% +} + +@media (max-width:992px) { + .jodit-grid .jodit_col-md-5-5 { + width: 100% + } + + .jodit-grid .jodit_col-md-4-5 { + width: 80% + } + + .jodit-grid .jodit_col-md-3-5 { + width: 60% + } + + .jodit-grid .jodit_col-md-2-5 { + width: 40% + } + + .jodit-grid .jodit_col-md-1-5 { + width: 20% + } + + .jodit-grid .jodit_col-md-4-4 { + width: 100% + } + + .jodit-grid .jodit_col-md-3-4 { + width: 75% + } + + .jodit-grid .jodit_col-md-2-4 { + width: 50% + } + + .jodit-grid .jodit_col-md-1-4 { + width: 25% + } +} + +@media (max-width:768px) { + .jodit-grid .jodit_col-sm-5-5 { + width: 100% + } + + .jodit-grid .jodit_col-sm-4-5 { + width: 80% + } + + .jodit-grid .jodit_col-sm-3-5 { + width: 60% + } + + .jodit-grid .jodit_col-sm-2-5 { + width: 40% + } + + .jodit-grid .jodit_col-sm-1-5 { + width: 20% + } + + .jodit-grid .jodit_col-sm-4-4 { + width: 100% + } + + .jodit-grid .jodit_col-sm-3-4 { + width: 75% + } + + .jodit-grid .jodit_col-sm-2-4 { + width: 50% + } + + .jodit-grid .jodit_col-sm-1-4 { + width: 25% + } +} + +@media (max-width:480px) { + .jodit-grid .jodit_col-xs-5-5 { + width: 100% + } + + .jodit-grid .jodit_col-xs-4-5 { + width: 80% + } + + .jodit-grid .jodit_col-xs-3-5 { + width: 60% + } + + .jodit-grid .jodit_col-xs-2-5 { + width: 40% + } + + .jodit-grid .jodit_col-xs-1-5 { + width: 20% + } + + .jodit-grid .jodit_col-xs-4-4 { + width: 100% + } + + .jodit-grid .jodit_col-xs-3-4 { + width: 75% + } + + .jodit-grid .jodit_col-xs-2-4 { + width: 50% + } + + .jodit-grid .jodit_col-xs-1-4 { + width: 25% + } +} + +@keyframes b { + to { + transform: rotate(1turn) + } +} + +.jodit-icon_loader { + animation: b 2s ease-out 0s infinite; + background: url(data:image/png;base64,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) no-repeat 50%; + background-size: 100% 100%; + display: inline-block; + height: var(--jd-icon-loader-size); + vertical-align: middle; + width: var(--jd-icon-loader-size); + will-change: transform +} + +.jodit-icon { + background: 50% no-repeat; + background-size: contain; + height: 14px; + overflow: visible; + width: 14px; + fill: var(--jd-color-icon); + transform-origin: 0 0 !important +} + +.jodit-icon, .jodit-icon_close { + stroke: var(--jd-color-icon) +} + +svg.jodit-icon { + height: auto; + isolation: isolate +} + +.jodit-icon_text { + font-size: 14px +} + +.jodit, .jodit *, .jodit-container, .jodit-container * { + box-sizing: border-box +} + + .jodit .jodit-workplace, .jodit-container .jodit-workplace { + overflow: auto; + position: relative + } + + .jodit .jodit-workplace .jodit-wysiwyg, .jodit .jodit-workplace .jodit-wysiwyg_iframe, .jodit-container .jodit-workplace .jodit-wysiwyg, .jodit-container .jodit-workplace .jodit-wysiwyg_iframe { + height: 100%; + width: 100% + } + +.jodit-wysiwyg [contenteditable=false] { + cursor: default +} + +.jodit-container:not(.jodit_inline) { + background-color: var(--jd-color-background-light-gray); + border: 1px solid var(--jd-color-border); + border-radius: var(--jd-border-radius-default) +} + + .jodit-container:not(.jodit_inline) .jodit-workplace { + background-color: var(--jd-color-background-default); + border: 0 solid var(--jd-color-border); + max-height: 100% + } + + .jodit-container:not(.jodit_inline).jodit_disabled { + background: var(--jd-color-background-gray) + } + + .jodit-container:not(.jodit_inline).jodit_disabled .jodit-workplace { + opacity: .4 + } + +.jodit_disabled, .jodit_lock { + user-select: none !important +} + +.jodit_hidden { + display: none !important +} + +.jodit_vertical_middle { + align-items: center; + display: flex +} + +.jodit-box { + background: 0 0; + border: 0; + float: none; + height: auto; + margin: 0; + max-width: none; + outline: 0; + padding: 0; + position: static; + width: auto +} + +.jodit-dialog_theme_dark, .jodit_theme_dark { + --jd-color-border: #6b6b6b; + --jd-color-text: var(--jd-dark-text-color) +} + + .jodit-dialog_theme_dark .jodit-toolbar-collection_mode_horizontal, .jodit-dialog_theme_dark .jodit-toolbar-editor-collection_mode_horizontal, .jodit_theme_dark .jodit-toolbar-collection_mode_horizontal, .jodit_theme_dark .jodit-toolbar-editor-collection_mode_horizontal { + background-image: repeating-linear-gradient(transparent 0,transparent calc(var(--jd-button-size) - 1px),var(--jd-color-border) var(--jd-button-size)) + } + + .jodit-dialog_theme_dark .jodit-toolbar-collection_mode_horizontal:after, .jodit-dialog_theme_dark .jodit-toolbar-editor-collection_mode_horizontal:after, .jodit_theme_dark .jodit-toolbar-collection_mode_horizontal:after, .jodit_theme_dark .jodit-toolbar-editor-collection_mode_horizontal:after { + background-color: var(--jd-color-border) + } + + .jodit-dialog_theme_dark .jodit-toolbar__box:not(:empty), .jodit_theme_dark .jodit-toolbar__box:not(:empty) { + border-color: var(--jd-color-border) + } + + .jodit-dialog_theme_dark .jodit-toolbar__box:not(:empty) .jodit-toolbar-editor-collection:after, .jodit_theme_dark .jodit-toolbar__box:not(:empty) .jodit-toolbar-editor-collection:after { + background-color: var(--jd-color-border) + } + + .jodit-dialog_theme_dark .jodit-ui-group_separated_true:not(:last-child,.jodit-ui-group_before-spacer_true):after, .jodit_theme_dark .jodit-ui-group_separated_true:not(:last-child,.jodit-ui-group_before-spacer_true):after { + border-right-color: var(--jd-color-border) + } + + .jodit-dialog_theme_dark.jodit-container, .jodit_theme_dark.jodit-container { + background-color: var(--jd-dark-background-color); + border-color: var(--jd-color-border) + } + + .jodit-dialog_theme_dark.jodit-container.jodit_disabled, .jodit_theme_dark.jodit-container.jodit_disabled { + background-color: var(--jd-dark-background-color) + } + + .jodit-dialog_theme_dark.jodit-container:not(.jodit_inline) .jodit-workplace, .jodit_theme_dark.jodit-container:not(.jodit_inline) .jodit-workplace { + border-color: var(--jd-dark-background-color) + } + + .jodit-dialog_theme_dark .jodit-popup__content, .jodit_theme_dark .jodit-popup__content { + background: var(--jd-dark-background-color) + } + + .jodit-dialog_theme_dark .jodit-toolbar-button, .jodit-dialog_theme_dark .jodit-toolbar-select, .jodit-dialog_theme_dark .jodit-ui-button, .jodit_theme_dark .jodit-toolbar-button, .jodit_theme_dark .jodit-toolbar-select, .jodit_theme_dark .jodit-ui-button { + --jd-color-icon: var(--jd-dark-icon-color) + } + + .jodit-dialog_theme_dark .jodit-toolbar-button__text, .jodit-dialog_theme_dark .jodit-toolbar-select__text, .jodit-dialog_theme_dark .jodit-ui-button__text, .jodit_theme_dark .jodit-toolbar-button__text, .jodit_theme_dark .jodit-toolbar-select__text, .jodit_theme_dark .jodit-ui-button__text { + color: var(--jd-color-text) + } + + .jodit-dialog_theme_dark .jodit-toolbar-button .jodit-icon, .jodit-dialog_theme_dark .jodit-toolbar-button svg, .jodit-dialog_theme_dark .jodit-toolbar-button__trigger, .jodit-dialog_theme_dark .jodit-toolbar-select .jodit-icon, .jodit-dialog_theme_dark .jodit-toolbar-select svg, .jodit-dialog_theme_dark .jodit-toolbar-select__trigger, .jodit-dialog_theme_dark .jodit-ui-button .jodit-icon, .jodit-dialog_theme_dark .jodit-ui-button svg, .jodit-dialog_theme_dark .jodit-ui-button__trigger, .jodit_theme_dark .jodit-toolbar-button .jodit-icon, .jodit_theme_dark .jodit-toolbar-button svg, .jodit_theme_dark .jodit-toolbar-button__trigger, .jodit_theme_dark .jodit-toolbar-select .jodit-icon, .jodit_theme_dark .jodit-toolbar-select svg, .jodit_theme_dark .jodit-toolbar-select__trigger, .jodit_theme_dark .jodit-ui-button .jodit-icon, .jodit_theme_dark .jodit-ui-button svg, .jodit_theme_dark .jodit-ui-button__trigger { + fill: var(--jd-color-icon); + stroke: var(--jd-color-icon) + } + + .jodit-dialog_theme_dark .jodit-toolbar-button:hover:not([disabled]), .jodit-dialog_theme_dark .jodit-toolbar-button__button:hover:not([disabled]), .jodit-dialog_theme_dark .jodit-toolbar-button__text:hover:not([disabled]), .jodit-dialog_theme_dark .jodit-toolbar-button__trigger:hover:not([disabled]), .jodit-dialog_theme_dark .jodit-toolbar-select:hover:not([disabled]), .jodit-dialog_theme_dark .jodit-toolbar-select__button:hover:not([disabled]), .jodit-dialog_theme_dark .jodit-toolbar-select__text:hover:not([disabled]), .jodit-dialog_theme_dark .jodit-toolbar-select__trigger:hover:not([disabled]), .jodit-dialog_theme_dark .jodit-ui-button:hover:not([disabled]), .jodit-dialog_theme_dark .jodit-ui-button__button:hover:not([disabled]), .jodit-dialog_theme_dark .jodit-ui-button__text:hover:not([disabled]), .jodit-dialog_theme_dark .jodit-ui-button__trigger:hover:not([disabled]), .jodit_theme_dark .jodit-toolbar-button:hover:not([disabled]), .jodit_theme_dark .jodit-toolbar-button__button:hover:not([disabled]), .jodit_theme_dark .jodit-toolbar-button__text:hover:not([disabled]), .jodit_theme_dark .jodit-toolbar-button__trigger:hover:not([disabled]), .jodit_theme_dark .jodit-toolbar-select:hover:not([disabled]), .jodit_theme_dark .jodit-toolbar-select__button:hover:not([disabled]), .jodit_theme_dark .jodit-toolbar-select__text:hover:not([disabled]), .jodit_theme_dark .jodit-toolbar-select__trigger:hover:not([disabled]), .jodit_theme_dark .jodit-ui-button:hover:not([disabled]), .jodit_theme_dark .jodit-ui-button__button:hover:not([disabled]), .jodit_theme_dark .jodit-ui-button__text:hover:not([disabled]), .jodit_theme_dark .jodit-ui-button__trigger:hover:not([disabled]) { + --jd-color-text: var(--jd-dark-background-color); + --jd-color-icon: var(--jd-dark-background-color); + background-color: var(--jd-dark-background-ligher); + color: var(--jd-dark-background-color) + } + + .jodit-dialog_theme_dark .jodit-status-bar, .jodit-dialog_theme_dark .jodit-workplace + .jodit-status-bar:not(:empty), .jodit_theme_dark .jodit-status-bar, .jodit_theme_dark .jodit-workplace + .jodit-status-bar:not(:empty) { + background-color: var(--jd-dark-toolbar-color); + border-color: var(--jd-color-border); + color: var(--jd-dark-text-color) + } + + .jodit-dialog_theme_dark .jodit-status-bar, .jodit-dialog_theme_dark .jodit-status-bar .jodit-status-bar__item a, .jodit-dialog_theme_dark .jodit-status-bar .jodit-status-bar__item span, .jodit-dialog_theme_dark .jodit-status-bar a.jodit-status-bar-link, .jodit-dialog_theme_dark .jodit-status-bar a.jodit-status-bar-link:hover, .jodit-dialog_theme_dark .jodit-status-bar a.jodit-status-bar-link:visited, .jodit-dialog_theme_dark .jodit-workplace + .jodit-status-bar:not(:empty), .jodit-dialog_theme_dark .jodit-workplace + .jodit-status-bar:not(:empty) .jodit-status-bar__item a, .jodit-dialog_theme_dark .jodit-workplace + .jodit-status-bar:not(:empty) .jodit-status-bar__item span, .jodit-dialog_theme_dark .jodit-workplace + .jodit-status-bar:not(:empty) a.jodit-status-bar-link, .jodit-dialog_theme_dark .jodit-workplace + .jodit-status-bar:not(:empty) a.jodit-status-bar-link:hover, .jodit-dialog_theme_dark .jodit-workplace + .jodit-status-bar:not(:empty) a.jodit-status-bar-link:visited, .jodit_theme_dark .jodit-status-bar, .jodit_theme_dark .jodit-status-bar .jodit-status-bar__item a, .jodit_theme_dark .jodit-status-bar .jodit-status-bar__item span, .jodit_theme_dark .jodit-status-bar a.jodit-status-bar-link, .jodit_theme_dark .jodit-status-bar a.jodit-status-bar-link:hover, .jodit_theme_dark .jodit-status-bar a.jodit-status-bar-link:visited, .jodit_theme_dark .jodit-workplace + .jodit-status-bar:not(:empty), .jodit_theme_dark .jodit-workplace + .jodit-status-bar:not(:empty) .jodit-status-bar__item a, .jodit_theme_dark .jodit-workplace + .jodit-status-bar:not(:empty) .jodit-status-bar__item span, .jodit_theme_dark .jodit-workplace + .jodit-status-bar:not(:empty) a.jodit-status-bar-link, .jodit_theme_dark .jodit-workplace + .jodit-status-bar:not(:empty) a.jodit-status-bar-link:hover, .jodit_theme_dark .jodit-workplace + .jodit-status-bar:not(:empty) a.jodit-status-bar-link:visited { + color: var(--jd-dark-text-color) + } + + .jodit-dialog_theme_dark .jodit-toolbar__box:not(:empty), .jodit_theme_dark .jodit-toolbar__box:not(:empty) { + background: var(--jd-dark-toolbar-color) + } + + .jodit-dialog_theme_dark .jodit-icon-close, .jodit_theme_dark .jodit-icon-close { + stroke: var(--jd-dark-icon-color) + } + + .jodit-dialog_theme_dark .jodit-wysiwyg, .jodit-dialog_theme_dark .jodit-wysiwyg_iframe, .jodit_theme_dark .jodit-wysiwyg, .jodit_theme_dark .jodit-wysiwyg_iframe { + background-color: var(--jd-dark-background-color); + color: var(--jd-dark-text-color) + } + + .jodit-dialog_theme_dark .jodit-form input[type=text], .jodit-dialog_theme_dark .jodit-form input[type=url], .jodit-dialog_theme_dark .jodit-form textarea, .jodit_theme_dark .jodit-form input[type=text], .jodit_theme_dark .jodit-form input[type=url], .jodit_theme_dark .jodit-form textarea { + background-color: var(--jd-dark-toolbar-seperator-color1); + border-color: var(--jd-dark-toolbar-seperator-color2); + color: var(--jd-dark-text-color) + } + + .jodit-dialog_theme_dark .jodit-form button, .jodit_theme_dark .jodit-form button { + background-color: var(--jd-dark-toolbar-seperator-color3); + color: var(--jd-dark-text-color) + } + + .jodit-dialog_theme_dark .jodit-placeholder, .jodit_theme_dark .jodit-placeholder { + color: var(--jd-dark-text-color-opacity80) + } + + .jodit-dialog_theme_dark .jodit-drag-and-drop__file-box, .jodit-dialog_theme_dark .jodit_uploadfile_button, .jodit_theme_dark .jodit-drag-and-drop__file-box, .jodit_theme_dark .jodit_uploadfile_button { + color: var(--jd-dark-text-color) + } + + .jodit-dialog_theme_dark .jodit-drag-and-drop__file-box:hover, .jodit-dialog_theme_dark .jodit_uploadfile_button:hover, .jodit_theme_dark .jodit-drag-and-drop__file-box:hover, .jodit_theme_dark .jodit_uploadfile_button:hover { + background-color: var(--jd-dark-toolbar-seperator-color3) + } + + .jodit-dialog_theme_dark .jodit-add-new-line:before, .jodit_theme_dark .jodit-add-new-line:before { + border-top-color: var(--jd-dark-toolbar-seperator-color2) + } + + .jodit-dialog_theme_dark .jodit-add-new-line span, .jodit_theme_dark .jodit-add-new-line span { + background: var(--jd-dark-toolbar-seperator-color3); + border-color: var(--jd-dark-toolbar-seperator-color2) + } + + .jodit-dialog_theme_dark .jodit-add-new-line span svg, .jodit_theme_dark .jodit-add-new-line span svg { + fill: var(--jd-dark-text-color) + } + + .jodit-dialog_theme_dark .jodit-resizer > i, .jodit_theme_dark .jodit-resizer > i { + background: var(--jd-dark-toolbar-seperator-color3); + border-color: var(--jd-dark-icon-color) + } + + .jodit-dialog_theme_dark .jodit-input, .jodit-dialog_theme_dark .jodit-select, .jodit_theme_dark .jodit-input, .jodit_theme_dark .jodit-select { + background-color: var(--jd-dark-background-ligher); + border-color: var(--jd-dark-border-color); + color: var(--jd-dark-border-color) + } + + .jodit-dialog_theme_dark.jodit-dialog, .jodit_theme_dark.jodit-dialog { + background-color: var(--jd-dark-background-color) + } + + .jodit-dialog_theme_dark.jodit-dialog .jodit-dialog__header, .jodit-dialog_theme_dark.jodit-dialog .jodit-filebrowser__files.active .jodit-filebrowser__files-item, .jodit_theme_dark.jodit-dialog .jodit-dialog__header, .jodit_theme_dark.jodit-dialog .jodit-filebrowser__files.active .jodit-filebrowser__files-item { + border-color: var(--jd-dark-border-color) + } + + .jodit-dialog_theme_dark.jodit-dialog .jodit-filebrowser__files.active .jodit-filebrowser__files-item-info, .jodit_theme_dark.jodit-dialog .jodit-filebrowser__files.active .jodit-filebrowser__files-item-info { + background-color: var(--jd-dark-text-color) + } diff --git a/Wino.Mail.WinUI/JS/libs/jodit.min.js b/Wino.Mail.WinUI/JS/libs/jodit.min.js new file mode 100644 index 00000000..75b640a5 --- /dev/null +++ b/Wino.Mail.WinUI/JS/libs/jodit.min.js @@ -0,0 +1,10 @@ +/*! + * jodit - Jodit is an awesome and useful wysiwyg editor with filebrowser + * Author: Chupurnov (https://xdsoft.net/jodit/) + * Version: v4.2.5 + * Url: https://xdsoft.net/jodit/ + * License(s): MIT + */ + + +((t,e)=>{if("object"==typeof exports&&"object"==typeof module)module.exports=e();else if("function"==typeof define&&define.amd)define([],e);else{var s=e();for(var i in s)("object"==typeof exports?exports:t)[i]=s[i]}})(self,(function(){return function(){var t,e={26318(t,e,s){"use strict";function i(t){return i="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?t=>typeof t:t=>t&&"function"==typeof Symbol&&t.constructor===Symbol&&t!==Symbol.prototype?"symbol":typeof t,i(t)}function r(t,e,s){var r=s.value;if("function"!=typeof r)throw new TypeError("@boundMethod decorator can only be applied to methods not: ".concat(i(r)));var o=!1;return{configurable:!0,get(){if(o||this===t.prototype||this.hasOwnProperty(e)||"function"!=typeof r)return r;var s=r.bind(this);return o=!0,Object.defineProperty(this,e,{configurable:!0,get(){return s},set(t){r=t,delete this[e]}}),o=!1,s},set(t){r=t}}}function o(t){var e;return"undefined"!=typeof Reflect&&"function"==typeof Reflect.ownKeys?e=Reflect.ownKeys(t.prototype):(e=Object.getOwnPropertyNames(t.prototype),"function"==typeof Object.getOwnPropertySymbols&&(e=e.concat(Object.getOwnPropertySymbols(t.prototype)))),e.forEach((e=>{if("constructor"!==e){var s=Object.getOwnPropertyDescriptor(t.prototype,e);"function"==typeof s.value&&Object.defineProperty(t.prototype,e,r(t,e,s))}})),t}function n(){return 1===arguments.length?o.apply(void 0,arguments):r.apply(void 0,arguments)}s.d(e,{Ay(){return n}})},36115(t,e,s){"use strict";s.d(e,{T(){return r}});var i=s(17352);class r{constructor(){this.cache=!0,this.defaultTimeout=100,this.namespace="",this.safeMode=!1,this.width="auto",this.height="auto",this.safePluginsList=["about","enter","backspace","size","bold","hotkeys"],this.license="",this.preset="custom",this.presets={inline:{inline:!0,toolbar:!1,toolbarInline:!0,toolbarInlineForSelection:!0,showXPathInStatusbar:!1,showCharsCounter:!1,showWordsCounter:!1,showPlaceholder:!1}},this.ownerDocument="undefined"!=typeof document?document:null,this.ownerWindow="undefined"!=typeof window?window:null,this.shadowRoot=null,this.zIndex=0,this.readonly=!1,this.disabled=!1,this.activeButtonsInReadOnly=["source","fullsize","print","about","dots","selectall"],this.allowCommandsInReadOnly=["selectall","preview","print"],this.toolbarButtonSize="middle",this.allowTabNavigation=!1,this.inline=!1,this.theme="default",this.saveModeInStorage=!1,this.editorClassName=!1,this.className=!1,this.style=!1,this.containerStyle=!1,this.styleValues={},this.triggerChangeEvent=!0,this.direction="",this.language="auto",this.debugLanguage=!1,this.i18n=!1,this.tabIndex=-1,this.toolbar=!0,this.statusbar=!0,this.showTooltip=!0,this.showTooltipDelay=200,this.useNativeTooltip=!1,this.defaultActionOnPaste=i.INSERT_AS_HTML,this.enter=i.PARAGRAPH,this.iframe=!1,this.editHTMLDocumentMode=!1,this.enterBlock="br"!==this.enter?this.enter:i.PARAGRAPH,this.defaultMode=i.MODE_WYSIWYG,this.useSplitMode=!1,this.colors={greyscale:["#000000","#434343","#666666","#999999","#B7B7B7","#CCCCCC","#D9D9D9","#EFEFEF","#F3F3F3","#FFFFFF"],palette:["#980000","#FF0000","#FF9900","#FFFF00","#00F0F0","#00FFFF","#4A86E8","#0000FF","#9900FF","#FF00FF"],full:["#E6B8AF","#F4CCCC","#FCE5CD","#FFF2CC","#D9EAD3","#D0E0E3","#C9DAF8","#CFE2F3","#D9D2E9","#EAD1DC","#DD7E6B","#EA9999","#F9CB9C","#FFE599","#B6D7A8","#A2C4C9","#A4C2F4","#9FC5E8","#B4A7D6","#D5A6BD","#CC4125","#E06666","#F6B26B","#FFD966","#93C47D","#76A5AF","#6D9EEB","#6FA8DC","#8E7CC3","#C27BA0","#A61C00","#CC0000","#E69138","#F1C232","#6AA84F","#45818E","#3C78D8","#3D85C6","#674EA7","#A64D79","#85200C","#990000","#B45F06","#BF9000","#38761D","#134F5C","#1155CC","#0B5394","#351C75","#733554","#5B0F00","#660000","#783F04","#7F6000","#274E13","#0C343D","#1C4587","#073763","#20124D","#4C1130"]},this.colorPickerDefaultTab="background",this.imageDefaultWidth=300,this.removeButtons=[],this.disablePlugins=[],this.extraPlugins=[],this.extraButtons=[],this.extraIcons={},this.createAttributes={table:{style:"border-collapse:collapse;width: 100%;"}},this.sizeLG=900,this.sizeMD=700,this.sizeSM=400,this.buttons=[{group:"font-style",buttons:[]},{group:"list",buttons:[]},{group:"font",buttons:[]},"---",{group:"script",buttons:[]},{group:"media",buttons:[]},"\n",{group:"state",buttons:[]},{group:"clipboard",buttons:[]},{group:"insert",buttons:[]},{group:"indent",buttons:[]},{group:"color",buttons:[]},{group:"form",buttons:[]},"---",{group:"history",buttons:[]},{group:"search",buttons:[]},{group:"source",buttons:[]},{group:"other",buttons:[]},{group:"info",buttons:[]}],this.events={},this.textIcons=!1,this.showBrowserColorPicker=!0}static get defaultOptions(){return r.__defaultOptions||(r.__defaultOptions=new r),r.__defaultOptions}}r.prototype.controls={}},86302(t,e,s){"use strict";s.d(e,{j(){return h}});var i=s(17352),r=s(59146),o=s(69052),n=s(2461),a=s(25376),l=s(92039),c=s(98253),u=s(35642),d=(s(28712),s(21567));class h{constructor(){this.timers=new Map,this.__callbacks=new Map,this.__queueMicrotaskNative=queueMicrotask?.bind(window)??Promise.resolve().then.bind(Promise.resolve()),this.promisesRejections=new Set,this.requestsIdle=new Set,this.requestsRaf=new Set,this.requestIdleCallbackNative=window.requestIdleCallback?.bind(window)??((t,e)=>{const s=Date.now();return this.setTimeout((()=>{t({didTimeout:!1,timeRemaining(){return Math.max(0,50-(Date.now()-s))}})}),e?.timeout??1)}),this.__cancelIdleCallbackNative=window.cancelIdleCallback?.bind(window)??(t=>{this.clearTimeout(t)}),this.isDestructed=!1}delay(t){return this.promise((e=>this.setTimeout(e,t)))}setTimeout(t,e,...s){if(this.isDestructed)return 0;let i={};(0,u.R)(e)&&(e=0),(0,n.E)(e)||(i=e,e=i.timeout||0),i.label&&this.clearLabel(i.label);const o=(0,r.w)(t,e,...s),a=i.label||o;return this.timers.set(a,o),this.__callbacks.set(a,t),o}updateTimeout(t,e){if(!t||!this.timers.has(t))return null;const s=this.__callbacks.get(t);return this.setTimeout(s,{label:t,timeout:e})}clearLabel(t){t&&this.timers.has(t)&&((0,r.D)(this.timers.get(t)),this.timers.delete(t),this.__callbacks.delete(t))}clearTimeout(t){if((0,c.K)(t))return this.clearLabel(t);(0,r.D)(t),this.timers.delete(t),this.__callbacks.delete(t)}debounce(t,e,s=!1){let i=0,n=!1;const c=[],u=(...e)=>{if(!n){i=0;const s=t(...e);if(n=!0,c.length){const t=()=>{c.forEach((t=>t())),c.length=0};(0,l.y)(s)?s.finally(t):t()}}},d=(...a)=>{n=!1,e?(!i&&s&&u(...a),(0,r.D)(i),i=this.setTimeout((()=>u(...a)),(0,o.T)(e)?e():e),this.timers.set(t,i)):u(...a)};return(0,a.Q)(e)&&e.promisify?(...t)=>{const e=this.promise((t=>{c.push(t)}));return d(...t),e}:d}microDebounce(t,e=!1){let s,i=!1,r=!0;return(...o)=>{s=o,i?r=!0:(r=!0,e&&(r=!1,t(...s)),i=!0,this.__queueMicrotaskNative((()=>{i=!1,this.isDestructed||r&&t(...s)})))}}throttle(t,e,s=!1){let i,r,n,a=null;return(...s)=>{i=!0,n=s,e?a||(r=()=>{i?(t(...n),i=!1,a=this.setTimeout(r,(0,o.T)(e)?e():e),this.timers.set(r,a)):a=null},r()):t(...n)}}promise(t){let e=()=>{};const s=new Promise(((s,i)=>{e=()=>i((0,d.h)()),this.promisesRejections.add(e),t(s,i)}));return s.finally||"undefined"==typeof process||i.IS_ES_NEXT||(s.finally=t=>(s.then(t).catch(t),s)),s.finally((()=>{this.promisesRejections.delete(e)})).catch((()=>null)),s.rejectCallback=e,s}promiseState(t){if(t.status)return t.status;if(!Promise.race)return new Promise((e=>{t.then((t=>(e("fulfilled"),t)),(t=>{throw e("rejected"),t})),this.setTimeout((()=>{e("pending")}),100)}));const e={};return Promise.race([t,e]).then((t=>t===e?"pending":"fulfilled"),(()=>"rejected"))}requestIdleCallback(t,e){const s=this.requestIdleCallbackNative(t,e);return this.requestsIdle.add(s),s}requestIdlePromise(t){return this.promise((e=>{const s=this.requestIdleCallback((()=>e(s)),t)}))}cancelIdleCallback(t){return this.requestsIdle.delete(t),this.__cancelIdleCallbackNative(t)}requestAnimationFrame(t){const e=requestAnimationFrame(t);return this.requestsRaf.add(e),e}cancelAnimationFrame(t){this.requestsRaf.delete(t),cancelAnimationFrame(t)}clear(){this.requestsIdle.forEach((t=>this.cancelIdleCallback(t))),this.requestsRaf.forEach((t=>this.cancelAnimationFrame(t))),this.timers.forEach((t=>(0,r.D)(this.timers.get(t)))),this.timers.clear(),this.promisesRejections.forEach((t=>t())),this.promisesRejections.clear()}destruct(){this.clear(),this.isDestructed=!0}}},64890(t,e,s){"use strict";s.d(e,{j(){return i.j}});var i=s(86302)},37474(t,e,s){"use strict";s.d(e,{u(){return l}});var i=s(64890),r=s(64567),o=s(56298),n=s(65147);const a=new Map;class l{get componentName(){return this.__componentName||(this.__componentName="jodit-"+(0,n.kebabCase)(((0,n.isFunction)(this.className)?this.className():"")||(0,n.getClassName)(this))),this.__componentName}getFullElName(t,e,s){const i=[this.componentName];return t&&(t=t.replace(/[^a-z0-9-]/gi,"-"),i.push("__"+t)),e&&(i.push("_",e),i.push("_",(0,n.isVoid)(s)?"true":""+s)),i.join("")}get ownerDocument(){return this.ow.document}get od(){return this.ownerDocument}get ow(){return this.ownerWindow}get(t,e){return(0,n.get)(t,e||this)}get isReady(){return this.componentStatus===r.f.ready}get isDestructed(){return this.componentStatus===r.f.destructed}get isInDestruct(){return r.f.beforeDestruct===this.componentStatus||r.f.destructed===this.componentStatus}bindDestruct(t){return t.hookStatus(r.f.beforeDestruct,(()=>!this.isInDestruct&&this.destruct())),this}constructor(){this.async=new i.j,this.ownerWindow=window,this.__componentStatus=r.f.beforeInit,this.uid="jodit-uid-"+(0,o.w9)()}destruct(){this.setStatus(r.f.destructed),this.async&&(this.async.destruct(),this.async=void 0),a.get(this)&&a.delete(this),this.ownerWindow=void 0}get componentStatus(){return this.__componentStatus}set componentStatus(t){this.setStatus(t)}setStatus(t){return this.setStatusComponent(t,this)}setStatusComponent(t,e){if(t===this.__componentStatus)return;e===this&&(this.__componentStatus=t);const s=Object.getPrototypeOf(this);s&&(0,n.isFunction)(s.setStatusComponent)&&s.setStatusComponent(t,e);const i=a.get(this),r=i?.[t];r&&r.length&&r.forEach((t=>t(e)))}hookStatus(t,e){let s=a.get(this);s||(s={},a.set(this,s)),s[t]||(s[t]=[]),s[t].push(e)}static isInstanceOf(t,e){return t instanceof e}}l.STATUSES=r.f},77753(t,e,s){"use strict";s.d(e,{f(){return r.f},uA(){return i.u},vG(){return o.v}});var i=s(37474),r=s(64567),o=s(7982)},64567(t,e,s){"use strict";s.d(e,{f(){return i}});const i={beforeInit:"beforeInit",ready:"ready",beforeDestruct:"beforeDestruct",destructed:"destructed"}},7982(t,e,s){"use strict";s.d(e,{v(){return r}});var i=s(37474);class r extends i.u{get j(){return this.jodit}get defaultTimeout(){return this.j.defaultTimeout}i18n(t,...e){return this.j.i18n(t,...e)}setParentView(t){return this.jodit=t,t.components.add(this),this}constructor(t){super(),this.setParentView(t)}destruct(){return this.j.components.delete(this),super.destruct()}}},17352(t,e,s){"use strict";s.r(e),s.d(e,{ACCURACY(){return J},APP_VERSION(){return i},BASE_PATH(){return at},BR(){return F},CLIPBOARD_ID(){return ut},COMMAND_KEYS(){return H},EMULATE_DBLCLICK_TIMEOUT(){return Q},ES(){return r},FAT_MODE(){return c},HOMEPAGE(){return u},INSEPARABLE_TAGS(){return T},INSERT_AS_HTML(){return tt},INSERT_AS_TEXT(){return st},INSERT_CLEAR_HTML(){return et},INSERT_ONLY_TEXT(){return it},INVISIBLE_SPACE(){return p},INVISIBLE_SPACE_REG_EXP(){return g},INVISIBLE_SPACE_REG_EXP_END(){return f},INVISIBLE_SPACE_REG_EXP_START(){return v},IS_BLOCK(){return w},IS_ES_MODERN(){return o},IS_ES_NEXT(){return n},IS_IE(){return K},IS_INLINE(){return C},IS_MAC(){return ot},IS_PROD(){return a},IS_TEST(){return l},KEY_ALIASES(){return nt},KEY_ALT(){return A},KEY_BACKSPACE(){return I},KEY_DELETE(){return D},KEY_DOWN(){return N},KEY_ENTER(){return z},KEY_ESC(){return L},KEY_F3(){return q},KEY_LEFT(){return M},KEY_META(){return x},KEY_RIGHT(){return R},KEY_SPACE(){return B},KEY_TAB(){return j},KEY_UP(){return P},LIST_TAGS(){return k},MARKER_CLASS(){return Z},MODE_SOURCE(){return $},MODE_SPLIT(){return U},MODE_WYSIWYG(){return W},NBSP_SPACE(){return m},NEARBY(){return O},NO_EMPTY_TAGS(){return E},PARAGRAPH(){return V},PASSIVE_EVENTS(){return ht},SAFE_COUNT_CHANGE_CALL(){return rt},SET_TEST(){return d},SOURCE_CONSUMER(){return dt},SPACE_REG_EXP(){return b},SPACE_REG_EXP_END(){return _},SPACE_REG_EXP_START(){return y},TEMP_ATTR(){return lt},TEXT_HTML(){return G},TEXT_PLAIN(){return Y},TEXT_RTF(){return X},TOKENS(){return h},lang(){return ct}});const i="4.2.5",r="es2021",o=!0,n=!0,a=!0;let l=!1;const c=!1,u="https://xdsoft.net/jodit/",d=()=>l=!0,h={},p="\ufeff",m=" ",g=()=>/[\uFEFF]/g,f=()=>/[\uFEFF]+$/g,v=()=>/^[\uFEFF]+/g,b=()=>/[\s\n\t\r\uFEFF\u200b]+/g,y=()=>/^[\s\n\t\r\uFEFF\u200b]+/g,_=()=>/[\s\n\t\r\uFEFF\u200b]+$/g,w=/^(ADDRESS|ARTICLE|ASIDE|BLOCKQUOTE|CANVAS|DD|DFN|DIV|DL|DT|FIELDSET|FIGCAPTION|FIGURE|FOOTER|FORM|H[1-6]|HEADER|HGROUP|HR|LI|MAIN|NAV|NOSCRIPT|OUTPUT|P|PRE|RUBY|SCRIPT|STYLE|OBJECT|OL|SECTION|IFRAME|JODIT|JODIT-MEDIA|UL|TR|TD|TH|TBODY|THEAD|TFOOT|TABLE|BODY|HTML|VIDEO)$/i,C=/^(STRONG|SPAN|I|EM|B|SUP|SUB|A|U)$/i,k=new Set(["ul","ol"]),S=["img","video","svg","iframe","script","input","textarea","link","jodit","jodit-media"],T=new Set([...S,"br","hr"]),E=new Set(S),x="Meta",I="Backspace",j="Tab",z="Enter",L="Escape",A="Alt",M="ArrowLeft",P="ArrowUp",R="ArrowRight",N="ArrowDown",B="Space",D="Delete",q="F3",O=5,J=10,H=[x,I,D,P,N,R,M,z,L,q,j],F="br",V="p",W=1,$=2,U=3,K="undefined"!=typeof navigator&&(-1!==navigator.userAgent.indexOf("MSIE")||/rv:11.0/i.test(navigator.userAgent)),Y=K?"text":"text/plain",G=K?"html":"text/html",X=K?"rtf":"text/rtf",Z="jodit-selection_marker",Q=300,tt="insert_as_html",et="insert_clear_html",st="insert_as_text",it="insert_only_text",rt=10,ot="undefined"!=typeof window&&/Mac|iPod|iPhone|iPad/.test(window.navigator.platform),nt={add:"+",break:"pause",cmd:"meta",command:"meta",ctl:"control",ctrl:"control",del:"delete",down:"arrowdown",esc:"escape",ins:"insert",left:"arrowleft",mod:ot?"meta":"control",opt:"alt",option:"alt",return:"enter",right:"arrowright",space:" ",spacebar:" ",up:"arrowup",win:"meta",windows:"meta"},at=(()=>{if("undefined"==typeof document)return"";const t=document.currentScript,e=t=>{const e=t.split("/");return/\.js/.test(e[e.length-1])?e.slice(0,e.length-1).join("/")+"/":t};if(t)return e(t.src);const s=document.querySelectorAll("script[src]");return s&&s.length?e(s[s.length-1].src):window.location.href})(),lt="data-jodit-temp",ct={},ut="clipboard",dt="source-consumer",ht=new Set(["touchstart","touchend","scroll","mousewheel","mousemove","touchmove"])},92852(t,e,s){"use strict";s.d(e,{X(){return n}});var i=s(17352),r=s(55186),o=s(65147);s(28712);class n{get doc(){return(0,o.isFunction)(this.document)?this.document():this.document}constructor(t,e){this.document=t,this.createAttributes=e}element(t,e,s){const i=this.doc.createElement(t.toLowerCase());return this.applyCreateAttributes(i),e&&((0,o.isPlainObject)(e)?(0,o.attr)(i,e):s=e),s&&(0,o.asArray)(s).forEach((t=>i.appendChild((0,o.isString)(t)?this.fromHTML(t):t))),i}div(t,e,s){const i=this.element("div",e,s);return t&&(i.className=t),i}sandbox(){const t=this.element("iframe",{sandbox:"allow-same-origin"});this.doc.body.appendChild(t);const e=t.contentWindow?.document;if(!e)throw Error("Iframe error");return e.open(),e.write(""),e.close(),[e.body,t]}span(t,e,s){const i=this.element("span",e,s);return t&&(i.className=t),i}a(t,e,s){const i=this.element("a",e,s);return t&&(i.className=t),i}text(t){return this.doc.createTextNode(t)}fake(){return this.text(i.INVISIBLE_SPACE)}fragment(){return this.doc.createDocumentFragment()}fromHTML(t,e){const s=this.div();s.innerHTML=""+t;const i=s.firstChild===s.lastChild&&s.firstChild?s.firstChild:s;if(r.J.safeRemove(i),e){const t=(0,o.refs)(i);Object.keys(e).forEach((s=>{const i=t[s];i&&!1===e[s]&&r.J.hide(i)}))}return i}applyCreateAttributes(t){if(this.createAttributes){const e=this.createAttributes;if(e&&e[t.tagName.toLowerCase()]){const s=e[t.tagName.toLowerCase()];(0,o.isFunction)(s)?s(t):(0,o.isPlainObject)(s)&&(0,o.attr)(t,s)}}}}},40594(t,e,s){"use strict";s.d(e,{X(){return i.X}});var i=s(92852)},11961(t,e,s){"use strict";s.d(e,{d(){return i.Ay}});var i=s(26318)},87875(t,e,s){"use strict";s.d(e,{OK(){return c},PO(){return a},PP(){return l}});var i=s(64567),r=s(55186),o=s(9823),n=s(76166);function a(t,e){const s=Object.getOwnPropertyDescriptor(t,e);return!s||(0,o.Tn)(s.get)?null:s.value}function l(t,e,s){const i=s.get;if(!i)throw(0,n.z3)("Getter property descriptor expected");s.get=function(){const t=i.call(this);return t&&!0===t.noCache||Object.defineProperty(this,e,{configurable:s.configurable,enumerable:s.enumerable,writable:!1,value:t}),t}}function c(t,e,s){const a=s.value;if(!(0,o.Tn)(a))throw(0,n.z3)("Handler must be a Function");let l=!0;const c=new WeakMap;s.value=function(...t){if(l&&c.has(this.constructor))return c.get(this.constructor)?.cloneNode(!0);const e=a.apply(this,t);return l&&r.J.isElement(e)&&c.set(this.constructor,e),l?e.cloneNode(!0):e},t.hookStatus(i.f.ready,(t=>{const e=(0,o.hH)(t)?t:t.jodit;l=!!e.options.cache}))}},24767(t,e,s){"use strict";function i(t){class e extends t{constructor(...t){super(...t),this.constructor===e&&(this instanceof e||Object.setPrototypeOf(this,e.prototype),this.setStatus("ready"))}}return e}s.d(e,{s(){return i}})},37075(t,e,s){"use strict";s.d(e,{n(){return a},s(){return n}});var i=s(77753),r=s(9823),o=(s(28712),s(50156));function n(t,e=!1,s="debounce"){return(n,a)=>{const l=n[a];if(!(0,r.Tn)(l))throw(0,o.z3)("Handler must be a Function");return n.hookStatus(i.f.ready,(i=>{const{async:o}=i,n=(0,r.Tn)(t)?t(i):t,l=(0,r.Et)(n)||(0,r.Qd)(n)?n:i.defaultTimeout;Object.defineProperty(i,a,{configurable:!0,value:o[s](i[a].bind(i),l,e)})})),{configurable:!0,get(){return l.bind(this)}}}}function a(t,e=!1){return n(t,e,"throttle")}},1963(t,e,s){"use strict";s.d(e,{C(){return r}});var i=s(69052);function r(...t){return e=>{const s=e.prototype;for(let e=0;t.length>e;e++){const r=t[e],o=Object.getOwnPropertyNames(r.prototype);for(let t=0;o.length>t;t++){const e=o[t],n=Object.getOwnPropertyDescriptor(r.prototype,e);null!=n&&(0,i.T)(n.value)&&!(0,i.T)(s[e])&&Object.defineProperty(s,e,{enumerable:!0,configurable:!0,writable:!0,value(...t){return n.value.call(this,...t)}})}}}}},71151(t,e,s){"use strict";s.d(e,{A(){return o}});var i=s(69052),r=s(50156);function o(t){return(e,s)=>{if(!(0,i.T)(e[s]))throw(0,r.z3)("Handler must be a Function");e.hookStatus(t,(t=>{t[s].call(t)}))}}},86285(t,e,s){"use strict";s.d(e,{N(){return n}});var i=s(77753),r=s(69052),o=s(50156);function n(){return(t,e)=>{if(!(0,r.T)(t[e]))throw(0,o.z3)("Handler must be a Function");t.hookStatus(i.f.ready,(t=>{const{async:s}=t,i=t[e];t[e]=(...e)=>s.requestIdleCallback(i.bind(t,...e))}))}}},22664(t,e,s){"use strict";s.r(e),s.d(e,{autobind(){return i.d},cache(){return r.PP},cacheHTML(){return r.OK},cached(){return r.PO},component(){return o.s},debounce(){return n.s},derive(){return a.C},getPropertyDescriptor(){return p.N},hook(){return l.A},idle(){return c.N},nonenumerable(){return u.m},persistent(){return d.y},throttle(){return n.n},wait(){return h.u},watch(){return p.w}});var i=s(11961),r=s(87875),o=s(24767),n=s(37075),a=s(1963),l=s(71151),c=s(86285),u=s(48791),d=s(33087),h=s(48647),p=s(66927)},48791(t,e,s){"use strict";s.d(e,{m(){return i}});const i=(t,e)=>{!1!==(Object.getOwnPropertyDescriptor(t,e)||{}).enumerable&&Object.defineProperty(t,e,{enumerable:!1,set(t){Object.defineProperty(this,e,{enumerable:!1,writable:!0,value:t})}})}},33087(t,e,s){"use strict";s.d(e,{y(){return o}});var i=s(64567),r=s(12041);function o(t,e){t.hookStatus(i.f.ready,(t=>{const s=(0,r.h)(t)?t:t.jodit,i=`${s.options.namespace}${t.componentName}_prop_${e}`,o=t[e];Object.defineProperty(t,e,{get:()=>s.storage.get(i)??o,set(t){s.storage.set(i,t)}})}))}},48647(t,e,s){"use strict";s.d(e,{u(){return n}});var i=s(64567),r=s(69052),o=s(50156);function n(t){return(e,s)=>{if(!(0,r.T)(e[s]))throw(0,o.z3)("Handler must be a Function");e.hookStatus(i.f.ready,(e=>{const{async:i}=e,r=e[s];let o=0;Object.defineProperty(e,s,{configurable:!0,value:function s(...n){i.clearTimeout(o),t(e)?r.apply(e,n):o=i.setTimeout((()=>s(...n)),10)}})}))}}},66927(t,e,s){"use strict";s.d(e,{N(){return u},w(){return d}});var i=s(64567),r=s(32332),o=s(42589),n=s(69052),a=s(25376),l=s(12041),c=s(50156);function u(t,e){let s;do{s=Object.getOwnPropertyDescriptor(t,e),t=Object.getPrototypeOf(t)}while(!s&&t);return s}function d(t,e){return(s,d)=>{if(!(0,n.T)(s[d]))throw(0,c.z3)("Handler must be a Function");const h=e?.immediately??!0,p=e?.context,m=e=>{const i=(0,l.h)(e)?e:e.jodit;let c=(t,...s)=>{if(!e.isInDestruct)return e[d](t,...s)};h||(c=e.async.microDebounce(c,!0)),(0,o.u)(t).forEach((t=>{if(/:/.test(t)){const[s,r]=t.split(":");let o=p;return s.length&&(o=e.get(s)),(0,n.T)(o)&&(o=o(e)),i.events.on(o||e,r,c),o||i.events.on(r,c),void e.hookStatus("beforeDestruct",(()=>{i.events.off(o||e,r,c).off(r,c)}))}const o=t.split("."),[l]=o,d=o.slice(1);let h=e[l];(0,a.Q)(h)&&(0,r.s)(h).on("change."+d.join("."),c);const m=u(s,l);Object.defineProperty(e,l,{configurable:!0,set(t){const s=h;s!==t&&(h=t,m&&m.set&&m.set.call(e,t),(0,a.Q)(h)&&(h=(0,r.s)(h),h.on("change."+d.join("."),c)),c(l,s,h))},get:()=>m&&m.get?m.get.call(e):h})}))};(0,n.T)(s.hookStatus)?s.hookStatus(i.f.ready,m):m(s)}}},55186(t,e,s){"use strict";s.d(e,{J(){return l}});var i=s(17352),r=s(42448),o=s(9823),n=s(59101),a=s(97369);class l{constructor(){throw Error("Dom is static module")}static detach(t){for(;t&&t.firstChild;)t.removeChild(t.firstChild)}static wrapInline(t,e,s){let i,r=t,n=t;s.s.save();let a=!1;do{a=!1,i=r.previousSibling,i&&!l.isBlock(i)&&(a=!0,r=i)}while(a);do{a=!1,i=n.nextSibling,i&&!l.isBlock(i)&&(a=!0,n=i)}while(a);const c=(0,o.Kg)(e)?s.createInside.element(e):e;r.parentNode&&r.parentNode.insertBefore(c,r);let u=r;for(;u&&(u=r.nextSibling,c.appendChild(r),r!==n&&u);)r=u;return s.s.restore(),c}static wrap(t,e,s){const i=(0,o.Kg)(e)?s.element(e):e;if(l.isNode(t)){if(!t.parentNode)throw(0,a.error)("Element should be in DOM");t.parentNode.insertBefore(i,t),i.appendChild(t)}else{const e=t.extractContents();t.insertNode(i),i.appendChild(e)}return i}static unwrap(t){const e=t.parentNode;if(e){for(;t.firstChild;)e.insertBefore(t.firstChild,t);l.safeRemove(t)}}static between(t,e,s){let i=t;for(;i&&i!==e&&(t===i||!s(i));){let t=i.firstChild||i.nextSibling;if(!t){for(;i&&!i.nextSibling;)i=i.parentNode;t=i?.nextSibling}i=t}}static replace(t,e,s,i=!1,n=!1){(0,o.AH)(e)&&(e=s.fromHTML(e));const a=(0,o.Kg)(e)?s.element(e):e;if(!n)for(;t.firstChild;)a.appendChild(t.firstChild);return i&&l.isElement(t)&&l.isElement(a)&&(0,r.$)(t.attributes).forEach((t=>{a.setAttribute(t.name,t.value)})),t.parentNode&&t.parentNode.replaceChild(a,t),a}static isEmptyTextNode(t){return l.isText(t)&&(!t.nodeValue||0===t.nodeValue.replace(i.INVISIBLE_SPACE_REG_EXP(),"").trim().length)}static isEmptyContent(t){return l.each(t,(t=>l.isEmptyTextNode(t)))}static isContentEditable(t,e){return l.isNode(t)&&!l.closest(t,(t=>l.isElement(t)&&"false"===t.getAttribute("contenteditable")),e)}static isEmpty(t,e=i.NO_EMPTY_TAGS){if(!t)return!0;let s;s=(0,o.Tn)(e)?e:t=>e.has(t.nodeName.toLowerCase());const r=t=>null==t.nodeValue||0===(0,n.Bq)(t.nodeValue).length;return l.isText(t)?r(t):!(l.isElement(t)&&s(t))&&l.each(t,(t=>{if(l.isText(t)&&!r(t)||l.isElement(t)&&s(t))return!1}))}static isNode(t){return!!(t&&(0,o.Kg)(t.nodeName)&&"number"==typeof t.nodeType&&t.childNodes&&(0,o.Tn)(t.appendChild))}static isCell(t){return l.isNode(t)&&("TD"===t.nodeName||"TH"===t.nodeName)}static isList(t){return l.isTag(t,i.LIST_TAGS)}static isLeaf(t){return l.isTag(t,"li")}static isImage(t){return l.isNode(t)&&/^(img|svg|picture|canvas)$/i.test(t.nodeName)}static isBlock(t){return!(0,o.Rd)(t)&&"object"==typeof t&&l.isNode(t)&&i.IS_BLOCK.test(t.nodeName)}static isText(t){return!(!t||t.nodeType!==Node.TEXT_NODE)}static isComment(t){return!(!t||t.nodeType!==Node.COMMENT_NODE)}static isElement(t){if(!l.isNode(t))return!1;const e=t.ownerDocument?.defaultView;return!(!e||t.nodeType!==Node.ELEMENT_NODE)}static isFragment(t){if(!l.isNode(t))return!1;const e=t.ownerDocument?.defaultView;return!(!e||t.nodeType!==Node.DOCUMENT_FRAGMENT_NODE)}static isHTMLElement(t){if(!l.isNode(t))return!1;const e=t.ownerDocument?.defaultView;return!!(e&&t instanceof e.HTMLElement)}static isInlineBlock(t){return l.isElement(t)&&!/^(BR|HR)$/i.test(t.tagName)&&-1!==["inline","inline-block"].indexOf(""+(0,a.css)(t,"display"))}static canSplitBlock(t){return!(0,o.Rd)(t)&&l.isHTMLElement(t)&&l.isBlock(t)&&!/^(TD|TH|CAPTION|FORM)$/.test(t.nodeName)&&void 0!==t.style&&!/^(fixed|absolute)/i.test(t.style.position)}static last(t,e){let s=t?.lastChild;if(!s)return null;do{if(e(s))return s;let i=s.lastChild;if(i||(i=s.previousSibling),!i&&s.parentNode!==t){do{s=s.parentNode}while(s&&!s?.previousSibling&&s.parentNode!==t);i=s?.previousSibling}s=i}while(s);return null}static prev(t,e,s,i=!0){return l.find(t,e,s,!1,i)}static next(t,e,s,i=!0){return l.find(t,e,s,!0,i)}static prevWithClass(t,e){return l.prev(t,(t=>l.isElement(t)&&t.classList.contains(e)),t.parentNode)}static nextWithClass(t,e){return l.next(t,(t=>l.isElement(t)&&t.classList.contains(e)),t.parentNode)}static find(t,e,s,i=!0,r=!0){const o=this.nextGen(t,s,i,r);let n=o.next();for(;!n.done;){if(e(n.value))return n.value;n=o.next()}return null}static*nextGen(t,e,s=!0,i=!0){const r=[];let o=t;do{let e=s?o.nextSibling:o.previousSibling;for(;e;)r.unshift(e),e=s?e.nextSibling:e.previousSibling;yield*this.runInStack(t,r,s,i),o=o.parentNode}while(o&&o!==e);return null}static each(t,e,s=!0){const i=this.eachGen(t,s);let r=i.next();for(;!r.done;){if(!1===e(r.value))return!1;r=i.next()}return!0}static eachGen(t,e=!0){return this.runInStack(t,[t],e)}static*runInStack(t,e,s,i=!0){for(;e.length;){const r=e.pop();if(i){let t=s?r.lastChild:r.firstChild;for(;t;)e.push(t),t=s?t.previousSibling:t.nextSibling}t!==r&&(yield r)}}static findWithCurrent(t,e,s,i="nextSibling",r="firstChild"){let o=t;do{if(e(o))return o||null;if(r&&o&&o[r]){const t=l.findWithCurrent(o[r],e,o,i,r);if(t)return t}for(;o&&!o[i]&&o!==s;)o=o.parentNode;o&&o[i]&&o!==s&&(o=o[i])}while(o&&o!==s);return null}static findSibling(t,e=!0,s=(t=>!l.isEmptyTextNode(t))){let i=l.sibling(t,e);for(;i&&!s(i);)i=l.sibling(i,e);return i&&s(i)?i:null}static findNotEmptySibling(t,e){return l.findSibling(t,e,(t=>!l.isEmptyTextNode(t)&&!!(!l.isText(t)||t.nodeValue?.length&&(0,n.Bq)(t.nodeValue))))}static findNotEmptyNeighbor(t,e,s){return(0,a.call)(e?l.prev:l.next,t,(t=>!(!t||(l.isText(t)||l.isComment(t))&&!(0,n.Bq)(t?.nodeValue||"").length)),s)}static sibling(t,e){return e?t.previousSibling:t.nextSibling}static up(t,e,s,i=!1){let r=t;if(!r)return null;do{if(e(r))return r;if(r===s||!r.parentNode)break;r=r.parentNode}while(r&&r!==s);return r===s&&i&&e(r)?r:null}static closest(t,e,s){let i;const r=t=>t.toLowerCase();if((0,o.Tn)(e))i=e;else if((0,o.cy)(e)||(0,o.vM)(e)){const t=(0,o.vM)(e)?e:new Set(e.map(r));i=e=>!(!e||!t.has(r(e.nodeName)))}else i=t=>!(!t||r(e)!==r(t.nodeName));return l.up(t,i,s)}static furthest(t,e,s){let i=null,r=t?.parentElement;for(;r&&r!==s;)e(r)&&(i=r),r=r?.parentElement;return i}static appendChildFirst(t,e){const s=t.firstChild;s?s!==e&&t.insertBefore(e,s):t.appendChild(e)}static after(t,e){const{parentNode:s}=t;s&&(s.lastChild===t?s.appendChild(e):s.insertBefore(e,t.nextSibling))}static before(t,e){const{parentNode:s}=t;s&&s.insertBefore(e,t)}static prepend(t,e){t.insertBefore(e,t.firstChild)}static append(t,e){(0,o.cy)(e)?e.forEach((e=>{this.append(t,e)})):t.appendChild(e)}static moveContent(t,e,s=!1,i=(()=>!0)){const o=(t.ownerDocument||document).createDocumentFragment();(0,r.$)(t.childNodes).filter((t=>!!i(t)||(l.safeRemove(t),!1))).forEach((t=>{o.appendChild(t)})),s&&e.firstChild?e.insertBefore(o,e.firstChild):e.appendChild(o)}static isOrContains(t,e,s=!1){return t===e?!s:!!(e&&t&&this.up(e,(e=>e===t),t,!0))}static safeRemove(...t){t.forEach((t=>l.isNode(t)&&t.parentNode&&t.parentNode.removeChild(t)))}static safeInsertNode(t,e){t.collapsed||t.deleteContents();const s=l.isFragment(e)?e.lastChild:e;t.startContainer===t.endContainer&&t.collapsed&&l.isTag(t.startContainer,i.INSEPARABLE_TAGS)?l.after(t.startContainer,e):(t.insertNode(e),s&&t.setStartBefore(s)),t.collapse(!0),[e.nextSibling,e.previousSibling].forEach((t=>l.isText(t)&&!t.nodeValue&&l.safeRemove(t)))}static hide(t){t&&((0,a.dataBind)(t,"__old_display",t.style.display),t.style.display="none")}static show(t){if(!t)return;const e=(0,a.dataBind)(t,"__old_display");"none"===t.style.display&&(t.style.display=e||"")}static isTag(t,e){if(!this.isElement(t))return!1;const s=t.tagName.toLowerCase(),i=t.tagName.toUpperCase();if(e instanceof Set)return e.has(s)||e.has(i);if(Array.isArray(e))throw new TypeError("Dom.isTag does not support array");return s===e||i===e}static markTemporary(t,e){return e&&(0,a.attr)(t,e),(0,a.attr)(t,i.TEMP_ATTR,!0),t}static isTemporary(t){return!!l.isElement(t)&&((0,o.rg)(t)||"true"===(0,a.attr)(t,i.TEMP_ATTR))}static replaceTemporaryFromString(t){return t.replace(/<([a-z]+)[^>]+data-jodit-temp[^>]+>(.+?)<\/\1>/gi,"$2")}static temporaryList(t){return(0,a.$$)(`[${i.TEMP_ATTR}]`,t)}}},71842(t,e,s){"use strict";s.d(e,{J(){return i.J},p(){return r.p}});var i=s(55186),r=s(8453)},8453(t,e,s){"use strict";s.d(e,{p(){return a}});var i=s(31635),r=s(22664),o=s(55186),n=s(43431);class a extends n.h{setWork(t){return this.isWorked&&this.break(),this.workNodes=o.J.eachGen(t,!this.options.reverse),this.isFinished=!1,this.startIdleRequest(),this}constructor(t,e={}){super(),this.async=t,this.options=e,this.workNodes=null,this.hadAffect=!1,this.isWorked=!1,this.isFinished=!1,this.idleId=0}startIdleRequest(){this.idleId=this.async.requestIdleCallback(this.workPerform,{timeout:this.options.timeout??10})}break(t){this.isWorked&&(this.stop(),this.emit("break",t))}end(){this.isWorked&&(this.stop(),this.emit("end",this.hadAffect),this.hadAffect=!1)}stop(){this.isWorked=!1,this.isFinished=!0,this.workNodes=null,this.async.cancelIdleCallback(this.idleId)}destruct(){super.destruct(),this.stop()}workPerform(t){if(this.workNodes){this.isWorked=!0;let e=0;const s=this.options.timeoutChunkSize??50;for(;!this.isFinished&&(t.timeRemaining()>0||t.didTimeout&&s>=e);){const t=this.workNodes.next();if(e+=1,this.visitNode(t.value)&&(this.hadAffect=!0),t.done)return void this.end()}}else this.end();this.isFinished||this.startIdleRequest()}visitNode(t){return!(!t||void 0!==this.options.whatToShow&&t.nodeType!==this.options.whatToShow)&&(this.emit("visit",t)??!1)}}(0,i.Cg)([r.autobind],a.prototype,"workPerform",null)},50658(t,e,s){"use strict";s.d(e,{b(){return u}});var i=s(17352),r=s(42589),o=s(37923),n=s(69052),a=s(98253),l=s(50156),c=s(10004);class u{mute(t){return this.__mutedEvents.add(t??"*"),this}isMuted(t){return!(!t||!this.__mutedEvents.has(t))||this.__mutedEvents.has("*")}unmute(t){return this.__mutedEvents.delete(t??"*"),this}__eachEvent(t,e){(0,r.u)(t).map((t=>t.trim())).forEach((t=>{const s=t.split(".");e.call(this,s[0],s[1]||c.X)}))}__getStore(t){if(!t)throw(0,l.z3)("Need subject");if(void 0===t[this.__key]){const e=new c.d;Object.defineProperty(t,this.__key,{enumerable:!1,configurable:!0,writable:!0,value:e})}return t[this.__key]}__removeStoreFromSubject(t){void 0!==t[this.__key]&&Object.defineProperty(t,this.__key,{enumerable:!1,configurable:!0,writable:!0,value:void 0})}__triggerNativeEvent(t,e){const s=this.__doc.createEvent("HTMLEvents");(0,a.K)(e)?s.initEvent(e,!0,!0):(s.initEvent(e.type,e.bubbles,e.cancelable),["screenX","screenY","clientX","clientY","target","srcElement","currentTarget","timeStamp","which","keyCode"].forEach((t=>{Object.defineProperty(s,t,{value:e[t],enumerable:!0})})),Object.defineProperty(s,"originalEvent",{value:e,enumerable:!0})),t.dispatchEvent(s)}get current(){return this.currents[this.currents.length-1]}on(t,e,s,r){let c,u,h,p;if((0,a.K)(t)||(0,a.B)(t)?(c=this,u=t,h=e,p=s):(c=t,u=e,h=s,p=r),!(0,a.K)(u)&&!(0,a.B)(u)||0===u.length)throw(0,l.z3)("Need events names");if(!(0,n.T)(h))throw(0,l.z3)("Need event handler");if((0,o.c)(c))return c.forEach((t=>{this.on(t,u,h,p)})),this;const m=c,g=this.__getStore(m),f=this;let v=function(t,...e){if(!f.isMuted(t))return h&&h.call(this,...e)};return d(m)&&(v=function(t){if(!f.isMuted(t.type))return f.__prepareEvent(t),h&&!1===h.call(this,t)?(t.preventDefault(),t.stopImmediatePropagation(),!1):void 0}),this.__eachEvent(u,((t,e)=>{if(0===t.length)throw(0,l.z3)("Need event name");if(!1===g.indexOf(t,e,h)&&(g.set(t,e,{event:t,originalCallback:h,syntheticCallback:v},p?.top),d(m))){const e=i.PASSIVE_EVENTS.has(t)?{passive:!0,capture:p?.capture??!1}:p?.capture??!1;v.options=e,m.addEventListener(t,v,e),this.__memoryDOMSubjectToHandler(m,v)}})),this}__memoryDOMSubjectToHandler(t,e){const s=this.__domEventsMap.get(t)||new Set;s.add(e),this.__domEventsMap.set(t,s)}__unmemoryDOMSubjectToHandler(t,e){const s=this.__domEventsMap,i=s.get(t)||new Set;i.delete(e),i.size?s.set(t,i):s.delete(t)}one(t,e,s,i){let r,o,n,l;(0,a.K)(t)||(0,a.B)(t)?(r=this,o=t,n=e,l=s):(r=t,o=e,n=s,l=i);const c=(...t)=>(this.off(r,o,c),n(...t));return this.on(r,o,c,l),this}off(t,e,s){let i,r,l;if((0,a.K)(t)||(0,a.B)(t)?(i=this,r=t,l=e):(i=t,r=e,l=s),(0,o.c)(i))return i.forEach((t=>{this.off(t,r,l)})),this;const u=i,h=this.__getStore(u);if(!(0,a.K)(r)&&!(0,a.B)(r)||0===r.length)return h.namespaces().forEach((t=>{this.off(u,"."+t)})),this.__removeStoreFromSubject(u),this;const p=t=>{d(u)&&(u.removeEventListener(t.event,t.syntheticCallback,t.syntheticCallback.options??!1),this.__unmemoryDOMSubjectToHandler(u,t.syntheticCallback))},m=(t,e)=>{if(""===t)return void h.events(e).forEach((t=>{""!==t&&m(t,e)}));const s=h.get(t,e);if(s&&s.length)if((0,n.T)(l)){const i=h.indexOf(t,e,l);!1!==i&&(p(s[i]),s.splice(i,1),s.length||h.clearEvents(e,t))}else s.forEach(p),s.length=0,h.clearEvents(e,t)};return this.__eachEvent(r,((t,e)=>{e===c.X?h.namespaces().forEach((e=>{m(t,e)})):m(t,e)})),h.isEmpty()&&this.__removeStoreFromSubject(u),this}stopPropagation(t,e){const s=(0,a.K)(t)?this:t,i=(0,a.K)(t)?t:e;if("string"!=typeof i)throw(0,l.z3)("Need event names");const r=this.__getStore(s);this.__eachEvent(i,((t,e)=>{const i=r.get(t,e);i&&this.__stopped.push(i),e===c.X&&r.namespaces(!0).forEach((e=>this.stopPropagation(s,t+"."+e)))}))}__removeStop(t){if(t){const e=this.__stopped.indexOf(t);-1!==e&&this.__stopped.splice(0,e+1)}}__isStopped(t){return void 0!==t&&-1!==this.__stopped.indexOf(t)}fire(t,e,...s){let i,r;const o=(0,a.K)(t)?this:t,n=(0,a.K)(t)?t:e,u=(0,a.K)(t)?[e,...s]:s;if(!d(o)&&!(0,a.K)(n))throw(0,l.z3)("Need events names");const h=this.__getStore(o);return!(0,a.K)(n)&&d(o)?this.__triggerNativeEvent(o,e):this.__eachEvent(n,((t,e)=>{if(d(o))this.__triggerNativeEvent(o,t);else{const s=h.get(t,e);if(s)try{[...s].every((e=>!this.__isStopped(s)&&(this.currents.push(t),r=e.syntheticCallback.call(o,t,...u),this.currents.pop(),void 0!==r&&(i=r),!0)))}finally{this.__removeStop(s)}e!==c.X||d(o)||h.namespaces().filter((t=>t!==e)).forEach((e=>{const s=this.fire.call(this,o,t+"."+e,...u);void 0!==s&&(i=s)}))}})),i}constructor(t){this.__domEventsMap=new Map,this.__mutedEvents=new Set,this.__key="__JoditEventEmitterNamespaces",this.__doc=document,this.__prepareEvent=t=>{t.cancelBubble||(t.composed&&(0,n.T)(t.composedPath)&&t.composedPath()[0]&&Object.defineProperty(t,"target",{value:t.composedPath()[0],configurable:!0,enumerable:!0}),t.type.match(/^touch/)&&t.changedTouches&&t.changedTouches.length&&["clientX","clientY","pageX","pageY"].forEach((e=>{Object.defineProperty(t,e,{value:t.changedTouches[0][e],configurable:!0,enumerable:!0})})),t.originalEvent||(t.originalEvent=t),"paste"===t.type&&void 0===t.clipboardData&&this.__doc.defaultView.clipboardData&&Object.defineProperty(t,"clipboardData",{get:()=>this.__doc.defaultView.clipboardData,configurable:!0,enumerable:!0}))},this.currents=[],this.__stopped=[],this.__isDestructed=!1,t&&(this.__doc=t),this.__key+=(new Date).getTime()}destruct(){this.__isDestructed||(this.__isDestructed=!0,this.__domEventsMap.forEach(((t,e)=>{this.off(e)})),this.__domEventsMap.clear(),this.__mutedEvents.clear(),this.currents.length=0,this.__stopped.length=0,this.off(this),this.__getStore(this).clear(),this.__removeStoreFromSubject(this))}}function d(t){return(0,n.T)(t.addEventListener)}},43431(t,e,s){"use strict";s.d(e,{h(){return i}});class i{constructor(){this.__map=new Map}on(t,e){return this.__map.has(t)||this.__map.set(t,new Set),this.__map.get(t)?.add(e),this}off(t,e){return this.__map.has(t)&&this.__map.get(t)?.delete(e),this}destruct(){this.__map.clear()}emit(t,...e){let s;return this.__map.has(t)&&this.__map.get(t)?.forEach((t=>{s=t(...e)})),s}}},50025(t,e,s){"use strict";s.d(e,{Xr(){return n.X},bk(){return i.b},d$(){return n.d},h5(){return r.h},sH(){return o.s}});var i=s(50658),r=s(43431),o=s(32332),n=s(10004)},32332(t,e,s){"use strict";s.d(e,{s(){return c}});var i=s(66927),r=s(37923),o=s(69810),n=s(25376);const a=Symbol("observable-object");function l(t){return void 0!==t[a]}function c(t){if(l(t))return t;const e={},s={},c=(e,i)=>(0,r.c)(e)?(e.map((t=>c(t,i))),t):(s[e]||(s[e]=[]),s[e].push(i),t),u=(i,...o)=>{if((0,r.c)(i))i.map((t=>u(t,...o)));else try{!e[i]&&s[i]&&(e[i]=!0,s[i].forEach((e=>e.call(t,...o))))}finally{e[i]=!1}},d=(e,s=[])=>{const r={};l(e)||(Object.defineProperty(e,a,{enumerable:!1,value:!0}),Object.keys(e).forEach((a=>{const l=a,c=s.concat(l).filter((t=>t.length));r[l]=e[l];const h=(0,i.N)(e,l);Object.defineProperty(e,l,{set(e){const s=r[l];if(!(0,o.P)(r[l],e)){u(["beforeChange","beforeChange."+c.join(".")],l,e),(0,n.Q)(e)&&d(e,c),h&&h.set?h.set.call(t,e):r[l]=e;const i=[];u(["change",...c.reduce(((t,e)=>(i.push(e),t.push("change."+i.join(".")),t)),[])],c.join("."),s,e?.valueOf?e.valueOf():e)}},get(){return h&&h.get?h.get.call(t):r[l]},enumerable:!0,configurable:!0}),(0,n.Q)(r[l])&&d(r[l],c)})),Object.defineProperty(t,"on",{value:c}))};return d(t),t}},10004(t,e,s){"use strict";s.d(e,{X(){return r},d(){return o}});var i=s(42448);s(28712);const r="JoditEventDefaultNamespace";class o{constructor(){this.__store=new Map}get(t,e){if(this.__store.has(e))return this.__store.get(e)[t]}indexOf(t,e,s){const i=this.get(t,e);if(i)for(let t=0;i.length>t;t+=1)if(i[t].originalCallback===s)return t;return!1}namespaces(t=!1){const e=(0,i.$)(this.__store.keys());return t?e.filter((t=>t!==r)):e}events(t){const e=this.__store.get(t);return e?Object.keys(e):[]}set(t,e,s,i=!1){let r=this.__store.get(e);r||(r={},this.__store.set(e,r)),void 0===r[t]&&(r[t]=[]),i?r[t].unshift(s):r[t].push(s)}clear(){this.__store.clear()}clearEvents(t,e){const s=this.__store.get(t);s&&s[e]&&(delete s[e],Object.keys(s).length||this.__store.delete(t))}isEmpty(){return 0===this.__store.size}}},56298(t,e,s){"use strict";s.d(e,{JW(){return b},My(){return _},RR(){return w},VF(){return h},av(){return v},fg(){return f},w9(){return g}});var i=s(83044),r=s(98253),o=s(12041),n=s(449),a=s(75766),l=s(77402),c=s(17352),u=s(71842),d=s(50025);const h={};let p=1;const m=new Set;function g(){function t(){return p+=10*(Math.random()+1),Math.round(p).toString(16)}let e=t();for(;m.has(e);)e=t();return m.add(e),e}const f=new l.$,v={},b=t=>{Object.keys(t).forEach((e=>{c.lang[e]?Object.assign(c.lang[e],t[e]):c.lang[e]=t[e]}))},y=new WeakMap;function _(t,e,s="div",l=!1){const c=(0,r.K)(e)?e:e?(0,a.u)(e.prototype):"jodit-utils",d=y.get(t)||{},h=c+s,p=(0,o.h)(t)?t:t.j;if(!d[h]){let e=p.c,r=(0,i.y)(t)&&t.o.shadowRoot?t.o.shadowRoot:t.od.body;if(l&&(0,i.y)(t)&&t.od!==t.ed){e=t.createInside;const o="style"===s?t.ed.head:t.ed.body;r=(0,i.y)(t)&&t.o.shadowRoot?t.o.shadowRoot:o}const o=e.element(s,{className:`jodit jodit-${(0,n.k)(c)}-container jodit-box`});o.classList.add("jodit_theme_"+(p.o.theme||"default")),r.appendChild(o),d[h]=o,t.hookStatus("beforeDestruct",(()=>{u.J.safeRemove(o),delete d[h],Object.keys(d).length&&y.delete(t)})),y.set(t,d)}return d[h].classList.remove("jodit_theme_default","jodit_theme_dark"),d[h].classList.add("jodit_theme_"+(p.o.theme||"default")),d[h]}const w=new d.bk},82317(t,e,s){"use strict";s.d(e,{_(){return r}});var i=s(37923);const r=t=>(0,i.c)(t)?t:[t]},32709(t,e,s){"use strict";s.d(e,{$r(){return o.$},_j(){return i._},uM(){return r.u}});var i=s(82317),r=s(42589),o=s(42448)},42589(t,e,s){"use strict";function i(t){return Array.isArray(t)?t:t.split(/[,\s]+/)}s.d(e,{u(){return i}})},42448(t,e,s){"use strict";s.d(e,{$(){return o}});var i=s(34796),r=s(44210);const o=(...t)=>((0,i.a)(Array.from)?Array.from:(0,r.c)("Array.from")??Array.from).apply(Array,t)},89044(t,e,s){"use strict";s.d(e,{D(){return i.D},w(){return i.w}});var i=s(59146)},59146(t,e,s){"use strict";function i(t,e,...s){return e?window.setTimeout(t,e,...s):(t.call(null,...s),0)}function r(t){window.clearTimeout(t)}s.d(e,{D(){return r},w(){return i}})},78479(t,e,s){"use strict";function i(){let t=!0;try{const e=document.createElement("input");e.type="color",e.value="!",t="color"===e.type&&"!"!==e.value}catch(e){t=!1}return t}s.d(e,{k(){return i}})},9823(t,e,s){"use strict";s.d(e,{AH(){return c.A},Bo(){return C.B},CE(){return u.C},E6(){return h.E},Et(){return v.E},Gp(){return d.n4},Kg(){return C.K},Lm(){return n.L},Mj(){return m.M},P5(){return a.P},Qd(){return y.Q},Rd(){return E.R},Tn(){return l.T},a3(){return f.a},cy(){return o.c},hH(){return T.h},kC(){return i.k},kO(){return d.kO},kf(){return b.k},l6(){return x.l},mv(){return k.m},n4(){return a.n},pV(){return d.pV},rg(){return g.r},uV(){return S.u},vM(){return w.v},y0(){return p.y},yL(){return _.y},zf(){return r.z}});var i=s(78479),r=s(99951),o=s(37923),n=s(9810),a=s(69810),l=s(69052),c=s(53701),u=s(21811),d=s(10058),h=s(3947),p=s(83044),m=s(82201),g=s(71274),f=s(34796),v=s(2461),b=s(12461),y=s(25376),_=s(92039),w=s(53470),C=s(98253),k=s(6939),S=s(59082),T=s(12041),E=s(35642),x=s(76776)},99951(t,e,s){"use strict";function i(t){return!!t&&t instanceof DOMException&&"AbortError"===t.name}s.d(e,{z(){return i}})},37923(t,e,s){"use strict";function i(t){return Array.isArray(t)}s.d(e,{c(){return i}})},9810(t,e,s){"use strict";function i(t){return"boolean"==typeof t}s.d(e,{L(){return i}})},69810(t,e,s){"use strict";s.d(e,{P(){return o},n(){return r}});var i=s(28616);function r(t,e){return t===e||(0,i.A)(t)===(0,i.A)(e)}function o(t,e){return t===e}},69052(t,e,s){"use strict";function i(t){return"function"==typeof t}s.d(e,{T(){return i}})},21811(t,e,s){"use strict";function i(t){return-1!==t.search(//)||-1!==t.search(//)||-1!==t.search(/style="[^"]*mso-/)&&-1!==t.search(/(0,i.K)(t)&&/<([A-Za-z][A-Za-z0-9]*)\b[^>]*>(.*?)<\/\1>/m.test(t.replace(/[\r\n]/g,""))},10058(t,e,s){"use strict";s.d(e,{kO(){return l},n4(){return n},pV(){return a}});var i=s(55186),r=s(69052),o=s(35642);function n(t){return!(0,o.R)(t)&&(0,r.T)(t.init)}function a(t){return!(0,o.R)(t)&&(0,r.T)(t.destruct)}function l(t){return!(0,o.R)(t)&&i.J.isElement(t.container)}},3947(t,e,s){"use strict";s.d(e,{E(){return o}});var i=s(12461),r=s(98253);function o(t){return(0,r.K)(t)&&(0,i.k)(t)&&(t=parseFloat(t)),"number"==typeof t&&Number.isFinite(t)&&!(t%1)}},83044(t,e,s){"use strict";s.d(e,{y(){return r}});var i=s(69052);function r(t){return!!(t&&t instanceof Object&&(0,i.T)(t.constructor)&&("undefined"!=typeof Jodit&&t instanceof Jodit||t.isJodit))}},82201(t,e,s){"use strict";s.d(e,{M(){return r}});var i=s(98253);const r=t=>(0,i.K)(t)&&23===t.length&&/^[a-z0-9]{5}-[a-z0-9]{5}-[a-z0-9]{5}-[a-z0-9]{5}$/i.test(t)},71274(t,e,s){"use strict";s.d(e,{r(){return o}});var i=s(17352),r=s(55186);function o(t){return r.J.isNode(t)&&r.J.isTag(t,"span")&&t.hasAttribute("data-"+i.MARKER_CLASS)}},34796(t,e,s){"use strict";function i(t){return!!t&&"function"===(typeof t).toLowerCase()&&(t===Function.prototype||/^\s*function\s*(\b[a-z$_][a-z0-9$_]*\b)*\s*\((|([a-z$_][a-z0-9$_]*)(\s*,[a-z$_][a-z0-9$_]*)*)\)\s*{\s*\[native code]\s*}\s*$/i.test(t+""))}s.d(e,{a(){return i}})},2461(t,e,s){"use strict";function i(t){return"number"==typeof t&&!isNaN(t)&&isFinite(t)}s.d(e,{E(){return i}})},12461(t,e,s){"use strict";s.d(e,{k(){return r}});var i=s(98253);function r(t){if((0,i.K)(t)){if(!t.match(/^([+-])?[0-9]+(\.?)([0-9]+)?(e[0-9]+)?$/))return!1;t=parseFloat(t)}return"number"==typeof t&&!isNaN(t)&&isFinite(t)}},25376(t,e,s){"use strict";s.d(e,{Q(){return r}});var i=s(76776);function r(t){return!(!t||"object"!=typeof t||t.nodeType||(0,i.l)(t)||t.constructor&&!{}.hasOwnProperty.call(t.constructor.prototype,"isPrototypeOf"))}},92039(t,e,s){"use strict";function i(t){return t&&"function"==typeof t.then}s.d(e,{y(){return i}})},53470(t,e,s){"use strict";s.d(e,{v(){return r}});var i=s(69052);function r(t){return!!t&&(0,i.T)(t.has)&&(0,i.T)(t.add)&&(0,i.T)(t.delete)}},98253(t,e,s){"use strict";s.d(e,{B(){return o},K(){return r}});var i=s(37923);function r(t){return"string"==typeof t}function o(t){return(0,i.c)(t)&&r(t[0])}},6939(t,e,s){"use strict";function i(t){if(t.includes(" "))return!1;if("undefined"!=typeof URL)try{const e=new URL(t);return["https:","http:","ftp:","file:","rtmp:"].includes(e.protocol)}catch(t){return!1}const e=document.createElement("a");return e.href=t,!!e.hostname}s.d(e,{m(){return i}})},59082(t,e,s){"use strict";function i(t){return!!t.length&&!/[^0-9A-Za-zа-яА-ЯЁё\w\-_. ]/.test(t)&&t.trim().length>0}s.d(e,{u(){return i}})},12041(t,e,s){"use strict";s.d(e,{h(){return r}});var i=s(69052);function r(t){return!!(t&&t instanceof Object&&(0,i.T)(t.constructor)&&t.isView)}},35642(t,e,s){"use strict";function i(t){return null==t}s.d(e,{R(){return i}})},76776(t,e,s){"use strict";function i(t){return null!=t&&t===t.window}s.d(e,{l(){return i}})},96768(t,e,s){"use strict";s.d(e,{s(){return i}});const i=t=>{if("rgba(0, 0, 0, 0)"===t||""===t)return!1;if(!t)return"#000000";if("#"===t.substr(0,1))return t;const e=/([\s\n\t\r]*?)rgb\((\d+), (\d+), (\d+)\)/.exec(t)||/([\s\n\t\r]*?)rgba\((\d+), (\d+), (\d+), ([\d.]+)\)/.exec(t);if(!e)return"#000000";const s=parseInt(e[2],10),i=parseInt(e[3],10);let r=(parseInt(e[4],10)|i<<8|s<<16).toString(16).toUpperCase();for(;6>r.length;)r="0"+r;return e[1]+"#"+r}},93495(t,e,s){"use strict";s.d(e,{s(){return i.s}});var i=s(96768)},56176(t,e,s){"use strict";s.d(e,{Z(){return l}});var i=s(17352),r=s(55186),o=s(59101),n=s(58720);function a(t){return t.replace(/mso-[a-z-]+:[\s]*[^;]+;/gi,"").replace(/mso-[a-z-]+:[\s]*[^";']+$/gi,"").replace(/border[a-z-]*:[\s]*[^;]+;/gi,"").replace(/([0-9.]+)(pt|cm)/gi,((t,e,s)=>{switch(s.toLowerCase()){case"pt":return(1.328*parseFloat(e)).toFixed(0)+"px";case"cm":return(.02645833*parseFloat(e)).toFixed(0)+"px"}return t}))}function l(t){if(-1===t.indexOf("")+7);const e=document.createElement("iframe");e.style.display="none",document.body.appendChild(e);let s="",l=[];try{const c=e.contentDocument||(e.contentWindow?e.contentWindow.document:null);if(c){c.open(),c.write(t),c.close();try{for(let t=0;c.styleSheets.length>t;t+=1){const e=c.styleSheets[t].cssRules;for(let t=0;e.length>t;t+=1)""!==e[t].selectorText&&(l=(0,n.$$)(e[t].selectorText,c.body),l.forEach((s=>{s.style.cssText=a(e[t].style.cssText+";"+s.style.cssText)})))}}catch(t){if(!i.IS_PROD)throw t}r.J.each(c.body,(t=>{if(r.J.isElement(t)){const e=t,s=e.getAttribute("style");s&&(e.style.cssText=a(s)),e.hasAttribute("style")&&!e.getAttribute("style")&&e.removeAttribute("style")}})),s=c.firstChild?(0,o.Bq)(c.body.innerHTML):""}}catch{}finally{r.J.safeRemove(e)}return s&&(t=s),(0,o.Bq)(t.replace(/<(\/)?(html|colgroup|col|o:p)[^>]*>/g,"").replace(//i);-1!==e&&(t=t.substring(e+20));const s=t.search(//i);return-1!==s&&(t=t.substring(0,s)),t})(s)),e.s.insertHTML(s)}function l(t){const e=t.types;let s="";if((0,o.cy)(e)||"[object DOMStringList]"==={}.toString.call(e))for(let t=0;e.length>t;t+=1)s+=e[t]+";";else s=(e||i.TEXT_PLAIN)+";";return s}function c(t,e,s,i,r){if(!1===t.e.fire("beforeOpenPasteDialog",e,s,i,r))return;const o=t.confirm(`
${t.i18n(e)}
`,t.i18n(s)),a=r.map((({text:e,value:s})=>(0,n.$n)(t,{text:e,name:e.toLowerCase(),tabIndex:0}).onAction((()=>{o.close(),i(s)}))));o.e.one(o,"afterClose",(()=>{t.s.isFocused()||t.s.focus()}));const l=(0,n.$n)(t,{text:"Cancel",tabIndex:0}).onAction((()=>{o.close()}));return o.setFooter([...a,l]),a[0].focus(),a[0].state.variant="primary",t.e.fire("afterOpenPasteDialog",o,e,s,i,r),o}},13861(t,e,s){"use strict";var i=s(31635),r=s(17352),o=s(22664),n=s(55186),a=s(56298),l=s(65147),c=s(29866),u=(s(70674),s(90823));class d extends c.k{constructor(){super(...arguments),this.pasteStack=new l.LimitedStack(20),this._isDialogOpened=!1}afterInit(t){t.e.on("paste.paste",this.onPaste).on("pasteStack.paste",(t=>this.pasteStack.push(t))),t.o.nl2brInPlainText&&this.j.e.on("processPaste.paste",this.onProcessPasteReplaceNl2Br)}beforeDestruct(t){t.e.off("paste.paste",this.onPaste).off("processPaste.paste",this.onProcessPasteReplaceNl2Br).off(".paste")}onPaste(t){try{if(!1===this.customPasteProcess(t)||!1===this.j.e.fire("beforePaste",t))return t.preventDefault(),!1;this.defaultPasteProcess(t)}finally{this.j.e.fire("afterPaste",t)}}customPasteProcess(t){if(!this.j.o.processPasteHTML)return;const e=(0,l.getDataTransfer)(t),s=[e?.getData(r.TEXT_PLAIN),e?.getData(r.TEXT_HTML),e?.getData(r.TEXT_RTF)];for(const e of s)if((0,l.isHTML)(e)&&(this.j.e.fire("processHTML",t,e,{plain:s[0],html:s[1],rtf:s[2]})||this.processHTML(t,e)))return!1}defaultPasteProcess(t){const e=(0,l.getDataTransfer)(t);let s=e?.getData(r.TEXT_HTML)||e?.getData(r.TEXT_PLAIN);if(e&&s&&""!==(0,l.trim)(s)){const i=this.j.e.fire("processPaste",t,s,(0,u.DI)(e));void 0!==i&&(s=i),((0,l.isString)(s)||n.J.isNode(s))&&this.__insertByType(t,s,this.j.o.defaultActionOnPaste),t.preventDefault(),t.stopPropagation()}}processHTML(t,e){if(!this.j.o.askBeforePasteHTML)return!1;if(this.j.o.memorizeChoiceWhenPasteFragment){const s=this.pasteStack.find((t=>t.html===e));if(s)return this.__insertByType(t,e,s.action||this.j.o.defaultActionOnPaste),!0}if(this._isDialogOpened)return!0;const s=(0,u.PU)(this.j,"Your code is similar to HTML. Keep as HTML?","Paste as HTML",(s=>{this._isDialogOpened=!1,this.__insertByType(t,e,s)}),this.j.o.pasteHTMLActionList);return s&&(this._isDialogOpened=!0,s.e.on("beforeClose",(()=>{this._isDialogOpened=!1}))),!0}__insertByType(t,e,s){if(this.pasteStack.push({html:e,action:s}),(0,l.isString)(e))switch(this.j.buffer.set(r.CLIPBOARD_ID,e),s){case r.INSERT_CLEAR_HTML:e=(0,l.cleanFromWord)(e);break;case r.INSERT_ONLY_TEXT:e=(0,l.stripTags)(e,this.j.ed,new Set(this.j.o.pasteExcludeStripTags));break;case r.INSERT_AS_TEXT:e=(0,l.htmlspecialchars)(e)}(0,u.sX)(t,this.j,e)}onProcessPasteReplaceNl2Br(t,e,s){if(s===r.TEXT_PLAIN+";"&&!(0,l.isHTML)(e))return(0,l.nl2br)(e)}}(0,i.Cg)([o.autobind],d.prototype,"onPaste",null),(0,i.Cg)([o.autobind],d.prototype,"onProcessPasteReplaceNl2Br",null),a.fg.add("paste",d)},50248(t,e,s){"use strict";var i=s(36115);i.T.prototype.showPlaceholder=!0,i.T.prototype.placeholder="Type something",i.T.prototype.useInputsPlaceholder=!0},225(t,e,s){"use strict";var i=s(31635),r=s(17352),o=s(22664),n=s(55186),a=s(56298),l=s(71274),c=s(26150),u=s(38322),d=s(29866);s(50248);class h extends d.k{constructor(){super(...arguments),this.addNativeListeners=()=>{this.j.e.off(this.j.editor,"input.placeholder keydown.placeholder").on(this.j.editor,"input.placeholder keydown.placeholder",this.toggle)},this.addEvents=()=>{const t=this.j;t.o.useInputsPlaceholder&&t.element.hasAttribute("placeholder")&&(this.placeholderElm.innerHTML=(0,c.C)(t.element,"placeholder")||""),t.e.fire("placeholder",this.placeholderElm.innerHTML),t.e.off(".placeholder").on("changePlace.placeholder",this.addNativeListeners).on("change.placeholder focus.placeholder keyup.placeholder mouseup.placeholder keydown.placeholder mousedown.placeholder afterSetMode.placeholder changePlace.placeholder",this.toggle).on(window,"load",this.toggle),this.addNativeListeners(),this.toggle()}}afterInit(t){t.o.showPlaceholder&&(this.placeholderElm=t.c.fromHTML(``),"rtl"===t.o.direction&&(this.placeholderElm.style.right="0px",this.placeholderElm.style.direction="rtl"),t.e.on("readonly",(t=>{t?this.hide():this.toggle()})).on("changePlace",this.addEvents),this.addEvents())}show(){const t=this.j;if(t.o.readonly)return;let e=0,s=0;const i=t.s.current(),r=i&&n.J.closest(i,n.J.isBlock,t.editor)||t.editor,o=t.ew.getComputedStyle(r),a=t.ew.getComputedStyle(t.editor);t.workplace.appendChild(this.placeholderElm);const{firstChild:c}=t.editor;if(n.J.isElement(c)&&!(0,l.r)(c)){const i=t.ew.getComputedStyle(c);e=parseInt(i.getPropertyValue("margin-top"),10),s=parseInt(i.getPropertyValue("margin-left"),10),this.placeholderElm.style.fontSize=parseInt(i.getPropertyValue("font-size"),10)+"px",this.placeholderElm.style.lineHeight=i.getPropertyValue("line-height")}else this.placeholderElm.style.fontSize=parseInt(o.getPropertyValue("font-size"),10)+"px",this.placeholderElm.style.lineHeight=o.getPropertyValue("line-height");(0,u.A)(this.placeholderElm,{display:"block",textAlign:o.getPropertyValue("text-align"),paddingTop:parseInt(a.paddingTop,10)+"px",paddingLeft:parseInt(a.paddingLeft,10)+"px",paddingRight:parseInt(a.paddingRight,10)+"px",marginTop:Math.max(parseInt(o.getPropertyValue("margin-top"),10),e),marginLeft:Math.max(parseInt(o.getPropertyValue("margin-left"),10),s)})}hide(){n.J.safeRemove(this.placeholderElm)}toggle(){const t=this.j;t.editor&&!t.isInDestruct&&(t.getRealMode()===r.MODE_WYSIWYG&&(t=>{if(!t.firstChild)return!0;const e=t.firstChild;if(r.INSEPARABLE_TAGS.has(e.nodeName?.toLowerCase())||/^(TABLE)$/i.test(e.nodeName))return!1;const s=n.J.next(e,(t=>t&&!n.J.isEmptyTextNode(t)),t);return n.J.isText(e)&&!s?n.J.isEmptyTextNode(e):!s&&n.J.each(e,(t=>!(n.J.isLeaf(t)||n.J.isList(t))&&(n.J.isEmpty(t)||n.J.isTag(t,"br"))))})(t.editor)?this.show():this.hide())}beforeDestruct(t){this.hide(),t.e.off(".placeholder").off(window,"load",this.toggle)}}(0,i.Cg)([(0,o.debounce)((t=>t.defaultTimeout/10),!0)],h.prototype,"toggle",null),a.fg.add("placeholder",h)},81089(t,e,s){"use strict";s(56298).fg.add("poweredByJodit",(t=>{const{o:e}=t;e.hidePoweredByJodit||e.inline||!(e.showCharsCounter||e.showWordsCounter||e.showXPathInStatusbar)||t.hookStatus("ready",(()=>{t.statusbar.append(t.create.fromHTML('\n\t\t\t\t\t\t\tPowered by Jodit\n\t\t\t\t\t\t
'),!0)}))}))},44921(t,e,s){"use strict";var i=s(17352),r=s(56298),o=s(98434);s(36115).T.prototype.controls.preview={icon:"eye",command:"preview",mode:i.MODE_SOURCE+i.MODE_WYSIWYG,tooltip:"Preview"},r.fg.add("preview",(t=>{t.registerButton({name:"preview"}),t.registerCommand("preview",((e,s,i)=>{const r=t.dlg();r.setSize(1024,600).open("",t.i18n("Preview")).setModal(!0);const[,n]=(0,o.u)(t,i,"px",r.getElm("content"));r.e.on(r,"afterClose",n)}))}))},11131(t,e,s){"use strict";s.d(e,{Y(){return r}});var i=s(42448);function r(t){const e=(t,e=t.ownerDocument.styleSheets)=>(0,i.$)(e).map((t=>{try{return(0,i.$)(t.cssRules)}catch{}return[]})).flat().filter((e=>{try{return!(!e||!t.matches(e.selectorText))}catch{}return!1}));class s{constructor(s,i,r){this.css={};const o=r||{},n=e=>{const s=e.selectorText.split(",").map((t=>t.trim())).sort().join(",");0==!!this.css[s]&&(this.css[s]={});const i=e.style.cssText.split(/;(?![A-Za-z0-9])/);for(let e=0;i.length>e;e++){if(!i[e])continue;const r=i[e].split(":");r[0]=r[0].trim(),r[1]=r[1].trim(),this.css[s][r[0]]=r[1].replace(/var\(([^)]+)\)/g,((e,s)=>{const[i,r]=s.split(",");return(t.ew.getComputedStyle(t.editor).getPropertyValue(i.trim())||r||e).trim()}))}};(()=>{const r=s.innerHeight,a=i.createTreeWalker(t.editor,NodeFilter.SHOW_ELEMENT,(()=>NodeFilter.FILTER_ACCEPT));for(;a.nextNode();){const t=a.currentNode;if(r>t.getBoundingClientRect().top||o.scanFullPage){const s=e(t);if(s)for(let t=0;s.length>t;t++)n(s[t])}}})()}generateCSS(){let t="";for(const e in this.css)if(!/:not\(/.test(e)){t+=e+" { ";for(const s in this.css[e])t+=s+": "+this.css[e][s]+"; ";t+="}\n"}return t}}try{return new s(t.ew,t.ed,{scanFullPage:!0}).generateCSS()}catch{}return""}},78757(t,e,s){"use strict";var i=s(17352),r=s(71842),o=s(56298),n=s(17527),a=s(98434),l=s(931),c=s(11131),u=s(59827),d=s.n(u),h=s(36115);l.I.set("print",d()),h.T.prototype.controls.print={exec(t){const e=t.create.element("iframe");Object.assign(e.style,{position:"fixed",right:0,bottom:0,width:0,height:0,border:0}),(0,o.My)(t,h.T).appendChild(e);const s=()=>{t.e.off(t.ow,"mousemove",s),r.J.safeRemove(e)},i=e.contentWindow;if(i){t.e.on(i,"onbeforeunload onafterprint",s).on(t.ow,"mousemove",s),t.o.iframe?(t.e.fire("generateDocumentStructure.iframe",i.document,t),i.document.body.innerHTML=t.value):(i.document.write('"),i.document.close(),(0,a.u)(t,void 0,"px",i.document.body));const e=i.document.createElement("style");e.innerHTML="@media print {\n\t\t\t\t\tbody {\n\t\t\t\t\t\t\t-webkit-print-color-adjust: exact;\n\t\t\t\t\t}\n\t\t\t}",i.document.head.appendChild(e),i.focus(),i.print()}},mode:i.MODE_SOURCE+i.MODE_WYSIWYG,tooltip:"Print"},o.fg.add("print",(t=>{t.registerButton({name:"print"})}))},60189(t,e,s){"use strict";var i=s(17352),r=s(56298),o=s(29866),n=s(931),a=s(34045),l=s.n(a),c=s(39199),u=s.n(c),d=s(36115);n.I.set("redo",l()).set("undo",u()),d.T.prototype.controls.redo={mode:i.MODE_SPLIT,isDisabled(t){return!t.history.canRedo()},tooltip:"Redo"},d.T.prototype.controls.undo={mode:i.MODE_SPLIT,isDisabled(t){return!t.history.canUndo()},tooltip:"Undo"},r.fg.add("redoUndo",class h extends o.k{constructor(){super(...arguments),this.buttons=[{name:"undo",group:"history"},{name:"redo",group:"history"}]}beforeDestruct(){}afterInit(t){const e=e=>(t.history[e](),!1);t.registerCommand("redo",{exec:e,hotkeys:["ctrl+y","ctrl+shift+z","cmd+y","cmd+shift+z"]}),t.registerCommand("undo",{exec:e,hotkeys:["ctrl+z","cmd+z"]})}})},36001(t,e,s){"use strict";s(36115).T.prototype.tableAllowCellResize=!0},39147(t,e,s){"use strict";var i=s(31635),r=s(17352),o=s(22664),n=s(55186),a=s(56298),l=s(65147),c=s(37435);s(36001);const u="table_processor_observer-resize";class d extends c.Plugin{constructor(){super(...arguments),this.selectMode=!1,this.resizeDelta=0,this.createResizeHandle=()=>{this.resizeHandler||(this.resizeHandler=this.j.c.div("jodit-table-resizer"),this.j.e.on(this.resizeHandler,"mousedown.table touchstart.table",this.onHandleMouseDown).on(this.resizeHandler,"mouseenter.table",(()=>{this.j.async.clearTimeout(this.hideTimeout)})))},this.hideTimeout=0,this.drag=!1,this.minX=0,this.maxX=0,this.startX=0}get module(){return this.j.getInstance("Table",this.j.o)}get isRTL(){return"rtl"===this.j.o.direction}showResizeHandle(){this.j.async.clearTimeout(this.hideTimeout),this.j.workplace.appendChild(this.resizeHandler)}hideResizeHandle(){this.hideTimeout=this.j.async.setTimeout((()=>{n.J.safeRemove(this.resizeHandler)}),{timeout:this.j.defaultTimeout,label:"hideResizer"})}onHandleMouseDown(t){if(this.j.isLocked)return;this.drag=!0,this.j.e.on(this.j.ow,"mouseup.resize-cells touchend.resize-cells",this.onMouseUp).on(this.j.ew,"mousemove.table touchmove.table",this.onMouseMove),this.startX=t.clientX,this.j.lock(u),this.resizeHandler.classList.add("jodit-table-resizer_moved");let e,s=this.workTable.getBoundingClientRect();if(this.minX=0,this.maxX=1e6,null!=this.wholeTable)s=this.workTable.parentNode.getBoundingClientRect(),this.minX=s.left,this.maxX=this.minX+s.width;else{const t=this.module.formalCoordinate(this.workTable,this.workCell,!0);this.module.formalMatrix(this.workTable,((s,i,o)=>{t[1]===o&&(e=s.getBoundingClientRect(),this.minX=Math.max(e.left+r.NEARBY/2,this.minX)),t[1]+(this.isRTL?-1:1)===o&&(e=s.getBoundingClientRect(),this.maxX=Math.min(e.left+e.width-r.NEARBY/2,this.maxX))}))}return!1}onMouseMove(t){if(!this.drag)return;this.j.e.fire("closeAllPopups");let e=t.clientX;const s=(0,l.offset)(this.resizeHandler.parentNode||this.j.od.documentElement,this.j,this.j.od,!0);this.minX>e&&(e=this.minX),e>this.maxX&&(e=this.maxX),this.resizeDelta=e-this.startX+(this.j.o.iframe?s.left:0),this.resizeHandler.style.left=e-(this.j.o.iframe?0:s.left)+"px";const i=this.j.s.sel;i&&i.removeAllRanges()}onMouseUp(t){(this.selectMode||this.drag)&&(this.selectMode=!1,this.j.unlock()),this.resizeHandler&&this.drag&&(this.drag=!1,this.j.e.off(this.j.ew,"mousemove.table touchmove.table",this.onMouseMove),this.resizeHandler.classList.remove("jodit-table-resizer_moved"),this.startX!==t.clientX&&(null==this.wholeTable?this.resizeColumns():this.resizeTable()),this.j.synchronizeValues(),this.j.s.focus())}resizeColumns(){const t=this.resizeDelta,e=[],s=this.module;s.setColumnWidthByDelta(this.workTable,s.formalCoordinate(this.workTable,this.workCell,!0)[1],t,!0,e);const i=(0,l.call)(this.isRTL?n.J.prev:n.J.next,this.workCell,n.J.isCell,this.workCell.parentNode);s.setColumnWidthByDelta(this.workTable,s.formalCoordinate(this.workTable,i)[1],-t,!1,e)}resizeTable(){const t=this.resizeDelta*(this.isRTL?-1:1),e=this.workTable.offsetWidth,s=(0,l.getContentWidth)(this.workTable.parentNode,this.j.ew),i=!this.wholeTable;if(this.isRTL?!i:i)this.workTable.style.width=(e+t)/s*100+"%";else{const i=this.isRTL?"marginRight":"marginLeft",r=parseInt(this.j.ew.getComputedStyle(this.workTable)[i]||"0",10);this.workTable.style.width=(e-t)/s*100+"%",this.workTable.style[i]=(r+t)/s*100+"%"}}setWorkCell(t,e=null){this.wholeTable=e,this.workCell=t,this.workTable=n.J.up(t,(t=>n.J.isTag(t,"table")),this.j.editor)}calcHandlePosition(t,e,s=0,i=0){const o=(0,l.offset)(e,this.j,this.j.ed);if(s>r.NEARBY&&o.width-r.NEARBY>s)return void this.hideResizeHandle();const a=(0,l.offset)(this.j.workplace,this.j,this.j.od,!0),c=(0,l.offset)(t,this.j,this.j.ed);if(this.resizeHandler.style.left=(s>r.NEARBY?o.left+o.width:o.left)-a.left+i+"px",Object.assign(this.resizeHandler.style,{height:c.height+"px",top:c.top-a.top+"px"}),this.showResizeHandle(),s>r.NEARBY){const t=(0,l.call)(this.isRTL?n.J.prev:n.J.next,e,n.J.isCell,e.parentNode);this.setWorkCell(e,!!t&&null)}else{const t=(0,l.call)(this.isRTL?n.J.next:n.J.prev,e,n.J.isCell,e.parentNode);this.setWorkCell(t||e,!t||null)}}afterInit(t){t.o.tableAllowCellResize&&t.e.off(this.j.ow,".resize-cells").off(".resize-cells").on("change.resize-cells afterCommand.resize-cells afterSetMode.resize-cells",(()=>{(0,l.$$)("table",t.editor).forEach(this.observe)})).on(this.j.ow,"scroll.resize-cells",(()=>{if(!this.drag)return;const e=n.J.up(this.workCell,(t=>n.J.isTag(t,"table")),t.editor);if(e){const t=e.getBoundingClientRect();this.resizeHandler.style.top=t.top+"px"}})).on("beforeSetMode.resize-cells",(()=>{const e=this.module;e.getAllSelectedCells().forEach((s=>{e.removeSelection(s),e.normalizeTable(n.J.closest(s,"table",t.editor))}))}))}observe(t){(0,l.dataBind)(t,u)||((0,l.dataBind)(t,u,!0),this.j.e.on(t,"mouseleave.resize-cells",(t=>{this.resizeHandler&&this.resizeHandler!==t.relatedTarget&&this.hideResizeHandle()})).on(t,"mousemove.resize-cells touchmove.resize-cells",this.j.async.throttle((e=>{if(this.j.isLocked)return;const s=n.J.up(e.target,n.J.isCell,t);s&&this.calcHandlePosition(t,s,e.offsetX)}),{timeout:this.j.defaultTimeout})),this.createResizeHandle())}beforeDestruct(t){t.events&&(t.e.off(this.j.ow,".resize-cells"),t.e.off(".resize-cells"))}}(0,i.Cg)([o.autobind],d.prototype,"onHandleMouseDown",null),(0,i.Cg)([o.autobind],d.prototype,"onMouseMove",null),(0,i.Cg)([o.autobind],d.prototype,"onMouseUp",null),(0,i.Cg)([o.autobind],d.prototype,"observe",null),a.fg.add("resizeCells",d)},57362(t,e,s){"use strict";var i=s(36115);i.T.prototype.allowResizeX=!1,i.T.prototype.allowResizeY=!0},76693(t,e,s){"use strict";var i=s(31635),r=s(22664),o=s(71842),n=s(56298),a=s(71005),l=s(53048);s(57362);let c=class t extends a.k{constructor(){super(...arguments),this.isResized=!1,this.start={x:0,y:0,w:0,h:0},this.handle=this.j.c.div("jodit-editor__resize",l.In.get("resize_handler"))}afterInit(t){const{height:e,width:s,allowResizeX:i}=t.o;let{allowResizeY:r}=t.o;"auto"===e&&"auto"!==s&&(r=!1),"auto"===e&&"auto"===s||!i&&!r||(t.statusbar.setMod("resize-handle",!0),t.e.on("toggleFullSize.resizeHandler",(()=>{this.handle.style.display=t.isFullSize?"none":"block"})).on(this.handle,"mousedown touchstart",this.onHandleResizeStart).on(t.ow,"mouseup touchend",this.onHandleResizeEnd),t.container.appendChild(this.handle))}onHandleResizeStart(t){this.isResized=!0,this.start.x=t.clientX,this.start.y=t.clientY,this.start.w=this.j.container.offsetWidth,this.start.h=this.j.container.offsetHeight,this.j.lock(),this.j.e.on(this.j.ow,"mousemove touchmove",this.onHandleResize),t.preventDefault()}onHandleResize(t){this.isResized&&(this.j.o.allowResizeY&&this.j.e.fire("setHeight",this.start.h+t.clientY-this.start.y),this.j.o.allowResizeX&&this.j.e.fire("setWidth",this.start.w+t.clientX-this.start.x),this.j.e.fire("resize"))}onHandleResizeEnd(){this.isResized&&(this.isResized=!1,this.j.e.off(this.j.ow,"mousemove touchmove",this.onHandleResize),this.j.unlock())}beforeDestruct(){o.J.safeRemove(this.handle),this.j.e.off(this.j.ow,"mouseup touchsend",this.onHandleResizeEnd)}};c.requires=["size"],c=(0,i.Cg)([r.autobind],c),n.fg.add("resizeHandler",c)},69505(t,e,s){"use strict";var i=s(36115);i.T.prototype.allowResizeTags=new Set(["img","iframe","table","jodit"]),i.T.prototype.resizer={showSize:!0,hideSizeTimeout:1e3,forImageChangeAttributes:!0,min_width:10,min_height:10,useAspectRatio:new Set(["img"])}},6857(t,e,s){"use strict";var i=s(31635),r=s(17352),o=s(22664),n=s(55186),a=s(56298),l=s(65147),c=s(29866);s(69505);const u="__jodit-resizer_binded";class d extends c.k{constructor(){super(...arguments),this.LOCK_KEY="resizer",this.element=null,this.isResizeMode=!1,this.isShown=!1,this.startX=0,this.startY=0,this.width=0,this.height=0,this.ratio=0,this.rect=this.j.c.fromHTML(`
\n\t\t\t\t
\n\t\t\t\t
\n\t\t\t\t
\n\t\t\t\t
\n\t\t\t\t100x100\n\t\t\t
`),this.sizeViewer=this.rect.getElementsByTagName("span")[0],this.pointerX=0,this.pointerY=0,this.isAltMode=!1,this.onClickElement=t=>{this.isResizeMode||this.element===t&&this.isShown||(this.element=t,this.show(),n.J.isTag(this.element,"img")&&!this.element.complete&&this.j.e.one(this.element,"load",this.updateSize))},this.updateSize=()=>{if(!this.isInDestruct&&this.isShown&&this.element&&this.rect){const t=this.getWorkplacePosition(),e=(0,l.offset)(this.element,this.j,this.j.ed),s=parseInt(this.rect.style.left||"0",10),i=e.top-t.top,r=e.left-t.left;parseInt(this.rect.style.top||"0",10)===i&&s===r&&this.rect.offsetWidth===this.element.offsetWidth&&this.rect.offsetHeight===this.element.offsetHeight||((0,l.css)(this.rect,{top:i,left:r,width:this.element.offsetWidth,height:this.element.offsetHeight}),this.j.events&&(this.j.e.fire(this.element,"changesize"),isNaN(s)||this.j.e.fire("resize")))}},this.hideSizeViewer=()=>{this.sizeViewer.style.opacity="0"}}afterInit(t){(0,l.$$)("div",this.rect).forEach((e=>{t.e.on(e,"mousedown.resizer touchstart.resizer",this.onStartResizing.bind(this,e))})),a.RR.on("hideHelpers",this.hide),t.e.on("readonly",(t=>{t&&this.hide()})).on("afterInit changePlace",this.addEventListeners.bind(this)).on("afterGetValueFromEditor.resizer",(t=>{const e=/]+data-jodit_iframe_wrapper[^>]+>(.*?]*>.*?<\/iframe>.*?)<\/jodit>/gi;e.test(t.value)&&(t.value=t.value.replace(e,"$1"))})),this.addEventListeners(),this.__onChangeEditor()}onEditorClick(t){let e=t.target;const{editor:s,options:{allowResizeTags:i}}=this.j;for(;e&&e!==s;){if(n.J.isTag(e,i))return this.__bind(e),void this.onClickElement(e);e=e.parentNode}}addEventListeners(){const t=this.j;t.e.off(t.editor,".resizer").off(t.ow,".resizer").on(t.editor,"keydown.resizer",(t=>{this.isShown&&t.key===r.KEY_DELETE&&this.element&&!n.J.isTag(this.element,"table")&&this.onDelete(t)})).on(t.ow,"resize.resizer",this.updateSize).on("resize.resizer",this.updateSize).on([t.ow,t.editor],"scroll.resizer",(()=>{this.isShown&&!this.isResizeMode&&this.hide()})).on(t.ow,"keydown.resizer",this.onKeyDown).on(t.ow,"keyup.resizer",this.onKeyUp).on(t.ow,"mouseup.resizer touchend.resizer",this.onClickOutside)}onStartResizing(t,e){if(!this.element||!this.element.parentNode)return this.hide(),!1;this.handle=t,e.cancelable&&e.preventDefault(),e.stopImmediatePropagation(),this.width=this.element.offsetWidth,this.height=this.element.offsetHeight,this.ratio=this.width/this.height,this.isResizeMode=!0,this.startX=e.clientX,this.startY=e.clientY,this.pointerX=e.clientX,this.pointerY=e.clientY;const{j:s}=this;s.e.fire("hidePopup"),s.lock(this.LOCK_KEY),s.e.on(s.ow,"mousemove.resizer touchmove.resizer",this.onResize)}onEndResizing(){const{j:t}=this;t.unlock(),this.isResizeMode=!1,this.isAltMode=!1,t.synchronizeValues(),t.e.off(t.ow,"mousemove.resizer touchmove.resizer",this.onResize)}onResize(t){if(this.isResizeMode){if(!this.element)return;let e,s;if(this.pointerX=t.clientX,this.pointerY=t.clientY,this.j.options.iframe){const i=this.getWorkplacePosition();e=t.clientX+i.left-this.startX,s=t.clientY+i.top-this.startY}else e=this.pointerX-this.startX,s=this.pointerY-this.startY;const i=this.handle.className;let r=0,o=0;const a=this.j.o.resizer.useAspectRatio;!this.isAltMode&&(!0===a||a&&n.J.isTag(this.element,a))?(e?(r=this.width+(i.match(/left/)?-1:1)*e,o=Math.round(r/this.ratio)):(o=this.height+(i.match(/top/)?-1:1)*s,r=Math.round(o*this.ratio)),r>(0,l.innerWidth)(this.j.editor,this.j.ow)&&(r=(0,l.innerWidth)(this.j.editor,this.j.ow),o=Math.round(r/this.ratio))):(r=this.width+(i.match(/left/)?-1:1)*e,o=this.height+(i.match(/top/)?-1:1)*s),r>this.j.o.resizer.min_width&&this.applySize(this.element,"width",this.rect.parentNode.offsetWidth>r?r:"100%"),o>this.j.o.resizer.min_height&&this.applySize(this.element,"height",o),this.updateSize(),this.showSizeViewer(this.element.offsetWidth,this.element.offsetHeight),t.stopImmediatePropagation()}}onKeyDown(t){this.isAltMode=t.key===r.KEY_ALT,!this.isAltMode&&this.isResizeMode&&this.onEndResizing()}onKeyUp(){this.isAltMode&&this.isResizeMode&&this.element&&(this.width=this.element.offsetWidth,this.height=this.element.offsetHeight,this.ratio=this.width/this.height,this.startX=this.pointerX,this.startY=this.pointerY),this.isAltMode=!1}onClickOutside(t){if(this.isShown){if(!this.isResizeMode)return this.hide();t.stopImmediatePropagation(),this.onEndResizing()}}getWorkplacePosition(){return(0,l.offset)(this.rect.parentNode||this.j.od.documentElement,this.j,this.j.od,!0)}applySize(t,e,s){const i=n.J.isImage(t)&&this.j.o.resizer.forImageChangeAttributes;i&&(0,l.attr)(t,e,s),i&&!t.style[e]||(0,l.css)(t,e,s)}onDelete(t){this.element&&("JODIT"!==this.element.tagName?this.j.s.select(this.element):(n.J.safeRemove(this.element),this.hide(),t.preventDefault()))}__onChangeEditor(){this.isShown&&(this.element&&this.element.parentNode?this.updateSize():this.hide()),(0,l.$$)("iframe",this.j.editor).forEach(this.__bind)}__bind(t){if(!n.J.isHTMLElement(t)||!this.j.o.allowResizeTags.has(t.tagName.toLowerCase())||(0,l.dataBind)(t,u))return;let e;if((0,l.dataBind)(t,u,!0),n.J.isTag(t,"iframe")){const s=t;n.J.isHTMLElement(t.parentNode)&&(0,l.attr)(t.parentNode,"-jodit_iframe_wrapper")?t=t.parentNode:(e=this.j.createInside.element("jodit",{"data-jodit-temp":1,contenteditable:!1,draggable:!0,"data-jodit_iframe_wrapper":1}),(0,l.attr)(e,"style",(0,l.attr)(t,"style")),(0,l.css)(e,{display:"inline-block"===t.style.display?"inline-block":"block",width:t.offsetWidth,height:t.offsetHeight}),t.parentNode&&t.parentNode.insertBefore(e,t),e.appendChild(t),this.j.e.on(e,"click",(()=>{(0,l.attr)(e,"data-jodit-wrapper_active",!0)})),t=e),this.j.e.off(t,"mousedown.select touchstart.select").on(t,"mousedown.select touchstart.select",(()=>{this.j.s.select(t)})).off(t,"changesize").on(t,"changesize",(()=>{s.setAttribute("width",t.offsetWidth+"px"),s.setAttribute("height",t.offsetHeight+"px")}))}this.j.e.on(t,"dragstart",this.hide),!r.IS_ES_NEXT&&r.IS_IE&&this.j.e.on(t,"mousedown",(e=>{n.J.isTag(t,"img")&&e.preventDefault()}))}showSizeViewer(t,e){this.j.o.resizer.showSize&&(this.sizeViewer.offsetWidth>t||this.sizeViewer.offsetHeight>e?this.hideSizeViewer():(this.sizeViewer.style.opacity="1",this.sizeViewer.textContent=`${t} x ${e}`,this.j.async.setTimeout(this.hideSizeViewer,{timeout:this.j.o.resizer.hideSizeTimeout,label:"hideSizeViewer"})))}show(){this.j.o.readonly||this.isShown||(this.isShown=!0,this.rect.parentNode||((0,l.markOwner)(this.j,this.rect),this.j.workplace.appendChild(this.rect)),this.j.isFullSize&&(this.rect.style.zIndex=""+(0,l.css)(this.j.container,"zIndex")),this.updateSize())}hide(){this.isResizeMode||(this.isResizeMode=!1,this.isShown=!1,this.element=null,n.J.safeRemove(this.rect),(0,l.$$)("[data-jodit-wrapper_active='true']",this.j.editor).forEach((t=>(0,l.attr)(t,"data-jodit-wrapper_active",!1))))}beforeDestruct(t){this.hide(),a.RR.off("hideHelpers",this.hide),t.e.off(this.j.ow,".resizer").off(".resizer")}}(0,i.Cg)([(0,o.watch)(":click")],d.prototype,"onEditorClick",null),(0,i.Cg)([o.autobind],d.prototype,"onStartResizing",null),(0,i.Cg)([o.autobind],d.prototype,"onEndResizing",null),(0,i.Cg)([o.autobind],d.prototype,"onResize",null),(0,i.Cg)([o.autobind],d.prototype,"onKeyDown",null),(0,i.Cg)([o.autobind],d.prototype,"onKeyUp",null),(0,i.Cg)([o.autobind],d.prototype,"onClickOutside",null),(0,i.Cg)([(0,o.watch)(":change")],d.prototype,"__onChangeEditor",null),(0,i.Cg)([o.autobind],d.prototype,"__bind",null),(0,i.Cg)([o.autobind,(0,o.watch)(":hideResizer")],d.prototype,"hide",null),a.fg.add("resizer",d)},78593(t,e,s){"use strict";var i=s(931),r=s(21917),o=s.n(r),n=s(36115);n.T.prototype.useSearch=!0,n.T.prototype.search={lazyIdleTimeout:0,useCustomHighlightAPI:void 0!==window.Highlight},i.I.set("search",o()),n.T.prototype.controls.find={tooltip:"Find",icon:"search",exec(t,e,{control:s}){switch(s.args&&s.args[0]){case"findPrevious":t.e.fire("searchPrevious");break;case"findNext":t.e.fire("searchNext");break;case"replace":t.execCommand("openReplaceDialog");break;default:t.execCommand("openSearchDialog")}},list:{search:"Find",findNext:"Find Next",findPrevious:"Find Previous",replace:"Replace"},childTemplate(t,e,s){return s}}},89568(t,e,s){"use strict";s.d(e,{IJ(){return l},Tz(){return c},_B(){return n},zy(){return a}});var i=s(55186),r=s(58720);const o="jd-tmp-selection";function n(t,e,s,r,n){if(null==e.startContainer.nodeValue||null==e.endContainer.nodeValue)return;if(t.o.search.useCustomHighlightAPI&&void 0!==window.Highlight){const i=[e,...s].map((e=>{const s=t.selection.createRange();return s.setStart(e.startContainer,e.startOffset),s.setEnd(e.endContainer,e.endOffset),s})),r=new Highlight(...i);return CSS.highlights.clear(),CSS.highlights.set("jodit-search-result",r),void(s.length=0)}const a=r.element("span",{[o]:!0});i.J.markTemporary(a);const l=e.startContainer.nodeValue;let c=0;if(0!==e.startOffset){const t=r.text(l.substring(0,e.startOffset));e.startContainer.nodeValue=l.substring(e.startOffset),i.J.before(e.startContainer,t),e.startContainer===e.endContainer&&(c=e.startOffset,e.endOffset-=c),e.startOffset=0}const u=e.endContainer.nodeValue;if(e.endOffset!==u.length){const t=r.text(u.substring(e.endOffset));e.endContainer.nodeValue=u.substring(0,e.endOffset),i.J.after(e.endContainer,t);for(const i of s){if(i.startContainer!==e.endContainer)break;i.startContainer=t,i.startOffset=i.startOffset-e.endOffset-c,i.endContainer===e.endContainer&&(i.endContainer=t,i.endOffset=i.endOffset-e.endOffset-c)}e.endOffset=e.endContainer.nodeValue.length}let d=e.startContainer;do{if(!d)break;if(!i.J.isText(d)||i.J.isElement(h=d.parentNode)&&h.hasAttribute(o)||i.J.wrap(d,a.cloneNode(),r),d===e.endContainer)break;let t=d.firstChild||d.nextSibling;if(!t){for(;d&&!d.nextSibling&&d!==n;)d=d.parentNode;t=d?.nextSibling}d=t}while(d&&d!==n);var h}function a(t){return(0,r.$$)(`[${o}]`,t)}function l(t){a(t).forEach((t=>i.J.unwrap(t)))}function c(t){return t.replace(RegExp(`]+${o}[^>]+>(.*?)`,"g"),"$1")}},78817(t,e,s){"use strict";s.d(e,{IJ(){return i.IJ},QN(){return r.Q},Tz(){return i.Tz},_B(){return i._B},zy(){return i.zy}});var i=s(89568),r=s(30621)},30621(t,e,s){"use strict";s.d(e,{Q(){return r}});var i=s(67975);class r{constructor(t=i.H){this.searchIndex=t,this.queue=[],this.value=""}add(t){const e=(t.nodeValue??"").toLowerCase();if(!e.length)return;const s=this.value.length;this.queue.push({startIndex:s,endIndex:s+e.length,node:t}),this.value+=e}ranges(t,e=0){const s=[];let i=e,r=0,o=0;do{if([i,r]=this.searchIndex(t,this.value,i),-1!==i){let t,e,n=0,a=0;for(let s=o;this.queue.length>s;s+=1)if(!t&&this.queue[s].endIndex>i&&(t=this.queue[s].node,n=i-this.queue[s].startIndex),t&&this.queue[s].endIndex>=i+r){e=this.queue[s].node,a=i+r-this.queue[s].startIndex,o=s;break}t&&e&&s.push({startContainer:t,startOffset:n,endContainer:e,endOffset:a}),i+=r}}while(-1!==i);return 0===s.length?null:s}}},17343(t,e,s){"use strict";var i=s(31635),r=(s(17352),s(22664)),o=s(71842),n=s(56298),a=s(65147),l=s(71005),c=(s(78593),s(78817)),u=s(63064);class d extends l.k{constructor(){super(...arguments),this.buttons=[{name:"find",group:"search"}],this.previousQuery="",this.drawPromise=null,this.walker=null,this.walkerCount=null,this.cache={},this.wrapFrameRequest=0}get ui(){return new u.F(this.j)}async updateCounters(){this.ui.isOpened&&(this.ui.count=await this.calcCounts(this.ui.query))}onPressReplaceButton(){this.findAndReplace(this.ui.query),this.updateCounters()}tryScrollToElement(t){let e=o.J.closest(t,o.J.isElement,this.j.editor);e||(e=o.J.prev(t,o.J.isElement,this.j.editor)),e&&e!==this.j.editor&&(0,a.scrollIntoViewIfNeeded)(e,this.j.editor,this.j.ed)}async calcCounts(t){return(await this.findQueryBounds(t,"walkerCount")).length}async findQueryBounds(t,e){let s=this[e];return s&&s.break(),s=new o.p(this.j.async,{timeout:this.j.o.search.lazyIdleTimeout}),this[e]=s,this.find(s,t).catch((t=>[]))}async findAndReplace(t){const e=await this.findQueryBounds(t,"walker");if(!e.length)return!1;let s=this.findCurrentIndexInRanges(e,this.j.s.range);-1===s&&(s=0);const i=e[s];if(i){try{const e=this.j.ed.createRange();e.setStart(i.startContainer,i.startOffset),e.setEnd(i.endContainer,i.endOffset),e.deleteContents();const r=this.j.createInside.text(this.ui.replace);o.J.safeInsertNode(e,r),(0,c.IJ)(this.j.editor),this.j.s.setCursorAfter(r),this.tryScrollToElement(r),this.cache={},this.ui.currentIndex=s,await this.findAndSelect(t,!0).catch((t=>null))}finally{this.j.synchronizeValues()}return this.j.e.fire("afterFindAndReplace"),!0}return!1}async findAndSelect(t,e){const s=await this.findQueryBounds(t,"walker");if(!s.length)return!1;this.previousQuery===t&&(0,c.zy)(this.j.editor).length||(this.drawPromise?.rejectCallback(),this.j.async.cancelAnimationFrame(this.wrapFrameRequest),(0,c.IJ)(this.j.editor),this.drawPromise=this.__drawSelectionRanges(s)),this.previousQuery=t;let i=this.ui.currentIndex-1;i=-1===i?0:e?i===s.length-1?0:i+1:0===i?s.length-1:i-1,this.ui.currentIndex=i+1;const r=s[i];if(r){const t=this.j.ed.createRange();try{t.setStart(r.startContainer,r.startOffset),t.setEnd(r.endContainer,r.endOffset),this.j.s.selectRange(t)}catch(t){}return this.tryScrollToElement(r.startContainer),await this.updateCounters(),await this.drawPromise,this.j.e.fire("afterFindAndSelect"),!0}return!1}findCurrentIndexInRanges(t,e){return t.findIndex((t=>t.startContainer===e.startContainer&&t.startOffset===e.startOffset&&t.endContainer===e.startContainer&&t.endOffset===e.endOffset))}async isValidCache(t){return(await t).every((t=>t.startContainer.isConnected&&(t.startContainer.nodeValue?.length??0)>=t.startOffset&&t.endContainer.isConnected&&(t.endContainer.nodeValue?.length??0)>=t.endOffset))}async find(t,e){if(!e.length)return[];const s=this.cache[e];return s&&await this.isValidCache(s)?s:(this.cache[e]=this.j.async.promise((s=>{const i=new c.QN(this.j.o.search.fuzzySearch);t.on("break",(()=>{s([])})).on("visit",(t=>(o.J.isText(t)&&i.add(t),!1))).on("end",(()=>{s(i.ranges(e)??[])})).setWork(this.j.editor)})),this.cache[e])}__drawSelectionRanges(t){const{async:e,createInside:s,editor:i}=this.j;e.cancelAnimationFrame(this.wrapFrameRequest);const r=[...t];let o,n=0;return e.promise((t=>{const a=()=>{do{o=r.shift(),o&&(0,c._B)(this.j,o,r,s,i),n+=1}while(o&&5>=n);r.length?this.wrapFrameRequest=e.requestAnimationFrame(a):t()};a()}))}onAfterGetValueFromEditor(t){t.value=(0,c.Tz)(t.value)}afterInit(t){if(t.o.useSearch){const e=this;t.e.on("beforeSetMode.search",(()=>{this.ui.close()})).on(this.ui,"afterClose",(()=>{(0,c.IJ)(t.editor),this.ui.currentIndex=0,this.ui.count=0,this.cache={}})).on("click",(()=>{this.ui.currentIndex=0,(0,c.IJ)(t.editor)})).on("change.search",(()=>{this.cache={}})).on("keydown.search mousedown.search",t.async.debounce((()=>{this.ui.selInfo&&(t.s.removeMarkers(),this.ui.selInfo=null),this.ui.isOpened&&this.updateCounters()}),t.defaultTimeout)).on("searchNext.search searchPrevious.search",(()=>(this.ui.isOpened||this.ui.open(),e.findAndSelect(e.ui.query,"searchNext"===t.e.current).catch((t=>{}))))).on("search.search",((t,s=!0)=>(this.ui.currentIndex=0,e.findAndSelect(t||"",s).catch((t=>{}))))),t.registerCommand("search",{exec(t,s,i=!0){return s&&e.findAndSelect(s,i).catch((t=>{})),!1}}).registerCommand("openSearchDialog",{exec(t,s){return e.ui.open(s),!1},hotkeys:["ctrl+f","cmd+f"]}).registerCommand("openReplaceDialog",{exec(s,i,r){return t.o.readonly||e.ui.open(i,r,!0),!1},hotkeys:["ctrl+h","cmd+h"]})}}beforeDestruct(t){this.ui.destruct(),t.e.off(".search")}}(0,i.Cg)([r.cache],d.prototype,"ui",null),(0,i.Cg)([(0,r.watch)("ui:needUpdateCounters")],d.prototype,"updateCounters",null),(0,i.Cg)([(0,r.watch)("ui:pressReplaceButton")],d.prototype,"onPressReplaceButton",null),(0,i.Cg)([r.autobind],d.prototype,"findQueryBounds",null),(0,i.Cg)([r.autobind],d.prototype,"findAndReplace",null),(0,i.Cg)([r.autobind],d.prototype,"findAndSelect",null),(0,i.Cg)([r.autobind],d.prototype,"find",null),(0,i.Cg)([(0,r.watch)(":afterGetValueFromEditor")],d.prototype,"onAfterGetValueFromEditor",null),n.fg.add("search",d)},63064(t,e,s){"use strict";s.d(e,{F(){return c}});var i=s(31635),r=s(17352),o=s(22664),n=s(71842),a=s(65147),l=s(53048);let c=class t extends l.D${className(){return"UISearch"}render(){return`
\n\t\t\t
\n\t\t\t\t
\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t
\n\t\t\t\t
\n\t\t\t\t\t\n\t\t\t\t\t\t0/0\n\t\t\t\t\t\n\t\t\t\t
\n\t\t\t\t
\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t
\n\t\t\t
\n\t\t
`}get currentIndex(){return this._currentIndex}set currentIndex(t){this._currentIndex=t,this.currentBox.innerText=""+t}set count(t){this.countBox.innerText=""+t}get query(){return this.queryInput.value}get replace(){return this.replaceInput.value}constructor(t){super(t),this.selInfo=null,this._currentIndex=0,this.isOpened=!1;const{query:e,replace:s,cancel:i,next:o,prev:n,replaceBtn:l,current:c,count:u}=(0,a.refs)(this.container);this.queryInput=e,this.replaceInput=s,this.closeButton=i,this.replaceButton=l,this.currentBox=c,this.countBox=u,t.e.on(this.closeButton,"pointerdown",(()=>(this.close(),!1))).on(this.queryInput,"input",(()=>{this.currentIndex=0})).on(this.queryInput,"pointerdown",(()=>{t.s.isFocused()&&(t.s.removeMarkers(),this.selInfo=t.s.save())})).on(this.replaceButton,"pointerdown",(()=>(t.e.fire(this,"pressReplaceButton"),!1))).on(o,"pointerdown",(()=>(t.e.fire("searchNext"),!1))).on(n,"pointerdown",(()=>(t.e.fire("searchPrevious"),!1))).on(this.queryInput,"input",(()=>{this.setMod("empty-query",!(0,a.trim)(this.queryInput.value).length)})).on(this.queryInput,"keydown",this.j.async.debounce((e=>{e.key===r.KEY_ENTER?(e.preventDefault(),e.stopImmediatePropagation(),t.e.fire("searchNext")&&this.close()):t.e.fire(this,"needUpdateCounters")}),this.j.defaultTimeout))}onEditorKeyDown(t){if(!this.isOpened)return;const{j:e}=this;if(e.getRealMode()===r.MODE_WYSIWYG)switch(t.key){case r.KEY_ESC:this.close();break;case r.KEY_F3:this.queryInput.value&&(e.e.fire(t.shiftKey?"searchPrevious":"searchNext"),t.preventDefault())}}open(t,e,s=!1){this.isOpened||(this.j.workplace.appendChild(this.container),this.isOpened=!0),this.calcSticky(this.j.e.fire("getStickyState.sticky")||!1),this.j.e.fire("hidePopup"),this.setMod("replace",s);const i=t??""+(this.j.s.sel||"");i&&(this.queryInput.value=i),e&&(this.replaceInput.value=e),this.setMod("empty-query",!i.length),this.j.e.fire(this,"needUpdateCounters"),i?this.queryInput.select():this.queryInput.focus()}close(){this.isOpened&&(this.j.s.restore(),n.J.safeRemove(this.container),this.isOpened=!1,this.j.e.fire(this,"afterClose"))}calcSticky(t){if(this.isOpened)if(this.setMod("sticky",t),t){const t=(0,a.position)(this.j.toolbarContainer);(0,a.css)(this.container,{top:t.top+t.height,left:t.left+t.width})}else(0,a.css)(this.container,{top:null,left:null})}};(0,i.Cg)([(0,o.watch)([":keydown","queryInput:keydown"])],c.prototype,"onEditorKeyDown",null),(0,i.Cg)([o.autobind],c.prototype,"open",null),(0,i.Cg)([o.autobind],c.prototype,"close",null),(0,i.Cg)([(0,o.watch)(":toggleSticky")],c.prototype,"calcSticky",null),c=(0,i.Cg)([o.component],c)},29581(t,e,s){"use strict";s(36115).T.prototype.tableAllowCellSelection=!0},46939(t,e,s){"use strict";var i=s(31635),r=s(17352),o=s(22664),n=s(55186),a=s(56298),l=s(65147),c=s(71005),u=s(11648);s(29581);const d="table_processor_observer",h="onMoveTableSelectCell";class p extends c.k{constructor(){super(...arguments),this.__selectedCell=null,this.__isSelectionMode=!1}get __tableModule(){return this.j.getInstance(u.X,this.j.o)}afterInit(t){t.o.tableAllowCellSelection&&t.e.on("keydown.select-cells",(t=>{t.key===r.KEY_TAB&&this.unselectCells()})).on("beforeCommand.select-cells",this.onExecCommand).on("afterCommand.select-cells",this.onAfterCommand).on(["clickEditor","mousedownTd","mousedownTh","touchstartTd","touchstartTh"].map((t=>t+".select-cells")).join(" "),this.onStartSelection).on("clickTr clickTbody",(()=>{const t=this.__tableModule.getAllSelectedCells().length;if(t)return t>1&&this.j.s.sel?.removeAllRanges(),!1}))}onStartSelection(t){if(this.j.o.readonly)return;if(this.unselectCells(),t===this.j.editor)return;const e=n.J.closest(t,"table",this.j.editor);return t&&e?(t.firstChild||t.appendChild(this.j.createInside.element("br")),this.__isSelectionMode=!0,this.__selectedCell=t,this.__tableModule.addSelection(t),this.j.e.on(e,"mousemove.select-cells touchmove.select-cells",this.j.async.throttle(this.__onMove.bind(this,e),{label:h,timeout:this.j.defaultTimeout/2})).on(e,"mouseup.select-cells touchend.select-cells",this.__onStopSelection.bind(this,e)),!1):void 0}onOutsideClick(){this.__selectedCell=null,this.__onRemoveSelection()}onChange(){this.j.isLocked||this.__isSelectionMode||this.__onRemoveSelection()}__onMove(t,e){if(this.j.o.readonly&&!this.j.isLocked)return;if(this.j.isLockedNotBy(d))return;const s=this.j.ed.elementFromPoint(e.clientX,e.clientY);if(!s)return;const i=n.J.closest(s,["td","th"],t);if(!i||!this.__selectedCell)return;i!==this.__selectedCell&&this.j.lock(d),this.unselectCells();const r=this.__tableModule.getSelectedBound(t,[i,this.__selectedCell]),o=this.__tableModule.formalMatrix(t);for(let t=r[0][0];r[1][0]>=t;t+=1)for(let e=r[0][1];r[1][1]>=e;e+=1)this.__tableModule.addSelection(o[t][e]);this.__tableModule.getAllSelectedCells().length>1&&this.j.s.sel?.removeAllRanges(),this.j.e.fire("hidePopup"),e.stopPropagation(),(()=>{const t=this.j.createInside.fromHTML('
 
');i.appendChild(t),this.j.async.setTimeout((()=>{t.parentNode?.removeChild(t)}),this.j.defaultTimeout/5)})()}__onRemoveSelection(t){if(!t?.buffer?.actionTrigger&&!this.__selectedCell&&this.__tableModule.getAllSelectedCells().length)return this.j.unlock(),this.unselectCells(),void this.j.e.fire("hidePopup","cells");this.__isSelectionMode=!1,this.__selectedCell=null}__onStopSelection(t,e){if(!this.__selectedCell)return;this.__isSelectionMode=!1,this.j.unlock();const s=this.j.ed.elementFromPoint(e.clientX,e.clientY);if(!s)return;const i=n.J.closest(s,["td","th"],t);if(!i)return;const r=n.J.closest(i,"table",t);if(r&&r!==t)return;const o=this.__tableModule.getSelectedBound(t,[i,this.__selectedCell]),a=this.__tableModule.formalMatrix(t),c=a[o[1][0]][o[1][1]],u=a[o[0][0]][o[0][1]];this.j.e.fire("showPopup",t,(()=>{const t=(0,l.position)(u,this.j),e=(0,l.position)(c,this.j);return{left:t.left,top:t.top,width:e.left-t.left+e.width,height:e.top-t.top+e.height}}),"cells"),(0,l.$$)("table",this.j.editor).forEach((t=>{this.j.e.off(t,"mousemove.select-cells touchmove.select-cells mouseup.select-cells touchend.select-cells")})),this.j.async.clearTimeout(h)}unselectCells(t){const e=this.__tableModule,s=e.getAllSelectedCells();s.length&&s.forEach((s=>{t&&t===s||e.removeSelection(s)}))}onExecCommand(t){if(/table(splitv|splitg|merge|empty|bin|binrow|bincolumn|addcolumn|addrow)/.test(t)){t=t.replace("table","");const e=this.__tableModule.getAllSelectedCells();if(e.length){const[s]=e;if(!s)return;const i=n.J.closest(s,"table",this.j.editor);if(!i)return;switch(t){case"splitv":this.__tableModule.splitVertical(i);break;case"splitg":this.__tableModule.splitHorizontal(i);break;case"merge":this.__tableModule.mergeSelected(i);break;case"empty":e.forEach((t=>n.J.detach(t)));break;case"bin":n.J.safeRemove(i);break;case"binrow":new Set(e.map((t=>t.parentNode))).forEach((t=>{this.__tableModule.removeRow(i,t.rowIndex)}));break;case"bincolumn":{const t=new Set;e.reduce(((e,s)=>(t.has(s.cellIndex)||(e.push(s),t.add(s.cellIndex)),e)),[]).forEach((t=>{this.__tableModule.removeColumn(i,t.cellIndex)}))}break;case"addcolumnafter":case"addcolumnbefore":this.__tableModule.appendColumn(i,s.cellIndex,"addcolumnafter"===t);break;case"addrowafter":case"addrowbefore":this.__tableModule.appendRow(i,s.parentNode,"addrowafter"===t)}}return!1}}onAfterCommand(t){/^justify/.test(t)&&this.__tableModule.getAllSelectedCells().forEach((e=>(0,l.alignElement)(t,e)))}beforeDestruct(t){this.__onRemoveSelection(),t.e.off(".select-cells")}}p.requires=["select"],(0,i.Cg)([o.autobind],p.prototype,"onStartSelection",null),(0,i.Cg)([(0,o.watch)(":outsideClick")],p.prototype,"onOutsideClick",null),(0,i.Cg)([(0,o.watch)(":change")],p.prototype,"onChange",null),(0,i.Cg)([o.autobind],p.prototype,"__onRemoveSelection",null),(0,i.Cg)([o.autobind],p.prototype,"__onStopSelection",null),(0,i.Cg)([o.autobind],p.prototype,"onExecCommand",null),(0,i.Cg)([o.autobind],p.prototype,"onAfterCommand",null),a.fg.add("selectCells",p)},41133(t,e,s){"use strict";s(36115).T.prototype.select={normalizeSelectionBeforeCutAndCopy:!1,normalizeTripleClick:!0}},35523(t,e,s){"use strict";var i=s(31635),r=s(22664),o=s(55186),n=s(56298),a=s(83260),l=s(71005),c=s(53048);s(41133);class u extends l.k{constructor(){super(...arguments),this.proxyEventsList=["click","mousedown","touchstart","mouseup","touchend"]}afterInit(t){this.proxyEventsList.forEach((e=>{t.e.on(e+".select",this.onStartSelection)}))}beforeDestruct(t){this.proxyEventsList.forEach((e=>{t.e.on(e+".select",this.onStartSelection)}))}onStartSelection(t){const{j:e}=this;let s,i=t.target;for(;void 0===s&&i&&i!==e.editor;)s=e.e.fire((0,a.x)(t.type+"_"+i.nodeName.toLowerCase()),i,t),i=i.parentElement;"click"===t.type&&void 0===s&&i===e.editor&&e.e.fire(t.type+"Editor",i,t)}onOutsideClick(t){const e=t.target;o.J.up(e,(t=>t===this.j.editor))||c.D$.closestElement(e,c.zD)||this.j.e.fire("outsideClick",t)}beforeCommandCut(){const{s:t}=this.j;if(!t.isCollapsed()){const e=t.current();e&&o.J.isOrContains(this.j.editor,e)&&this.onCopyNormalizeSelectionBound()}}beforeCommandSelectAll(){const{s:t}=this.j;return t.focus(),t.select(this.j.editor,!0),t.expandSelection(),!1}onTripleClickNormalizeSelection(t){if(3!==t.detail||!this.j.o.select.normalizeTripleClick)return;const{s:e}=this.j,{startContainer:s,startOffset:i}=e.range;0===i&&o.J.isText(s)&&e.select(o.J.closest(s,o.J.isBlock,this.j.editor)||s,!0)}onCopyNormalizeSelectionBound(t){const{s:e,editor:s,o:i}=this.j;i.select.normalizeSelectionBeforeCutAndCopy&&!e.isCollapsed()&&(!t||t.isTrusted&&o.J.isNode(t.target)&&o.J.isOrContains(s,t.target))&&this.jodit.s.expandSelection()}}(0,i.Cg)([r.autobind],u.prototype,"onStartSelection",null),(0,i.Cg)([(0,r.watch)("ow:click")],u.prototype,"onOutsideClick",null),(0,i.Cg)([(0,r.watch)([":beforeCommandCut"])],u.prototype,"beforeCommandCut",null),(0,i.Cg)([(0,r.watch)([":beforeCommandSelectall"])],u.prototype,"beforeCommandSelectAll",null),(0,i.Cg)([(0,r.watch)([":click"])],u.prototype,"onTripleClickNormalizeSelection",null),(0,i.Cg)([(0,r.watch)([":copy",":cut"])],u.prototype,"onCopyNormalizeSelectionBound",null),n.fg.add("select",u)},78134(t,e,s){"use strict";var i=s(36115);i.T.prototype.minWidth=200,i.T.prototype.maxWidth="100%",i.T.prototype.minHeight=200,i.T.prototype.maxHeight="auto",i.T.prototype.saveHeightInStorage=!1},69077(t,e,s){"use strict";var i=s(31635),r=s(22664),o=s(56298),n=s(2461),a=s(38322),l=s(29866);s(78134);let c=class t extends l.k{constructor(){super(...arguments),this.__resizeWorkspaces=this.j.async.debounce(this.__resizeWorkspaceImd,this.j.defaultTimeout,!0)}afterInit(t){t.e.on("setHeight.size",this.__setHeight).on("setWidth.size",this.__setWidth).on("afterInit.size changePlace.size",this.__initialize,{top:!0}).on(t.ow,"load.size",this.__resizeWorkspaces).on("afterInit.size resize.size afterUpdateToolbar.size scroll.size afterResize.size",this.__resizeWorkspaces).on("toggleFullSize.size toggleToolbar.size",this.__resizeWorkspaceImd),this.__initialize()}__initialize(){const{j:t}=this;if(t.o.inline)return;let{height:e}=t.o;if(t.o.saveHeightInStorage&&"auto"!==e){const s=t.storage.get("height");s&&(e=s)}(0,a.A)(t.editor,{minHeight:"100%"}),(0,a.A)(t.container,{minHeight:t.o.minHeight,maxHeight:t.o.maxHeight,minWidth:t.o.minWidth,maxWidth:t.o.maxWidth}),t.isFullSize||(this.__setHeight(e),this.__setWidth(t.o.width))}__setHeight(t){if((0,n.E)(t)){const{minHeight:e,maxHeight:s}=this.j.o;(0,n.E)(e)&&e>t&&(t=e),(0,n.E)(s)&&t>s&&(t=s)}(0,a.A)(this.j.container,"height",t),this.j.o.saveHeightInStorage&&this.j.storage.set("height",t),this.__resizeWorkspaceImd()}__setWidth(t){if((0,n.E)(t)){const{minWidth:e,maxWidth:s}=this.j.o;(0,n.E)(e)&&e>t&&(t=e),(0,n.E)(s)&&t>s&&(t=s)}(0,a.A)(this.j.container,"width",t),this.__resizeWorkspaceImd()}__getNotWorkHeight(){return(this.j.toolbarContainer?.offsetHeight||0)+(this.j.statusbar?.getHeight()||0)+2}__resizeWorkspaceImd(){if(!this.j||this.j.isDestructed||!this.j.o||this.j.o.inline)return;if(!this.j.container||!this.j.container.parentNode)return;const t=((0,a.A)(this.j.container,"minHeight")||0)-this.__getNotWorkHeight();if((0,n.E)(t)&&t>0&&([this.j.workplace,this.j.iframe,this.j.editor].map((e=>{e&&(0,a.A)(e,"minHeight",t)})),this.j.e.fire("setMinHeight",t)),(0,n.E)(this.j.o.maxHeight)){const t=this.j.o.maxHeight-this.__getNotWorkHeight();[this.j.workplace,this.j.iframe,this.j.editor].map((e=>{e&&(0,a.A)(e,"maxHeight",t)})),this.j.e.fire("setMaxHeight",t)}this.j.container&&(0,a.A)(this.j.workplace,"height","auto"!==this.j.o.height||this.j.isFullSize?this.j.container.offsetHeight-this.__getNotWorkHeight():"auto")}beforeDestruct(t){t.e.off(t.ow,"load.size",this.__resizeWorkspaces).off(".size")}};(0,i.Cg)([(0,r.throttle)()],c.prototype,"__initialize",null),(0,i.Cg)([r.autobind],c.prototype,"__resizeWorkspaceImd",null),c=(0,i.Cg)([r.autobind],c),o.fg.add("size",c)},90722(t,e,s){"use strict";var i=s(17352),r=s(931),o=s(9103),n=s.n(o),a=s(36115);a.T.prototype.beautifyHTML=!i.IS_IE,a.T.prototype.sourceEditor="ace",a.T.prototype.sourceEditorNativeOptions={showGutter:!0,theme:"ace/theme/idle_fingers",mode:"ace/mode/html",wrap:!0,highlightActiveLine:!0},a.T.prototype.sourceEditorCDNUrlsJS=["https://cdnjs.cloudflare.com/ajax/libs/ace/1.4.2/ace.js"],a.T.prototype.beautifyHTMLCDNUrlsJS=["https://cdnjs.cloudflare.com/ajax/libs/js-beautify/1.14.4/beautify.min.js","https://cdnjs.cloudflare.com/ajax/libs/js-beautify/1.14.4/beautify-html.min.js"],r.I.set("source",n()),a.T.prototype.controls.source={mode:i.MODE_SPLIT,exec(t){t.toggleMode()},isActive(t){return t.getRealMode()===i.MODE_SOURCE},tooltip:"Change mode"}},5533(t,e,s){"use strict";s.d(e,{p(){return n}});var i=s(17352),r=s(65147),o=s(53380);class n extends o.F{constructor(){super(...arguments),this.className="jodit_ace_editor",this.proxyOnBlur=t=>{this.j.e.fire("blur",t)},this.proxyOnFocus=t=>{this.j.e.fire("focus",t)},this.proxyOnMouseDown=t=>{this.j.e.fire("mousedown",t)}}aceExists(){return void 0!==this.j.ow.ace}getLastColumnIndex(t){return this.instance.session.getLine(t).length}getLastColumnIndices(){const t=this.instance.session.getLength(),e=[];let s=0;for(let i=0;t>i;i++)s+=this.getLastColumnIndex(i),i>0&&(s+=1),e[i]=s;return e}getRowColumnIndices(t){const e=this.getLastColumnIndices();if(e[0]>=t)return{row:0,column:t};let s=1;for(let i=1;e.length>i;i++)t>e[i]&&(s=i+1);return{row:s,column:t-e[s-1]-1}}setSelectionRangeIndices(t,e){const s=this.getRowColumnIndices(t),i=this.getRowColumnIndices(e);this.instance.getSelection().setSelectionRange({start:s,end:i})}getIndexByRowColumn(t,e){return this.getLastColumnIndices()[t]-this.getLastColumnIndex(t)+e}init(t){const e=()=>{if(void 0!==this.instance||!this.aceExists())return;const e=this.j.c.div("jodit-source__mirror-fake");this.container.appendChild(e),this.instance=t.ow.ace.edit(e),this.instance.setTheme(t.o.sourceEditorNativeOptions.theme),this.instance.renderer.setShowGutter(t.o.sourceEditorNativeOptions.showGutter),this.instance.getSession().setMode(t.o.sourceEditorNativeOptions.mode),this.instance.setHighlightActiveLine(t.o.sourceEditorNativeOptions.highlightActiveLine),this.instance.getSession().setUseWrapMode(!0),this.instance.setOption("indentedSoftWrap",!1),this.instance.setOption("wrap",t.o.sourceEditorNativeOptions.wrap),this.instance.getSession().setUseWorker(!1),this.instance.$blockScrolling=1/0,this.instance.on("change",this.toWYSIWYG),this.instance.on("focus",this.proxyOnFocus),this.instance.on("mousedown",this.proxyOnMouseDown),this.instance.on("blur",this.proxyOnBlur),t.getRealMode()!==i.MODE_WYSIWYG&&this.setValue(this.getValue());const s=this.j.async.debounce((()=>{t.isInDestruct||(this.instance.setOption("maxLines","auto"!==t.o.height?t.workplace.offsetHeight/this.instance.renderer.lineHeight:1/0),this.instance.resize())}),2*this.j.defaultTimeout);t.e.on("afterResize afterSetMode",s),s(),this.onReady()};t.e.on("afterSetMode",(()=>{t.getRealMode()!==i.MODE_SOURCE&&t.getMode()!==i.MODE_SPLIT||(this.fromWYSIWYG(),e())})),e(),this.aceExists()||(0,r.loadNext)(t,t.o.sourceEditorCDNUrlsJS).then((()=>{t.isInDestruct||e()})).catch((()=>null))}destruct(){this.instance.off("change",this.toWYSIWYG),this.instance.off("focus",this.proxyOnFocus),this.instance.off("mousedown",this.proxyOnMouseDown),this.instance.destroy(),this.j?.events?.off("aceInited.source")}setValue(t){if(!this.j.o.editHTMLDocumentMode&&this.j.o.beautifyHTML){const e=this.j.e.fire("beautifyHTML",t);(0,r.isString)(e)&&(t=e)}this.instance.setValue(t),this.instance.clearSelection()}getValue(){return this.instance.getValue()}setReadOnly(t){this.instance.setReadOnly(t)}get isFocused(){return this.instance.isFocused()}focus(){this.instance.focus()}blur(){this.instance.blur()}getSelectionStart(){const t=this.instance.selection.getRange();return this.getIndexByRowColumn(t.start.row,t.start.column)}getSelectionEnd(){const t=this.instance.selection.getRange();return this.getIndexByRowColumn(t.end.row,t.end.column)}selectAll(){this.instance.selection.selectAll()}insertRaw(t){const e=this.instance.selection.getCursor(),s=this.instance.session.insert(e,t);this.instance.selection.setRange({start:e,end:s},!1)}setSelectionRange(t,e){this.setSelectionRangeIndices(t,e)}setPlaceHolder(t){}replaceUndoManager(){const{history:t}=this.jodit;this.instance.commands.addCommand({name:"Undo",bindKey:{win:"Ctrl-Z",mac:"Command-Z"},exec(){t.undo()}}),this.instance.commands.addCommand({name:"Redo",bindKey:{win:"Ctrl-Shift-Z",mac:"Command-Shift-Z"},exec(){t.redo()}})}}},55265(t,e,s){"use strict";s.d(e,{S(){return n}});var i=s(55186),r=s(38322),o=s(53380);class n extends o.F{constructor(){super(...arguments),this.autosize=this.j.async.debounce((()=>{this.instance.style.height="auto",this.instance.style.height=this.instance.scrollHeight+"px"}),this.j.defaultTimeout)}init(t){this.instance=t.c.element("textarea",{class:"jodit-source__mirror"}),this.container.appendChild(this.instance),t.e.on(this.instance,"mousedown keydown touchstart input",t.async.debounce(this.toWYSIWYG,t.defaultTimeout)).on("setMinHeight.source",(t=>{(0,r.A)(this.instance,"minHeight",t)})).on(this.instance,"change keydown mousedown touchstart input",this.autosize).on("afterSetMode.source",this.autosize).on(this.instance,"mousedown focus",(e=>{t.e.fire(e.type,e)})),this.autosize(),this.onReady()}destruct(){i.J.safeRemove(this.instance)}getValue(){return this.instance.value}setValue(t){this.instance.value=t}insertRaw(t){const e=this.getValue();if(0>this.getSelectionStart())this.setValue(e+t);else{const s=this.getSelectionStart(),i=this.getSelectionEnd();this.setValue(e.substring(0,s)+t+e.substring(i,e.length))}}getSelectionStart(){return this.instance.selectionStart}getSelectionEnd(){return this.instance.selectionEnd}setSelectionRange(t,e=t){this.instance.setSelectionRange(t,e)}get isFocused(){return this.instance===this.j.od.activeElement}focus(){this.instance.focus()}blur(){this.instance.blur()}setPlaceHolder(t){this.instance.setAttribute("placeholder",t)}setReadOnly(t){t?this.instance.setAttribute("readonly","true"):this.instance.removeAttribute("readonly")}selectAll(){this.instance.select()}replaceUndoManager(){const{history:t}=this.jodit;this.j.e.on(this.instance,"keydown",(e=>{if((e.ctrlKey||e.metaKey)&&"z"===e.key)return e.shiftKey?t.redo():t.undo(),this.setSelectionRange(this.getValue().length),!1}))}}},76134(t,e,s){"use strict";s.d(e,{S(){return r.S},p(){return i.p}});var i=s(5533),r=s(55265)},1992(t,e,s){"use strict";s.d(e,{b(){return o}});var i=s(65147),r=s(76134);function o(t,e,s,o,n){let a;if((0,i.isFunction)(t))a=t(e);else switch(t){case"ace":if(!e.o.shadowRoot){a=new r.p(e,s,o,n);break}default:a=new r.S(e,s,o,n)}return a.init(e),a.onReadyAlways((()=>{a.setReadOnly(e.o.readonly)})),a}},53380(t,e,s){"use strict";s.d(e,{F(){return i}});class i{constructor(t,e,s,i){this.jodit=t,this.container=e,this.toWYSIWYG=s,this.fromWYSIWYG=i,this.className="",this.isReady=!1}get j(){return this.jodit}onReady(){this.replaceUndoManager(),this.isReady=!0,this.j.e.fire(this,"ready")}onReadyAlways(t){this.isReady?t():this.j.events?.on(this,"ready",t)}}},93669(t,e,s){"use strict";var i=s(31635),r=s(17352),o=s(22664),n=s(55186),a=s(56298),l=s(65147),c=s(71005),u=(s(90722),s(1992));class d extends c.k{constructor(){super(...arguments),this.buttons=[{name:"source",group:"source"}],this.__lock=!1,this.__oldMirrorValue="",this.tempMarkerStart="{start-jodit-selection}",this.tempMarkerStartReg=/{start-jodit-selection}/g,this.tempMarkerEnd="{end-jodit-selection}",this.tempMarkerEndReg=/{end-jodit-selection}/g,this.getSelectionStart=()=>this.sourceEditor?.getSelectionStart()??0,this.getSelectionEnd=()=>this.sourceEditor?.getSelectionEnd()??0}onInsertHTML(t){if(!this.j.o.readonly&&!this.j.isEditorMode())return this.sourceEditor?.insertRaw(t),this.toWYSIWYG(),!1}fromWYSIWYG(t=!1){if(!this.__lock||!0===t){this.__lock=!0;const t=this.j.getEditorValue(!1,r.SOURCE_CONSUMER);t!==this.getMirrorValue()&&this.setMirrorValue(t),this.__lock=!1}}toWYSIWYG(){if(this.__lock)return;const t=this.getMirrorValue();t!==this.__oldMirrorValue&&(this.__lock=!0,this.j.value=t,this.__lock=!1,this.__oldMirrorValue=t)}getNormalPosition(t,e){for(e=e.replace(/<(script|style|iframe)[^>]*>[^]*?<\/\1>/im,(t=>{let e="";for(let s=0;t.length>s;s+=1)e+=r.INVISIBLE_SPACE;return e}));t>0&&e[t]===r.INVISIBLE_SPACE;)t--;let s=t;for(;s>0;){if(s--,"<"===e[s]&&void 0!==e[s+1]&&e[s+1].match(/[\w/]+/i))return s;if(">"===e[s])return t}return t}clnInv(t){return t.replace(r.INVISIBLE_SPACE_REG_EXP(),"")}onSelectAll(t){if("selectall"===t.toLowerCase()&&this.j.getRealMode()===r.MODE_SOURCE)return this.sourceEditor?.selectAll(),!1}getMirrorValue(){return this.sourceEditor?.getValue()||""}setMirrorValue(t){this.sourceEditor?.setValue(t)}setFocusToMirror(){this.sourceEditor?.focus()}saveSelection(){if(this.j.getRealMode()===r.MODE_WYSIWYG)this.j.s.save(),this.j.synchronizeValues(),this.fromWYSIWYG(!0);else{if(this.j.o.editHTMLDocumentMode)return;const t=this.getMirrorValue();if(this.getSelectionStart()===this.getSelectionEnd()){const e=this.j.s.marker(!0),s=this.getNormalPosition(this.getSelectionStart(),this.getMirrorValue());this.setMirrorValue(t.substring(0,s)+this.clnInv(e.outerHTML)+t.substring(s))}else{const e=this.j.s.marker(!0),s=this.j.s.marker(!1),i=this.getNormalPosition(this.getSelectionStart(),t),r=this.getNormalPosition(this.getSelectionEnd(),t);this.setMirrorValue(t.slice(0,i)+this.clnInv(e.outerHTML)+t.slice(i,r)+this.clnInv(s.outerHTML)+t.slice(r))}this.toWYSIWYG()}}removeSelection(){if(this.j.getRealMode()===r.MODE_WYSIWYG)return this.__lock=!0,this.j.s.restore(),void(this.__lock=!1);let t=this.getMirrorValue(),e=0,s=0;try{if(t=t.replace(/]+data-jodit-selection_marker=(["'])start\1[^>]*>[<>]*?<\/span>/gim,this.tempMarkerStart).replace(/]+data-jodit-selection_marker=(["'])end\1[^>]*>[<>]*?<\/span>/gim,this.tempMarkerEnd),!this.j.o.editHTMLDocumentMode&&this.j.o.beautifyHTML){const e=this.j.e.fire("beautifyHTML",t);(0,l.isString)(e)&&(t=e)}if(e=t.indexOf(this.tempMarkerStart),s=e,t=t.replace(this.tempMarkerStartReg,""),-1!==e){const e=t.indexOf(this.tempMarkerEnd);-1!==e&&(s=e)}t=t.replace(this.tempMarkerEndReg,"")}finally{t=t.replace(this.tempMarkerEndReg,"").replace(this.tempMarkerStartReg,"")}this.setMirrorValue(t),this.setMirrorSelectionRange(e,s),this.toWYSIWYG(),this.setFocusToMirror()}setMirrorSelectionRange(t,e){this.sourceEditor?.setSelectionRange(t,e)}onReadonlyReact(){this.sourceEditor?.setReadOnly(this.j.o.readonly)}afterInit(t){if(this.mirrorContainer=t.c.div("jodit-source"),t.workplace.appendChild(this.mirrorContainer),t.e.on("afterAddPlace changePlace afterInit",(()=>{t.workplace.appendChild(this.mirrorContainer)})),this.sourceEditor=(0,u.b)("area",t,this.mirrorContainer,this.toWYSIWYG,this.fromWYSIWYG),t.e.on(t.ow,"keydown",(t=>{t.key===r.KEY_ESC&&this.sourceEditor?.isFocused&&this.sourceEditor.blur()})),this.onReadonlyReact(),t.e.on("placeholder.source",(t=>{this.sourceEditor?.setPlaceHolder(t)})).on("change.source",this.syncValueFromWYSIWYG).on("beautifyHTML",(t=>t)),t.o.beautifyHTML){const e=()=>{if(t.isInDestruct)return!1;const e=t.ow.html_beautify;return!(!e||t.isInDestruct||(t.events?.off("beautifyHTML").on("beautifyHTML",(t=>e(t))),0))};e()||(0,l.loadNext)(t,t.o.beautifyHTMLCDNUrlsJS).then(e,(()=>null))}this.syncValueFromWYSIWYG(!0),this.initSourceEditor(t)}syncValueFromWYSIWYG(t=!1){const e=this.j;e.getMode()!==r.MODE_SPLIT&&e.getMode()!==r.MODE_SOURCE||this.fromWYSIWYG(t)}initSourceEditor(t){if("area"!==t.o.sourceEditor){const e=(0,u.b)(t.o.sourceEditor,t,this.mirrorContainer,this.toWYSIWYG,this.fromWYSIWYG);e.onReadyAlways((()=>{this.sourceEditor?.destruct(),this.sourceEditor=e,this.syncValueFromWYSIWYG(!0),t.events?.fire("sourceEditorReady",t)}))}else this.sourceEditor?.onReadyAlways((()=>{this.syncValueFromWYSIWYG(!0),t.events?.fire("sourceEditorReady",t)}))}beforeDestruct(){this.sourceEditor&&(this.sourceEditor.destruct(),delete this.sourceEditor),n.J.safeRemove(this.mirrorContainer)}}(0,i.Cg)([(0,o.watch)(":insertHTML.source")],d.prototype,"onInsertHTML",null),(0,i.Cg)([o.autobind],d.prototype,"fromWYSIWYG",null),(0,i.Cg)([o.autobind],d.prototype,"toWYSIWYG",null),(0,i.Cg)([o.autobind],d.prototype,"getNormalPosition",null),(0,i.Cg)([(0,o.watch)(":beforeCommand.source")],d.prototype,"onSelectAll",null),(0,i.Cg)([(0,o.watch)(":beforeSetMode.source")],d.prototype,"saveSelection",null),(0,i.Cg)([(0,o.watch)(":afterSetMode.source")],d.prototype,"removeSelection",null),(0,i.Cg)([o.autobind],d.prototype,"setMirrorSelectionRange",null),(0,i.Cg)([(0,o.watch)(":readonly.source")],d.prototype,"onReadonlyReact",null),(0,i.Cg)([o.autobind],d.prototype,"syncValueFromWYSIWYG",null),a.fg.add("source",d)},78703(t,e,s){"use strict";var i=s(931),r=s(49989),o=s.n(r),n=s(36115);n.T.prototype.spellcheck=!1,i.I.set("spellcheck",o()),n.T.prototype.controls.spellcheck={isActive:t=>t.o.spellcheck,icon:o(),name:"spellcheck",command:"toggleSpellcheck",tooltip:"Spellcheck"}},82602(t){"use strict";t.exports={Spellcheck:"التدقيق الإملائي"}},24575(t){"use strict";t.exports={Spellcheck:"Kontrola pravopisu"}},37414(t){"use strict";t.exports={Spellcheck:"Rechtschreibprüfung"}},82333(t){"use strict";t.exports={Spellcheck:"Corrección ortográfica"}},80124(t){"use strict";t.exports={Spellcheck:"غلطیابی املایی"}},96516(t){"use strict";t.exports={Spellcheck:"Oikeinkirjoituksen tarkistus"}},30965(t){"use strict";t.exports={Spellcheck:"Vérification Orthographique"}},80194(t){"use strict";t.exports={Spellcheck:"בדיקת איות"}},49458(t){"use strict";t.exports={Spellcheck:"Helyesírás-ellenőrzés"}},8916(t){"use strict";t.exports={Spellcheck:"Spellchecking"}},11995(t,e,s){"use strict";s.r(e),s.d(e,{ar(){return i},cs_cz(){return r},de(){return o},es(){return n},fa(){return a},fi(){return l},fr(){return c},he(){return u},hu(){return d},id(){return h},it(){return p},ja(){return m},ko(){return g},mn(){return f},nl(){return v},pl(){return b},pt_br(){return y},ru(){return _},tr(){return w},zh_cn(){return C},zh_tw(){return k}});var i=s(82602),r=s(24575),o=s(37414),n=s(82333),a=s(80124),l=s(96516),c=s(30965),u=s(80194),d=s(49458),h=s(8916),p=s(43268),m=s(11968),g=s(12715),f=s(45698),v=s(40119),b=s(92657),y=s(68648),_=s(70420),w=s(98439),C=s(55835),k=s(34747)},43268(t){"use strict";t.exports={Spellcheck:"Controllo ortografico"}},11968(t){"use strict";t.exports={Spellcheck:"スペルチェック"}},12715(t){"use strict";t.exports={Spellcheck:"맞춤법 검사"}},45698(t){"use strict";t.exports={Spellcheck:"Дүрмийн алдаа шалгах"}},40119(t){"use strict";t.exports={Spellcheck:"Spellingcontrole"}},92657(t){"use strict";t.exports={Spellcheck:"Sprawdzanie pisowni"}},68648(t){"use strict";t.exports={Spellcheck:"Verificação ortográfica"}},70420(t){"use strict";t.exports={Spellcheck:"Проверка орфографии"}},98439(t){"use strict";t.exports={Spellcheck:"Yazım denetimi"}},55835(t){"use strict";t.exports={Spellcheck:"拼写检查"}},34747(t){"use strict";t.exports={Spellcheck:"拼字檢查"}},97179(t,e,s){"use strict";var i=s(31635),r=s(22664),o=s(56298),n=s(26150),a=s(71005),l=(s(78703),s(11995));class c extends a.k{constructor(t){super(t),this.buttons=[{group:"state",name:"spellcheck"}],(0,o.JW)(l)}afterInit(t){t.e.on("afterInit afterAddPlace prepareWYSIWYGEditor",this.toggleSpellcheck),this.toggleSpellcheck(),t.registerCommand("toggleSpellcheck",(()=>{this.jodit.o.spellcheck=!this.jodit.o.spellcheck,this.toggleSpellcheck(),this.j.e.fire("updateToolbar")}))}toggleSpellcheck(){(0,n.C)(this.jodit.editor,"spellcheck",this.jodit.o.spellcheck)}beforeDestruct(t){}}(0,i.Cg)([r.autobind],c.prototype,"toggleSpellcheck",null),o.fg.add("spellcheck",c)},27195(t,e,s){"use strict";var i=s(36115);i.T.prototype.showCharsCounter=!0,i.T.prototype.countHTMLChars=!1,i.T.prototype.showWordsCounter=!0},65199(t,e,s){"use strict";var i=s(17352),r=s(55186),o=s(56298),n=s(29866);s(27195),o.fg.add("stat",class a extends n.k{constructor(){super(...arguments),this.charCounter=null,this.wordCounter=null,this.reInit=()=>{this.j.o.showCharsCounter&&this.charCounter&&this.j.statusbar.append(this.charCounter,!0),this.j.o.showWordsCounter&&this.wordCounter&&this.j.statusbar.append(this.wordCounter,!0),this.j.e.off("change keyup",this.calc).on("change keyup",this.calc),this.calc()},this.calc=this.j.async.throttle((()=>{const t=this.j.text;if(this.j.o.showCharsCounter&&this.charCounter){const e=this.j.o.countHTMLChars?this.j.value:t.replace((0,i.SPACE_REG_EXP)(),"");this.charCounter.textContent=this.j.i18n("Chars: %d",e.length)}this.j.o.showWordsCounter&&this.wordCounter&&(this.wordCounter.textContent=this.j.i18n("Words: %d",t.replace((0,i.INVISIBLE_SPACE_REG_EXP)(),"").split((0,i.SPACE_REG_EXP)()).filter((t=>t.length)).length))}),this.j.defaultTimeout)}afterInit(){this.charCounter=this.j.c.span(),this.wordCounter=this.j.c.span(),this.j.e.on("afterInit changePlace afterAddPlace",this.reInit),this.reInit()}beforeDestruct(){r.J.safeRemove(this.charCounter),r.J.safeRemove(this.wordCounter),this.j.e.off("afterInit changePlace afterAddPlace",this.reInit),this.charCounter=null,this.wordCounter=null}})},63400(t,e,s){"use strict";var i=s(36115);i.T.prototype.toolbarSticky=!0,i.T.prototype.toolbarDisableStickyForMobile=!0,i.T.prototype.toolbarStickyOffset=0},1677(t,e,s){"use strict";var i=s(31635),r=s(17352),o=s(22664),n=s(55186),a=s(56298),l=s(65147),c=s(29866);s(63400);const u=!r.IS_ES_NEXT&&r.IS_IE;class d extends c.k{constructor(){super(...arguments),this.__isToolbarStuck=!1,this.__createDummy=t=>{this.__dummyBox=this.j.c.div(),this.__dummyBox.classList.add("jodit_sticky-dummy_toolbar"),this.j.container.insertBefore(this.__dummyBox,t)},this.addSticky=t=>{this.__isToolbarStuck||(u&&!this.__dummyBox&&this.__createDummy(t),this.j.container.classList.add("jodit_sticky"),this.__isToolbarStuck=!0),(0,l.css)(t,{top:this.j.o.toolbarStickyOffset||null,width:this.j.container.offsetWidth-2}),this.__dummyBox&&(0,l.css)(this.__dummyBox,{height:t.offsetHeight})},this.removeSticky=t=>{this.__isToolbarStuck&&((0,l.css)(t,{width:"",top:""}),this.j.container.classList.remove("jodit_sticky"),this.__isToolbarStuck=!1)}}afterInit(t){t.e.on(t.ow,"scroll.sticky wheel.sticky mousewheel.sticky resize.sticky",this.__onScroll).on("getStickyState.sticky",(()=>this.__isToolbarStuck))}__onScroll(){const{jodit:t}=this;if(!t.o.toolbarSticky||!t.o.toolbar)return;const e=t.ow.pageYOffset||t.od.documentElement&&t.od.documentElement.scrollTop||0,s=(0,l.offset)(t.container,t,t.od,!0),i=t.getMode()===r.MODE_WYSIWYG&&e+t.o.toolbarStickyOffset>s.top&&s.top+s.height>e+t.o.toolbarStickyOffset&&!(t.o.toolbarDisableStickyForMobile&&this.__isMobile());if(this.__isToolbarStuck===i)return;const o=t.toolbarContainer;o&&(i?this.addSticky(o):this.removeSticky(o)),t.e.fire("toggleSticky",i)}__isMobile(){const{j:t}=this;return t&&t.options&&t.container&&t.options.sizeSM>=t.container.offsetWidth}beforeDestruct(t){n.J.safeRemove(this.__dummyBox),t.e.off(t.ow,"scroll.sticky wheel.sticky mousewheel.sticky resize.sticky",this.__onScroll).off(".sticky")}}(0,i.Cg)([(0,o.throttle)()],d.prototype,"__onScroll",null),a.fg.add("sticky",d)},61964(t,e,s){"use strict";var i=s(931),r=s(81875),o=s.n(r),n=s(36115);n.T.prototype.usePopupForSpecialCharacters=!1,n.T.prototype.specialCharacters=["!",""","#","$","%","&","'","(",")","*","+","-",".","/","0","1","2","3","4","5","6","7","8","9",":",";","<","=",">","?","@","A","B","C","D","E","F","G","H","I","J","K","L","M","N","O","P","Q","R","S","T","U","V","W","X","Y","Z","[","]","^","_","`","a","b","c","d","e","f","g","h","i","j","k","l","m","n","o","p","q","r","s","t","u","v","w","x","y","z","{","|","}","~","€","‘","’","“","”","–","—","¡","¢","£","¤","¥","¦","§","¨","©","ª","«","»","¬","®","¯","°","²","³","´","µ","¶","·","¸","¹","º","¼","½","¾","¿","À","Á","Â","Ã","Ä","Å","Æ","Ç","È","É","Ê","Ë","Ì","Í","Î","Ï","Ð","Ñ","Ò","Ó","Ô","Õ","Ö","×","Ø","Ù","Ú","Û","Ü","Ý","Þ","ß","à","á","â","ã","ä","å","æ","ç","è","é","ê","ë","ì","í","î","ï","ð","ñ","ò","ó","ô","õ","ö","÷","ø","ù","ú","û","ü","ý","þ","ÿ","Œ","œ","Ŵ","Ŷ","ŵ","ŷ","‚","‛","„","…","™","►","•","→","⇒","⇔","♦","≈"],i.I.set("symbols",o()),n.T.prototype.controls.symbols={hotkeys:["ctrl+shift+i","cmd+shift+i"],tooltip:"Insert Special Character",popup(t,e,s){const i=t.e.fire("generateSpecialCharactersTable.symbols");if(i){if(t.o.usePopupForSpecialCharacters){const e=t.c.div();return e.classList.add("jodit-symbols"),e.appendChild(i),t.e.on(i,"close_dialog",s),e}{t.alert(i,"Select Special Character",void 0,"jodit-symbols").bindDestruct(t);const e=i.querySelector("a");e&&e.focus()}}}}},37605(t){"use strict";t.exports={symbols:"رمز"}},4726(t){"use strict";t.exports={symbols:"symbol"}},68349(t){"use strict";t.exports={symbols:"Symbol"}},88146(t){"use strict";t.exports={symbols:"Símbolo"}},11799(t){"use strict";t.exports={symbols:"سمبل"}},1311(t){"use strict";t.exports={symbols:"Symbolit"}},96282(t){"use strict";t.exports={symbols:"caractère"}},87809(t){"use strict";t.exports={symbols:"תו מיוחד"}},60817(t){"use strict";t.exports={symbols:"Szimbólum"}},48207(t){"use strict";t.exports={symbols:"simbol"}},84182(t,e,s){"use strict";s.r(e),s.d(e,{ar(){return i},cs_cz(){return r},de(){return o},es(){return n},fa(){return a},fi(){return l},fr(){return c},he(){return u},hu(){return d},id(){return h},it(){return p},ja(){return m},ko(){return g},mn(){return f},nl(){return v},pl(){return b},pt_br(){return y},ru(){return _},tr(){return w},zh_cn(){return C},zh_tw(){return k}});var i=s(37605),r=s(4726),o=s(68349),n=s(88146),a=s(11799),l=s(1311),c=s(96282),u=s(87809),d=s(60817),h=s(48207),p=s(1663),m=s(37107),g=s(73948),f=s(12333),v=s(82556),b=s(56114),y=s(47321),_=s(9407),w=s(98376),C=s(47238),k=s(72386)},1663(t){"use strict";t.exports={symbols:"Simbolo"}},37107(t){"use strict";t.exports={symbols:"symbol"}},73948(t){"use strict";t.exports={symbols:"기호"}},12333(t){"use strict";t.exports={symbols:"тэмдэгт"}},82556(t){"use strict";t.exports={symbols:"symbool"}},56114(t){"use strict";t.exports={symbols:"symbol"}},47321(t){"use strict";t.exports={symbols:"Símbolo"}},9407(t){"use strict";t.exports={symbols:"символ"}},98376(t){"use strict";t.exports={symbols:"Sembol"}},47238(t){"use strict";t.exports={symbols:"符号"}},72386(t){"use strict";t.exports={symbols:"符號"}},35541(t,e,s){"use strict";var i=s(17352),r=s(55186),o=s(56298),n=s(97369),a=s(29866),l=(s(61964),s(84182));o.fg.add("symbols",class c extends a.k{constructor(t){super(t),this.buttons=[{name:"symbols",group:"insert"}],this.countInRow=17,(0,o.JW)(l)}afterInit(t){t.e.on("generateSpecialCharactersTable.symbols",(()=>{const e=t.c.fromHTML('
\n\t\t\t\t\t\t
\n\t\t\t\t\t\t\t
\n\t\t\t\t\t\t
\n\t\t\t\t\t\t
\n\t\t\t\t\t\t\t
\n\t\t\t\t\t\t
\n\t\t\t\t\t
'),s=e.querySelector(".jodit-symbols__preview"),o=e.querySelector("table").tBodies[0],a=[];for(let e=0;t.o.specialCharacters.length>e;){const s=t.c.element("tr");for(let i=0;this.countInRow>i&&t.o.specialCharacters.length>e;i+=1,e+=1){const r=t.c.element("td"),o=t.c.fromHTML(`${t.o.specialCharacters[e]}`);a.push(o),r.appendChild(o),s.appendChild(r)}o.appendChild(s)}const l=this;return t.e.on(a,"focus",(function(){s.innerHTML=this.innerHTML})).on(a,"mousedown",(function(e){r.J.isTag(this,"a")&&(t.s.focus(),t.s.insertHTML(this.innerHTML),t.e.fire(this,"close_dialog"),e&&e.preventDefault(),e&&e.stopImmediatePropagation())})).on(a,"mouseenter",(function(){r.J.isTag(this,"a")&&this.focus()})).on(a,"keydown",(e=>{const s=e.target;if(r.J.isTag(s,"a")){const r=parseInt((0,n.attr)(s,"-index")||"0",10),o=parseInt((0,n.attr)(s,"data-index-j")||"0",10);let c;switch(e.key){case i.KEY_UP:case i.KEY_DOWN:c=e.key===i.KEY_UP?r-l.countInRow:r+l.countInRow,void 0===a[c]&&(c=e.key===i.KEY_UP?Math.floor(a.length/l.countInRow)*l.countInRow+o:o,c>a.length-1&&(c-=l.countInRow)),a[c]&&a[c].focus();break;case i.KEY_RIGHT:case i.KEY_LEFT:c=e.key===i.KEY_LEFT?r-1:r+1,void 0===a[c]&&(c=e.key===i.KEY_LEFT?a.length-1:0),a[c]&&a[c].focus();break;case i.KEY_ENTER:t.e.fire(s,"mousedown"),e.stopImmediatePropagation(),e.preventDefault()}}})),e}))}beforeDestruct(t){t.e.off("generateSpecialCharactersTable.symbols")}})},48840(t,e,s){"use strict";s.d(e,{O(){return i.O}});var i=s(86572)},86572(t,e,s){"use strict";s.d(e,{O(){return r}});var i=s(55186);function r(t,e=!1){if(!t.o.tab.tabInsideLiInsertNewList)return!1;const[s,r]=(t=>{const e=t.createInside.fake(),s=t.createInside.fake(),i=t.s.range.cloneRange();i.collapse(!0),i.insertNode(e);const r=t.s.range.cloneRange();return r.collapse(!1),r.insertNode(s),[e,s]})(t);try{const r=((t,e,s)=>{const r=i.J.closest(e,"li",t.editor);return!!r&&!(!s&&!i.J.isLeaf(r.previousElementSibling))&&!(s&&!i.J.closest(r,"li",t.editor))&&r})(t,s,e);if(!r)return!1;if(!((t,e,s)=>{const r=i.J.closest(s,"li",e.editor);return!(!r||r!==t&&!t.contains(r))})(r,t,s))return!1;const o=i.J.closest(r,["ol","ul"],t.editor);return!(!o||e&&!i.J.closest(o,"li",t.editor)||(e?((t,e,s)=>{const r=i.J.closest(e,"li",t.editor),o=Array.from(e.children).filter((t=>i.J.isLeaf(t)));i.J.after(r,s);const n=o.indexOf(s);if(0!==n&&1!==o.length||i.J.safeRemove(e),n!==o.length-1){const t=e.cloneNode();i.J.append(s,t);for(let e=n+1;o.length>e;e+=1)i.J.append(t,o[e])}})(t,o,r):((t,e,s)=>{const r=s.previousElementSibling,o=r.lastElementChild,n=i.J.isTag(o,e.tagName)?o:t.createInside.element(e.tagName,Array.from(e.attributes).reduce(((t,e)=>(t[e.name]=e.value,t)),{}));n.appendChild(s),o!==n&&r.appendChild(n)})(t,o,r),0))}finally{const e=t.s.createRange();e.setStartAfter(s),e.setEndBefore(r),t.s.selectRange(e),i.J.safeRemove(s),i.J.safeRemove(r)}return!1}s(28712)},50974(t,e,s){"use strict";s(36115).T.prototype.tab={tabInsideLiInsertNewList:!0}},59965(t,e,s){"use strict";var i=s(31635),r=s(17352),o=s(22664),n=s(56298),a=s(71005),l=(s(50974),s(48840));class c extends a.k{afterInit(t){}__onTab(t){if(t.key===r.KEY_TAB&&this.__onShift(t.shiftKey))return!1}__onCommand(t){if(("indent"===t||"outdent"===t)&&this.__onShift("outdent"===t))return!1}__onShift(t){const e=(0,l.O)(this.j,t);return e&&this.j.e.fire("afterTab",t),e}beforeDestruct(t){}}(0,i.Cg)([(0,o.watch)(":keydown.tab")],c.prototype,"__onTab",null),(0,i.Cg)([(0,o.watch)(":beforeCommand.tab")],c.prototype,"__onCommand",null),n.fg.add("tab",c)},2533(t,e,s){"use strict";var i=s(17352),r=s(55186),o=s(56298),n=s(65147),a=s(11648);const l=new Set([i.KEY_TAB,i.KEY_LEFT,i.KEY_RIGHT,i.KEY_UP,i.KEY_DOWN]);o.fg.add("tableKeyboardNavigation",(t=>{t.e.off(".tableKeyboardNavigation").on("keydown.tableKeyboardNavigation",(e=>{const{key:s}=e;if(!l.has(s))return;const o=t.s.current();if(!o)return;const c=r.J.up(o,r.J.isCell,t.editor);if(!c)return;const{range:u}=t.s;if(s!==i.KEY_TAB&&o!==c){const t=s===i.KEY_RIGHT||s===i.KEY_DOWN,e=(0,n.call)(t?r.J.next:r.J.prev,o,(t=>s===i.KEY_UP||s===i.KEY_DOWN?r.J.isTag(t,"br"):!!t),c);if(!t&&(e||s!==i.KEY_UP&&r.J.isText(o)&&0!==u.startOffset)||t&&(e||s!==i.KEY_DOWN&&r.J.isText(o)&&o.nodeValue&&u.startOffset!==o.nodeValue.length))return}const d=t.getInstance(a.X,t.o),h=r.J.closest(c,"table",t.editor);let p=null;const m=s===i.KEY_LEFT||e.shiftKey,g=()=>(0,n.call)(m?r.J.prev:r.J.next,c,r.J.isCell,h);switch(s){case i.KEY_TAB:case i.KEY_LEFT:p=g(),p||(d.appendRow(h,!!m&&h.querySelector("tr"),!m),p=g());break;case i.KEY_UP:case i.KEY_DOWN:{const t=d.formalMatrix(h),[e,r]=d.formalCoordinate(h,c);s===i.KEY_UP?void 0!==t[e-1]&&(p=t[e-1][r]):void 0!==t[e+1]&&(p=t[e+1][r])}}if(p){if(t.e.fire("hidePopup hideResizer"),p.firstChild)s===i.KEY_TAB?t.s.select(p,!0):t.s.setCursorIn(p,s===i.KEY_RIGHT||s===i.KEY_DOWN);else{const e=t.createInside.element("br");p.appendChild(e),t.s.setCursorBefore(e)}return t.synchronizeValues(),!1}}))}))},94291(t,e,s){"use strict";var i=s(71842),r=s(65147),o=s(97369),n=s(931),a=s(67447),l=s.n(a),c=s(36115);c.T.prototype.table={selectionCellStyle:"border: 1px double #1e88e5 !important;",useExtraClassesOptions:!1},n.I.set("table",l()),c.T.prototype.controls.table={data:{cols:10,rows:10,classList:{"table table-bordered":"Bootstrap Bordered","table table-striped":"Bootstrap Striped","table table-dark":"Bootstrap Dark"}},popup(t,e,s,n){const a=n.control,l=a.data&&a.data.rows?a.data.rows:10,c=a.data&&a.data.cols?a.data.cols:10,u=t.c.fromHTML('
'+(()=>{if(!t.o.table.useExtraClassesOptions)return"";const e=[];if(a.data){const t=a.data.classList;Object.keys(t).forEach((s=>{e.push(``)}))}return e.join("")})()+'
'),d=u.querySelectorAll("span")[0],h=u.querySelectorAll("span")[1],p=u.querySelector(".jodit-form__container"),m=u.querySelector(".jodit-form__options"),g=[],f=l*c;for(let e=0;f>e;e+=1)g[e]||g.push(t.c.element("span",{dataIndex:e}));if(t.e.on(p,"mousemove",((t,e)=>{const s=t.target;if(!i.J.isTag(s,"span"))return;const r=void 0===e||isNaN(e)?parseInt((0,o.attr)(s,"-index")||"0",10):e||0,n=Math.ceil((r+1)/c),a=r%c+1;for(let t=0;g.length>t;t+=1)g[t].className=t%c+1>a||Math.ceil((t+1)/c)>n?"":"jodit_hovered";h.textContent=""+a,d.textContent=""+n})).on(p,"touchstart mousedown",(e=>{const n=e.target;if(e.preventDefault(),e.stopImmediatePropagation(),!i.J.isTag(n,"span"))return;const a=parseInt((0,o.attr)(n,"-index")||"0",10),l=Math.ceil((a+1)/c),u=a%c+1,d=t.createInside,h=d.element("tbody"),p=d.element("table");p.appendChild(h);let g,f,v=null;for(let t=1;l>=t;t+=1){g=d.element("tr");for(let t=1;u>=t;t+=1)f=d.element("td"),v||(v=f),(0,r.css)(f,"width",(100/u).toFixed(4)+"%"),f.appendChild(d.element("br")),g.appendChild(d.text("\n")),g.appendChild(d.text("\t")),g.appendChild(f);h.appendChild(d.text("\n")),h.appendChild(g)}(0,r.$$)("input[type=checkbox]:checked",m).forEach((t=>{t.value.split(/[\s]+/).forEach((t=>{p.classList.add(t)}))})),t.editor.firstChild&&t.s.insertNode(d.text("\n"),!1,!1),t.s.insertNode(p,!1),v&&(t.s.setCursorIn(v),(0,r.scrollIntoViewIfNeeded)(v,t.editor,t.ed)),s()})),n&&n.parentElement){for(let e=0;l>e;e+=1){const s=t.c.div();for(let t=0;c>t;t+=1)s.appendChild(g[e*c+t]);p.appendChild(s)}g[0]&&(g[0].className="hovered")}return u},tooltip:"Insert table"}},76385(t,e,s){"use strict";var i=s(56298);s(94291),i.fg.add("table",(t=>{t.registerButton({name:"table",group:"insert"})}))},31686(t,e,s){"use strict";var i=s(65147),r=s(35265),o=s(20703),n=s(931),a=s(16116),l=s(36339),c=s.n(l),u=s(36115);n.I.set("video",c()),u.T.prototype.controls.video={popup(t,e,s){const n=new o.XV(t,[new o.Yh(t,[new o.tS(t,{name:"url",required:!0,label:"URL",placeholder:"https://",validators:["url"]})]),new o.Yh(t,[(0,r.$n)(t,"","Insert","primary").onAction((()=>n.submit()))])]),l=new o.XV(t,[new o.Yh(t,[new o.F0(t,{name:"code",required:!0,label:"Embed code"})]),new o.Yh(t,[(0,r.$n)(t,"","Insert","primary").onAction((()=>l.submit()))])]),c=[],u=e=>{t.s.restore(),t.s.insertHTML(e),s()};return t.s.save(),c.push({icon:"link",name:"Link",content:n.container},{icon:"source",name:"Code",content:l.container}),n.onSubmit((t=>{u((0,i.convertMediaUrlToVideoEmbed)(t.url))})),l.onSubmit((t=>{u(t.code)})),(0,a.Zg)(t,c)},tags:["iframe"],tooltip:"Insert youtube/vimeo video"}},38309(t,e,s){"use strict";var i=s(56298);s(31686),i.fg.add("video",(t=>{t.registerButton({name:"video",group:"media"})}))},2805(t,e,s){"use strict";s(36115).T.prototype.wrapNodes={exclude:new Set(["hr","style","br"]),emptyBlockAfterInit:!0}},14367(t,e,s){"use strict";var i=s(31635),r=s(22664),o=s(71842),n=s(56298),a=s(98253),l=s(71005);s(2805);class c extends l.k{constructor(){super(...arguments),this.isSuitableStart=t=>o.J.isText(t)&&(0,a.K)(t.nodeValue)&&(/[^\s]/.test(t.nodeValue)||t.parentNode?.firstChild===t&&this.isSuitable(t.nextSibling))||this.isNotWrapped(t)&&!o.J.isTemporary(t),this.isSuitable=t=>o.J.isText(t)||this.isNotWrapped(t),this.isNotWrapped=t=>o.J.isElement(t)&&!(o.J.isBlock(t)||o.J.isTag(t,this.j.o.wrapNodes.exclude))}afterInit(t){"br"!==t.o.enter.toLowerCase()&&t.e.on("drop.wtn focus.wtn keydown.wtn mousedown.wtn afterInit.wtn backSpaceAfterDelete.wtn",this.preprocessInput,{top:!0}).on("afterInit.wtn postProcessSetEditorValue.wtn afterCommitStyle.wtn backSpaceAfterDelete.wtn",this.postProcessSetEditorValue)}beforeDestruct(t){t.e.off(".wtn")}postProcessSetEditorValue(){const{jodit:t}=this;if(!t.isEditorMode())return;let e=t.editor.firstChild,s=!1;for(;e;){if(e=u(e,t),this.isSuitableStart(e)){s||t.s.save(),s=!0;const i=t.createInside.element(t.o.enter);for(o.J.before(e,i);e&&this.isSuitable(e);){const t=e.nextSibling;i.appendChild(e),e=t}i.normalize(),e=i}e=e&&e.nextSibling}s&&(t.s.restore(),"afterInit"===t.e.current&&t.e.fire("internalChange"))}preprocessInput(){const{jodit:t}=this,e="afterInit"===t.e.current;if(!t.isEditorMode()||t.editor.firstChild||!t.o.wrapNodes.emptyBlockAfterInit&&e)return;const s=t.createInside.element(t.o.enter),i=t.createInside.element("br");o.J.append(s,i),o.J.append(t.editor,s),t.s.isFocused()&&t.s.setCursorBefore(i),t.e.fire("internalChange")}}function u(t,e){let s=t,i=t;do{if(!o.J.isElement(i)||!o.J.isLeaf(i)||o.J.isList(i.parentElement))break;{const t=o.J.findNotEmptySibling(i,!1);o.J.isTag(s,"ul")?s.appendChild(i):s=o.J.wrap(i,"ul",e.createInside),i=t}}while(i);return s}(0,i.Cg)([r.autobind],c.prototype,"postProcessSetEditorValue",null),(0,i.Cg)([r.autobind],c.prototype,"preprocessInput",null),n.fg.add("wrapNodes",c)},88850(t,e,s){"use strict";s(36115).T.prototype.showXPathInStatusbar=!0},36133(t,e,s){"use strict";var i=s(17352),r=s(71842),o=s(56298),n=s(65147),a=s(71005),l=s(34248),c=s(8809);s(88850),o.fg.add("xpath",class u extends a.k{constructor(){super(...arguments),this.onContext=(t,e)=>(this.menu||(this.menu=new l.t(this.j)),this.menu.show(e.clientX,e.clientY,[{icon:"bin",title:t===this.j.editor?"Clear":"Remove",exec:()=>{t!==this.j.editor?r.J.safeRemove(t):this.j.value="",this.j.synchronizeValues()}},{icon:"select-all",title:"Select",exec:()=>{this.j.s.select(t)}}]),!1),this.onSelectPath=(t,e)=>{this.j.s.focus();const s=(0,n.attr)(e.target,"-path")||"/";if("/"===s)return this.j.execCommand("selectall"),!1;try{const t=this.j.ed.evaluate(s,this.j.editor,null,XPathResult.ANY_TYPE,null).iterateNext();if(t)return this.j.s.select(t),!1}catch{}return this.j.s.select(t),!1},this.tpl=(t,e,s,i)=>{const r=this.j.c.fromHTML(`${(0,n.trim)(s)}`),o=r.firstChild;return this.j.e.on(o,"click",this.onSelectPath.bind(this,t)).on(o,"contextmenu",this.onContext.bind(this,t)),r},this.removeSelectAll=()=>{this.selectAllButton&&(this.selectAllButton.destruct(),delete this.selectAllButton)},this.appendSelectAll=()=>{this.removeSelectAll(),this.selectAllButton=(0,c.BJ)(this.j,{name:"selectall",...this.j.o.controls.selectall}),this.selectAllButton.state.size="tiny",this.container&&this.container.insertBefore(this.selectAllButton.container,this.container.firstChild)},this.calcPathImd=()=>{if(this.isDestructed)return;const t=this.j.s.current();if(this.container&&(this.container.innerHTML=i.INVISIBLE_SPACE),t){let e,s,i;r.J.up(t,(t=>{!t||this.j.editor===t||r.J.isText(t)||r.J.isComment(t)||(e=t.nodeName.toLowerCase(),s=(0,n.getXPathByElement)(t,this.j.editor).replace(/^\//,""),i=this.tpl(t,s,e,this.j.i18n("Select %s",e)),this.container&&this.container.insertBefore(i,this.container.firstChild))}),this.j.editor)}this.appendSelectAll()},this.calcPath=this.j.async.debounce(this.calcPathImd,2*this.j.defaultTimeout)}afterInit(){this.j.o.showXPathInStatusbar&&(this.container=this.j.c.div("jodit-xpath"),this.j.e.off(".xpath").on("mouseup.xpath change.xpath keydown.xpath changeSelection.xpath",this.calcPath).on("afterSetMode.xpath afterInit.xpath changePlace.xpath",(()=>{this.j.o.showXPathInStatusbar&&this.container&&(this.j.statusbar.append(this.container),this.j.getRealMode()===i.MODE_WYSIWYG?this.calcPath():(this.container&&(this.container.innerHTML=i.INVISIBLE_SPACE),this.appendSelectAll()))})),this.calcPath())}beforeDestruct(){this.j&&this.j.events&&this.j.e.off(".xpath"),this.removeSelectAll(),this.menu&&this.menu.destruct(),r.J.safeRemove(this.container),delete this.menu,delete this.container}})},79721(t,e,s){"use strict";s.r(e),s.d(e,{angle_down(){return r.a},angle_left(){return n.a},angle_right(){return l.a},angle_up(){return u.a},bin(){return h.a},cancel(){return m.a},center(){return f.a},check(){return b.a},chevron(){return _.a},dots(){return C.a},eye(){return S.a},file(){return E.a},folder(){return I.a},info_circle(){return z.a},left(){return A.a},lock(){return P.a},ok(){return N.a},pencil(){return D.a},plus(){return O.a},resize_handler(){return H.a},right(){return V.a},save(){return $.a},settings(){return K.a},unlock(){return G.a},update(){return Z.a},upload(){return tt.a},valign(){return st.a}});var i=s(88497),r=s.n(i),o=s(91882),n=s.n(o),a=s(14305),l=s.n(a),c=s(58446),u=s.n(c),d=s(39858),h=s.n(d),p=s(70881),m=s.n(p),g=s(60636),f=s.n(g),v=s(32013),b=s.n(v),y=s(45512),_=s.n(y),w=s(80347),C=s.n(w),k=s(95134),S=s.n(k),T=s(70697),E=s.n(T),x=s(49983),I=s.n(x),j=s(98964),z=s.n(j),L=s(8136),A=s.n(L),M=s(94806),P=s.n(M),R=s(31365),N=s.n(R),B=s(44636),D=s.n(B),q=s(36327),O=s.n(q),J=s(53328),H=s.n(J),F=s(98711),V=s.n(F),W=s(53808),$=s.n(W),U=s(20784),K=s.n(U),Y=s(70999),G=s.n(Y),X=s(45244),Z=s.n(X),Q=s(99876),tt=s.n(Q),et=s(14006),st=s.n(et)},57741(t){t.exports.default=["إبدأ في الكتابة...","حول جوديت","محرر جوديت","دليل مستخدم جوديت","يحتوي على مساعدة مفصلة للاستخدام","للحصول على معلومات حول الترخيص، يرجى الذهاب لموقعنا:","شراء النسخة الكاملة","حقوق الطبع والنشر © XDSoft.net - Chupurnov Valeriy. كل الحقوق محفوظة.","مِرْساة","فتح في نافذة جديدة","فتح المحرر في الحجم الكامل","مسح التنسيق","ملء اللون أو تعيين لون النص","إعادة","تراجع","عريض","مائل","إدراج قائمة غير مرتبة","إدراج قائمة مرتبة","محاذاة للوسط","محاذاة مثبتة","محاذاة لليسار","محاذاة لليمين","إدراج خط أفقي","إدراج صورة","ادخال الملف","إدراج فيديو يوتيوب/فيميو ","إدراج رابط","حجم الخط","نوع الخط","إدراج كتلة تنسيق","عادي","عنوان 1","عنوان 2","عنوان 3","عنوان 4","إقتباس","كود","إدراج","إدراج جدول","تقليل المسافة البادئة","زيادة المسافة البادئة","تحديد أحرف خاصة","إدراج حرف خاص","تنسيق الرسم","تغيير الوضع","هوامش","أعلى","يمين","أسفل","يسار","الأنماط","الطبقات","محاذاة","اليمين","الوسط","اليسار","--غير مضبوط--","Src","العنوان","العنوان البديل","الرابط","افتح الرابط في نافذة جديدة","الصورة","ملف","متقدم","خصائص الصورة","إلغاء","حسنا","متصفح الملفات","حدث خطأ في تحميل القائمة ","حدث خطأ في تحميل المجلدات","هل أنت واثق؟","أدخل اسم المجلد","إنشاء مجلد","أكتب إسم","إسقاط صورة","إسقاط الملف","أو أنقر","النص البديل","رفع","تصفح","الخلفية","نص","أعلى","الوسط","الأسفل","إدراج عمود قبل","إدراج عمود بعد","إدراج صف أعلى","إدراج صف أسفل","حذف الجدول","حذف الصف","حذف العمود","خلية فارغة","%d حرف","%d كلام","اضرب من خلال","أكد","حرف فوقي","مخطوطة","قطع الاختيار","اختر الكل","استراحة","البحث عن","استبدل ب","محل","معجون","اختر محتوى للصق","مصدر","بالخط العريض","مائل","شغل","صلة","إلغاء","كرر","طاولة","صورة","نظيف","فقرة","حجم الخط","فيديو","الخط","حول المحرر","طباعة","أكد","شطب","المسافة البادئة","نتوء","ملء الشاشة","الحجم التقليدي","الخط","قائمة","قائمة مرقمة","قطع","اختر الكل","قانون","فتح الرابط","تعديل الرابط","سمة Nofollow","إزالة الرابط","تحديث","لتحرير","مراجعة","URL","تحرير","محاذاة أفقية","فلتر","عن طريق التغيير","بالاسم","حسب الحجم","إضافة مجلد","إعادة","احتفظ","حفظ باسم","تغيير الحجم","حجم القطع","عرض","ارتفاع","حافظ على النسب","أن","لا","حذف","تميز","تميز %s","محاذاة عمودية","انشق، مزق","اذهب","أضف العمود","اضف سطر","رخصة %s","حذف","انقسام عمودي","تقسيم أفقي","الحدود","يشبه الكود الخاص بك HTML. تبقي كما HTML؟","الصق ك HTML","احتفظ","إدراج كنص","إدراج النص فقط","يمكنك فقط تحرير صورك الخاصة. تحميل هذه الصورة على المضيف؟","تم تحميل الصورة بنجاح على الخادم!","لوحة","لا توجد ملفات في هذا الدليل.","إعادة تسمية","أدخل اسم جديد","معاينة","تحميل","لصق من الحافظة","متصفحك لا يدعم إمكانية الوصول المباشر إلى الحافظة.","نسخ التحديد","نسخ","دائرة نصف قطرها الحدود","عرض كل","تطبيق","يرجى ملء هذا المجال","يرجى إدخال عنوان ويب","الافتراضي","دائرة","نقطة","المربعة","البحث","تجد السابقة","تجد التالي","للصق المحتوى قادم من Microsoft Word/Excel الوثيقة. هل تريد أن تبقي شكل أو تنظيفه ؟ ","كلمة لصق الكشف عن","نظيفة","أدخل اسم الفصل","اضغط البديل لتغيير حجم مخصص"]},56014(t){t.exports.default=["Napiš něco","O Jodit","Editor Jodit","Jodit Uživatelská příručka","obsahuje detailní nápovědu","Pro informace o licenci, prosím, přejděte na naši stránku:","Koupit plnou verzi","Copyright © XDSoft.net - Chupurnov Valeriy. Všechna práva vyhrazena.","Anchor","Otevřít v nové záložce","Otevřít v celoobrazovkovém režimu","Vyčistit formátování","Barva výplně a písma","Vpřed","Zpět","Tučné","Kurzíva","Odrážky","Číslovaný seznam","Zarovnat na střed","Zarovnat do bloku","Zarovnat vlevo","Zarovnat vpravo","Vložit horizontální linku","Vložit obrázek","Vložit soubor","Vložit video (YT/Vimeo)","Vložit odkaz","Velikost písma","Typ písma","Formátovat blok","Normální text","Nadpis 1","Nadpis 2","Nadpis 3","Nadpis 4","Citát","Kód","Vložit","Vložit tabulku","Zmenšit odsazení","Zvětšit odsazení","Vybrat speciální symbol","Vložit speciální symbol","Použít formát","Změnit mód","Okraje","horní","pravý","spodní","levý","Styly","Třídy","Zarovnání","Vpravo","Na střed","Vlevo","--nenastaveno--","src","Titulek","Alternativní text (alt)","Link","Otevřít link v nové záložce","Obrázek","soubor","Rozšířené","Vlastnosti obrázku","Zpět","Ok","Prohlížeč souborů","Chyba při načítání seznamu souborů","Chyba při načítání složek","Jste si jistý(á)?","Název složky","Vytvořit složku","název","Přetáhněte sem obrázek","Přetáhněte sem soubor","nebo klikněte","Alternativní text","Nahrát","Server","Pozadí","Text","Nahoru","Na střed","Dolu","Vložit sloupec před","Vložit sloupec za","Vložit řádek nad","Vložit řádek pod","Vymazat tabulku","Vymazat řádku","Vymazat sloupec","Vyčistit buňku","Znaky: %d","Slova: %d","Přeškrtnuto","Podtrženo","Horní index","Dolní index","Vyjmout označené","Označit vše","Zalomení","Najdi","Nahradit za","Vyměňte","Vložit","Vyber obsah pro vložení","HTML","tučně","kurzíva","štětec","odkaz","zpět","vpřed","tabulka","obrázek","guma","odstavec","velikost písma","video","písmo","о editoru","tisk","podtrženo","přeškrtnuto","zvětšit odsazení","zmenšit odsazení","celoobrazovkový režim","smrsknout","Linka","Odrážka","Číslovaný seznam","Vyjmout","Označit vše","Kód","Otevřít odkaz","Upravit odkaz","Atribut no-follow","Odstranit odkaz","Aktualizovat","Chcete-li upravit","Zobrazit","URL","Editovat","Horizontální zarovnání","Filtr","Dle poslední změny","Dle názvu","Dle velikosti","Přidat složku","Reset","Uložit","Uložit jako...","Změnit rozměr","Ořezat","Šířka","Výška","Ponechat poměr","Ano","Ne","Vyjmout","Označit","Označit %s","Vertikální zarovnání","Rozdělit","Spojit","Přidat sloupec","Přidat řádek","Licence: %s","Vymazat","Rozdělit vertikálně","Rozdělit horizontálně","Okraj","Váš text se podobá HTML. Vložit ho jako HTML?","Vložit jako HTML","Ponechat originál","Vložit jako TEXT","Vložit pouze TEXT","Můžete upravovat pouze své obrázky. Načíst obrázek?","Obrázek byl úspěšně nahrán!","paleta","V tomto adresáři nejsou žádné soubory.","přejmenovat","Zadejte nový název","náhled","Stažení","Vložit ze schránky","Váš prohlížeč nepodporuje přímý přístup do schránky.","Kopírovat výběr","kopírování","Border radius","Zobrazit všechny","Platí","Prosím, vyplňte toto pole","Prosím, zadejte webovou adresu","Výchozí","Kruh","Dot","Quadrate","Najít","Najít Předchozí","Najít Další","Obsah, který vkládáte, je pravděpodobně z Microsoft Word / Excel. Chcete ponechat formát nebo vložit pouze text?","Detekován fragment z Wordu nebo Excelu","Vyčistit","Vložte název třídy","Stiskněte Alt pro vlastní změnu velikosti"]},95461(t){t.exports.default=["Bitte geben Sie einen Text ein","Über Jodit","Jodit Editor","Das Jodit Benutzerhandbuch","beinhaltet ausführliche Informationen wie Sie den Editor verwenden können.","Für Informationen zur Lizenz, besuchen Sie bitte unsere Web-Präsenz:","Vollversion kaufen","Copyright © XDSoft.net - Chupurnov Valeriy. Alle Rechte vorbehalten.","Anker","In neuer Registerkarte öffnen","Editor in voller Größe öffnen","Formatierung löschen","Füllfarbe oder Textfarbe ändern","Wiederholen","Rückgängig machen","Fett","Kursiv","Unsortierte Liste einfügen","Nummerierte Liste einfügen","Mittig ausrichten","Blocksatz","Links ausrichten","Rechts ausrichten","Horizontale Linie einfügen","Bild einfügen","Datei einfügen","Youtube/vimeo Video einfügen","Link einfügen","Schriftgröße","Schriftfamilie","Formatblock einfügen","Normal","Überschrift 1","Überschrift 2","Überschrift 3","Überschrift 4","Zitat","Code","Einfügen","Tabelle einfügen","Einzug verkleinern","Einzug vergrößern","Sonderzeichen auswählen","Sonderzeichen einfügen","Format kopieren","Änderungsmodus","Ränder","Oben","Rechts","Unten","Links","CSS Stil","CSS Klassen","Ausrichtung","Rechts","Zentriert","Links","Keine","Pfad","Titel","Alternativer Text","Link","Link in neuem Tab öffnen","Bild","Datei","Fortgeschritten","Bildeigenschaften","Abbrechen","OK","Dateibrowser","Fehler beim Laden der Liste","Fehler beim Laden der Ordner","Sind Sie sicher?","Geben Sie den Verzeichnisnamen ein","Verzeichnis erstellen","Typname","Bild hier hinziehen","Datei löschen","oder hier klicken","Alternativtext","Hochladen","Auswählen","Hintergrund","Text","Oben","Mittig","Unten","Spalte davor einfügen","Spalte danach einfügen","Zeile oberhalb einfügen","Zeile unterhalb einfügen","Tabelle löschen","Zeile löschen","Spalte löschen","Zelle leeren","Zeichen: %d","Wörter: %d","Durchstreichen","Unterstreichen","Hochstellen","Tiefstellen","Auswahl ausschneiden","Alles markieren","Pause","Suche nach","Ersetzen durch","Ersetzen","Einfügen","Wählen Sie den Inhalt zum Einfügen aus","HTML","Fett gedruckt","Kursiv","Bürste","Verknüpfung","Rückgängig machen","Wiederholen","Tabelle","Bild","Radiergummi","Absatz","Schriftgröße","Video","Schriftart","Über","Drucken","Unterstreichen","Durchstreichen","Einzug","Herausstellen","Vollgröße","Schrumpfen","die Linie","Liste von","Nummerierte Liste","Schneiden","Wählen Sie Alle aus","Code einbetten","Link öffnen","Link bearbeiten","Nofollow-Attribut","Link entfernen","Aktualisieren","Bearbeiten","Ansehen","URL","Bearbeiten","Horizontale Ausrichtung","Filter","Sortieren nach geändert","Nach Name sortieren","Nach Größe sortiert","Ordner hinzufügen","Wiederherstellen","Speichern","Speichern als","Größe ändern","Größe anpassen","Breite","Höhe","Seitenverhältnis beibehalten","Ja","Nein","Entfernen","Markieren","Markieren: %s","Vertikale Ausrichtung","Unterteilen","Vereinen","Spalte hinzufügen","Zeile hinzufügen",null,"Löschen","Vertikal unterteilen","Horizontal unterteilen","Rand","Ihr Text ähnelt HTML-Code. Als HTML beibehalten?","Als HTML einfügen?","Original speichern","Als Text einfügen","Nur Text einfügen","Sie können nur Ihre eigenen Bilder bearbeiten. Dieses Bild auf den Host herunterladen?","Das Bild wurde erfolgreich auf den Server hochgeladen!","Palette","In diesem Verzeichnis befinden sich keine Dateien.","Umbenennen","Geben Sie einen neuen Namen ein","Vorschau","Herunterladen","Aus Zwischenablage einfügen","Ihr Browser unterstützt keinen direkten Zugriff auf die Zwischenablage.","Auswahl kopieren","Kopieren","Radius für abgerundete Ecken","Alle anzeigen","Anwenden","Bitte füllen Sie dieses Feld aus","Bitte geben Sie eine Web-Adresse ein","Standard","Kreis","Punkte","Quadrate","Suchen","Suche vorherige","Weitersuchen","Der Inhalt, den Sie einfügen, stammt aus einem Microsoft Word / Excel-Dokument. Möchten Sie das Format erhalten oder bereinigen?","In Word formatierter Text erkannt","Säubern","className (CSS) einfügen","Drücken Sie Alt für benutzerdefinierte Größenanpassung"]},63837(t){t.exports.default={"Type something":"Start writing...",pencil:"Edit",Quadrate:"Square"}},39386(t){t.exports.default=["Escriba algo...","Acerca de Jodit","Jodit Editor","Guía de usuario Jodit","contiene ayuda detallada para el uso.","Para información sobre la licencia, por favor visite nuestro sitio:","Compre la versión completa","Copyright © XDSoft.net - Chupurnov Valeriy. Todos los derechos reservados.","Anclar","Abrir en nueva pestaña","Abrir editor en pantalla completa","Limpiar formato","Color de relleno o de letra","Rehacer","Deshacer","Negrita","Cursiva","Insertar lista no ordenada","Insertar lista ordenada","Alinear Centrado","Alinear Justificado","Alinear Izquierda","Alinear Derecha","Insertar línea horizontal","Insertar imagen","Insertar archivo","Insertar video de Youtube/vimeo","Insertar vínculo","Tamaño de letra","Familia de letra","Insertar bloque","Normal","Encabezado 1","Encabezado 2","Encabezado 3","Encabezado 4","Cita","Código","Insertar","Insertar tabla","Disminuir sangría","Aumentar sangría","Seleccionar caracter especial","Insertar caracter especial","Copiar formato","Cambiar modo","Márgenes","arriba","derecha","abajo","izquierda","Estilos CSS","Clases CSS","Alinear","Derecha","Centrado","Izquierda","--No Establecido--","Fuente","Título","Texto Alternativo","Vínculo","Abrir vínculo en nueva pestaña","Imagen","Archivo","Avanzado","Propiedades de imagen","Cancelar","Aceptar","Buscar archivo","Error al cargar la lista","Error al cargar las carpetas","¿Está seguro?","Entre nombre de carpeta","Crear carpeta","Entre el nombre","Soltar imagen","Soltar archivo","o click","Texto alternativo","Subir","Buscar","Fondo","Texto","Arriba","Centro","Abajo","Insertar columna antes","Interar columna después","Insertar fila arriba","Insertar fila debajo","Borrar tabla","Borrar fila","Borrar columna","Vaciar celda","Caracteres: %d","Palabras: %d","Tachado","Subrayado","superíndice","subíndice","Cortar selección","Seleccionar todo","Pausa","Buscar","Reemplazar con","Reemplazar","Pegar","Seleccionar contenido para pegar","HTML","negrita","cursiva","Brocha","Vínculo","deshacer","rehacer","Tabla","Imagen","Borrar","Párrafo","Tamaño de letra","Video","Letra","Acerca de","Imprimir","subrayar","tachar","sangría","quitar sangría","Tamaño completo","encoger","línea horizontal","lista sin ordenar","lista ordenada","Cortar","Seleccionar todo","Incluir código","Abrir vínculo","Editar vínculo","No seguir","Desvincular","Actualizar","Para editar","Ver","URL","Editar","Alineación horizontal","Filtrar","Ordenar por fecha modificación","Ordenar por nombre","Ordenar por tamaño","Agregar carpeta","Resetear","Guardar","Guardar como...","Redimensionar","Recortar","Ancho","Alto","Mantener relación de aspecto","Si","No","Quitar","Seleccionar","Seleccionar: %s","Alineación vertical","Dividir","Mezclar","Agregar columna","Agregar fila",null,"Borrar","Dividir vertical","Dividir horizontal","Borde","El código es similar a HTML. ¿Mantener como HTML?","Pegar como HTML?","Mantener","Insertar como texto","Insertar solo texto","Solo puedes editar tus propias imágenes. ¿Descargar esta imagen en el servidor?","¡La imagen se ha subido correctamente al servidor!","paleta","No hay archivos en este directorio.","renombrar","Ingresa un nuevo nombre","avance","Descargar","Pegar desde el portapapeles","Su navegador no soporta el acceso directo en el portapapeles.","Selección de copia","copia","Radio frontera","Mostrar todos los","Aplicar","Por favor, rellene este campo","Por favor, introduzca una dirección web","Predeterminado","Círculo","Punto","Cuadro","Encontrar","Buscar Anterior","Buscar Siguiente","El contenido pegado proviene de un documento de Microsoft Word/Excel. ¿Desea mantener el formato o limpiarlo?","Pegado desde Word detectado","Limpiar","Insertar nombre de clase","Presione Alt para cambiar el tamaño personalizado"]},62327(t){t.exports.default=["Kirjoita jotain...","Tietoja Jodit:ista","Jodit Editor","Jodit käyttäjän ohje","sisältää tarkempaa tietoa käyttämiseen","Tietoa lisensoinnista, vieraile verkkosivuillamme:","Osta täysi versio","Copyright © XDSoft.net - Chupurnov Valeriy. Kaikki oikeudet pidätetään.","Ankkuri","Avaa uudessa välilehdessä","Avaa täysikokoisena","Poista muotoilu","Täytä värillä tai aseta tekstin väri","Tee uudelleen","Peruuta","Lihavoitu","Kursiivi","Lisää järjestämätön lista","Lisää järjestetty lista","Asemoi keskelle","Asemoi tasavälein","Asemoi vasemmalle","Asemoi oikealle","Lisää vaakasuuntainen viiva","Lisää kuva","Lisää tiedosto","Lisää Youtube-/vimeo- video","Lisää linkki","Kirjasimen koko","Kirjasimen nimi","Lisää muotoilualue","Normaali","Otsikko 1","Otsikko 2","Otsikko 3","Otsikko 4","Lainaus","Koodi","Lisää","Lisää taulukko","Pienennä sisennystä","Lisää sisennystä","Valitse erikoismerkki","Lisää erikoismerkki","Maalaa muotoilu","Vaihda tilaa","Marginaalit","ylös","oikealle","alas","vasemmalle","CSS-tyylit","CSS-luokat","Asemointi","Oikea","Keskellä","Vasen","--Ei asetettu--","Fuente","Otsikko","Vaihtoehtoinen teksti","Linkki","Avaa uudessa välilehdessä","Kuva","Tiedosto","Avanzado","Kuvan ominaisuudet","Peruuta","Ok","Tiedostoselain","Virhe listan latauksessa","Virhe kansioiden latauksessa","Oletko varma?","Syötä hakemiston nimi","Luo hakemisto","Syötä nimi","Pudota kuva","Pudota tiedosto","tai klikkaa","Vaihtoehtoinen teksti","Lataa","Selaa","Tausta","Teksti","Ylös","Keskelle","Alas","Lisää sarake ennen","Lisää sarake jälkeen","Lisää rivi ylös","Lisää rivi alle","Poista taulukko","Poista rivi","Poista sarake","Tyhjennä solu","Merkit: %d","Sanat: %d","Yliviivaus","Alleviivaus","yläviite","alaviite","Leikkaa valinta","Valitse kaikki","Vaihto","Etsi arvoa","Korvaa arvolla","Korvaa","Liitä","Valitse liitettävä sisältö","HTML","lihavoitu","kursiivi","sivellin","linkki","peruuta","tee uudelleen","taulukko","kuva","pyyhekumi","kappale","tekstin koko","video","kirjasin","tietoja","tulosta","alleviivaa","yliviivaa","sisennä","pienennä sisennystä","täysikokoinen","pienennä","vaakaviiva","järjestetty lista","järjestämätön lista","leikkaa","valitse kaikki","Sisällytä koodi","Avaa linkki","Muokkaa linkkiä","Älä seuraa","Pura linkki","Päivitä","Muokkaa","Ver","URL","Muokkaa","Vaaka-asemointi","Suodatin","Järjestä muuttuneilla","Järjestä nimellä","Järjestä koolla","Lisää kansio","Nollaa","Tallenna","Tallenna nimellä ...","Muuta kokoa","Rajaa","Leveys","Korkeus","Säilytä kuvasuhde","Kyllä","Ei","Poista","Valitse","Valitse: %s","Pystyasemointi","Jaa","Yhdistä","Lisää sarake","Lisää rivi",null,"Poista","Jaa pystysuuntaisesti","Jaa vaakasuuntaisesti","Reuna","Koodi on HTML:n tapaista. Säilytetäänkö HTML?","Liitä HTML:nä?","Säilytä","Lisää tekstinä","Lisää vain teksti","Voit muokata vain omia kuvia. Lataa tämä kuva palvelimelle?","Kuva on onnistuneesti ladattu palvelimelle!","paletti","Tiedostoja ei ole","Nimeä uudelleen","Syötä uusi nimi","esikatselu","Lataa","Liitä leikepöydältä","Selaimesi ei tue suoraa pääsyä leikepöydälle.","Kopioi valinta","kopioi","Reunan pyöristys","Näytä kaikki","Käytä","Täytä tämä kenttä","Annan web-osoite","Oletus","Ympyrä","Piste","Neliö","Hae","Hae edellinen","Hae seuraava","Liitetty sisältö tulee Microsoft Word-/Excel- tiedostosta. Haluatko säilyttää muotoilun vai poistaa sen?","Word liittäminen havaittu","Tyhjennä","Lisää luokkanimi","Paina Alt muokattuun koon muuttamiseen"]},25090(t){t.exports.default=["Ecrivez ici","A propos de Jodit","Editeur Jodit","Guide de l'utilisateur","Aide détaillée à l'utilisation","Consulter la licence sur notre site web:","Acheter la version complète","Copyright © XDSoft.net - Chupurnov Valeriy. Tous droits réservés.","Ancre","Ouvrir dans un nouvel onglet","Ouvrir l'éditeur en pleine page","Supprimer le formattage","Modifier la couleur du fond ou du texte","Refaire","Défaire","Gras","Italique","Liste non ordonnée","Liste ordonnée","Centrer","Justifier","Aligner à gauche ","Aligner à droite","Insérer une ligne horizontale","Insérer une image","Insérer un fichier","Insérer une vidéo","Insérer un lien","Taille des caractères","Famille des caractères","Bloc formatté","Normal","Titre 1","Titre 2","Titre 3","Titre 4","Citation","Code","Insérer","Insérer un tableau","Diminuer le retrait","Retrait plus","Sélectionnez un caractère spécial","Insérer un caractère spécial","Cloner le format","Mode wysiwyg <-> code html","Marges","haut","droite","Bas","gauche","Styles","Classes","Alignement","Droite","Centre","Gauche","--Non disponible--","Source","Titre","Alternative","Lien","Ouvrir le lien dans un nouvel onglet","Image","fichier","Avancé","Propriétés de l'image","Annuler","OK","Explorateur de fichiers","Erreur de liste de chargement","Erreur de dossier de chargement","Etes-vous sûrs ?","Entrer le nom de dossier","Créer un dossier","type de fichier","Coller une image","Déposer un fichier","ou cliquer","Texte de remplacemement","Charger","Chercher","Arrière-plan","Texte","Haut","Milieu","Bas","Insérer une colonne avant","Insérer une colonne après","Insérer une ligne au dessus","Insérer une ligne en dessous","Supprimer le tableau","Supprimer la ligne","Supprimer la colonne","Vider la cellule","Symboles: %d","Mots: %d","Barrer","Souligner","exposant","indice","Couper la sélection","Tout sélectionner","Pause","Rechercher","Remplacer par","Remplacer","Coller","Choisissez le contenu à coller","la source","gras","italique","pinceau","lien","annuler","refaire","tableau","image","gomme","clause","taille de police","Video","police","à propos de l'éditeur","impression","souligné","barré","indentation","retrait","taille réelle","taille conventionnelle","la ligne","Liste","Liste numérotée","Couper","Sélectionner tout",null,"Ouvrir le lien","Modifier le lien","Attribut Nofollow","Supprimer le lien","Mettre à jour","Pour éditer","Voir","URL",null,"Alignement horizontal","Filtre","Trier par modification","Trier par nom","Trier par taille","Créer le dossier","Restaurer","Sauvegarder","Enregistrer sous","Changer la taille","Taille de garniture","Largeur","Hauteur","Garder les proportions","Oui","Non","Supprimer","Mettre en évidence","Mettre en évidence: %s","Alignement vertical","Split","aller","Ajouter une colonne","Ajouter une rangée",null,"Effacer","Split vertical","Split horizontal","Bordure","Votre texte que vous essayez de coller est similaire au HTML. Collez-le en HTML?","Coller en HTML?","Sauvegarder l'original","Coller en tant que texte","Coller le texte seulement","Vous ne pouvez éditer que vos propres images. Téléchargez cette image sur l'hôte?","L'image a été téléchargée avec succès sur le serveur!","Palette","Il n'y a aucun fichier dans ce répertoire.","renommer","Entrez un nouveau nom","Aperçu","Télécharger","Coller à partir du presse-papiers","Votre navigateur ne prend pas en charge l'accès direct au presse-papiers.","Copier la sélection","copie","Rayon des bordures","Afficher tous","Appliquer","Veuillez remplir ce champ","Veuillez entrer une adresse web","Par défaut","Cercle","Point","Quadratique","Trouver","Précédent","Suivant","Le contenu que vous insérez provient d'un document Microsoft Word / Excel. Voulez-vous enregistrer le format ou l'effacer?","C'est peut-être un fragment de Word ou Excel","Nettoyer","Insérer un nom de classe","Appuyez sur Alt pour un redimensionnement personnalisé"]},53113(t){t.exports.default=["הקלד משהו...","About Jodit","Jodit Editor","Jodit User's Guide","contains detailed help for using.","For information about the license, please go to our website:","Buy full version","Copyright © XDSoft.net - Chupurnov Valeriy. All rights reserved.","מקום עיגון","פתח בכרטיסיה חדשה","פתח את העורך בחלון חדש","נקה עיצוב","שנה צבע טקסט או רקע","בצע שוב","בטל","מודגש","נטוי","הכנס רשימת תבליטים","הכנס רשימה ממוספרת","מרכז","ישר ","ישר לשמאל","ישר לימין","הכנס קו אופקי","הכנס תמונה","הכנס קובץ","הכנס סרטון וידאו מYouTube/Vimeo","הכנס קישור","גודל גופן","גופן","מעוצב מראש","רגיל","כותרת 1","כותרת 2","כותרת 3","כותרת 4","ציטוט","קוד","הכנס","הכנס טבלה","הקטן כניסה","הגדל כניסה","בחר תו מיוחד","הכנס תו מיוחד","העתק עיצוב","החלף מצב","ריווח","עליון","ימין","תחתון","שמאל","עיצוב CSS","מחלקת CSS","יישור","ימין","מרכז","שמאל","--לא נקבע--","מקור","כותרת","כיתוב חלופי","קישור","פתח בכרטיסיה חדשה","תמונה","קובץ","מתקדם","מאפייני תמונה","ביטול","אישור","סייר הקבצים","שגיאה בזמן טעינת רשימה","שגיאה בזמן טעינת תקיות","האם אתה בטוח?","הכנס שם תקיה","צור תקיה","סוג הקובץ","הסר תמונה","הסר קובץ","או לחץ","כיתוב חלופי","העלה","סייר","רקע","טקסט","עליון","מרכז","תחתון","הכנס עמודה לפני","הכנס עמודה אחרי","הכנס שורה מעל","הכנס שורה מתחת","מחק טבלה","מחק שורה","מחק עמודה","רוקן תא","תווים: %d","מילים: %d","קו חוצה","קו תחתון","superscript","subscript","גזור בחירה","בחר הכל","שבירת שורה","חפש","החלף ב","להחליף","הדבק","בחר תוכן להדבקה","HTML","מודגש","נטוי","מברשת","קישור","בטל","בצע שוב","טבלה","תמונה","מחק","פסקה","גודל גופן","וידאו","גופן","עלינו","הדפס","קו תחתון","קו חוצה","הגדל כניסה","הקטן כניסה","גודל מלא","כווץ","קו אופקי","רשימת תבליטים","רשימה ממוספרת","חתוך","בחר הכל","הוסף קוד","פתח קישור","ערוך קישור","ללא מעקב","בטל קישור","עדכן","כדי לערוך","הצג","כתובת","ערוך","יישור אופקי","סנן","מין לפי שינוי","מיין לפי שם","מיין לפי גודל","הוסף תקייה","אפס","שמור","שמור בשם...","שנה גודל","חתוך","רוחב","גובה","שמור יחס","כן","לא","הסר","בחר","נבחר: %s","יישור אנכי","פיצול","מזג","הוסף עמודה","הוסף שורה",null,"מחק","פיצול אנכי","פיצול אופקי","מסגרת","הקוד דומה לHTML, האם להשאיר כHTML","הדבק כHTML","השאר","הכנס כטקסט","הכנס טקסט בלבד","רק קבצים המשוייכים שלך ניתנים לעריכה. האם להוריד את הקובץ?","התמונה עלתה בהצלחה!","לוח","אין קבצים בספריה זו.","הונגרית","הזן שם חדש","תצוגה מקדימה","הורד","להדביק מהלוח","הדפדפן שלך לא תומך גישה ישירה ללוח.","העתק בחירה","העתק","רדיוס הגבול","הצג את כל","החל","נא למלא שדה זה","אנא הזן כתובת אינטרנט","ברירת המחדל","מעגל","נקודה","הריבוע הזה","למצוא","מצא את הקודם","חפש את הבא","התוכן המודבק מגיע ממסמך וורד/אקסל. האם ברצונך להשאיר את העיצוב או לנקותו",'זוהתה הדבקה מ"וורד"',"נקה","הכנס את שם הכיתה","לחץ על אלט לשינוי גודל מותאם אישית"]},81321(t){t.exports.default=["Írjon be valamit","Joditról","Jodit Editor","Jodit útmutató","további segítséget tartalmaz","További licence információkért látogassa meg a weboldalunkat:","Teljes verzió megvásárlása","Copyright © XDSoft.net - Chupurnov Valeriy. Minden jog fenntartva.","Horgony","Megnyitás új lapon","Megnyitás teljes méretben","Formázás törlése","Háttér/szöveg szín","Újra","Visszavon","Félkövér","Dőlt","Pontozott lista","Számozott lista","Középre zárt","Sorkizárt","Balra zárt","Jobbra zárt","Vízszintes vonal beszúrása","Kép beszúrás","Fájl beszúrás","Youtube videó beszúrása","Link beszúrás","Betűméret","Betűtípus","Formázott blokk beszúrása","Normál","Fejléc 1","Fejléc 2","Fejléc 3","Fejléc 4","Idézet","Kód","Beszúr","Táblázat beszúrása","Behúzás csökkentése","Behúzás növelése","Speciális karakter kiválasztása","Speciális karakter beszúrása","Kép formázása","Nézet váltása","Szegélyek","felső","jobb","alsó","bal","CSS stílusok","CSS osztályok","Igazítás","Jobbra","Középre","Balra","Nincs","Forrás","Cím","Helyettesítő szöveg","Link","Link megnyitása új lapon","Kép","Fájl","Haladó","Kép tulajdonságai","Mégsem","OK","Fájl tallózó","Hiba a lista betöltése közben","Hiba a mappák betöltése közben","Biztosan ezt szeretné?","Írjon be egy mappanevet","Mappa létrehozása","írjon be bevet","Húzza ide a képet","Húzza ide a fájlt","vagy kattintson","Helyettesítő szöveg","Feltölt","Tallóz","Háttér","Szöveg","Fent","Középen","Lent","Oszlop beszúrás elé","Oszlop beszúrás utána","Sor beszúrás fölé","Sor beszúrás alá","Táblázat törlése","Sor törlése","Oszlop törlése","Cella tartalmának törlése","Karakterek száma: %d","Szavak száma: %d","Áthúzott","Aláhúzott","Felső index","Alsó index","Kivágás","Összes kijelölése","Szünet","Keresés","Csere erre","Cserélje ki","Beillesztés","Válasszon tartalmat a beillesztéshez","HTML","Félkövér","Dőlt","Ecset","Link","Visszavon","Újra","Táblázat","Kép","Törlés","Paragráfus","Betűméret","Videó","Betű","Rólunk","Nyomtat","Aláhúzott","Áthúzott","Behúzás","Aussenseiter","Teljes méret","Összenyom","Egyenes vonal","Lista","Számozott lista","Kivág","Összes kijelölése","Beágyazott kód","Link megnyitása","Link szerkesztése","Nincs követés","Link leválasztása","Frissít","Szerkesztés","felülvizsgálat","URL","Szerkeszt","Vízszintes igazítás","Szűrő","Rendezés módosítás szerint","Rendezés név szerint","Rendezés méret szerint","Mappa hozzáadás","Visszaállít","Mentés","Mentés másként...","Átméretezés","Kivág","Szélesség","Magasság","Képarány megtartása","Igen","Nem","Eltávolít","Kijelöl","Kijelöl: %s","Függőleges igazítás","Felosztás","Összevonás","Oszlop hozzáadás","Sor hozzáadás",null,"Törlés","Függőleges felosztás","Vízszintes felosztás","Szegély","A beillesztett szöveg HTML-nek tűnik. Megtartsuk HTML-ként?","Beszúrás HTML-ként","Megtartás","Beszúrás szövegként","Csak szöveg beillesztése","Csak a saját képeit tudja szerkeszteni. Letölti ezt a képet?","Kép sikeresen feltöltve!","Palette","Er zijn geen bestanden in deze map.","átnevezés","Adja meg az új nevet","előnézet","Letöltés","Illessze be a vágólap","A böngésző nem támogatja a közvetlen hozzáférést biztosít a vágólapra.","Másolás kiválasztása","másolás","Határ sugár","Összes","Alkalmazni","Kérjük, töltse ki ezt a mezőt,","Kérjük, írja be a webcímet","Alapértelmezett","Kör","Pont","Quadrate","Találni","Megtalálja Előző","Következő Keresése","A beillesztett tartalom Microsoft Word/Excel dokumentumból származik. Meg szeretné tartani a formátumát?","Word-ből másolt szöveg","Elvetés","Helyezze be az osztály nevét","Nyomja meg az Alt egyéni átméretezés"]},4679(t){t.exports.default=["Ketik sesuatu","Tentang Jodit","Editor Jodit","Panduan Pengguna Jodit","mencakup detail bantuan penggunaan","Untuk informasi tentang lisensi, silakan kunjungi website:","Beli versi lengkap","Hak Cipta © XDSoft.net - Chupurnov Valeriy. Hak cipta dilindungi undang-undang.","Tautan","Buka di tab baru","Buka editor dalam ukuran penuh","Hapus Pemformatan","Isi warna atau atur warna teks","Ulangi","Batalkan","Tebal","Miring","Sisipkan Daftar Tidak Berurut","Sisipkan Daftar Berurut","Tengah","Penuh","Kiri","Kanan","Sisipkan Garis Horizontal","Sisipkan Gambar","Sisipkan Berkas","Sisipkan video youtube/vimeo","Sisipkan tautan","Ukuran font","Keluarga font","Sisipkan blok format","Normal","Heading 1","Heading 2","Heading 3","Heading 4","Kutip","Kode","Sisipkan","Sisipkan tabel","Kurangi Indentasi","Tambah Indentasi","Pilih Karakter Spesial","Sisipkan Karakter Spesial","Formar warna","Ubah mode","Batas","atas","kanan","bawah","kiri","Gaya","Class","Rata","Kanan","Tengah","Kiri","--Tidak diset--","Src","Judul","Teks alternatif","Tautan","Buka tautan di tab baru","Gambar","berkas","Lanjutan","Properti gambar","Batal","Ya","Penjelajah Berkas","Error ketika memuat list","Error ketika memuat folder","Apakah Anda yakin?","Masukkan nama Direktori","Buat direktori","ketik nama","Letakkan gambar","Letakkan berkas","atau klik","Teks alternatif","Unggah","Jelajahi","Latar Belakang","Teks","Atas","Tengah","Bawah","Sisipkan kolom sebelumnya","Sisipkan kolom setelahnya","Sisipkan baris di atasnya","Sisipkan baris di bawahnya","Hapus tabel","Hapus baris","Hapus kolom","Kosongkan cell","Karakter: %d","Kata: %d","Coret","Garis Bawah","Superskrip","Subskrip","Potong pilihan","Pilih semua","Berhenti","Mencari","Ganti dengan","Mengganti","Paste","Pilih konten untuk dipaste","sumber","tebal","miring","sikat","tautan","batalkan","ulangi","tabel","gambar","penghapus","paragraf","ukuran font","video","font","tentang","cetak","garis bawah","coret","menjorok ke dalam","menjorok ke luar","ukuran penuh","menyusut","hr","ul","ol","potong","Pilih semua","Kode embed","Buka tautan","Edit tautan","No follow","Hapus tautan","Perbarui","pensil","Mata","URL","Edit","Perataan horizontal","Filter","Urutkan berdasarkan perubahan","Urutkan berdasarkan nama","Urutkan berdasarkan ukuran","Tambah folder","Reset","Simpan","Simpan sebagai...","Ubah ukuran","Crop","Lebar","Tinggi","Jaga aspek rasio","Ya","Tidak","Copot","Pilih","Pilih %s","Rata vertikal","Bagi","Gabungkan","Tambah kolom","tambah baris","Lisensi: %s","Hapus","Bagi secara vertikal","Bagi secara horizontal","Bingkai","Kode Anda cenderung ke HTML. Biarkan sebagai HTML?","Paste sebagai HTML","Jaga","Sisipkan sebagai teks","Sisipkan hanya teks","Anda hanya dapat mengedit gambar Anda sendiri. Unduh gambar ini di host?","Gambar telah sukses diunggah ke host!","palet","Tidak ada berkas","ganti nama","Masukkan nama baru","pratinjau","Unduh","Paste dari clipboard","Browser anda tidak mendukung akses langsung ke clipboard.","Copy seleksi","copy","Border radius","Tampilkan semua","Menerapkan","Silahkan mengisi kolom ini","Silahkan masukkan alamat web","Default","Lingkaran","Dot","Kuadrat","Menemukan","Menemukan Sebelumnya","Menemukan Berikutnya","Konten dipaste dari dokumen Microsoft Word/Excel. Apakah Anda ingin tetap menjaga format atau membersihkannya?","Terdeteksi paste dari Word","Bersih","Masukkan nama kelas","Tekan Alt untuk mengubah ukuran kustom"]},31927(t){t.exports.default=["Scrivi qualcosa...","A proposito di Jodit","Jodit Editor","Guida utente di Jodit","contiene una guida dettagliata per l'uso.","Per informazioni sulla licenza, si prega di visitare il nostro sito web:","Acquista la versione completa","Copyright © XDSoft.net - Chupurnov Valeriy. Tutti i diritti riservati.","Link","Apri in una nuova scheda","Apri l'editor a schermo intero","Pulisci Formattazione","Colore di sfondo o del testo","Ripristina","Annulla","Grassetto","Corsivo","Inserisci lista non ordinata","Inserisci lista ordinata","Allinea al centro","Allineamento Giustificato","Allinea a Sinistra","Allinea a Destra","Inserisci una linea orizzontale","Inserisci immagine","Inserisci un file","Inserisci video Youtube/Vimeo","Inserisci link","Dimensione carattere","Tipo di font","Inserisci blocco","Normale","Intestazione 1","Intestazione 2","Intestazione 3","Intestazione 4","Citazione","Codice","Inserisci","Inserisci tabella","Riduci il rientro","Aumenta il rientro","Seleziona un carattere speciale","Inserisci un carattere speciale","Copia formato","Cambia modalita'","Margini","su","destra","giù","sinistra","Stili CSS","Classi CSS","Allinea","Destra","Centro","Sinistra","--Non Impostato--","Fonte","Titolo","Testo Alternativo","Link","Apri il link in una nuova scheda","Immagine","Archivio","Avanzato","Proprietà dell'immagine","Annulla","Accetta","Cerca file","Errore durante il caricamento dell'elenco","Errore durante il caricamento delle cartelle","Sei sicuro?","Inserisci il nome della cartella","Crea cartella","Digita il nome","Cancella immagine","Cancella file","o clicca","Testo alternativo","Carica","Sfoglia","Sfondo","Testo","Su","Centro","Sotto","Inserisci la colonna prima","Inserisci la colonna dopo","Inserisci la riga sopra","Inserisci la riga sotto","Elimina tabella","Elimina riga","Elimina colonna","Cella vuota","Caratteri: %d","Parole: %d","Barrato","Sottolineato","indice","pedice","Taglia selezione","Seleziona tutto","Pausa","Cerca per","Sostituisci con","Sostituisci","Incolla","Seleziona il contenuto da incollare","risorsa","Grassetto","Corsivo","Pennello","Link","Annulla","Ripristina","Tabella","Immagine","Gomma","Paragrafo","Dimensione del carattere","Video","Font","Approposito di","Stampa","Sottolineato","Barrato","aumenta rientro","riduci rientro","espandi","comprimi","linea orizzontale","lista non ordinata","lista ordinata","Taglia","Seleziona tutto","Includi codice","Apri link","Modifica link","Non seguire","Rimuovi link","Aggiorna","Per modificare","Recensione"," URL","Modifica","Allineamento orizzontale","Filtro","Ordina per data di modifica","Ordina per nome","Ordina per dimensione","Aggiungi cartella","Reset","Salva","Salva con nome...","Ridimensiona","Ritaglia","Larghezza","Altezza","Mantieni le proporzioni","Si","No","Rimuovi","Seleziona","Seleziona: %s","Allineamento verticala","Dividi","Fondi","Aggiungi colonna","Aggiungi riga",null,"Cancella","Dividi verticalmente","Dividi orizzontale","Bordo","Il codice è simile all'HTML. Mantieni come HTML?","Incolla come HTML","Mantieni","Inserisci come testo","Inserisci solo il testo","Puoi modificare solo le tue immagini. Vuoi scaricare questa immagine dal server?","L'immagine è stata caricata correttamente sul server!","tavolozza","Non ci sono file in questa directory.","Rinomina","Inserisci un nuovo nome","anteprima","Scarica","Incolla dagli appunti","Il tuo browser non supporta l'accesso diretto agli appunti.","Copia selezione","copia","Border radius","Mostra tutti","Applica","Si prega di compilare questo campo","Si prega di inserire un indirizzo web","Default","Cerchio","Punto","Quadrato","Trova","Trova Precedente","Trova Successivo","Il contenuto incollato proviene da un documento Microsoft Word / Excel. Vuoi mantenere il formato o pulirlo?","Incolla testo da Word rilevato","Pulisci","Inserisci il nome della classe","Premere Alt per il ridimensionamento personalizzato"]},21195(t){t.exports.default=["なにかタイプしてください","Joditについて","Jodit Editor","Jodit ユーザーズ・ガイド","詳しい使い方","ライセンス詳細についてはJodit Webサイトを確認ください:","フルバージョンを購入","Copyright © XDSoft.net - Chupurnov Valeriy. All rights reserved.","Anchor","新しいタブで開く","エディターのサイズ(フル/ノーマル)","書式をクリア","テキストの色","やり直し","元に戻す","太字","斜体","箇条書き","番号付きリスト","中央揃え","両端揃え","左揃え","右揃え","区切り線を挿入","画像を挿入","ファイルを挿入","Youtube/Vimeo 動画","リンクを挿入","フォントサイズ","フォント","テキストのスタイル","指定なし","タイトル1","タイトル2","タイトル3","タイトル4","引用","コード","挿入","表を挿入","インデント減","インデント増","特殊文字を選択","特殊文字を挿入","書式を貼付け","編集モード切替え","マージン","上","右","下","左","スタイル","クラス","配置","右寄せ","中央寄せ","左寄せ","指定なし","ソース","タイトル","代替テキスト","リンク","新しいタブで開く","画像","ファイル","高度な設定","画像のプロパティー","キャンセル","確定","File Browser","Error on load list","Error on load folders","Are you sure?","Enter Directory name","Create directory","type name","ここに画像をドロップ","ここにファイルをドロップ","or クリック","代替テキスト","アップロード","ブラウズ","背景","文字","上","中央","下","左に列を挿入","右に列を挿入","上に行を挿入","下に行を挿入","表を削除","行を削除","列を削除","セルを空にする","文字数: %d","単語数: %d","取り消し線","下線","上付き文字","下付き文字","切り取り","すべて選択","Pause","検索","置換","交換","貼付け","選択した内容を貼付け","source","bold","italic","brush","link","undo","redo","table","image","eraser","paragraph","fontsize","video","font","about","print","underline","strikethrough","indent","outdent","fullsize","shrink","分割線","箇条書き","番号付きリスト","切り取り","すべて選択","埋め込みコード","リンクを開く","リンクを編集","No follow","リンク解除","更新","鉛筆","サイトを確認","URL","編集","水平方向の配置","Filter","Sort by changed","Sort by name","Sort by size","Add folder","リセット","保存","Save as ...","リサイズ","Crop","幅","高さ","縦横比を保持","はい","いいえ","移除","選択","選択: %s","垂直方向の配置","分割","セルの結合","列を追加","行を追加",null,"削除","セルの分割(垂直方向)","セルの分割(水平方向)","境界線","HTMLコードを保持しますか?","HTMLで貼付け","HTMLを保持","HTMLをテキストにする","テキストだけ","You can only edit your own images. Download this image on the host?","The image has been successfully uploaded to the host!","パレット","There are no files","Rename","Enter new name","プレビュー","ダウンロード","貼り付け","お使いのブラウザはクリップボードを使用できません","コピー","copy","角の丸み","全て表示","適用","まだこの分野","を入力してくださいウェブアドレス","デフォルト","白丸","黒丸","四角","見","探前","由来","The pasted content is coming from a Microsoft Word/Excel document. Do you want to keep the format or clean it up?","Word Paste Detected","Clean","クラス名を挿入","カスタムサイズ変更のためのAltキーを押します"]},53414(t){t.exports.default=["Type something","About Jodit","Jodit Editor","Jodit User's Guide","contains detailed help for using","For information about the license, please go to our website:","Buy full version","Copyright © XDSoft.net - Chupurnov Valeriy. All rights reserved.","Anchor","Open in new tab","Open in fullsize","Clear Formatting","Fill color or set the text color","Redo","Undo","Bold","Italic","Insert Unordered List","Insert Ordered List","Align Center","Align Justify","Align Left","Align Right","Insert Horizontal Line","Insert Image","Insert file","Insert youtube/vimeo video","Insert link","Font size","Font family","Insert format block","Normal","Heading 1","Heading 2","Heading 3","Heading 4","Quote","Code","Insert","Insert table","Decrease Indent","Increase Indent","Select Special Character","Insert Special Character","Paint format","Change mode","Margins","top","right","bottom","left","Styles","Classes","Align","Right","Center","Left","--Not Set--","Src","Title","Alternative","Link","Open link in new tab","Image","file","Advanced","Image properties","Cancel","Ok","File Browser","Error on load list","Error on load folders","Are you sure?","Enter Directory name","Create directory","type name","Drop image","Drop file","or click","Alternative text","Upload","Browse","Background","Text","Top","Middle","Bottom","Insert column before","Insert column after","Insert row above","Insert row below","Delete table","Delete row","Delete column","Empty cell","Chars: %d","Words: %d","Strike through","Underline","superscript","subscript","Cut selection","Select all","Break","Search for","Replace with","Replace","Paste","Choose Content to Paste","source","bold","italic","brush","link","undo","redo","table","image","eraser","paragraph","fontsize","video","font","about","print","underline","strikethrough","indent","outdent","fullsize","shrink","hr","ul","ol","cut","selectall","Embed code","Open link","Edit link","No follow","Unlink","Update","pencil","Eye"," URL","Edit","Horizontal align","Filter","Sort by changed","Sort by name","Sort by size","Add folder","Reset","Save","Save as ...","Resize","Crop","Width","Height","Keep Aspect Ratio","Yes","No","Remove","Select","Select %s","Vertical align","Split","Merge","Add column","Add row","License: %s","Delete","Split vertical","Split horizontal","Border","Your code is similar to HTML. Keep as HTML?","Paste as HTML","Keep","Insert as Text","Insert only Text","You can only edit your own images. Download this image on the host?","The image has been successfully uploaded to the host!","palette","There are no files","Rename","Enter new name","preview","download","Paste from clipboard","Your browser doesn't support direct access to the clipboard.","Copy selection","copy","Border radius","Show all","Apply","Please fill out this field","Please enter a web address","Default","Circle","Dot","Quadrate","Find","Find Previous","Find Next","The pasted content is coming from a Microsoft Word/Excel document. Do you want to keep the format or clean it up?","Word Paste Detected","Clean","Insert className","Press Alt for custom resizing"]},11012(t){t.exports.default=["무엇이든 입력하세요","Jodit에 대하여","Jodit Editor","Jodit 사용자 안내서","자세한 도움말이 들어있어요","라이센스에 관해서는 Jodit 웹 사이트를 방문해주세요:","풀 버전 구입하기","© XDSoft.net - Chupurnov Valeriy. 에게 저작권과 모든 권리가 있습니다.","Anchor","새 탭에서 열기","전체 크기로 보기","서식 지우기","글씨 색상","재실행","실행 취소","굵게","기울임","글머리 목록","번호 목록","가운데 정렬","양쪽 정렬","왼쪽 정렬","오른쪽 정렬","수평 구분선 넣기","이미지 넣기","파일 넣기","Youtube/Vimeo 동영상","링크 넣기","글꼴 크기","글꼴","블록 요소 넣기","일반 텍스트","제목 1","제목 2","제목 3","제목 4","인용","코드","붙여 넣기","테이블","들여쓰기 감소","들여쓰기 증가","특수문자 선택","특수문자 입력","페인트 형식","편집모드 변경","마진","위","오른쪽","아래","왼쪽","스타일","클래스","정렬","오른쪽으로","가운데로","왼쪽으로","--지정 안 함--","경로(src)","제목","대체 텍스트(alt)","링크","새 탭에서 열기",null,"파일","고급","이미지 속성","취소","확인","파일 탐색기","목록 불러오기 에러","폴더 불러오기","정말 진행할까요?","디렉토리 이름 입력","디렉토리 생성","이름 입력","이미지 드래그","파일 드래그","혹은 클릭","대체 텍스트","업로드","탐색","배경","텍스트","위","중앙","아래","이전 열에 삽입","다음 열에 삽입","위 행에 삽입","아래 행에 삽입","테이블 삭제","행 삭제","열 삭제","빈 셀","문자수: %d","단어수: %d","취소선","밑줄","윗첨자","아래첨자","선택 잘라내기","모두 선택","구분자","검색","대체하기","대체","붙여넣기","붙여넣을 내용 선택","HTML 소스","볼드","이탤릭","브러시","링크","실행 취소","재실행","테이블","이미지","지우개","문단","글꼴 크기","비디오","글꼴","편집기 정보","프린트","밑줄","취소선","들여쓰기","내어쓰기","전체 화면","일반 화면","구분선","글머리 목록","번호 목록","잘라내기","모두 선택","Embed 코드","링크 열기","링크 편집","No follow","링크 제거","갱신","연필","사이트 확인","URL","편집","수평 정렬","필터","변경일 정렬","이름 정렬","크기 정렬","새 폴더","초기화","저장","새로 저장하기 ...","리사이즈","크롭","가로 길이","세로 높이","비율 유지하기","네","아니오","제거","선택","선택: %s","수직 정렬","분할","셀 병합","열 추가","행 추가","라이센스: %s","삭제","세로 셀 분할","가로 셀 분할","외곽선","HTML 코드로 감지했어요. 코드인채로 붙여넣을까요?","HTML로 붙여넣기","원본 유지","텍스트로 넣기","텍스트만 넣기","외부 이미지는 편집할 수 없어요. 외부 이미지를 다운로드 할까요?","이미지를 무사히 업로드 했어요!","팔레트","파일이 없어요","이름 변경","새 이름 입력","미리보기","다운로드","클립보드 붙여넣기","사용중인 브라우저가 클립보드 접근을 지원하지 않아요.","선택 복사","복사","둥근 테두리","모두 보기","적용","이 항목을 입력해주세요!","웹 URL을 입력해주세요.","기본","원","점","정사각형","찾기","이전 찾기","다음 찾기","Microsoft Word/Excel 문서로 감지했어요. 서식을 유지한채로 붙여넣을까요?","Word 붙여넣기 감지","지우기","className 입력","사용자 지정 크기 조정에 대 한 고도 누르십시오"]},87061(t){t.exports.default=["Бичээд үзээрэй","Jodit-ын талаар ","Jodit програм","Jodit гарын авлага","хэрэглээний талаар дэлгэрэнгүй мэдээллийг агуулна","Лицензийн мэдээллийг манай вэб хуудаснаас авна уу:","Бүрэн хувилбар худалдан авах","Зохиогчийн эрх хамгаалагдсан © XDSoft.net - Chupurnov Valeriy. Бүх эрхийг эзэмшинэ.","Холбоо барих","Шинэ табаар нээх","Бүтэн дэлгэцээр нээх","Форматыг арилгах","Өнгөөр будах эсвэл текстийн өнгө сонгох","Дахих","Буцаах","Тод","Налуу","Тэмдэгт жагсаалт нэмэх","Дугаарт жагсаалт нэмэх","Голлож байрлуулах","Тэгшитгэн байрлуулах","Зүүнд байрлуулах","Баруунд байрлуулах","Хэвтээ зураас нэмэх","Зураг нэмэх","Файл нэмэх","Youtube/Vimeo видео нэмэх","Холбоос нэмэх","Фонтын хэмжээ","Фонтын бүл","Блок нэмэх","Хэвийн","Гарчиг 1","Гарчиг 2","Гарчиг 3","Гарчиг 4","Ишлэл","Код","Оруулах","Хүснэгт оруулах","Доголын зай хасах","Доголын зай нэмэх","Тусгай тэмдэгт сонгох","Тусгай тэмдэгт нэмэх","Зургийн формат","Горим өөрчлөх","Цаасны зай","Дээрээс","Баруунаас","Доороос","Зүүнээс","CSS стиль","CSS анги","Байрлуулах","Баруун","Төв","Зүүн","--Тодорхойгүй--","Эх үүсвэр","Гарчиг","Алтернатив текст","Холбоос","Холбоосыг шинэ хавтсанд нээх","Зураг","Файл","Дэвшилтэт","Зургийн үзүүлэлт","Цуцлах","Ok","Файлын цонх","Жагсаалт татах үед алдаа гарлаа","Хавтас татах үед алдаа гарлаа","Итгэлтэй байна уу?","Хавтсын нэр оруулах","Хавтас үүсгэх","Нэр бичих","Зураг буулгах","Файл буулгах","эсвэл товш","Алтернатив текст","Байршуулах","Үзэх","Арын зураг","Текст","Дээр","Дунд","Доор","Урд нь багана нэмэх","Ард нь багана нэмэх","Дээр нь мөр нэмэх","Доор нь мөр нэмэх","Хүснэгт устгах","Мөр устгах","Багана устгах","Нүд цэвэрлэх","Тэмдэгт: %d","Үг: %d","Дээгүүр зураас","Доогуур зураас","Дээд индекс","Доод индекс","Сонголтыг таслах","Бүгдийг сонго","Мөрийг таслах","Хайх","Үүгээр солих","Солих","Буулгах","Буулгах агуулгаа сонгоно уу","Эх үүсвэр","Тод","Налуу","Будах","Холбоос","Буцаах","Дахих","Хүснэгт","Зураг","Баллуур","Параграф","Фонтын хэмжээ","Видео","Фонт","Тухай","Хэвлэх","Доогуур зураас","Дээгүүр зураас","Догол нэмэх","Догол багасгах","Бүтэн дэлгэц","Багасга","Хаалт","Тэмдэгт жагсаалт","Дугаарласан жагсаалт","Таслах","Бүгдийг сонго","Код оруулах","Холбоос нээх","Холбоос засах","Nofollow özelliği","Холбоос салгах","Шинэчлэх","Засах","Нүд","URL","Засах","Хэвтээ эгнүүлэх","Шүүх","Сүүлд өөрчлөгдсөнөөр жагсаах","Нэрээр жагсаах","Хэмжээгээр жагсаах","Хавтас нэмэх","Буцаах","Хадгалах","Өөрөөр хадгалах","Хэмжээг өөрчил","Тайрах","Өргөн","Өндөр","Харьцааг хадгал","Тийм","Үгүй","Арилга","Сонго","Сонго: %s","Босоо эгнүүлэх","Задлах","Нэгтгэх","Багана нэмэх","Мөр нэмэх",null,"Устгах","Баганаар задлах","Мөрөөр задлах","Хүрээ","Таны код HTML кодтой адил байна. HTML форматаар үргэлжлүүлэх үү?","HTML байдлаар буулгах","Хадгалах","Текст байдлаар нэмэх","Зөвхөн текст оруулах","Та зөвхөн өөрийн зургуудаа янзлах боломжтой. Энэ зургийг өөр лүүгээ татмаар байна уу?","Зургийг хост руу амжилттай хадгалсан","Палет","Энд ямар нэг файл алга","Шинээр нэрлэх","Шинэ нэр оруулна уу","Урьдчилан харах","Татах","Самбараас хуулах ","Энэ вэб хөтчөөс самбарт хандах эрх алга.","Сонголтыг хуул","Хуулах","Хүрээний радиус","Бүгдийг харуулах","Хэрэгжүүл","Энэ талбарыг бөглөнө үү","Вэб хаягаа оруулна уу","Үндсэн","Дугуй","Цэг","Дөрвөлжин","Хайх","Өмнөхийг ол","Дараагийнхийг ол","Буулгасан агуулга Microsoft Word/Excel форматтай байна. Энэ форматыг хэвээр хадгалах уу эсвэл арилгах уу?","Word байдлаар буулгасан байна","Цэвэрлэх","Бүлгийн нэрээ оруулна уу","Хэмжээсийг шинээр өөчрлөхийн тулд Alt товчин дээр дарна уу"]},3268(t){t.exports.default=["Begin met typen..","Over Jodit","Jodit Editor","Jodit gebruikershandleiding","bevat gedetailleerde informatie voor gebruik.","Voor informatie over de licentie, ga naar onze website:","Volledige versie kopen","Copyright © XDSoft.net - Chupurnov Valeriy. Alle rechten voorbehouden.","Anker","Open in nieuwe tab","Editor in volledig scherm openen","Opmaak verwijderen","Vulkleur of tekstkleur aanpassen","Opnieuw","Ongedaan maken","Vet","Cursief","Geordende list invoegen","Ongeordende lijst invoegen","Centreren","Uitlijnen op volledige breedte","Links uitlijnen","Rechts uitlijnen","Horizontale lijn invoegen","Afbeelding invoegen","Bestand invoegen","Youtube/Vimeo video invoegen","Link toevoegen","Tekstgrootte","Lettertype","Format blok invoegen","Normaal","Koptekst 1","Koptekst 2","Koptekst 3","Koptekst 4","Citaat","Code","Invoegen","Tabel invoegen","Inspringing verkleinen","Inspringing vergroten","Symbool selecteren","Symbool invoegen","Opmaak kopieren","Modus veranderen","Marges","Boven","Rechts","Onder","Links","CSS styles","CSS classes","Uitlijning","Rechts","Gecentreerd","Links","--Leeg--","Src","Titel","Alternatieve tekst","Link","Link in nieuwe tab openen","Afbeelding","Bestand","Geavanceerd","Afbeeldingseigenschappen","Annuleren","OK","Bestandsbrowser","Fout bij het laden van de lijst","Fout bij het laden van de mappenlijst","Weet je het zeker?","Geef de map een naam","Map aanmaken","Type naam","Sleep hier een afbeelding naartoe","Sleep hier een bestand naartoe","of klik","Alternatieve tekst","Uploaden","Bladeren","Achtergrond","Tekst","Boven","Midden","Onder","Kolom invoegen (voor)","Kolom invoegen (na)","Rij invoegen (boven)","Rij invoegen (onder)","Tabel verwijderen","Rij verwijderen","Kolom verwijderen","Cel leegmaken","Tekens: %d","Woorden: %d","Doorstrepen","Onderstrepen","Superscript","Subscript","Selectie knippen","Selecteer alles","Enter","Zoek naar","Vervangen door","Vervangen","Plakken","Kies content om te plakken","Broncode","vet","cursief","kwast","link","ongedaan maken","opnieuw","tabel","afbeelding","gum","paragraaf","lettergrootte","video","lettertype","over","afdrukken","onderstreept","doorgestreept","inspringen","minder inspringen","volledige grootte","kleiner maken","horizontale lijn","lijst","genummerde lijst","knip","alles selecteren","Embed code","Link openen","Link aanpassen","Niet volgen","link verwijderen","Updaten","Om te bewerken","Recensie"," URL","Bewerken","Horizontaal uitlijnen","Filteren","Sorteren op wijzigingsdatum","Sorteren op naam","Sorteren op grootte","Map toevoegen","Herstellen","Opslaan","Opslaan als ...","Grootte aanpassen","Bijknippen","Breedte","Hoogte","Verhouding behouden","Ja","Nee","Verwijderen","Selecteren","Selecteer: %s","Verticaal uitlijnen","Splitsen","Samenvoegen","Kolom toevoegen","Rij toevoegen",null,"Verwijderen","Verticaal splitsen","Horizontaal splitsen","Rand","Deze code lijkt op HTML. Als HTML behouden?","Invoegen als HTML","Origineel behouden","Als tekst invoegen","Als onopgemaakte tekst invoegen","Je kunt alleen je eigen afbeeldingen aanpassen. Deze afbeelding downloaden?","De afbeelding is succesvol geüploadet!","Palette","Er zijn geen bestanden in deze map.","Hernoemen","Voer een nieuwe naam in","Voorvertoning","Download","Plakken van klembord","Uw browser ondersteunt geen directe toegang tot het klembord.","Selectie kopiëren","kopiëren","Border radius","Toon alle","Toepassen","Vul dit veld in","Voer een webadres in","Standaard","Cirkel","Punt","Kwadraat","Zoeken","Vorige Zoeken","Volgende Zoeken","De geplakte tekst is afkomstig van een Microsoft Word/Excel document. Wil je de opmaak behouden of opschonen?","Word-tekst gedetecteerd","Opschonen","Voeg de klassenaam in","Druk op Alt voor aangepaste grootte"]},97834(t){t.exports.default=["Napisz coś","O Jodit","Edytor Jodit","Instrukcja Jodit","zawiera szczegółowe informacje dotyczące użytkowania.","Odwiedź naszą stronę, aby uzyskać więcej informacji na temat licencji:","Zakup pełnej wersji","Copyright © XDSoft.net - Chupurnov Valeriy. Wszystkie prawa zastrzeżone.","Kotwica","Otwórz w nowej zakładce","Otwórz edytor w pełnym rozmiarze","Wyczyść formatowanie","Kolor wypełnienia lub ustaw kolor tekstu","Ponów","Cofnij","Pogrubienie","Kursywa","Wstaw listę wypunktowaną","Wstaw listę numeryczną","Wyśrodkuj","Wyjustuj","Wyrównaj do lewej","Wyrównaj do prawej","Wstaw linię poziomą","Wstaw grafikę","Wstaw plik","Wstaw film Youtube/vimeo","Wstaw link","Rozmiar tekstu","Krój czcionki","Wstaw formatowanie","Normalne","Nagłówek 1","Nagłówek 2","Nagłówek 3","Nagłówek 4","Cytat","Kod","Wstaw","Wstaw tabelę","Zmniejsz wcięcie","Zwiększ wcięcie","Wybierz znak specjalny","Wstaw znak specjalny","Malarz formatów","Zmień tryb","Marginesy","Górny","Prawy","Dolny","Levy","Style CSS","Klasy CSS","Wyrównanie","Prawa","środek","Lewa","brak","Źródło","Tytuł","Tekst alternatywny","Link","Otwórz w nowej zakładce","Grafika","Plik","Zaawansowane","Właściwości grafiki","Anuluj","OK","Przeglądarka plików","Błąd ładowania listy plików","Błąd ładowania folderów","Czy jesteś pewien?","Wprowadź nazwę folderu","Utwórz folder","wprowadź nazwę","Upuść plik graficzny","Upuść plik","lub kliknij tu","Tekst alternatywny","Wczytaj","Przeglądaj","Tło","Treść","Góra","Środek","Dół","Wstaw kolumnę przed","Wstaw kolumnę po","Wstaw wiersz przed","Wstaw wiersz po","Usuń tabelę","Usuń wiersz","Usuń kolumnę","Wyczyść komórkę","Znaki: %d","Słowa: %d","Przekreślenie","Podkreślenie","indeks górny","index dolny","Wytnij zaznaczenie","Wybierz wszystko","Przerwa","Szukaj","Zamień na","Wymienić","Wklej","Wybierz zawartość do wklejenia","HTML","pogrubienie","kursywa","pędzel","link","cofnij","ponów","tabela","grafika","wyczyść","akapit","rozmiar czcionki","wideo","czcionka","O programie","drukuj","podkreślenie","przekreślenie","wcięcie","wycięcie","pełen rozmiar","przytnij","linia pozioma","lista","lista numerowana","wytnij","zaznacz wszystko","Wstaw kod","otwórz link","edytuj link","Atrybut no-follow","Usuń link","Aktualizuj","edytuj","szukaj","URL","Edytuj","Wyrównywanie w poziomie","Filtruj","Sortuj wg zmiany","Sortuj wg nazwy","Sortuj wg rozmiaru","Dodaj folder","wyczyść","zapisz","zapisz jako","Zmień rozmiar","Przytnij","Szerokość","Wysokość","Zachowaj proporcje","Tak","Nie","Usuń","Wybierz","Wybierz: %s","Wyrównywanie w pionie","Podziel","Scal","Dodaj kolumnę","Dodaj wiersz",null,"Usuń","Podziel w pionie","Podziel w poziomie","Obramowanie","Twój kod wygląda jak HTML. Zachować HTML?","Wkleić jako HTML?","Oryginalny tekst","Wstaw jako tekst","Wstaw tylko treść","Możesz edytować tylko swoje grafiki. Czy chcesz pobrać tą grafikę?","Grafika została pomyślnienie dodana na serwer","Paleta","Brak plików.","zmień nazwę","Wprowadź nową nazwę","podgląd","pobierz","Wklej ze schowka","Twoja przeglądarka nie obsługuje schowka","Kopiuj zaznaczenie","kopiuj","Zaokrąglenie krawędzi","Pokaż wszystkie","Zastosuj","Proszę wypełnić to pole","Proszę, wpisz adres sieci web","Domyślnie","Koło","Punkt","Kwadrat","Znaleźć","Znaleźć Poprzednie","Znajdź Dalej","Wklejany tekst pochodzi z dokumentu Microsoft Word/Excel. Chcesz zachować ten format czy wyczyścić go? ","Wykryto tekst w formacie Word","Wyczyść","Wstaw nazwę zajęć","Naciśnij Alt, aby zmienić rozmiar"]},86433(t){t.exports.default=["Escreva algo...","Sobre o Jodit","Editor Jodit","Guia de usuário Jodit","contém ajuda detalhada para o uso.","Para informação sobre a licença, por favor visite nosso site:","Compre a versão completa","Copyright © XDSoft.net - Chupurnov Valeriy. Todos os direitos reservados.","Link","Abrir em nova aba","Abrir editor em tela cheia","Limpar formatação","Cor de preenchimento ou cor do texto","Refazer","Desfazer","Negrito","Itálico","Inserir lista não ordenada","Inserir lista ordenada","Centralizar","Justificar","Alinhar à Esquerda","Alinhar à Direita","Inserir linha horizontal","Inserir imagem","Inserir arquivo","Inserir vídeo do Youtube/vimeo","Inserir link","Tamanho da letra","Fonte","Inserir bloco","Normal","Cabeçalho 1","Cabeçalho 2","Cabeçalho 3","Cabeçalho 4","Citação","Código","Inserir","Inserir tabela","Diminuir recuo","Aumentar recuo","Selecionar caractere especial","Inserir caractere especial","Copiar formato","Mudar modo","Margens","cima","direta","baixo","esquerda","Estilos CSS","Classes CSS","Alinhamento","Direita","Centro","Esquerda","--Não Estabelecido--","Fonte","Título","Texto Alternativo","Link","Abrir link em nova aba","Imagem","Arquivo","Avançado","Propriedades da imagem","Cancelar","Ok","Procurar arquivo","Erro ao carregar a lista","Erro ao carregar as pastas","Você tem certeza?","Escreva o nome da pasta","Criar pasta","Escreva seu nome","Soltar imagem","Soltar arquivo","ou clique","Texto alternativo","Upload","Explorar","Fundo","Texto","Cima","Meio","Baixo","Inserir coluna antes","Inserir coluna depois","Inserir linha acima","Inserir linha abaixo","Excluir tabela","Excluir linha","Excluir coluna","Limpar célula","Caracteres: %d","Palavras: %d","Tachado","Sublinhar","sobrescrito","subscrito","Cortar seleção","Selecionar tudo","Pausa","Procurar por","Substituir com","Substituir","Colar","Escolher conteúdo para colar","HTML","negrito","itálico","pincel","link","desfazer","refazer","tabela","imagem","apagar","parágrafo","tamanho da letra","vídeo","fonte","Sobre de","Imprimir","sublinhar","tachado","recuar","diminuir recuo","Tamanho completo","diminuir","linha horizontal","lista não ordenada","lista ordenada","Cortar","Selecionar tudo","Incluir código","Abrir link","Editar link","Não siga","Remover link","Atualizar","Editar","Visualizar","URL","Editar","Alinhamento horizontal","filtrar","Ordenar por modificação","Ordenar por nome","Ordenar por tamanho","Adicionar pasta","Resetar","Salvar","Salvar como...","Redimensionar","Recortar","Largura","Altura","Manter a proporção","Sim","Não","Remover","Selecionar","Selecionar: %s","Alinhamento vertical","Dividir","Mesclar","Adicionar coluna","Adicionar linha",null,"Excluir","Dividir vertical","Dividir horizontal","Borda","Seu código é similar ao HTML. Manter como HTML?","Colar como HTML?","Manter","Inserir como Texto","Inserir somente o Texto","Você só pode editar suas próprias imagens. Baixar essa imagem pro servidor?","A imagem foi enviada com sucesso para o servidor!","Palette","Não há arquivos nesse diretório.","Húngara","Digite um novo nome","preview","Baixar","Colar da área de transferência","O seu navegador não oferece suporte a acesso direto para a área de transferência.","Selecção de cópia","cópia","Border radius","Mostrar todos os","Aplicar","Por favor, preencha este campo","Por favor introduza um endereço web","Padrão","Círculo","Ponto","Quadro","Encontrar","Encontrar Anteriores","Localizar Próxima","O conteúdo colado veio de um documento Microsoft Word/Excel. Você deseja manter o formato ou limpa-lo?","Colado do Word Detectado","Limpar","Insira o nome da classe","Pressione Alt para redimensionamento personalizado"]},28359(t){t.exports.default=["Напишите что-либо","О Jodit","Редактор Jodit","Jodit Руководство пользователя","содержит детальную информацию по использованию","Для получения сведений о лицензии , пожалуйста, перейдите на наш сайт:","Купить полную версию","Авторские права © XDSoft.net - Чупурнов Валерий. Все права защищены.","Анкор","Открывать ссылку в новой вкладке","Открыть редактор в полном размере","Очистить форматирование","Цвет заливки или цвет текста","Повтор","Отмена","Жирный","Наклонный","Вставка маркированного списка","Вставить нумерованный список","Выровнять по центру","Выровнять по ширине","Выровнять по левому краю","Выровнять по правому краю","Вставить горизонтальную линию","Вставить изображение","Вставить файл","Вставьте видео","Вставить ссылку","Размер шрифта","Шрифт","Вставить блочный элемент","Нормальный текст","Заголовок 1","Заголовок 2","Заголовок 3","Заголовок 4","Цитата","Код","Вставить","Вставить таблицу","Уменьшить отступ","Увеличить отступ","Выберите специальный символ","Вставить специальный символ","Формат краски","Источник","Отступы","сверху","справа","снизу","слева","Стили","Классы","Выравнивание","По правому краю","По центру","По левому краю","--не устанавливать--","src","Заголовок","Альтернативный текст (alt)","Ссылка","Открывать ссылку в новом окне",null,"Файл","Расширенные","Свойства изображения","Отмена","Ок","Браузер файлов","Ошибка при загрузке списка изображений","Ошибка при загрузке списка директорий","Вы уверены?","Введите название директории","Создать директорию","введите название","Перетащите сюда изображение","Перетащите сюда файл","или нажмите","Альтернативный текст","Загрузка","Сервер","Фон","Текст"," К верху","По середине","К низу","Вставить столбец до","Вставить столбец после","Вставить ряд выше","Вставить ряд ниже","Удалить таблицу","Удалять ряд","Удалить столбец","Очистить ячейку","Символов: %d","Слов: %d","Перечеркнуть","Подчеркивание","верхний индекс","индекс","Вырезать","Выделить все","Разделитель","Найти","Заменить на","Заменить","Вставить","Выбрать контент для вставки","HTML","жирный","курсив","заливка","ссылка","отменить","повторить","таблица","Изображение","очистить","параграф","размер шрифта","видео","шрифт","о редакторе","печать","подчеркнутый","перечеркнутый","отступ","выступ","во весь экран","обычный размер","линия","Список","Нумерованный список","Вырезать","Выделить все","Код","Открыть ссылку","Редактировать ссылку","Атрибут nofollow","Убрать ссылку","Обновить","Редактировать","Просмотр","URL","Редактировать","Горизонтальное выравнивание","Фильтр","По изменению","По имени","По размеру","Добавить папку","Восстановить","Сохранить","Сохранить как","Изменить размер","Обрезать размер","Ширина","Высота","Сохранять пропорции","Да","Нет","Удалить","Выделить","Выделить: %s","Вертикальное выравнивание","Разделить","Объединить в одну","Добавить столбец","Добавить строку","Лицензия: %s","Удалить","Разделить по вертикали","Разделить по горизонтали","Рамка","Ваш текст, который вы пытаетесь вставить похож на HTML. Вставить его как HTML?","Вставить как HTML?","Сохранить оригинал","Вставить как текст","Вставить только текст","Вы можете редактировать только свои собственные изображения. Загрузить это изображение на ваш сервер?","Изображение успешно загружено на сервер!","палитра","В данном каталоге нет файлов","Переименовать","Введите новое имя","Предпросмотр","Скачать","Вставить из буфера обмена","Ваш браузер не поддерживает прямой доступ к буферу обмена.","Скопировать выделенное","копия","Радиус границы","Показать все","Применить","Пожалуйста, заполните это поле","Пожалуйста, введите веб-адрес","По умолчанию","Круг","Точка","Квадрат","Найти","Найти Предыдущие","Найти Далее","Контент который вы вставляете поступает из документа Microsoft Word / Excel. Вы хотите сохранить формат или очистить его?","Возможно это фрагмент Word или Excel","Почистить","Вставить название класса","Нажмите Alt для изменения пользовательского размера"]},68368(t){t.exports.default=["Bir şeyler yaz","Jodit Hakkında","Jodit Editor","Jodit Kullanım Kılavuzu","kullanım için detaylı bilgiler içerir","Lisans hakkında bilgi için lütfen web sitemize gidin:","Tam versiyonunu satın al","Copyright © XDSoft.net - Chupurnov Valeriy. Tüm hakları saklıdır.","Bağlantı","Yeni sekmede aç","Editörü tam ekranda aç","Stili temizle","Renk doldur veya yazı rengi seç","Yinele","Geri Al","Kalın","İtalik","Sırasız Liste Ekle","Sıralı Liste Ekle","Ortala","Kenarlara Yasla","Sola Yasla","Sağa Yasla","Yatay Çizgi Ekle","Resim Ekle","Dosya Ekle","Youtube/Vimeo Videosu Ekle","Bağlantı Ekle","Font Boyutu","Font Ailesi","Blok Ekle","Normal","Başlık 1","Başlık 2","Başlık 3","Başlık 4","Alıntı","Kod","Ekle","Tablo Ekle","Girintiyi Azalt","Girintiyi Arttır","Özel Karakter Seç","Özel Karakter Ekle","Resim Biçimi","Mod Değiştir","Boşluklar","Üst","Sağ","Alt","Sol","CSS Stilleri","CSS Sınıfları","Hizalama","Sağ","Ortalı","Sol","Belirsiz","Kaynak","Başlık","Alternatif Yazı","Link","Bağlantıyı yeni sekmede aç","Resim","Dosya","Gelişmiş","Resim özellikleri","İptal","Tamam","Dosya Listeleyici","Liste yüklenirken hata oluştu","Klasörler yüklenirken hata oluştur","Emin misiniz?","Dizin yolu giriniz","Dizin oluştur","İsim yaz","Resim bırak","Dosya bırak","veya tıkla","Alternatif yazı","Yükle","Gözat","Arka plan","Yazı","Üst","Orta","Aşağı","Öncesine kolon ekle","Sonrasına kolon ekle","Üstüne satır ekle","Altına satır ekle","Tabloyu sil","Satırı sil","Kolonu sil","Hücreyi temizle","Harfler: %d","Kelimeler: %d","Üstü çizili","Alt çizgi","Üst yazı","Alt yazı","Seçilimi kes","Tümünü seç","Satır sonu","Ara","Şununla değiştir","Değiştir","Yapıştır","Yapıştırılacak içerik seç","Kaynak","Kalın","italik","Fırça","Bağlantı","Geri al","Yinele","Tablo","Resim","Silgi","Paragraf","Font boyutu","Video","Font","Hakkında","Yazdır","Alt çizgi","Üstü çizili","Girinti","Çıkıntı","Tam ekran","Küçült","Ayraç","Sırasız liste","Sıralı liste","Kes","Tümünü seç","Kod ekle","Bağlantıyı aç","Bağlantıyı düzenle","Nofollow özelliği","Bağlantıyı kaldır","Güncelle","Düzenlemek için","Yorumu","URL","Düzenle","Yatay hizala","Filtre","Değişime göre sırala","İsme göre sırala","Boyuta göre sırala","Klasör ekle","Sıfırla","Kaydet","Farklı kaydet","Boyutlandır","Kırp","Genişlik","Yükseklik","En boy oranını koru","Evet","Hayır","Sil","Seç","Seç: %s","Dikey hizala","Ayır","Birleştir","Kolon ekle","Satır ekle",null,"Sil","Dikey ayır","Yatay ayır","Kenarlık","Kodunuz HTML koduna benziyor. HTML olarak devam etmek ister misiniz?","HTML olarak yapıştır","Sakla","Yazı olarak ekle","Sadece yazıyı ekle","Sadece kendi resimlerinizi düzenleyebilirsiniz. Bu görseli kendi hostunuza indirmek ister misiniz?","Görsel başarıyla hostunuza yüklendi","Palet","Bu dizinde dosya yok","Yeniden isimlendir","Yeni isim girin","Ön izleme","İndir","Panodan yapıştır ","Tarayıcınız panoya doğrudan erişimi desteklemiyor.","Seçimi kopyala","Kopyala","Sınır yarıçapı","Tümünü Göster","Uygula","Lütfen bu alanı doldurun","Lütfen bir web adresi girin","Varsayılan","Daire","Nokta","Kare","Bul","Öncekini Bul","Sonrakini Bul","Der Inhalt, den Sie einfügen, stammt aus einem Microsoft Word / Excel-Dokument. Möchten Sie das Format erhalten oder löschen?","Word biçiminde yapıştırma algılandı","Temizle","Sınıf adı girin","Özel yeniden boyutlandırma için Alt tuşuna basın"]},25182(t){t.exports.default=["输入一些内容","关于Jodit","Jodit Editor","开发者指南","使用帮助","有关许可证的信息,请访问我们的网站:","购买完整版本","Copyright © XDSoft.net - Chupurnov Valeriy. 版权所有","Anchor","在新窗口打开","全屏编辑","清除样式","颜色","重做","撤销","粗体","斜体","符号列表","编号","居中","对齐文本","左对齐","右对齐","分割线","图片","文件","视频","链接","字号","字体","格式块","默认","标题1","标题2","标题3","标题4","引用","代码","插入","表格","减少缩进","增加缩进","选择特殊符号","特殊符号","格式复制","改变模式","外边距(Margins)","top","right","bottom","left","样式","Classes","对齐方式","居右","居中","居左","无","Src","Title","Alternative","Link","在新窗口打开链接","图片","file","高级","图片属性","取消","确定","文件管理","加载list错误","加载folders错误","你确定吗?","输入路径","创建路径","type name","拖动图片到此","拖动文件到此","或点击","Alternative text","上传","浏览","背景色","文字","顶部","中间","底部","在之前插入列","在之后插入列","在之前插入行","在之后插入行","删除表格","删除行","删除列","清除内容","字符数: %d","单词数: %d","删除线","下划线","上标","下标","剪切","全选","Break","查找","替换为","替换","粘贴","选择内容并粘贴","源码","粗体","斜体","颜色","链接","撤销","重做","表格","图片","橡皮擦","段落","字号","视频","字体","关于","打印","下划线","上出现","增加缩进","减少缩进","全屏","收缩","分割线","无序列表","顺序列表","剪切","全选","嵌入代码","打开链接","编辑链接","No follow","取消链接","更新","铅笔","预览","URL","编辑","水平对齐","筛选","修改时间排序","名称排序","大小排序","新建文件夹","重置","保存","保存为","调整大小","剪切","宽","高","保持长宽比","是","不","移除","选择","选择: %s","垂直对齐","拆分","合并","添加列","添加行",null,"删除","垂直拆分","水平拆分","边框","你粘贴的文本是一段html代码,是否保留源格式","html粘贴","保留源格式","把html代码视为普通文本","只保留文本","你只能编辑你自己的图片。Download this image on the host?","图片上传成功","调色板","此目录中沒有文件。","重命名","输入新名称","预览","下载","粘贴从剪贴板","你浏览器不支持直接访问的剪贴板。","复制选中内容","复制","边界半径","显示所有","应用","请填写这个字段","请输入一个网址","默认","圆圈","点","方形","搜索","查找上一个","查找下一个","正在粘贴 Word/Excel 的文本,是否保留源格式?","文本粘贴","匹配目标格式","插入班级名称","按Alt自定义调整大小"]},44906(t){t.exports.default=["輸入一些內容","關於Jodit","Jodit Editor","開發者指南","使用幫助","相關授權條款資訊,請造訪我們的網站:","購買完整版本","Copyright © XDSoft.net - Chupurnov Valeriy. All rights reserved.","錨點","在新分頁開啟","全螢幕編輯","清除樣式","顏色","取消復原","復原","粗體","斜體","項目符號清單","編號清單","置中","文字對齊","靠左","靠右","分割線","圖片","檔案","插入 youtube/vimeo 影片","插入連結","文字大小","字型","格式化區塊","內文","標題1","標題2","標題3","標題4","引文","程式碼","插入","表格","減少縮排","增加縮排","選擇特殊符號","特殊符號","格式複製","檢視原始碼","邊距","上","右","下","左","樣式","Classes","對齊方式","靠右","置中","靠左","無","Src","Title","替代","Link","在新分頁開啟連結","圖片","檔案","進階","圖片屬性","取消","確定","檔案瀏覽","清單載入錯誤","資料夾載入錯誤","您確定嗎?","輸入路徑","創建路徑","type name","拖曳圖片至此","拖曳檔案至此","或點擊","替代文字","上傳","瀏覽","背景色","文字","頂部","中間","底部","插入左方欄","插入右方欄","插入上方列","插入下方列","刪除表格","刪除整列","刪除整欄","清除內容","字元數: %d","單字數: %d","刪除線","底線","上標","下標","剪下","全選","斷行","尋找","取代為","取代","貼上","選擇內容並貼上","原始碼","粗體","斜體","顏色","連結","復原","取消復原","表格","圖片","橡皮擦","段落","文字大小","影片","字型","關於","列印","底線","刪除線","增加縮排","減少縮排","全螢幕","縮減","分隔線","項目符號清單","編號清單","剪下","全選","嵌入程式碼","打開連結","編輯連結","No follow","取消連結","更新","鉛筆","查看","URL",null,"水平對齊","篩選","修改時間排序","名稱排序","大小排序","新增資料夾","重設","儲存","另存為...","調整大小","裁切","寬","高","維持長寬比","是","否","移除","選擇","選擇: %s","垂直對齊","分割","合併","新增欄","新增列",null,"刪除","垂直分割","水平分割","邊框","您的程式碼與 HTML 類似,是否貼上 HTML 格式?","貼上 HTML","保留原始格式","以純文字貼上","僅貼上內文","您只能編輯您自己的圖片。是否下載此圖片?","圖片上傳成功","調色盤","沒有檔案","重新命名","輸入新名稱","預覽","下載","從剪貼簿貼上","瀏覽器無法存取剪貼簿。","複製已選取項目","複製","邊框圓角","顯示全部","應用","請輸入此欄位","請輸入網址","預設","圓圈","點","方形","尋找","尋找上一個","尋找下一個","正在貼上 Word/Excel 文件的內容,是否保留原始格式?","貼上 Word 格式","清除格式","插入 class 名稱","按住 Alt 以調整自訂大小"]},928(t){t.exports=' '},31230(t){t.exports=' '},54522(t){t.exports=' '},17995(t){t.exports=' '},86634(t){t.exports=' '},91115(t){t.exports=' '},1916(t){t.exports=' '},52450(t){t.exports=' '},41111(t){t.exports=' '},49972(t){t.exports=' '},45062(t){t.exports=' '},18605(t){t.exports=' '},83389(t){t.exports=' '},93267(t){t.exports=' '},71948(t){t.exports=' '},51457(t){t.exports=' '},23602(t){t.exports=' '},86899(t){t.exports=' '},95320(t){t.exports=' '},45674(t){t.exports=' '},3843(t){t.exports=' '},48842(t){t.exports=' '},25501(t){t.exports=' '},29348(t){t.exports=''},24772(t){t.exports=' '},66547(t){t.exports=' '},89097(t){t.exports=' '},64831(t){t.exports=' '},67176(t){t.exports=' '},14017(t){t.exports=' '},38681(t){t.exports=' '},64637(t){t.exports=' '},94190(t){t.exports=' '},51957(t){t.exports=' '},71940(t){t.exports=' '},48007(t){t.exports=' '},43218(t){t.exports=' '},80515(t){t.exports=' '},223(t){t.exports=' '},95032(t){t.exports=' '},73533(t){t.exports=' '},40037(t){t.exports=' '},83207(t){t.exports=' '},59827(t){t.exports=' '},34045(t){t.exports=' '},39199(t){t.exports=' '},21917(t){t.exports=' '},9103(t){t.exports=' '},49989(t){t.exports=' '},81875(t){t.exports=' '},67447(t){t.exports=' '},36339(t){t.exports=' '},88497(t){t.exports=' '},91882(t){t.exports=' '},14305(t){t.exports=' '},58446(t){t.exports=' '},39858(t){t.exports=' '},70881(t){t.exports=' '},60636(t){t.exports=' '},32013(t){t.exports=' '},45512(t){t.exports=' '},80347(t){t.exports=' '},95134(t){t.exports=' '},70697(t){t.exports=' '},49983(t){t.exports=' '},98964(t){t.exports=' '},8136(t){t.exports=' '},94806(t){t.exports=''},31365(t){t.exports=' '},44636(t){t.exports=''},36327(t){t.exports=''},53328(t){t.exports=' '},98711(t){t.exports=' '},53808(t){t.exports=' '},20784(t){t.exports=' '},70999(t){t.exports=' '},45244(t){t.exports=' '},99876(t){t.exports=' '},14006(t){t.exports=' '},28712(t){"use strict";t.exports={assert(){}}},31635(t,e,s){"use strict";function i(t,e,s,i){var r,o=arguments.length,n=3>o?e:null===i?i=Object.getOwnPropertyDescriptor(e,s):i;if("object"==typeof Reflect&&"function"==typeof Reflect.decorate)n=Reflect.decorate(t,e,s,i);else for(var a=t.length-1;a>=0;a--)(r=t[a])&&(n=(3>o?r(n):o>3?r(e,s,n):r(e,s))||n);return o>3&&n&&Object.defineProperty(e,s,n),n}s.d(e,{Cg(){return i}}),"function"==typeof SuppressedError&&SuppressedError}},s={};function i(t){var r=s[t];if(void 0!==r)return r.exports;var o=s[t]={exports:{}};return e[t](o,o.exports,i),o.exports}i.m=e,t=[],i.O=(e,s,r,o)=>{if(!s){var n=1/0;for(u=0;t.length>u;u++){s=t[u][0],r=t[u][1],o=t[u][2];for(var a=!0,l=0;s.length>l;l++)(!1&o||n>=o)&&Object.keys(i.O).every((t=>i.O[t](s[l])))?s.splice(l--,1):(a=!1,n>o&&(n=o));if(a){t.splice(u--,1);var c=r();void 0!==c&&(e=c)}}return e}o=o||0;for(var u=t.length;u>0&&t[u-1][2]>o;u--)t[u]=t[u-1];t[u]=[s,r,o]},i.n=t=>{var e=t&&t.__esModule?()=>t.default:()=>t;return i.d(e,{a:e}),e},i.d=(t,e)=>{for(var s in e)i.o(e,s)&&!i.o(t,s)&&Object.defineProperty(t,s,{enumerable:!0,get:e[s]})},i.o=(t,e)=>Object.prototype.hasOwnProperty.call(t,e),i.r=t=>{"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(t,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(t,"__esModule",{value:!0})},(()=>{var t={521:0};i.O.j=e=>0===t[e];var e=(e,s)=>{var r,o,n=s[0],a=s[1],l=s[2],c=0;if(n.some((e=>0!==t[e]))){for(r in a)i.o(a,r)&&(i.m[r]=a[r]);if(l)var u=l(i)}for(e&&e(s);n.length>c;c++)i.o(t,o=n[c])&&t[o]&&t[o][0](),t[o]=0;return i.O(u)},s=self.webpackChunkjodit=self.webpackChunkjodit||[];s.forEach(e.bind(null,0)),s.push=e.bind(null,s.push.bind(s))})();var r={};return(()=>{"use strict";i.r(r),i.d(r,{CommitMode(){return u},Jodit(){return a.x}});var t=i(9823),e=(i(88222),i(17352)),s=i(22664),o=i(37435),n=i(79721),a=i(46173),l=i(74470);Object.keys(e).forEach((t=>{a.x[t]=e[t]}));const c=t=>"__esModule"!==t;Object.keys(n).filter(c).forEach((t=>{o.Icon.set(t.replace("_","-"),n[t])})),Object.keys(o).filter(c).forEach((e=>{const s=o[e],i=(0,t.Tn)(s.prototype?.className)?s.prototype.className():e;(0,t.Kg)(i)&&(a.x.modules[i]=s)})),Object.keys(s).filter(c).forEach((t=>{a.x.decorators[t]=s[t]})),["Confirm","Alert","Prompt"].forEach((t=>{a.x[t]=o[t]})),Object.keys(l.A).filter(c).forEach((t=>{a.x.lang[t]=l.A[t]}));class u{}})(),i.O(r)}()})); diff --git a/Wino.Mail.WinUI/JS/libs/linkify-element.min.js b/Wino.Mail.WinUI/JS/libs/linkify-element.min.js new file mode 100644 index 00000000..9d639984 --- /dev/null +++ b/Wino.Mail.WinUI/JS/libs/linkify-element.min.js @@ -0,0 +1 @@ +var linkifyElement=function(e){"use strict";const t=1,n=3;function r(e,t,n){let r=n[n.length-1];e.replaceChild(r,t);for(let t=n.length-2;t>=0;t--)e.insertBefore(n[t],r),r=n[t]}function i(e,t,n){const r=[];for(let i=0;i=0)return l;let s=l.firstChild;for(;s;){let d,u,f;switch(s.nodeType){case t:o(s,a,c);break;case n:if(d=s.nodeValue,u=e.tokenize(d),0===u.length||1===u.length&&"text"===u[0].t)break;f=i(u,a,c),r(l,s,f),s=f[f.length-1]}s=s.nextSibling}return l}function l(e){return t=>{let{tagName:n,attributes:r,content:i,eventListeners:o}=t;const l=e.createElement(n);for(const e in r)l.setAttribute(e,r[e]);if(o&&l.addEventListener)for(const e in o)l.addEventListener(e,o[e]);return l.appendChild(e.createTextNode(i)),l}}function a(t,n,r){void 0===n&&(n=null),void 0===r&&(r=null);try{r=r||document||window&&window.document||global&&global.document}catch(e){}if(!r)throw new Error("Cannot find document implementation. If you are in a non-browser environment like Node.js, pass the document implementation as the third argument to linkifyElement.");return o(t,new e.Options(n,l(r)),r)}return a.helper=o,a.getDefaultRender=l,a.normalize=(t,n)=>new e.Options(t,l(n)),a}(linkify); diff --git a/Wino.Mail.WinUI/JS/libs/linkify.min.js b/Wino.Mail.WinUI/JS/libs/linkify.min.js new file mode 100644 index 00000000..088e0362 --- /dev/null +++ b/Wino.Mail.WinUI/JS/libs/linkify.min.js @@ -0,0 +1 @@ +var linkify=function(t){"use strict";const e="aaa1rp3bb0ott3vie4c1le2ogado5udhabi7c0ademy5centure6ountant0s9o1tor4d0s1ult4e0g1ro2tna4f0l1rica5g0akhan5ency5i0g1rbus3force5tel5kdn3l0ibaba4pay4lfinanz6state5y2sace3tom5m0azon4ericanexpress7family11x2fam3ica3sterdam8nalytics7droid5quan4z2o0l2partments8p0le4q0uarelle8r0ab1mco4chi3my2pa2t0e3s0da2ia2sociates9t0hleta5torney7u0ction5di0ble3o3spost5thor3o0s4vianca6w0s2x0a2z0ure5ba0by2idu3namex3narepublic11d1k2r0celona5laycard4s5efoot5gains6seball5ketball8uhaus5yern5b0c1t1va3cg1n2d1e0ats2uty4er2ntley5rlin4st0buy5t2f1g1h0arti5i0ble3d1ke2ng0o3o1z2j1lack0friday9ockbuster8g1omberg7ue3m0s1w2n0pparibas9o0ats3ehringer8fa2m1nd2o0k0ing5sch2tik2on4t1utique6x2r0adesco6idgestone9oadway5ker3ther5ussels7s1t1uild0ers6siness6y1zz3v1w1y1z0h3ca0b1fe2l0l1vinklein9m0era3p2non3petown5ital0one8r0avan4ds2e0er0s4s2sa1e1h1ino4t0ering5holic7ba1n1re3c1d1enter4o1rn3f0a1d2g1h0anel2nel4rity4se2t2eap3intai5ristmas6ome4urch5i0priani6rcle4sco3tadel4i0c2y3k1l0aims4eaning6ick2nic1que6othing5ud3ub0med6m1n1o0ach3des3ffee4llege4ogne5m0cast4mbank4unity6pany2re3uter5sec4ndos3struction8ulting7tact3ractors9oking4l1p2rsica5untry4pon0s4rses6pa2r0edit0card4union9icket5own3s1uise0s6u0isinella9v1w1x1y0mru3ou3z2dabur3d1nce3ta1e1ing3sun4y2clk3ds2e0al0er2s3gree4livery5l1oitte5ta3mocrat6ntal2ist5si0gn4v2hl2iamonds6et2gital5rect0ory7scount3ver5h2y2j1k1m1np2o0cs1tor4g1mains5t1wnload7rive4tv2ubai3nlop4pont4rban5vag2r2z2earth3t2c0o2deka3u0cation8e1g1mail3erck5nergy4gineer0ing9terprises10pson4quipment8r0icsson6ni3s0q1tate5t1u0rovision8s2vents5xchange6pert3osed4ress5traspace10fage2il1rwinds6th3mily4n0s2rm0ers5shion4t3edex3edback6rrari3ero6i0delity5o2lm2nal1nce1ial7re0stone6mdale6sh0ing5t0ness6j1k1lickr3ghts4r2orist4wers5y2m1o0o0d1tball6rd1ex2sale4um3undation8x2r0ee1senius7l1ogans4ntier7tr2ujitsu5n0d2rniture7tbol5yi3ga0l0lery3o1up4me0s3p1rden4y2b0iz3d0n2e0a1nt0ing5orge5f1g0ee3h1i0ft0s3ves2ing5l0ass3e1obal2o4m0ail3bh2o1x2n1odaddy5ld0point6f2o0dyear5g0le4p1t1v2p1q1r0ainger5phics5tis4een3ipe3ocery4up4s1t1u0ardian6cci3ge2ide2tars5ru3w1y2hair2mburg5ngout5us3bo2dfc0bank7ealth0care8lp1sinki6re1mes5iphop4samitsu7tachi5v2k0t2m1n1ockey4ldings5iday5medepot5goods5s0ense7nda3rse3spital5t0ing5t0els3mail5use3w2r1sbc3t1u0ghes5yatt3undai7ibm2cbc2e1u2d1e0ee3fm2kano4l1m0amat4db2mo0bilien9n0c1dustries8finiti5o2g1k1stitute6urance4e4t0ernational10uit4vestments10o1piranga7q1r0ish4s0maili5t0anbul7t0au2v3jaguar4va3cb2e0ep2tzt3welry6io2ll2m0p2nj2o0bs1urg4t1y2p0morgan6rs3uegos4niper7kaufen5ddi3e0rryhotels6logistics9properties14fh2g1h1i0a1ds2m1ndle4tchen5wi3m1n1oeln3matsu5sher5p0mg2n2r0d1ed3uokgroup8w1y0oto4z2la0caixa5mborghini8er3ncaster6d0rover6xess5salle5t0ino3robe5w0yer5b1c1ds2ease3clerc5frak4gal2o2xus4gbt3i0dl2fe0insurance9style7ghting6ke2lly3mited4o2ncoln4k2psy3ve1ing5k1lc1p2oan0s3cker3us3l1ndon4tte1o3ve3pl0financial11r1s1t0d0a3u0ndbeck6xe1ury5v1y2ma0drid4if1son4keup4n0agement7go3p1rket0ing3s4riott5shalls7ttel5ba2c0kinsey7d1e0d0ia3et2lbourne7me1orial6n0u2rckmsd7g1h1iami3crosoft7l1ni1t2t0subishi9k1l0b1s2m0a2n1o0bi0le4da2e1i1m1nash3ey2ster5rmon3tgage6scow4to0rcycles9v0ie4p1q1r1s0d2t0n1r2u0seum3ic4v1w1x1y1z2na0b1goya4me2tura4vy3ba2c1e0c1t0bank4flix4work5ustar5w0s2xt0direct7us4f0l2g0o2hk2i0co2ke1on3nja3ssan1y5l1o0kia3rton4w0ruz3tv4p1r0a1w2tt2u1yc2z2obi1server7ffice5kinawa6layan0group9dnavy5lo3m0ega4ne1g1l0ine5oo2pen3racle3nge4g0anic5igins6saka4tsuka4t2vh3pa0ge2nasonic7ris2s1tners4s1y3y2ccw3e0t2f0izer5g1h0armacy6d1ilips5one2to0graphy6s4ysio5ics1tet2ures6d1n0g1k2oneer5zza4k1l0ace2y0station9umbing5s3m1n0c2ohl2ker3litie5rn2st3r0america6xi3ess3ime3o0d0uctions8f1gressive8mo2perties3y5tection8u0dential9s1t1ub2w0c2y2qa1pon3uebec3st5racing4dio4e0ad1lestate6tor2y4cipes5d0stone5umbrella9hab3ise0n3t2liance6n0t0als5pair3ort3ublican8st0aurant8view0s5xroth6ich0ardli6oh3l1o1p2o0cks3deo3gers4om3s0vp3u0gby3hr2n2w0e2yukyu6sa0arland6fe0ty4kura4le1on3msclub4ung5ndvik0coromant12ofi4p1rl2s1ve2xo3b0i1s2c0a1b1haeffler7midt4olarships8ol3ule3warz5ience5ot3d1e0arch3t2cure1ity6ek2lect4ner3rvices6ven3w1x0y3fr2g1h0angrila6rp2w2ell3ia1ksha5oes2p0ping5uji3w3i0lk2na1gles5te3j1k0i0n2y0pe4l0ing4m0art3ile4n0cf3o0ccer3ial4ftbank4ware6hu2lar2utions7ng1y2y2pa0ce3ort2t3r0l2s1t0ada2ples4r1tebank4farm7c0group6ockholm6rage3e3ream4udio2y3yle4u0cks3pplies3y2ort5rf1gery5zuki5v1watch4iss4x1y0dney4stems6z2tab1ipei4lk2obao4rget4tamotors6r2too4x0i3c0i2d0k2eam2ch0nology8l1masek5nnis4va3f1g1h0d1eater2re6iaa2ckets5enda4ps2res2ol4j0maxx4x2k0maxx5l1m0all4n1o0day3kyo3ols3p1ray3shiba5tal3urs3wn2yota3s3r0ade1ing4ining5vel0ers0insurance16ust3v2t1ube2i1nes3shu4v0s2w1z2ua1bank3s2g1k1nicom3versity8o2ol2ps2s1y1z2va0cations7na1guard7c1e0gas3ntures6risign5mögensberater2ung14sicherung10t2g1i0ajes4deo3g1king4llas4n1p1rgin4sa1ion4va1o3laanderen9n1odka3lvo3te1ing3o2yage5u2wales2mart4ter4ng0gou5tch0es6eather0channel12bcam3er2site5d0ding5ibo2r3f1hoswho6ien2ki2lliamhill9n0dows4e1ners6me2olterskluwer11odside6rk0s2ld3w2s1tc1f3xbox3erox4finity6ihuan4n2xx2yz3yachts4hoo3maxun5ndex5e1odobashi7ga2kohama6u0tube6t1un3za0ppos4ra3ero3ip2m1one3uerich6w2",n="ελ1υ2бг1ел3дети4ею2католик6ом3мкд2он1сква6онлайн5рг3рус2ф2сайт3рб3укр3қаз3հայ3ישראל5קום3ابوظبي5رامكو5لاردن4بحرين5جزائر5سعودية6عليان5مغرب5مارات5یران5بارت2زار4يتك3ھارت5تونس4سودان3رية5شبكة4عراق2ب2مان4فلسطين6قطر3كاثوليك6وم3مصر2ليسيا5وريتانيا7قع4همراه5پاکستان7ڀارت4कॉम3नेट3भारत0म्3ोत5संगठन5বাংলা5ভারত2ৰত4ਭਾਰਤ4ભારત4ଭାରତ4இந்தியா6லங்கை6சிங்கப்பூர்11భారత్5ಭಾರತ4ഭാരതം5ලංකා4คอม3ไทย3ລາວ3გე2みんな3アマゾン4クラウド4グーグル4コム2ストア3セール3ファッション6ポイント4世界2中信1国1國1文网3亚马逊3企业2佛山2信息2健康2八卦2公司1益2台湾1灣2商城1店1标2嘉里0大酒店5在线2大拿2天主教3娱乐2家電2广东2微博2慈善2我爱你3手机2招聘2政务1府2新加坡2闻2时尚2書籍2机构2淡马锡3游戏2澳門2点看2移动2组织机构4网址1店1站1络2联通2谷歌2购物2通販2集团2電訊盈科4飞利浦3食品2餐厅2香格里拉3港2닷넷1컴2삼성2한국2",i=(t,e)=>{for(const n in e)t[n]=e[n];return t},r="numeric",s="ascii",o="alpha",a="asciinumeric",l="alphanumeric",u="domain",c="emoji",g="scheme",d="slashscheme",h="whitespace";function f(t,e){return t in e||(e[t]=[]),e[t]}function p(t,e,n){e[r]&&(e[a]=!0,e[l]=!0),e[s]&&(e[a]=!0,e[o]=!0),e[a]&&(e[l]=!0),e[o]&&(e[l]=!0),e[l]&&(e[u]=!0),e[c]&&(e[u]=!0);for(const i in e){const e=f(i,n);e.indexOf(t)<0&&e.push(t)}}function m(t){void 0===t&&(t=null),this.j={},this.jr=[],this.jd=null,this.t=t}m.groups={},m.prototype={accepts(){return!!this.t},go(t){const e=this,n=e.j[t];if(n)return n;for(let n=0;n=0&&(n[i]=!0);return n}(a.t,r),n);p(o,t,r)}else n&&p(o,n,r);a.t=o}return s.j[t]=a,a}};const y=(t,e,n,i,r)=>t.ta(e,n,i,r),k=(t,e,n,i,r)=>t.tr(e,n,i,r),E=(t,e,n,i,r)=>t.ts(e,n,i,r),b=(t,e,n,i,r)=>t.tt(e,n,i,r),T="WORD",v="UWORD",R="LOCALHOST",A="TLD",L="UTLD",O="SCHEME",C="SLASH_SCHEME",w="NUM",S="WS",j="NL",N="OPENBRACE",x="CLOSEBRACE",I="OPENBRACKET",H="CLOSEBRACKET",P="OPENPAREN",z="CLOSEPAREN",D="OPENANGLEBRACKET",U="CLOSEANGLEBRACKET",M="FULLWIDTHLEFTPAREN",B="FULLWIDTHRIGHTPAREN",K="LEFTCORNERBRACKET",_="RIGHTCORNERBRACKET",Q="LEFTWHITECORNERBRACKET",F="RIGHTWHITECORNERBRACKET",W="FULLWIDTHLESSTHAN",$="FULLWIDTHGREATERTHAN",G="AMPERSAND",q="APOSTROPHE",Y="ASTERISK",J="AT",X="BACKSLASH",V="BACKTICK",Z="CARET",tt="COLON",et="COMMA",nt="DOLLAR",it="DOT",rt="EQUALS",st="EXCLAMATION",ot="HYPHEN",at="PERCENT",lt="PIPE",ut="PLUS",ct="POUND",gt="QUERY",dt="QUOTE",ht="SEMI",ft="SLASH",pt="TILDE",mt="UNDERSCORE",yt="EMOJI",kt="SYM";var Et=Object.freeze({__proto__:null,WORD:T,UWORD:v,LOCALHOST:R,TLD:A,UTLD:L,SCHEME:O,SLASH_SCHEME:C,NUM:w,WS:S,NL:j,OPENBRACE:N,CLOSEBRACE:x,OPENBRACKET:I,CLOSEBRACKET:H,OPENPAREN:P,CLOSEPAREN:z,OPENANGLEBRACKET:D,CLOSEANGLEBRACKET:U,FULLWIDTHLEFTPAREN:M,FULLWIDTHRIGHTPAREN:B,LEFTCORNERBRACKET:K,RIGHTCORNERBRACKET:_,LEFTWHITECORNERBRACKET:Q,RIGHTWHITECORNERBRACKET:F,FULLWIDTHLESSTHAN:W,FULLWIDTHGREATERTHAN:$,AMPERSAND:G,APOSTROPHE:q,ASTERISK:Y,AT:J,BACKSLASH:X,BACKTICK:V,CARET:Z,COLON:tt,COMMA:et,DOLLAR:nt,DOT:it,EQUALS:rt,EXCLAMATION:st,HYPHEN:ot,PERCENT:at,PIPE:lt,PLUS:ut,POUND:ct,QUERY:gt,QUOTE:dt,SEMI:ht,SLASH:ft,TILDE:pt,UNDERSCORE:mt,EMOJI:yt,SYM:kt});const bt=/[a-z]/,Tt=/\p{L}/u,vt=/\p{Emoji}/u,Rt=/\d/,At=/\s/;var Lt=Object.freeze({__proto__:null,ASCII_LETTER:bt,LETTER:Tt,EMOJI:vt,EMOJI_VARIATION:/\ufe0f/,DIGIT:Rt,SPACE:At});const Ot="\n",Ct="️",wt="‍";let St=null,jt=null;function Nt(t){const e=[],n=t.length;let i=0;for(;i56319||i+1===n||(r=t.charCodeAt(i+1))<56320||r>57343?t[i]:t.slice(i,i+2);e.push(o),i+=o.length}return e}function xt(t,e,n,i,r){let s;const o=e.length;for(let n=0;n=0;)r++;if(r>0){e.push(n.join(""));for(let e=parseInt(t.substring(i,i+r),10);e>0;e--)n.pop();i+=r}else n.push(t[i]),i++}return e}const Ht={defaultProtocol:"http",events:null,format:zt,formatHref:zt,nl2br:!1,tagName:"a",target:null,rel:null,validate:!0,truncate:1/0,className:null,attributes:null,ignoreTags:[],render:null};function Pt(t,e){void 0===e&&(e=null);let n=i({},Ht);t&&(n=i(n,t instanceof Pt?t.o:t));const r=n.ignoreTags,s=[];for(let t=0;tt,check(t){return this.get("validate",t.toString(),t)},get(t,e,n){const i=null!=e;let r=this.o[t];return r?("object"==typeof r?(r=n.t in r?r[n.t]:Ht[t],"function"==typeof r&&i&&(r=r(e,n))):"function"==typeof r&&i&&(r=r(e,n.t,n)),r):r},getObj(t,e,n){let i=this.o[t];return"function"==typeof i&&null!=e&&(i=i(e,n.t,n)),i},render(t){const e=t.render(this);return(this.get("render",null,t)||this.defaultRender)(e,t.t,t)}};var Dt=Object.freeze({__proto__:null,defaults:Ht,Options:Pt,assign:i});function Ut(t,e){this.t="token",this.v=t,this.tk=e}function Mt(t,e){class n extends Ut{constructor(e,n){super(e,n),this.t=t}}for(const t in e)n.prototype[t]=e[t];return n.t=t,n}Ut.prototype={isLink:!1,toString(){return this.v},toHref(t){return this.toString()},toFormattedString(t){const e=this.toString(),n=t.get("truncate",e,this),i=t.get("format",e,this);return n&&i.length>n?i.substring(0,n)+"…":i},toFormattedHref(t){return t.get("formatHref",this.toHref(t.get("defaultProtocol")),this)},startIndex(){return this.tk[0].s},endIndex(){return this.tk[this.tk.length-1].e},toObject(t){return void 0===t&&(t=Ht.defaultProtocol),{type:this.t,value:this.toString(),isLink:this.isLink,href:this.toHref(t),start:this.startIndex(),end:this.endIndex()}},toFormattedObject(t){return{type:this.t,value:this.toFormattedString(t),isLink:this.isLink,href:this.toFormattedHref(t),start:this.startIndex(),end:this.endIndex()}},validate(t){return t.get("validate",this.toString(),this)},render(t){const e=this,n=this.toHref(t.get("defaultProtocol")),r=t.get("formatHref",n,this),s=t.get("tagName",n,e),o=this.toFormattedString(t),a={},l=t.get("className",n,e),u=t.get("target",n,e),c=t.get("rel",n,e),g=t.getObj("attributes",n,e),d=t.getObj("events",n,e);return a.href=r,l&&(a.class=l),u&&(a.target=u),c&&(a.rel=c),g&&i(a,g),{tagName:s,attributes:a,content:o,eventListeners:d}}};const Bt=Mt("email",{isLink:!0,toHref(){return"mailto:"+this.toString()}}),Kt=Mt("text"),_t=Mt("nl"),Qt=Mt("url",{isLink:!0,toHref(t){return void 0===t&&(t=Ht.defaultProtocol),this.hasProtocol()?this.v:`${t}://${this.v}`},hasProtocol(){const t=this.tk;return t.length>=2&&t[0].t!==R&&t[1].t===tt}});var Ft=Object.freeze({__proto__:null,MultiToken:Ut,Base:Ut,createTokenClass:Mt,Email:Bt,Text:Kt,Nl:_t,Url:Qt});const Wt=t=>new m(t);function $t(t,e,n){const i=n[0].s,r=n[n.length-1].e;return new t(e.slice(i,r),n)}const Gt="undefined"!=typeof console&&console&&console.warn||(()=>{}),qt="until manual call of linkify.init(). Register all schemes and plugins before invoking linkify the first time.",Yt={scanner:null,parser:null,tokenQueue:[],pluginQueue:[],customSchemes:[],initialized:!1};function Jt(){Yt.scanner=function(t){void 0===t&&(t=[]);const l={};m.groups=l;const f=new m;null==St&&(St=It(e)),null==jt&&(jt=It(n)),b(f,"'",q),b(f,"{",N),b(f,"}",x),b(f,"[",I),b(f,"]",H),b(f,"(",P),b(f,")",z),b(f,"<",D),b(f,">",U),b(f,"(",M),b(f,")",B),b(f,"「",K),b(f,"」",_),b(f,"『",Q),b(f,"』",F),b(f,"<",W),b(f,">",$),b(f,"&",G),b(f,"*",Y),b(f,"@",J),b(f,"`",V),b(f,"^",Z),b(f,":",tt),b(f,",",et),b(f,"$",nt),b(f,".",it),b(f,"=",rt),b(f,"!",st),b(f,"-",ot),b(f,"%",at),b(f,"|",lt),b(f,"+",ut),b(f,"#",ct),b(f,"?",gt),b(f,'"',dt),b(f,"/",ft),b(f,";",ht),b(f,"~",pt),b(f,"_",mt),b(f,"\\",X);const y=k(f,Rt,w,{[r]:!0});k(y,Rt,y);const Lt=k(f,bt,T,{[s]:!0});k(Lt,bt,Lt);const Nt=k(f,Tt,v,{[o]:!0});k(Nt,bt),k(Nt,Tt,Nt);const Ht=k(f,At,S,{[h]:!0});b(f,Ot,j,{[h]:!0}),b(Ht,Ot),k(Ht,At,Ht);const Pt=k(f,vt,yt,{[c]:!0});k(Pt,vt,Pt),b(Pt,Ct,Pt);const zt=b(Pt,wt);k(zt,vt,Pt);const Dt=[[bt,Lt]],Ut=[[bt,null],[Tt,Nt]];for(let t=0;tt[0]>e[0]?1:-1));for(let e=0;e=0?i[u]=!0:bt.test(n)?Rt.test(n)?i[a]=!0:i[s]=!0:i[r]=!0,E(f,n,n,i)}return E(f,"localhost",R,{ascii:!0}),f.jd=new m(kt),{start:f,tokens:i({groups:l},Et)}}(Yt.customSchemes);for(let t=0;t=0&&d++,r++,c++;if(d<0)r-=c,r0&&(s.push($t(Kt,e,o)),o=[]),r-=d,c-=d;const t=g.t,i=n.slice(r-c,r);s.push($t(t,e,i))}}return o.length>0&&s.push($t(Kt,e,o)),s}(Yt.parser.start,t,function(t,e){const n=Nt(e.replace(/[A-Z]/g,(t=>t.toLowerCase()))),i=n.length,r=[];let s=0,o=0;for(;o=0&&(g+=n[o].length,d++),u+=n[o].length,s+=n[o].length,o++;s-=g,o-=d,u-=g,r.push({t:c.t,v:e.slice(s-u,s),s:s-u,e:s})}return r}(Yt.scanner.start,t))}return t.MultiToken=Ut,t.Options=Pt,t.State=m,t.createTokenClass=Mt,t.find=function(t,e,n){if(void 0===e&&(e=null),void 0===n&&(n=null),e&&"object"==typeof e){if(n)throw Error(`linkifyjs: Invalid link type ${e}; must be a string`);n=e,e=null}const i=new Pt(n),r=Xt(t),s=[];for(let t=0;t + + + + + + + + + + + + +
+ + diff --git a/Wino.Mail.WinUI/MainWindow.xaml b/Wino.Mail.WinUI/MainWindow.xaml new file mode 100644 index 00000000..126da732 --- /dev/null +++ b/Wino.Mail.WinUI/MainWindow.xaml @@ -0,0 +1,17 @@ + + + + + + + + + diff --git a/Wino.Mail.WinUI/MainWindow.xaml.cs b/Wino.Mail.WinUI/MainWindow.xaml.cs new file mode 100644 index 00000000..88396eee --- /dev/null +++ b/Wino.Mail.WinUI/MainWindow.xaml.cs @@ -0,0 +1,29 @@ +using System; +using System.Collections.Generic; +using System.IO; +using System.Linq; +using System.Runtime.InteropServices.WindowsRuntime; +using Microsoft.UI.Xaml; +using Microsoft.UI.Xaml.Controls; +using Microsoft.UI.Xaml.Controls.Primitives; +using Microsoft.UI.Xaml.Data; +using Microsoft.UI.Xaml.Input; +using Microsoft.UI.Xaml.Media; +using Microsoft.UI.Xaml.Navigation; +using Windows.Foundation; +using Windows.Foundation.Collections; + +// To learn more about WinUI, the WinUI project structure, +// and more about our project templates, see: http://aka.ms/winui-project-info. + +namespace Wino.Mail.WinUI; +/// +/// An empty window that can be used on its own or navigated to within a Frame. +/// +public sealed partial class MainWindow : Window +{ + public MainWindow() + { + InitializeComponent(); + } +} diff --git a/Wino.Mail.WinUI/MenuFlyouts/AccountSelectorFlyout.cs b/Wino.Mail.WinUI/MenuFlyouts/AccountSelectorFlyout.cs new file mode 100644 index 00000000..ae840700 --- /dev/null +++ b/Wino.Mail.WinUI/MenuFlyouts/AccountSelectorFlyout.cs @@ -0,0 +1,58 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Threading.Tasks; +using Microsoft.UI.Xaml.Controls; +using Wino.Core.Domain.Entities.Shared; +using Wino.Core.UWP.Controls; +using Wino.Helpers; + +namespace Wino.MenuFlyouts; + +public partial class AccountSelectorFlyout : MenuFlyout, IDisposable +{ + private readonly IEnumerable _accounts; + private readonly Func _onItemSelection; + + public AccountSelectorFlyout(IEnumerable accounts, Func onItemSelection) + { + _accounts = accounts; + _onItemSelection = onItemSelection; + + foreach (var account in _accounts) + { + var pathData = new WinoFontIcon() { Icon = XamlHelpers.GetProviderIcon(account) }; + var menuItem = new MenuFlyoutItem() { Tag = account.Address, Icon = pathData, Text = $"{account.Name} ({account.Address})", MinHeight = 55 }; + + menuItem.Click += AccountClicked; + Items.Add(menuItem); + } + } + + public void Dispose() + { + foreach (var menuItem in Items) + { + if (menuItem is MenuFlyoutItem flyoutItem) + { + flyoutItem.Click -= AccountClicked; + } + } + } + + private async void AccountClicked(object sender, Microsoft.UI.Xaml.RoutedEventArgs e) + { + if (sender is MenuFlyoutItem menuItem && menuItem.Tag is string accountAddress) + { + var selectedMenuItem = _accounts.FirstOrDefault(a => a.Address == accountAddress); + + if (selectedMenuItem != null) + { + await _onItemSelection(selectedMenuItem); + } + } + + Dispose(); + Hide(); + } +} diff --git a/Wino.Mail.WinUI/MenuFlyouts/FilterMenuFlyout.cs b/Wino.Mail.WinUI/MenuFlyouts/FilterMenuFlyout.cs new file mode 100644 index 00000000..9b8f920c --- /dev/null +++ b/Wino.Mail.WinUI/MenuFlyouts/FilterMenuFlyout.cs @@ -0,0 +1,220 @@ +using System.Collections.Generic; +using System.Linq; +using CommunityToolkit.Mvvm.Input; +using Microsoft.UI.Xaml; +using Microsoft.UI.Xaml.Controls; +using Wino.Core.Domain.Models.Reader; +using Wino.Core.UWP.Controls; +using Wino.Helpers; + +namespace Wino.MenuFlyouts; + +public partial class FilterMenuFlyout : MenuFlyout +{ + public static readonly DependencyProperty SelectedFilterChangedCommandProperty = DependencyProperty.Register(nameof(SelectedFilterChangedCommand), typeof(IRelayCommand), typeof(FilterMenuFlyout), new PropertyMetadata(null)); + public static readonly DependencyProperty FilterOptionsProperty = DependencyProperty.Register(nameof(FilterOptions), typeof(List), typeof(FilterMenuFlyout), new PropertyMetadata(null, new PropertyChangedCallback(OnOptionsChanged))); + public static readonly DependencyProperty SelectedFilterOptionProperty = DependencyProperty.Register(nameof(SelectedFilterOption), typeof(FilterOption), typeof(FilterMenuFlyout), new PropertyMetadata(null, OnSelectedFilterOptionChanged)); + public static readonly DependencyProperty SelectedSortingOptionProperty = DependencyProperty.Register(nameof(SelectedSortingOption), typeof(SortingOption), typeof(FilterMenuFlyout), new PropertyMetadata(null, new PropertyChangedCallback(OnSelectedSortingOptionChanged))); + public static readonly DependencyProperty SortingOptionsProperty = DependencyProperty.Register(nameof(SortingOptions), typeof(List), typeof(FilterMenuFlyout), new PropertyMetadata(null, new PropertyChangedCallback(OnOptionsChanged))); + public static readonly DependencyProperty SelectedSortingOptionChangedCommandProperty = DependencyProperty.Register(nameof(SelectedSortingOptionChangedCommand), typeof(IRelayCommand), typeof(FilterMenuFlyout), new PropertyMetadata(null)); + + public IRelayCommand SelectedFilterChangedCommand + { + get { return (IRelayCommand)GetValue(SelectedFilterChangedCommandProperty); } + set { SetValue(SelectedFilterChangedCommandProperty, value); } + } + + public IRelayCommand SelectedSortingOptionChangedCommand + { + get { return (IRelayCommand)GetValue(SelectedSortingOptionChangedCommandProperty); } + set { SetValue(SelectedSortingOptionChangedCommandProperty, value); } + } + + public List FilterOptions + { + get { return (List)GetValue(FilterOptionsProperty); } + set { SetValue(FilterOptionsProperty, value); } + } + + public List SortingOptions + { + get { return (List)GetValue(SortingOptionsProperty); } + set { SetValue(SortingOptionsProperty, value); } + } + + public FilterOption SelectedFilterOption + { + get { return (FilterOption)GetValue(SelectedFilterOptionProperty); } + set { SetValue(SelectedFilterOptionProperty, value); } + } + + public SortingOption SelectedSortingOption + { + get { return (SortingOption)GetValue(SelectedSortingOptionProperty); } + set { SetValue(SelectedSortingOptionProperty, value); } + } + + private static void OnSelectedFilterOptionChanged(DependencyObject obj, DependencyPropertyChangedEventArgs args) + { + if (obj is FilterMenuFlyout bar) + { + bar.SelectFilterOption(bar.SelectedFilterOption); + bar.SelectedFilterChangedCommand?.Execute(bar.SelectedFilterOption); + } + } + + private static void OnSelectedSortingOptionChanged(DependencyObject obj, DependencyPropertyChangedEventArgs args) + { + if (obj is FilterMenuFlyout bar) + { + bar.SelectSortingOption(bar.SelectedSortingOption); + bar.SelectedSortingOptionChangedCommand?.Execute(bar.SelectedSortingOption); + } + } + + private ToggleMenuFlyoutItem CreateFilterToggleButton(FilterOption option) + { + var button = new ToggleMenuFlyoutItem() + { + Text = option.Title, + Tag = option, + Icon = new WinoFontIcon() { Icon = XamlHelpers.GetWinoIconGlyph(option.Type) }, + IsChecked = option == SelectedFilterOption + }; + + button.Click += FilterToggleChecked; + + return button; + } + + private ToggleMenuFlyoutItem CreateSortingToggleButton(SortingOption option) + { + var button = new ToggleMenuFlyoutItem() + { + Text = option.Title, + Tag = option, + Icon = new WinoFontIcon() { Icon = XamlHelpers.GetWinoIconGlyph(option.Type)}, + IsChecked = option == SelectedSortingOption + }; + + button.Click += SortingOptionChecked; + + return button; + } + + private void SortingOptionChecked(object sender, RoutedEventArgs e) + { + if (sender is ToggleMenuFlyoutItem button) + { + button.IsHitTestVisible = false; + + var optionModel = button.Tag as SortingOption; + + SelectSortingOption(optionModel); + } + } + + + + private void FilterToggleChecked(object sender, RoutedEventArgs e) + { + if (sender is ToggleMenuFlyoutItem button) + { + button.IsHitTestVisible = false; + + var optionModel = button.Tag as FilterOption; + + SelectFilterOption(optionModel); + } + } + + private void SelectFilterOption(FilterOption option) + { + SelectedFilterOption = option; + + UncheckOtherFilterOptions(); + } + + private void SelectSortingOption(SortingOption option) + { + SelectedSortingOption = option; + + UncheckOtherSortingOptions(); + } + + private void UnregisterCheckedHandler(ToggleMenuFlyoutItem button) + { + button.Click -= FilterToggleChecked; + } + + private void UncheckOtherFilterOptions() + { + if (Items.Any()) + { + foreach (var item in Items) + { + if (item is ToggleMenuFlyoutItem toggleButton && toggleButton.Tag is FilterOption option && option != SelectedFilterOption) + { + toggleButton.IsChecked = false; + toggleButton.IsHitTestVisible = true; + } + } + } + } + + private void UncheckOtherSortingOptions() + { + if (Items.Any()) + { + foreach (var item in Items) + { + if (item is ToggleMenuFlyoutItem toggleButton && toggleButton.Tag is SortingOption option && option != SelectedSortingOption) + { + toggleButton.IsChecked = false; + toggleButton.IsHitTestVisible = true; + } + } + } + } + + public void Dispose() + { + foreach (var item in Items) + { + if (item is ToggleMenuFlyoutItem toggleButton) + { + UnregisterCheckedHandler(toggleButton); + } + } + } + + private static void OnOptionsChanged(DependencyObject obj, DependencyPropertyChangedEventArgs args) + { + if (obj is FilterMenuFlyout bar && bar.SortingOptions != null && bar.FilterOptions != null) + { + bar.Dispose(); + + bar.Items.Clear(); + + if (bar.FilterOptions != null) + { + foreach (var item in bar.FilterOptions) + { + bar.Items.Add(bar.CreateFilterToggleButton(item)); + } + } + + bar.Items.Add(new MenuFlyoutSeparator()); + + // Sorting options. + + if (bar.SortingOptions != null) + { + foreach (var item in bar.SortingOptions) + { + bar.Items.Add(bar.CreateSortingToggleButton(item)); + } + } + } + } +} diff --git a/Wino.Mail.WinUI/MenuFlyouts/FolderOperationFlyout.cs b/Wino.Mail.WinUI/MenuFlyouts/FolderOperationFlyout.cs new file mode 100644 index 00000000..4c8a0aa6 --- /dev/null +++ b/Wino.Mail.WinUI/MenuFlyouts/FolderOperationFlyout.cs @@ -0,0 +1,27 @@ +using System.Collections.Generic; +using System.Threading.Tasks; +using Microsoft.UI.Xaml.Controls; +using Wino.Core.Domain.Enums; +using Wino.Core.Domain.Models.Folders; + +namespace Wino.MenuFlyouts.Context; + +public partial class FolderOperationFlyout : WinoOperationFlyout +{ + public FolderOperationFlyout(IEnumerable availableActions, TaskCompletionSource completionSource) : base(availableActions, completionSource) + { + if (AvailableActions == null) return; + + foreach (var action in AvailableActions) + { + if (action.Operation == FolderOperation.Seperator) + Items.Add(new MenuFlyoutSeparator()); + else + { + var menuFlyoutItem = new FolderOperationMenuFlyoutItem(action, (c) => MenuItemClicked(c)); + + Items.Add(menuFlyoutItem); + } + } + } +} diff --git a/Wino.Mail.WinUI/MenuFlyouts/FolderOperationMenuFlyoutItem.cs b/Wino.Mail.WinUI/MenuFlyouts/FolderOperationMenuFlyoutItem.cs new file mode 100644 index 00000000..f7731c72 --- /dev/null +++ b/Wino.Mail.WinUI/MenuFlyouts/FolderOperationMenuFlyoutItem.cs @@ -0,0 +1,11 @@ +using System; +using Wino.Core.Domain.Models.Folders; + +namespace Wino.MenuFlyouts; + +public partial class FolderOperationMenuFlyoutItem : WinoOperationFlyoutItem +{ + public FolderOperationMenuFlyoutItem(FolderOperationMenuItem operationMenuItem, Action clicked) : base(operationMenuItem, clicked) + { + } +} diff --git a/Wino.Mail.WinUI/MenuFlyouts/MailOperationFlyout.cs b/Wino.Mail.WinUI/MenuFlyouts/MailOperationFlyout.cs new file mode 100644 index 00000000..97080451 --- /dev/null +++ b/Wino.Mail.WinUI/MenuFlyouts/MailOperationFlyout.cs @@ -0,0 +1,27 @@ +using System.Collections.Generic; +using System.Threading.Tasks; +using Microsoft.UI.Xaml.Controls; +using Wino.Core.Domain.Enums; +using Wino.Core.Domain.Models.Menus; + +namespace Wino.MenuFlyouts.Context; + +public partial class MailOperationFlyout : WinoOperationFlyout +{ + public MailOperationFlyout(IEnumerable availableActions, TaskCompletionSource completionSource) : base(availableActions, completionSource) + { + if (AvailableActions == null) return; + + foreach (var action in AvailableActions) + { + if (action.Operation == MailOperation.Seperator) + Items.Add(new MenuFlyoutSeparator()); + else + { + var menuFlyoutItem = new MailOperationMenuFlyoutItem(action, (c) => MenuItemClicked(c)); + + Items.Add(menuFlyoutItem); + } + } + } +} diff --git a/Wino.Mail.WinUI/MenuFlyouts/MailOperationMenuFlyoutItem.cs b/Wino.Mail.WinUI/MenuFlyouts/MailOperationMenuFlyoutItem.cs new file mode 100644 index 00000000..aebedbc9 --- /dev/null +++ b/Wino.Mail.WinUI/MenuFlyouts/MailOperationMenuFlyoutItem.cs @@ -0,0 +1,11 @@ +using System; +using Wino.Core.Domain.Models.Menus; + +namespace Wino.MenuFlyouts.Context; + +public partial class MailOperationMenuFlyoutItem : WinoOperationFlyoutItem +{ + public MailOperationMenuFlyoutItem(MailOperationMenuItem operationMenuItem, Action clicked) : base(operationMenuItem, clicked) + { + } +} diff --git a/Wino.Mail.WinUI/MenuFlyouts/MoveButtonFlyout.cs b/Wino.Mail.WinUI/MenuFlyouts/MoveButtonFlyout.cs new file mode 100644 index 00000000..0352f096 --- /dev/null +++ b/Wino.Mail.WinUI/MenuFlyouts/MoveButtonFlyout.cs @@ -0,0 +1,87 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using Windows.Foundation; +using Microsoft.UI.Xaml; +using Microsoft.UI.Xaml.Controls; +using Wino.Core.Domain.Entities.Mail; + +namespace Wino.MenuFlyouts; + +public class MoveButtonMenuItemClickedEventArgs +{ + public Guid ClickedFolderId { get; set; } +} + +public partial class MoveButtonFlyout : MenuFlyout +{ + public event TypedEventHandler MenuItemClick; + public static readonly DependencyProperty FoldersProperty = DependencyProperty.Register(nameof(Folders), typeof(List), typeof(MoveButtonFlyout), new PropertyMetadata(null, new PropertyChangedCallback(OnFoldersChanged))); + + public List Folders + { + get { return (List)GetValue(FoldersProperty); } + set { SetValue(FoldersProperty, value); } + } + + private static void OnFoldersChanged(DependencyObject obj, DependencyPropertyChangedEventArgs args) + { + if (obj is MoveButtonFlyout menu) + { + menu.InitializeMenu(); + } + + + } + + private void InitializeMenu() + { + Dispose(); + + Items.Clear(); + + if (Folders == null || !Folders.Any()) + return; + + // TODO: Child folders. + + foreach (var item in Folders) + { + // We don't expect this, but it crashes startup. + // Just to be on the safe side. + if (item.FolderName != null) + { + var folderMenuItem = new MenuFlyoutItem() + { + Tag = item, + Text = item.FolderName + }; + + folderMenuItem.Click += MenuItemClicked; + + Items.Add(folderMenuItem); + } + } + } + + private void MenuItemClicked(object sender, RoutedEventArgs e) + { + var clickedFolder = (sender as MenuFlyoutItem).Tag as MailItemFolder; + + MenuItemClick?.Invoke(this, new MoveButtonMenuItemClickedEventArgs() + { + ClickedFolderId = clickedFolder.Id + }); + } + + public void Dispose() + { + foreach (var item in Items) + { + if (item is MenuFlyoutItem menuItem) + { + menuItem.Click -= MenuItemClicked; + } + } + } +} diff --git a/Wino.Mail.WinUI/MenuFlyouts/WinoOperationFlyout.cs b/Wino.Mail.WinUI/MenuFlyouts/WinoOperationFlyout.cs new file mode 100644 index 00000000..19420781 --- /dev/null +++ b/Wino.Mail.WinUI/MenuFlyouts/WinoOperationFlyout.cs @@ -0,0 +1,49 @@ +using System; +using System.Collections.Generic; +using System.Threading.Tasks; +using Microsoft.UI.Xaml.Controls; + +namespace Wino.MenuFlyouts; + +public partial class WinoOperationFlyout : MenuFlyout, IDisposable where TActionType : class +{ + public TActionType ClickedOperation { get; set; } + + protected readonly IEnumerable AvailableActions; + + private readonly TaskCompletionSource _completionSource; + + public WinoOperationFlyout(IEnumerable availableActions, TaskCompletionSource completionSource) + { + _completionSource = completionSource; + + AvailableActions = availableActions; + + Closing += FlyoutClosing; + } + + private void FlyoutClosing(Microsoft.UI.Xaml.Controls.Primitives.FlyoutBase sender, Microsoft.UI.Xaml.Controls.Primitives.FlyoutBaseClosingEventArgs args) + { + Closing -= FlyoutClosing; + + _completionSource.TrySetResult(ClickedOperation); + } + + protected void MenuItemClicked(TActionType operation) + { + ClickedOperation = operation; + + Hide(); + } + + public void Dispose() + { + foreach (var item in Items) + { + if (item is IDisposable disposableItem) + { + disposableItem.Dispose(); + } + } + } +} diff --git a/Wino.Mail.WinUI/MenuFlyouts/WinoOperationFlyoutItem.cs b/Wino.Mail.WinUI/MenuFlyouts/WinoOperationFlyoutItem.cs new file mode 100644 index 00000000..a540f780 --- /dev/null +++ b/Wino.Mail.WinUI/MenuFlyouts/WinoOperationFlyoutItem.cs @@ -0,0 +1,49 @@ +using System; +using Microsoft.UI.Xaml.Controls; +using Wino.Core.Domain.Interfaces; +using Wino.Core.Domain.Models.Folders; +using Wino.Core.Domain.Models.Menus; +using Wino.Core.UWP.Controls; +using Wino.Helpers; + +namespace Wino.MenuFlyouts; + +public partial class WinoOperationFlyoutItem : MenuFlyoutItem, IDisposable where TOperationMenuItem : IMenuOperation +{ + public TOperationMenuItem Operation { get; set; } + Action Clicked { get; set; } + + public WinoOperationFlyoutItem(TOperationMenuItem operationMenuItem, Action clicked) + { + Operation = operationMenuItem; + IsEnabled = operationMenuItem.IsEnabled; + + if (Operation is FolderOperationMenuItem folderOperationMenuItem) + { + var internalOperation = folderOperationMenuItem.Operation; + + Icon = new WinoFontIcon() { Icon = XamlHelpers.GetPathGeometry(internalOperation) }; + Text = XamlHelpers.GetOperationString(internalOperation); + } + else if (Operation is MailOperationMenuItem mailOperationMenuItem) + { + var internalOperation = mailOperationMenuItem.Operation; + + Icon = new WinoFontIcon() { Icon = XamlHelpers.GetWinoIconGlyph(internalOperation) }; + Text = XamlHelpers.GetOperationString(internalOperation); + } + + Clicked = clicked; + Click += MenuClicked; + } + + private void MenuClicked(object sender, Microsoft.UI.Xaml.RoutedEventArgs e) + { + Clicked(Operation); + } + + public void Dispose() + { + Click -= MenuClicked; + } +} diff --git a/Wino.Mail.WinUI/Package.appxmanifest b/Wino.Mail.WinUI/Package.appxmanifest new file mode 100644 index 00000000..c511808c --- /dev/null +++ b/Wino.Mail.WinUI/Package.appxmanifest @@ -0,0 +1,84 @@ + + + + + + + + + + + + + + + + + + + Wino Mail (Preview) + Burak KÖSE + Assets\StoreLogo.png + + + + + + + + + + + + + + + + + + + + + + + + + + + + Google Auth Protocol + + + + + + + EML\eml.png + + .eml + + + + + + + + + + + diff --git a/Wino.Mail.WinUI/Properties/launchSettings.json b/Wino.Mail.WinUI/Properties/launchSettings.json new file mode 100644 index 00000000..8d2cf66c --- /dev/null +++ b/Wino.Mail.WinUI/Properties/launchSettings.json @@ -0,0 +1,10 @@ +{ + "profiles": { + "Wino.Mail.WinUI (Package)": { + "commandName": "MsixPackage" + }, + "Wino.Mail.WinUI (Unpackaged)": { + "commandName": "Project" + } + } +} \ No newline at end of file diff --git a/Wino.Mail.WinUI/Selectors/AccountProviderViewModelTemplateSelector.cs b/Wino.Mail.WinUI/Selectors/AccountProviderViewModelTemplateSelector.cs new file mode 100644 index 00000000..91ede6e0 --- /dev/null +++ b/Wino.Mail.WinUI/Selectors/AccountProviderViewModelTemplateSelector.cs @@ -0,0 +1,19 @@ +using Microsoft.UI.Xaml; +using Microsoft.UI.Xaml.Controls; +using Wino.Core.ViewModels.Data; + +namespace Wino.Selectors; + +public partial class AccountProviderViewModelTemplateSelector : DataTemplateSelector +{ + public DataTemplate RootAccountTemplate { get; set; } + public DataTemplate MergedAccountTemplate { get; set; } + + protected override DataTemplate SelectTemplateCore(object item, DependencyObject container) + { + if (item is MergedAccountProviderDetailViewModel) + return MergedAccountTemplate; + else + return RootAccountTemplate; + } +} diff --git a/Wino.Mail.WinUI/Selectors/AccountReorderTemplateSelector.cs b/Wino.Mail.WinUI/Selectors/AccountReorderTemplateSelector.cs new file mode 100644 index 00000000..e4f5187e --- /dev/null +++ b/Wino.Mail.WinUI/Selectors/AccountReorderTemplateSelector.cs @@ -0,0 +1,21 @@ +using Microsoft.UI.Xaml; +using Microsoft.UI.Xaml.Controls; +using Wino.Core.ViewModels.Data; + +namespace Wino.Selectors; + +public partial class AccountReorderTemplateSelector : DataTemplateSelector +{ + public DataTemplate MergedAccountReorderTemplate { get; set; } + public DataTemplate RootAccountReorderTemplate { get; set; } + + protected override DataTemplate SelectTemplateCore(object item, DependencyObject container) + { + if (item is MergedAccountProviderDetailViewModel) + { + return MergedAccountReorderTemplate; + } + + return RootAccountReorderTemplate; + } +} diff --git a/Wino.Mail.WinUI/Selectors/MailItemContainerStyleSelector.cs b/Wino.Mail.WinUI/Selectors/MailItemContainerStyleSelector.cs new file mode 100644 index 00000000..e4af3ead --- /dev/null +++ b/Wino.Mail.WinUI/Selectors/MailItemContainerStyleSelector.cs @@ -0,0 +1,18 @@ +using Microsoft.UI.Xaml; +using Microsoft.UI.Xaml.Controls; +using Wino.Mail.ViewModels.Data; + +namespace Wino.Selectors; + +public partial class MailItemContainerStyleSelector : StyleSelector +{ + public Style Thread { get; set; } + + protected override Style SelectStyleCore(object item, DependencyObject container) + { + if (item is ThreadMailItemViewModel) + return Thread; + else + return base.SelectStyleCore(item, container); + } +} diff --git a/Wino.Mail.WinUI/Selectors/MailItemDisplayModePreviewTemplateSelector.cs b/Wino.Mail.WinUI/Selectors/MailItemDisplayModePreviewTemplateSelector.cs new file mode 100644 index 00000000..eef9d981 --- /dev/null +++ b/Wino.Mail.WinUI/Selectors/MailItemDisplayModePreviewTemplateSelector.cs @@ -0,0 +1,33 @@ +using Microsoft.UI.Xaml; +using Microsoft.UI.Xaml.Controls; +using Wino.Core.Domain.Enums; + +namespace Wino.Selectors; + +/// +/// Template selector for previewing mail item display modes in Settings->Personalization page. +/// +public partial class MailItemDisplayModePreviewTemplateSelector : DataTemplateSelector +{ + public DataTemplate CompactTemplate { get; set; } + public DataTemplate MediumTemplate { get; set; } + public DataTemplate SpaciousTemplate { get; set; } + + protected override DataTemplate SelectTemplateCore(object item, DependencyObject container) + { + if (item is MailListDisplayMode mode) + { + switch (mode) + { + case MailListDisplayMode.Spacious: + return SpaciousTemplate; + case MailListDisplayMode.Medium: + return MediumTemplate; + case MailListDisplayMode.Compact: + return CompactTemplate; + } + } + + return base.SelectTemplateCore(item, container); + } +} diff --git a/Wino.Mail.WinUI/Selectors/MailItemDisplaySelector.cs b/Wino.Mail.WinUI/Selectors/MailItemDisplaySelector.cs new file mode 100644 index 00000000..2ada9055 --- /dev/null +++ b/Wino.Mail.WinUI/Selectors/MailItemDisplaySelector.cs @@ -0,0 +1,21 @@ +using Microsoft.UI.Xaml; +using Microsoft.UI.Xaml.Controls; +using Wino.Mail.ViewModels.Data; + +namespace Wino.Selectors; + +public partial class MailItemDisplaySelector : DataTemplateSelector +{ + public DataTemplate SingleMailItemTemplate { get; set; } + public DataTemplate ThreadMailItemTemplate { get; set; } + + protected override DataTemplate SelectTemplateCore(object item, DependencyObject container) + { + if (item is MailItemViewModel) + return SingleMailItemTemplate; + else if (item is ThreadMailItemViewModel) + return ThreadMailItemTemplate; + + return base.SelectTemplateCore(item, container); + } +} diff --git a/Wino.Mail.WinUI/Services/DialogService.cs b/Wino.Mail.WinUI/Services/DialogService.cs new file mode 100644 index 00000000..7a28db30 --- /dev/null +++ b/Wino.Mail.WinUI/Services/DialogService.cs @@ -0,0 +1,195 @@ +using System; +using System.Collections.Generic; +using System.Collections.ObjectModel; +using System.Threading.Tasks; +using CommunityToolkit.Mvvm.Messaging; +using Microsoft.UI.Xaml; +using Microsoft.UI.Xaml.Controls; +using Wino.Core.Domain; +using Wino.Core.Domain.Entities.Mail; +using Wino.Core.Domain.Entities.Shared; +using Wino.Core.Domain.Enums; +using Wino.Core.Domain.Interfaces; +using Wino.Core.Domain.Models.Accounts; +using Wino.Core.Domain.Models.Folders; +using Wino.Core.Domain.Models.Synchronization; +using Wino.Core.UWP.Extensions; +using Wino.Core.UWP.Services; +using Wino.Dialogs; +using Wino.Mail.Dialogs; +using Wino.Messaging.Server; +using Wino.Messaging.UI; + +namespace Wino.Services; + +public class DialogService : DialogServiceBase, IMailDialogService +{ + public DialogService(IThemeService themeService, + IConfigurationService configurationService, + IApplicationResourceManager applicationResourceManager) : base(themeService, configurationService, applicationResourceManager) + { + + } + + public override IAccountCreationDialog GetAccountCreationDialog(AccountCreationDialogResult accountCreationDialogResult) + { + if (accountCreationDialogResult.SpecialImapProviderDetails == null) + { + if (accountCreationDialogResult.ProviderType == MailProviderType.IMAP4) + { + return new NewImapSetupDialog + { + RequestedTheme = ThemeService.RootTheme.ToWindowsElementTheme() + }; + } + else + { + return base.GetAccountCreationDialog(accountCreationDialogResult); + } + } + else + { + // Special IMAP provider like iCloud or Yahoo. + + return base.GetAccountCreationDialog(accountCreationDialogResult); + } + } + + + public async Task ShowCreateAccountAliasDialogAsync() + { + var createAccountAliasDialog = new CreateAccountAliasDialog() + { + RequestedTheme = ThemeService.RootTheme.ToWindowsElementTheme() + }; + + await HandleDialogPresentationAsync(createAccountAliasDialog); + + return createAccountAliasDialog; + } + + public async Task HandleSystemFolderConfigurationDialogAsync(Guid accountId, IFolderService folderService) + { + try + { + var configurableFolder = await folderService.GetFoldersAsync(accountId); + + var systemFolderConfigurationDialog = new SystemFolderConfigurationDialog(configurableFolder) + { + RequestedTheme = ThemeService.RootTheme.ToWindowsElementTheme() + }; + + await HandleDialogPresentationAsync(systemFolderConfigurationDialog); + + var configuration = systemFolderConfigurationDialog.Configuration; + + if (configuration != null) + { + await folderService.UpdateSystemFolderConfigurationAsync(accountId, configuration); + + InfoBarMessage(Translator.SystemFolderConfigSetupSuccess_Title, Translator.SystemFolderConfigSetupSuccess_Message, InfoBarMessageType.Success); + + WeakReferenceMessenger.Default.Send(new AccountFolderConfigurationUpdated(accountId)); + + var options = new MailSynchronizationOptions() + { + AccountId = accountId, + Type = MailSynchronizationType.FullFolders, + }; + + WeakReferenceMessenger.Default.Send(new NewMailSynchronizationRequested(options, SynchronizationSource.Client)); + } + } + catch (Exception ex) + { + InfoBarMessage(Translator.Error_FailedToSetupSystemFolders_Title, ex.Message, InfoBarMessageType.Error); + } + } + + public async Task ShowMoveMailFolderDialogAsync(List availableFolders) + { + var moveDialog = new MoveMailDialog(availableFolders) + { + RequestedTheme = ThemeService.RootTheme.ToWindowsElementTheme() + }; + + await HandleDialogPresentationAsync(moveDialog); + + return moveDialog.SelectedFolder; + } + + public async Task PickFolderAsync(Guid accountId, PickFolderReason reason, IFolderService folderService) + { + var allFolders = await folderService.GetFolderStructureForAccountAsync(accountId, true); + + return await ShowMoveMailFolderDialogAsync(allFolders.Folders); + } + + + + public Task ShowHardDeleteConfirmationAsync() + => ShowWinoCustomMessageDialogAsync(Translator.DialogMessage_HardDeleteConfirmationMessage, + Translator.DialogMessage_HardDeleteConfirmationTitle, + Translator.Buttons_Yes, + WinoCustomMessageDialogIcon.Warning, + Translator.Buttons_No); + + public async Task ShowAccountPickerDialogAsync(List availableAccounts) + { + var accountPicker = new AccountPickerDialog(availableAccounts) + { + RequestedTheme = ThemeService.RootTheme.ToWindowsElementTheme() + }; + + await HandleDialogPresentationAsync(accountPicker); + + return accountPicker.PickedAccount; + } + + public async Task ShowSignatureEditorDialog(AccountSignature signatureModel = null) + { + SignatureEditorDialog signatureEditorDialog; + if (signatureModel != null) + { + signatureEditorDialog = new SignatureEditorDialog(signatureModel) + { + RequestedTheme = ThemeService.RootTheme.ToWindowsElementTheme() + }; + } + else + { + signatureEditorDialog = new SignatureEditorDialog() + { + RequestedTheme = ThemeService.RootTheme.ToWindowsElementTheme() + }; + } + + var result = await HandleDialogPresentationAsync(signatureEditorDialog); + + return result == ContentDialogResult.Primary ? signatureEditorDialog.Result : null; + } + + public async Task ShowMessageSourceDialogAsync(string messageSource) + { + var dialog = new MessageSourceDialog() + { + MessageSource = messageSource, + RequestedTheme = ThemeService.RootTheme.ToWindowsElementTheme() + }; + + await HandleDialogPresentationAsync(dialog); + + if (dialog.Copied) + InfoBarMessage(Translator.ClipboardTextCopied_Title, string.Format(Translator.ClipboardTextCopied_Message, Translator.MessageSourceDialog_Title), InfoBarMessageType.Information); + } + + public async Task ShowAccountReorderDialogAsync(ObservableCollection availableAccounts) + { + var accountReorderDialog = new AccountReorderDialog(availableAccounts) + { + RequestedTheme = ThemeService.RootTheme.ToWindowsElementTheme() + }; + + await HandleDialogPresentationAsync(accountReorderDialog); + } +} diff --git a/Wino.Mail.WinUI/Services/MailAuthenticatorConfiguration.cs b/Wino.Mail.WinUI/Services/MailAuthenticatorConfiguration.cs new file mode 100644 index 00000000..26e12f4f --- /dev/null +++ b/Wino.Mail.WinUI/Services/MailAuthenticatorConfiguration.cs @@ -0,0 +1,31 @@ +using Wino.Core.Domain.Interfaces; + +namespace Wino.Services; + +public class MailAuthenticatorConfiguration : IAuthenticatorConfig +{ + public string OutlookAuthenticatorClientId => "b19c2035-d740-49ff-b297-de6ec561b208"; + + public string[] OutlookScope => new string[] + { + "email", + "mail.readwrite", + "offline_access", + "mail.send", + "Mail.Send.Shared", + "Mail.ReadWrite.Shared", + "User.Read" + }; + + public string GmailAuthenticatorClientId => "973025879644-s7b4ur9p3rlgop6a22u7iuptdc0brnrn.apps.googleusercontent.com"; + + public string[] GmailScope => new string[] + { + "https://mail.google.com/", + "https://www.googleapis.com/auth/userinfo.profile", + "https://www.googleapis.com/auth/gmail.labels", + "https://www.googleapis.com/auth/userinfo.email" + }; + + public string GmailTokenStoreIdentifier => "WinoMailGmailTokenStore"; +} diff --git a/Wino.Mail.WinUI/Services/NavigationService.cs b/Wino.Mail.WinUI/Services/NavigationService.cs new file mode 100644 index 00000000..ebc8a157 --- /dev/null +++ b/Wino.Mail.WinUI/Services/NavigationService.cs @@ -0,0 +1,164 @@ +using System; +using System.Linq; +using CommunityToolkit.Mvvm.Messaging; +using Microsoft.UI.Xaml; +using Microsoft.UI.Xaml.Controls; +using Wino.Core.Domain.Enums; +using Wino.Core.Domain.Interfaces; +using Wino.Core.Domain.Models.Navigation; +using Wino.Core.UWP; +using Wino.Core.UWP.Services; +using Wino.Core.WinUI.Interfaces; +using Wino.Helpers; +using Wino.Mail.ViewModels.Data; +using Wino.Mail.ViewModels.Messages; +using Wino.Messaging.Client.Mails; +using Wino.Views; +using Wino.Views.Account; +using Wino.Views.Settings; + +namespace Wino.Services; + +public class NavigationService : NavigationServiceBase, INavigationService +{ + private readonly IStatePersistanceService _statePersistanceService; + + private WinoPage[] _renderingPageTypes = new WinoPage[] + { + WinoPage.MailRenderingPage, + WinoPage.ComposePage + }; + + public NavigationService(IStatePersistanceService statePersistanceService) + { + _statePersistanceService = statePersistanceService; + } + + public Type GetPageType(WinoPage winoPage) + { + return winoPage switch + { + WinoPage.None => null, + WinoPage.IdlePage => typeof(IdlePage), + WinoPage.AccountDetailsPage => typeof(AccountDetailsPage), + WinoPage.MergedAccountDetailsPage => typeof(MergedAccountDetailsPage), + WinoPage.AccountManagementPage => typeof(AccountManagementPage), + WinoPage.ManageAccountsPage => typeof(ManageAccountsPage), + WinoPage.SignatureManagementPage => typeof(SignatureManagementPage), + WinoPage.AboutPage => typeof(AboutPage), + WinoPage.PersonalizationPage => typeof(PersonalizationPage), + WinoPage.MessageListPage => typeof(MessageListPage), + WinoPage.ReadComposePanePage => typeof(ReadComposePanePage), + WinoPage.MailRenderingPage => typeof(MailRenderingPage), + WinoPage.ComposePage => typeof(ComposePage), + WinoPage.MailListPage => typeof(MailListPage), + WinoPage.SettingsPage => typeof(SettingsPage), + WinoPage.WelcomePage => typeof(WelcomePage), + WinoPage.SettingOptionsPage => typeof(SettingOptionsPage), + WinoPage.AppPreferencesPage => typeof(AppPreferencesPage), + WinoPage.AliasManagementPage => typeof(AliasManagementPage), + WinoPage.LanguageTimePage => typeof(LanguageTimePage), + WinoPage.EditAccountDetailsPage => typeof(EditAccountDetailsPage), + _ => null, + }; + } + + public Frame GetCoreFrame(NavigationReferenceFrame frameType) + { + if (WinoApplication.MainWindow is not IWinoShellWindow shellWindow) throw new ArgumentException("MainWindow must implement IWinoShellWindow"); + if (shellWindow.GetMainFrame() is not Frame mainFrame) throw new ArgumentException("MainFrame cannot be null."); + + return WinoVisualTreeHelper.GetChildObject(mainFrame.Content as UIElement, frameType.ToString()); + } + + public bool Navigate(WinoPage page, + object parameter = null, + NavigationReferenceFrame frame = NavigationReferenceFrame.ShellFrame, + NavigationTransitionType transition = NavigationTransitionType.None) + { + var pageType = GetPageType(page); + Frame shellFrame = GetCoreFrame(NavigationReferenceFrame.ShellFrame); + + _statePersistanceService.IsReadingMail = _renderingPageTypes.Contains(page); + + if (shellFrame != null) + { + var currentFrameType = GetCurrentFrameType(ref shellFrame); + + bool isMailListingPageActive = currentFrameType != null && currentFrameType == typeof(MailListPage); + + // Active page is mail list page and we are refreshing the folder. + if (isMailListingPageActive && currentFrameType == pageType && parameter is NavigateMailFolderEventArgs folderNavigationArgs) + { + // No need for new navigation, just refresh the folder. + WeakReferenceMessenger.Default.Send(new ActiveMailFolderChangedEvent(folderNavigationArgs.BaseFolderMenuItem, folderNavigationArgs.FolderInitLoadAwaitTask)); + WeakReferenceMessenger.Default.Send(new DisposeRenderingFrameRequested()); + + return true; + } + + var transitionInfo = GetNavigationTransitionInfo(transition); + + // This page must be opened in the Frame placed in MailListingPage. + if (isMailListingPageActive && frame == NavigationReferenceFrame.RenderingFrame) + { + var listingFrame = GetCoreFrame(NavigationReferenceFrame.RenderingFrame); + + if (listingFrame == null) return false; + + // Active page is mail list page and we are opening a mail item. + // No navigation needed, just refresh the rendered mail item. + if (listingFrame.Content != null + && listingFrame.Content.GetType() == GetPageType(WinoPage.MailRenderingPage) + && parameter is MailItemViewModel mailItemViewModel + && page != WinoPage.ComposePage) + { + WeakReferenceMessenger.Default.Send(new NewMailItemRenderingRequestedEvent(mailItemViewModel)); + } + else if (listingFrame.Content != null + && listingFrame.Content.GetType() == GetPageType(WinoPage.IdlePage) + && pageType == typeof(IdlePage)) + { + // Idle -> Idle navigation. Ignore. + return true; + } + else + { + listingFrame.Navigate(pageType, parameter, transitionInfo); + } + + return true; + } + + if ((currentFrameType != null && currentFrameType != pageType) || currentFrameType == null) + { + return shellFrame.Navigate(pageType, parameter, transitionInfo); + } + } + + return false; + } + + public void GoBack() => throw new NotImplementedException("GoBack method is not implemented in Wino Mail."); + + // Standalone EML viewer. + //public void NavigateRendering(MimeMessageInformation mimeMessageInformation, NavigationTransitionType transition = NavigationTransitionType.None) + //{ + // if (mimeMessageInformation == null) + // throw new ArgumentException("MimeMessage cannot be null."); + + // Navigate(WinoPage.MailRenderingPage, mimeMessageInformation, NavigationReferenceFrame.RenderingFrame, transition); + //} + + //// Mail item view model clicked handler. + //public void NavigateRendering(IMailItem mailItem, NavigationTransitionType transition = NavigationTransitionType.None) + //{ + // if (mailItem is MailItemViewModel mailItemViewModel) + // Navigate(WinoPage.MailRenderingPage, mailItemViewModel, NavigationReferenceFrame.RenderingFrame, transition); + // else + // throw new ArgumentException("MailItem must be of type MailItemViewModel."); + //} + + //public void NavigateFolder(NavigateMailFolderEventArgs args) + // => Navigate(WinoPage.MailListPage, args, NavigationReferenceFrame.ShellFrame); +} diff --git a/Wino.Mail.WinUI/Services/ProviderService.cs b/Wino.Mail.WinUI/Services/ProviderService.cs new file mode 100644 index 00000000..81083d0f --- /dev/null +++ b/Wino.Mail.WinUI/Services/ProviderService.cs @@ -0,0 +1,34 @@ +using System.Collections.Generic; +using System.Linq; +using Wino.Core.Domain.Enums; +using Wino.Core.Domain.Interfaces; +using Wino.Core.Domain.Models.Accounts; + +namespace Wino.Mail.Services; + +/// +/// Service that is returning available provider details. +/// +public class ProviderService : IProviderService +{ + public IProviderDetail GetProviderDetail(MailProviderType type) + { + var details = GetAvailableProviders(); + + return details.FirstOrDefault(a => a.Type == type); + } + + public List GetAvailableProviders() + { + var providerList = new List + { + new ProviderDetail(MailProviderType.Outlook, SpecialImapProvider.None), + new ProviderDetail(MailProviderType.Gmail, SpecialImapProvider.None), + new ProviderDetail(MailProviderType.IMAP4, SpecialImapProvider.iCloud), + new ProviderDetail(MailProviderType.IMAP4, SpecialImapProvider.Yahoo), + new ProviderDetail(MailProviderType.IMAP4, SpecialImapProvider.None) + }; + + return providerList; + } +} diff --git a/Wino.Mail.WinUI/Services/SettingsBuilderService.cs b/Wino.Mail.WinUI/Services/SettingsBuilderService.cs new file mode 100644 index 00000000..8c2718b5 --- /dev/null +++ b/Wino.Mail.WinUI/Services/SettingsBuilderService.cs @@ -0,0 +1,22 @@ +using System.Collections.Generic; +using Wino.Core.Domain; +using Wino.Core.Domain.Enums; +using Wino.Core.Domain.Interfaces; +using Wino.Core.Domain.Models.Settings; + +namespace Wino.Services; + +public class SettingsBuilderService : ISettingsBuilderService +{ + public List GetSettingItems() + => new List() + { + new SettingOption(Translator.SettingsManageAccountSettings_Title, Translator.SettingsManageAccountSettings_Description, WinoPage.AccountManagementPage,"F1 M 3.75 5 L 3.75 4.902344 C 3.75 4.225262 3.885091 3.588867 4.155273 2.993164 C 4.425456 2.397461 4.790039 1.878256 5.249023 1.435547 C 5.708008 0.99284 6.238606 0.642904 6.84082 0.385742 C 7.443034 0.128582 8.079427 0 8.75 0 C 9.420572 0 10.056966 0.128582 10.65918 0.385742 C 11.261393 0.642904 11.791992 0.99284 12.250977 1.435547 C 12.709961 1.878256 13.074544 2.397461 13.344727 2.993164 C 13.614908 3.588867 13.75 4.225262 13.75 4.902344 C 13.75 5.397137 13.689778 5.87077 13.569336 6.323242 C 13.448893 6.775717 13.258463 7.213542 12.998047 7.636719 C 12.229817 7.799479 11.510416 8.079428 10.839844 8.476562 C 10.169271 8.873698 9.583333 9.378256 9.082031 9.990234 C 9.042969 9.996745 9.005533 10 8.969727 10 C 8.933919 10 8.899739 10 8.867188 10 L 8.652344 10 C 7.97526 10 7.338867 9.864909 6.743164 9.594727 C 6.147461 9.324545 5.628255 8.959961 5.185547 8.500977 C 4.742838 8.041993 4.392903 7.511395 4.135742 6.90918 C 3.878581 6.306967 3.75 5.670573 3.75 5 Z M 12.5 5 L 12.5 4.921875 C 12.5 4.414062 12.399088 3.937176 12.197266 3.491211 C 11.995442 3.045248 11.722005 2.65625 11.376953 2.324219 C 11.0319 1.992188 10.633138 1.730145 10.180664 1.538086 C 9.728189 1.346029 9.251302 1.25 8.75 1.25 C 8.229166 1.25 7.740885 1.347656 7.285156 1.542969 C 6.829427 1.738281 6.432292 2.005209 6.09375 2.34375 C 5.755208 2.682293 5.488281 3.079428 5.292969 3.535156 C 5.097656 3.990887 5 4.479167 5 5 C 5 5.520834 5.097656 6.009115 5.292969 6.464844 C 5.488281 6.920573 5.755208 7.317709 6.09375 7.65625 C 6.432292 7.994792 6.829427 8.261719 7.285156 8.457031 C 7.740885 8.652344 8.229166 8.75 8.75 8.75 C 9.270833 8.75 9.759114 8.652344 10.214844 8.457031 C 10.670572 8.261719 11.067708 7.994792 11.40625 7.65625 C 11.744791 7.317709 12.011719 6.920573 12.207031 6.464844 C 12.402344 6.009115 12.5 5.520834 12.5 5 Z M 12.148438 19.365234 C 11.777344 19.208984 11.41276 19.010416 11.054688 18.769531 C 11.113281 18.561197 11.170247 18.357748 11.225586 18.15918 C 11.280924 17.960611 11.308594 17.753906 11.308594 17.539062 C 11.308594 17.252604 11.259766 16.977539 11.162109 16.713867 C 11.064453 16.450195 10.930989 16.210938 10.761719 15.996094 C 10.592447 15.78125 10.390625 15.597331 10.15625 15.444336 C 9.921875 15.291342 9.664713 15.182292 9.384766 15.117188 L 8.779297 14.980469 C 8.759766 14.778646 8.75 14.576823 8.75 14.375 C 8.75 14.179688 8.759766 13.977865 8.779297 13.769531 L 9.384766 13.632812 C 9.664713 13.567709 9.921875 13.458659 10.15625 13.305664 C 10.390625 13.15267 10.592447 12.96875 10.761719 12.753906 C 10.930989 12.539062 11.064453 12.299805 11.162109 12.036133 C 11.259766 11.772461 11.308594 11.497396 11.308594 11.210938 C 11.308594 10.996094 11.280924 10.789389 11.225586 10.59082 C 11.170247 10.392253 11.113281 10.188803 11.054688 9.980469 C 11.41276 9.739584 11.777344 9.541016 12.148438 9.384766 C 12.324219 9.560547 12.488606 9.720053 12.641602 9.863281 C 12.794596 10.006511 12.957356 10.131836 13.129883 10.239258 C 13.302408 10.34668 13.487955 10.429688 13.686523 10.488281 C 13.885091 10.546875 14.114583 10.576172 14.375 10.576172 C 14.635416 10.576172 14.866535 10.546875 15.068359 10.488281 C 15.270182 10.429688 15.455729 10.34668 15.625 10.239258 C 15.79427 10.131836 15.955402 10.006511 16.108398 9.863281 C 16.261393 9.720053 16.425781 9.560547 16.601562 9.384766 C 16.972656 9.541016 17.337238 9.739584 17.695312 9.980469 C 17.636719 10.188803 17.579752 10.392253 17.524414 10.59082 C 17.469074 10.789389 17.441406 10.996094 17.441406 11.210938 C 17.441406 11.497396 17.488605 11.772461 17.583008 12.036133 C 17.677408 12.299805 17.810871 12.539062 17.983398 12.753906 C 18.155924 12.96875 18.359375 13.15267 18.59375 13.305664 C 18.828125 13.458659 19.085285 13.567709 19.365234 13.632812 L 19.970703 13.769531 C 19.990234 13.977865 20 14.179688 20 14.375 C 20 14.576823 19.990234 14.778646 19.970703 14.980469 L 19.365234 15.117188 C 19.085285 15.182292 18.828125 15.291342 18.59375 15.444336 C 18.359375 15.597331 18.155924 15.78125 17.983398 15.996094 C 17.810871 16.210938 17.677408 16.450195 17.583008 16.713867 C 17.488605 16.977539 17.441406 17.252604 17.441406 17.539062 C 17.441406 17.753906 17.469074 17.960611 17.524414 18.15918 C 17.579752 18.357748 17.636719 18.561197 17.695312 18.769531 C 17.337238 19.010416 16.972656 19.208984 16.601562 19.365234 C 16.425781 19.189453 16.261393 19.029947 16.108398 18.886719 C 15.955402 18.74349 15.79427 18.618164 15.625 18.510742 C 15.455729 18.40332 15.270182 18.320312 15.068359 18.261719 C 14.866535 18.203125 14.635416 18.173828 14.375 18.173828 C 14.108072 18.173828 13.875324 18.203125 13.676758 18.261719 C 13.478189 18.320312 13.294271 18.40332 13.125 18.510742 C 12.955729 18.618164 12.794596 18.74349 12.641602 18.886719 C 12.488606 19.029947 12.324219 19.189453 12.148438 19.365234 Z M 0 13.75 C 0 13.404948 0.065104 13.081055 0.195312 12.77832 C 0.325521 12.475586 0.504557 12.210287 0.732422 11.982422 C 0.960286 11.754558 1.225586 11.575521 1.52832 11.445312 C 1.831055 11.315104 2.154948 11.25 2.5 11.25 L 8.251953 11.25 C 8.043619 11.660156 7.880859 12.076823 7.763672 12.5 L 2.5 12.5 C 2.324219 12.5 2.159831 12.532553 2.006836 12.597656 C 1.853841 12.662761 1.722005 12.750651 1.611328 12.861328 C 1.500651 12.972006 1.41276 13.103842 1.347656 13.256836 C 1.282552 13.409831 1.25 13.574219 1.25 13.75 C 1.25 14.420573 1.360677 15.008139 1.582031 15.512695 C 1.803385 16.017252 2.102865 16.455078 2.480469 16.826172 C 2.858073 17.197266 3.297526 17.50651 3.798828 17.753906 C 4.30013 18.001303 4.827474 18.198242 5.380859 18.344727 C 5.934244 18.491211 6.50065 18.595377 7.080078 18.657227 C 7.659505 18.719076 8.216146 18.75 8.75 18.75 L 9.072266 18.75 C 9.449869 19.199219 9.866536 19.5931 10.322266 19.931641 C 10.061849 19.964193 9.801432 19.983725 9.541016 19.990234 C 9.280599 19.996744 9.016927 20 8.75 20 C 8.190104 20 7.618814 19.973959 7.036133 19.921875 C 6.45345 19.869791 5.878906 19.775391 5.3125 19.638672 C 4.746094 19.501953 4.197591 19.319662 3.666992 19.091797 C 3.136393 18.863932 2.646484 18.574219 2.197266 18.222656 C 1.474609 17.66276 0.927734 17.005209 0.556641 16.25 C 0.185547 15.494792 0 14.661458 0 13.75 Z M 15.625 14.375 C 15.625 14.205729 15.592447 14.044597 15.527344 13.891602 C 15.462239 13.738607 15.372721 13.605144 15.258789 13.491211 C 15.144855 13.377279 15.011393 13.287761 14.858398 13.222656 C 14.705403 13.157553 14.544271 13.125 14.375 13.125 C 14.199219 13.125 14.036458 13.157553 13.886719 13.222656 C 13.736979 13.287761 13.605143 13.377279 13.491211 13.491211 C 13.377278 13.605144 13.28776 13.736979 13.222656 13.886719 C 13.157551 14.036459 13.124999 14.199219 13.125 14.375 C 13.124999 14.550781 13.157551 14.71517 13.222656 14.868164 C 13.28776 15.021159 13.37565 15.152995 13.486328 15.263672 C 13.597004 15.37435 13.72884 15.46224 13.881836 15.527344 C 14.03483 15.592448 14.199219 15.625 14.375 15.625 C 14.550781 15.625 14.713541 15.592448 14.863281 15.527344 C 15.01302 15.46224 15.144855 15.372722 15.258789 15.258789 C 15.372721 15.144857 15.462239 15.013021 15.527344 14.863281 C 15.592447 14.713542 15.625 14.550781 15.625 14.375 Z "), + new SettingOption(Translator.SettingsAppPreferences_Title, Translator.SettingsAppPreferences_Description, WinoPage.AppPreferencesPage,"F1 M 15.078125 1.25 C 15.566406 1.25 16.033527 1.349285 16.479492 1.547852 C 16.925455 1.74642 17.31608 2.013348 17.651367 2.348633 C 17.986652 2.68392 18.25358 3.074545 18.452148 3.520508 C 18.650715 3.966473 18.75 4.433594 18.75 4.921875 L 18.75 15.078125 C 18.75 15.566406 18.650715 16.033529 18.452148 16.479492 C 18.25358 16.925455 17.986652 17.31608 17.651367 17.651367 C 17.31608 17.986654 16.925455 18.25358 16.479492 18.452148 C 16.033527 18.650717 15.566406 18.75 15.078125 18.75 L 4.921875 18.75 C 4.433594 18.75 3.966471 18.650717 3.520508 18.452148 C 3.074544 18.25358 2.683919 17.986654 2.348633 17.651367 C 2.013346 17.31608 1.746419 16.925455 1.547852 16.479492 C 1.349284 16.033529 1.25 15.566406 1.25 15.078125 L 1.25 4.921875 C 1.25 4.433594 1.349284 3.966473 1.547852 3.520508 C 1.746419 3.074545 2.013346 2.68392 2.348633 2.348633 C 2.683919 2.013348 3.074544 1.74642 3.520508 1.547852 C 3.966471 1.349285 4.433594 1.25 4.921875 1.25 Z M 4.951172 2.5 C 4.625651 2.5 4.314778 2.566732 4.018555 2.700195 C 3.722331 2.83366 3.461914 3.012695 3.237305 3.237305 C 3.012695 3.461914 2.833659 3.722332 2.700195 4.018555 C 2.566732 4.314779 2.5 4.625651 2.5 4.951172 L 2.5 5 L 17.5 5 L 17.5 4.951172 C 17.5 4.625651 17.433268 4.314779 17.299805 4.018555 C 17.16634 3.722332 16.987305 3.461914 16.762695 3.237305 C 16.538086 3.012695 16.277668 2.83366 15.981445 2.700195 C 15.685221 2.566732 15.374349 2.5 15.048828 2.5 Z M 15.048828 17.5 C 15.374349 17.5 15.685221 17.433268 15.981445 17.299805 C 16.277668 17.166342 16.538086 16.987305 16.762695 16.762695 C 16.987305 16.538086 17.16634 16.27767 17.299805 15.981445 C 17.433268 15.685222 17.5 15.37435 17.5 15.048828 L 17.5 6.25 L 2.5 6.25 L 2.5 15.048828 C 2.5 15.37435 2.566732 15.685222 2.700195 15.981445 C 2.833659 16.27767 3.012695 16.538086 3.237305 16.762695 C 3.461914 16.987305 3.722331 17.166342 4.018555 17.299805 C 4.314778 17.433268 4.625651 17.5 4.951172 17.5 Z M 12.724609 8.935547 C 12.724609 9.195964 12.762044 9.446615 12.836914 9.6875 C 12.911783 9.928386 13.020832 10.151367 13.164062 10.356445 C 13.307291 10.561523 13.476562 10.742188 13.671875 10.898438 C 13.867188 11.054688 14.088541 11.178386 14.335938 11.269531 C 14.348957 11.367188 14.358723 11.466472 14.365234 11.567383 C 14.371744 11.668295 14.375 11.770834 14.375 11.875 C 14.375 11.979167 14.371744 12.081706 14.365234 12.182617 C 14.358723 12.283529 14.348957 12.382812 14.335938 12.480469 C 14.088541 12.571615 13.867188 12.695312 13.671875 12.851562 C 13.476562 13.007812 13.307291 13.188477 13.164062 13.393555 C 13.020832 13.598633 12.911783 13.821615 12.836914 14.0625 C 12.762044 14.303386 12.724609 14.554037 12.724609 14.814453 C 12.724609 14.886068 12.727864 14.960938 12.734375 15.039062 C 12.740885 15.117188 12.75065 15.192058 12.763672 15.263672 C 12.470703 15.511068 12.145182 15.712891 11.787109 15.869141 C 11.546224 15.621745 11.274414 15.43457 10.97168 15.307617 C 10.668945 15.180664 10.345052 15.117188 10 15.117188 C 9.654947 15.117188 9.331055 15.180664 9.02832 15.307617 C 8.725586 15.43457 8.453775 15.621745 8.212891 15.869141 C 7.854817 15.712891 7.529296 15.511068 7.236328 15.263672 C 7.249349 15.192058 7.259114 15.117188 7.265625 15.039062 C 7.272135 14.960938 7.275391 14.886068 7.275391 14.814453 C 7.275391 14.554037 7.237956 14.303386 7.163086 14.0625 C 7.088216 13.821615 6.979167 13.598633 6.835938 13.393555 C 6.692708 13.188477 6.52181 13.007812 6.323242 12.851562 C 6.124674 12.695312 5.904948 12.571615 5.664062 12.480469 C 5.651042 12.382812 5.641276 12.283529 5.634766 12.182617 C 5.628255 12.081706 5.625 11.979167 5.625 11.875 C 5.625 11.770834 5.628255 11.668295 5.634766 11.567383 C 5.641276 11.466472 5.651042 11.367188 5.664062 11.269531 C 5.904948 11.178386 6.124674 11.054688 6.323242 10.898438 C 6.52181 10.742188 6.692708 10.561523 6.835938 10.356445 C 6.979167 10.151367 7.088216 9.928386 7.163086 9.6875 C 7.237956 9.446615 7.275391 9.195964 7.275391 8.935547 C 7.275391 8.863933 7.272135 8.789062 7.265625 8.710938 C 7.259114 8.632812 7.249349 8.557943 7.236328 8.486328 C 7.529296 8.238933 7.854817 8.037109 8.212891 7.880859 C 8.440755 8.121745 8.712564 8.307292 9.02832 8.4375 C 9.344075 8.567709 9.667969 8.632812 10 8.632812 C 10.332031 8.632812 10.655924 8.567709 10.97168 8.4375 C 11.287435 8.307292 11.559244 8.121745 11.787109 7.880859 C 12.145182 8.037109 12.470703 8.238933 12.763672 8.486328 C 12.75065 8.557943 12.740885 8.632812 12.734375 8.710938 C 12.727864 8.789062 12.724609 8.863933 12.724609 8.935547 Z M 10.9375 11.875 C 10.9375 11.614584 10.846354 11.393229 10.664062 11.210938 C 10.481771 11.028646 10.260416 10.9375 10 10.9375 C 9.739583 10.9375 9.518229 11.028646 9.335938 11.210938 C 9.153646 11.393229 9.0625 11.614584 9.0625 11.875 C 9.0625 12.135417 9.153646 12.356771 9.335938 12.539062 C 9.518229 12.721354 9.739583 12.8125 10 12.8125 C 10.260416 12.8125 10.481771 12.721354 10.664062 12.539062 C 10.846354 12.356771 10.9375 12.135417 10.9375 11.875 Z "), + new SettingOption(Translator.SettingsLanguageTime_Title, Translator.SettingsLanguageTime_Description, WinoPage.LanguageTimePage,"F1 M 4.765625 12.324219 C 4.088542 12.167969 3.458659 11.899414 2.875977 11.518555 C 2.293294 11.137695 1.788737 10.680339 1.362305 10.146484 C 0.935872 9.612631 0.602214 9.020183 0.361328 8.369141 C 0.120443 7.7181 0 7.044271 0 6.347656 C 0 5.468751 0.159505 4.645184 0.478516 3.876953 C 0.797526 3.108725 1.236979 2.436523 1.796875 1.860352 C 2.356771 1.28418 3.017578 0.830078 3.779297 0.498047 C 4.541016 0.166016 5.364583 0 6.25 0 C 7.115885 0 7.92806 0.162762 8.686523 0.488281 C 9.444986 0.813803 10.107422 1.259766 10.673828 1.826172 C 11.240234 2.392578 11.686197 3.055014 12.011719 3.813477 C 12.337239 4.57194 12.5 5.384115 12.5 6.25 L 11.25 6.25 L 11.25 6.152344 C 11.25 5.475261 11.114908 4.838867 10.844727 4.243164 C 10.574544 3.647461 10.209961 3.128256 9.750977 2.685547 C 9.291992 2.24284 8.761393 1.892904 8.15918 1.635742 C 7.556966 1.378582 6.920573 1.25 6.25 1.25 C 5.579427 1.25 4.943034 1.378582 4.34082 1.635742 C 3.738607 1.892904 3.208008 2.24284 2.749023 2.685547 C 2.290039 3.128256 1.925456 3.647461 1.655273 4.243164 C 1.385091 4.838867 1.25 5.475261 1.25 6.152344 L 1.25 6.328125 C 1.25 6.901042 1.352539 7.454428 1.557617 7.988281 C 1.762695 8.522136 2.045898 9.005534 2.407227 9.438477 C 2.768555 9.87142 3.191732 10.239258 3.676758 10.541992 C 4.161784 10.844727 4.6875 11.048178 5.253906 11.152344 Z M 5.625 7.5 C 5.455729 7.5 5.309245 7.438151 5.185547 7.314453 C 5.061849 7.190756 5 7.044271 5 6.875 L 5 3.125 C 5 2.95573 5.061849 2.809246 5.185547 2.685547 C 5.309245 2.56185 5.455729 2.5 5.625 2.5 C 5.794271 2.5 5.940755 2.56185 6.064453 2.685547 C 6.188151 2.809246 6.25 2.95573 6.25 3.125 L 6.25 6.25 L 8.125 6.25 C 8.294271 6.25 8.440755 6.31185 8.564453 6.435547 C 8.68815 6.559245 8.75 6.705729 8.75 6.875 C 8.75 7.044271 8.68815 7.190756 8.564453 7.314453 C 8.440755 7.438151 8.294271 7.5 8.125 7.5 Z M 10 10 L 10 8.125 C 10 7.95573 10.061849 7.809246 10.185547 7.685547 C 10.309244 7.56185 10.455729 7.5 10.625 7.5 L 14.375 7.5 C 14.375 7.447917 14.373372 7.394206 14.370117 7.338867 C 14.366861 7.283529 14.365234 7.226563 14.365234 7.167969 C 14.365234 7.057292 14.371744 6.948242 14.384766 6.84082 C 14.397786 6.733398 14.425455 6.635742 14.467773 6.547852 C 14.51009 6.459961 14.573566 6.388347 14.658203 6.333008 C 14.742838 6.27767 14.856771 6.25 15 6.25 C 15.143229 6.25 15.255533 6.27767 15.336914 6.333008 C 15.418294 6.388347 15.480143 6.459961 15.522461 6.547852 C 15.564777 6.635742 15.592447 6.733398 15.605469 6.84082 C 15.618489 6.948242 15.625 7.057292 15.625 7.167969 L 15.625 7.5 L 19.375 7.5 C 19.54427 7.5 19.690754 7.56185 19.814453 7.685547 C 19.93815 7.809246 20 7.95573 20 8.125 L 20 10 C 20 10.169271 19.93815 10.315756 19.814453 10.439453 C 19.690754 10.563151 19.54427 10.625 19.375 10.625 C 19.205729 10.625 19.059244 10.563151 18.935547 10.439453 C 18.811848 10.315756 18.75 10.169271 18.75 10 L 18.75 8.75 L 11.25 8.75 L 11.25 10 C 11.25 10.169271 11.18815 10.315756 11.064453 10.439453 C 10.940755 10.563151 10.794271 10.625 10.625 10.625 C 10.455729 10.625 10.309244 10.563151 10.185547 10.439453 C 10.061849 10.315756 10 10.169271 10 10 Z M 14.375 17.5 C 14.205729 17.5 14.059244 17.43815 13.935547 17.314453 C 13.811849 17.190756 13.75 17.044271 13.75 16.875 C 13.75 16.731771 13.777669 16.619467 13.833008 16.538086 C 13.888346 16.456705 13.95996 16.394857 14.047852 16.352539 C 14.135741 16.310221 14.233397 16.282553 14.34082 16.269531 C 14.448241 16.256512 14.557291 16.25 14.667969 16.25 L 15 16.25 L 15 13.75 L 11.875 13.75 C 11.705729 13.75 11.559244 13.688151 11.435547 13.564453 C 11.311849 13.440756 11.25 13.294271 11.25 13.125 C 11.25 12.955729 11.311849 12.809245 11.435547 12.685547 C 11.559244 12.56185 11.705729 12.5 11.875 12.5 L 15 12.5 C 14.999999 12.376303 15.035807 12.259115 15.107422 12.148438 L 15.703125 11.25 L 13.125 11.25 C 12.955729 11.25 12.809244 11.188151 12.685547 11.064453 C 12.561849 10.940756 12.5 10.794271 12.5 10.625 C 12.5 10.455729 12.561849 10.309245 12.685547 10.185547 C 12.809244 10.06185 12.955729 10 13.125 10 L 16.875 10 C 17.04427 10 17.190754 10.06185 17.314453 10.185547 C 17.43815 10.309245 17.5 10.455729 17.5 10.625 C 17.5 10.748698 17.464191 10.862631 17.392578 10.966797 L 16.376953 12.5 L 19.375 12.5 C 19.54427 12.5 19.690754 12.56185 19.814453 12.685547 C 19.93815 12.809245 20 12.955729 20 13.125 C 20 13.294271 19.93815 13.440756 19.814453 13.564453 C 19.690754 13.688151 19.54427 13.75 19.375 13.75 L 16.25 13.75 L 16.25 16.25 C 16.25 16.425781 16.217447 16.588543 16.152344 16.738281 C 16.087238 16.888021 15.997721 17.019857 15.883789 17.133789 C 15.769856 17.247721 15.638021 17.33724 15.488281 17.402344 C 15.338541 17.467447 15.17578 17.5 15 17.5 Z M 4.0625 18.125 C 4.0625 18.046875 4.075521 17.972006 4.101562 17.900391 C 4.257812 17.477213 4.41569 17.05892 4.575195 16.645508 C 4.7347 16.232096 4.892578 15.813803 5.048828 15.390625 L 6.914062 10.400391 C 6.959635 10.276693 7.036133 10.185547 7.143555 10.126953 C 7.250977 10.068359 7.369792 10.039062 7.5 10.039062 C 7.630208 10.039062 7.749023 10.068359 7.856445 10.126953 C 7.963867 10.185547 8.040364 10.276693 8.085938 10.400391 L 9.951172 15.390625 C 10.107422 15.813803 10.265299 16.232096 10.424805 16.645508 C 10.58431 17.05892 10.742188 17.477213 10.898438 17.900391 C 10.924479 17.972006 10.9375 18.046875 10.9375 18.125 C 10.9375 18.300781 10.877278 18.448893 10.756836 18.569336 C 10.636393 18.689779 10.488281 18.75 10.3125 18.75 C 10.175781 18.75 10.056966 18.714193 9.956055 18.642578 C 9.855143 18.570963 9.778646 18.470053 9.726562 18.339844 L 8.945312 16.25 L 6.054688 16.25 L 5.273438 18.339844 C 5.227864 18.463541 5.151367 18.562826 5.043945 18.637695 C 4.936523 18.712564 4.817708 18.75 4.6875 18.75 C 4.511719 18.75 4.363606 18.689779 4.243164 18.569336 C 4.122721 18.448893 4.0625 18.300781 4.0625 18.125 Z M 7.5 12.402344 L 6.523438 15 L 8.476562 15 Z "), + new SettingOption(Translator.SettingsPersonalization_Title, Translator.SettingsPersonalization_Description, WinoPage.PersonalizationPage,"F1 M 10 17.5 L 10 18.75 L 12.5 18.75 L 12.5 20 L 6.25 20 L 6.25 18.75 L 8.75 18.75 L 8.75 17.5 L 0 17.5 L 0 6.25 L 10 6.25 L 8.740234 7.5 L 1.25 7.5 L 1.25 16.25 L 17.5 16.25 L 17.5 8.75 L 18.75 7.5 L 18.75 17.5 Z M 5 13.75 C 5.175781 13.75 5.338542 13.717448 5.488281 13.652344 C 5.638021 13.58724 5.769856 13.497722 5.883789 13.383789 C 5.997721 13.269857 6.087239 13.138021 6.152344 12.988281 C 6.217448 12.838542 6.25 12.675781 6.25 12.5 C 6.25 12.18099 6.306966 11.878256 6.420898 11.591797 C 6.53483 11.305339 6.69108 11.051433 6.889648 10.830078 C 7.088216 10.608725 7.322591 10.424805 7.592773 10.27832 C 7.862955 10.131836 8.157552 10.042318 8.476562 10.009766 L 15.419922 3.066406 C 15.602213 2.884115 15.813802 2.744141 16.054688 2.646484 C 16.295572 2.548828 16.542969 2.5 16.796875 2.5 C 17.063801 2.5 17.31608 2.550457 17.553711 2.651367 C 17.79134 2.752279 17.998047 2.890625 18.173828 3.066406 C 18.349609 3.242188 18.487955 3.448895 18.588867 3.686523 C 18.689777 3.924154 18.740234 4.179688 18.740234 4.453125 C 18.740234 4.707031 18.691406 4.954428 18.59375 5.195312 C 18.496094 5.436199 18.356119 5.647787 18.173828 5.830078 L 11.230469 12.773438 C 11.197916 13.085938 11.110025 13.378906 10.966797 13.652344 C 10.823567 13.925781 10.639648 14.161784 10.415039 14.360352 C 10.19043 14.55892 9.936523 14.71517 9.65332 14.829102 C 9.370117 14.943034 9.06901 15 8.75 15 L 2.5 15 L 2.5 13.75 Z M 16.796875 3.75 C 16.608072 3.75 16.445312 3.818359 16.308594 3.955078 L 11.962891 8.300781 C 12.333984 8.58724 12.66276 8.916016 12.949219 9.287109 L 17.294922 4.941406 C 17.431641 4.804688 17.5 4.641928 17.5 4.453125 C 17.5 4.257812 17.430012 4.091797 17.290039 3.955078 C 17.150064 3.818359 16.985676 3.75 16.796875 3.75 Z M 10.175781 10.087891 C 10.572916 10.348308 10.901692 10.677084 11.162109 11.074219 L 12.060547 10.185547 C 11.787109 9.794922 11.455078 9.462891 11.064453 9.189453 Z M 10 12.5 C 10 12.324219 9.967447 12.161459 9.902344 12.011719 C 9.837239 11.861979 9.747721 11.730144 9.633789 11.616211 C 9.519856 11.502279 9.388021 11.412761 9.238281 11.347656 C 9.088541 11.282553 8.925781 11.25 8.75 11.25 C 8.574219 11.25 8.411458 11.282553 8.261719 11.347656 C 8.111979 11.412761 7.980143 11.502279 7.866211 11.616211 C 7.752278 11.730144 7.66276 11.861979 7.597656 12.011719 C 7.532552 12.161459 7.5 12.324219 7.5 12.5 C 7.5 12.942709 7.389322 13.359375 7.167969 13.75 L 8.75 13.75 C 8.919271 13.75 9.080403 13.717448 9.233398 13.652344 C 9.386393 13.58724 9.519856 13.497722 9.633789 13.383789 C 9.747721 13.269857 9.837239 13.136394 9.902344 12.983398 C 9.967447 12.830404 10 12.669271 10 12.5 Z "), + new SettingOption(Translator.SettingsMessageList_Title, Translator.SettingsMessageList_Description, WinoPage.MessageListPage,"F1 M 20 1.25 L 20 12.5 L 18.75 12.5 L 18.75 2.5 L 1.25 2.5 L 1.25 13.75 L 3.75 13.75 L 3.75 16.611328 L 6.611328 13.75 L 13.75 13.75 L 13.75 15 L 7.138672 15 L 2.5 19.638672 L 2.5 15 L 0 15 L 0 1.25 Z M 16.875 13.75 L 20 16.875 L 16.875 20 L 15.986328 19.111328 L 17.607422 17.5 L 11.25 17.5 L 11.25 16.25 L 17.607422 16.25 L 15.986328 14.638672 Z "), + new SettingOption(Translator.SettingsReadComposePane_Title, Translator.SettingsReadComposePane_Description, WinoPage.ReadComposePanePage,"F1 M 20 2.5 L 20 3.75 L 8.75 3.75 L 8.75 2.5 Z M 17.5 15 L 0 15 L 0 13.75 L 17.5 13.75 Z M 2.5 10 L 20 10 L 20 11.25 L 2.5 11.25 Z M 2.5 17.5 L 20 17.5 L 20 18.75 L 2.5 18.75 Z M 3.125 7.5 C 2.695312 7.5 2.291667 7.416992 1.914062 7.250977 C 1.536458 7.084961 1.206055 6.860352 0.922852 6.577148 C 0.639648 6.293945 0.415039 5.963542 0.249023 5.585938 C 0.083008 5.208334 0 4.804688 0 4.375 C 0 3.945312 0.083008 3.541668 0.249023 3.164062 C 0.415039 2.786459 0.639648 2.456055 0.922852 2.172852 C 1.206055 1.889648 1.536458 1.665039 1.914062 1.499023 C 2.291667 1.333008 2.695312 1.25 3.125 1.25 C 3.554688 1.25 3.958333 1.333008 4.335938 1.499023 C 4.713542 1.665039 5.043945 1.889648 5.327148 2.172852 C 5.610352 2.456055 5.834961 2.786459 6.000977 3.164062 C 6.166992 3.541668 6.25 3.945312 6.25 4.375 L 5 4.375 C 5 4.114584 4.951172 3.870443 4.853516 3.642578 C 4.755859 3.414715 4.622396 3.216146 4.453125 3.046875 C 4.283854 2.877605 4.085286 2.744141 3.857422 2.646484 C 3.629557 2.548828 3.385417 2.5 3.125 2.5 C 2.864583 2.5 2.620443 2.548828 2.392578 2.646484 C 2.164713 2.744141 1.966146 2.877605 1.796875 3.046875 C 1.627604 3.216146 1.494141 3.414715 1.396484 3.642578 C 1.298828 3.870443 1.25 4.114584 1.25 4.375 C 1.25 4.635418 1.298828 4.879559 1.396484 5.107422 C 1.494141 5.335287 1.627604 5.533854 1.796875 5.703125 C 1.966146 5.872396 2.164713 6.005859 2.392578 6.103516 C 2.620443 6.201172 2.864583 6.25 3.125 6.25 L 17.5 6.25 L 17.5 7.5 Z "), + new SettingOption(Translator.SettingsAbout_Title, Translator.SettingsAbout_Description, WinoPage.AboutPage,"F1 M 9.375 18.75 C 8.509114 18.75 7.677409 18.639322 6.879883 18.417969 C 6.082356 18.196615 5.335286 17.882486 4.638672 17.475586 C 3.942057 17.068686 3.308919 16.580404 2.739258 16.010742 C 2.169596 15.441081 1.681315 14.807943 1.274414 14.111328 C 0.867513 13.414714 0.553385 12.667644 0.332031 11.870117 C 0.110677 11.072592 0 10.240886 0 9.375 C 0 8.509115 0.110677 7.677409 0.332031 6.879883 C 0.553385 6.082357 0.867513 5.335287 1.274414 4.638672 C 1.681315 3.942059 2.169596 3.30892 2.739258 2.739258 C 3.308919 2.169598 3.942057 1.681316 4.638672 1.274414 C 5.335286 0.867514 6.082356 0.553387 6.879883 0.332031 C 7.677409 0.110678 8.509114 0 9.375 0 C 10.240885 0 11.072591 0.110678 11.870117 0.332031 C 12.667643 0.553387 13.414713 0.867514 14.111328 1.274414 C 14.807942 1.681316 15.44108 2.169598 16.010742 2.739258 C 16.580402 3.30892 17.068684 3.942059 17.475586 4.638672 C 17.882486 5.335287 18.196613 6.082357 18.417969 6.879883 C 18.639322 7.677409 18.75 8.509115 18.75 9.375 C 18.75 10.240886 18.639322 11.072592 18.417969 11.870117 C 18.196613 12.667644 17.882486 13.414714 17.475586 14.111328 C 17.068684 14.807943 16.580402 15.441081 16.010742 16.010742 C 15.44108 16.580404 14.807942 17.068686 14.111328 17.475586 C 13.414713 17.882486 12.667643 18.196615 11.870117 18.417969 C 11.072591 18.639322 10.240885 18.75 9.375 18.75 Z M 9.375 1.25 C 8.626302 1.25 7.906901 1.347656 7.216797 1.542969 C 6.526692 1.738281 5.880533 2.011719 5.27832 2.363281 C 4.676106 2.714844 4.127604 3.138021 3.632812 3.632812 C 3.138021 4.127604 2.714844 4.676107 2.363281 5.27832 C 2.011719 5.880534 1.738281 6.52832 1.542969 7.22168 C 1.347656 7.915039 1.25 8.632812 1.25 9.375 C 1.25 10.117188 1.347656 10.834961 1.542969 11.52832 C 1.738281 12.22168 2.011719 12.869467 2.363281 13.47168 C 2.714844 14.073894 3.138021 14.622396 3.632812 15.117188 C 4.127604 15.611979 4.676106 16.035156 5.27832 16.386719 C 5.880533 16.738281 6.526692 17.011719 7.216797 17.207031 C 7.906901 17.402344 8.626302 17.5 9.375 17.5 C 10.117188 17.5 10.834961 17.402344 11.52832 17.207031 C 12.221679 17.011719 12.869465 16.738281 13.47168 16.386719 C 14.073893 16.035156 14.622396 15.611979 15.117188 15.117188 C 15.611979 14.622396 16.035156 14.073894 16.386719 13.47168 C 16.738281 12.869467 17.011719 12.223308 17.207031 11.533203 C 17.402344 10.8431 17.5 10.123698 17.5 9.375 C 17.5 8.632812 17.402344 7.915039 17.207031 7.22168 C 17.011719 6.52832 16.738281 5.880534 16.386719 5.27832 C 16.035156 4.676107 15.611979 4.127604 15.117188 3.632812 C 14.622396 3.138021 14.073893 2.714844 13.47168 2.363281 C 12.869465 2.011719 12.221679 1.738281 11.52832 1.542969 C 10.834961 1.347656 10.117188 1.25 9.375 1.25 Z M 8.75 7.5 L 10 7.5 L 10 13.75 L 8.75 13.75 Z M 8.75 5 L 10 5 L 10 6.25 L 8.75 6.25 Z "), + }; +} diff --git a/Wino.Mail.WinUI/ShellWindow.xaml b/Wino.Mail.WinUI/ShellWindow.xaml new file mode 100644 index 00000000..ab6f6681 --- /dev/null +++ b/Wino.Mail.WinUI/ShellWindow.xaml @@ -0,0 +1,27 @@ + + + + + + + + + + + + + + + + + + diff --git a/Wino.Mail.WinUI/ShellWindow.xaml.cs b/Wino.Mail.WinUI/ShellWindow.xaml.cs new file mode 100644 index 00000000..2320df3a --- /dev/null +++ b/Wino.Mail.WinUI/ShellWindow.xaml.cs @@ -0,0 +1,33 @@ +using Microsoft.UI.Xaml; +using Microsoft.UI.Xaml.Controls; +using Wino.Core.WinUI.Interfaces; +using Wino.Views; +using WinUIEx; + +namespace Wino.Mail.WinUI; + +public sealed partial class ShellWindow : WindowEx, IWinoShellWindow +{ + public ShellWindow() + { + InitializeComponent(); + + ConfigureTitleBar(); + } + + private void ConfigureTitleBar() + { + AppWindow.TitleBar.ExtendsContentIntoTitleBar = true; + } + + public void HandleAppActivation(LaunchActivatedEventArgs args) + { + // TODO: Handle protocol activations. + + MainShellFrame.Navigate(typeof(AppShell)); + } + + public Microsoft.UI.Xaml.Controls.TitleBar GetTitleBar() => ShellTitleBar; + + public Frame GetMainFrame() => MainShellFrame; +} diff --git a/Wino.Mail.WinUI/Styles/ImagePreviewControl.xaml b/Wino.Mail.WinUI/Styles/ImagePreviewControl.xaml new file mode 100644 index 00000000..b09c2143 --- /dev/null +++ b/Wino.Mail.WinUI/Styles/ImagePreviewControl.xaml @@ -0,0 +1,58 @@ + + + + diff --git a/Wino.Mail.WinUI/Styles/ItemContainerStyles.xaml b/Wino.Mail.WinUI/Styles/ItemContainerStyles.xaml new file mode 100644 index 00000000..ece3144a --- /dev/null +++ b/Wino.Mail.WinUI/Styles/ItemContainerStyles.xaml @@ -0,0 +1,197 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/Wino.Mail.WinUI/Styles/WebViewEditorControl.xaml b/Wino.Mail.WinUI/Styles/WebViewEditorControl.xaml new file mode 100644 index 00000000..fe7e608e --- /dev/null +++ b/Wino.Mail.WinUI/Styles/WebViewEditorControl.xaml @@ -0,0 +1,21 @@ + + + + diff --git a/Wino.Mail.WinUI/Styles/WinoExpanderStyle.xaml b/Wino.Mail.WinUI/Styles/WinoExpanderStyle.xaml new file mode 100644 index 00000000..0e455ff9 --- /dev/null +++ b/Wino.Mail.WinUI/Styles/WinoExpanderStyle.xaml @@ -0,0 +1,89 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/Wino.Mail.WinUI/Styles/WinoExpanderStyle.xaml.cs b/Wino.Mail.WinUI/Styles/WinoExpanderStyle.xaml.cs new file mode 100644 index 00000000..78be787f --- /dev/null +++ b/Wino.Mail.WinUI/Styles/WinoExpanderStyle.xaml.cs @@ -0,0 +1,11 @@ +using Microsoft.UI.Xaml; + +namespace Wino.Styles; + +partial class WinoExpanderStyle : ResourceDictionary +{ + public WinoExpanderStyle() + { + InitializeComponent(); + } +} diff --git a/Wino.Mail.WinUI/Views/Abstract/AboutPageAbstract.cs b/Wino.Mail.WinUI/Views/Abstract/AboutPageAbstract.cs new file mode 100644 index 00000000..e2e1725f --- /dev/null +++ b/Wino.Mail.WinUI/Views/Abstract/AboutPageAbstract.cs @@ -0,0 +1,8 @@ +using Wino.Core.UWP; +using Wino.Core.ViewModels; + +namespace Wino.Views.Abstract; + +public abstract class AboutPageAbstract : BasePage +{ +} diff --git a/Wino.Mail.WinUI/Views/Abstract/AccountDetailsPageAbstract.cs b/Wino.Mail.WinUI/Views/Abstract/AccountDetailsPageAbstract.cs new file mode 100644 index 00000000..04c78aea --- /dev/null +++ b/Wino.Mail.WinUI/Views/Abstract/AccountDetailsPageAbstract.cs @@ -0,0 +1,8 @@ +using Wino.Core.UWP; +using Wino.Mail.ViewModels; + +namespace Wino.Views.Abstract; + +public abstract class AccountDetailsPageAbstract : BasePage +{ +} diff --git a/Wino.Mail.WinUI/Views/Abstract/AccountManagementPageAbstract.cs b/Wino.Mail.WinUI/Views/Abstract/AccountManagementPageAbstract.cs new file mode 100644 index 00000000..a5cffe05 --- /dev/null +++ b/Wino.Mail.WinUI/Views/Abstract/AccountManagementPageAbstract.cs @@ -0,0 +1,9 @@ +using Wino.Core.UWP; +using Wino.Mail.ViewModels; + +namespace Wino.Views.Abstract; + +public abstract class AccountManagementPageAbstract : BasePage +{ + +} diff --git a/Wino.Mail.WinUI/Views/Abstract/AliasManagementPageAbstract.cs b/Wino.Mail.WinUI/Views/Abstract/AliasManagementPageAbstract.cs new file mode 100644 index 00000000..9d0052d1 --- /dev/null +++ b/Wino.Mail.WinUI/Views/Abstract/AliasManagementPageAbstract.cs @@ -0,0 +1,6 @@ +using Wino.Core.UWP; +using Wino.Mail.ViewModels; + +namespace Wino.Views.Abstract; + +public abstract class AliasManagementPageAbstract : BasePage { } diff --git a/Wino.Mail.WinUI/Views/Abstract/AppPreferencesPageAbstract.cs b/Wino.Mail.WinUI/Views/Abstract/AppPreferencesPageAbstract.cs new file mode 100644 index 00000000..878facfa --- /dev/null +++ b/Wino.Mail.WinUI/Views/Abstract/AppPreferencesPageAbstract.cs @@ -0,0 +1,6 @@ +using Wino.Core.UWP; +using Wino.Mail.ViewModels; + +namespace Wino.Views.Abstract; + +public abstract class AppPreferencesPageAbstract : BasePage { } diff --git a/Wino.Mail.WinUI/Views/Abstract/AppShellAbstract.cs b/Wino.Mail.WinUI/Views/Abstract/AppShellAbstract.cs new file mode 100644 index 00000000..9f1572fd --- /dev/null +++ b/Wino.Mail.WinUI/Views/Abstract/AppShellAbstract.cs @@ -0,0 +1,8 @@ +using Wino.Core.UWP; +using Wino.Mail.ViewModels; + +namespace Wino.Views.Abstract; + +public abstract class AppShellAbstract : BasePage +{ +} diff --git a/Wino.Mail.WinUI/Views/Abstract/ComposePageAbstract.cs b/Wino.Mail.WinUI/Views/Abstract/ComposePageAbstract.cs new file mode 100644 index 00000000..ed6c5879 --- /dev/null +++ b/Wino.Mail.WinUI/Views/Abstract/ComposePageAbstract.cs @@ -0,0 +1,8 @@ +using Wino.Core.UWP; +using Wino.Mail.ViewModels; + +namespace Wino.Views.Abstract; + +public abstract class ComposePageAbstract : BasePage +{ +} diff --git a/Wino.Mail.WinUI/Views/Abstract/EditAccountDetailsPageAbstract.cs b/Wino.Mail.WinUI/Views/Abstract/EditAccountDetailsPageAbstract.cs new file mode 100644 index 00000000..91cf2854 --- /dev/null +++ b/Wino.Mail.WinUI/Views/Abstract/EditAccountDetailsPageAbstract.cs @@ -0,0 +1,5 @@ +using Wino.Core.UWP; +using Wino.Mail.ViewModels; + +namespace Wino.Views.Abstract; +public partial class EditAccountDetailsPageAbstract : BasePage { } diff --git a/Wino.Mail.WinUI/Views/Abstract/IdlePageAbstract.cs b/Wino.Mail.WinUI/Views/Abstract/IdlePageAbstract.cs new file mode 100644 index 00000000..73280adb --- /dev/null +++ b/Wino.Mail.WinUI/Views/Abstract/IdlePageAbstract.cs @@ -0,0 +1,8 @@ +using Wino.Core.UWP; +using Wino.Mail.ViewModels; + +namespace Wino.Views.Abstract; + +public abstract class IdlePageAbstract : BasePage +{ +} diff --git a/Wino.Mail.WinUI/Views/Abstract/LanguageTimePageAbstract.cs b/Wino.Mail.WinUI/Views/Abstract/LanguageTimePageAbstract.cs new file mode 100644 index 00000000..6d739c56 --- /dev/null +++ b/Wino.Mail.WinUI/Views/Abstract/LanguageTimePageAbstract.cs @@ -0,0 +1,6 @@ +using Wino.Core.UWP; +using Wino.Mail.ViewModels; + +namespace Wino.Views.Abstract; + +public abstract class LanguageTimePageAbstract : BasePage { } diff --git a/Wino.Mail.WinUI/Views/Abstract/MailListPageAbstract.cs b/Wino.Mail.WinUI/Views/Abstract/MailListPageAbstract.cs new file mode 100644 index 00000000..84dfb9c0 --- /dev/null +++ b/Wino.Mail.WinUI/Views/Abstract/MailListPageAbstract.cs @@ -0,0 +1,6 @@ +using Wino.Core.UWP; +using Wino.Mail.ViewModels; + +namespace Wino.Views.Abstract; + +public partial class MailListPageAbstract : BasePage; diff --git a/Wino.Mail.WinUI/Views/Abstract/MailRenderingPageAbstract.cs b/Wino.Mail.WinUI/Views/Abstract/MailRenderingPageAbstract.cs new file mode 100644 index 00000000..417dd770 --- /dev/null +++ b/Wino.Mail.WinUI/Views/Abstract/MailRenderingPageAbstract.cs @@ -0,0 +1,26 @@ +using Microsoft.UI.Xaml; +using Wino.Core.UWP; +using Wino.Mail.ViewModels; + +namespace Wino.Views.Abstract; + +public abstract class MailRenderingPageAbstract : BasePage +{ + public bool IsDarkEditor + { + get { return (bool)GetValue(IsDarkEditorProperty); } + set { SetValue(IsDarkEditorProperty, value); } + } + + public static readonly DependencyProperty IsDarkEditorProperty = DependencyProperty.Register(nameof(IsDarkEditor), typeof(bool), typeof(MailRenderingPageAbstract), new PropertyMetadata(false, OnIsComposerDarkModeChanged)); + + private static void OnIsComposerDarkModeChanged(DependencyObject obj, DependencyPropertyChangedEventArgs args) + { + if (obj is MailRenderingPageAbstract page) + { + page.OnEditorThemeChanged(); + } + } + + public virtual void OnEditorThemeChanged() { } +} diff --git a/Wino.Mail.WinUI/Views/Abstract/MergedAccountDetailsPageAbstract.cs b/Wino.Mail.WinUI/Views/Abstract/MergedAccountDetailsPageAbstract.cs new file mode 100644 index 00000000..6ea69ace --- /dev/null +++ b/Wino.Mail.WinUI/Views/Abstract/MergedAccountDetailsPageAbstract.cs @@ -0,0 +1,8 @@ +using Wino.Core.UWP; +using Wino.Mail.ViewModels; + +namespace Wino.Views.Abstract; + +public abstract class MergedAccountDetailsPageAbstract : BasePage +{ +} diff --git a/Wino.Mail.WinUI/Views/Abstract/MessageListPageAbstract.cs b/Wino.Mail.WinUI/Views/Abstract/MessageListPageAbstract.cs new file mode 100644 index 00000000..af6462e3 --- /dev/null +++ b/Wino.Mail.WinUI/Views/Abstract/MessageListPageAbstract.cs @@ -0,0 +1,6 @@ +using Wino.Core.UWP; +using Wino.Mail.ViewModels; + +namespace Wino.Views.Abstract; + +public abstract class MessageListPageAbstract : BasePage { } diff --git a/Wino.Mail.WinUI/Views/Abstract/PersonalizationPageAbstract.cs b/Wino.Mail.WinUI/Views/Abstract/PersonalizationPageAbstract.cs new file mode 100644 index 00000000..600aaf06 --- /dev/null +++ b/Wino.Mail.WinUI/Views/Abstract/PersonalizationPageAbstract.cs @@ -0,0 +1,8 @@ +using Wino.Core.ViewModels; + +namespace Wino.Views.Abstract; + +public abstract class PersonalizationPageAbstract : SettingsPageBase +{ + +} diff --git a/Wino.Mail.WinUI/Views/Abstract/ReadComposePanePageAbstract.cs b/Wino.Mail.WinUI/Views/Abstract/ReadComposePanePageAbstract.cs new file mode 100644 index 00000000..9af5b594 --- /dev/null +++ b/Wino.Mail.WinUI/Views/Abstract/ReadComposePanePageAbstract.cs @@ -0,0 +1,6 @@ +using Wino.Core.UWP; +using Wino.Mail.ViewModels; + +namespace Wino.Views.Abstract; + +public abstract class ReadComposePanePageAbstract : BasePage { } diff --git a/Wino.Mail.WinUI/Views/Abstract/SignatureManagementPageAbstract.cs b/Wino.Mail.WinUI/Views/Abstract/SignatureManagementPageAbstract.cs new file mode 100644 index 00000000..8130f9f0 --- /dev/null +++ b/Wino.Mail.WinUI/Views/Abstract/SignatureManagementPageAbstract.cs @@ -0,0 +1,6 @@ +using Wino.Core.UWP; +using Wino.Mail.ViewModels; + +namespace Wino.Views.Abstract; + +public abstract class SignatureManagementPageAbstract : BasePage { } diff --git a/Wino.Mail.WinUI/Views/Abstract/WelcomePageAbstract.cs b/Wino.Mail.WinUI/Views/Abstract/WelcomePageAbstract.cs new file mode 100644 index 00000000..b3844953 --- /dev/null +++ b/Wino.Mail.WinUI/Views/Abstract/WelcomePageAbstract.cs @@ -0,0 +1,9 @@ +using Wino.Core.UWP; +using Wino.Mail.ViewModels; + +namespace Wino.Views.Abstract; + +public abstract class WelcomePageAbstract : BasePage +{ + +} diff --git a/Wino.Mail.WinUI/Views/Account/AccountDetailsPage.xaml b/Wino.Mail.WinUI/Views/Account/AccountDetailsPage.xaml new file mode 100644 index 00000000..dccb3cd0 --- /dev/null +++ b/Wino.Mail.WinUI/Views/Account/AccountDetailsPage.xaml @@ -0,0 +1,254 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/Wino.Mail.WinUI/Views/Account/AccountManagementPage.xaml.cs b/Wino.Mail.WinUI/Views/Account/AccountManagementPage.xaml.cs new file mode 100644 index 00000000..ab445561 --- /dev/null +++ b/Wino.Mail.WinUI/Views/Account/AccountManagementPage.xaml.cs @@ -0,0 +1,15 @@ +using System; +using Microsoft.UI.Xaml.Navigation; +using Wino.Views.Abstract; + +namespace Wino.Views; + +public sealed partial class AccountManagementPage : AccountManagementPageAbstract +{ + public AccountManagementPage() + { + InitializeComponent(); + + NavigationCacheMode = NavigationCacheMode.Enabled; + } +} diff --git a/Wino.Mail.WinUI/Views/Account/MergedAccountDetailsPage.xaml b/Wino.Mail.WinUI/Views/Account/MergedAccountDetailsPage.xaml new file mode 100644 index 00000000..5c8b9813 --- /dev/null +++ b/Wino.Mail.WinUI/Views/Account/MergedAccountDetailsPage.xaml @@ -0,0 +1,170 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/Wino.Mail.WinUI/Views/Account/MergedAccountDetailsPage.xaml.cs b/Wino.Mail.WinUI/Views/Account/MergedAccountDetailsPage.xaml.cs new file mode 100644 index 00000000..137ad3d7 --- /dev/null +++ b/Wino.Mail.WinUI/Views/Account/MergedAccountDetailsPage.xaml.cs @@ -0,0 +1,12 @@ +using Wino.Views.Abstract; + + +namespace Wino.Views.Account; + +public sealed partial class MergedAccountDetailsPage : MergedAccountDetailsPageAbstract +{ + public MergedAccountDetailsPage() + { + InitializeComponent(); + } +} diff --git a/Wino.Mail.WinUI/Views/ComposePage.xaml b/Wino.Mail.WinUI/Views/ComposePage.xaml new file mode 100644 index 00000000..66e386f3 --- /dev/null +++ b/Wino.Mail.WinUI/Views/ComposePage.xaml @@ -0,0 +1,707 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Transparent + + + + + + + + + + + + + + 0 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/Wino.Mail.WinUI/Views/ComposePage.xaml.cs b/Wino.Mail.WinUI/Views/ComposePage.xaml.cs new file mode 100644 index 00000000..e6f1cb09 --- /dev/null +++ b/Wino.Mail.WinUI/Views/ComposePage.xaml.cs @@ -0,0 +1,389 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Reactive.Linq; +using System.Threading; +using System.Threading.Tasks; +using CommunityToolkit.Mvvm.Messaging; +using CommunityToolkit.WinUI.Controls; +using EmailValidation; +using Microsoft.UI.Xaml; +using Microsoft.UI.Xaml.Controls; +using Microsoft.UI.Xaml.Input; +using Microsoft.UI.Xaml.Navigation; +using MimeKit; +using Windows.ApplicationModel.DataTransfer; +using Windows.Foundation; +using Windows.Storage; +using Windows.UI.Core.Preview; +using Wino.Core.Domain; +using Wino.Core.Domain.Entities.Shared; +using Wino.Core.Domain.Models.Reader; +using Wino.Core.UWP.Extensions; +using Wino.Mail.ViewModels.Data; +using Wino.Messaging.Client.Mails; +using Wino.Messaging.Client.Shell; +using Wino.Views.Abstract; + +namespace Wino.Views; + +public sealed partial class ComposePage : ComposePageAbstract, + IRecipient, + IRecipient +{ + public WebView2 GetWebView() => WebViewEditor.GetUnderlyingWebView(); + + private readonly List _disposables = []; + private readonly SystemNavigationManagerPreview _navManagerPreview = SystemNavigationManagerPreview.GetForCurrentView(); + + public ComposePage() + { + InitializeComponent(); + _navManagerPreview.CloseRequested += OnClose; + } + + private async void GlobalFocusManagerGotFocus(object sender, FocusManagerGotFocusEventArgs e) + { + // In order to delegate cursor to the inner editor for WebView2. + // When the control got focus, we invoke script to focus the editor. + // This is not done on the WebView2 handlers, because somehow it is + // repeatedly focusing itself, even though when it has the focus already. + + if (e.NewFocusedElement == WebViewEditor) + { + await WebViewEditor.FocusEditorAsync(true); + } + } + + private IDisposable GetSuggestionBoxDisposable(TokenizingTextBox box) + { + return Observable.FromEventPattern, AutoSuggestBoxTextChangedEventArgs>( + x => box.TextChanged += x, + x => box.TextChanged -= x) + .Throttle(TimeSpan.FromMilliseconds(120)) + .ObserveOn(SynchronizationContext.Current) + .Subscribe(t => + { + if (t.EventArgs.Reason == AutoSuggestionBoxTextChangeReason.UserInput) + { + if (t.Sender is AutoSuggestBox senderBox && senderBox.Text.Length >= 2) + { + _ = ViewModel.ContactService.GetAddressInformationAsync(senderBox.Text).ContinueWith(x => + { + _ = ViewModel.ExecuteUIThread(() => + { + var addresses = x.Result; + + senderBox.ItemsSource = addresses; + }); + }); + } + } + }); + } + + private void OnComposeGridDragOver(object sender, DragEventArgs e) + { + ViewModel.IsDraggingOverComposerGrid = true; + } + + private void OnComposeGridDragLeave(object sender, DragEventArgs e) + { + ViewModel.IsDraggingOverComposerGrid = false; + } + + private void OnFileDropGridDragOver(object sender, DragEventArgs e) + { + ViewModel.IsDraggingOverFilesDropZone = true; + + e.AcceptedOperation = DataPackageOperation.Copy; + e.DragUIOverride.Caption = Translator.ComposerAttachmentsDragDropAttach_Message; + e.DragUIOverride.IsCaptionVisible = true; + e.DragUIOverride.IsGlyphVisible = true; + e.DragUIOverride.IsContentVisible = true; + } + + private void OnFileDropGridDragLeave(object sender, DragEventArgs e) + { + ViewModel.IsDraggingOverFilesDropZone = false; + } + + private async void OnFileDropGridFileDropped(object sender, DragEventArgs e) + { + try + { + if (e.DataView.Contains(StandardDataFormats.StorageItems)) + { + var storageItems = await e.DataView.GetStorageItemsAsync(); + var files = storageItems.OfType(); + + await AttachFiles(files); + } + } + // State should be reset even when an exception occurs, otherwise the UI will be stuck in a dragging state. + finally + { + ViewModel.IsDraggingOverComposerGrid = false; + ViewModel.IsDraggingOverFilesDropZone = false; + } + } + + private void OnImageDropGridDragEnter(object sender, DragEventArgs e) + { + bool isValid = false; + if (e.DataView.Contains(StandardDataFormats.StorageItems)) + { + // We can't use async/await here because DragUIOverride becomes inaccessible. + // https://github.com/microsoft/microsoft-ui-xaml/issues/9296 + var files = e.DataView.GetStorageItemsAsync().GetAwaiter().GetResult().OfType(); + + foreach (var file in files) + { + if (IsValidImageFile(file)) + { + isValid = true; + } + } + } + + e.AcceptedOperation = isValid ? DataPackageOperation.Copy : DataPackageOperation.None; + + if (isValid) + { + ViewModel.IsDraggingOverImagesDropZone = true; + e.DragUIOverride.Caption = Translator.ComposerAttachmentsDragDropAttach_Message; + e.DragUIOverride.IsCaptionVisible = true; + e.DragUIOverride.IsGlyphVisible = true; + e.DragUIOverride.IsContentVisible = true; + } + } + + private void OnImageDropGridDragLeave(object sender, DragEventArgs e) + { + ViewModel.IsDraggingOverImagesDropZone = false; + } + + private async void OnImageDropGridImageDropped(object sender, DragEventArgs e) + { + try + { + if (e.DataView.Contains(StandardDataFormats.StorageItems)) + { + var storageItems = await e.DataView.GetStorageItemsAsync(); + var files = storageItems.OfType(); + + var imagesInformation = new List(); + + foreach (var file in files) + { + if (IsValidImageFile(file)) + { + imagesInformation.Add(new ImageInfo + { + Data = await GetDataURL(file), + Name = file.Name + }); + } + } + + await WebViewEditor.InsertImagesAsync(imagesInformation); + } + } + // State should be reset even when an exception occurs, otherwise the UI will be stuck in a dragging state. + finally + { + ViewModel.IsDraggingOverComposerGrid = false; + ViewModel.IsDraggingOverImagesDropZone = false; + } + + static async Task GetDataURL(StorageFile file) + { + return $"data:image/{file.FileType.Replace(".", "")};base64,{Convert.ToBase64String(await file.ToByteArrayAsync())}"; + } + } + + private async Task AttachFiles(IEnumerable files) + { + if (files?.Any() != true) return; + + // Convert files to MailAttachmentViewModel. + foreach (var file in files) + { + var sharedFile = await file.ToSharedFileAsync(); + + ViewModel.IncludedAttachments.Add(new MailAttachmentViewModel(sharedFile)); + } + } + + private static bool IsValidImageFile(StorageFile file) + { + string[] allowedTypes = [".jpg", ".jpeg", ".png"]; + var fileType = file.FileType.ToLower(); + + return allowedTypes.Contains(fileType); + } + + private void DisposeDisposables() + { + if (_disposables.Count != 0) + _disposables.ForEach(a => a.Dispose()); + } + + protected override void OnNavigatedTo(NavigationEventArgs e) + { + base.OnNavigatedTo(e); + + FocusManager.GotFocus += GlobalFocusManagerGotFocus; + + // TODO: disabled animation for now, since it's still not working properly. + //var anim = ConnectedAnimationService.GetForCurrentView().GetAnimation("WebViewConnectedAnimation"); + //anim?.TryStart(GetWebView()); + + _disposables.Add(GetSuggestionBoxDisposable(ToBox)); + _disposables.Add(GetSuggestionBoxDisposable(CCBox)); + _disposables.Add(GetSuggestionBoxDisposable(BccBox)); + _disposables.Add(WebViewEditor); + + ViewModel.GetHTMLBodyFunction = WebViewEditor.GetHtmlBodyAsync; + } + + async void IRecipient.Receive(CreateNewComposeMailRequested message) + { + await WebViewEditor.RenderHtmlAsync(message.RenderModel.RenderHtml); + } + + private void ShowCCBCCClicked(object sender, RoutedEventArgs e) + { + ViewModel.IsCCBCCVisible = true; + } + + private async void TokenItemAdding(TokenizingTextBox sender, TokenItemAddingEventArgs args) + { + // Check is valid email. + if (!EmailValidator.Validate(args.TokenText)) + { + args.Cancel = true; + ViewModel.NotifyInvalidEmail(args.TokenText); + + return; + } + + var deferral = args.GetDeferral(); + + var addedItem = (sender.Tag?.ToString()) switch + { + "ToBox" => await ViewModel.GetAddressInformationAsync(args.TokenText, ViewModel.ToItems), + "CCBox" => await ViewModel.GetAddressInformationAsync(args.TokenText, ViewModel.CCItems), + "BCCBox" => await ViewModel.GetAddressInformationAsync(args.TokenText, ViewModel.BCCItems), + _ => null + }; + + if (addedItem == null) + { + args.Cancel = true; + ViewModel.NotifyAddressExists(); + } + else + { + args.Item = addedItem; + } + + deferral.Complete(); + } + + void IRecipient.Receive(ApplicationThemeChanged message) + { + WebViewEditor.IsEditorDarkMode = message.IsUnderlyingThemeDark; + } + + private void ImportanceClicked(object sender, RoutedEventArgs e) + { + ImportanceFlyout.Hide(); + ImportanceSplitButton.IsChecked = true; + + if (sender is Button senderButton) + { + ViewModel.SelectedMessageImportance = (MessageImportance)senderButton.Tag; + ((ImportanceSplitButton.Content as Viewbox).Child as SymbolIcon).Symbol = (senderButton.Content as SymbolIcon).Symbol; + } + } + + private async void AddressBoxLostFocus(object sender, RoutedEventArgs e) + { + // Automatically add current text as item if it is valid mail address. + + if (sender is TokenizingTextBox tokenizingTextBox) + { + if (tokenizingTextBox.Items.LastOrDefault() is not ITokenStringContainer info) return; + + var currentText = info.Text; + + if (!string.IsNullOrEmpty(currentText) && EmailValidator.Validate(currentText)) + { + var addressCollection = tokenizingTextBox.Tag?.ToString() switch + { + "ToBox" => ViewModel.ToItems, + "CCBox" => ViewModel.CCItems, + "BCCBox" => ViewModel.BCCItems, + _ => null + }; + + AccountContact addedItem = null; + + if (addressCollection != null) + addedItem = await ViewModel.GetAddressInformationAsync(currentText, addressCollection); + + // Item has already been added. + if (addedItem == null) + { + tokenizingTextBox.Text = string.Empty; + } + else if (addressCollection != null) + { + addressCollection.Add(addedItem); + tokenizingTextBox.Text = string.Empty; + } + } + } + } + + // Hack: Tokenizing text box losing focus somehow on page Loaded and shifting focus to this element. + // For once we'll switch back to it once CCBBCGotFocus element got focus. + + private bool isInitialFocusHandled = false; + + private void ComposerLoaded(object sender, RoutedEventArgs e) + { + ToBox.Focus(FocusState.Programmatic); + } + + private void CCBBCGotFocus(object sender, RoutedEventArgs e) + { + if (!isInitialFocusHandled) + { + isInitialFocusHandled = true; + ToBox.Focus(FocusState.Programmatic); + } + } + + protected override async void OnNavigatingFrom(NavigatingCancelEventArgs e) + { + base.OnNavigatingFrom(e); + + FocusManager.GotFocus -= GlobalFocusManagerGotFocus; + _navManagerPreview.CloseRequested -= OnClose; + await ViewModel.UpdateMimeChangesAsync(); + + DisposeDisposables(); + } + private async void OnClose(object sender, SystemNavigationCloseRequestedPreviewEventArgs e) + { + var deferral = e.GetDeferral(); + + try + { + await ViewModel.UpdateMimeChangesAsync(); + } + finally { deferral.Complete(); } + } +} diff --git a/Wino.Mail.WinUI/Views/IdlePage.xaml b/Wino.Mail.WinUI/Views/IdlePage.xaml new file mode 100644 index 00000000..2bba6489 --- /dev/null +++ b/Wino.Mail.WinUI/Views/IdlePage.xaml @@ -0,0 +1,15 @@ + + + + + + diff --git a/Wino.Mail.WinUI/Views/IdlePage.xaml.cs b/Wino.Mail.WinUI/Views/IdlePage.xaml.cs new file mode 100644 index 00000000..feb699b6 --- /dev/null +++ b/Wino.Mail.WinUI/Views/IdlePage.xaml.cs @@ -0,0 +1,11 @@ +using Wino.Views.Abstract; + +namespace Wino.Views; + +public sealed partial class IdlePage : IdlePageAbstract +{ + public IdlePage() + { + InitializeComponent(); + } +} diff --git a/Wino.Mail.WinUI/Views/ImapSetup/AdvancedImapSetupPage.xaml b/Wino.Mail.WinUI/Views/ImapSetup/AdvancedImapSetupPage.xaml new file mode 100644 index 00000000..7a46b215 --- /dev/null +++ b/Wino.Mail.WinUI/Views/ImapSetup/AdvancedImapSetupPage.xaml @@ -0,0 +1,278 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/Wino.Mail.WinUI/Views/MailListPage.xaml.cs b/Wino.Mail.WinUI/Views/MailListPage.xaml.cs new file mode 100644 index 00000000..c6cd821e --- /dev/null +++ b/Wino.Mail.WinUI/Views/MailListPage.xaml.cs @@ -0,0 +1,501 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Threading.Tasks; +using CommunityToolkit.Mvvm.Messaging; +using Microsoft.Extensions.DependencyInjection; +using Microsoft.UI.Xaml; +using Microsoft.UI.Xaml.Controls; +using Microsoft.UI.Xaml.Controls.Primitives; +using Microsoft.UI.Xaml.Input; +using Microsoft.UI.Xaml.Media.Animation; +using Microsoft.UI.Xaml.Navigation; +using MoreLinq; +using Windows.Foundation; +using Wino.Controls; +using Wino.Controls.Advanced; +using Wino.Core.Domain; +using Wino.Core.Domain.Enums; +using Wino.Core.Domain.Interfaces; +using Wino.Core.Domain.Models.MailItem; +using Wino.Core.Domain.Models.Menus; +using Wino.Core.Domain.Models.Navigation; +using Wino.Mail.ViewModels.Data; +using Wino.Mail.ViewModels.Messages; +using Wino.Mail.WinUI; +using Wino.MenuFlyouts.Context; +using Wino.Messaging.Client.Mails; +using Wino.Views.Abstract; + +namespace Wino.Views; + +public sealed partial class MailListPage : MailListPageAbstract, + IRecipient, + IRecipient, + IRecipient, + IRecipient +{ + private const double RENDERING_COLUMN_MIN_WIDTH = 375; + + private IStatePersistanceService StatePersistenceService { get; } = App.Current.Services.GetService(); + private IKeyPressService KeyPressService { get; } = App.Current.Services.GetService(); + + public MailListPage() + { + InitializeComponent(); + } + + protected override void OnNavigatedTo(NavigationEventArgs e) + { + base.OnNavigatedTo(e); + + // Bindings.Update(); + + // Delegate to ViewModel. + if (e.Parameter is NavigateMailFolderEventArgs folderNavigationArgs) + { + WeakReferenceMessenger.Default.Send(new ActiveMailFolderChangedEvent(folderNavigationArgs.BaseFolderMenuItem, folderNavigationArgs.FolderInitLoadAwaitTask)); + } + } + + protected override void OnNavigatedFrom(NavigationEventArgs e) + { + base.OnNavigatedFrom(e); + + // Dispose all WinoListView items. + + MailListView.Dispose(); + + this.Bindings.StopTracking(); + + RenderingFrame.Navigate(typeof(IdlePage)); + + GC.Collect(); + } + + private void UpdateSelectAllButtonStatus() + { + // Check all checkbox if all is selected. + // Unhook events to prevent selection overriding. + + SelectAllCheckbox.Checked -= SelectAllCheckboxChecked; + SelectAllCheckbox.Unchecked -= SelectAllCheckboxUnchecked; + + SelectAllCheckbox.IsChecked = MailListView.Items.Count > 0 && MailListView.SelectedItems.Count == MailListView.Items.Count; + + SelectAllCheckbox.Checked += SelectAllCheckboxChecked; + SelectAllCheckbox.Unchecked += SelectAllCheckboxUnchecked; + } + + private void SelectionModeToggleChecked(object sender, RoutedEventArgs e) + { + ChangeSelectionMode(ListViewSelectionMode.Multiple); + } + + private void FolderPivotChanged(object sender, SelectionChangedEventArgs e) + { + foreach (var addedItem in e.AddedItems) + { + if (addedItem is FolderPivotViewModel pivotItem) + { + pivotItem.IsSelected = true; + } + } + + foreach (var removedItem in e.RemovedItems) + { + if (removedItem is FolderPivotViewModel pivotItem) + { + pivotItem.IsSelected = false; + } + } + + SelectAllCheckbox.IsChecked = false; + SelectionModeToggle.IsChecked = false; + + MailListView.ClearSelections(); + + UpdateSelectAllButtonStatus(); + ViewModel.SelectedPivotChangedCommand.Execute(null); + } + + private void ChangeSelectionMode(ListViewSelectionMode mode) + { + MailListView.ChangeSelectionMode(mode); + + if (ViewModel?.PivotFolders != null) + { + ViewModel.PivotFolders.ForEach(a => a.IsExtendedMode = mode == ListViewSelectionMode.Extended); + } + } + + private void SelectionModeToggleUnchecked(object sender, RoutedEventArgs e) + { + ChangeSelectionMode(ListViewSelectionMode.Extended); + } + + private void SelectAllCheckboxChecked(object sender, RoutedEventArgs e) + { + MailListView.SelectAllWino(); + } + + private void SelectAllCheckboxUnchecked(object sender, RoutedEventArgs e) + { + MailListView.ClearSelections(); + } + + private async void MailItemContextRequested(UIElement sender, ContextRequestedEventArgs args) + { + // Context is requested from a single mail point, but we might have multiple selected items. + // This menu should be calculated based on all selected items by providers. + + if (sender is MailItemDisplayInformationControl control && args.TryGetPosition(sender, out Point p)) + { + await FocusManager.TryFocusAsync(control, FocusState.Keyboard); + + if (control.DataContext is IMailItem clickedMailItemContext) + { + var targetItems = ViewModel.GetTargetMailItemViewModels(clickedMailItemContext); + var availableActions = ViewModel.GetAvailableMailActions(targetItems); + + if (!availableActions?.Any() ?? false) return; + var t = targetItems.ElementAt(0); + + ViewModel.ChangeCustomFocusedState(targetItems, true); + + var clickedOperation = await GetMailOperationFromFlyoutAsync(availableActions, control, p.X, p.Y); + + ViewModel.ChangeCustomFocusedState(targetItems, false); + + if (clickedOperation == null) return; + + var prepRequest = new MailOperationPreperationRequest(clickedOperation.Operation, targetItems.Select(a => a.MailCopy)); + + await ViewModel.ExecuteMailOperationAsync(prepRequest); + } + } + } + + private async Task GetMailOperationFromFlyoutAsync(IEnumerable availableActions, + UIElement showAtElement, + double x, + double y) + { + var source = new TaskCompletionSource(); + + var flyout = new MailOperationFlyout(availableActions, source); + + flyout.ShowAt(showAtElement, new FlyoutShowOptions() + { + ShowMode = FlyoutShowMode.Standard, + Position = new Point(x + 30, y - 20) + }); + + return await source.Task; + } + + void IRecipient.Receive(ClearMailSelectionsRequested message) + { + MailListView.ClearSelections(null, preserveThreadExpanding: true); + } + + void IRecipient.Receive(ActiveMailItemChangedEvent message) + { + // No active mail item. Go to empty page. + if (message.SelectedMailItemViewModel == null) + { + WeakReferenceMessenger.Default.Send(new CancelRenderingContentRequested()); + } + else + { + // Navigate to composing page. + if (message.SelectedMailItemViewModel.IsDraft) + { + NavigationTransitionType composerPageTransition = NavigationTransitionType.None; + + // Dispose active rendering if there is any and go to composer. + if (IsRenderingPageActive()) + { + // Prepare WebView2 animation from Rendering to Composing page. + PrepareRenderingPageWebViewTransition(); + + // Dispose existing HTML content from rendering page webview. + WeakReferenceMessenger.Default.Send(new CancelRenderingContentRequested()); + } + else if (IsComposingPageActive()) + { + // Composer is already active. Prepare composer WebView2 animation. + PrepareComposePageWebViewTransition(); + } + else + composerPageTransition = NavigationTransitionType.DrillIn; + + ViewModel.NavigationService.Navigate(WinoPage.ComposePage, message.SelectedMailItemViewModel, NavigationReferenceFrame.RenderingFrame, composerPageTransition); + } + else + { + // Find the MIME and go to rendering page. + + if (message.SelectedMailItemViewModel == null) return; + + if (IsComposingPageActive()) + { + PrepareComposePageWebViewTransition(); + } + + ViewModel.NavigationService.Navigate(WinoPage.MailRenderingPage, message.SelectedMailItemViewModel, NavigationReferenceFrame.RenderingFrame); + } + } + + UpdateAdaptiveness(); + } + + private bool IsRenderingPageActive() => RenderingFrame.Content is MailRenderingPage; + private bool IsComposingPageActive() => RenderingFrame.Content is ComposePage; + + private void PrepareComposePageWebViewTransition() + { + var webView = GetComposerPageWebView(); + + if (webView != null) + { + var animation = ConnectedAnimationService.GetForCurrentView().PrepareToAnimate("WebViewConnectedAnimation", webView); + animation.Configuration = new BasicConnectedAnimationConfiguration(); + } + } + + private void PrepareRenderingPageWebViewTransition() + { + var webView = GetRenderingPageWebView(); + + if (webView != null) + { + var animation = ConnectedAnimationService.GetForCurrentView().PrepareToAnimate("WebViewConnectedAnimation", webView); + animation.Configuration = new BasicConnectedAnimationConfiguration(); + } + } + + #region Connected Animation Helpers + + private WebView2 GetRenderingPageWebView() + { + if (RenderingFrame.Content is MailRenderingPage renderingPage) + return renderingPage.GetWebView(); + + return null; + } + + private WebView2 GetComposerPageWebView() + { + if (RenderingFrame.Content is ComposePage composePage) + return composePage.GetWebView(); + + return null; + } + + #endregion + + public async void Receive(SelectMailItemContainerEvent message) + { + if (message.SelectedMailViewModel == null) return; + + await ViewModel.ExecuteUIThread(async () => + { + MailListView.ClearSelections(message.SelectedMailViewModel, true); + + int retriedSelectionCount = 0; + trySelection: + + bool isSelected = MailListView.SelectMailItemContainer(message.SelectedMailViewModel); + + if (!isSelected) + { + for (int i = retriedSelectionCount; i < 5;) + { + // Retry with delay until the container is realized. Max 1 second. + await Task.Delay(200); + + retriedSelectionCount++; + + goto trySelection; + } + } + + // Automatically scroll to the selected item. + // This is useful when creating draft. + if (isSelected && message.ScrollToItem) + { + var collectionContainer = ViewModel.MailCollection.GetMailItemContainer(message.SelectedMailViewModel.UniqueId); + + // Scroll to thread if available. + if (collectionContainer.ThreadViewModel != null) + { + MailListView.ScrollIntoView(collectionContainer.ThreadViewModel, ScrollIntoViewAlignment.Default); + } + else if (collectionContainer.ItemViewModel != null) + { + MailListView.ScrollIntoView(collectionContainer.ItemViewModel, ScrollIntoViewAlignment.Default); + } + + } + }); + } + + private void SearchBoxFocused(object sender, RoutedEventArgs e) + { + SearchBar.PlaceholderText = string.Empty; + } + + private void SearchBarUnfocused(object sender, RoutedEventArgs e) + { + SearchBar.PlaceholderText = Translator.SearchBarPlaceholder; + } + + /// + /// Thread header is mail info display control and it can be dragged spearately out of ListView. + /// We need to prepare a drag package for it from the items inside. + /// + private void ThreadHeaderDragStart(UIElement sender, DragStartingEventArgs args) + { + if (sender is MailItemDisplayInformationControl control + && control.ConnectedExpander?.Content is WinoListView contentListView) + { + var allItems = contentListView.Items.Where(a => a is IMailItem); + + // Highlight all items. + allItems.Cast().ForEach(a => a.IsCustomFocused = true); + + // Set native drag arg properties. + args.AllowedOperations = Windows.ApplicationModel.DataTransfer.DataPackageOperation.Move; + + var dragPackage = new MailDragPackage(allItems.Cast()); + + args.Data.Properties.Add(nameof(MailDragPackage), dragPackage); + args.DragUI.SetContentFromDataPackage(); + + control.ConnectedExpander.IsExpanded = true; + } + } + + private void ThreadHeaderDragFinished(UIElement sender, DropCompletedEventArgs args) + { + if (sender is MailItemDisplayInformationControl control && control.ConnectedExpander != null && control.ConnectedExpander.Content is WinoListView contentListView) + { + contentListView.Items.Where(a => a is MailItemViewModel).Cast().ForEach(a => a.IsCustomFocused = false); + } + } + + private async void LeftSwipeItemInvoked(Microsoft.UI.Xaml.Controls.SwipeItem sender, Microsoft.UI.Xaml.Controls.SwipeItemInvokedEventArgs args) + { + // Delete item for now. + + var swipeControl = args.SwipeControl; + + swipeControl.Close(); + + if (swipeControl.Tag is MailItemViewModel mailItemViewModel) + { + var package = new MailOperationPreperationRequest(MailOperation.SoftDelete, mailItemViewModel.MailCopy); + await ViewModel.ExecuteMailOperationAsync(package); + } + else if (swipeControl.Tag is ThreadMailItemViewModel threadMailItemViewModel) + { + var package = new MailOperationPreperationRequest(MailOperation.SoftDelete, threadMailItemViewModel.GetMailCopies()); + await ViewModel.ExecuteMailOperationAsync(package); + } + } + + private async void RightSwipeItemInvoked(Microsoft.UI.Xaml.Controls.SwipeItem sender, Microsoft.UI.Xaml.Controls.SwipeItemInvokedEventArgs args) + { + // Toggle status only for now. + + var swipeControl = args.SwipeControl; + + swipeControl.Close(); + + if (swipeControl.Tag is MailItemViewModel mailItemViewModel) + { + var operation = mailItemViewModel.IsRead ? MailOperation.MarkAsUnread : MailOperation.MarkAsRead; + var package = new MailOperationPreperationRequest(operation, mailItemViewModel.MailCopy); + + await ViewModel.ExecuteMailOperationAsync(package); + } + else if (swipeControl.Tag is ThreadMailItemViewModel threadMailItemViewModel) + { + bool isAllRead = threadMailItemViewModel.ThreadItems.All(a => a.IsRead); + + var operation = isAllRead ? MailOperation.MarkAsUnread : MailOperation.MarkAsRead; + var package = new MailOperationPreperationRequest(operation, threadMailItemViewModel.GetMailCopies()); + + await ViewModel.ExecuteMailOperationAsync(package); + } + } + + private void PullToRefreshRequested(Microsoft.UI.Xaml.Controls.RefreshContainer sender, Microsoft.UI.Xaml.Controls.RefreshRequestedEventArgs args) + { + ViewModel.SyncFolderCommand?.Execute(null); + } + + private async void SearchBar_TextChanged(AutoSuggestBox sender, AutoSuggestBoxTextChangedEventArgs args) + { + // User clicked 'x' button to clearout the search text. + if (args.Reason == AutoSuggestionBoxTextChangeReason.UserInput && string.IsNullOrWhiteSpace(sender.Text)) + { + ViewModel.IsOnlineSearchButtonVisible = false; + await ViewModel.PerformSearchAsync(); + } + } + + public void Receive(DisposeRenderingFrameRequested message) + { + ViewModel.NavigationService.Navigate(WinoPage.IdlePage, null, NavigationReferenceFrame.RenderingFrame, NavigationTransitionType.DrillIn); + } + + private void PageSizeChanged(object sender, SizeChangedEventArgs e) + { + ViewModel.MaxMailListLength = e.NewSize.Width - RENDERING_COLUMN_MIN_WIDTH; + + StatePersistenceService.IsReaderNarrowed = e.NewSize.Width < StatePersistenceService.MailListPaneLength + RENDERING_COLUMN_MIN_WIDTH; + + UpdateAdaptiveness(); + } + + private void MailListSizerManipulationCompleted(object sender, ManipulationCompletedRoutedEventArgs e) + { + StatePersistenceService.MailListPaneLength = ViewModel.MailListLength; + } + + private void UpdateAdaptiveness() + { + bool isMultiSelectionEnabled = ViewModel.IsMultiSelectionModeEnabled || KeyPressService.IsCtrlKeyPressed(); + + if (StatePersistenceService.IsReaderNarrowed) + { + if (ViewModel.HasSingleItemSelection && !isMultiSelectionEnabled) + { + VisualStateManager.GoToState(this, "NarrowRenderer", true); + } + else + { + VisualStateManager.GoToState(this, "NarrowMailList", true); + } + } + else + { + if (ViewModel.HasSingleItemSelection && !isMultiSelectionEnabled) + { + VisualStateManager.GoToState(this, "BothPanelsMailSelected", true); + } + else + { + VisualStateManager.GoToState(this, "BothPanelsNoMailSelected", true); + } + } + } + + private void SelectAllInvoked(KeyboardAccelerator sender, KeyboardAcceleratorInvokedEventArgs args) + => MailListView.SelectAllWino(); + + private void DeleteAllInvoked(KeyboardAccelerator sender, KeyboardAcceleratorInvokedEventArgs args) + => ViewModel.ExecuteMailOperationCommand.Execute(MailOperation.SoftDelete); +} diff --git a/Wino.Mail.WinUI/Views/MailRenderingPage.xaml b/Wino.Mail.WinUI/Views/MailRenderingPage.xaml new file mode 100644 index 00000000..7bea60ec --- /dev/null +++ b/Wino.Mail.WinUI/Views/MailRenderingPage.xaml @@ -0,0 +1,436 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/Wino.Mail.WinUI/Views/Settings/AboutPage.xaml.cs b/Wino.Mail.WinUI/Views/Settings/AboutPage.xaml.cs new file mode 100644 index 00000000..6bc28703 --- /dev/null +++ b/Wino.Mail.WinUI/Views/Settings/AboutPage.xaml.cs @@ -0,0 +1,11 @@ +using Wino.Views.Abstract; + +namespace Wino.Views.Settings; + +public sealed partial class AboutPage : AboutPageAbstract +{ + public AboutPage() + { + InitializeComponent(); + } +} diff --git a/Wino.Mail.WinUI/Views/Settings/AliasManagementPage.xaml b/Wino.Mail.WinUI/Views/Settings/AliasManagementPage.xaml new file mode 100644 index 00000000..059b0c19 --- /dev/null +++ b/Wino.Mail.WinUI/Views/Settings/AliasManagementPage.xaml @@ -0,0 +1,180 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/Wino.Mail.WinUI/Views/Settings/AliasManagementPage.xaml.cs b/Wino.Mail.WinUI/Views/Settings/AliasManagementPage.xaml.cs new file mode 100644 index 00000000..488a8959 --- /dev/null +++ b/Wino.Mail.WinUI/Views/Settings/AliasManagementPage.xaml.cs @@ -0,0 +1,11 @@ +using Wino.Views.Abstract; + +namespace Wino.Views.Settings; + +public sealed partial class AliasManagementPage : AliasManagementPageAbstract +{ + public AliasManagementPage() + { + this.InitializeComponent(); + } +} diff --git a/Wino.Mail.WinUI/Views/Settings/AppPreferencesPage.xaml b/Wino.Mail.WinUI/Views/Settings/AppPreferencesPage.xaml new file mode 100644 index 00000000..e0d7f809 --- /dev/null +++ b/Wino.Mail.WinUI/Views/Settings/AppPreferencesPage.xaml @@ -0,0 +1,66 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/Wino.Mail.WinUI/Views/Settings/AppPreferencesPage.xaml.cs b/Wino.Mail.WinUI/Views/Settings/AppPreferencesPage.xaml.cs new file mode 100644 index 00000000..5c41c0df --- /dev/null +++ b/Wino.Mail.WinUI/Views/Settings/AppPreferencesPage.xaml.cs @@ -0,0 +1,11 @@ +using Wino.Views.Abstract; + +namespace Wino.Views.Settings; + +public sealed partial class AppPreferencesPage : AppPreferencesPageAbstract +{ + public AppPreferencesPage() + { + this.InitializeComponent(); + } +} diff --git a/Wino.Mail.WinUI/Views/Settings/EditAccountDetailsPage.xaml b/Wino.Mail.WinUI/Views/Settings/EditAccountDetailsPage.xaml new file mode 100644 index 00000000..0578fb50 --- /dev/null +++ b/Wino.Mail.WinUI/Views/Settings/EditAccountDetailsPage.xaml @@ -0,0 +1,238 @@ + + + + + + + + + + + + + + + + + + + + + + + + + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/Wino.Core.WinUI/Controls/WinoAppTitleBar.xaml.cs b/Wino.Core.WinUI/Controls/WinoAppTitleBar.xaml.cs deleted file mode 100644 index ecb7a33c..00000000 --- a/Wino.Core.WinUI/Controls/WinoAppTitleBar.xaml.cs +++ /dev/null @@ -1,255 +0,0 @@ -using System.Windows.Input; -using Windows.Foundation; -using Microsoft.UI.Xaml; -using Microsoft.UI.Xaml.Controls; -using Wino.Core.Domain.Enums; - -namespace Wino.Core.WinUI.Controls; - -public sealed partial class WinoAppTitleBar : UserControl -{ - public event TypedEventHandler BackButtonClicked; - - public static readonly DependencyProperty IsRenderingPaneVisibleProperty = DependencyProperty.Register(nameof(IsRenderingPaneVisible), typeof(bool), typeof(WinoAppTitleBar), new PropertyMetadata(false, OnDrawingPropertyChanged)); - public static readonly DependencyProperty IsReaderNarrowedProperty = DependencyProperty.Register(nameof(IsReaderNarrowed), typeof(bool), typeof(WinoAppTitleBar), new PropertyMetadata(false, OnIsReaderNarrowedChanged)); - public static readonly DependencyProperty IsBackButtonVisibleProperty = DependencyProperty.Register(nameof(IsBackButtonVisible), typeof(bool), typeof(WinoAppTitleBar), new PropertyMetadata(false, OnDrawingPropertyChanged)); - public static readonly DependencyProperty OpenPaneLengthProperty = DependencyProperty.Register(nameof(OpenPaneLength), typeof(double), typeof(WinoAppTitleBar), new PropertyMetadata(0d, OnDrawingPropertyChanged)); - public static readonly DependencyProperty IsNavigationPaneOpenProperty = DependencyProperty.Register(nameof(IsNavigationPaneOpen), typeof(bool), typeof(WinoAppTitleBar), new PropertyMetadata(false, OnDrawingPropertyChanged)); - public static readonly DependencyProperty NavigationViewDisplayModeProperty = DependencyProperty.Register(nameof(NavigationViewDisplayMode), typeof(Microsoft.UI.Xaml.Controls.NavigationViewDisplayMode), typeof(WinoAppTitleBar), new PropertyMetadata(Microsoft.UI.Xaml.Controls.NavigationViewDisplayMode.Compact, OnDrawingPropertyChanged)); - public static readonly DependencyProperty ShellFrameContentProperty = DependencyProperty.Register(nameof(ShellFrameContent), typeof(UIElement), typeof(WinoAppTitleBar), new PropertyMetadata(null, OnDrawingPropertyChanged)); - public static readonly DependencyProperty SystemReservedProperty = DependencyProperty.Register(nameof(SystemReserved), typeof(double), typeof(WinoAppTitleBar), new PropertyMetadata(0, OnDrawingPropertyChanged)); - public static readonly DependencyProperty CoreWindowTextProperty = DependencyProperty.Register(nameof(CoreWindowText), typeof(string), typeof(WinoAppTitleBar), new PropertyMetadata(string.Empty, OnDrawingPropertyChanged)); - public static readonly DependencyProperty ReadingPaneLengthProperty = DependencyProperty.Register(nameof(ReadingPaneLength), typeof(double), typeof(WinoAppTitleBar), new PropertyMetadata(420d, OnDrawingPropertyChanged)); - public static readonly DependencyProperty ConnectionStatusProperty = DependencyProperty.Register(nameof(ConnectionStatus), typeof(WinoServerConnectionStatus), typeof(WinoAppTitleBar), new PropertyMetadata(WinoServerConnectionStatus.None, new PropertyChangedCallback(OnConnectionStatusChanged))); - public static readonly DependencyProperty ReconnectCommandProperty = DependencyProperty.Register(nameof(ReconnectCommand), typeof(ICommand), typeof(WinoAppTitleBar), new PropertyMetadata(null)); - public static readonly DependencyProperty ShrinkShellContentOnExpansionProperty = DependencyProperty.Register(nameof(ShrinkShellContentOnExpansion), typeof(bool), typeof(WinoAppTitleBar), new PropertyMetadata(true)); - public static readonly DependencyProperty IsDragAreaProperty = DependencyProperty.Register(nameof(IsDragArea), typeof(bool), typeof(WinoAppTitleBar), new PropertyMetadata(false, new PropertyChangedCallback(OnIsDragAreaChanged))); - public static readonly DependencyProperty IsShellFrameContentVisibleProperty = DependencyProperty.Register(nameof(IsShellFrameContentVisible), typeof(bool), typeof(WinoAppTitleBar), new PropertyMetadata(true)); - public static readonly DependencyProperty IsMenuButtonVisibleProperty = DependencyProperty.Register(nameof(IsMenuButtonVisible), typeof(bool), typeof(WinoAppTitleBar), new PropertyMetadata(true)); - - public bool IsShellFrameContentVisible - { - get { return (bool)GetValue(IsShellFrameContentVisibleProperty); } - set { SetValue(IsShellFrameContentVisibleProperty, value); } - } - - public ICommand ReconnectCommand - { - get { return (ICommand)GetValue(ReconnectCommandProperty); } - set { SetValue(ReconnectCommandProperty, value); } - } - - public WinoServerConnectionStatus ConnectionStatus - { - get { return (WinoServerConnectionStatus)GetValue(ConnectionStatusProperty); } - set { SetValue(ConnectionStatusProperty, value); } - } - - public string CoreWindowText - { - get { return (string)GetValue(CoreWindowTextProperty); } - set { SetValue(CoreWindowTextProperty, value); } - } - - public bool IsDragArea - { - get { return (bool)GetValue(IsDragAreaProperty); } - set { SetValue(IsDragAreaProperty, value); } - } - - - public double SystemReserved - { - get { return (double)GetValue(SystemReservedProperty); } - set { SetValue(SystemReservedProperty, value); } - } - - public UIElement ShellFrameContent - { - get { return (UIElement)GetValue(ShellFrameContentProperty); } - set { SetValue(ShellFrameContentProperty, value); } - } - - public Microsoft.UI.Xaml.Controls.NavigationViewDisplayMode NavigationViewDisplayMode - { - get { return (Microsoft.UI.Xaml.Controls.NavigationViewDisplayMode)GetValue(NavigationViewDisplayModeProperty); } - set { SetValue(NavigationViewDisplayModeProperty, value); } - } - - public bool ShrinkShellContentOnExpansion - { - get { return (bool)GetValue(ShrinkShellContentOnExpansionProperty); } - set { SetValue(ShrinkShellContentOnExpansionProperty, value); } - } - - public bool IsNavigationPaneOpen - { - get { return (bool)GetValue(IsNavigationPaneOpenProperty); } - set { SetValue(IsNavigationPaneOpenProperty, value); } - } - - public double OpenPaneLength - { - get { return (double)GetValue(OpenPaneLengthProperty); } - set { SetValue(OpenPaneLengthProperty, value); } - } - - - - public bool IsMenuButtonVisible - { - get { return (bool)GetValue(IsMenuButtonVisibleProperty); } - set { SetValue(IsMenuButtonVisibleProperty, value); } - } - - - public bool IsBackButtonVisible - { - get { return (bool)GetValue(IsBackButtonVisibleProperty); } - set { SetValue(IsBackButtonVisibleProperty, value); } - } - - public bool IsReaderNarrowed - { - get { return (bool)GetValue(IsReaderNarrowedProperty); } - set { SetValue(IsReaderNarrowedProperty, value); } - } - - public bool IsRenderingPaneVisible - { - get { return (bool)GetValue(IsRenderingPaneVisibleProperty); } - set { SetValue(IsRenderingPaneVisibleProperty, value); } - } - - public double ReadingPaneLength - { - get { return (double)GetValue(ReadingPaneLengthProperty); } - set { SetValue(ReadingPaneLengthProperty, value); } - } - - private static void OnIsReaderNarrowedChanged(DependencyObject obj, DependencyPropertyChangedEventArgs args) - { - if (obj is WinoAppTitleBar bar) - { - bar.DrawTitleBar(); - } - } - - private static void OnDrawingPropertyChanged(DependencyObject obj, DependencyPropertyChangedEventArgs args) - { - if (obj is WinoAppTitleBar bar) - { - bar.DrawTitleBar(); - } - } - - private static void OnConnectionStatusChanged(DependencyObject obj, DependencyPropertyChangedEventArgs args) - { - if (obj is WinoAppTitleBar bar) - { - bar.UpdateConnectionStatus(); - } - } - - private static void OnIsDragAreaChanged(DependencyObject obj, DependencyPropertyChangedEventArgs args) - { - if (obj is WinoAppTitleBar bar) - { - bar.SetDragArea(); - } - } - - private void SetDragArea() - { - if (IsDragArea) - { - Window.Current.SetTitleBar(dragbar); - } - } - - private void UpdateConnectionStatus() - { - - } - - private void DrawTitleBar() - { - UpdateLayout(); - - CoreWindowTitleTextBlock.Visibility = Visibility.Collapsed; - ShellContentContainer.Width = double.NaN; - ShellContentContainer.Margin = new Thickness(0, 0, 0, 0); - ShellContentContainer.HorizontalAlignment = HorizontalAlignment.Stretch; - - EmptySpaceWidth.Width = new GridLength(1, GridUnitType.Star); - - // Menu is not visible. - if (NavigationViewDisplayMode == Microsoft.UI.Xaml.Controls.NavigationViewDisplayMode.Minimal) - { - - } - else if (NavigationViewDisplayMode == Microsoft.UI.Xaml.Controls.NavigationViewDisplayMode.Compact) - { - // Icons are visible. - - if (!IsReaderNarrowed && ShrinkShellContentOnExpansion) - { - ShellContentContainer.HorizontalAlignment = HorizontalAlignment.Left; - ShellContentContainer.Width = ReadingPaneLength; - } - } - else if (NavigationViewDisplayMode == Microsoft.UI.Xaml.Controls.NavigationViewDisplayMode.Expanded) - { - if (IsNavigationPaneOpen) - { - CoreWindowTitleTextBlock.Visibility = Visibility.Visible; - - // LMargin = OpenPaneLength - LeftMenuStackPanel - ShellContentContainer.Margin = new Thickness(OpenPaneLength - LeftMenuStackPanel.ActualSize.X, 0, 0, 0); - - if (!IsReaderNarrowed && ShrinkShellContentOnExpansion) - { - ShellContentContainer.HorizontalAlignment = HorizontalAlignment.Left; - ShellContentContainer.Width = ReadingPaneLength; - } - } - else - { - if (ShrinkShellContentOnExpansion) - { - EmptySpaceWidth.Width = new GridLength(ReadingPaneLength, GridUnitType.Pixel); - } - else - { - EmptySpaceWidth.Width = new GridLength(ReadingPaneLength, GridUnitType.Star); - } - } - } - } - - public WinoAppTitleBar() - { - InitializeComponent(); - } - - private void BackClicked(object sender, RoutedEventArgs e) - { - BackButtonClicked?.Invoke(this, e); - } - - private void PaneClicked(object sender, RoutedEventArgs e) - { - IsNavigationPaneOpen = !IsNavigationPaneOpen; - } - - private void TitlebarSizeChanged(object sender, SizeChangedEventArgs e) => DrawTitleBar(); - - private void ReconnectClicked(object sender, RoutedEventArgs e) - { - // Close the popup for reconnect button. - ReconnectFlyout.Hide(); - - // Execute the reconnect command. - ReconnectCommand?.Execute(null); - } -} diff --git a/Wino.Core.WinUI/CoreUWPContainerSetup.cs b/Wino.Core.WinUI/CoreUWPContainerSetup.cs index 3460f473..95d74bc0 100644 --- a/Wino.Core.WinUI/CoreUWPContainerSetup.cs +++ b/Wino.Core.WinUI/CoreUWPContainerSetup.cs @@ -12,7 +12,7 @@ public static class CoreUWPContainerSetup { public static void RegisterCoreUWPServices(this IServiceCollection services) { - var serverConnectionManager = new WinoServerConnectionManager(); + var serverConnectionManager = new EmptyWinoServerConnectionManager(); services.AddSingleton(serverConnectionManager); services.AddSingleton>(serverConnectionManager); diff --git a/Wino.Core.WinUI/Helpers/XamlHelpers.cs b/Wino.Core.WinUI/Helpers/XamlHelpers.cs index da5281a0..96acbf03 100644 --- a/Wino.Core.WinUI/Helpers/XamlHelpers.cs +++ b/Wino.Core.WinUI/Helpers/XamlHelpers.cs @@ -161,7 +161,7 @@ public static class XamlHelpers return Translator.UnknownDateHeader; } - public static bool ConnectionStatusEquals(WinoServerConnectionStatus winoServerConnectionStatus, WinoServerConnectionStatus connectionStatus) => winoServerConnectionStatus == connectionStatus; + #endregion diff --git a/Wino.Core.WinUI/Services/EmptyWinoServerConnectionManager.cs b/Wino.Core.WinUI/Services/EmptyWinoServerConnectionManager.cs new file mode 100644 index 00000000..a6b0da50 --- /dev/null +++ b/Wino.Core.WinUI/Services/EmptyWinoServerConnectionManager.cs @@ -0,0 +1,55 @@ +using System; +using System.Threading; +using System.Threading.Tasks; +using Wino.Core.Domain.Interfaces; + +namespace Wino.Core.WinUI.Services; + +/// +/// Empty implementation of IWinoServerConnectionManager that returns default values. +/// This replaces the old AppServiceConnection-based implementation. +/// +public class EmptyWinoServerConnectionManager : IWinoServerConnectionManager +{ + public event EventHandler StatusChanged { add { } remove { } } + + public WinoServerConnectionStatus Status => WinoServerConnectionStatus.Connected; + + public TaskCompletionSource ConnectingHandle { get; } = new TaskCompletionSource(); + + public EmptyWinoServerConnectionManager() + { + ConnectingHandle.SetResult(true); + } + + public Task ConnectAsync() + { + return Task.FromResult(true); + } + + public Task QueueRequestAsync(IRequestBase request, Guid accountId) + { + return Task.CompletedTask; + } + + public Task> GetResponseAsync(TRequestType clientMessage, CancellationToken cancellationToken = default) + where TRequestType : IClientMessage + { + var response = WinoServerResponse.CreateSuccessResponse(default(TResponse)); + return Task.FromResult(response); + } +} + +/// +/// Generic empty implementation for typed connection managers. +/// +/// The connection type (not used in this implementation) +public class EmptyWinoServerConnectionManager : EmptyWinoServerConnectionManager, IWinoServerConnectionManager +{ + public TAppServiceConnection Connection { get; set; } + + public Task InitializeAsync() + { + return Task.CompletedTask; + } +} \ No newline at end of file diff --git a/Wino.Core.WinUI/Services/PreferencesService.cs b/Wino.Core.WinUI/Services/PreferencesService.cs index 8d14f168..215daacc 100644 --- a/Wino.Core.WinUI/Services/PreferencesService.cs +++ b/Wino.Core.WinUI/Services/PreferencesService.cs @@ -236,12 +236,6 @@ public class PreferencesService(IConfigurationService configurationService) : Ob set => SaveProperty(propertyName: nameof(AutoSelectNextItem), value); } - public ServerBackgroundMode ServerTerminationBehavior - { - get => _configurationService.Get(nameof(ServerTerminationBehavior), ServerBackgroundMode.MinimizedTray); - set => SaveProperty(propertyName: nameof(ServerTerminationBehavior), value); - } - public string DiagnosticId { get => _configurationService.Get(nameof(DiagnosticId), Guid.NewGuid().ToString()); diff --git a/Wino.Core.WinUI/Services/WinoServerConnectionManager.cs b/Wino.Core.WinUI/Services/WinoServerConnectionManager.cs deleted file mode 100644 index cc11c47b..00000000 --- a/Wino.Core.WinUI/Services/WinoServerConnectionManager.cs +++ /dev/null @@ -1,369 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Diagnostics.CodeAnalysis; -using System.Text.Json; -using System.Threading; -using System.Threading.Tasks; -using CommunityToolkit.Mvvm.Messaging; -using Nito.AsyncEx; -using Serilog; -using Windows.ApplicationModel; -using Windows.ApplicationModel.AppService; -using Windows.Foundation.Collections; -using Windows.Foundation.Metadata; -using Wino.Core.Domain.Enums; -using Wino.Core.Domain.Interfaces; -using Wino.Core.Domain.Models.Requests; -using Wino.Core.Domain.Models.Server; -using Wino.Core.Integration.Json; -using Wino.Messaging; -using Wino.Messaging.Client.Connection; -using Wino.Messaging.Enums; -using Wino.Messaging.Server; -using Wino.Messaging.UI; - -namespace Wino.Core.WinUI.Services; - -public class WinoServerConnectionManager : - IWinoServerConnectionManager, - IRecipient -{ - private const int ServerConnectionTimeoutMs = 10000; - - public event EventHandler StatusChanged; - - public TaskCompletionSource ConnectingHandle { get; private set; } - - private ILogger Logger => Logger.ForContext(); - - private WinoServerConnectionStatus status; - - public WinoServerConnectionStatus Status - { - get { return status; } - private set - { - Log.Information("Server connection status changed to {Status}.", value); - status = value; - StatusChanged?.Invoke(this, value); - } - } - - private AppServiceConnection _connection; - public AppServiceConnection Connection - { - get { return _connection; } - set - { - if (_connection != null) - { - _connection.RequestReceived -= ServerMessageReceived; - _connection.ServiceClosed -= ServerDisconnected; - } - - _connection = value; - - if (value == null) - { - Status = WinoServerConnectionStatus.Disconnected; - } - else - { - value.RequestReceived += ServerMessageReceived; - value.ServiceClosed += ServerDisconnected; - - Status = WinoServerConnectionStatus.Connected; - } - } - } - - private readonly JsonSerializerOptions _jsonSerializerOptions = new() - { - TypeInfoResolver = new ServerRequestTypeInfoResolver() - }; - - public WinoServerConnectionManager() - { - WeakReferenceMessenger.Default.Register(this); - } - - public async Task ConnectAsync() - { - if (Status == WinoServerConnectionStatus.Connected) - { - Log.Information("Server is already connected."); - return true; - } - - if (Status == WinoServerConnectionStatus.Connecting) - { - // A connection is already being established at the moment. - // No need to run another connection establishment process. - // Await the connecting handler if possible. - - if (ConnectingHandle != null) - { - return await ConnectingHandle.Task; - } - } - - if (ApiInformation.IsApiContractPresent("Windows.ApplicationModel.FullTrustAppContract", 1, 0)) - { - try - { - ConnectingHandle = new TaskCompletionSource(); - - Status = WinoServerConnectionStatus.Connecting; - - var connectionCancellationToken = new CancellationTokenSource(TimeSpan.FromMilliseconds(ServerConnectionTimeoutMs)); - - await FullTrustProcessLauncher.LaunchFullTrustProcessForCurrentAppAsync("WinoServer"); - - // Connection establishment handler is in App.xaml.cs OnBackgroundActivated. - // Once the connection is established, the handler will set the Connection property - // and WinoServerConnectionEstablished will be fired by the messenger. - - await ConnectingHandle.Task.WaitAsync(connectionCancellationToken.Token); - - Log.Information("Server connection established successfully."); - } - catch (OperationCanceledException canceledException) - { - Log.Error(canceledException, $"Server process did not start in {ServerConnectionTimeoutMs} ms. Operation is canceled."); - - ConnectingHandle?.TrySetException(canceledException); - - Status = WinoServerConnectionStatus.Failed; - return false; - } - catch (Exception ex) - { - Log.Error(ex, "Failed to connect to the server."); - - ConnectingHandle?.TrySetException(ex); - - Status = WinoServerConnectionStatus.Failed; - return false; - } - - return true; - } - else - { - Log.Information("FullTrustAppContract is not present in the system. Server connection is not possible."); - } - - return false; - } - - public async Task InitializeAsync() - { - var isConnectionSuccessfull = await ConnectAsync(); - - if (isConnectionSuccessfull) - { - Log.Information("ServerConnectionManager initialized successfully."); - } - else - { - Log.Error("ServerConnectionManager initialization failed."); - } - } - - private void ServerMessageReceived(AppServiceConnection sender, AppServiceRequestReceivedEventArgs args) - { - if (args.Request.Message.TryGetValue(MessageConstants.MessageTypeKey, out object messageTypeObject) && messageTypeObject is int messageTypeInt) - { - var messageType = (MessageType)messageTypeInt; - - if (args.Request.Message.TryGetValue(MessageConstants.MessageDataKey, out object messageDataObject) && messageDataObject is string messageJson) - { - switch (messageType) - { - case MessageType.UIMessage: - if (!args.Request.Message.TryGetValue(MessageConstants.MessageDataTypeKey, out object dataTypeObject) || dataTypeObject is not string dataTypeName) - throw new ArgumentException("Message data type is missing."); - - HandleUIMessage(messageJson, dataTypeName); - break; - default: - break; - } - } - } - } - - /// - /// Unpacks IServerMessage objects and delegate it to Messenger for UI to process. - /// - /// Message data in json format. - private void HandleUIMessage(string messageJson, string typeName) - { - switch (typeName) - { - case nameof(MailAddedMessage): - WeakReferenceMessenger.Default.Send(JsonSerializer.Deserialize(messageJson, CommunicationMessagesContext.Default.MailAddedMessage)); - break; - case nameof(MailDownloadedMessage): - WeakReferenceMessenger.Default.Send(JsonSerializer.Deserialize(messageJson, CommunicationMessagesContext.Default.MailDownloadedMessage)); - break; - case nameof(MailRemovedMessage): - WeakReferenceMessenger.Default.Send(JsonSerializer.Deserialize(messageJson, CommunicationMessagesContext.Default.MailRemovedMessage)); - break; - case nameof(MailUpdatedMessage): - WeakReferenceMessenger.Default.Send(JsonSerializer.Deserialize(messageJson, CommunicationMessagesContext.Default.MailUpdatedMessage)); - break; - case nameof(AccountCreatedMessage): - WeakReferenceMessenger.Default.Send(JsonSerializer.Deserialize(messageJson, CommunicationMessagesContext.Default.AccountCreatedMessage)); - break; - case nameof(AccountRemovedMessage): - WeakReferenceMessenger.Default.Send(JsonSerializer.Deserialize(messageJson, CommunicationMessagesContext.Default.AccountRemovedMessage)); - break; - case nameof(AccountUpdatedMessage): - WeakReferenceMessenger.Default.Send(JsonSerializer.Deserialize(messageJson, CommunicationMessagesContext.Default.AccountUpdatedMessage)); - break; - case nameof(DraftCreated): - WeakReferenceMessenger.Default.Send(JsonSerializer.Deserialize(messageJson, CommunicationMessagesContext.Default.DraftCreated)); - break; - case nameof(DraftFailed): - WeakReferenceMessenger.Default.Send(JsonSerializer.Deserialize(messageJson, CommunicationMessagesContext.Default.DraftFailed)); - break; - case nameof(DraftMapped): - WeakReferenceMessenger.Default.Send(JsonSerializer.Deserialize(messageJson, CommunicationMessagesContext.Default.DraftMapped)); - break; - case nameof(FolderRenamed): - WeakReferenceMessenger.Default.Send(JsonSerializer.Deserialize(messageJson, CommunicationMessagesContext.Default.FolderRenamed)); - break; - case nameof(FolderSynchronizationEnabled): - WeakReferenceMessenger.Default.Send(JsonSerializer.Deserialize(messageJson, CommunicationMessagesContext.Default.FolderSynchronizationEnabled)); - break; - case nameof(MergedInboxRenamed): - WeakReferenceMessenger.Default.Send(JsonSerializer.Deserialize(messageJson, CommunicationMessagesContext.Default.MergedInboxRenamed)); - break; - case nameof(AccountSynchronizationCompleted): - WeakReferenceMessenger.Default.Send(JsonSerializer.Deserialize(messageJson, CommunicationMessagesContext.Default.AccountSynchronizationCompleted)); - break; - case nameof(RefreshUnreadCountsMessage): - WeakReferenceMessenger.Default.Send(JsonSerializer.Deserialize(messageJson, CommunicationMessagesContext.Default.RefreshUnreadCountsMessage)); - break; - case nameof(AccountSynchronizerStateChanged): - WeakReferenceMessenger.Default.Send(JsonSerializer.Deserialize(messageJson, CommunicationMessagesContext.Default.AccountSynchronizerStateChanged)); - break; - case nameof(AccountSynchronizationProgressUpdatedMessage): - WeakReferenceMessenger.Default.Send(JsonSerializer.Deserialize(messageJson, CommunicationMessagesContext.Default.AccountSynchronizationProgressUpdatedMessage)); - break; - case nameof(AccountFolderConfigurationUpdated): - WeakReferenceMessenger.Default.Send(JsonSerializer.Deserialize(messageJson, CommunicationMessagesContext.Default.AccountFolderConfigurationUpdated)); - break; - case nameof(CopyAuthURLRequested): - WeakReferenceMessenger.Default.Send(JsonSerializer.Deserialize(messageJson, CommunicationMessagesContext.Default.CopyAuthURLRequested)); - break; - case nameof(NewMailSynchronizationRequested): - WeakReferenceMessenger.Default.Send(JsonSerializer.Deserialize(messageJson, CommunicationMessagesContext.Default.NewMailSynchronizationRequested)); - break; - case nameof(AccountCacheResetMessage): - WeakReferenceMessenger.Default.Send(JsonSerializer.Deserialize(messageJson, CommunicationMessagesContext.Default.AccountCacheResetMessage)); - break; - default: - throw new Exception("Invalid data type name passed to client."); - } - } - - private void ServerDisconnected(AppServiceConnection sender, AppServiceClosedEventArgs args) - { - Log.Information("Server disconnected."); - } - - public async Task QueueRequestAsync(IRequestBase request, Guid accountId) - { - var queuePackage = new ServerRequestPackage(accountId, request); - - var queueResponse = await GetResponseInternalAsync(queuePackage, new Dictionary() - { - { MessageConstants.MessageDataRequestAccountIdKey, accountId } - }); - - queueResponse.ThrowIfFailed(); - } - - public Task> GetResponseAsync(TRequestType message, CancellationToken cancellationToken = default) where TRequestType : IClientMessage - => GetResponseInternalAsync(message, cancellationToken: cancellationToken); - - [RequiresDynamicCode("Calls System.Text.Json.JsonSerializer.Serialize(TValue, JsonSerializerOptions)")] - [RequiresUnreferencedCode("Calls System.Text.Json.JsonSerializer.Serialize(TValue, JsonSerializerOptions)")] - private async Task> GetResponseInternalAsync(TRequestType message, - Dictionary parameters = null, - CancellationToken cancellationToken = default) - { - if (Status != WinoServerConnectionStatus.Connected) - await ConnectAsync(); - - if (Connection == null) return WinoServerResponse.CreateErrorResponse("Server connection is not established."); - - string serializedMessage = string.Empty; - - try - { - serializedMessage = JsonSerializer.Serialize(message, _jsonSerializerOptions); - } - catch (Exception serializationException) - { - Logger.Error(serializationException, $"Failed to serialize client message for sending."); - return WinoServerResponse.CreateErrorResponse($"Failed to serialize message.\n{serializationException.Message}"); - } - - AppServiceResponse response = null; - - try - { - var valueSet = new ValueSet - { - { MessageConstants.MessageTypeKey, (int)MessageType.ServerMessage }, - { MessageConstants.MessageDataKey, serializedMessage }, - { MessageConstants.MessageDataTypeKey, message.GetType().Name } - }; - - // Add additional parameters into ValueSet - if (parameters != null) - { - foreach (var item in parameters) - { - valueSet.Add(item.Key, item.Value); - } - } - - response = await Connection.SendMessageAsync(valueSet).AsTask(cancellationToken); - } - catch (OperationCanceledException) - { - return WinoServerResponse.CreateErrorResponse($"Request is canceled by client."); - } - catch (Exception serverSendException) - { - Logger.Error(serverSendException, $"Failed to send message to server."); - return WinoServerResponse.CreateErrorResponse($"Failed to send message to server.\n{serverSendException.Message}"); - } - - // It should be always Success. - if (response.Status != AppServiceResponseStatus.Success) - return WinoServerResponse.CreateErrorResponse($"Wino Server responded with '{response.Status}' status to message delivery."); - - // All responses must contain a message data. - if (!(response.Message.TryGetValue(MessageConstants.MessageDataKey, out object messageDataObject) && messageDataObject is string messageJson)) - return WinoServerResponse.CreateErrorResponse("Server response did not contain message data."); - - // Try deserialize the message data. - try - { - return JsonSerializer.Deserialize>(messageJson); - } - catch (Exception jsonDeserializationError) - { - Logger.Error(jsonDeserializationError, $"Failed to deserialize server response message data."); - return WinoServerResponse.CreateErrorResponse($"Failed to deserialize Wino server response message data.\n{jsonDeserializationError.Message}"); - } - } - - public void Receive(WinoServerConnectionEstablished message) - => ConnectingHandle?.TrySetResult(true); -} diff --git a/Wino.Core.WinUI/WinoApplication.cs b/Wino.Core.WinUI/WinoApplication.cs index e5a9e045..d1dd2f2c 100644 --- a/Wino.Core.WinUI/WinoApplication.cs +++ b/Wino.Core.WinUI/WinoApplication.cs @@ -32,7 +32,6 @@ public abstract class WinoApplication : Application, IRecipient public IServiceProvider Services { get; } protected IWinoLogger LogInitializer { get; } protected IApplicationConfiguration AppConfiguration { get; } - protected IWinoServerConnectionManager AppServiceConnectionManager { get; } public INewThemeService NewThemeService { get; } public IUnderlyingThemeService UnderlyingThemeService { get; } public IThumbnailService ThumbnailService { get; } @@ -54,7 +53,6 @@ public abstract class WinoApplication : Application, IRecipient LogInitializer = Services.GetService(); AppConfiguration = Services.GetService(); - AppServiceConnectionManager = Services.GetService>(); NewThemeService = Services.GetService(); DatabaseService = Services.GetService(); TranslationService = Services.GetService(); diff --git a/Wino.Core/Services/WinoRequestDelegator.cs b/Wino.Core/Services/WinoRequestDelegator.cs index 38003c62..e57c2b0f 100644 --- a/Wino.Core/Services/WinoRequestDelegator.cs +++ b/Wino.Core/Services/WinoRequestDelegator.cs @@ -138,15 +138,8 @@ public class WinoRequestDelegator : IWinoRequestDelegator private async Task QueueRequestAsync(IRequestBase request, Guid accountId) { - try - { - await EnsureServerConnectedAsync(); - await _winoServerConnectionManager.QueueRequestAsync(request, accountId); - } - catch (WinoServerException serverException) - { - _dialogService.InfoBarMessage("Wino Server Exception", serverException.Message, InfoBarMessageType.Error); - } + await EnsureServerConnectedAsync(); + await _winoServerConnectionManager.QueueRequestAsync(request, accountId); } private async Task QueueSynchronizationAsync(Guid accountId) diff --git a/Wino.Mail.ViewModels/AppPreferencesPageViewModel.cs b/Wino.Mail.ViewModels/AppPreferencesPageViewModel.cs index 3a7489d0..c460db6e 100644 --- a/Wino.Mail.ViewModels/AppPreferencesPageViewModel.cs +++ b/Wino.Mail.ViewModels/AppPreferencesPageViewModel.cs @@ -1,5 +1,4 @@ using System.Collections.Generic; -using System.ComponentModel; using System.Threading.Tasks; using CommunityToolkit.Mvvm.ComponentModel; using CommunityToolkit.Mvvm.Input; @@ -7,7 +6,6 @@ using Wino.Core.Domain; using Wino.Core.Domain.Enums; using Wino.Core.Domain.Interfaces; using Wino.Core.Domain.Models.Navigation; -using Wino.Messaging.Server; namespace Wino.Mail.ViewModels; @@ -15,9 +13,6 @@ public partial class AppPreferencesPageViewModel : MailBaseViewModel { public IPreferencesService PreferencesService { get; } - [ObservableProperty] - private List _appTerminationBehavior; - [ObservableProperty] public partial List SearchModes { get; set; } @@ -41,18 +36,6 @@ public partial class AppPreferencesPageViewModel : MailBaseViewModel public bool IsStartupBehaviorDisabled => !IsStartupBehaviorEnabled; public bool IsStartupBehaviorEnabled => StartupBehaviorResult == StartupBehaviorResult.Enabled; - private string _selectedAppTerminationBehavior; - public string SelectedAppTerminationBehavior - { - get => _selectedAppTerminationBehavior; - set - { - SetProperty(ref _selectedAppTerminationBehavior, value); - - PreferencesService.ServerTerminationBehavior = (ServerBackgroundMode)AppTerminationBehavior.IndexOf(value); - } - } - private string _selectedDefaultSearchMode; public string SelectedDefaultSearchMode { @@ -66,35 +49,22 @@ public partial class AppPreferencesPageViewModel : MailBaseViewModel } private readonly IMailDialogService _dialogService; - private readonly IWinoServerConnectionManager _winoServerConnectionManager; private readonly IStartupBehaviorService _startupBehaviorService; public AppPreferencesPageViewModel(IMailDialogService dialogService, IPreferencesService preferencesService, - IWinoServerConnectionManager winoServerConnectionManager, IStartupBehaviorService startupBehaviorService) { _dialogService = dialogService; PreferencesService = preferencesService; - _winoServerConnectionManager = winoServerConnectionManager; _startupBehaviorService = startupBehaviorService; - // Load the app termination behavior options - - _appTerminationBehavior = - [ - Translator.SettingsAppPreferences_ServerBackgroundingMode_MinimizeTray_Title, // "Minimize to tray" - Translator.SettingsAppPreferences_ServerBackgroundingMode_Invisible_Title, // "Invisible" - Translator.SettingsAppPreferences_ServerBackgroundingMode_Terminate_Title // "Terminate" - ]; - SearchModes = [ Translator.SettingsAppPreferences_SearchMode_Local, Translator.SettingsAppPreferences_SearchMode_Online ]; - SelectedAppTerminationBehavior = _appTerminationBehavior[(int)PreferencesService.ServerTerminationBehavior]; SelectedDefaultSearchMode = SearchModes[(int)PreferencesService.DefaultSearchMode]; EmailSyncIntervalMinutes = PreferencesService.EmailSyncIntervalMinutes; } @@ -152,20 +122,7 @@ public partial class AppPreferencesPageViewModel : MailBaseViewModel } } - protected override async void OnPropertyChanged(PropertyChangedEventArgs e) - { - base.OnPropertyChanged(e); - if (e.PropertyName == nameof(SelectedAppTerminationBehavior)) - { - var terminationModeChangedResult = await _winoServerConnectionManager.GetResponseAsync(new ServerTerminationModeChanged(PreferencesService.ServerTerminationBehavior)); - - if (!terminationModeChangedResult.IsSuccess) - { - _dialogService.InfoBarMessage(Translator.GeneralTitle_Error, terminationModeChangedResult.Message, InfoBarMessageType.Error); - } - } - } public override async void OnNavigatedTo(NavigationMode mode, object parameters) { diff --git a/Wino.Mail.ViewModels/AppShellViewModel.cs b/Wino.Mail.ViewModels/AppShellViewModel.cs index 089acd49..90b1de33 100644 --- a/Wino.Mail.ViewModels/AppShellViewModel.cs +++ b/Wino.Mail.ViewModels/AppShellViewModel.cs @@ -60,7 +60,6 @@ public partial class AppShellViewModel : MailBaseViewModel, private const string IsActivateStartupLaunchAskedKey = nameof(IsActivateStartupLaunchAskedKey); public IStatePersistanceService StatePersistenceService { get; } - public IWinoServerConnectionManager ServerConnectionManager { get; } public IPreferencesService PreferencesService { get; } public INavigationService NavigationService { get; } @@ -81,9 +80,6 @@ public partial class AppShellViewModel : MailBaseViewModel, private readonly SemaphoreSlim accountInitFolderUpdateSlim = new SemaphoreSlim(1); - [ObservableProperty] - private WinoServerConnectionStatus activeConnectionStatus; - public AppShellViewModel(IMailDialogService dialogService, INavigationService navigationService, IMimeFileService mimeFileService, @@ -98,21 +94,10 @@ public partial class AppShellViewModel : MailBaseViewModel, IWinoRequestDelegator winoRequestDelegator, IFolderService folderService, IStatePersistanceService statePersistanceService, - IWinoServerConnectionManager serverConnectionManager, IConfigurationService configurationService, IStartupBehaviorService startupBehaviorService) { StatePersistenceService = statePersistanceService; - ServerConnectionManager = serverConnectionManager; - - ActiveConnectionStatus = serverConnectionManager.Status; - ServerConnectionManager.StatusChanged += async (sender, status) => - { - await ExecuteUIThread(() => - { - ActiveConnectionStatus = status; - }); - }; PreferencesService = preferencesService; _dialogService = dialogService; @@ -132,9 +117,6 @@ public partial class AppShellViewModel : MailBaseViewModel, _winoRequestDelegator = winoRequestDelegator; } - [RelayCommand] - private Task ReconnectServerAsync() => ServerConnectionManager.ConnectAsync(); - protected override void OnDispatcherAssigned() { base.OnDispatcherAssigned(); diff --git a/Wino.Mail.ViewModels/MailListPageViewModel.cs b/Wino.Mail.ViewModels/MailListPageViewModel.cs index 739fe24d..78e0c54b 100644 --- a/Wino.Mail.ViewModels/MailListPageViewModel.cs +++ b/Wino.Mail.ViewModels/MailListPageViewModel.cs @@ -22,7 +22,6 @@ using Wino.Core.Domain.Models.Folders; using Wino.Core.Domain.Models.MailItem; using Wino.Core.Domain.Models.Menus; using Wino.Core.Domain.Models.Reader; -using Wino.Core.Domain.Models.Server; using Wino.Core.Domain.Models.Synchronization; using Wino.Mail.ViewModels.Collections; using Wino.Mail.ViewModels.Data; diff --git a/Wino.Mail.WinUI/Views/Settings/AppPreferencesPage.xaml b/Wino.Mail.WinUI/Views/Settings/AppPreferencesPage.xaml index e0d7f809..a8099356 100644 --- a/Wino.Mail.WinUI/Views/Settings/AppPreferencesPage.xaml +++ b/Wino.Mail.WinUI/Views/Settings/AppPreferencesPage.xaml @@ -23,13 +23,6 @@ - - - - - - - diff --git a/Wino.Mail/App.xaml.cs b/Wino.Mail/App.xaml.cs index dfa86da8..d26037ca 100644 --- a/Wino.Mail/App.xaml.cs +++ b/Wino.Mail/App.xaml.cs @@ -52,18 +52,8 @@ public sealed partial class App : WinoApplication, // We must restore it. // Server might be running already, but re-launching it will trigger a new connection attempt. - try - { - await AppServiceConnectionManager.ConnectAsync(); - } - catch (OperationCanceledException) - { - // Ignore - } - catch (Exception ex) - { - Log.Error(ex, "Failed to connect to server after resuming the app."); - } + // Server connection is now handled by the empty implementation + // No need to reconnect after resuming } public override IServiceProvider ConfigureServices() @@ -137,13 +127,10 @@ public sealed partial class App : WinoApplication, if (appServiceTriggerDetails.CallerPackageFamilyName == Package.Current.Id.FamilyName) { // Connection established from the fulltrust process + // This is no longer needed with the empty connection manager implementation connectionBackgroundTaskDeferral = args.TaskInstance.GetDeferral(); args.TaskInstance.Canceled += OnConnectionBackgroundTaskCanceled; - - AppServiceConnectionManager.Connection = appServiceTriggerDetails.AppServiceConnection; - - WeakReferenceMessenger.Default.Send(new WinoServerConnectionEstablished()); } } else if (args.TaskInstance.TriggerDetails is ToastNotificationActionTriggerDetail toastNotificationActionTriggerDetail) @@ -222,24 +209,13 @@ public sealed partial class App : WinoApplication, connectionBackgroundTaskDeferral?.Complete(); connectionBackgroundTaskDeferral = null; - - AppServiceConnectionManager.Connection = null; } public async void Receive(NewMailSynchronizationRequested message) { - try - { - var synchronizationResultResponse = await AppServiceConnectionManager.GetResponseAsync(message); - synchronizationResultResponse.ThrowIfFailed(); - } - catch (WinoServerException serverException) - { - // TODO: Exception context is lost. - var dialogService = Services.GetService(); - - dialogService.InfoBarMessage(Translator.Info_SyncFailedTitle, serverException.Message, InfoBarMessageType.Error); - } + // Synchronization is now handled elsewhere + // The empty connection manager doesn't perform actual sync operations + await Task.CompletedTask; } protected override async void OnApplicationCloseRequested(object sender, SystemNavigationCloseRequestedPreviewEventArgs e) @@ -262,20 +238,7 @@ public sealed partial class App : WinoApplication, bool? isGoToAppPreferencesRequested = null; - if (preferencesService.ServerTerminationBehavior == ServerBackgroundMode.Terminate) - { - // Starting the server is fine, but check if server termination behavior is set to terminate. - // This state will kill the server once the app is terminated. - - isGoToAppPreferencesRequested = await dialogService.ShowWinoCustomMessageDialogAsync(Translator.AppCloseBackgroundSynchronizationWarningTitle, - $"{Translator.AppCloseTerminateBehaviorWarningMessageFirstLine}\n{Translator.AppCloseTerminateBehaviorWarningMessageSecondLine}\n\n{Translator.AppCloseTerminateBehaviorWarningMessageThirdLine}", - Translator.Buttons_Yes, - WinoCustomMessageDialogIcon.Warning, - Translator.Buttons_No, - "DontAskTerminateServerBehavior"); - } - - if (isGoToAppPreferencesRequested == null && currentStartupBehavior != StartupBehaviorResult.Enabled) + if (currentStartupBehavior != StartupBehaviorResult.Enabled) { // Startup behavior is not enabled. @@ -292,21 +255,6 @@ public sealed partial class App : WinoApplication, WeakReferenceMessenger.Default.Send(new NavigateAppPreferencesRequested()); e.Handled = true; } - else if (preferencesService.ServerTerminationBehavior == ServerBackgroundMode.Terminate) - { - try - { - var isServerKilled = await AppServiceConnectionManager.GetResponseAsync(new TerminateServerRequested()); - - isServerKilled.ThrowIfFailed(); - - Log.Information("Server is killed."); - } - catch (Exception ex) - { - Log.Error(ex, "Failed to kill server."); - } - } deferral.Complete(); } diff --git a/Wino.Mail/AppShell.xaml b/Wino.Mail/AppShell.xaml index 10117bf8..2e115ad6 100644 --- a/Wino.Mail/AppShell.xaml +++ b/Wino.Mail/AppShell.xaml @@ -457,7 +457,6 @@ Grid.ColumnSpan="2" BackButtonClicked="BackButtonClicked" Canvas.ZIndex="150" - ConnectionStatus="{x:Bind ViewModel.ActiveConnectionStatus, Mode=OneWay}" CoreWindowText="{x:Bind ViewModel.StatePersistenceService.CoreWindowTitle, Mode=OneWay}" IsBackButtonVisible="{x:Bind ViewModel.StatePersistenceService.IsBackButtonVisible, Mode=OneWay}" IsDragArea="True" @@ -466,7 +465,6 @@ NavigationViewDisplayMode="{x:Bind navigationView.DisplayMode, Mode=OneWay}" OpenPaneLength="{x:Bind ViewModel.StatePersistenceService.OpenPaneLength, Mode=OneWay}" ReadingPaneLength="{x:Bind ViewModel.StatePersistenceService.MailListPaneLength, Mode=OneWay}" - ReconnectCommand="{x:Bind ViewModel.ReconnectServerCommand}" SystemReserved="180" /> diff --git a/Wino.Mail/Views/Settings/AppPreferencesPage.xaml b/Wino.Mail/Views/Settings/AppPreferencesPage.xaml index d9cb3fc2..eb34d891 100644 --- a/Wino.Mail/Views/Settings/AppPreferencesPage.xaml +++ b/Wino.Mail/Views/Settings/AppPreferencesPage.xaml @@ -23,13 +23,6 @@ - - - - - - - diff --git a/Wino.Messages/Server/ServerTerminationModeChanged.cs b/Wino.Messages/Server/ServerTerminationModeChanged.cs deleted file mode 100644 index 7d0ef5ed..00000000 --- a/Wino.Messages/Server/ServerTerminationModeChanged.cs +++ /dev/null @@ -1,10 +0,0 @@ -using Wino.Core.Domain.Enums; -using Wino.Core.Domain.Interfaces; - -namespace Wino.Messaging.Server; - -/// -/// App close behavior for server is changed. -/// -/// New server background mode. -public record ServerTerminationModeChanged(ServerBackgroundMode ServerBackgroundMode) : IClientMessage; From 20ee4c3567593b23816275174c8dd023e9712f20 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Burak=20Kaan=20K=C3=B6se?= Date: Fri, 3 Oct 2025 22:12:27 +0200 Subject: [PATCH 012/312] title bar shell content --- .../Interfaces/IWinoShellWindow.cs | 6 ++++-- Wino.Mail.WinUI/AppShell.xaml.cs | 19 ++++++++----------- Wino.Mail.WinUI/ShellWindow.xaml | 2 ++ Wino.Mail.WinUI/ShellWindow.xaml.cs | 11 +++++++++++ Wino.Mail.WinUI/Views/MailListPage.xaml | 2 +- .../UI/TitleBarShellContentUpdated.cs | 3 +++ 6 files changed, 29 insertions(+), 14 deletions(-) create mode 100644 Wino.Messages/UI/TitleBarShellContentUpdated.cs diff --git a/Wino.Core.WinUI/Interfaces/IWinoShellWindow.cs b/Wino.Core.WinUI/Interfaces/IWinoShellWindow.cs index 67c07694..e124ebe1 100644 --- a/Wino.Core.WinUI/Interfaces/IWinoShellWindow.cs +++ b/Wino.Core.WinUI/Interfaces/IWinoShellWindow.cs @@ -1,9 +1,11 @@ -using Microsoft.UI.Xaml; +using CommunityToolkit.Mvvm.Messaging; +using Microsoft.UI.Xaml; using Microsoft.UI.Xaml.Controls; +using Wino.Messaging.UI; namespace Wino.Core.WinUI.Interfaces; -public interface IWinoShellWindow +public interface IWinoShellWindow : IRecipient { void HandleAppActivation(LaunchActivatedEventArgs args); TitleBar GetTitleBar(); diff --git a/Wino.Mail.WinUI/AppShell.xaml.cs b/Wino.Mail.WinUI/AppShell.xaml.cs index db0a259c..621854f7 100644 --- a/Wino.Mail.WinUI/AppShell.xaml.cs +++ b/Wino.Mail.WinUI/AppShell.xaml.cs @@ -17,6 +17,7 @@ using Wino.Core.Domain.Interfaces; using Wino.Core.Domain.Models.Folders; using Wino.Core.Domain.Models.MailItem; using Wino.Core.Domain.Models.Navigation; +using Wino.Core.WinUI; using Wino.Core.WinUI.Controls; using Wino.Extensions; using Wino.Mail.ViewModels.Data; @@ -25,6 +26,7 @@ using Wino.MenuFlyouts.Context; using Wino.Messaging.Client.Accounts; using Wino.Messaging.Client.Mails; using Wino.Messaging.Client.Shell; +using Wino.Messaging.UI; using Wino.Views.Abstract; namespace Wino.Views; @@ -35,10 +37,14 @@ public sealed partial class AppShell : AppShellAbstract, IRecipient, IRecipient { + [GeneratedDependencyProperty] + public partial UIElement TopShellContent { get; set; } + public AppShell() : base() { InitializeComponent(); } + public Frame GetShellFrame() => ShellFrame; private async void ItemDroppedOnFolder(object sender, DragEventArgs e) { @@ -212,18 +218,9 @@ public sealed partial class AppShell : AppShellAbstract, } } - private void ShellFrameContentNavigated(object sender, Microsoft.UI.Xaml.Navigation.NavigationEventArgs e) - { - // => RealAppBar.ShellFrameContent = (e.Content as BasePage).ShellContent; + private void ShellFrameContentNavigated(object sender, Microsoft.UI.Xaml.Navigation.NavigationEventArgs e) => TopShellContent = ((BasePage)e.Content).ShellContent; - // TODO: WinUI3: Update shell content. Just remove it. - } - - private void BackButtonClicked(WinoAppTitleBar sender, RoutedEventArgs args) - { - WeakReferenceMessenger.Default.Send(new ClearMailSelectionsRequested()); - WeakReferenceMessenger.Default.Send(new DisposeRenderingFrameRequested()); - } + partial void OnTopShellContentChanged(UIElement newValue) => WeakReferenceMessenger.Default.Send(new TitleBarShellContentUpdated()); private async void MenuItemContextRequested(UIElement sender, ContextRequestedEventArgs args) { diff --git a/Wino.Mail.WinUI/ShellWindow.xaml b/Wino.Mail.WinUI/ShellWindow.xaml index 0302fd25..5cdb6a86 100644 --- a/Wino.Mail.WinUI/ShellWindow.xaml +++ b/Wino.Mail.WinUI/ShellWindow.xaml @@ -21,6 +21,8 @@ (this); + InitializeComponent(); MinWidth = 420; @@ -56,4 +59,12 @@ public sealed partial class ShellWindow : WindowEx, IWinoShellWindow { PreferencesService.IsNavigationPaneOpened = !PreferencesService.IsNavigationPaneOpened; } + + public void Receive(TitleBarShellContentUpdated message) + { + if (MainShellFrame.Content is AppShell shellPage) + { + ShellTitleBar.Content = shellPage.TopShellContent; + } + } } diff --git a/Wino.Mail.WinUI/Views/MailListPage.xaml b/Wino.Mail.WinUI/Views/MailListPage.xaml index 96327cbb..dab1109a 100644 --- a/Wino.Mail.WinUI/Views/MailListPage.xaml +++ b/Wino.Mail.WinUI/Views/MailListPage.xaml @@ -209,7 +209,7 @@ - + Date: Sat, 4 Oct 2025 13:40:35 +0200 Subject: [PATCH 013/312] Shell title bar buttons adjustments. --- .../Interfaces/INewThemeService.cs | 3 ++ Wino.Core.WinUI/Services/NewThemeService.cs | 35 +++++++++++- Wino.Mail.WinUI/ShellWindow.xaml.cs | 54 ++++++++++++++++++- 3 files changed, 90 insertions(+), 2 deletions(-) diff --git a/Wino.Core.Domain/Interfaces/INewThemeService.cs b/Wino.Core.Domain/Interfaces/INewThemeService.cs index ab0f4651..d571d7ac 100644 --- a/Wino.Core.Domain/Interfaces/INewThemeService.cs +++ b/Wino.Core.Domain/Interfaces/INewThemeService.cs @@ -32,6 +32,9 @@ public interface INewThemeService : IInitializeAsync // Improved accent color management Task SetAccentColorAsync(string hexColor, bool preserveTheme = true); + // Title bar color management + void UpdateSystemCaptionButtonColors(); + // Backdrop management List GetAvailableBackdropTypes(); } diff --git a/Wino.Core.WinUI/Services/NewThemeService.cs b/Wino.Core.WinUI/Services/NewThemeService.cs index e4441cda..f430b3e6 100644 --- a/Wino.Core.WinUI/Services/NewThemeService.cs +++ b/Wino.Core.WinUI/Services/NewThemeService.cs @@ -13,6 +13,7 @@ using Microsoft.UI.Xaml; using Microsoft.UI.Xaml.Markup; using Microsoft.UI.Xaml.Media; using Windows.Storage; +using Windows.UI; using Windows.UI.ViewManagement; using Wino.Core.Domain; using Wino.Core.Domain.Enums; @@ -274,7 +275,39 @@ public class NewThemeService : INewThemeService { GetShellRootContent().DispatcherQueue.TryEnqueue(() => { - Debug.WriteLine("TODO: Updating caption button colors for NewThemeService"); + if (WinoApplication.MainWindow is not WindowEx mainWindow) return; + + var titleBar = mainWindow.AppWindow.TitleBar; + if (titleBar == null) return; + + // Determine if current theme is dark + bool isDarkTheme = _underlyingThemeService.IsUnderlyingThemeDark(); + + // Set button colors based on theme + // Background is always transparent for all buttons + titleBar.ButtonBackgroundColor = Color.FromArgb(0, 0, 0, 0); // Transparent + titleBar.ButtonInactiveBackgroundColor = Color.FromArgb(0, 0, 0, 0); // Transparent + titleBar.ButtonHoverBackgroundColor = Color.FromArgb(0, 0, 0, 0); // Transparent + titleBar.ButtonPressedBackgroundColor = Color.FromArgb(0, 0, 0, 0); // Transparent + + if (isDarkTheme) + { + // Dark theme: use light text/icons for better contrast + titleBar.ButtonForegroundColor = Color.FromArgb(255, 255, 255, 255); // White + titleBar.ButtonInactiveForegroundColor = Color.FromArgb(128, 255, 255, 255); // Semi-transparent white + titleBar.ButtonHoverForegroundColor = Color.FromArgb(255, 255, 255, 255); // White + titleBar.ButtonPressedForegroundColor = Color.FromArgb(200, 255, 255, 255); // Slightly dimmed white + } + else + { + // Light theme: use dark text/icons for better contrast + titleBar.ButtonForegroundColor = Color.FromArgb(255, 0, 0, 0); // Black + titleBar.ButtonInactiveForegroundColor = Color.FromArgb(128, 0, 0, 0); // Semi-transparent black + titleBar.ButtonHoverForegroundColor = Color.FromArgb(255, 0, 0, 0); // Black + titleBar.ButtonPressedForegroundColor = Color.FromArgb(200, 0, 0, 0); // Slightly dimmed black + } + + Debug.WriteLine($"Updated title bar button colors for {(isDarkTheme ? "dark" : "light")} theme"); }); } diff --git a/Wino.Mail.WinUI/ShellWindow.xaml.cs b/Wino.Mail.WinUI/ShellWindow.xaml.cs index c188fcb0..c03fa2e7 100644 --- a/Wino.Mail.WinUI/ShellWindow.xaml.cs +++ b/Wino.Mail.WinUI/ShellWindow.xaml.cs @@ -3,17 +3,19 @@ using CommunityToolkit.Mvvm.Messaging; using Microsoft.Extensions.DependencyInjection; using Microsoft.UI.Xaml; using Microsoft.UI.Xaml.Controls; +using Windows.UI; using Wino.Core.Domain.Interfaces; using Wino.Core.WinUI; using Wino.Core.WinUI.Interfaces; using Wino.Messaging.Client.Mails; +using Wino.Messaging.Client.Shell; using Wino.Messaging.UI; using Wino.Views; using WinUIEx; namespace Wino.Mail.WinUI; -public sealed partial class ShellWindow : WindowEx, IWinoShellWindow +public sealed partial class ShellWindow : WindowEx, IWinoShellWindow, IRecipient { public IStatePersistanceService StatePersistanceService { get; } = WinoApplication.Current.Services.GetService() ?? throw new Exception("StatePersistanceService not registered in DI container."); public IPreferencesService PreferencesService { get; } = WinoApplication.Current.Services.GetService() ?? throw new Exception("PreferencesService not registered in DI container."); @@ -21,6 +23,7 @@ public sealed partial class ShellWindow : WindowEx, IWinoShellWindow public ShellWindow() { WeakReferenceMessenger.Default.Register(this); + WeakReferenceMessenger.Default.Register(this); InitializeComponent(); @@ -32,6 +35,17 @@ public sealed partial class ShellWindow : WindowEx, IWinoShellWindow private void ConfigureTitleBar() { AppWindow.TitleBar.ExtendsContentIntoTitleBar = true; + + // Apply initial theme colors + var themeService = WinoApplication.Current.Services.GetService(); + if (themeService != null) + { + var underlyingThemeService = WinoApplication.Current.Services.GetService(); + if (underlyingThemeService != null) + { + UpdateTitleBarColors(underlyingThemeService.IsUnderlyingThemeDark()); + } + } } public void HandleAppActivation(LaunchActivatedEventArgs args) @@ -67,4 +81,42 @@ public sealed partial class ShellWindow : WindowEx, IWinoShellWindow ShellTitleBar.Content = shellPage.TopShellContent; } } + + public void Receive(ApplicationThemeChanged message) + { + UpdateTitleBarColors(message.IsUnderlyingThemeDark); + } + + private void UpdateTitleBarColors(bool isDarkTheme) + { + DispatcherQueue.TryEnqueue(() => + { + var titleBar = AppWindow.TitleBar; + if (titleBar == null) return; + + // Set button colors based on theme + // Background is always transparent for all buttons + titleBar.ButtonBackgroundColor = Color.FromArgb(0, 0, 0, 0); // Transparent + titleBar.ButtonInactiveBackgroundColor = Color.FromArgb(0, 0, 0, 0); // Transparent + titleBar.ButtonHoverBackgroundColor = Color.FromArgb(0, 0, 0, 0); // Transparent + titleBar.ButtonPressedBackgroundColor = Color.FromArgb(0, 0, 0, 0); // Transparent + + if (isDarkTheme) + { + // Dark theme: use light text/icons for better contrast + titleBar.ButtonForegroundColor = Color.FromArgb(255, 255, 255, 255); // White + titleBar.ButtonInactiveForegroundColor = Color.FromArgb(128, 255, 255, 255); // Semi-transparent white + titleBar.ButtonHoverForegroundColor = Color.FromArgb(255, 255, 255, 255); // White + titleBar.ButtonPressedForegroundColor = Color.FromArgb(200, 255, 255, 255); // Slightly dimmed white + } + else + { + // Light theme: use dark text/icons for better contrast + titleBar.ButtonForegroundColor = Color.FromArgb(255, 0, 0, 0); // Black + titleBar.ButtonInactiveForegroundColor = Color.FromArgb(128, 0, 0, 0); // Semi-transparent black + titleBar.ButtonHoverForegroundColor = Color.FromArgb(255, 0, 0, 0); // Black + titleBar.ButtonPressedForegroundColor = Color.FromArgb(200, 0, 0, 0); // Slightly dimmed black + } + }); + } } From a00ff3df462622ff4a4f60372993cffd9db16a9b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Burak=20Kaan=20K=C3=B6se?= Date: Sat, 4 Oct 2025 14:44:51 +0200 Subject: [PATCH 014/312] Fix settings navigation and fix flicker on personalizaton nav. --- .../PersonalizationPageViewModel.cs | 31 +++++-------------- Wino.Core.WinUI/Services/NewThemeService.cs | 28 ++++++++++++----- .../Views/ManageAccountsPage.xaml.cs | 16 ++++++++++ Wino.Core.WinUI/Views/SettingsPage.xaml.cs | 11 +++++++ 4 files changed, 55 insertions(+), 31 deletions(-) diff --git a/Wino.Core.ViewModels/PersonalizationPageViewModel.cs b/Wino.Core.ViewModels/PersonalizationPageViewModel.cs index b68ec62a..e136bf4d 100644 --- a/Wino.Core.ViewModels/PersonalizationPageViewModel.cs +++ b/Wino.Core.ViewModels/PersonalizationPageViewModel.cs @@ -1,6 +1,5 @@ using System.Collections.Generic; using System.Collections.ObjectModel; -using System.Diagnostics.CodeAnalysis; using System.Linq; using System.Threading.Tasks; using CommunityToolkit.Mvvm.ComponentModel; @@ -127,14 +126,6 @@ public partial class PersonalizationPageViewModel : CoreBaseViewModel [ObservableProperty] public partial BackdropTypeWrapper SelectedBackdropType { get; set; } - partial void OnSelectedBackdropTypeChanged(BackdropTypeWrapper value) - { - if (!isPropChangeDisabled && value != null) - { - _newThemeService.CurrentBackdropType = value.BackdropType; - } - } - #endregion [RelayCommand] @@ -218,12 +209,9 @@ public partial class PersonalizationPageViewModel : CoreBaseViewModel var currentThemeId = _newThemeService.CurrentApplicationThemeId; SelectedAppTheme = currentThemeId.HasValue ? AppThemes.Find(a => a.Id == currentThemeId.Value) : null; - // Set the current backdrop, default to Mica if theme selected, None if custom theme - var targetBackdropType = SelectedAppTheme != null && SelectedAppTheme.AppThemeType != AppThemeType.Custom - ? _newThemeService.CurrentBackdropType - : WindowBackdropType.None; - - SelectedBackdropType = AvailableBackdropTypes?.FirstOrDefault(x => x.BackdropType == targetBackdropType); + // Set the current backdrop from service - backdrop should be independent of theme selection + var currentBackdropType = _newThemeService.CurrentBackdropType; + SelectedBackdropType = AvailableBackdropTypes?.FirstOrDefault(x => x.BackdropType == currentBackdropType); } public override async void OnNavigatedTo(NavigationMode mode, object parameters) @@ -310,14 +298,11 @@ public partial class PersonalizationPageViewModel : CoreBaseViewModel // Set the theme ID, can be null if no theme is selected _newThemeService.CurrentApplicationThemeId = SelectedAppTheme?.Id; - // When a custom/predefined theme is selected, set backdrop to None - // When no theme is selected (system theme), keep current backdrop - if (SelectedAppTheme != null) - { - isPropChangeDisabled = true; - SelectedBackdropType = AvailableBackdropTypes?.FirstOrDefault(x => x.BackdropType == WindowBackdropType.None); - isPropChangeDisabled = false; - } + // Theme selection should not affect backdrop - they are independent settings + } + else if (e.PropertyName == nameof(SelectedBackdropType) && SelectedBackdropType != null) + { + _newThemeService.CurrentBackdropType = SelectedBackdropType.BackdropType; } else { diff --git a/Wino.Core.WinUI/Services/NewThemeService.cs b/Wino.Core.WinUI/Services/NewThemeService.cs index f430b3e6..340a61f3 100644 --- a/Wino.Core.WinUI/Services/NewThemeService.cs +++ b/Wino.Core.WinUI/Services/NewThemeService.cs @@ -146,6 +146,9 @@ public class NewThemeService : INewThemeService get { return currentBackdropType; } set { + // Only update if the backdrop type has actually changed + if (currentBackdropType == value) return; + currentBackdropType = value; _configurationService.Set(WindowBackdropTypeKey, (int)value); @@ -222,11 +225,14 @@ public class NewThemeService : INewThemeService _ => new MicaBackdrop() { Kind = Microsoft.UI.Composition.SystemBackdrops.MicaKind.Base } }; - windowEx.SystemBackdrop = backdrop; + if (windowEx.SystemBackdrop != backdrop) + { + windowEx.SystemBackdrop = backdrop; - BackdropChanged?.Invoke(this, backdropType); + BackdropChanged?.Invoke(this, backdropType); - Debug.WriteLine($"Applied backdrop: {backdropType}"); + Debug.WriteLine($"Applied backdrop: {backdropType}"); + } } catch (Exception ex) { @@ -284,11 +290,9 @@ public class NewThemeService : INewThemeService bool isDarkTheme = _underlyingThemeService.IsUnderlyingThemeDark(); // Set button colors based on theme - // Background is always transparent for all buttons + // Normal and inactive backgrounds are transparent, but hover/pressed have subtle backgrounds titleBar.ButtonBackgroundColor = Color.FromArgb(0, 0, 0, 0); // Transparent titleBar.ButtonInactiveBackgroundColor = Color.FromArgb(0, 0, 0, 0); // Transparent - titleBar.ButtonHoverBackgroundColor = Color.FromArgb(0, 0, 0, 0); // Transparent - titleBar.ButtonPressedBackgroundColor = Color.FromArgb(0, 0, 0, 0); // Transparent if (isDarkTheme) { @@ -296,7 +300,11 @@ public class NewThemeService : INewThemeService titleBar.ButtonForegroundColor = Color.FromArgb(255, 255, 255, 255); // White titleBar.ButtonInactiveForegroundColor = Color.FromArgb(128, 255, 255, 255); // Semi-transparent white titleBar.ButtonHoverForegroundColor = Color.FromArgb(255, 255, 255, 255); // White - titleBar.ButtonPressedForegroundColor = Color.FromArgb(200, 255, 255, 255); // Slightly dimmed white + titleBar.ButtonPressedForegroundColor = Color.FromArgb(255, 255, 255, 255); // White + + // Subtle hover and pressed backgrounds for dark theme + titleBar.ButtonHoverBackgroundColor = Color.FromArgb(20, 255, 255, 255); // Very subtle white overlay + titleBar.ButtonPressedBackgroundColor = Color.FromArgb(40, 255, 255, 255); // Slightly more visible white overlay } else { @@ -304,7 +312,11 @@ public class NewThemeService : INewThemeService titleBar.ButtonForegroundColor = Color.FromArgb(255, 0, 0, 0); // Black titleBar.ButtonInactiveForegroundColor = Color.FromArgb(128, 0, 0, 0); // Semi-transparent black titleBar.ButtonHoverForegroundColor = Color.FromArgb(255, 0, 0, 0); // Black - titleBar.ButtonPressedForegroundColor = Color.FromArgb(200, 0, 0, 0); // Slightly dimmed black + titleBar.ButtonPressedForegroundColor = Color.FromArgb(255, 0, 0, 0); // Black + + // Subtle hover and pressed backgrounds for light theme + titleBar.ButtonHoverBackgroundColor = Color.FromArgb(20, 0, 0, 0); // Very subtle black overlay + titleBar.ButtonPressedBackgroundColor = Color.FromArgb(40, 0, 0, 0); // Slightly more visible black overlay } Debug.WriteLine($"Updated title bar button colors for {(isDarkTheme ? "dark" : "light")} theme"); diff --git a/Wino.Core.WinUI/Views/ManageAccountsPage.xaml.cs b/Wino.Core.WinUI/Views/ManageAccountsPage.xaml.cs index 09f40e7e..6de98c2b 100644 --- a/Wino.Core.WinUI/Views/ManageAccountsPage.xaml.cs +++ b/Wino.Core.WinUI/Views/ManageAccountsPage.xaml.cs @@ -32,6 +32,12 @@ public sealed partial class ManageAccountsPage : ManageAccountsPageAbstract, { base.OnNavigatedTo(e); + // Re-register message handlers after base.OnNavigatedTo unregisters all handlers + WeakReferenceMessenger.Default.Register(this); + WeakReferenceMessenger.Default.Register(this); + WeakReferenceMessenger.Default.Register(this); + WeakReferenceMessenger.Default.Register(this); + var initialRequest = new BreadcrumbNavigationRequested(Translator.MenuManageAccounts, WinoPage.AccountManagementPage); PageHistory.Add(new BreadcrumbNavigationItemViewModel(initialRequest, true)); @@ -40,6 +46,16 @@ public sealed partial class ManageAccountsPage : ManageAccountsPageAbstract, AccountPagesFrame.Navigate(accountManagementPageType, null, new SuppressNavigationTransitionInfo()); } + protected override void OnNavigatingFrom(NavigatingCancelEventArgs e) + { + // Explicitly unregister our message handlers before base.OnNavigatingFrom calls UnregisterAll + WeakReferenceMessenger.Default.Unregister(this); + WeakReferenceMessenger.Default.Unregister(this); + WeakReferenceMessenger.Default.Unregister(this); + WeakReferenceMessenger.Default.Unregister(this); + + base.OnNavigatingFrom(e); + } void IRecipient.Receive(BreadcrumbNavigationRequested message) { diff --git a/Wino.Core.WinUI/Views/SettingsPage.xaml.cs b/Wino.Core.WinUI/Views/SettingsPage.xaml.cs index 266e1191..e498a02a 100644 --- a/Wino.Core.WinUI/Views/SettingsPage.xaml.cs +++ b/Wino.Core.WinUI/Views/SettingsPage.xaml.cs @@ -26,6 +26,9 @@ public sealed partial class SettingsPage : SettingsPageAbstract, IRecipient(this); + SettingsFrame.Navigate(typeof(SettingOptionsPage), null, new SuppressNavigationTransitionInfo()); var initialRequest = new BreadcrumbNavigationRequested(Translator.MenuSettings, WinoPage.SettingOptionsPage); @@ -58,6 +61,14 @@ public sealed partial class SettingsPage : SettingsPageAbstract, IRecipient(this); + + base.OnNavigatingFrom(e); + } + void IRecipient.Receive(BreadcrumbNavigationRequested message) { var pageType = ViewModel.NavigationService.GetPageType(message.PageType); From 3b1eff1702c3ecc8af24d23f56e3c3fe38b3c22e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Burak=20Kaan=20K=C3=B6se?= Date: Sat, 4 Oct 2025 15:46:05 +0200 Subject: [PATCH 015/312] Tray icon implementation. --- Directory.Packages.props | 1 + .../Interfaces/ISystemTrayService.cs | 36 ++++ Wino.Mail.WinUI/App.xaml.cs | 10 + Wino.Mail.WinUI/Assets/Wino_Icon.ico | Bin 0 -> 126743 bytes Wino.Mail.WinUI/Services/SystemTrayService.cs | 196 ++++++++++++++++++ Wino.Mail.WinUI/ShellWindow.xaml.cs | 64 ++++++ Wino.Mail.WinUI/Wino.Mail.WinUI.csproj | 2 + 7 files changed, 309 insertions(+) create mode 100644 Wino.Core.Domain/Interfaces/ISystemTrayService.cs create mode 100644 Wino.Mail.WinUI/Assets/Wino_Icon.ico create mode 100644 Wino.Mail.WinUI/Services/SystemTrayService.cs diff --git a/Directory.Packages.props b/Directory.Packages.props index b800ef26..710751ef 100644 --- a/Directory.Packages.props +++ b/Directory.Packages.props @@ -51,6 +51,7 @@ + diff --git a/Wino.Core.Domain/Interfaces/ISystemTrayService.cs b/Wino.Core.Domain/Interfaces/ISystemTrayService.cs new file mode 100644 index 00000000..7a67953c --- /dev/null +++ b/Wino.Core.Domain/Interfaces/ISystemTrayService.cs @@ -0,0 +1,36 @@ +using System; + +namespace Wino.Core.Domain.Interfaces; + +public interface ISystemTrayService +{ + /// + /// Initializes the system tray icon. + /// + void Initialize(); + + /// + /// Shows the system tray icon. + /// + void Show(); + + /// + /// Hides the system tray icon. + /// + void Hide(); + + /// + /// Event fired when the tray icon is double-clicked. + /// + event EventHandler? TrayIconDoubleClicked; + + /// + /// Gets whether the tray icon is currently minimized. + /// + bool IsMinimizedToTray { get; } + + /// + /// Disposes of the system tray resources. + /// + void Dispose(); +} \ No newline at end of file diff --git a/Wino.Mail.WinUI/App.xaml.cs b/Wino.Mail.WinUI/App.xaml.cs index 268e044b..a2d97c06 100644 --- a/Wino.Mail.WinUI/App.xaml.cs +++ b/Wino.Mail.WinUI/App.xaml.cs @@ -8,6 +8,7 @@ using Wino.Core.WinUI; using Wino.Core.WinUI.Interfaces; using Wino.Mail.Services; using Wino.Mail.ViewModels; +using Wino.Mail.WinUI.Services; using Wino.Messaging.Server; using Wino.Services; namespace Wino.Mail.WinUI; @@ -33,6 +34,7 @@ public partial class App : WinoApplication, IRecipient(); services.AddTransient(); services.AddSingleton(); + services.AddSingleton(); } private void RegisterViewModels(IServiceCollection services) @@ -91,6 +93,14 @@ public partial class App : WinoApplication, IRecipient(); + if (systemTrayService != null) + { + systemTrayService.Initialize(); + systemTrayService.Show(); // Explicitly show the tray icon + } + if (MainWindow is not IWinoShellWindow shellWindow) throw new ArgumentException("MainWindow must implement IWinoShellWindow"); shellWindow.HandleAppActivation(args); diff --git a/Wino.Mail.WinUI/Assets/Wino_Icon.ico b/Wino.Mail.WinUI/Assets/Wino_Icon.ico new file mode 100644 index 0000000000000000000000000000000000000000..be12c8934f87e61dc8ad5367e8ecfb10b7f2cce4 GIT binary patch literal 126743 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 literal 0 HcmV?d00001 diff --git a/Wino.Mail.WinUI/Services/SystemTrayService.cs b/Wino.Mail.WinUI/Services/SystemTrayService.cs new file mode 100644 index 00000000..ca82ac8d --- /dev/null +++ b/Wino.Mail.WinUI/Services/SystemTrayService.cs @@ -0,0 +1,196 @@ +using System; +using System.Windows.Input; +using H.NotifyIcon; +using Microsoft.UI.Xaml; +using Microsoft.UI.Xaml.Controls; +using Microsoft.UI.Xaml.Media.Imaging; +using Wino.Core.Domain.Interfaces; +using Microsoft.Extensions.DependencyInjection; +using Wino.Core.WinUI; + +namespace Wino.Mail.WinUI.Services; + +public class SystemTrayService : ISystemTrayService +{ + private TaskbarIcon? _taskbarIcon; + private bool _isDisposed; + private bool _isMinimizedToTray; + + public bool IsMinimizedToTray => _isMinimizedToTray; + + public event EventHandler? TrayIconDoubleClicked; + + public void Initialize() + { + if (_taskbarIcon != null) return; + + try + { + System.Diagnostics.Debug.WriteLine("Starting system tray initialization..."); + + // Create TaskbarIcon first + _taskbarIcon = new TaskbarIcon(); + + // Set basic properties first + _taskbarIcon.ToolTipText = "Wino Mail"; + + // Configure the taskbar icon with icon loading + var iconUri = new Uri("ms-appx:///Assets/Wino_Icon.ico"); + var bitmapImage = new BitmapImage(iconUri); + _taskbarIcon.IconSource = bitmapImage; + System.Diagnostics.Debug.WriteLine("Icon source set"); + + // Create context menu + var contextMenu = new MenuFlyout(); + + // Show Window menu item + var showMenuItem = new MenuFlyoutItem + { + Text = "Show Wino Mail", + Icon = new SymbolIcon(Symbol.Home) + }; + showMenuItem.Click += ShowMenuItem_Click; + contextMenu.Items.Add(showMenuItem); + System.Diagnostics.Debug.WriteLine("Show menu item added"); + + // Separator + contextMenu.Items.Add(new MenuFlyoutSeparator()); + + // Exit menu item + var exitMenuItem = new MenuFlyoutItem + { + Text = "Exit", + Icon = new SymbolIcon(Symbol.Cancel) + }; + exitMenuItem.Click += ExitMenuItem_Click; + contextMenu.Items.Add(exitMenuItem); + System.Diagnostics.Debug.WriteLine("Exit menu item added"); + + // Set context menu + _taskbarIcon.ContextFlyout = contextMenu; + + // Handle double-click using the proper event + _taskbarIcon.LeftClickCommand = new RelayCommand(OnTrayIconLeftClick); + + // Set visibility and create explicitly + _taskbarIcon.Visibility = Visibility.Visible; + + // Try ForceCreate to ensure the icon is properly created in the system tray + _taskbarIcon.ForceCreate(); + System.Diagnostics.Debug.WriteLine("System tray icon created and visible"); + } + catch (Exception ex) + { + System.Diagnostics.Debug.WriteLine($"Failed to initialize system tray: {ex.Message}"); + System.Diagnostics.Debug.WriteLine($"Stack trace: {ex.StackTrace}"); + } + } + + private void ShowMenuItem_Click(object sender, RoutedEventArgs e) + { + System.Diagnostics.Debug.WriteLine("Show menu item clicked"); + TrayIconDoubleClicked?.Invoke(this, EventArgs.Empty); + } + + private void ExitMenuItem_Click(object sender, RoutedEventArgs e) + { + System.Diagnostics.Debug.WriteLine("Exit menu item clicked"); + ExitApplication(); + } + + private void OnTrayIconLeftClick() + { + System.Diagnostics.Debug.WriteLine("Tray icon left clicked"); + TrayIconDoubleClicked?.Invoke(this, EventArgs.Empty); + } + + public void Show() + { + if (_taskbarIcon != null) + { + try + { + _taskbarIcon.Visibility = Visibility.Visible; + _taskbarIcon.ForceCreate(); // Ensure the icon is properly created and visible + _isMinimizedToTray = true; + System.Diagnostics.Debug.WriteLine("System tray icon set to visible and force created"); + } + catch (Exception ex) + { + System.Diagnostics.Debug.WriteLine($"Failed to show system tray icon: {ex.Message}"); + } + } + else + { + System.Diagnostics.Debug.WriteLine("TaskbarIcon is null when trying to show"); + } + } + + public void Hide() + { + if (_taskbarIcon != null) + { + _taskbarIcon.Visibility = Visibility.Collapsed; + _isMinimizedToTray = false; + } + } + + private void ExitApplication() + { + System.Diagnostics.Debug.WriteLine("Attempting to exit application..."); + + try + { + // Clean up the tray icon first + Dispose(); + + // Get the main window and close it properly + if (WinoApplication.MainWindow is ShellWindow shellWindow) + { + // Force close the window without minimizing to tray + shellWindow.ForceClose(); + } + else + { + // Fallback to application exit + Application.Current.Exit(); + } + } + catch (Exception ex) + { + System.Diagnostics.Debug.WriteLine($"Error during application exit: {ex.Message}"); + // Force exit if normal exit fails + Environment.Exit(0); + } + } + + public void Dispose() + { + if (_isDisposed) return; + + _taskbarIcon?.Dispose(); + _taskbarIcon = null; + _isDisposed = true; + } +} + +// Simple RelayCommand implementation for the tray icon +public class RelayCommand : ICommand +{ + private readonly Action _execute; + private readonly Func? _canExecute; + + public RelayCommand(Action execute, Func? canExecute = null) + { + _execute = execute ?? throw new ArgumentNullException(nameof(execute)); + _canExecute = canExecute; + } + + public event EventHandler? CanExecuteChanged; + + public bool CanExecute(object? parameter) => _canExecute?.Invoke() ?? true; + + public void Execute(object? parameter) => _execute(); + + public void RaiseCanExecuteChanged() => CanExecuteChanged?.Invoke(this, EventArgs.Empty); +} diff --git a/Wino.Mail.WinUI/ShellWindow.xaml.cs b/Wino.Mail.WinUI/ShellWindow.xaml.cs index c03fa2e7..efb8c768 100644 --- a/Wino.Mail.WinUI/ShellWindow.xaml.cs +++ b/Wino.Mail.WinUI/ShellWindow.xaml.cs @@ -19,6 +19,7 @@ public sealed partial class ShellWindow : WindowEx, IWinoShellWindow, IRecipient { public IStatePersistanceService StatePersistanceService { get; } = WinoApplication.Current.Services.GetService() ?? throw new Exception("StatePersistanceService not registered in DI container."); public IPreferencesService PreferencesService { get; } = WinoApplication.Current.Services.GetService() ?? throw new Exception("PreferencesService not registered in DI container."); + private readonly ISystemTrayService _systemTrayService; public ShellWindow() { @@ -30,6 +31,17 @@ public sealed partial class ShellWindow : WindowEx, IWinoShellWindow, IRecipient MinWidth = 420; MinHeight = 420; ConfigureTitleBar(); + + // Initialize system tray service + _systemTrayService = WinoApplication.Current.Services.GetService() ?? throw new Exception("SystemTrayService not registered in DI container."); + _systemTrayService.Initialize(); + _systemTrayService.TrayIconDoubleClicked += OnTrayIconDoubleClicked; + + // Handle window closing event to minimize to tray instead of closing + Closed += OnWindowClosed; + + // Use the AppWindow.Closing event to handle the close request + AppWindow.Closing += OnAppWindowClosing; } private void ConfigureTitleBar() @@ -119,4 +131,56 @@ public sealed partial class ShellWindow : WindowEx, IWinoShellWindow, IRecipient } }); } + + private void OnAppWindowClosing(object sender, Microsoft.UI.Windowing.AppWindowClosingEventArgs e) + { + // Cancel the close and minimize to tray instead + e.Cancel = true; + MinimizeToTray(); + } + + private void OnWindowClosed(object sender, WindowEventArgs e) + { + // Clean up tray icon when window is actually closed + _systemTrayService?.Dispose(); + } + + private void MinimizeToTray() + { + // Hide the window and show tray icon + this.Hide(); + _systemTrayService.Show(); + } + + private void OnTrayIconDoubleClicked(object? sender, EventArgs e) + { + // Restore the window from tray + RestoreFromTray(); + } + + private void RestoreFromTray() + { + if (_systemTrayService.IsMinimizedToTray) + { + // Show the window and hide tray icon + this.Show(); + this.Activate(); + _systemTrayService.Hide(); + } + } + + public void ForceClose() + { + // Unsubscribe from the closing event to avoid infinite loop + AppWindow.Closing -= OnAppWindowClosing; + + // Clean up system tray + _systemTrayService?.Dispose(); + + // Close the window + this.Close(); + + // Exit the application + Application.Current.Exit(); + } } diff --git a/Wino.Mail.WinUI/Wino.Mail.WinUI.csproj b/Wino.Mail.WinUI/Wino.Mail.WinUI.csproj index 1b1f2a4f..666cec74 100644 --- a/Wino.Mail.WinUI/Wino.Mail.WinUI.csproj +++ b/Wino.Mail.WinUI/Wino.Mail.WinUI.csproj @@ -72,6 +72,7 @@ + @@ -112,6 +113,7 @@ + From 9623c2e6d2802d0e8fe8f776994317727bcaa0ce Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Burak=20Kaan=20K=C3=B6se?= Date: Sat, 4 Oct 2025 23:10:07 +0200 Subject: [PATCH 016/312] Synchronization manager. --- .../Interfaces/ISynchronizationManager.cs | 98 ++++ .../IWinoServerConnectionManager.cs | 106 ---- .../AccountManagementPageViewModelBase.cs | 3 - Wino.Core.WinUI/CoreUWPContainerSetup.cs | 5 - .../EmptyWinoServerConnectionManager.cs | 55 --- Wino.Core.WinUI/WinoApplication.cs | 2 + Wino.Core/CoreContainerSetup.cs | 2 + Wino.Core/Services/SynchronizationManager.cs | 451 ++++++++++++++++++ .../SynchronizationManagerInitializer.cs | 33 ++ Wino.Core/Services/WinoRequestDelegator.cs | 18 +- .../AccountDetailsPageViewModel.cs | 18 +- .../AccountManagementViewModel.cs | 85 ++-- .../AliasManagementPageViewModel.cs | 13 +- Wino.Mail.ViewModels/ComposePageViewModel.cs | 18 +- Wino.Mail.ViewModels/MailListPageViewModel.cs | 89 ++-- .../MailRenderingPageViewModel.cs | 12 +- .../TestingImapConnectionPage.xaml.cs | 53 +- 17 files changed, 709 insertions(+), 352 deletions(-) create mode 100644 Wino.Core.Domain/Interfaces/ISynchronizationManager.cs delete mode 100644 Wino.Core.Domain/Interfaces/IWinoServerConnectionManager.cs delete mode 100644 Wino.Core.WinUI/Services/EmptyWinoServerConnectionManager.cs create mode 100644 Wino.Core/Services/SynchronizationManager.cs create mode 100644 Wino.Core/Services/SynchronizationManagerInitializer.cs diff --git a/Wino.Core.Domain/Interfaces/ISynchronizationManager.cs b/Wino.Core.Domain/Interfaces/ISynchronizationManager.cs new file mode 100644 index 00000000..c1ee65c6 --- /dev/null +++ b/Wino.Core.Domain/Interfaces/ISynchronizationManager.cs @@ -0,0 +1,98 @@ +using System; +using System.Collections.Generic; +using System.Threading; +using System.Threading.Tasks; +using Wino.Core.Domain.Entities.Mail; +using Wino.Core.Domain.Entities.Shared; +using Wino.Core.Domain.Enums; +using Wino.Core.Domain.Models.Authentication; +using Wino.Core.Domain.Models.Connectivity; +using Wino.Core.Domain.Models.Synchronization; + +namespace Wino.Core.Domain.Interfaces; + +/// +/// Interface for the singleton synchronization manager that handles synchronizer instances and operations. +/// +public interface ISynchronizationManager +{ + /// + /// Initializes the SynchronizationManager with required dependencies. + /// + Task InitializeAsync(ISynchronizerFactory synchronizerFactory, + IImapTestService imapTestService, + IAccountService accountService, + IAuthenticationProvider authenticationProvider); + + /// + /// Tests IMAP server connectivity for the given server information. + /// + Task TestImapConnectivityAsync(CustomServerInformation serverInformation, bool allowSSLHandshake); + + /// + /// Starts a new mail synchronization for the given account. + /// + Task SynchronizeMailAsync(MailSynchronizationOptions options, + CancellationToken cancellationToken = default); + + /// + /// Checks if there is an ongoing synchronization for the given account. + /// + bool IsAccountSynchronizing(Guid accountId); + + /// + /// Queues a mail action request to the corresponding account's synchronizer. + /// + Task QueueRequestAsync(IRequestBase request, Guid accountId); + + /// + /// Handles folder synchronization for the given account. + /// + Task SynchronizeFoldersAsync(Guid accountId, + CancellationToken cancellationToken = default); + + /// + /// Handles alias synchronization for the given account. + /// + Task SynchronizeAliasesAsync(Guid accountId, + CancellationToken cancellationToken = default); + + /// + /// Handles profile synchronization for the given account. + /// + Task SynchronizeProfileAsync(Guid accountId, + CancellationToken cancellationToken = default); + + /// + /// Downloads a MIME message for the given mail item. + /// + Task DownloadMimeMessageAsync(MailCopy mailItem, Guid accountId, + CancellationToken cancellationToken = default); + + /// + /// Creates a new synchronizer for a newly added account. + /// + Task CreateSynchronizerForAccountAsync(MailAccount account); + + /// + /// Destroys the synchronizer for the given account. + /// + Task DestroySynchronizerAsync(Guid accountId); + + /// + /// Gets all cached synchronizers. + /// + IEnumerable GetAllSynchronizers(); + + /// + /// Gets a synchronizer for the given account ID. + /// + Task GetSynchronizerAsync(Guid accountId); + + /// + /// Handles OAuth authentication for the specified provider. + /// + Task HandleAuthorizationAsync(MailProviderType providerType, + MailAccount account = null, + bool proposeCopyAuthorizationURL = false); +} \ No newline at end of file diff --git a/Wino.Core.Domain/Interfaces/IWinoServerConnectionManager.cs b/Wino.Core.Domain/Interfaces/IWinoServerConnectionManager.cs deleted file mode 100644 index 7fc5c4fa..00000000 --- a/Wino.Core.Domain/Interfaces/IWinoServerConnectionManager.cs +++ /dev/null @@ -1,106 +0,0 @@ -using System; -using System.Threading; -using System.Threading.Tasks; - -namespace Wino.Core.Domain.Interfaces; - -/// -/// Simple wrapper class to maintain compatibility with the original WinoServerResponse structure. -/// -/// Type of the expected response. -public class WinoServerResponse -{ - public bool IsSuccess { get; set; } - public string Message { get; set; } - public T Data { get; set; } - - public static WinoServerResponse CreateSuccessResponse(T data) - { - return new WinoServerResponse - { - IsSuccess = true, - Data = data - }; - } - - public static WinoServerResponse CreateErrorResponse(string message) - { - return new WinoServerResponse - { - IsSuccess = false, - Message = message - }; - } - - public void ThrowIfFailed() - { - if (!IsSuccess) - throw new InvalidOperationException(Message); - } -} - -/// -/// Connection status enum to maintain compatibility. -/// -public enum WinoServerConnectionStatus -{ - None, - Connecting, - Connected, - Disconnected, - Failed -} - -public interface IWinoServerConnectionManager -{ - /// - /// When the connection status changes, this event will be triggered. - /// - event EventHandler StatusChanged; - - /// - /// Gets the connection status. - /// - WinoServerConnectionStatus Status { get; } - - /// - /// Launches Full Trust process (Wino Server) and awaits connection completion. - /// If connection is not established in 10 seconds, it will return false. - /// If the server process is already running, it'll connect to existing one. - /// If the server process is not running, it'll be launched and connection establishment is awaited. - /// - /// Whether connection is established or not. - Task ConnectAsync(); - - /// - /// Queues a new user request to be processed by Wino Server. - /// Healthy connection must present before calling this method. - /// - /// Request to queue for synchronizer in the server. - /// Account id to queueu request for. - Task QueueRequestAsync(IRequestBase request, Guid accountId); - - /// - /// Returns response from server for the given request. - /// - /// Response type. - /// Request type. - /// Request type. - /// Response received from the server for the given TResponse type. - Task> GetResponseAsync(TRequestType clientMessage, CancellationToken cancellationToken = default) where TRequestType : IClientMessage; - - /// - /// Handle for connecting to the server. - /// If the server is already running, it'll connect to existing one. - /// Callers can await this handle to wait for connection establishment. - /// - TaskCompletionSource ConnectingHandle { get; } -} - -public interface IWinoServerConnectionManager : IWinoServerConnectionManager, IInitializeAsync -{ - /// - /// Existing connection handle to the server of TAppServiceConnection type. - /// - TAppServiceConnection Connection { get; set; } -} diff --git a/Wino.Core.ViewModels/AccountManagementPageViewModelBase.cs b/Wino.Core.ViewModels/AccountManagementPageViewModelBase.cs index cb282865..03184d43 100644 --- a/Wino.Core.ViewModels/AccountManagementPageViewModelBase.cs +++ b/Wino.Core.ViewModels/AccountManagementPageViewModelBase.cs @@ -40,7 +40,6 @@ public abstract partial class AccountManagementPageViewModelBase : CoreBaseViewM public int FREE_ACCOUNT_COUNT { get; } = 3; protected IDialogServiceBase DialogService { get; } - protected IWinoServerConnectionManager WinoServerConnectionManager { get; } protected INavigationService NavigationService { get; } protected IAccountService AccountService { get; } protected IProviderService ProviderService { get; } @@ -49,7 +48,6 @@ public abstract partial class AccountManagementPageViewModelBase : CoreBaseViewM protected IPreferencesService PreferencesService { get; } public AccountManagementPageViewModelBase(IDialogServiceBase dialogService, - IWinoServerConnectionManager winoServerConnectionManager, INavigationService navigationService, IAccountService accountService, IProviderService providerService, @@ -58,7 +56,6 @@ public abstract partial class AccountManagementPageViewModelBase : CoreBaseViewM IPreferencesService preferencesService) { DialogService = dialogService; - WinoServerConnectionManager = winoServerConnectionManager; NavigationService = navigationService; AccountService = accountService; ProviderService = providerService; diff --git a/Wino.Core.WinUI/CoreUWPContainerSetup.cs b/Wino.Core.WinUI/CoreUWPContainerSetup.cs index 95d74bc0..02f4aeac 100644 --- a/Wino.Core.WinUI/CoreUWPContainerSetup.cs +++ b/Wino.Core.WinUI/CoreUWPContainerSetup.cs @@ -1,6 +1,5 @@ using Microsoft.Extensions.DependencyInjection; using Microsoft.UI.Xaml; -using Windows.ApplicationModel.AppService; using Wino.Core.Domain.Interfaces; using Wino.Core.ViewModels; using Wino.Core.WinUI.Services; @@ -12,10 +11,6 @@ public static class CoreUWPContainerSetup { public static void RegisterCoreUWPServices(this IServiceCollection services) { - var serverConnectionManager = new EmptyWinoServerConnectionManager(); - - services.AddSingleton(serverConnectionManager); - services.AddSingleton>(serverConnectionManager); services.AddSingleton, ApplicationResourceManager>(); services.AddSingleton(); diff --git a/Wino.Core.WinUI/Services/EmptyWinoServerConnectionManager.cs b/Wino.Core.WinUI/Services/EmptyWinoServerConnectionManager.cs deleted file mode 100644 index a6b0da50..00000000 --- a/Wino.Core.WinUI/Services/EmptyWinoServerConnectionManager.cs +++ /dev/null @@ -1,55 +0,0 @@ -using System; -using System.Threading; -using System.Threading.Tasks; -using Wino.Core.Domain.Interfaces; - -namespace Wino.Core.WinUI.Services; - -/// -/// Empty implementation of IWinoServerConnectionManager that returns default values. -/// This replaces the old AppServiceConnection-based implementation. -/// -public class EmptyWinoServerConnectionManager : IWinoServerConnectionManager -{ - public event EventHandler StatusChanged { add { } remove { } } - - public WinoServerConnectionStatus Status => WinoServerConnectionStatus.Connected; - - public TaskCompletionSource ConnectingHandle { get; } = new TaskCompletionSource(); - - public EmptyWinoServerConnectionManager() - { - ConnectingHandle.SetResult(true); - } - - public Task ConnectAsync() - { - return Task.FromResult(true); - } - - public Task QueueRequestAsync(IRequestBase request, Guid accountId) - { - return Task.CompletedTask; - } - - public Task> GetResponseAsync(TRequestType clientMessage, CancellationToken cancellationToken = default) - where TRequestType : IClientMessage - { - var response = WinoServerResponse.CreateSuccessResponse(default(TResponse)); - return Task.FromResult(response); - } -} - -/// -/// Generic empty implementation for typed connection managers. -/// -/// The connection type (not used in this implementation) -public class EmptyWinoServerConnectionManager : EmptyWinoServerConnectionManager, IWinoServerConnectionManager -{ - public TAppServiceConnection Connection { get; set; } - - public Task InitializeAsync() - { - return Task.CompletedTask; - } -} \ No newline at end of file diff --git a/Wino.Core.WinUI/WinoApplication.cs b/Wino.Core.WinUI/WinoApplication.cs index d1dd2f2c..efbb297d 100644 --- a/Wino.Core.WinUI/WinoApplication.cs +++ b/Wino.Core.WinUI/WinoApplication.cs @@ -18,6 +18,7 @@ using Windows.Storage; using Wino.Core.Domain; using Wino.Core.Domain.Interfaces; using Wino.Core.Domain.Models.Translations; +using Wino.Core.Services; using Wino.Messaging.Client.Shell; using Wino.Services; using WinUIEx; @@ -84,6 +85,7 @@ public abstract class WinoApplication : Application, IRecipient yield return DatabaseService; yield return TranslationService; yield return NewThemeService; // Initialize NewThemeService instead of old ThemeService + yield return Services.GetService(); // yield return ThemeService; // Keep old service for backward compatibility but don't initialize } diff --git a/Wino.Core/CoreContainerSetup.cs b/Wino.Core/CoreContainerSetup.cs index 1853c4c9..2645d3de 100644 --- a/Wino.Core/CoreContainerSetup.cs +++ b/Wino.Core/CoreContainerSetup.cs @@ -17,6 +17,8 @@ public static class CoreContainerSetup services.AddSingleton(loggerLevelSwitcher); services.AddSingleton(); + services.AddSingleton(provider => SynchronizationManager.Instance); + services.AddTransient(); services.AddTransient(); services.AddTransient(); diff --git a/Wino.Core/Services/SynchronizationManager.cs b/Wino.Core/Services/SynchronizationManager.cs new file mode 100644 index 00000000..2f8f453e --- /dev/null +++ b/Wino.Core/Services/SynchronizationManager.cs @@ -0,0 +1,451 @@ +using System; +using System.Collections.Concurrent; +using System.Collections.Generic; +using System.Linq; +using System.Threading; +using System.Threading.Tasks; +using Serilog; +using Wino.Core.Domain.Entities.Mail; +using Wino.Core.Domain.Entities.Shared; +using Wino.Core.Domain.Enums; +using Wino.Core.Domain.Exceptions; +using Wino.Core.Domain.Interfaces; +using Wino.Core.Domain.Models.Authentication; +using Wino.Core.Domain.Models.Connectivity; +using Wino.Core.Domain.Models.Synchronization; +using Wino.Messaging.Server; + +namespace Wino.Core.Services; + +/// +/// Singleton manager that handles synchronizer instances and operations for all accounts. +/// Replaces the old WinoServerConnectionManager functionality. +/// +public class SynchronizationManager : ISynchronizationManager +{ + private static readonly Lazy _instance = new(() => new SynchronizationManager()); + public static SynchronizationManager Instance => _instance.Value; + + private readonly ConcurrentDictionary _synchronizerCache = new(); + private readonly SemaphoreSlim _initializationSemaphore = new(1, 1); + private readonly ILogger _logger = Log.ForContext(); + + private ISynchronizerFactory _synchronizerFactory; + private SynchronizerFactory _concreteSynchronizerFactory; + private IImapTestService _imapTestService; + private IAccountService _accountService; + private IAuthenticationProvider _authenticationProvider; + private bool _isInitialized = false; + + private SynchronizationManager() { } + + /// + /// Initializes the SynchronizationManager with required dependencies. + /// This must be called before using any other methods. + /// + /// Factory for creating synchronizers + /// Service for testing IMAP connectivity + /// Service for account operations + /// Provider for OAuth authentication + public async Task InitializeAsync(ISynchronizerFactory synchronizerFactory, + IImapTestService imapTestService, + IAccountService accountService, + IAuthenticationProvider authenticationProvider) + { + await _initializationSemaphore.WaitAsync(); + try + { + if (_isInitialized) return; + + _synchronizerFactory = synchronizerFactory ?? throw new ArgumentNullException(nameof(synchronizerFactory)); + _concreteSynchronizerFactory = synchronizerFactory as SynchronizerFactory ?? throw new ArgumentException("SynchronizerFactory must be the concrete implementation"); + _imapTestService = imapTestService ?? throw new ArgumentNullException(nameof(imapTestService)); + _accountService = accountService ?? throw new ArgumentNullException(nameof(accountService)); + _authenticationProvider = authenticationProvider ?? throw new ArgumentNullException(nameof(authenticationProvider)); + + // Get all accounts and create synchronizers for them + var accounts = await _accountService.GetAccountsAsync(); + + foreach (var account in accounts) + { + try + { + var synchronizer = _concreteSynchronizerFactory.CreateNewSynchronizer(account); + _synchronizerCache.TryAdd(account.Id, synchronizer); + + _logger.Information("Created synchronizer for account {AccountName} ({AccountId})", + account.Name, account.Id); + } + catch (Exception ex) + { + _logger.Error(ex, "Failed to create synchronizer for account {AccountName} ({AccountId})", + account.Name, account.Id); + } + } + + _isInitialized = true; + _logger.Information("SynchronizationManager initialized with {Count} synchronizers", _synchronizerCache.Count); + } + finally + { + _initializationSemaphore.Release(); + } + } + + /// + /// Tests IMAP server connectivity for the given server information. + /// + /// Server information to test + /// Whether to allow SSL handshake + /// Test results indicating success or failure with details + public async Task TestImapConnectivityAsync(CustomServerInformation serverInformation, bool allowSSLHandshake) + { + EnsureInitialized(); + + try + { + _logger.Information("Testing IMAP connectivity for {Server}:{Port}", + serverInformation.IncomingServer, + serverInformation.IncomingServerPort); + + await _imapTestService.TestImapConnectionAsync(serverInformation, allowSSLHandshake); + + _logger.Information("IMAP connectivity test successful"); + return ImapConnectivityTestResults.Success(); + } + catch (ImapTestSSLCertificateException sslTestException) + { + _logger.Warning("IMAP connectivity test requires SSL certificate confirmation"); + return ImapConnectivityTestResults.CertificateUIRequired( + sslTestException.Issuer, + sslTestException.ExpirationDateString, + sslTestException.ValidFromDateString); + } + catch (ImapClientPoolException clientPoolException) + { + _logger.Error(clientPoolException, "IMAP connectivity test failed with protocol log"); + return ImapConnectivityTestResults.Failure(clientPoolException, clientPoolException.ProtocolLog); + } + catch (Exception exception) + { + _logger.Error(exception, "IMAP connectivity test failed"); + return ImapConnectivityTestResults.Failure(exception, string.Empty); + } + } + + /// + /// Starts a new mail synchronization for the given account. + /// + /// Mail synchronization options + /// Cancellation token + /// Synchronization result + public async Task SynchronizeMailAsync(MailSynchronizationOptions options, + CancellationToken cancellationToken = default) + { + EnsureInitialized(); + + var synchronizer = await GetOrCreateSynchronizerAsync(options.AccountId); + if (synchronizer == null) + { + _logger.Error("Could not find or create synchronizer for account {AccountId}", options.AccountId); + return MailSynchronizationResult.Failed; + } + + _logger.Information("Starting mail synchronization for account {AccountId} with type {SyncType}", + options.AccountId, options.Type); + + try + { + var result = await synchronizer.SynchronizeMailsAsync(options, cancellationToken); + + _logger.Information("Mail synchronization completed for account {AccountId} with state {State}", + options.AccountId, result.CompletedState); + + return result; + } + catch (Exception ex) + { + _logger.Error(ex, "Mail synchronization failed for account {AccountId}", options.AccountId); + return MailSynchronizationResult.Failed; + } + } + + /// + /// Checks if there is an ongoing synchronization for the given account. + /// + /// Account ID to check + /// True if synchronization is ongoing, false otherwise + public bool IsAccountSynchronizing(Guid accountId) + { + EnsureInitialized(); + + if (_synchronizerCache.TryGetValue(accountId, out var synchronizer)) + { + return synchronizer.State == AccountSynchronizerState.Synchronizing || + synchronizer.State == AccountSynchronizerState.ExecutingRequests; + } + + return false; + } + + /// + /// Queues a mail action request to the corresponding account's synchronizer. + /// + /// Request to queue + /// Account ID to queue the request for + public async Task QueueRequestAsync(IRequestBase request, Guid accountId) + { + EnsureInitialized(); + + var synchronizer = await GetOrCreateSynchronizerAsync(accountId); + if (synchronizer == null) + { + _logger.Error("Could not find or create synchronizer for account {AccountId} to queue request", accountId); + return; + } + + _logger.Debug("Queuing request {RequestType} for account {AccountId}", + request.GetType().Name, accountId); + + synchronizer.QueueRequest(request); + } + + /// + /// Handles folder synchronization for the given account. + /// + /// Account ID to synchronize folders for + /// Cancellation token + /// Synchronization result + public async Task SynchronizeFoldersAsync(Guid accountId, + CancellationToken cancellationToken = default) + { + EnsureInitialized(); + + var options = new MailSynchronizationOptions + { + AccountId = accountId, + Type = MailSynchronizationType.FoldersOnly + }; + + return await SynchronizeMailAsync(options, cancellationToken); + } + + /// + /// Handles alias synchronization for the given account. + /// + /// Account ID to synchronize aliases for + /// Cancellation token + /// Synchronization result + public async Task SynchronizeAliasesAsync(Guid accountId, + CancellationToken cancellationToken = default) + { + EnsureInitialized(); + + var options = new MailSynchronizationOptions + { + AccountId = accountId, + Type = MailSynchronizationType.Alias + }; + + return await SynchronizeMailAsync(options, cancellationToken); + } + + /// + /// Handles profile synchronization for the given account. + /// + /// Account ID to synchronize profile for + /// Cancellation token + /// Synchronization result + public async Task SynchronizeProfileAsync(Guid accountId, + CancellationToken cancellationToken = default) + { + EnsureInitialized(); + + var options = new MailSynchronizationOptions + { + AccountId = accountId, + Type = MailSynchronizationType.UpdateProfile + }; + + return await SynchronizeMailAsync(options, cancellationToken); + } + + /// + /// Downloads a MIME message for the given mail item. + /// + /// Mail item to download + /// Account ID that owns the mail item + /// Cancellation token + /// Downloaded MIME content path + public async Task DownloadMimeMessageAsync(MailCopy mailItem, Guid accountId, + CancellationToken cancellationToken = default) + { + EnsureInitialized(); + + var synchronizer = await GetOrCreateSynchronizerAsync(accountId); + if (synchronizer == null) + { + _logger.Error("Could not find or create synchronizer for account {AccountId} to download MIME", accountId); + return null; + } + + _logger.Debug("Downloading MIME message for mail item {MailItemId}", mailItem.Id); + + try + { + await synchronizer.DownloadMissingMimeMessageAsync(mailItem, null, cancellationToken); + return mailItem.Id.ToString(); // Return some identifier, actual implementation might be different + } + catch (Exception ex) + { + _logger.Error(ex, "Failed to download MIME message for mail item {MailItemId}", mailItem.Id); + return null; + } + } + + /// + /// Creates a new synchronizer for a newly added account. + /// + /// Account to create synchronizer for + /// Created synchronizer + public Task CreateSynchronizerForAccountAsync(MailAccount account) + { + EnsureInitialized(); + + try + { + var synchronizer = _concreteSynchronizerFactory.CreateNewSynchronizer(account); + _synchronizerCache.TryAdd(account.Id, synchronizer); + + _logger.Information("Created new synchronizer for account {AccountName} ({AccountId})", + account.Name, account.Id); + + return Task.FromResult(synchronizer); + } + catch (Exception ex) + { + _logger.Error(ex, "Failed to create synchronizer for account {AccountName} ({AccountId})", + account.Name, account.Id); + return Task.FromResult(null); + } + } + + /// + /// Destroys the synchronizer for the given account. + /// + /// Account ID to destroy synchronizer for + public async Task DestroySynchronizerAsync(Guid accountId) + { + EnsureInitialized(); + + if (_synchronizerCache.TryRemove(accountId, out var synchronizer)) + { + try + { + await synchronizer.KillSynchronizerAsync(); + _logger.Information("Destroyed synchronizer for account {AccountId}", accountId); + } + catch (Exception ex) + { + _logger.Error(ex, "Failed to destroy synchronizer for account {AccountId}", accountId); + } + } + } + + /// + /// Gets all cached synchronizers. + /// + /// Collection of all cached synchronizers + public IEnumerable GetAllSynchronizers() + { + EnsureInitialized(); + return _synchronizerCache.Values.ToList(); + } + + /// + /// Gets a synchronizer for the given account ID. + /// + /// Account ID + /// Synchronizer if found, null otherwise + public async Task GetSynchronizerAsync(Guid accountId) + { + EnsureInitialized(); + return await GetOrCreateSynchronizerAsync(accountId); + } + + private async Task GetOrCreateSynchronizerAsync(Guid accountId) + { + if (_synchronizerCache.TryGetValue(accountId, out var existingSynchronizer)) + { + return existingSynchronizer; + } + + // Try to create a new synchronizer if not found + var account = await _accountService.GetAccountAsync(accountId); + if (account != null) + { + return await CreateSynchronizerForAccountAsync(account); + } + + return null; + } + + /// + /// Handles OAuth authentication for the specified provider. + /// + /// The mail provider type to authenticate + /// Optional account to authenticate (null for initial authentication) + /// Whether to propose copying auth URL for Gmail + /// Token information containing access token and username + public async Task HandleAuthorizationAsync(MailProviderType providerType, + MailAccount account = null, + bool proposeCopyAuthorizationURL = false) + { + EnsureInitialized(); + + try + { + var authenticator = _authenticationProvider.GetAuthenticator(providerType); + + // Some users are having issues with Gmail authentication. + // Their browsers may never launch to complete authentication. + // Offer to copy auth url for them to complete it manually. + // Redirection will occur to the app and the token will be saved. + if (proposeCopyAuthorizationURL && authenticator is IGmailAuthenticator gmailAuthenticator) + { + gmailAuthenticator.ProposeCopyAuthURL = true; + } + + TokenInformationEx tokenInfo; + + if (account != null) + { + // Get token for existing account (may trigger interactive auth if token is expired) + tokenInfo = await authenticator.GetTokenInformationAsync(account); + _logger.Information("Retrieved token for existing account {AccountAddress}", account.Address); + } + else + { + // Initial authentication request - there is no account to get token for + // This will always trigger interactive authentication + tokenInfo = await authenticator.GenerateTokenInformationAsync(null); + _logger.Information("Generated new token for {ProviderType} authentication", providerType); + } + + return tokenInfo; + } + catch (Exception ex) + { + _logger.Error(ex, "Failed to handle authorization for {ProviderType}", providerType); + throw; + } + } + + private void EnsureInitialized() + { + if (!_isInitialized) + { + throw new InvalidOperationException("SynchronizationManager must be initialized before use. Call InitializeAsync first."); + } + } +} \ No newline at end of file diff --git a/Wino.Core/Services/SynchronizationManagerInitializer.cs b/Wino.Core/Services/SynchronizationManagerInitializer.cs new file mode 100644 index 00000000..ddae076f --- /dev/null +++ b/Wino.Core/Services/SynchronizationManagerInitializer.cs @@ -0,0 +1,33 @@ +using System; +using System.Threading.Tasks; +using Microsoft.Extensions.DependencyInjection; +using Wino.Core.Domain.Interfaces; +using Wino.Core.Services; + +namespace Wino.Core.Services; + +/// +/// Service responsible for initializing the SynchronizationManager during app startup. +/// +public class SynchronizationManagerInitializer : IInitializeAsync +{ + private readonly IServiceProvider _serviceProvider; + + public SynchronizationManagerInitializer(IServiceProvider serviceProvider) + { + _serviceProvider = serviceProvider; + } + + public async Task InitializeAsync() + { + var synchronizerFactory = _serviceProvider.GetRequiredService(); + var imapTestService = _serviceProvider.GetRequiredService(); + var accountService = _serviceProvider.GetRequiredService(); + var authenticationProvider = _serviceProvider.GetRequiredService(); + + // Cast to concrete type to access CreateNewSynchronizer method + var concreteSynchronizerFactory = synchronizerFactory as SynchronizerFactory; + + await SynchronizationManager.Instance.InitializeAsync(concreteSynchronizerFactory, imapTestService, accountService, authenticationProvider); + } +} \ No newline at end of file diff --git a/Wino.Core/Services/WinoRequestDelegator.cs b/Wino.Core/Services/WinoRequestDelegator.cs index e57c2b0f..7686a9c9 100644 --- a/Wino.Core/Services/WinoRequestDelegator.cs +++ b/Wino.Core/Services/WinoRequestDelegator.cs @@ -19,17 +19,14 @@ namespace Wino.Core.Services; public class WinoRequestDelegator : IWinoRequestDelegator { private readonly IWinoRequestProcessor _winoRequestProcessor; - private readonly IWinoServerConnectionManager _winoServerConnectionManager; private readonly IFolderService _folderService; private readonly IMailDialogService _dialogService; public WinoRequestDelegator(IWinoRequestProcessor winoRequestProcessor, - IWinoServerConnectionManager winoServerConnectionManager, IFolderService folderService, IMailDialogService dialogService) { _winoRequestProcessor = winoRequestProcessor; - _winoServerConnectionManager = winoServerConnectionManager; _folderService = folderService; _dialogService = dialogService; } @@ -138,14 +135,11 @@ public class WinoRequestDelegator : IWinoRequestDelegator private async Task QueueRequestAsync(IRequestBase request, Guid accountId) { - await EnsureServerConnectedAsync(); - await _winoServerConnectionManager.QueueRequestAsync(request, accountId); + await SynchronizationManager.Instance.QueueRequestAsync(request, accountId); } - private async Task QueueSynchronizationAsync(Guid accountId) + private Task QueueSynchronizationAsync(Guid accountId) { - await EnsureServerConnectedAsync(); - var options = new MailSynchronizationOptions() { AccountId = accountId, @@ -153,12 +147,6 @@ public class WinoRequestDelegator : IWinoRequestDelegator }; WeakReferenceMessenger.Default.Send(new NewMailSynchronizationRequested(options, SynchronizationSource.Client)); - } - - private async Task EnsureServerConnectedAsync() - { - if (_winoServerConnectionManager.Status == WinoServerConnectionStatus.Connected) return; - - await _winoServerConnectionManager.ConnectAsync(); + return Task.CompletedTask; } } diff --git a/Wino.Mail.ViewModels/AccountDetailsPageViewModel.cs b/Wino.Mail.ViewModels/AccountDetailsPageViewModel.cs index 494d8813..073b9204 100644 --- a/Wino.Mail.ViewModels/AccountDetailsPageViewModel.cs +++ b/Wino.Mail.ViewModels/AccountDetailsPageViewModel.cs @@ -11,8 +11,8 @@ using Wino.Core.Domain.Enums; using Wino.Core.Domain.Interfaces; using Wino.Core.Domain.Models.Folders; using Wino.Core.Domain.Models.Navigation; +using Wino.Core.Services; using Wino.Messaging.Client.Navigation; -using Wino.Messaging.Server; namespace Wino.Mail.ViewModels; @@ -20,7 +20,6 @@ public partial class AccountDetailsPageViewModel : MailBaseViewModel { private readonly IMailDialogService _dialogService; private readonly IAccountService _accountService; - private readonly IWinoServerConnectionManager _serverConnectionManager; private readonly IFolderService _folderService; private bool isLoaded = false; @@ -50,12 +49,10 @@ public partial class AccountDetailsPageViewModel : MailBaseViewModel public AccountDetailsPageViewModel(IMailDialogService dialogService, IAccountService accountService, - IWinoServerConnectionManager serverConnectionManager, IFolderService folderService) { _dialogService = dialogService; _accountService = accountService; - _serverConnectionManager = serverConnectionManager; _folderService = folderService; } @@ -95,21 +92,16 @@ public partial class AccountDetailsPageViewModel : MailBaseViewModel return; - var isSynchronizerKilledResponse = await _serverConnectionManager.GetResponseAsync(new KillAccountSynchronizerRequested(Account.Id)); + await SynchronizationManager.Instance.DestroySynchronizerAsync(Account.Id); - if (isSynchronizerKilledResponse.IsSuccess) - { - await _accountService.DeleteAccountAsync(Account); + await _accountService.DeleteAccountAsync(Account); - _dialogService.InfoBarMessage(Translator.Info_AccountDeletedTitle, string.Format(Translator.Info_AccountDeletedMessage, Account.Name), InfoBarMessageType.Success); + _dialogService.InfoBarMessage(Translator.Info_AccountDeletedTitle, string.Format(Translator.Info_AccountDeletedMessage, Account.Name), InfoBarMessageType.Success); - Messenger.Send(new BackBreadcrumNavigationRequested()); - } + Messenger.Send(new BackBreadcrumNavigationRequested()); } - - public override async void OnNavigatedTo(NavigationMode mode, object parameters) { base.OnNavigatedTo(mode, parameters); diff --git a/Wino.Mail.ViewModels/AccountManagementViewModel.cs b/Wino.Mail.ViewModels/AccountManagementViewModel.cs index a225d76d..f15ff5ef 100644 --- a/Wino.Mail.ViewModels/AccountManagementViewModel.cs +++ b/Wino.Mail.ViewModels/AccountManagementViewModel.cs @@ -12,15 +12,13 @@ using Wino.Core.Domain.Entities.Shared; using Wino.Core.Domain.Enums; using Wino.Core.Domain.Exceptions; using Wino.Core.Domain.Interfaces; -using Wino.Core.Domain.Models.Authentication; -using Wino.Core.Domain.Models.Connectivity; using Wino.Core.Domain.Models.Navigation; using Wino.Core.Domain.Models.Synchronization; +using Wino.Core.Services; using Wino.Core.ViewModels; using Wino.Core.ViewModels.Data; using Wino.Mail.ViewModels.Data; using Wino.Messaging.Client.Navigation; -using Wino.Messaging.Server; using Wino.Messaging.UI; namespace Wino.Mail.ViewModels; @@ -34,7 +32,6 @@ public partial class AccountManagementViewModel : AccountManagementPageViewModel public IMailDialogService MailDialogService { get; } public AccountManagementViewModel(IMailDialogService dialogService, - IWinoServerConnectionManager winoServerConnectionManager, INavigationService navigationService, IAccountService accountService, ISpecialImapProviderConfigResolver specialImapProviderConfigResolver, @@ -43,7 +40,7 @@ public partial class AccountManagementViewModel : AccountManagementPageViewModel IStoreManagementService storeManagementService, IWinoLogger winoLogger, IAuthenticationProvider authenticationProvider, - IPreferencesService preferencesService) : base(dialogService, winoServerConnectionManager, navigationService, accountService, providerService, storeManagementService, authenticationProvider, preferencesService) + IPreferencesService preferencesService) : base(dialogService, navigationService, accountService, providerService, storeManagementService, authenticationProvider, preferencesService) { MailDialogService = dialogService; _specialImapProviderConfigResolver = specialImapProviderConfigResolver; @@ -154,37 +151,36 @@ public partial class AccountManagementViewModel : AccountManagementPageViewModel createdAccount.Address = customServerInformation.Address; // Let server validate the imap/smtp connection. - var testResultResponse = await WinoServerConnectionManager.GetResponseAsync(new ImapConnectivityTestRequested(customServerInformation, true)); + // TODO: Protocol log with detailed failure. - if (!testResultResponse.IsSuccess) - { - throw new Exception($"{Translator.IMAPSetupDialog_ConnectionFailedTitle}\n{testResultResponse.Message}"); - } - else if (!testResultResponse.Data.IsSuccess) - { - // Server connectivity might succeed, but result might be failed. - throw new ImapClientPoolException(testResultResponse.Data.FailedReason, customServerInformation, testResultResponse.Data.FailureProtocolLog); - } + await _imapTestService.TestImapConnectionAsync(customServerInformation, true); + //var testResultResponse = await WinoServerConnectionManager.GetResponseAsync(new ImapConnectivityTestRequested(customServerInformation, true)); + + //if (!testResultResponse.IsSuccess) + //{ + // throw new Exception($"{Translator.IMAPSetupDialog_ConnectionFailedTitle}\n{testResultResponse.Message}"); + //} + //else if (!testResultResponse.Data.IsSuccess) + //{ + // // Server connectivity might succeed, but result might be failed. + // throw new ImapClientPoolException(testResultResponse.Data.FailedReason, customServerInformation, testResultResponse.Data.FailureProtocolLog); + //} } else { // OAuth authentication is handled here. - // Server authenticates, returns the token info here. + // Use SynchronizationManager to handle OAuth authentication. - var tokenInformationResponse = await WinoServerConnectionManager - .GetResponseAsync(new AuthorizationRequested(accountCreationDialogResult.ProviderType, - createdAccount, - createdAccount.ProviderType == MailProviderType.Gmail), accountCreationCancellationTokenSource.Token); + var authTokenInfo = await SynchronizationManager.Instance.HandleAuthorizationAsync( + accountCreationDialogResult.ProviderType, + createdAccount, + createdAccount.ProviderType == MailProviderType.Gmail); if (creationDialog.State == AccountCreationDialogState.Canceled) throw new AccountSetupCanceledException(); - if (!tokenInformationResponse.IsSuccess) - throw new Exception(tokenInformationResponse.Message); - - createdAccount.Address = tokenInformationResponse.Data.AccountAddress; - - tokenInformationResponse.ThrowIfFailed(); + // Update account address with authenticated user information + createdAccount.Address = authTokenInfo.AccountAddress; } } @@ -207,22 +203,23 @@ public partial class AccountManagementViewModel : AccountManagementPageViewModel Type = MailSynchronizationType.UpdateProfile }; - var profileSynchronizationResponse = await WinoServerConnectionManager.GetResponseAsync(new NewMailSynchronizationRequested(profileSyncOptions, SynchronizationSource.Client)); - - var profileSynchronizationResult = profileSynchronizationResponse.Data; + var profileSynchronizationResult = await SynchronizationManager.Instance.SynchronizeProfileAsync(createdAccount.Id); if (profileSynchronizationResult.CompletedState != SynchronizationCompletedState.Success) throw new Exception(Translator.Exception_FailedToSynchronizeProfileInformation); - createdAccount.SenderName = profileSynchronizationResult.ProfileInformation.SenderName; - createdAccount.Base64ProfilePictureData = profileSynchronizationResult.ProfileInformation.Base64ProfilePictureData; - - if (!string.IsNullOrEmpty(profileSynchronizationResult.ProfileInformation.AccountAddress)) + if (profileSynchronizationResult.ProfileInformation != null) { - createdAccount.Address = profileSynchronizationResult.ProfileInformation.AccountAddress; - } + createdAccount.SenderName = profileSynchronizationResult.ProfileInformation.SenderName; + createdAccount.Base64ProfilePictureData = profileSynchronizationResult.ProfileInformation.Base64ProfilePictureData; - await AccountService.UpdateProfileInformationAsync(createdAccount.Id, profileSynchronizationResult.ProfileInformation); + if (!string.IsNullOrEmpty(profileSynchronizationResult.ProfileInformation.AccountAddress)) + { + createdAccount.Address = profileSynchronizationResult.ProfileInformation.AccountAddress; + } + + await AccountService.UpdateProfileInformationAsync(createdAccount.Id, profileSynchronizationResult.ProfileInformation); + } } if (creationDialog is IImapAccountCreationDialog customServerAccountCreationDialog) @@ -237,26 +234,16 @@ public partial class AccountManagementViewModel : AccountManagementPageViewModel Type = MailSynchronizationType.FoldersOnly }; - var folderSynchronizationResponse = await WinoServerConnectionManager.GetResponseAsync(new NewMailSynchronizationRequested(folderSyncOptions, SynchronizationSource.Client)); - - var folderSynchronizationResult = folderSynchronizationResponse.Data; + var folderSynchronizationResult = await SynchronizationManager.Instance.SynchronizeFoldersAsync(createdAccount.Id); if (folderSynchronizationResult == null || folderSynchronizationResult.CompletedState != SynchronizationCompletedState.Success) - throw new Exception($"{Translator.Exception_FailedToSynchronizeFolders}\n{folderSynchronizationResponse.Message}"); + throw new Exception(Translator.Exception_FailedToSynchronizeFolders); // Sync aliases if supported. if (createdAccount.IsAliasSyncSupported) { // Try to synchronize aliases for the account. - - var aliasSyncOptions = new MailSynchronizationOptions() - { - AccountId = createdAccount.Id, - Type = MailSynchronizationType.Alias - }; - - var aliasSyncResponse = await WinoServerConnectionManager.GetResponseAsync(new NewMailSynchronizationRequested(aliasSyncOptions, SynchronizationSource.Client)); - var aliasSynchronizationResult = folderSynchronizationResponse.Data; + var aliasSynchronizationResult = await SynchronizationManager.Instance.SynchronizeAliasesAsync(createdAccount.Id); if (aliasSynchronizationResult.CompletedState != SynchronizationCompletedState.Success) throw new Exception(Translator.Exception_FailedToSynchronizeAliases); diff --git a/Wino.Mail.ViewModels/AliasManagementPageViewModel.cs b/Wino.Mail.ViewModels/AliasManagementPageViewModel.cs index 71b1f1bc..00453f05 100644 --- a/Wino.Mail.ViewModels/AliasManagementPageViewModel.cs +++ b/Wino.Mail.ViewModels/AliasManagementPageViewModel.cs @@ -12,7 +12,7 @@ using Wino.Core.Domain.Enums; using Wino.Core.Domain.Interfaces; using Wino.Core.Domain.Models.Navigation; using Wino.Core.Domain.Models.Synchronization; -using Wino.Messaging.Server; +using Wino.Core.Services; namespace Wino.Mail.ViewModels; @@ -20,7 +20,6 @@ public partial class AliasManagementPageViewModel : MailBaseViewModel { private readonly IMailDialogService _dialogService; private readonly IAccountService _accountService; - private readonly IWinoServerConnectionManager _winoServerConnectionManager; [ObservableProperty] [NotifyPropertyChangedFor(nameof(CanSynchronizeAliases))] @@ -32,12 +31,10 @@ public partial class AliasManagementPageViewModel : MailBaseViewModel public bool CanSynchronizeAliases => Account?.IsAliasSyncSupported ?? false; public AliasManagementPageViewModel(IMailDialogService dialogService, - IAccountService accountService, - IWinoServerConnectionManager winoServerConnectionManager) + IAccountService accountService) { _dialogService = dialogService; _accountService = accountService; - _winoServerConnectionManager = winoServerConnectionManager; } public override async void OnNavigatedTo(NavigationMode mode, object parameters) @@ -82,12 +79,12 @@ public partial class AliasManagementPageViewModel : MailBaseViewModel Type = MailSynchronizationType.Alias }; - var aliasSyncResponse = await _winoServerConnectionManager.GetResponseAsync(new NewMailSynchronizationRequested(aliasSyncOptions, SynchronizationSource.Client)); + var aliasSyncResult = await SynchronizationManager.Instance.SynchronizeAliasesAsync(Account.Id); - if (aliasSyncResponse.IsSuccess) + if (aliasSyncResult.CompletedState == SynchronizationCompletedState.Success) await LoadAliasesAsync(); else - _dialogService.InfoBarMessage(Translator.GeneralTitle_Error, aliasSyncResponse.Message, InfoBarMessageType.Error); + _dialogService.InfoBarMessage(Translator.GeneralTitle_Error, "Failed to synchronize aliases", InfoBarMessageType.Error); } [RelayCommand] diff --git a/Wino.Mail.ViewModels/ComposePageViewModel.cs b/Wino.Mail.ViewModels/ComposePageViewModel.cs index 979fcf0a..9363d087 100644 --- a/Wino.Mail.ViewModels/ComposePageViewModel.cs +++ b/Wino.Mail.ViewModels/ComposePageViewModel.cs @@ -13,11 +13,11 @@ using Wino.Core.Domain.Entities.Mail; using Wino.Core.Domain.Entities.Shared; using Wino.Core.Domain.Enums; using Wino.Core.Domain.Exceptions; +using Wino.Core.Services; using Wino.Core.Domain.Interfaces; using Wino.Core.Domain.Models.MailItem; using Wino.Core.Domain.Models.Navigation; using Wino.Core.Extensions; -using Wino.Core.Services; using Wino.Mail.ViewModels.Data; using Wino.Messaging.Client.Mails; using Wino.Messaging.Server; @@ -102,7 +102,6 @@ public partial class ComposePageViewModel : MailBaseViewModel private readonly IWinoRequestDelegator _worker; public readonly IFontService FontService; public readonly IPreferencesService PreferencesService; - private readonly IWinoServerConnectionManager _winoServerConnectionManager; public readonly IContactService ContactService; public ComposePageViewModel(IMailDialogService dialogService, @@ -115,8 +114,7 @@ public partial class ComposePageViewModel : MailBaseViewModel IWinoRequestDelegator worker, IContactService contactService, IFontService fontService, - IPreferencesService preferencesService, - IWinoServerConnectionManager winoServerConnectionManager) + IPreferencesService preferencesService) { NativeAppService = nativeAppService; ContactService = contactService; @@ -130,7 +128,6 @@ public partial class ComposePageViewModel : MailBaseViewModel _fileService = fileService; _accountService = accountService; _worker = worker; - _winoServerConnectionManager = winoServerConnectionManager; } [RelayCommand] @@ -412,13 +409,12 @@ public partial class ComposePageViewModel : MailBaseViewModel { downloadIfNeeded = false; - var package = new DownloadMissingMessageRequested(CurrentMailDraftItem.AssignedAccount.Id, CurrentMailDraftItem.MailCopy); - var downloadResponse = await _winoServerConnectionManager.GetResponseAsync(package); + // Download missing MIME message using SynchronizationManager + await SynchronizationManager.Instance.DownloadMimeMessageAsync( + CurrentMailDraftItem.MailCopy, + CurrentMailDraftItem.AssignedAccount.Id); - if (downloadResponse.IsSuccess) - { - goto retry; - } + goto retry; } else _dialogService.InfoBarMessage(Translator.Info_ComposerMissingMIMETitle, Translator.Info_ComposerMissingMIMEMessage, InfoBarMessageType.Error); diff --git a/Wino.Mail.ViewModels/MailListPageViewModel.cs b/Wino.Mail.ViewModels/MailListPageViewModel.cs index 78e0c54b..58c573a7 100644 --- a/Wino.Mail.ViewModels/MailListPageViewModel.cs +++ b/Wino.Mail.ViewModels/MailListPageViewModel.cs @@ -23,6 +23,7 @@ using Wino.Core.Domain.Models.MailItem; using Wino.Core.Domain.Models.Menus; using Wino.Core.Domain.Models.Reader; using Wino.Core.Domain.Models.Synchronization; +using Wino.Core.Services; using Wino.Mail.ViewModels.Collections; using Wino.Mail.ViewModels.Data; using Wino.Mail.ViewModels.Messages; @@ -81,7 +82,6 @@ public partial class MailListPageViewModel : MailBaseViewModel, private readonly IWinoRequestDelegator _winoRequestDelegator; private readonly IKeyPressService _keyPressService; private readonly IWinoLogger _winoLogger; - private readonly IWinoServerConnectionManager _winoServerConnectionManager; private MailItemViewModel _activeMailItem; public List SortingOptions { get; } = @@ -160,14 +160,12 @@ public partial class MailListPageViewModel : MailBaseViewModel, IKeyPressService keyPressService, IPreferencesService preferencesService, INewThemeService themeService, - IWinoLogger winoLogger, - IWinoServerConnectionManager winoServerConnectionManager) + IWinoLogger winoLogger) { MailCollection = new WinoMailCollection(threadingStrategyProvider); PreferencesService = preferencesService; ThemeService = themeService; _winoLogger = winoLogger; - _winoServerConnectionManager = winoServerConnectionManager; StatePersistenceService = statePersistenceService; NavigationService = navigationService; _accountService = accountService; @@ -841,51 +839,52 @@ public partial class MailListPageViewModel : MailBaseViewModel, // Perform online search. if (isDoingOnlineSearch) { - WinoServerResponse onlineSearchResult = null; - string onlineSearchFailedMessage = null; + // TODO: Burak: Handle online search. + //WinoServerResponse onlineSearchResult = null; + //string onlineSearchFailedMessage = null; - try - { - var accountIds = ActiveFolder.HandlingFolders.Select(a => a.MailAccountId).ToList(); - var folders = ActiveFolder.HandlingFolders.ToList(); - var searchRequest = new OnlineSearchRequested(accountIds, SearchQuery, folders); + //try + //{ + // var accountIds = ActiveFolder.HandlingFolders.Select(a => a.MailAccountId).ToList(); + // var folders = ActiveFolder.HandlingFolders.ToList(); + // var searchRequest = new OnlineSearchRequested(accountIds, SearchQuery, folders); - onlineSearchResult = await _winoServerConnectionManager.GetResponseAsync(searchRequest, cancellationToken); + // onlineSearchResult = await _winoServerConnectionManager.GetResponseAsync(searchRequest, cancellationToken); - if (onlineSearchResult.IsSuccess) - { - await ExecuteUIThread(() => { AreSearchResultsOnline = true; }); + // if (onlineSearchResult.IsSuccess) + // { + // await ExecuteUIThread(() => { AreSearchResultsOnline = true; }); - onlineSearchItems = onlineSearchResult.Data.SearchResult; - } - else - { - onlineSearchFailedMessage = onlineSearchResult.Message; - } - } - catch (OperationCanceledException) - { - throw; - } - catch (Exception ex) - { - Log.Warning(ex, "Failed to perform online search."); - onlineSearchFailedMessage = ex.Message; - } + // onlineSearchItems = onlineSearchResult.Data.SearchResult; + // } + // else + // { + // onlineSearchFailedMessage = onlineSearchResult.Message; + // } + //} + //catch (OperationCanceledException) + //{ + // throw; + //} + //catch (Exception ex) + //{ + // Log.Warning(ex, "Failed to perform online search."); + // onlineSearchFailedMessage = ex.Message; + //} - if (onlineSearchResult != null && !onlineSearchResult.IsSuccess) - { - // Query or server error. - var serverErrorMessage = string.Format(Translator.OnlineSearchFailed_Message, onlineSearchResult.Message); - _mailDialogService.InfoBarMessage(Translator.GeneralTitle_Error, serverErrorMessage, InfoBarMessageType.Warning); + //if (onlineSearchResult != null && !onlineSearchResult.IsSuccess) + //{ + // // Query or server error. + // var serverErrorMessage = string.Format(Translator.OnlineSearchFailed_Message, onlineSearchResult.Message); + // _mailDialogService.InfoBarMessage(Translator.GeneralTitle_Error, serverErrorMessage, InfoBarMessageType.Warning); - } - else if (!string.IsNullOrEmpty(onlineSearchFailedMessage)) - { - // Fatal error. - var serverErrorMessage = string.Format(Translator.OnlineSearchFailed_Message, onlineSearchFailedMessage); - _mailDialogService.InfoBarMessage(Translator.GeneralTitle_Error, serverErrorMessage, InfoBarMessageType.Warning); - } + //} + //else if (!string.IsNullOrEmpty(onlineSearchFailedMessage)) + //{ + // // Fatal error. + // var serverErrorMessage = string.Format(Translator.OnlineSearchFailed_Message, onlineSearchFailedMessage); + // _mailDialogService.InfoBarMessage(Translator.GeneralTitle_Error, serverErrorMessage, InfoBarMessageType.Warning); + //} } } @@ -1110,9 +1109,7 @@ public partial class MailListPageViewModel : MailBaseViewModel, foreach (var accountId in accountIds) { - var serverResponse = await _winoServerConnectionManager.GetResponseAsync(new SynchronizationExistenceCheckRequest(accountId)); - - if (serverResponse.IsSuccess && serverResponse.Data == true) + if (SynchronizationManager.Instance.IsAccountSynchronizing(accountId)) { isAnyAccountSynchronizing = true; break; diff --git a/Wino.Mail.ViewModels/MailRenderingPageViewModel.cs b/Wino.Mail.ViewModels/MailRenderingPageViewModel.cs index 3a2818c6..6be1fe8b 100644 --- a/Wino.Mail.ViewModels/MailRenderingPageViewModel.cs +++ b/Wino.Mail.ViewModels/MailRenderingPageViewModel.cs @@ -21,6 +21,7 @@ using Wino.Core.Domain.Models.MailItem; using Wino.Core.Domain.Models.Menus; using Wino.Core.Domain.Models.Navigation; using Wino.Core.Domain.Models.Reader; +using Wino.Core.Services; using Wino.Mail.ViewModels.Data; using Wino.Mail.ViewModels.Messages; using Wino.Messaging.Client.Mails; @@ -46,7 +47,6 @@ public partial class MailRenderingPageViewModel : MailBaseViewModel, private readonly IClipboardService _clipboardService; private readonly IUnsubscriptionService _unsubscriptionService; private readonly IApplicationConfiguration _applicationConfiguration; - private readonly IWinoServerConnectionManager _winoServerConnectionManager; private bool forceImageLoading = false; private MailItemViewModel initializedMailItemViewModel = null; @@ -142,8 +142,7 @@ public partial class MailRenderingPageViewModel : MailBaseViewModel, IUnsubscriptionService unsubscriptionService, IPreferencesService preferencesService, IPrintService printService, - IApplicationConfiguration applicationConfiguration, - IWinoServerConnectionManager winoServerConnectionManager) + IApplicationConfiguration applicationConfiguration) { _dialogService = dialogService; NativeAppService = nativeAppService; @@ -152,7 +151,6 @@ public partial class MailRenderingPageViewModel : MailBaseViewModel, PreferencesService = preferencesService; PrintService = printService; _applicationConfiguration = applicationConfiguration; - _winoServerConnectionManager = winoServerConnectionManager; _clipboardService = clipboardService; _unsubscriptionService = unsubscriptionService; _underlyingThemeService = underlyingThemeService; @@ -355,8 +353,10 @@ public partial class MailRenderingPageViewModel : MailBaseViewModel, // To show the progress on the UI. CurrentDownloadPercentage = 1; - var package = new DownloadMissingMessageRequested(mailItemViewModel.AssignedAccount.Id, mailItemViewModel.MailCopy); - await _winoServerConnectionManager.GetResponseAsync(package); + // Download missing MIME message using SynchronizationManager + await SynchronizationManager.Instance.DownloadMimeMessageAsync( + mailItemViewModel.MailCopy, + mailItemViewModel.AssignedAccount.Id); } catch (OperationCanceledException) { diff --git a/Wino.Mail.WinUI/Views/ImapSetup/TestingImapConnectionPage.xaml.cs b/Wino.Mail.WinUI/Views/ImapSetup/TestingImapConnectionPage.xaml.cs index 2bd04975..4d99cbdf 100644 --- a/Wino.Mail.WinUI/Views/ImapSetup/TestingImapConnectionPage.xaml.cs +++ b/Wino.Mail.WinUI/Views/ImapSetup/TestingImapConnectionPage.xaml.cs @@ -1,25 +1,20 @@ using System; using System.Threading.Tasks; using CommunityToolkit.Mvvm.Messaging; -using Microsoft.Extensions.DependencyInjection; using Microsoft.UI.Xaml.Controls; using Microsoft.UI.Xaml.Navigation; using Wino.Core.Domain; using Wino.Core.Domain.Entities.Shared; using Wino.Core.Domain.Exceptions; -using Wino.Core.Domain.Interfaces; using Wino.Core.Domain.Models.AutoDiscovery; -using Wino.Core.Domain.Models.Connectivity; -using Wino.Mail.WinUI; +using Wino.Core.Services; using Wino.Messaging.Client.Mails; -using Wino.Messaging.Server; namespace Wino.Views.ImapSetup; public sealed partial class TestingImapConnectionPage : Page { - private IWinoServerConnectionManager _winoServerConnectionManager = App.Current.Services.GetService(); private AutoDiscoverySettings autoDiscoverySettings; private CustomServerInformation serverInformationToTest; @@ -67,46 +62,34 @@ public sealed partial class TestingImapConnectionPage : Page await Task.Delay(1000); - var testResultResponse = await _winoServerConnectionManager - .GetResponseAsync(new ImapConnectivityTestRequested(serverInformationToTest, allowSSLHandshake)); + var testResultData = await SynchronizationManager.Instance.TestImapConnectivityAsync(serverInformationToTest, allowSSLHandshake); - if (!testResultResponse.IsSuccess) + if (testResultData.IsSuccess) { - // Wino Server is connection is failed. - ReturnWithError(testResultResponse.Message); + // All success. Finish setup with validated server information. + ReturnWithSuccess(); } else { - var testResultData = testResultResponse.Data; - - if (testResultData.IsSuccess) + // Check if certificate UI is required. + if (testResultData.IsCertificateUIRequired) { - // All success. Finish setup with validated server information. - ReturnWithSuccess(); + // Certificate UI is required. Show certificate dialog. + + CertIssuer.Text = testResultData.CertificateIssuer; + CertValidFrom.Text = testResultData.CertificateValidFromDateString; + CertValidTo.Text = testResultData.CertificateExpirationDateString; + + TestingConnectionPanel.Visibility = Microsoft.UI.Xaml.Visibility.Collapsed; + CertificateDialog.Visibility = Microsoft.UI.Xaml.Visibility.Visible; } else { - // Check if certificate UI is required. + // Connection test failed. Show error dialog. - if (testResultData.IsCertificateUIRequired) - { - // Certificate UI is required. Show certificate dialog. + var protocolLog = testResultData.FailureProtocolLog; - CertIssuer.Text = testResultData.CertificateIssuer; - CertValidFrom.Text = testResultData.CertificateValidFromDateString; - CertValidTo.Text = testResultData.CertificateExpirationDateString; - - TestingConnectionPanel.Visibility = Microsoft.UI.Xaml.Visibility.Collapsed; - CertificateDialog.Visibility = Microsoft.UI.Xaml.Visibility.Visible; - } - else - { - // Connection test failed. Show error dialog. - - var protocolLog = testResultData.FailureProtocolLog; - - ReturnWithError(testResultData.FailedReason, protocolLog); - } + ReturnWithError(testResultData.FailedReason, protocolLog); } } } From 309e891594f080529a50010a57a16f92e539f56e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Burak=20Kaan=20K=C3=B6se?= Date: Mon, 6 Oct 2025 17:46:00 +0200 Subject: [PATCH 017/312] Outlook auth fix and actually syncing. --- Wino.Authentication/OutlookAuthenticator.cs | 1 + .../Interfaces/IFolderMenuItem.cs | 3 +- .../Interfaces/ISynchronizationManager.cs | 5 +++ Wino.Core.Domain/MenuItems/FolderMenuItem.cs | 5 ++- Wino.Core.WinUI/Services/DialogServiceBase.cs | 10 ++++- Wino.Core.WinUI/Services/NativeAppService.cs | 19 +++++----- Wino.Core.WinUI/Services/NewThemeService.cs | 6 ++- .../Services/PreferencesService.cs | 2 +- Wino.Core/Services/SynchronizationManager.cs | 37 +++++++++++++++++++ Wino.Core/Services/WinoRequestDelegator.cs | 3 +- Wino.Mail.WinUI/App.xaml.cs | 9 +++-- Wino.Mail.WinUI/Services/DialogService.cs | 4 +- Wino.Mail.WinUI/ShellWindow.xaml | 1 + Wino.Mail.WinUI/Views/MailListPage.xaml | 2 +- 14 files changed, 85 insertions(+), 22 deletions(-) diff --git a/Wino.Authentication/OutlookAuthenticator.cs b/Wino.Authentication/OutlookAuthenticator.cs index 10bc5f26..7aa3113a 100644 --- a/Wino.Authentication/OutlookAuthenticator.cs +++ b/Wino.Authentication/OutlookAuthenticator.cs @@ -40,6 +40,7 @@ public class OutlookAuthenticator : BaseAuthenticator, IOutlookAuthenticator ListOperatingSystemAccounts = true, }; + var outlookAppBuilder = PublicClientApplicationBuilder.Create(AuthenticatorConfig.OutlookAuthenticatorClientId) .WithParentActivityOrWindow(nativeAppService.GetCoreWindowHwnd) .WithBroker(options) diff --git a/Wino.Core.Domain/Interfaces/IFolderMenuItem.cs b/Wino.Core.Domain/Interfaces/IFolderMenuItem.cs index 7deff38d..26413208 100644 --- a/Wino.Core.Domain/Interfaces/IFolderMenuItem.cs +++ b/Wino.Core.Domain/Interfaces/IFolderMenuItem.cs @@ -1,4 +1,5 @@ using System.Collections.Generic; +using System.Collections.ObjectModel; using Wino.Core.Domain.Entities.Shared; using Wino.Core.Domain.Enums; using Wino.Core.Domain.Models.Folders; @@ -20,7 +21,7 @@ public interface IBaseFolderMenuItem : IMenuItem int UnreadItemCount { get; set; } SpecialFolderType SpecialFolderType { get; } IEnumerable HandlingFolders { get; } - IEnumerable SubMenuItems { get; } + ObservableCollection SubMenuItems { get; } bool IsMoveTarget { get; } bool IsSticky { get; } bool IsSystemFolder { get; } diff --git a/Wino.Core.Domain/Interfaces/ISynchronizationManager.cs b/Wino.Core.Domain/Interfaces/ISynchronizationManager.cs index c1ee65c6..0bcdb657 100644 --- a/Wino.Core.Domain/Interfaces/ISynchronizationManager.cs +++ b/Wino.Core.Domain/Interfaces/ISynchronizationManager.cs @@ -45,6 +45,11 @@ public interface ISynchronizationManager /// Task QueueRequestAsync(IRequestBase request, Guid accountId); + /// + /// Queues a mail action request to the corresponding account's synchronizer with optional synchronization triggering. + /// + Task QueueRequestAsync(IRequestBase request, Guid accountId, bool triggerSynchronization); + /// /// Handles folder synchronization for the given account. /// diff --git a/Wino.Core.Domain/MenuItems/FolderMenuItem.cs b/Wino.Core.Domain/MenuItems/FolderMenuItem.cs index c5cbbf5d..d3f0fbc4 100644 --- a/Wino.Core.Domain/MenuItems/FolderMenuItem.cs +++ b/Wino.Core.Domain/MenuItems/FolderMenuItem.cs @@ -1,4 +1,5 @@ using System.Collections.Generic; +using System.Collections.ObjectModel; using System.Linq; using CommunityToolkit.Mvvm.ComponentModel; using Wino.Core.Domain.Entities.Shared; @@ -20,6 +21,8 @@ public partial class FolderMenuItem : MenuItemBase Parameter.IsSticky; public bool IsSystemFolder => Parameter.IsSystemFolder; + + /// /// Display name of the folder. More and Category folders have localized display names. /// @@ -53,7 +56,7 @@ public partial class FolderMenuItem : MenuItemBase Parameter.ShowUnreadCount; - IEnumerable IBaseFolderMenuItem.SubMenuItems => SubMenuItems; + public new ObservableCollection SubMenuItems { get; set; } = new ObservableCollection(); public FolderMenuItem(IMailItemFolder folderStructure, MailAccount parentAccount, IMenuItem parentMenuItem) : base(folderStructure, folderStructure.Id, parentMenuItem) { diff --git a/Wino.Core.WinUI/Services/DialogServiceBase.cs b/Wino.Core.WinUI/Services/DialogServiceBase.cs index 9e917f72..8d90f1f4 100644 --- a/Wino.Core.WinUI/Services/DialogServiceBase.cs +++ b/Wino.Core.WinUI/Services/DialogServiceBase.cs @@ -37,6 +37,11 @@ public class DialogServiceBase : IDialogServiceBase ApplicationResourceManager = applicationResourceManager; } + protected XamlRoot GetXamlRoot() + { + return WinoApplication.MainWindow?.Content?.XamlRoot; + } + public async Task PickFilePathAsync(string saveFileName) { var picker = new FolderPicker() @@ -122,7 +127,8 @@ public class DialogServiceBase : IDialogServiceBase { return new AccountCreationDialog { - RequestedTheme = ThemeService.RootTheme.ToWindowsElementTheme() + RequestedTheme = ThemeService.RootTheme.ToWindowsElementTheme(), + XamlRoot = GetXamlRoot() }; } @@ -195,6 +201,8 @@ public class DialogServiceBase : IDialogServiceBase try { + dialog.XamlRoot = GetXamlRoot(); + return await dialog.ShowAsync(); } catch (Exception ex) diff --git a/Wino.Core.WinUI/Services/NativeAppService.cs b/Wino.Core.WinUI/Services/NativeAppService.cs index b05ca9a3..59e7606d 100644 --- a/Wino.Core.WinUI/Services/NativeAppService.cs +++ b/Wino.Core.WinUI/Services/NativeAppService.cs @@ -1,10 +1,8 @@ using System; using System.Threading.Tasks; using Windows.ApplicationModel; -using Windows.Foundation.Metadata; using Windows.Storage; using Windows.System; -using Windows.UI.Shell; using Wino.Core.Domain.Interfaces; @@ -88,20 +86,21 @@ public class NativeAppService : INativeAppService return string.Format("{0}.{1}.{2}.{3}", version.Major, version.Minor, version.Build, version.Revision); } + [Obsolete("Not supported for Win SDK")] public async Task PinAppToTaskbarAsync() { // If Start screen manager API's aren't present - if (!ApiInformation.IsTypePresent("Windows.UI.Shell.TaskbarManager")) return; + //if (!ApiInformation.IsTypePresent("Windows.UI.Shell.TaskbarManager")) return; - // Get the taskbar manager - var taskbarManager = TaskbarManager.GetDefault(); + //// Get the taskbar manager + //var taskbarManager = TaskbarManager.GetDefault(); - // If Taskbar doesn't allow pinning, don't show the tip - if (!taskbarManager.IsPinningAllowed) return; + //// If Taskbar doesn't allow pinning, don't show the tip + //if (!taskbarManager.IsPinningAllowed) return; - // If already pinned, don't show the tip - if (await taskbarManager.IsCurrentAppPinnedAsync()) return; + //// If already pinned, don't show the tip + //if (await taskbarManager.IsCurrentAppPinnedAsync()) return; - await taskbarManager.RequestPinCurrentAppAsync(); + //await taskbarManager.RequestPinCurrentAppAsync(); } } diff --git a/Wino.Core.WinUI/Services/NewThemeService.cs b/Wino.Core.WinUI/Services/NewThemeService.cs index 340a61f3..b019b1db 100644 --- a/Wino.Core.WinUI/Services/NewThemeService.cs +++ b/Wino.Core.WinUI/Services/NewThemeService.cs @@ -198,8 +198,10 @@ public class NewThemeService : INewThemeService await ApplyCustomThemeAsync(true); // Registering to color changes, thus we notice when user changes theme system wide - uiSettings.ColorValuesChanged -= UISettingsColorChanged; - uiSettings.ColorValuesChanged += UISettingsColorChanged; + + // TODO: WinUI: This event seems to be very unreliable. It causes a crash when the function runs under. + //uiSettings.ColorValuesChanged -= UISettingsColorChanged; + //uiSettings.ColorValuesChanged += UISettingsColorChanged; isInitialized = true; } diff --git a/Wino.Core.WinUI/Services/PreferencesService.cs b/Wino.Core.WinUI/Services/PreferencesService.cs index 215daacc..14557fa6 100644 --- a/Wino.Core.WinUI/Services/PreferencesService.cs +++ b/Wino.Core.WinUI/Services/PreferencesService.cs @@ -227,7 +227,7 @@ public class PreferencesService(IConfigurationService configurationService) : Ob public bool IsNavigationPaneOpened { get => _configurationService.Get(nameof(IsNavigationPaneOpened), true); - set => SaveProperty(propertyName: nameof(IsNavigationPaneOpened), value); + set => SetPropertyAndSave(propertyName: nameof(IsNavigationPaneOpened), value); } public bool AutoSelectNextItem diff --git a/Wino.Core/Services/SynchronizationManager.cs b/Wino.Core/Services/SynchronizationManager.cs index 2f8f453e..3c50c939 100644 --- a/Wino.Core/Services/SynchronizationManager.cs +++ b/Wino.Core/Services/SynchronizationManager.cs @@ -194,6 +194,17 @@ public class SynchronizationManager : ISynchronizationManager /// Request to queue /// Account ID to queue the request for public async Task QueueRequestAsync(IRequestBase request, Guid accountId) + { + await QueueRequestAsync(request, accountId, triggerSynchronization: true); + } + + /// + /// Queues a mail action request to the corresponding account's synchronizer with optional synchronization triggering. + /// + /// Request to queue + /// Account ID to queue the request for + /// Whether to automatically trigger synchronization after queuing the request + public async Task QueueRequestAsync(IRequestBase request, Guid accountId, bool triggerSynchronization) { EnsureInitialized(); @@ -208,6 +219,32 @@ public class SynchronizationManager : ISynchronizationManager request.GetType().Name, accountId); synchronizer.QueueRequest(request); + + if (triggerSynchronization) + { + // Trigger synchronization to execute the queued request + _logger.Debug("Triggering synchronization to execute queued request for account {AccountId}", accountId); + + var synchronizationOptions = new MailSynchronizationOptions() + { + AccountId = accountId, + Type = MailSynchronizationType.ExecuteRequests + }; + + // Trigger synchronization asynchronously without waiting for completion + // This matches the pattern used in WinoRequestDelegator + _ = Task.Run(async () => + { + try + { + await SynchronizeMailAsync(synchronizationOptions); + } + catch (Exception ex) + { + _logger.Error(ex, "Failed to execute synchronization after queuing request for account {AccountId}", accountId); + } + }); + } } /// diff --git a/Wino.Core/Services/WinoRequestDelegator.cs b/Wino.Core/Services/WinoRequestDelegator.cs index 7686a9c9..cd3c31a7 100644 --- a/Wino.Core/Services/WinoRequestDelegator.cs +++ b/Wino.Core/Services/WinoRequestDelegator.cs @@ -135,7 +135,8 @@ public class WinoRequestDelegator : IWinoRequestDelegator private async Task QueueRequestAsync(IRequestBase request, Guid accountId) { - await SynchronizationManager.Instance.QueueRequestAsync(request, accountId); + // Don't trigger synchronization for individual requests - we'll trigger it once for all requests + await SynchronizationManager.Instance.QueueRequestAsync(request, accountId, triggerSynchronization: false); } private Task QueueSynchronizationAsync(Guid accountId) diff --git a/Wino.Mail.WinUI/App.xaml.cs b/Wino.Mail.WinUI/App.xaml.cs index a2d97c06..bddf800b 100644 --- a/Wino.Mail.WinUI/App.xaml.cs +++ b/Wino.Mail.WinUI/App.xaml.cs @@ -83,18 +83,21 @@ public partial class App : WinoApplication, IRecipient(); - var configService = Services.GetService(); + var newThemeService = Services.GetRequiredService(); + var configService = Services.GetRequiredService(); + var nativeAppService = Services.GetRequiredService(); // Load saved backdrop type before creating window var savedBackdropType = (WindowBackdropType)configService.Get("WindowBackdropTypeKey", (int)WindowBackdropType.Mica); MainWindow = new ShellWindow(); + nativeAppService.GetCoreWindowHwnd = () => WinRT.Interop.WindowNative.GetWindowHandle(MainWindow); + await InitializeServicesAsync(); // Initialize system tray - var systemTrayService = Services.GetService(); + var systemTrayService = Services.GetRequiredService(); if (systemTrayService != null) { systemTrayService.Initialize(); diff --git a/Wino.Mail.WinUI/Services/DialogService.cs b/Wino.Mail.WinUI/Services/DialogService.cs index 5ca49e69..8ad6ac92 100644 --- a/Wino.Mail.WinUI/Services/DialogService.cs +++ b/Wino.Mail.WinUI/Services/DialogService.cs @@ -37,9 +37,11 @@ public class DialogService : DialogServiceBase, IMailDialogService { if (accountCreationDialogResult.ProviderType == MailProviderType.IMAP4) { + return new NewImapSetupDialog { - RequestedTheme = ThemeService.RootTheme.ToWindowsElementTheme() + RequestedTheme = ThemeService.RootTheme.ToWindowsElementTheme(), + XamlRoot = GetXamlRoot() }; } else diff --git a/Wino.Mail.WinUI/ShellWindow.xaml b/Wino.Mail.WinUI/ShellWindow.xaml index 5cdb6a86..858a2253 100644 --- a/Wino.Mail.WinUI/ShellWindow.xaml +++ b/Wino.Mail.WinUI/ShellWindow.xaml @@ -21,6 +21,7 @@ - + Date: Sun, 12 Oct 2025 16:23:33 +0200 Subject: [PATCH 018/312] Outlook sync improvements. --- QUEUE_SYNC_IMPLEMENTATION.md | 151 +++++ .../Entities/Mail/MailItemFolder.cs | 6 + .../Enums/SynchronizationSource.cs | 11 - .../Services/StartupBehaviorService.cs | 2 +- Wino.Core/CoreContainerSetup.cs | 1 + .../Processors/DefaultChangeProcessor.cs | 8 + .../Processors/OutlookChangeProcessor.cs | 3 + ...OutlookSynchronizerErrorHandlingFactory.cs | 4 +- Wino.Core/Services/WinoRequestDelegator.cs | 2 +- .../Outlook/DeltaTokenExpiredHandler.cs | 71 +++ Wino.Core/Synchronizers/ImapSynchronizer.cs | 2 +- .../Synchronizers/OutlookSynchronizer.cs | 594 ++++++++++++++++-- Wino.Core/Synchronizers/WinoSynchronizer.cs | 30 + Wino.Mail.ViewModels/AppShellViewModel.cs | 5 +- Wino.Mail.ViewModels/MailListPageViewModel.cs | 2 +- Wino.Mail.WinUI/App.xaml.cs | 9 +- Wino.Mail.WinUI/Package.appxmanifest | 10 +- Wino.Mail.WinUI/Services/DialogService.cs | 2 +- Wino.Mail.WinUI/Views/MailListPage.xaml.cs | 12 +- .../Server/NewSynchronizationRequested.cs | 7 +- Wino.Services/MailService.cs | 24 +- Wino.Services/Wino.Services.csproj | 8 +- 22 files changed, 853 insertions(+), 111 deletions(-) create mode 100644 QUEUE_SYNC_IMPLEMENTATION.md delete mode 100644 Wino.Core.Domain/Enums/SynchronizationSource.cs create mode 100644 Wino.Core/Synchronizers/Errors/Outlook/DeltaTokenExpiredHandler.cs diff --git a/QUEUE_SYNC_IMPLEMENTATION.md b/QUEUE_SYNC_IMPLEMENTATION.md new file mode 100644 index 00000000..d7ab850b --- /dev/null +++ b/QUEUE_SYNC_IMPLEMENTATION.md @@ -0,0 +1,151 @@ +# Mail Synchronization Queue-Based Implementation + +This document summarizes the changes made to implement the new queue-based mail synchronization system for Wino Mail. + +## Overview + +The new system changes the mail synchronization approach from downloading everything immediately during initial sync to queuing mail IDs first and then downloading mail content progressively. This makes initial synchronization much more efficient and responsive. + +## Changes Made + +### 1. New Database Entity: MailItemQueue + +**File:** `Wino.Core.Domain/Entities/Mail/MailItemQueue.cs` + +Created a new table to store mail IDs that need to be downloaded from the server: +- `Id`: Primary key (auto-increment) +- `AccountId`: Account that owns the mail +- `FolderId`: Local folder ID +- `RemoteFolderId`: Server-specific folder ID +- `MailCopyId`: Mail ID from the remote server +- `QueuedDate`: When the item was queued +- `Priority`: Priority for processing (lower number = higher priority) + +### 2. Enhanced MailItemFolder Entity + +**File:** `Wino.Core.Domain/Entities/Mail/MailItemFolder.cs` + +Added new property: +- `IsInitialSyncCompleted`: Boolean flag to track whether initial mail ID synchronization is complete for the folder + +### 3. New Queue Management Service + +**Files:** +- `Wino.Core.Domain/Interfaces/IMailItemQueueService.cs` +- `Wino.Services/MailItemQueueService.cs` + +Created a comprehensive service for managing the mail queue with methods to: +- Queue mail items for download +- Get next batch of items to process +- Remove processed items from queue +- Check queue counts and existence +- Clear queue for folders/accounts + +### 4. Updated Database Service + +**File:** `Wino.Services/DatabaseService.cs` + +Added `MailItemQueue` to the database table creation list. + +### 5. Enhanced Base Synchronizer + +**File:** `Wino.Core/Synchronizers/WinoSynchronizer.cs` + +Added new virtual methods that synchronizers can override to support queue-based sync: +- `QueueMailIdsForInitialSyncAsync()`: Queue all mail IDs for initial sync +- `DownloadMailsFromQueueAsync()`: Download mails from queue in batches +- `CreateMinimalMailCopyAsync()`: Create MailCopy with minimal properties (no MIME download) + +### 6. OutlookSynchronizer Implementation + +**File:** `Wino.Core/Synchronizers/OutlookSynchronizer.cs` + +Major changes to implement the new synchronization logic: + +#### Constructor Changes +- Added `IMailItemQueueService` dependency injection + +#### New Synchronization Algorithm +The `SynchronizeFolderAsync` method now implements the new algorithm: + +1. **Check Initial Sync Status**: If `IsInitialSyncCompleted` is false: + - Clear existing queue items for the folder + - Queue all mail IDs using `QueueMailIdsForInitialSyncAsync()` + - Mark initial sync as completed + +2. **Process Queue**: Download mails from queue in batches (50 at a time): + - Get queued items for the folder + - Download each mail with minimal properties (no MIME) + - Create MailCopy objects with essential fields only + - Remove processed items from queue + +3. **Process Delta Changes**: Handle incremental changes using existing delta sync logic + +#### New Methods Implemented +- `QueueMailIdsForInitialSyncAsync()`: Uses PageIterator to efficiently get all message IDs +- `CreateMinimalMailCopyAsync()`: Creates MailCopy without downloading MIME content +- `GetMessageByIdAsync()`: Downloads individual messages with selected properties only +- `ProcessDeltaChangesAsync()`: Handles incremental sync with delta tokens + +### 7. Enhanced Change Processor Interface + +**File:** `Wino.Core/Integration/Processors/DefaultChangeProcessor.cs` + +Added new method to `IOutlookChangeProcessor`: +- `UpdateFolderInitialSyncCompletedAsync()`: Updates the initial sync completion status + +**File:** `Wino.Core/Integration/Processors/OutlookChangeProcessor.cs` + +Implemented the new method to update the `IsInitialSyncCompleted` field in the database. + +### 8. Dependency Injection Updates + +**Files:** +- `Wino.Core/Services/SynchronizerFactory.cs`: Added `IMailItemQueueService` dependency and updated OutlookSynchronizer creation +- `Wino.Services/ServicesContainerSetup.cs`: Registered `IMailItemQueueService` as transient service + +## Key Benefits + +1. **Faster Initial Sync**: Only mail IDs are downloaded initially, making the sync much faster +2. **Progressive Loading**: Mail content is downloaded progressively based on queue +3. **Better User Experience**: Users see folder structure and mail list faster +4. **Efficient Resource Usage**: Avoids downloading full MIME messages during initial sync +5. **Prioritization Support**: Queue system supports priority-based processing +6. **Resilient**: Can handle sync interruptions and resume from where it left off + +## Implementation Details + +### Queue-Based Processing +- Initial sync: Download only message IDs and queue them +- Progressive download: Process queue items in batches +- Minimal properties: Download only essential mail properties (Subject, Preview, etc.) +- No MIME download: Full MIME messages are not downloaded during initial sync + +### Delta Sync Integration +- Existing delta sync logic is preserved for incremental changes +- Delta tokens are properly managed and updated +- Expired tokens trigger queue reset and re-sync + +### Error Handling +- Robust error handling for individual mail downloads +- Failed items don't block the entire batch +- Proper logging for debugging and monitoring + +## Future Enhancements + +The architecture is designed to be easily extended to other synchronizers: +- Gmail and IMAP synchronizers can adopt the same pattern +- Common functionality is in the base `WinoSynchronizer` class +- Queue service is provider-agnostic + +## Testing Recommendations + +1. Test initial synchronization with large mailboxes +2. Verify progressive loading of mail content +3. Test interruption and resume scenarios +4. Validate delta sync functionality +5. Test with multiple accounts and folders +6. Verify queue management operations +7. Test error scenarios and recovery + +This implementation significantly improves the initial synchronization experience while maintaining all existing functionality for incremental syncing. \ No newline at end of file diff --git a/Wino.Core.Domain/Entities/Mail/MailItemFolder.cs b/Wino.Core.Domain/Entities/Mail/MailItemFolder.cs index bb1a2cae..47aa7968 100644 --- a/Wino.Core.Domain/Entities/Mail/MailItemFolder.cs +++ b/Wino.Core.Domain/Entities/Mail/MailItemFolder.cs @@ -36,6 +36,12 @@ public class MailItemFolder : IMailItemFolder /// public string DeltaToken { get; set; } + /// + /// Whether initial synchronization of mail ids is completed for this folder. + /// Used to determine if we should queue all mail ids first or start downloading from queue. + /// + public bool IsInitialSyncCompleted { get; set; } + // For GMail Labels public string TextColorHex { get; set; } public string BackgroundColorHex { get; set; } diff --git a/Wino.Core.Domain/Enums/SynchronizationSource.cs b/Wino.Core.Domain/Enums/SynchronizationSource.cs deleted file mode 100644 index d7b3e2d3..00000000 --- a/Wino.Core.Domain/Enums/SynchronizationSource.cs +++ /dev/null @@ -1,11 +0,0 @@ -namespace Wino.Core.Domain.Enums; - -/// -/// Enumeration for the source of synchronization. -/// Right now it can either be from the client or the server. -/// -public enum SynchronizationSource -{ - Client, - Server -} diff --git a/Wino.Core.WinUI/Services/StartupBehaviorService.cs b/Wino.Core.WinUI/Services/StartupBehaviorService.cs index 144e320a..f989034b 100644 --- a/Wino.Core.WinUI/Services/StartupBehaviorService.cs +++ b/Wino.Core.WinUI/Services/StartupBehaviorService.cs @@ -10,7 +10,7 @@ namespace Wino.Core.WinUI.Services; public class StartupBehaviorService : IStartupBehaviorService { - private const string WinoServerTaskId = "WinoServer"; + private const string WinoServerTaskId = "WinoStartupId"; public async Task ToggleStartupBehavior(bool isEnabled) { diff --git a/Wino.Core/CoreContainerSetup.cs b/Wino.Core/CoreContainerSetup.cs index 2645d3de..3189706d 100644 --- a/Wino.Core/CoreContainerSetup.cs +++ b/Wino.Core/CoreContainerSetup.cs @@ -40,6 +40,7 @@ public static class CoreContainerSetup // Register error factory handlers services.AddTransient(); + services.AddTransient(); services.AddTransient(); services.AddTransient(); diff --git a/Wino.Core/Integration/Processors/DefaultChangeProcessor.cs b/Wino.Core/Integration/Processors/DefaultChangeProcessor.cs index a7a98ea3..14247be8 100644 --- a/Wino.Core/Integration/Processors/DefaultChangeProcessor.cs +++ b/Wino.Core/Integration/Processors/DefaultChangeProcessor.cs @@ -87,6 +87,14 @@ public interface IOutlookChangeProcessor : IDefaultChangeProcessor /// New identifier if success. Task UpdateFolderDeltaSynchronizationIdentifierAsync(Guid folderId, string deltaSynchronizationIdentifier); + /// + /// Updates the initial synchronization completion status for a folder. + /// Used to track whether mail ids have been queued for initial sync. + /// + /// Folder id + /// Whether initial sync is completed + Task UpdateFolderInitialSyncCompletedAsync(Guid folderId, bool isCompleted); + /// /// Outlook may expire folder's delta token after a while. /// Recommended action for this scenario is to reset token and do full sync. diff --git a/Wino.Core/Integration/Processors/OutlookChangeProcessor.cs b/Wino.Core/Integration/Processors/OutlookChangeProcessor.cs index 3b72c33e..7a434232 100644 --- a/Wino.Core/Integration/Processors/OutlookChangeProcessor.cs +++ b/Wino.Core/Integration/Processors/OutlookChangeProcessor.cs @@ -38,6 +38,9 @@ public class OutlookChangeProcessor(IDatabaseService databaseService, public Task UpdateFolderDeltaSynchronizationIdentifierAsync(Guid folderId, string synchronizationIdentifier) => Connection.ExecuteAsync("UPDATE MailItemFolder SET DeltaToken = ? WHERE Id = ?", synchronizationIdentifier, folderId); + public Task UpdateFolderInitialSyncCompletedAsync(Guid folderId, bool isCompleted) + => Connection.ExecuteAsync("UPDATE MailItemFolder SET IsInitialSyncCompleted = ? WHERE Id = ?", isCompleted, folderId); + public async Task ManageCalendarEventAsync(Event calendarEvent, AccountCalendar assignedCalendar, MailAccount organizerAccount) { // We parse the occurrences based on the parent event. diff --git a/Wino.Core/Services/OutlookSynchronizerErrorHandlingFactory.cs b/Wino.Core/Services/OutlookSynchronizerErrorHandlingFactory.cs index 4947060f..437a331b 100644 --- a/Wino.Core/Services/OutlookSynchronizerErrorHandlingFactory.cs +++ b/Wino.Core/Services/OutlookSynchronizerErrorHandlingFactory.cs @@ -7,9 +7,11 @@ namespace Wino.Core.Services; public class OutlookSynchronizerErrorHandlingFactory : SynchronizerErrorHandlingFactory, IOutlookSynchronizerErrorHandlerFactory { - public OutlookSynchronizerErrorHandlingFactory(ObjectCannotBeDeletedHandler objectCannotBeDeleted) + public OutlookSynchronizerErrorHandlingFactory(ObjectCannotBeDeletedHandler objectCannotBeDeleted, + DeltaTokenExpiredHandler deltaTokenExpiredHandler) { RegisterHandler(objectCannotBeDeleted); + RegisterHandler(deltaTokenExpiredHandler); } public bool CanHandle(SynchronizerErrorContext error) => CanHandle(error); diff --git a/Wino.Core/Services/WinoRequestDelegator.cs b/Wino.Core/Services/WinoRequestDelegator.cs index cd3c31a7..c58bf34d 100644 --- a/Wino.Core/Services/WinoRequestDelegator.cs +++ b/Wino.Core/Services/WinoRequestDelegator.cs @@ -147,7 +147,7 @@ public class WinoRequestDelegator : IWinoRequestDelegator Type = MailSynchronizationType.ExecuteRequests }; - WeakReferenceMessenger.Default.Send(new NewMailSynchronizationRequested(options, SynchronizationSource.Client)); + WeakReferenceMessenger.Default.Send(new NewMailSynchronizationRequested(options)); return Task.CompletedTask; } } diff --git a/Wino.Core/Synchronizers/Errors/Outlook/DeltaTokenExpiredHandler.cs b/Wino.Core/Synchronizers/Errors/Outlook/DeltaTokenExpiredHandler.cs new file mode 100644 index 00000000..4f219740 --- /dev/null +++ b/Wino.Core/Synchronizers/Errors/Outlook/DeltaTokenExpiredHandler.cs @@ -0,0 +1,71 @@ +using System.Threading.Tasks; +using Microsoft.Graph.Models.ODataErrors; +using Microsoft.Kiota.Abstractions; +using Serilog; +using Wino.Core.Domain.Interfaces; +using Wino.Core.Domain.Models.Errors; +using Wino.Core.Integration.Processors; + +namespace Wino.Core.Synchronizers.Errors.Outlook; + +/// +/// Handles 410 Gone errors for Outlook synchronization, which indicates that delta tokens have expired. +/// When this occurs, all local mail cache should be deleted and initial synchronization should be reset. +/// +public class DeltaTokenExpiredHandler : ISynchronizerErrorHandler +{ + private readonly ILogger _logger = Log.ForContext(); + private readonly IOutlookChangeProcessor _outlookChangeProcessor; + + public DeltaTokenExpiredHandler(IOutlookChangeProcessor outlookChangeProcessor) + { + _outlookChangeProcessor = outlookChangeProcessor; + } + + public bool CanHandle(SynchronizerErrorContext error) + { + // Handle 410 Gone responses which indicate delta token expiration + return error.ErrorCode == 410 || + (error.Exception is ODataError oDataError && oDataError.ResponseStatusCode == 410) || + (error.Exception is ApiException apiException && apiException.ResponseStatusCode == 410); + } + + public async Task HandleAsync(SynchronizerErrorContext error) + { + _logger.Warning("Delta token has expired for account {AccountName} ({AccountId}). Deleting all local mail cache and resetting synchronization.", + error.Account.Name, error.Account.Id); + + try + { + // Delete all local mail cache for the account + await _outlookChangeProcessor.DeleteUserMailCacheAsync(error.Account.Id).ConfigureAwait(false); + + // Reset the account's delta synchronization identifier + await _outlookChangeProcessor.UpdateAccountDeltaSynchronizationIdentifierAsync(error.Account.Id, string.Empty).ConfigureAwait(false); + + // Get all folders for the account and reset their delta tokens and initial sync status + var folders = await _outlookChangeProcessor.GetLocalFoldersAsync(error.Account.Id).ConfigureAwait(false); + + foreach (var folder in folders) + { + // Reset folder delta token + await _outlookChangeProcessor.UpdateFolderDeltaSynchronizationIdentifierAsync(folder.Id, string.Empty).ConfigureAwait(false); + + // Reset initial sync completion status to force full re-sync + await _outlookChangeProcessor.UpdateFolderInitialSyncCompletedAsync(folder.Id, false).ConfigureAwait(false); + } + + _logger.Information("Successfully reset synchronization state for account {AccountName} ({AccountId}). Next sync will be a full re-sync.", + error.Account.Name, error.Account.Id); + + return true; + } + catch (System.Exception ex) + { + _logger.Error(ex, "Failed to handle delta token expiration for account {AccountName} ({AccountId})", + error.Account.Name, error.Account.Id); + + return false; + } + } +} \ No newline at end of file diff --git a/Wino.Core/Synchronizers/ImapSynchronizer.cs b/Wino.Core/Synchronizers/ImapSynchronizer.cs index 58680553..d9c3480b 100644 --- a/Wino.Core/Synchronizers/ImapSynchronizer.cs +++ b/Wino.Core/Synchronizers/ImapSynchronizer.cs @@ -857,7 +857,7 @@ public class ImapSynchronizer : WinoSynchronizer { public override uint BatchModificationSize => 20; - public override uint InitialMessageDownloadCountPerFolder => 250; + public override uint InitialMessageDownloadCountPerFolder => 1000; private const uint MaximumAllowedBatchRequestSize = 20; private const string INBOX_NAME = "inbox"; @@ -87,6 +88,8 @@ public class OutlookSynchronizer : WinoSynchronizer - { - config.QueryParameters.Top = (int)InitialMessageDownloadCountPerFolder; - config.QueryParameters.Select = outlookMessageSelectParameters; - config.QueryParameters.Orderby = ["receivedDateTime desc"]; - }, cancellationToken).ConfigureAwait(false); + // Mark initial sync as completed + await _outlookChangeProcessor.UpdateFolderInitialSyncCompletedAsync(folder.Id, true).ConfigureAwait(false); + folder.IsInitialSyncCompleted = true; } else + { + // Initial sync is completed, process delta changes and download new mails + _logger.Debug("Initial sync completed for folder {FolderName}. Processing delta changes and downloading new mails.", folder.FolderName); + + await ProcessDeltaChangesAndDownloadMailsAsync(folder, downloadedMessageIds, cancellationToken).ConfigureAwait(false); + } + + await _outlookChangeProcessor.UpdateFolderLastSyncDateAsync(folder.Id).ConfigureAwait(false); + + if (downloadedMessageIds.Any()) + { + _logger.Information("Downloaded {Count} messages for folder {FolderName}", downloadedMessageIds.Count, folder.FolderName); + } + + return downloadedMessageIds; + } + + /// + /// Downloads mails for initial synchronization using Delta API and direct download with concurrency control. + /// + private async Task DownloadMailsForInitialSyncAsync(MailItemFolder folder, List downloadedMessageIds, CancellationToken cancellationToken) + { + _logger.Debug("Starting initial mail download for folder {FolderName}", folder.FolderName); + + var mailIds = new List(); + + try + { + // Always use Delta API for initial sync - this ensures proper delta token setup for future incremental syncs + DeltaGetResponse messageCollectionPage = null; + + if (string.IsNullOrEmpty(folder.DeltaToken)) + { + messageCollectionPage = await _graphClient.Me.MailFolders[folder.RemoteFolderId].Messages.Delta.GetAsDeltaGetResponseAsync((config) => + { + config.QueryParameters.Select = ["Id"]; // Only get the message Ids + config.QueryParameters.Orderby = ["receivedDateTime desc"]; // Sort by received date desc + config.QueryParameters.Top = (int)InitialMessageDownloadCountPerFolder; + }, cancellationToken).ConfigureAwait(false); + } + else + { + var requestInformation = _graphClient.Me.MailFolders[folder.RemoteFolderId].Messages.Delta.ToGetRequestInformation((config) => + { + config.QueryParameters.Select = ["Id"]; // Only get the message Ids + config.QueryParameters.Orderby = ["receivedDateTime desc"]; // Sort by received date desc + }); + + requestInformation.UrlTemplate = requestInformation.UrlTemplate.Insert(requestInformation.UrlTemplate.Length - 1, ",%24deltatoken"); + requestInformation.QueryParameters.Add("%24deltatoken", folder.DeltaToken); + + messageCollectionPage = await _graphClient.RequestAdapter.SendAsync(requestInformation, DeltaGetResponse.CreateFromDiscriminatorValue, cancellationToken: cancellationToken); + } + + // Use PageIterator for iterating through the messages + var messageIterator = PageIterator.CreatePageIterator(_graphClient, messageCollectionPage, (message) => + { + if (!IsResourceDeleted(message.AdditionalData)) + { + mailIds.Add(message.Id); + } + + // Iterator must continue all the time to recieve delta token at the end. + return true; + }); + + await messageIterator.IterateAsync(cancellationToken).ConfigureAwait(false); + + // Extract delta token from the iterator's delta link + string deltaToken = null; + if (!string.IsNullOrEmpty(messageIterator.Deltalink)) + { + deltaToken = GetDeltaTokenFromDeltaLink(messageIterator.Deltalink); + } + + // Download mails concurrently with semaphore control + if (mailIds.Any()) + { + _logger.Information("Starting concurrent download of {Count} mails for folder {FolderName}", mailIds.Count, folder.FolderName); + await DownloadMailsConcurrentlyAsync(mailIds, folder, downloadedMessageIds, cancellationToken).ConfigureAwait(false); + } + else + { + _logger.Information("No mail ids found to download for folder {FolderName}", folder.FolderName); + } + + // Store the delta token for future incremental syncs - always store when available + if (!string.IsNullOrEmpty(deltaToken)) + { + await _outlookChangeProcessor.UpdateFolderDeltaSynchronizationIdentifierAsync(folder.Id, deltaToken).ConfigureAwait(false); + await _outlookChangeProcessor.UpdateFolderLastSyncDateAsync(folder.Id).ConfigureAwait(false); + folder.DeltaToken = deltaToken; + _logger.Information("Stored delta token for folder {FolderName} - future syncs will be incremental", folder.FolderName); + } + else + { + _logger.Warning("No delta token received for folder {FolderName} - future syncs may re-download messages", folder.FolderName); + } + } + catch (ApiException apiException) + { + // Try to handle the error using the error handling factory + var errorContext = new SynchronizerErrorContext + { + Account = Account, + ErrorCode = (int?)apiException.ResponseStatusCode, + ErrorMessage = $"API error during initial sync: {apiException.Message}", + Exception = apiException + }; + + var handled = await _errorHandlingFactory.HandleErrorAsync(errorContext).ConfigureAwait(false); + + if (handled) + { + // The error handler has processed the error (e.g., DeltaTokenExpiredHandler for 410) + // Update in-memory folder state if it was a delta token expiration + if (apiException.ResponseStatusCode == 410) + { + folder.DeltaToken = string.Empty; + folder.IsInitialSyncCompleted = false; + _logger.Information("API error handled successfully for folder {FolderName} during initial sync. Error: {ErrorCode}", folder.FolderName, apiException.ResponseStatusCode); + } + } + else + { + // No handler could process this error, log and re-throw + _logger.Error(apiException, "Unhandled API error during initial sync for folder {FolderName}. Error: {ErrorCode}", folder.FolderName, apiException.ResponseStatusCode); + } + + // Re-throw the exception so the synchronization can be retried + throw; + } + catch (Exception ex) + { + _logger.Error(ex, "Error occurred during initial mail download for folder {FolderName}", folder.FolderName); + throw; + } + } + + /// + /// Downloads mails concurrently with semaphore control to limit concurrent downloads to 10. + /// + private async Task DownloadMailsConcurrentlyAsync(List mailIds, MailItemFolder folder, List downloadedMessageIds, CancellationToken cancellationToken) + { + var downloadTasks = mailIds.Select(async mailId => + { + await _concurrentDownloadSemaphore.WaitAsync(cancellationToken).ConfigureAwait(false); + try + { + var downloaded = await DownloadSingleMailAsync(mailId, folder, cancellationToken).ConfigureAwait(false); + if (downloaded != null) + { + lock (downloadedMessageIds) + { + downloadedMessageIds.Add(downloaded); + } + } + } + finally + { + _concurrentDownloadSemaphore.Release(); + } + }); + + await Task.WhenAll(downloadTasks).ConfigureAwait(false); + } + + /// + /// Downloads a single mail by ID and creates it in the database. + /// + private async Task DownloadSingleMailAsync(string mailId, MailItemFolder folder, CancellationToken cancellationToken) + { + try + { + // Check if mail already exists in database before downloading + // to avoid unnecessary API calls and reprocessing existing mails + bool mailExists = await _outlookChangeProcessor.IsMailExistsInFolderAsync(mailId, folder.Id).ConfigureAwait(false); + if (mailExists) + { + _logger.Debug("Mail {MailId} already exists in folder {FolderName}, skipping download", mailId, folder.FolderName); + return null; // Not a new download + } + + // Download the message with minimal properties + var message = await GetMessageByIdAsync(mailId, cancellationToken).ConfigureAwait(false); + + if (message != null) + { + // Create minimal MailCopy without downloading MIME + var mailCopy = await CreateMinimalMailCopyAsync(message, folder, cancellationToken).ConfigureAwait(false); + + if (mailCopy != null) + { + // Create a minimal package without MIME for direct sync + var package = new NewMailItemPackage(mailCopy, null, folder.RemoteFolderId); + bool isInserted = await _outlookChangeProcessor.CreateMailAsync(Account.Id, package).ConfigureAwait(false); + + if (isInserted) + { + return mailCopy.Id; // Successfully created + } + else + { + _logger.Warning("Failed to insert mail {MailId} for folder {FolderName}", mailId, folder.FolderName); + } + } + else + { + _logger.Debug("Could not create MailCopy for {MailId} in folder {FolderName} (might be unsupported message type)", mailId, folder.FolderName); + } + } + else + { + _logger.Debug("Message {MailId} is null for folder {FolderName} (filtered out)", mailId, folder.FolderName); + } + } + catch (ServiceException serviceException) + { + // Try to handle the error using the error handling factory first + var errorContext = new SynchronizerErrorContext + { + Account = Account, + ErrorCode = (int?)serviceException.ResponseStatusCode, + ErrorMessage = $"Service error during mail download: {serviceException.Message}", + Exception = serviceException + }; + + var handled = await _errorHandlingFactory.HandleErrorAsync(errorContext).ConfigureAwait(false); + + if (!handled) + { + // No handler could process this error, log appropriately + if (serviceException.ResponseStatusCode == 404) + { + _logger.Warning("Mail {MailId} not found on server (404) for folder {FolderName}", mailId, folder.FolderName); + } + else + { + _logger.Error(serviceException, "Unhandled service error while downloading mail {MailId} for folder {FolderName}. Error: {ErrorCode}", mailId, folder.FolderName, serviceException.ResponseStatusCode); + } + } + else + { + _logger.Information("Service error handled successfully during mail download. Mail: {MailId}, Folder: {FolderName}, Error: {ErrorCode}", mailId, folder.FolderName, serviceException.ResponseStatusCode); + } + } + catch (Exception ex) + { + _logger.Error(ex, "Error occurred while downloading mail {MailId} for folder {FolderName}", mailId, folder.FolderName); + } + + return null; + } + + private string GetDeltaTokenFromDeltaLink(string deltaLink) + => Regex.Split(deltaLink, "deltatoken=")[1]; + + protected override async Task QueueMailIdsForInitialSyncAsync(MailItemFolder folder, CancellationToken cancellationToken = default) + { + // This method is now replaced by direct downloading logic + // Instead of queuing mail IDs, we now directly download them with concurrency control + var downloadedMessageIds = new List(); + await DownloadMailsForInitialSyncAsync(folder, downloadedMessageIds, cancellationToken).ConfigureAwait(false); + } + + protected override Task CreateMinimalMailCopyAsync(Message message, MailItemFolder assignedFolder, CancellationToken cancellationToken = default) + { + if (message == null) return Task.FromResult(null); + + // Create MailCopy with minimal properties - no MIME download + var mailCopy = message.AsMailCopy(); + mailCopy.FolderId = assignedFolder.Id; + mailCopy.UniqueId = Guid.NewGuid(); + mailCopy.FileId = Guid.NewGuid(); + + return Task.FromResult(mailCopy); + } + + private async Task GetMessageByIdAsync(string messageId, CancellationToken cancellationToken = default) + { + try + { + return await _graphClient.Me.Messages[messageId].GetAsync((config) => + { + config.QueryParameters.Select = outlookMessageSelectParameters; + }, cancellationToken).ConfigureAwait(false); + } + catch (ServiceException serviceException) + { + // Try to handle the error using the error handling factory first + var errorContext = new SynchronizerErrorContext + { + Account = Account, + ErrorCode = (int?)serviceException.ResponseStatusCode, + ErrorMessage = $"Service error during message retrieval: {serviceException.Message}", + Exception = serviceException + }; + + var handled = await _errorHandlingFactory.HandleErrorAsync(errorContext).ConfigureAwait(false); + + if (!handled) + { + // No handler could process this error, log and handle appropriately + if (serviceException.ResponseStatusCode == 404) + { + // Re-throw 404 errors to be handled by the caller for queue cleanup + throw; + } + else + { + _logger.Error(serviceException, "Unhandled service error while getting message {MessageId}. Error: {ErrorCode}", messageId, serviceException.ResponseStatusCode); + return null; + } + } + else + { + _logger.Information("Service error handled successfully during message retrieval. Message: {MessageId}, Error: {ErrorCode}", messageId, serviceException.ResponseStatusCode); + return null; // Return null since the error was handled but we couldn't get the message + } + } + catch (Exception ex) + { + _logger.Error(ex, "Failed to get message {MessageId}", messageId); + return null; + } + } + + private async Task ProcessDeltaChangesAndDownloadMailsAsync(MailItemFolder folder, List downloadedMessageIds, CancellationToken cancellationToken = default) + { + // Process delta changes and directly download new mails + if (string.IsNullOrEmpty(folder.DeltaToken)) + { + _logger.Debug("No delta token available for folder {FolderName}. Skipping delta sync.", folder.FolderName); + return; + } + + try { var currentDeltaToken = folder.DeltaToken; + _logger.Debug("Processing delta changes for folder {FolderName} with token {DeltaToken}", folder.FolderName, currentDeltaToken.Substring(0, Math.Min(10, currentDeltaToken.Length)) + "..."); + + // Always use Delta endpoint with proper configuration var requestInformation = _graphClient.Me.MailFolders[folder.RemoteFolderId].Messages.Delta.ToGetRequestInformation((config) => { - config.QueryParameters.Top = (int)InitialMessageDownloadCountPerFolder; - config.QueryParameters.Select = outlookMessageSelectParameters; - config.QueryParameters.Orderby = ["receivedDateTime desc"]; + config.QueryParameters.Select = ["Id"]; // Only get IDs for direct download + config.QueryParameters.Orderby = ["receivedDateTime desc"]; // Sort by received date desc }); requestInformation.UrlTemplate = requestInformation.UrlTemplate.Insert(requestInformation.UrlTemplate.Length - 1, ",%24deltatoken"); requestInformation.QueryParameters.Add("%24deltatoken", currentDeltaToken); - try - { - messageCollectionPage = await _graphClient.RequestAdapter.SendAsync(requestInformation, Microsoft.Graph.Me.MailFolders.Item.Messages.Delta.DeltaGetResponse.CreateFromDiscriminatorValue, cancellationToken: cancellationToken); - } - catch (ApiException apiException) when (apiException.ResponseStatusCode == 410) - { - folder.DeltaToken = string.Empty; + var messageCollectionPage = await _graphClient.RequestAdapter.SendAsync(requestInformation, + DeltaGetResponse.CreateFromDiscriminatorValue, + cancellationToken: cancellationToken); - goto retry; + var newMailIds = new List(); + + // Use PageIterator for iterating through delta changes + var messageIterator = PageIterator + .CreatePageIterator(_graphClient, messageCollectionPage, (message) => + { + // Only process new messages, not deleted ones + if (!IsResourceDeleted(message.AdditionalData)) + { + newMailIds.Add(message.Id); + } + return true; + }); + + await messageIterator.IterateAsync(cancellationToken).ConfigureAwait(false); + + // Download new mails directly with concurrency control + if (newMailIds.Any()) + { + _logger.Information("Starting direct download of {Count} new mails from delta sync for folder {FolderName}", newMailIds.Count, folder.FolderName); + await DownloadMailsConcurrentlyAsync(newMailIds, folder, downloadedMessageIds, cancellationToken).ConfigureAwait(false); + } + + // Update delta token for next sync - always store when there are no nextPageToken remaining + if (!string.IsNullOrEmpty(messageIterator.Deltalink)) + { + var deltaToken = GetDeltaTokenFromDeltaLink(messageIterator.Deltalink); + await _outlookChangeProcessor.UpdateFolderDeltaSynchronizationIdentifierAsync(folder.Id, deltaToken).ConfigureAwait(false); + folder.DeltaToken = deltaToken; // Update in-memory object too + _logger.Debug("Updated delta token for folder {FolderName} after processing delta changes", folder.FolderName); } } - - var messageIteratorAsync = PageIterator.CreatePageIterator(_graphClient, messageCollectionPage, async (item) => + catch (ApiException apiException) { - try + // Try to handle the error using the error handling factory + var errorContext = new SynchronizerErrorContext { - await _handleItemRetrievalSemaphore.WaitAsync(); - return await HandleItemRetrievedAsync(item, folder, downloadedMessageIds, cancellationToken); - } - catch (Exception ex) + Account = Account, + ErrorCode = (int?)apiException.ResponseStatusCode, + ErrorMessage = $"API error during delta sync: {apiException.Message}", + Exception = apiException + }; + + var handled = await _errorHandlingFactory.HandleErrorAsync(errorContext).ConfigureAwait(false); + + if (handled) { - _logger.Error(ex, "Error occurred while handling item {Id} for folder {FolderName}", item.Id, folder.FolderName); + // The error handler has processed the error (e.g., DeltaTokenExpiredHandler for 410) + // Update in-memory folder state if it was a delta token expiration + if (apiException.ResponseStatusCode == 410) + { + folder.DeltaToken = string.Empty; + folder.IsInitialSyncCompleted = false; + _logger.Information("API error handled successfully for folder {FolderName} during delta sync. Error: {ErrorCode}", folder.FolderName, apiException.ResponseStatusCode); + } } - finally + else { - _handleItemRetrievalSemaphore.Release(); + // No handler could process this error, log and re-throw + _logger.Error(apiException, "Unhandled API error during delta sync for folder {FolderName}. Error: {ErrorCode}", folder.FolderName, apiException.ResponseStatusCode); } - - return true; - }); - - await messageIteratorAsync - .IterateAsync(cancellationToken) - .ConfigureAwait(false); - - latestDeltaLink = messageIteratorAsync.Deltalink; - - if (downloadedMessageIds.Any()) - { - _logger.Debug("Downloaded {Count} messages for folder {FolderName}", downloadedMessageIds.Count, folder.FolderName); } - - //Store delta link for tracking new changes. - if (!string.IsNullOrEmpty(latestDeltaLink)) + catch (Exception ex) { - // Parse Delta Token from Delta Link since v5 of Graph SDK works based on the token, not the link. - - var deltaToken = GetDeltaTokenFromDeltaLink(latestDeltaLink); - - await _outlookChangeProcessor.UpdateFolderDeltaSynchronizationIdentifierAsync(folder.Id, deltaToken).ConfigureAwait(false); + _logger.Error(ex, "Error processing delta changes for folder {FolderName}", folder.FolderName); } - - await _outlookChangeProcessor.UpdateFolderLastSyncDateAsync(folder.Id).ConfigureAwait(false); - - return downloadedMessageIds; } - private string GetDeltaTokenFromDeltaLink(string deltaLink) - => Regex.Split(deltaLink, "deltatoken=")[1]; + private async Task ProcessDeltaChangesAsync(MailItemFolder folder, List downloadedMessageIds, CancellationToken cancellationToken = default) + { + // Only process delta changes if we have a delta token (not initial sync) + if (string.IsNullOrEmpty(folder.DeltaToken)) + return; + + try + { + var currentDeltaToken = folder.DeltaToken; + + // Always use Delta endpoint with proper configuration + var requestInformation = _graphClient.Me.MailFolders[folder.RemoteFolderId].Messages.Delta.ToGetRequestInformation((config) => + { + config.QueryParameters.Select = outlookMessageSelectParameters; + config.QueryParameters.Orderby = ["receivedDateTime desc"]; // Sort by received date desc + }); + + requestInformation.UrlTemplate = requestInformation.UrlTemplate.Insert(requestInformation.UrlTemplate.Length - 1, ",%24deltatoken"); + requestInformation.QueryParameters.Add("%24deltatoken", currentDeltaToken); + + var messageCollectionPage = await _graphClient.RequestAdapter.SendAsync(requestInformation, + DeltaGetResponse.CreateFromDiscriminatorValue, + cancellationToken: cancellationToken); + + // Use PageIterator for iterating mails + var messageIterator = PageIterator + .CreatePageIterator(_graphClient, messageCollectionPage, async (item) => + { + try + { + await _handleItemRetrievalSemaphore.WaitAsync(); + return await HandleItemRetrievedAsync(item, folder, downloadedMessageIds, cancellationToken); + } + catch (Exception ex) + { + _logger.Error(ex, "Error occurred while handling delta item {Id} for folder {FolderName}", item.Id, folder.FolderName); + } + finally + { + _handleItemRetrievalSemaphore.Release(); + } + + return true; + }); + + await messageIterator.IterateAsync(cancellationToken).ConfigureAwait(false); + + // Update delta token for next sync - store delta token when there are no nextPageToken remaining + if (!string.IsNullOrEmpty(messageIterator.Deltalink)) + { + var deltaToken = GetDeltaTokenFromDeltaLink(messageIterator.Deltalink); + await _outlookChangeProcessor.UpdateFolderDeltaSynchronizationIdentifierAsync(folder.Id, deltaToken).ConfigureAwait(false); + _logger.Debug("Updated delta token for folder {FolderName} after processing delta changes", folder.FolderName); + } + } + catch (ApiException apiException) + { + // Try to handle the error using the error handling factory + var errorContext = new SynchronizerErrorContext + { + Account = Account, + ErrorCode = (int?)apiException.ResponseStatusCode, + ErrorMessage = $"API error during legacy delta sync: {apiException.Message}", + Exception = apiException + }; + + var handled = await _errorHandlingFactory.HandleErrorAsync(errorContext).ConfigureAwait(false); + + if (!handled) + { + // No handler could process this error, log and re-throw + _logger.Error(apiException, "Unhandled API error during legacy delta sync for folder {FolderName}. Error: {ErrorCode}", folder.FolderName, apiException.ResponseStatusCode); + } + } + } private bool IsResourceDeleted(IDictionary additionalData) => additionalData != null && additionalData.ContainsKey("@removed"); @@ -551,10 +973,44 @@ public class OutlookSynchronizer : WinoSynchronizer protected virtual Task SynchronizeAliasesAsync() => Task.CompletedTask; + /// + /// Queues all mail ids for initial synchronization for a specific folder. + /// Only overridden by synchronizers that support the new queue-based sync. + /// + /// Folder to queue mail ids for + /// Cancellation token + /// Task + protected virtual Task QueueMailIdsForInitialSyncAsync(MailItemFolder folder, CancellationToken cancellationToken = default) => Task.CompletedTask; + + /// + /// Downloads mail items from the queue in batches. + /// Only overridden by synchronizers that support the new queue-based sync. + /// + /// Folder to download mails for + /// Number of items to download in each batch + /// Cancellation token + /// List of downloaded mail ids + protected virtual Task> DownloadMailsFromQueueAsync(MailItemFolder folder, int batchSize, CancellationToken cancellationToken = default) => Task.FromResult(new List()); + + /// + /// Creates a MailCopy object with minimal properties from the native message type. + /// This is used for queue-based sync to avoid downloading full MIME messages. + /// Only overridden by synchronizers that support the new queue-based sync. + /// + /// Native message type + /// Folder this message belongs to + /// Cancellation token + /// MailCopy with minimal properties + protected virtual Task CreateMinimalMailCopyAsync(TMessageType message, MailItemFolder assignedFolder, CancellationToken cancellationToken = default) => Task.FromResult(null); + /// /// Internally synchronizes the account's mails with the given options. /// Not exposed and overriden for each synchronizer. diff --git a/Wino.Mail.ViewModels/AppShellViewModel.cs b/Wino.Mail.ViewModels/AppShellViewModel.cs index 90b1de33..ece0d4b9 100644 --- a/Wino.Mail.ViewModels/AppShellViewModel.cs +++ b/Wino.Mail.ViewModels/AppShellViewModel.cs @@ -5,7 +5,6 @@ using System.Linq; using System.Threading; using System.Threading.Tasks; using CommunityToolkit.Mvvm.ComponentModel; -using CommunityToolkit.Mvvm.Input; using CommunityToolkit.Mvvm.Messaging; using MoreLinq; using MoreLinq.Extensions; @@ -283,7 +282,7 @@ public partial class AppShellViewModel : MailBaseViewModel, Type = MailSynchronizationType.FullFolders }; - Messenger.Send(new NewMailSynchronizationRequested(options, SynchronizationSource.Client)); + Messenger.Send(new NewMailSynchronizationRequested(options)); } } @@ -867,7 +866,7 @@ public partial class AppShellViewModel : MailBaseViewModel, Type = MailSynchronizationType.FullFolders, }; - Messenger.Send(new NewMailSynchronizationRequested(options, SynchronizationSource.Client)); + Messenger.Send(new NewMailSynchronizationRequested(options)); try { diff --git a/Wino.Mail.ViewModels/MailListPageViewModel.cs b/Wino.Mail.ViewModels/MailListPageViewModel.cs index 58c573a7..fd2a5627 100644 --- a/Wino.Mail.ViewModels/MailListPageViewModel.cs +++ b/Wino.Mail.ViewModels/MailListPageViewModel.cs @@ -504,7 +504,7 @@ public partial class MailListPageViewModel : MailBaseViewModel, GroupedSynchronizationTrackingId = trackingSynchronizationId }; - Messenger.Send(new NewMailSynchronizationRequested(options, SynchronizationSource.Client)); + Messenger.Send(new NewMailSynchronizationRequested(options)); } } diff --git a/Wino.Mail.WinUI/App.xaml.cs b/Wino.Mail.WinUI/App.xaml.cs index bddf800b..1606a57e 100644 --- a/Wino.Mail.WinUI/App.xaml.cs +++ b/Wino.Mail.WinUI/App.xaml.cs @@ -15,6 +15,8 @@ namespace Wino.Mail.WinUI; public partial class App : WinoApplication, IRecipient { + private ISynchronizationManager _synchronizationManager; + public App() { InitializeComponent(); @@ -77,7 +79,6 @@ public partial class App : WinoApplication, IRecipient(); var nativeAppService = Services.GetRequiredService(); + _synchronizationManager = Services.GetRequiredService(); + // Load saved backdrop type before creating window var savedBackdropType = (WindowBackdropType)configService.Get("WindowBackdropTypeKey", (int)WindowBackdropType.Mica); @@ -111,8 +114,8 @@ public partial class App : WinoApplication, IRecipient @@ -24,7 +25,7 @@ - Wino Mail (Preview) + Wino Mail Burak KÖSE Assets\StoreLogo.png @@ -53,6 +54,13 @@ + + + + diff --git a/Wino.Mail.WinUI/Services/DialogService.cs b/Wino.Mail.WinUI/Services/DialogService.cs index 8ad6ac92..fb4d43d8 100644 --- a/Wino.Mail.WinUI/Services/DialogService.cs +++ b/Wino.Mail.WinUI/Services/DialogService.cs @@ -99,7 +99,7 @@ public class DialogService : DialogServiceBase, IMailDialogService Type = MailSynchronizationType.FullFolders, }; - WeakReferenceMessenger.Default.Send(new NewMailSynchronizationRequested(options, SynchronizationSource.Client)); + WeakReferenceMessenger.Default.Send(new NewMailSynchronizationRequested(options)); } } catch (Exception ex) diff --git a/Wino.Mail.WinUI/Views/MailListPage.xaml.cs b/Wino.Mail.WinUI/Views/MailListPage.xaml.cs index c6cd821e..233cb411 100644 --- a/Wino.Mail.WinUI/Views/MailListPage.xaml.cs +++ b/Wino.Mail.WinUI/Views/MailListPage.xaml.cs @@ -49,19 +49,29 @@ public sealed partial class MailListPage : MailListPageAbstract, { base.OnNavigatedTo(e); - // Bindings.Update(); + Bindings.Update(); // Delegate to ViewModel. if (e.Parameter is NavigateMailFolderEventArgs folderNavigationArgs) { WeakReferenceMessenger.Default.Send(new ActiveMailFolderChangedEvent(folderNavigationArgs.BaseFolderMenuItem, folderNavigationArgs.FolderInitLoadAwaitTask)); } + + WeakReferenceMessenger.Default.Register(this); + WeakReferenceMessenger.Default.Register(this); + WeakReferenceMessenger.Default.Register(this); + WeakReferenceMessenger.Default.Register(this); } protected override void OnNavigatedFrom(NavigationEventArgs e) { base.OnNavigatedFrom(e); + WeakReferenceMessenger.Default.Unregister(this); + WeakReferenceMessenger.Default.Unregister(this); + WeakReferenceMessenger.Default.Unregister(this); + WeakReferenceMessenger.Default.Unregister(this); + // Dispose all WinoListView items. MailListView.Dispose(); diff --git a/Wino.Messages/Server/NewSynchronizationRequested.cs b/Wino.Messages/Server/NewSynchronizationRequested.cs index 02f6d974..5af99449 100644 --- a/Wino.Messages/Server/NewSynchronizationRequested.cs +++ b/Wino.Messages/Server/NewSynchronizationRequested.cs @@ -1,5 +1,4 @@ -using Wino.Core.Domain.Enums; -using Wino.Core.Domain.Interfaces; +using Wino.Core.Domain.Interfaces; using Wino.Core.Domain.Models.Synchronization; namespace Wino.Messaging.Server; @@ -8,10 +7,10 @@ namespace Wino.Messaging.Server; /// Triggers a new mail synchronization if possible. /// /// Options for synchronization. -public record NewMailSynchronizationRequested(MailSynchronizationOptions Options, SynchronizationSource Source) : IClientMessage, IUIMessage; +public record NewMailSynchronizationRequested(MailSynchronizationOptions Options) : IClientMessage, IUIMessage; /// /// Triggers a new calendar synchronization if possible. /// /// Options for synchronization. -public record NewCalendarSynchronizationRequested(CalendarSynchronizationOptions Options, SynchronizationSource Source) : IClientMessage; +public record NewCalendarSynchronizationRequested(CalendarSynchronizationOptions Options) : IClientMessage; diff --git a/Wino.Services/MailService.cs b/Wino.Services/MailService.cs index c060d23e..bcc9739a 100644 --- a/Wino.Services/MailService.cs +++ b/Wino.Services/MailService.cs @@ -730,21 +730,25 @@ public class MailService : BaseDatabaseService, IMailService // This is because 1 mail may have multiple copies in different folders. // but only single MIME to represent all. - // Save mime file to disk. - var isMimeExists = await _mimeFileService.IsMimeExistAsync(accountId, mailCopy.FileId).ConfigureAwait(false); + // Save mime file to disk if provided. - if (!isMimeExists) + if (mimeMessage != null) { - bool isMimeSaved = await _mimeFileService.SaveMimeMessageAsync(mailCopy.FileId, mimeMessage, accountId).ConfigureAwait(false); + var isMimeExists = await _mimeFileService.IsMimeExistAsync(accountId, mailCopy.FileId).ConfigureAwait(false); - if (!isMimeSaved) + if (!isMimeExists) { - _logger.Warning("Failed to save mime file for {MailCopyId}.", mailCopy.Id); - } - } + bool isMimeSaved = await _mimeFileService.SaveMimeMessageAsync(mailCopy.FileId, mimeMessage, accountId).ConfigureAwait(false); - // Save contact information. - await _contactService.SaveAddressInformationAsync(mimeMessage).ConfigureAwait(false); + if (!isMimeSaved) + { + _logger.Warning("Failed to save mime file for {MailCopyId}.", mailCopy.Id); + } + } + + // Save contact information. + await _contactService.SaveAddressInformationAsync(mimeMessage).ConfigureAwait(false); + } // Create mail copy in the database. // Update if exists. diff --git a/Wino.Services/Wino.Services.csproj b/Wino.Services/Wino.Services.csproj index bfe73869..896b0dbd 100644 --- a/Wino.Services/Wino.Services.csproj +++ b/Wino.Services/Wino.Services.csproj @@ -5,6 +5,11 @@ win-x86;win-x64;win-arm64 true + + + + + @@ -20,7 +25,4 @@ - - - \ No newline at end of file From ad135c5e321c6c4a275ee235679882463741417c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Burak=20Kaan=20K=C3=B6se?= Date: Sat, 18 Oct 2025 11:45:10 +0200 Subject: [PATCH 019/312] Bunch of changes for ItemsView and threads. --- Directory.Packages.props | 54 +++--- .../MailItem/MailListInitializationOptions.cs | 6 +- Wino.Core.Domain/Wino.Core.Domain.csproj | 3 +- Wino.Core.WinUI/Helpers/XamlHelpers.cs | 1 + .../Collections/GroupedEmailCollection.cs | 19 ++ Wino.Mail.ViewModels/ComposePageViewModel.cs | 7 +- .../Data/ThreadMailItemViewModel.cs | 9 +- Wino.Mail.ViewModels/MailListPageViewModel.cs | 55 ++---- .../MailRenderingPageViewModel.cs | 5 +- Wino.Mail.WinUI/AppShell.xaml | 2 - .../Controls/Advanced/WinoItemsView.cs | 32 ++++ .../Controls/WebViewEditorControl.cs | 3 +- Wino.Mail.WinUI/ShellWindow.xaml | 4 +- Wino.Mail.WinUI/Views/MailListPage.xaml | 168 +++++------------- Wino.Mail.WinUI/Views/MailListPage.xaml.cs | 79 ++++---- .../Views/Settings/PersonalizationPage.xaml | 6 +- Wino.Services/MailService.cs | 23 ++- nuget.config | 5 + 18 files changed, 229 insertions(+), 252 deletions(-) diff --git a/Directory.Packages.props b/Directory.Packages.props index 710751ef..388751b7 100644 --- a/Directory.Packages.props +++ b/Directory.Packages.props @@ -15,56 +15,56 @@ - + - + - - - - + + + + - - + + - + - - + + - + - + - - + + - + - - - - + + + + - + - - - + + + - - + + - \ No newline at end of file + diff --git a/Wino.Core.Domain/Models/MailItem/MailListInitializationOptions.cs b/Wino.Core.Domain/Models/MailItem/MailListInitializationOptions.cs index 033ec012..c938941f 100644 --- a/Wino.Core.Domain/Models/MailItem/MailListInitializationOptions.cs +++ b/Wino.Core.Domain/Models/MailItem/MailListInitializationOptions.cs @@ -12,5 +12,7 @@ public record MailListInitializationOptions(IEnumerable Folders bool CreateThreads, bool? IsFocusedOnly, string SearchQuery, - IEnumerable ExistingUniqueIds, - List PreFetchMailCopies = null); + HashSet ExistingUniqueIds = null, + List PreFetchMailCopies = null, + int Skip = 0, + int Take = 0); diff --git a/Wino.Core.Domain/Wino.Core.Domain.csproj b/Wino.Core.Domain/Wino.Core.Domain.csproj index f34bd83b..35882868 100644 --- a/Wino.Core.Domain/Wino.Core.Domain.csproj +++ b/Wino.Core.Domain/Wino.Core.Domain.csproj @@ -1,6 +1,6 @@  - net9.0 + net10.0 win-x86;win-x64;win-arm64 true x86;x64;arm64 @@ -57,7 +57,6 @@ - diff --git a/Wino.Core.WinUI/Helpers/XamlHelpers.cs b/Wino.Core.WinUI/Helpers/XamlHelpers.cs index b2318e7d..3bb6f8d0 100644 --- a/Wino.Core.WinUI/Helpers/XamlHelpers.cs +++ b/Wino.Core.WinUI/Helpers/XamlHelpers.cs @@ -26,6 +26,7 @@ public static class XamlHelpers #region Converters + public static Thickness GetMailItemControlMargin(bool isDisplayedInThread) => isDisplayedInThread ? new Thickness(40, 0, 6, 0) : new Thickness(6, 0, 6, 0); public static bool IsMultiple(int count) => count > 1; public static bool ReverseIsMultiple(int count) => count < 1; public static PopupPlacementMode GetPlaccementModeForCalendarType(CalendarDisplayType type) diff --git a/Wino.Mail.ViewModels/Collections/GroupedEmailCollection.cs b/Wino.Mail.ViewModels/Collections/GroupedEmailCollection.cs index 72b5bb6e..96076530 100644 --- a/Wino.Mail.ViewModels/Collections/GroupedEmailCollection.cs +++ b/Wino.Mail.ViewModels/Collections/GroupedEmailCollection.cs @@ -39,6 +39,7 @@ public partial class GroupedEmailCollection : ObservableObject, IRecipient _groupHeaderIndexCache = []; private readonly Dictionary> _groupItems = []; private readonly Dictionary _threadExpanders = []; + private readonly HashSet _mailCopyIdHashSet = []; private bool _disposed; private bool _isUpdating; @@ -78,6 +79,11 @@ public partial class GroupedEmailCollection : ObservableObject, IRecipient public int TotalUnreadCount => _sourceItems.Count(e => e.MailCopy?.IsRead == false); + /// + /// HashSet containing unique IDs of all mail copies in the collection for pagination tracking + /// + public HashSet MailCopyIdHashSet => _mailCopyIdHashSet; + /// /// Gets all email items across all groups as a flat collection /// @@ -227,6 +233,9 @@ public partial class GroupedEmailCollection : ObservableObject, IRecipient public IReadOnlyList ThreadEmails => _threadEmails.AsReadOnly(); + public MailItemViewModel LatestMailViewModel => _threadEmails.OrderByDescending(e => e.MailCopy?.CreationDate).FirstOrDefault()!; + public ThreadMailItemViewModel(string threadId) { _threadId = threadId; } - partial void OnIsSelectedChanged(bool value) - { - - } - protected virtual void Dispose(bool disposing) { if (_disposed) @@ -86,6 +83,8 @@ public partial class ThreadMailItemViewModel : ObservableRecipient, IDisposable { OnPropertyChanged(nameof(Subject)); OnPropertyChanged(nameof(FromName)); + OnPropertyChanged(nameof(LatestEmailDate)); + OnPropertyChanged(nameof(LatestMailViewModel)); } diff --git a/Wino.Mail.ViewModels/MailListPageViewModel.cs b/Wino.Mail.ViewModels/MailListPageViewModel.cs index c2f8e386..7b2c7cf9 100644 --- a/Wino.Mail.ViewModels/MailListPageViewModel.cs +++ b/Wino.Mail.ViewModels/MailListPageViewModel.cs @@ -60,14 +60,6 @@ public partial class MailListPageViewModel : MailBaseViewModel, private IObservable> selectionChangedObservable = null; public GroupedEmailCollection MailCollection { get; set; } = new GroupedEmailCollection(); - - //public IEnumerable SelectedItems - //{ - // get - // { - - // } - //} public ObservableCollection SelectedItems { get; set; } = []; public ObservableCollection PivotFolders { get; set; } = []; public ObservableCollection ActionItems { get; set; } = []; @@ -246,11 +238,10 @@ public partial class MailListPageViewModel : MailBaseViewModel, { if (SetProperty(ref _selectedSortingOption, value)) { - // TODO: Update sorting in mail collection. - //if (value != null && MailCollection != null) - //{ - // MailCollection.SortingType = value.Type; - //} + if (value != null && MailCollection != null) + { + MailCollection.GroupingType = value.Type == SortingOptionType.ReceiveDate ? EmailGroupingType.ByDate : EmailGroupingType.ByFromName; + } } } } @@ -562,24 +553,24 @@ public partial class MailListPageViewModel : MailBaseViewModel, [RelayCommand] private async Task LoadMoreItemsAsync() { - //if (IsInitializingFolder || IsOnlineSearchEnabled) return; + if (IsInitializingFolder || IsOnlineSearchEnabled) return; - //await ExecuteUIThread(() => { IsInitializingFolder = true; }); + await ExecuteUIThread(() => { IsInitializingFolder = true; }); - //var initializationOptions = new MailListInitializationOptions(ActiveFolder.HandlingFolders, - // SelectedFilterOption.Type, - // SelectedSortingOption.Type, - // PreferencesService.IsThreadingEnabled, - // SelectedFolderPivot.IsFocused, - // IsInSearchMode ? SearchQuery : string.Empty, - // MailCollection.MailCopyIdHashSet); + var initializationOptions = new MailListInitializationOptions(ActiveFolder.HandlingFolders, + SelectedFilterOption.Type, + SelectedSortingOption.Type, + PreferencesService.IsThreadingEnabled, + SelectedFolderPivot.IsFocused, + IsInSearchMode ? SearchQuery : string.Empty, + MailCollection.MailCopyIdHashSet); - //var items = await _mailService.FetchMailsAsync(initializationOptions).ConfigureAwait(false); + var items = await _mailService.FetchMailsAsync(initializationOptions).ConfigureAwait(false); - //var viewModels = PrepareMailViewModels(items); + var viewModels = PrepareMailViewModels(items); - //await ExecuteUIThread(() => { MailCollection.AddRange(viewModels, clearIdCache: false); }); - //await ExecuteUIThread(() => { IsInitializingFolder = false; }); + await ExecuteUIThread(() => { MailCollection.AddEmails(viewModels); }); + await ExecuteUIThread(() => { IsInitializingFolder = false; }); } #endregion @@ -589,7 +580,6 @@ public partial class MailListPageViewModel : MailBaseViewModel, public IEnumerable GetAvailableMailActions(IEnumerable contextMailItems) => _contextMenuItemService.GetMailItemContextMenuActions(contextMailItems.Select(a => a.MailCopy)); - private bool ShouldPreventItemAdd(MailCopy mailItem) { bool condition = mailItem.IsRead @@ -733,13 +723,6 @@ public partial class MailListPageViewModel : MailBaseViewModel, private IEnumerable PrepareMailViewModels(IEnumerable mailItems) { return mailItems.Select(a => new MailItemViewModel(a)); - //foreach (var item in mailItems) - //{ - // if (item is MailCopy singleMailItem) - // yield return new MailItemViewModel(singleMailItem); - // else if (item is ThreadMailItem threadMailItem) - // yield return new ThreadMailItemViewModel(threadMailItem); - //} } [RelayCommand] @@ -784,7 +767,6 @@ public partial class MailListPageViewModel : MailBaseViewModel, // Here items are sorted and filtered. List items = null; - List onlineSearchItems = null; bool isDoingSearch = !string.IsNullOrEmpty(SearchQuery); bool isDoingOnlineSearch = false; @@ -851,8 +833,7 @@ public partial class MailListPageViewModel : MailBaseViewModel, PreferencesService.IsThreadingEnabled, SelectedFolderPivot.IsFocused, SearchQuery, - default, - onlineSearchItems); + MailCollection.MailCopyIdHashSet); items = await _mailService.FetchMailsAsync(initializationOptions, cancellationToken).ConfigureAwait(false); diff --git a/Wino.Mail.ViewModels/MailRenderingPageViewModel.cs b/Wino.Mail.ViewModels/MailRenderingPageViewModel.cs index 2e230a18..f6bfbe12 100644 --- a/Wino.Mail.ViewModels/MailRenderingPageViewModel.cs +++ b/Wino.Mail.ViewModels/MailRenderingPageViewModel.cs @@ -25,7 +25,6 @@ using Wino.Core.Services; using Wino.Mail.ViewModels.Data; using Wino.Mail.ViewModels.Messages; using Wino.Messaging.Client.Mails; -using Wino.Messaging.Server; using Wino.Messaging.UI; using IMailService = Wino.Core.Domain.Interfaces.IMailService; @@ -355,8 +354,8 @@ public partial class MailRenderingPageViewModel : MailBaseViewModel, // Download missing MIME message using SynchronizationManager await SynchronizationManager.Instance.DownloadMimeMessageAsync( - mailItemViewModel.MailCopy, - mailItemViewModel.AssignedAccount.Id); + mailItemViewModel.MailCopy, + mailItemViewModel.MailCopy.AssignedAccount.Id); } catch (OperationCanceledException) { diff --git a/Wino.Mail.WinUI/AppShell.xaml b/Wino.Mail.WinUI/AppShell.xaml index 13f7a210..03c810fb 100644 --- a/Wino.Mail.WinUI/AppShell.xaml +++ b/Wino.Mail.WinUI/AppShell.xaml @@ -3,7 +3,6 @@ xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" xmlns:abstract="using:Wino.Views.Abstract" - xmlns:advanced="using:Wino.Controls.Advanced" xmlns:animatedvisuals="using:Microsoft.UI.Xaml.Controls.AnimatedVisuals" xmlns:animations="using:CommunityToolkit.WinUI.Animations" xmlns:controls="using:Wino.Controls" @@ -356,7 +355,6 @@ diff --git a/Wino.Mail.WinUI/Controls/Advanced/WinoItemsView.cs b/Wino.Mail.WinUI/Controls/Advanced/WinoItemsView.cs index 5b972551..8772925f 100644 --- a/Wino.Mail.WinUI/Controls/Advanced/WinoItemsView.cs +++ b/Wino.Mail.WinUI/Controls/Advanced/WinoItemsView.cs @@ -1,14 +1,46 @@ using System.Collections.Generic; +using System.Windows.Input; +using CommunityToolkit.WinUI; using Microsoft.UI.Xaml.Controls; namespace Wino.Mail.WinUI.Controls.Advanced; public partial class WinoItemsView : ItemsView { + private const string PART_ScrollView = nameof(PART_ScrollView); + + private ScrollView? _internalScrollView; + + [GeneratedDependencyProperty] + public partial ICommand LoadMoreCommand { get; set; } + public IEnumerable? CastedItemsSource => ItemsSource as IEnumerable; public WinoItemsView() { DefaultStyleKey = typeof(ItemsView); } + + protected override void OnApplyTemplate() + { + base.OnApplyTemplate(); + + _internalScrollView = GetTemplateChild("PART_ScrollView") as ScrollView ?? throw new System.Exception("Can't find the ScrollView in WinoItemsView."); + + _internalScrollView.ViewChanged -= InternalScrollViewPositionChanged; + _internalScrollView.ViewChanged += InternalScrollViewPositionChanged; + } + + private void InternalScrollViewPositionChanged(ScrollView sender, object args) + { + if (_internalScrollView == null) return; + + // No need to raise init request if there are no items in the list. + if (ItemsSource == null) return; + + double progress = sender.VerticalOffset / sender.ScrollableHeight; + + // Trigger when scrolled past 90% of total height + if (progress >= 0.9) LoadMoreCommand?.Execute(null); + } } diff --git a/Wino.Mail.WinUI/Controls/WebViewEditorControl.cs b/Wino.Mail.WinUI/Controls/WebViewEditorControl.cs index 89e47fe1..55f91ade 100644 --- a/Wino.Mail.WinUI/Controls/WebViewEditorControl.cs +++ b/Wino.Mail.WinUI/Controls/WebViewEditorControl.cs @@ -12,7 +12,6 @@ using Wino.Core.Domain; using Wino.Core.Domain.Interfaces; using Wino.Core.Domain.Models; using Wino.Core.Domain.Models.Reader; -using Wino.Core.WinUI; using Wino.Core.WinUI.Extensions; using Wino.Mail.WinUI; @@ -140,7 +139,7 @@ public sealed partial class WebViewEditorControl : Control, IDisposable { this.DefaultStyleKey = typeof(WebViewEditorControl); - IsEditorDarkMode = WinoApplication.Current.UnderlyingThemeService.IsUnderlyingThemeDark(); + IsEditorDarkMode = Core.WinUI.WinoApplication.Current.UnderlyingThemeService.IsUnderlyingThemeDark(); } protected override async void OnApplyTemplate() diff --git a/Wino.Mail.WinUI/ShellWindow.xaml b/Wino.Mail.WinUI/ShellWindow.xaml index 858a2253..0eb46c36 100644 --- a/Wino.Mail.WinUI/ShellWindow.xaml +++ b/Wino.Mail.WinUI/ShellWindow.xaml @@ -12,7 +12,7 @@ - + @@ -25,10 +25,10 @@ HorizontalContentAlignment="Stretch" VerticalContentAlignment="Stretch" BackRequested="BackButtonClicked" + Background="Transparent" IsBackButtonVisible="{x:Bind StatePersistanceService.IsBackButtonVisible, Mode=OneWay}" IsPaneToggleButtonVisible="True" PaneToggleRequested="PaneButtonClicked" /> - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + - - + + - @@ -177,42 +107,34 @@ Glyph="" /> - - - - - - - - - - + - + @@ -221,7 +143,10 @@ - + @@ -503,15 +428,18 @@ + +

3F}5mOYjvx!5q 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 F{|`6k1nvL; literal 0 HcmV?d00001 diff --git a/Wino.Mail.WinUI/Assets/SplashScreen.scale-400.png b/Wino.Mail.WinUI/Assets/SplashScreen.scale-400.png new file mode 100644 index 0000000000000000000000000000000000000000..fa77f2b789f6055ecdbaa7bcbefbd8ae63973799 GIT binary patch literal 104608 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�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 UWydR!#pVmKwznev@Z&H41M!e#aR2}S literal 0 HcmV?d00001 diff --git a/Wino.Mail.WinUI/Assets/Square150x150Logo.scale-100.png b/Wino.Mail.WinUI/Assets/Square150x150Logo.scale-100.png new file mode 100644 index 0000000000000000000000000000000000000000..a5f235b87184805659fb086a3dacc8cc1e87acf6 GIT binary patch literal 3579 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 Ww4zd1sP-S5V=y(eG^p2m9RI)cFs>>9 literal 0 HcmV?d00001 diff --git a/Wino.Mail.WinUI/Assets/Square150x150Logo.scale-125.png b/Wino.Mail.WinUI/Assets/Square150x150Logo.scale-125.png new file mode 100644 index 0000000000000000000000000000000000000000..be92b5ae7fe219d12601435b844dd613ee78c4dd GIT binary patch literal 4695 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 literal 0 HcmV?d00001 diff --git a/Wino.Mail.WinUI/Assets/Square150x150Logo.scale-150.png b/Wino.Mail.WinUI/Assets/Square150x150Logo.scale-150.png new file mode 100644 index 0000000000000000000000000000000000000000..d0039797c2985156aaf784849b805520eafdeb7e GIT binary patch literal 5964 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 literal 0 HcmV?d00001 diff --git a/Wino.Mail.WinUI/Assets/Square150x150Logo.scale-200.png b/Wino.Mail.WinUI/Assets/Square150x150Logo.scale-200.png new file mode 100644 index 0000000000000000000000000000000000000000..430e6fa3d0d33f645bd23046662b64aca13ce205 GIT binary patch literal 8744 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 Kz-pB@VgC;_cv#B- literal 0 HcmV?d00001 diff --git a/Wino.Mail.WinUI/Assets/Square150x150Logo.scale-400.png b/Wino.Mail.WinUI/Assets/Square150x150Logo.scale-400.png new file mode 100644 index 0000000000000000000000000000000000000000..9726829b9ff622e35377a87c906f1a4b1d9b3b28 GIT binary patch literal 25845 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 Q`LhobBMZZ-oA+b?4_R;K;{X5v literal 0 HcmV?d00001 diff --git a/Wino.Mail.WinUI/Assets/Square44x44Logo.altform-lightunplated_targetsize-16.png b/Wino.Mail.WinUI/Assets/Square44x44Logo.altform-lightunplated_targetsize-16.png new file mode 100644 index 0000000000000000000000000000000000000000..4d6b9dfe430e39dacb345855482644c8509e98ec GIT binary patch literal 755 zcmVpHrAb6VRCt_qQcG)7K@|RG?j$!iNt?FBBtEE8u(XIS3jP6i7K^x3 zimx9bKIp0!NqZ-wH&Y5Q5}YEG@J%P(xoCd+jlhFXS6Q~Oz>I