From 5b3739c6cf4dd56abcc9256b4d2f7e1a13ef7581 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Burak=20Kaan=20K=C3=B6se?= Date: Wed, 4 Mar 2026 00:12:52 +0100 Subject: [PATCH] Add snooze support for calendar reminders (toast UI, service, DB) (#825) * Filter reminder snooze options by default reminder * Some updates. * Fixing empty welcome page issue and attendee loading. * Icon system for notifications and snooze options etc. --- AGENTS.md | 1 + .../CalendarSettingsPageViewModel.cs | 23 +++ .../EventDetailsPageViewModel.cs | 44 +++++- .../CalendarReminderSnoozeOptions.cs | 29 ++++ Wino.Core.Domain/Constants.cs | 2 + .../Entities/Calendar/CalendarItem.cs | 1 + .../Interfaces/ICalendarService.cs | 1 + .../Interfaces/IPreferencesService.cs | 5 + .../Translations/en_US/resources.json | 10 ++ .../CalendarReminderSnoozeOptionsTests.cs | 48 +++++++ .../Services/CalendarReminderServiceTests.cs | 35 ++++- Wino.Mail.WinUI/App.xaml.cs | 43 +++++- .../Assets/NotificationIcons/archive.png | Bin 12379 -> 0 bytes .../calendar-join.theme-dark.scale-100.png | Bin 0 -> 459 bytes .../calendar-join.theme-dark.scale-125.png | Bin 0 -> 545 bytes .../calendar-join.theme-dark.scale-150.png | Bin 0 -> 669 bytes .../calendar-join.theme-dark.scale-200.png | Bin 0 -> 887 bytes .../calendar-join.theme-dark.scale-400.png | Bin 0 -> 1824 bytes .../calendar-join.theme-light.scale-100.png | Bin 0 -> 434 bytes .../calendar-join.theme-light.scale-125.png | Bin 0 -> 507 bytes .../calendar-join.theme-light.scale-150.png | Bin 0 -> 615 bytes .../calendar-join.theme-light.scale-200.png | Bin 0 -> 817 bytes .../calendar-join.theme-light.scale-400.png | Bin 0 -> 1681 bytes .../calendar-snooze.theme-dark.scale-100.png | Bin 0 -> 351 bytes .../calendar-snooze.theme-dark.scale-125.png | Bin 0 -> 445 bytes .../calendar-snooze.theme-dark.scale-150.png | Bin 0 -> 495 bytes .../calendar-snooze.theme-dark.scale-200.png | Bin 0 -> 685 bytes .../calendar-snooze.theme-dark.scale-400.png | Bin 0 -> 1304 bytes .../calendar-snooze.theme-light.scale-100.png | Bin 0 -> 323 bytes .../calendar-snooze.theme-light.scale-125.png | Bin 0 -> 417 bytes .../calendar-snooze.theme-light.scale-150.png | Bin 0 -> 459 bytes .../calendar-snooze.theme-light.scale-200.png | Bin 0 -> 636 bytes .../calendar-snooze.theme-light.scale-400.png | Bin 0 -> 1221 bytes .../Assets/NotificationIcons/delete.png | Bin 26317 -> 0 bytes .../Assets/NotificationIcons/dismiss.png | Bin 16527 -> 0 bytes .../dismiss.theme-dark.scale-100.png | Bin 0 -> 180 bytes .../dismiss.theme-dark.scale-125.png | Bin 0 -> 234 bytes .../dismiss.theme-dark.scale-150.png | Bin 0 -> 230 bytes .../dismiss.theme-dark.scale-200.png | Bin 0 -> 283 bytes .../dismiss.theme-dark.scale-400.png | Bin 0 -> 521 bytes .../dismiss.theme-light.scale-100.png | Bin 0 -> 174 bytes .../dismiss.theme-light.scale-125.png | Bin 0 -> 226 bytes .../dismiss.theme-light.scale-150.png | Bin 0 -> 229 bytes .../dismiss.theme-light.scale-200.png | Bin 0 -> 275 bytes .../dismiss.theme-light.scale-400.png | Bin 0 -> 509 bytes .../mail-archive.theme-dark.scale-100.png | Bin 0 -> 279 bytes .../mail-archive.theme-dark.scale-125.png | Bin 0 -> 359 bytes .../mail-archive.theme-dark.scale-150.png | Bin 0 -> 383 bytes .../mail-archive.theme-dark.scale-200.png | Bin 0 -> 371 bytes .../mail-archive.theme-dark.scale-400.png | Bin 0 -> 805 bytes .../mail-archive.theme-light.scale-100.png | Bin 0 -> 272 bytes .../mail-archive.theme-light.scale-125.png | Bin 0 -> 324 bytes .../mail-archive.theme-light.scale-150.png | Bin 0 -> 362 bytes .../mail-archive.theme-light.scale-200.png | Bin 0 -> 328 bytes .../mail-archive.theme-light.scale-400.png | Bin 0 -> 706 bytes .../mail-delete.theme-dark.scale-100.png | Bin 0 -> 303 bytes .../mail-delete.theme-dark.scale-125.png | Bin 0 -> 426 bytes .../mail-delete.theme-dark.scale-150.png | Bin 0 -> 496 bytes .../mail-delete.theme-dark.scale-200.png | Bin 0 -> 541 bytes .../mail-delete.theme-dark.scale-400.png | Bin 0 -> 1097 bytes .../mail-delete.theme-light.scale-100.png | Bin 0 -> 289 bytes .../mail-delete.theme-light.scale-125.png | Bin 0 -> 408 bytes .../mail-delete.theme-light.scale-150.png | Bin 0 -> 465 bytes .../mail-delete.theme-light.scale-200.png | Bin 0 -> 527 bytes .../mail-delete.theme-light.scale-400.png | Bin 0 -> 989 bytes .../mail-markread.theme-dark.scale-100.png | Bin 0 -> 336 bytes .../mail-markread.theme-dark.scale-125.png | Bin 0 -> 418 bytes .../mail-markread.theme-dark.scale-150.png | Bin 0 -> 458 bytes .../mail-markread.theme-dark.scale-200.png | Bin 0 -> 595 bytes .../mail-markread.theme-dark.scale-400.png | Bin 0 -> 1269 bytes .../mail-markread.theme-light.scale-100.png | Bin 0 -> 308 bytes .../mail-markread.theme-light.scale-125.png | Bin 0 -> 382 bytes .../mail-markread.theme-light.scale-150.png | Bin 0 -> 447 bytes .../mail-markread.theme-light.scale-200.png | Bin 0 -> 574 bytes .../mail-markread.theme-light.scale-400.png | Bin 0 -> 1147 bytes .../Assets/NotificationIcons/markread.png | Bin 31920 -> 0 bytes Wino.Mail.WinUI/MailAppShell.xaml.cs | 2 + Wino.Mail.WinUI/Services/NavigationService.cs | 13 ++ .../Services/NotificationBuilder.cs | 133 ++++++++++++++++-- .../Services/PreferencesService.cs | 6 + .../Views/Calendar/CalendarSettingsPage.xaml | 11 ++ .../Views/Calendar/EventDetailsPage.xaml | 17 +++ Wino.Mail.WinUI/Wino.Mail.WinUI.csproj | 60 ++++++++ Wino.Services/CalendarService.cs | 20 ++- Wino.Services/DatabaseService.cs | 9 ++ 85 files changed, 486 insertions(+), 27 deletions(-) create mode 100644 Wino.Core.Domain/CalendarReminderSnoozeOptions.cs create mode 100644 Wino.Core.Tests/CalendarReminderSnoozeOptionsTests.cs delete mode 100644 Wino.Mail.WinUI/Assets/NotificationIcons/archive.png create mode 100644 Wino.Mail.WinUI/Assets/NotificationIcons/calendar-join.theme-dark.scale-100.png create mode 100644 Wino.Mail.WinUI/Assets/NotificationIcons/calendar-join.theme-dark.scale-125.png create mode 100644 Wino.Mail.WinUI/Assets/NotificationIcons/calendar-join.theme-dark.scale-150.png create mode 100644 Wino.Mail.WinUI/Assets/NotificationIcons/calendar-join.theme-dark.scale-200.png create mode 100644 Wino.Mail.WinUI/Assets/NotificationIcons/calendar-join.theme-dark.scale-400.png create mode 100644 Wino.Mail.WinUI/Assets/NotificationIcons/calendar-join.theme-light.scale-100.png create mode 100644 Wino.Mail.WinUI/Assets/NotificationIcons/calendar-join.theme-light.scale-125.png create mode 100644 Wino.Mail.WinUI/Assets/NotificationIcons/calendar-join.theme-light.scale-150.png create mode 100644 Wino.Mail.WinUI/Assets/NotificationIcons/calendar-join.theme-light.scale-200.png create mode 100644 Wino.Mail.WinUI/Assets/NotificationIcons/calendar-join.theme-light.scale-400.png create mode 100644 Wino.Mail.WinUI/Assets/NotificationIcons/calendar-snooze.theme-dark.scale-100.png create mode 100644 Wino.Mail.WinUI/Assets/NotificationIcons/calendar-snooze.theme-dark.scale-125.png create mode 100644 Wino.Mail.WinUI/Assets/NotificationIcons/calendar-snooze.theme-dark.scale-150.png create mode 100644 Wino.Mail.WinUI/Assets/NotificationIcons/calendar-snooze.theme-dark.scale-200.png create mode 100644 Wino.Mail.WinUI/Assets/NotificationIcons/calendar-snooze.theme-dark.scale-400.png create mode 100644 Wino.Mail.WinUI/Assets/NotificationIcons/calendar-snooze.theme-light.scale-100.png create mode 100644 Wino.Mail.WinUI/Assets/NotificationIcons/calendar-snooze.theme-light.scale-125.png create mode 100644 Wino.Mail.WinUI/Assets/NotificationIcons/calendar-snooze.theme-light.scale-150.png create mode 100644 Wino.Mail.WinUI/Assets/NotificationIcons/calendar-snooze.theme-light.scale-200.png create mode 100644 Wino.Mail.WinUI/Assets/NotificationIcons/calendar-snooze.theme-light.scale-400.png delete mode 100644 Wino.Mail.WinUI/Assets/NotificationIcons/delete.png delete mode 100644 Wino.Mail.WinUI/Assets/NotificationIcons/dismiss.png create mode 100644 Wino.Mail.WinUI/Assets/NotificationIcons/dismiss.theme-dark.scale-100.png create mode 100644 Wino.Mail.WinUI/Assets/NotificationIcons/dismiss.theme-dark.scale-125.png create mode 100644 Wino.Mail.WinUI/Assets/NotificationIcons/dismiss.theme-dark.scale-150.png create mode 100644 Wino.Mail.WinUI/Assets/NotificationIcons/dismiss.theme-dark.scale-200.png create mode 100644 Wino.Mail.WinUI/Assets/NotificationIcons/dismiss.theme-dark.scale-400.png create mode 100644 Wino.Mail.WinUI/Assets/NotificationIcons/dismiss.theme-light.scale-100.png create mode 100644 Wino.Mail.WinUI/Assets/NotificationIcons/dismiss.theme-light.scale-125.png create mode 100644 Wino.Mail.WinUI/Assets/NotificationIcons/dismiss.theme-light.scale-150.png create mode 100644 Wino.Mail.WinUI/Assets/NotificationIcons/dismiss.theme-light.scale-200.png create mode 100644 Wino.Mail.WinUI/Assets/NotificationIcons/dismiss.theme-light.scale-400.png create mode 100644 Wino.Mail.WinUI/Assets/NotificationIcons/mail-archive.theme-dark.scale-100.png create mode 100644 Wino.Mail.WinUI/Assets/NotificationIcons/mail-archive.theme-dark.scale-125.png create mode 100644 Wino.Mail.WinUI/Assets/NotificationIcons/mail-archive.theme-dark.scale-150.png create mode 100644 Wino.Mail.WinUI/Assets/NotificationIcons/mail-archive.theme-dark.scale-200.png create mode 100644 Wino.Mail.WinUI/Assets/NotificationIcons/mail-archive.theme-dark.scale-400.png create mode 100644 Wino.Mail.WinUI/Assets/NotificationIcons/mail-archive.theme-light.scale-100.png create mode 100644 Wino.Mail.WinUI/Assets/NotificationIcons/mail-archive.theme-light.scale-125.png create mode 100644 Wino.Mail.WinUI/Assets/NotificationIcons/mail-archive.theme-light.scale-150.png create mode 100644 Wino.Mail.WinUI/Assets/NotificationIcons/mail-archive.theme-light.scale-200.png create mode 100644 Wino.Mail.WinUI/Assets/NotificationIcons/mail-archive.theme-light.scale-400.png create mode 100644 Wino.Mail.WinUI/Assets/NotificationIcons/mail-delete.theme-dark.scale-100.png create mode 100644 Wino.Mail.WinUI/Assets/NotificationIcons/mail-delete.theme-dark.scale-125.png create mode 100644 Wino.Mail.WinUI/Assets/NotificationIcons/mail-delete.theme-dark.scale-150.png create mode 100644 Wino.Mail.WinUI/Assets/NotificationIcons/mail-delete.theme-dark.scale-200.png create mode 100644 Wino.Mail.WinUI/Assets/NotificationIcons/mail-delete.theme-dark.scale-400.png create mode 100644 Wino.Mail.WinUI/Assets/NotificationIcons/mail-delete.theme-light.scale-100.png create mode 100644 Wino.Mail.WinUI/Assets/NotificationIcons/mail-delete.theme-light.scale-125.png create mode 100644 Wino.Mail.WinUI/Assets/NotificationIcons/mail-delete.theme-light.scale-150.png create mode 100644 Wino.Mail.WinUI/Assets/NotificationIcons/mail-delete.theme-light.scale-200.png create mode 100644 Wino.Mail.WinUI/Assets/NotificationIcons/mail-delete.theme-light.scale-400.png create mode 100644 Wino.Mail.WinUI/Assets/NotificationIcons/mail-markread.theme-dark.scale-100.png create mode 100644 Wino.Mail.WinUI/Assets/NotificationIcons/mail-markread.theme-dark.scale-125.png create mode 100644 Wino.Mail.WinUI/Assets/NotificationIcons/mail-markread.theme-dark.scale-150.png create mode 100644 Wino.Mail.WinUI/Assets/NotificationIcons/mail-markread.theme-dark.scale-200.png create mode 100644 Wino.Mail.WinUI/Assets/NotificationIcons/mail-markread.theme-dark.scale-400.png create mode 100644 Wino.Mail.WinUI/Assets/NotificationIcons/mail-markread.theme-light.scale-100.png create mode 100644 Wino.Mail.WinUI/Assets/NotificationIcons/mail-markread.theme-light.scale-125.png create mode 100644 Wino.Mail.WinUI/Assets/NotificationIcons/mail-markread.theme-light.scale-150.png create mode 100644 Wino.Mail.WinUI/Assets/NotificationIcons/mail-markread.theme-light.scale-200.png create mode 100644 Wino.Mail.WinUI/Assets/NotificationIcons/mail-markread.theme-light.scale-400.png delete mode 100644 Wino.Mail.WinUI/Assets/NotificationIcons/markread.png diff --git a/AGENTS.md b/AGENTS.md index a3d40d5f..bfef1ef7 100644 --- a/AGENTS.md +++ b/AGENTS.md @@ -130,5 +130,6 @@ private string searchQuery = string.Empty; - Wrap async operations in try-catch - Log errors via IWinoLogger - In ViewModels, update all UI-bound properties/collections via `ExecuteUIThread(...)` (especially after awaited calls and any use of `ConfigureAwait(false)`). +- In `EventDetailsPageViewModel.LoadAttendeesAsync`, never mutate `CurrentEvent.Attendees` outside `ExecuteUIThread(...)`. diff --git a/Wino.Calendar.ViewModels/CalendarSettingsPageViewModel.cs b/Wino.Calendar.ViewModels/CalendarSettingsPageViewModel.cs index 801b67ed..d03f2ad4 100644 --- a/Wino.Calendar.ViewModels/CalendarSettingsPageViewModel.cs +++ b/Wino.Calendar.ViewModels/CalendarSettingsPageViewModel.cs @@ -50,6 +50,12 @@ public partial class CalendarSettingsPageViewModel : CalendarBaseViewModel [ObservableProperty] public partial int SelectedDefaultReminderIndex { get; set; } + [ObservableProperty] + public partial List SnoozeOptions { get; set; } = []; + + [ObservableProperty] + public partial int SelectedDefaultSnoozeIndex { get; set; } + public IPreferencesService PreferencesService { get; } private readonly ICalendarService _calendarService; private readonly IAccountService _accountService; @@ -108,6 +114,15 @@ public partial class CalendarSettingsPageViewModel : CalendarBaseViewModel SelectedDefaultReminderIndex = index >= 0 ? index + 1 : 0; } + var supportedSnoozeMinutes = CalendarReminderSnoozeOptions.GetSupportedSnoozeMinutes().ToArray(); + foreach (var snoozeMinutes in supportedSnoozeMinutes) + { + SnoozeOptions.Add(string.Format(Translator.CalendarReminder_SnoozeMinutesOption, snoozeMinutes)); + } + + var selectedSnoozeIndex = Array.IndexOf(supportedSnoozeMinutes, preferencesService.DefaultSnoozeDurationInMinutes); + SelectedDefaultSnoozeIndex = selectedSnoozeIndex >= 0 ? selectedSnoozeIndex : 0; + _isLoaded = true; // Load accounts with calendar support @@ -147,6 +162,7 @@ public partial class CalendarSettingsPageViewModel : CalendarBaseViewModel partial void OnWorkingDayStartIndexChanged(int value) => SaveSettings(); partial void OnWorkingDayEndIndexChanged(int value) => SaveSettings(); partial void OnSelectedDefaultReminderIndexChanged(int value) => SaveSettings(); + partial void OnSelectedDefaultSnoozeIndexChanged(int value) => SaveSettings(); public void SaveSettings() { @@ -205,6 +221,13 @@ public partial class CalendarSettingsPageViewModel : CalendarBaseViewModel PreferencesService.DefaultReminderDurationInSeconds = minutes * 60; } + var supportedSnoozeMinutes = CalendarReminderSnoozeOptions.GetSupportedSnoozeMinutes(); + if (supportedSnoozeMinutes.Count > 0) + { + var selectedIndex = Math.Clamp(SelectedDefaultSnoozeIndex, 0, supportedSnoozeMinutes.Count - 1); + PreferencesService.DefaultSnoozeDurationInMinutes = supportedSnoozeMinutes[selectedIndex]; + } + Messenger.Send(new CalendarSettingsUpdatedMessage()); } } diff --git a/Wino.Calendar.ViewModels/EventDetailsPageViewModel.cs b/Wino.Calendar.ViewModels/EventDetailsPageViewModel.cs index cac9288f..f2064610 100644 --- a/Wino.Calendar.ViewModels/EventDetailsPageViewModel.cs +++ b/Wino.Calendar.ViewModels/EventDetailsPageViewModel.cs @@ -31,6 +31,7 @@ public partial class EventDetailsPageViewModel : CalendarBaseViewModel private readonly IWinoRequestDelegator _winoRequestDelegator; private readonly INavigationService _navigationService; private readonly IUnderlyingThemeService _underlyingThemeService; + private readonly INotificationBuilder _notificationBuilder; private readonly IContactService _contactService; public CalendarSettings CurrentSettings { get; } @@ -144,6 +145,7 @@ public partial class EventDetailsPageViewModel : CalendarBaseViewModel IMailDialogService dialogService, IWinoRequestDelegator winoRequestDelegator, INavigationService navigationService, + INotificationBuilder notificationBuilder, IUnderlyingThemeService underlyingThemeService, IContactService contactService) { @@ -154,6 +156,7 @@ public partial class EventDetailsPageViewModel : CalendarBaseViewModel _winoRequestDelegator = winoRequestDelegator; _navigationService = navigationService; _underlyingThemeService = underlyingThemeService; + _notificationBuilder = notificationBuilder; _contactService = contactService; CurrentSettings = _preferencesService.GetCurrentCalendarSettings(); @@ -259,8 +262,6 @@ public partial class EventDetailsPageViewModel : CalendarBaseViewModel private async Task LoadAttendeesAsync(Guid calendarItemId, CalendarItem calendarItem) { - CurrentEvent.Attendees.Clear(); - var attendees = await _calendarService.GetAttendeesAsync(calendarItemId); // Resolve contacts for all attendees in a single batch DB query. @@ -285,10 +286,12 @@ public partial class EventDetailsPageViewModel : CalendarBaseViewModel var organizer = attendees.FirstOrDefault(a => a.IsOrganizer); var nonOrganizerAttendees = attendees.Where(a => !a.IsOrganizer).ToList(); + var attendeesForUi = new List(); + // If the organizer is in the list, add them first if (organizer != null) { - CurrentEvent.Attendees.Add(organizer); + attendeesForUi.Add(organizer); } else if (!string.IsNullOrEmpty(calendarItem.OrganizerEmail)) { @@ -306,14 +309,27 @@ public partial class EventDetailsPageViewModel : CalendarBaseViewModel if (contactLookup.TryGetValue(calendarItem.OrganizerEmail, out var organizerContact)) organizerAttendee.ResolvedContact = organizerContact; - CurrentEvent.Attendees.Add(organizerAttendee); + attendeesForUi.Add(organizerAttendee); } // Add all other attendees after the organizer foreach (var item in nonOrganizerAttendees) { - CurrentEvent.Attendees.Add(item); + attendeesForUi.Add(item); } + + await ExecuteUIThread(() => + { + if (CurrentEvent == null) + return; + + CurrentEvent.Attendees.Clear(); + + foreach (var attendee in attendeesForUi) + { + CurrentEvent.Attendees.Add(attendee); + } + }); } private async Task LoadAttachmentsAsync(Guid calendarItemId) @@ -491,6 +507,24 @@ public partial class EventDetailsPageViewModel : CalendarBaseViewModel return _nativeAppService.LaunchUriAsync(new Uri(CurrentEvent.CalendarItem.HtmlLink)); } + [RelayCommand] + private Task CreateTestNotificationAsync() + { + if (CurrentEvent?.CalendarItem == null) + return Task.CompletedTask; + + var reminderDurationInSeconds = Reminders? + .Where(x => x.DurationInSeconds > 0) + .OrderByDescending(x => x.DurationInSeconds) + .Select(x => x.DurationInSeconds) + .FirstOrDefault() ?? 0; + + if (reminderDurationInSeconds <= 0) + reminderDurationInSeconds = Math.Max(_preferencesService.DefaultReminderDurationInSeconds, 30 * 60); + + return _notificationBuilder.CreateCalendarReminderNotificationAsync(CurrentEvent.CalendarItem, reminderDurationInSeconds); + } + [RelayCommand] private void ToggleRsvpPanel() { diff --git a/Wino.Core.Domain/CalendarReminderSnoozeOptions.cs b/Wino.Core.Domain/CalendarReminderSnoozeOptions.cs new file mode 100644 index 00000000..5786c42f --- /dev/null +++ b/Wino.Core.Domain/CalendarReminderSnoozeOptions.cs @@ -0,0 +1,29 @@ +using System; +using System.Collections.Generic; +using System.Linq; + +namespace Wino.Core.Domain; + +public static class CalendarReminderSnoozeOptions +{ + private static readonly int[] SupportedSnoozeMinutes = [5, 10, 15, 30]; + + public static IReadOnlyList GetSupportedSnoozeMinutes() + => SupportedSnoozeMinutes; + + public static IReadOnlyList GetAllowedSnoozeMinutes(long reminderDurationInSeconds, long defaultReminderDurationInSeconds) + { + var reminderMinutes = (int)Math.Max(0, reminderDurationInSeconds / 60); + + if (reminderMinutes <= 0) + return []; + + var maxSnoozeMinutes = reminderMinutes; + var defaultReminderMinutes = (int)Math.Max(0, defaultReminderDurationInSeconds / 60); + + if (defaultReminderMinutes > 0) + maxSnoozeMinutes = Math.Min(maxSnoozeMinutes, defaultReminderMinutes); + + return SupportedSnoozeMinutes.Where(minutes => minutes <= maxSnoozeMinutes).ToArray(); + } +} diff --git a/Wino.Core.Domain/Constants.cs b/Wino.Core.Domain/Constants.cs index 6c57207b..6165b628 100644 --- a/Wino.Core.Domain/Constants.cs +++ b/Wino.Core.Domain/Constants.cs @@ -16,6 +16,8 @@ public static class Constants public const string ToastCalendarItemIdKey = nameof(ToastCalendarItemIdKey); public const string ToastCalendarActionKey = nameof(ToastCalendarActionKey); public const string ToastCalendarNavigateAction = nameof(ToastCalendarNavigateAction); + public const string ToastCalendarSnoozeAction = nameof(ToastCalendarSnoozeAction); + public const string ToastCalendarSnoozeDurationInputId = nameof(ToastCalendarSnoozeDurationInputId); public const string ToastModeKey = nameof(ToastModeKey); public const string ToastModeMail = nameof(ToastModeMail); public const string ToastModeCalendar = nameof(ToastModeCalendar); diff --git a/Wino.Core.Domain/Entities/Calendar/CalendarItem.cs b/Wino.Core.Domain/Entities/Calendar/CalendarItem.cs index 86d6235a..a04576f9 100644 --- a/Wino.Core.Domain/Entities/Calendar/CalendarItem.cs +++ b/Wino.Core.Domain/Entities/Calendar/CalendarItem.cs @@ -138,6 +138,7 @@ public class CalendarItem : ICalendarItem // TODO public string CustomEventColorHex { get; set; } public string HtmlLink { get; set; } + public DateTime? SnoozedUntil { get; set; } public CalendarItemStatus Status { get; set; } public CalendarItemVisibility Visibility { get; set; } diff --git a/Wino.Core.Domain/Interfaces/ICalendarService.cs b/Wino.Core.Domain/Interfaces/ICalendarService.cs index 6e2ba3c1..d41f6dc0 100644 --- a/Wino.Core.Domain/Interfaces/ICalendarService.cs +++ b/Wino.Core.Domain/Interfaces/ICalendarService.cs @@ -42,6 +42,7 @@ public interface ICalendarService Task UpdateCalendarItemAsync(CalendarItem calendarItem, List attendees); Task> GetRemindersAsync(Guid calendarItemId); Task SaveRemindersAsync(Guid calendarItemId, List reminders); + Task SnoozeCalendarItemAsync(Guid calendarItemId, DateTime snoozedUntilLocal); /// /// Checks due reminder windows and returns reminder notifications that should trigger now. diff --git a/Wino.Core.Domain/Interfaces/IPreferencesService.cs b/Wino.Core.Domain/Interfaces/IPreferencesService.cs index a207136c..8763b686 100644 --- a/Wino.Core.Domain/Interfaces/IPreferencesService.cs +++ b/Wino.Core.Domain/Interfaces/IPreferencesService.cs @@ -222,6 +222,11 @@ public interface IPreferencesService : INotifyPropertyChanged /// long DefaultReminderDurationInSeconds { get; set; } + /// + /// Setting: Default snooze duration in minutes for calendar reminder notifications. + /// + int DefaultSnoozeDurationInMinutes { get; set; } + CalendarSettings GetCurrentCalendarSettings(); #endregion diff --git a/Wino.Core.Domain/Translations/en_US/resources.json b/Wino.Core.Domain/Translations/en_US/resources.json index ba2f5ee1..36074c3a 100644 --- a/Wino.Core.Domain/Translations/en_US/resources.json +++ b/Wino.Core.Domain/Translations/en_US/resources.json @@ -133,6 +133,14 @@ "CalendarEventDetails_People": "People", "CalendarEventDetails_ReadOnlyEvent": "Read-only event", "CalendarEventDetails_Reminder": "Reminder", + "CalendarReminder_StartedHoursAgo": "Started {0} hours ago", + "CalendarReminder_StartedMinutesAgo": "Started {0} minutes ago", + "CalendarReminder_StartedNow": "Started just now", + "CalendarReminder_StartingNow": "Starting now", + "CalendarReminder_StartsInHours": "Starts in {0} hours", + "CalendarReminder_StartsInMinutes": "Starts in {0} minutes", + "CalendarReminder_SnoozeAction": "Snooze", + "CalendarReminder_SnoozeMinutesOption": "{0} minutes", "CalendarEventDetails_ShowAs": "Show as", "CalendarShowAs_Free": "Free", "CalendarShowAs_Tentative": "Tentative", @@ -646,6 +654,8 @@ "SettingsAvailableThemes_Title": "Available Themes", "SettingsCalendarSettings_Description": "Change first day of week, hour cell height and more...", "SettingsCalendarSettings_Title": "Calendar Settings", + "CalendarSettings_DefaultSnoozeDuration_Header": "Default snooze duration", + "CalendarSettings_DefaultSnoozeDuration_Description": "Set a default snooze duration for calendar reminder notifications.", "SettingsComposer_Title": "Composer", "SettingsComposerFont_Title": "Default Composer Font", "SettingsComposerFontFamily_Description": "Change the default font family and font size for composing mails.", diff --git a/Wino.Core.Tests/CalendarReminderSnoozeOptionsTests.cs b/Wino.Core.Tests/CalendarReminderSnoozeOptionsTests.cs new file mode 100644 index 00000000..561e3024 --- /dev/null +++ b/Wino.Core.Tests/CalendarReminderSnoozeOptionsTests.cs @@ -0,0 +1,48 @@ +using FluentAssertions; +using Wino.Core.Domain; +using Xunit; + +namespace Wino.Core.Tests; + +public class CalendarReminderSnoozeOptionsTests +{ + [Fact] + public void GetAllowedSnoozeMinutes_WhenDefaultIs15AndReminderIs15_Excludes30() + { + var options = CalendarReminderSnoozeOptions.GetAllowedSnoozeMinutes( + reminderDurationInSeconds: 15 * 60, + defaultReminderDurationInSeconds: 15 * 60); + + options.Should().Equal(5, 10, 15); + } + + [Fact] + public void GetAllowedSnoozeMinutes_WhenReminderIs5AndDefaultIs15_DoesNotPassEventStart() + { + var options = CalendarReminderSnoozeOptions.GetAllowedSnoozeMinutes( + reminderDurationInSeconds: 5 * 60, + defaultReminderDurationInSeconds: 15 * 60); + + options.Should().Equal(5); + } + + [Fact] + public void GetAllowedSnoozeMinutes_WhenDefaultReminderIsNone_UsesReminderDurationOnly() + { + var options = CalendarReminderSnoozeOptions.GetAllowedSnoozeMinutes( + reminderDurationInSeconds: 30 * 60, + defaultReminderDurationInSeconds: 0); + + options.Should().Equal(5, 10, 15, 30); + } + + [Fact] + public void GetAllowedSnoozeMinutes_WhenReminderIsUnderFiveMinutes_ReturnsNoOptions() + { + var options = CalendarReminderSnoozeOptions.GetAllowedSnoozeMinutes( + reminderDurationInSeconds: 60, + defaultReminderDurationInSeconds: 15 * 60); + + options.Should().BeEmpty(); + } +} diff --git a/Wino.Core.Tests/Services/CalendarReminderServiceTests.cs b/Wino.Core.Tests/Services/CalendarReminderServiceTests.cs index 00261663..23e9b62b 100644 --- a/Wino.Core.Tests/Services/CalendarReminderServiceTests.cs +++ b/Wino.Core.Tests/Services/CalendarReminderServiceTests.cs @@ -68,8 +68,8 @@ public class CalendarReminderServiceTests : IAsyncLifetime due.Should().HaveCount(1); due[0].CalendarItem.Id.Should().Be(calendarItem.Id); due[0].ReminderDurationInSeconds.Should().Be(5 * 60); - due[0].ReminderKey.Should().Be($"{calendarItem.Id:N}:{5 * 60}"); - sentReminderKeys.Should().Contain($"{calendarItem.Id:N}:{5 * 60}"); + due[0].ReminderKey.Should().StartWith($"{calendarItem.Id:N}:{5 * 60}:"); + sentReminderKeys.Should().ContainSingle(k => k.StartsWith($"{calendarItem.Id:N}:{5 * 60}:")); } [Fact] @@ -108,7 +108,7 @@ public class CalendarReminderServiceTests : IAsyncLifetime firstRun.Should().HaveCount(1); secondRun.Should().BeEmpty(); - sentReminderKeys.Should().Contain($"{calendarItem.Id:N}:{5 * 60}"); + sentReminderKeys.Should().ContainSingle(k => k.StartsWith($"{calendarItem.Id:N}:{5 * 60}:")); } [Fact] @@ -189,6 +189,35 @@ public class CalendarReminderServiceTests : IAsyncLifetime due.Should().BeEmpty(); } + + [Fact] + public async Task CheckAndNotifyAsync_WhenItemIsSnoozed_TriggersAtSnoozedTime() + { + var nowLocal = new DateTime(2026, 1, 1, 10, 0, 0); + var lastCheckLocal = nowLocal.AddSeconds(-30); + + var calendarItem = await CreateCalendarItemWithReminderAsync( + startDate: nowLocal.AddMinutes(5), + reminderDurationInSeconds: 5 * 60, + reminderType: CalendarItemReminderType.Popup); + + await _calendarService.SnoozeCalendarItemAsync(calendarItem.Id, nowLocal.AddMinutes(10)); + + HashSet sentReminderKeys = []; + + var dueAtOriginalTrigger = await _calendarService.CheckAndNotifyAsync(lastCheckLocal, nowLocal, sentReminderKeys); + dueAtOriginalTrigger.Should().BeEmpty(); + + var snoozeTriggerWindowStart = nowLocal.AddMinutes(10).AddSeconds(-30); + var snoozeTriggerWindowEnd = nowLocal.AddMinutes(10); + + var dueAtSnoozeTime = await _calendarService.CheckAndNotifyAsync(snoozeTriggerWindowStart, snoozeTriggerWindowEnd, sentReminderKeys); + + dueAtSnoozeTime.Should().HaveCount(1); + dueAtSnoozeTime[0].CalendarItem.Id.Should().Be(calendarItem.Id); + dueAtSnoozeTime[0].ReminderKey.Should().StartWith($"{calendarItem.Id:N}:{5 * 60}:"); + } + private async Task CreateCalendarItemWithReminderAsync( DateTime startDate, long reminderDurationInSeconds, diff --git a/Wino.Mail.WinUI/App.xaml.cs b/Wino.Mail.WinUI/App.xaml.cs index 161a5fcc..10a42c14 100644 --- a/Wino.Mail.WinUI/App.xaml.cs +++ b/Wino.Mail.WinUI/App.xaml.cs @@ -192,6 +192,8 @@ public partial class App : WinoApplication, private void AppNotificationInvoked(AppNotificationManager sender, AppNotificationActivatedEventArgs args) { + // AppNotification callbacks are not guaranteed to run on the UI thread. + // Marshal toast handling to the window dispatcher before touching window APIs. if (MainWindow?.DispatcherQueue?.TryEnqueue(() => _ = HandleToastActivationAsync(args)) == true) return; @@ -224,12 +226,20 @@ public partial class App : WinoApplication, // Check calendar reminder toast activation first. if (toastArguments.TryGetValue(Constants.ToastCalendarActionKey, out string calendarAction) && - calendarAction == Constants.ToastCalendarNavigateAction && toastArguments.TryGetValue(Constants.ToastCalendarItemIdKey, out string calendarItemIdString) && Guid.TryParse(calendarItemIdString, out Guid calendarItemId)) { - await HandleCalendarToastNavigationAsync(calendarItemId); - return; + if (calendarAction == Constants.ToastCalendarNavigateAction) + { + await HandleCalendarToastNavigationAsync(calendarItemId); + return; + } + + if (calendarAction == Constants.ToastCalendarSnoozeAction) + { + await HandleCalendarToastSnoozeAsync(toastArgs, calendarItemId); + return; + } } // Check if this is a navigation toast (user clicked the notification). @@ -275,6 +285,33 @@ public partial class App : WinoApplication, navigationService.Navigate(WinoPage.EventDetailsPage, target); } + private async Task HandleCalendarToastSnoozeAsync(AppNotificationActivatedEventArgs toastArgs, Guid calendarItemId) + { + if (!TryGetSnoozeDurationMinutes(toastArgs, out var snoozeDurationMinutes)) + return; + + var calendarService = Services.GetRequiredService(); + var snoozedUntilLocal = DateTime.Now.AddMinutes(snoozeDurationMinutes); + + await calendarService.SnoozeCalendarItemAsync(calendarItemId, snoozedUntilLocal).ConfigureAwait(false); + } + + private static bool TryGetSnoozeDurationMinutes(AppNotificationActivatedEventArgs toastArgs, out int snoozeDurationMinutes) + { + snoozeDurationMinutes = 0; + + if (toastArgs.UserInput == null || + !toastArgs.UserInput.TryGetValue(Constants.ToastCalendarSnoozeDurationInputId, out var selectedValue) || + selectedValue == null) + { + return false; + } + + var selectedText = selectedValue.ToString(); + + return int.TryParse(selectedText, out snoozeDurationMinutes) && snoozeDurationMinutes > 0; + } + /// /// Handles toast notification click for navigation. /// Creates window if not running, sets up navigation parameter. diff --git a/Wino.Mail.WinUI/Assets/NotificationIcons/archive.png b/Wino.Mail.WinUI/Assets/NotificationIcons/archive.png deleted file mode 100644 index 40dc3dd1e04fb08ad84a9911276f354c68e775d5..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 12379 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 B$&mm6 literal 0 HcmV?d00001 diff --git a/Wino.Mail.WinUI/Assets/NotificationIcons/calendar-join.theme-dark.scale-125.png b/Wino.Mail.WinUI/Assets/NotificationIcons/calendar-join.theme-dark.scale-125.png new file mode 100644 index 0000000000000000000000000000000000000000..1c23956e8cd96dddfc02c13f0e59b43b68a94977 GIT binary patch literal 545 zcmV++0^a?JP)OmR6!Jmp9!l$3@)x;sEvX`2$&zBKR^VlXf`HM3qiE7 z@CPU;h`oii5Jiy~@FS8`c3PQ2C146;xr5 zZjQOBHsg1#%9Dcxby|I?4yjYF$CSENeXgES!@pn+bv~M}se@`K0e*?v^*Da2Hp*ai zbvZE~R>%E2n(Cos{6Vef+FVS2YDfKH2KXS>T8Xx}p?!6%V492irwnj4)}9sgQvm%P zI|9rmlb%%vfw#a?W_h*%kAPo^JPOQJZqolmP$z-A1$`ps$0fegF+VBjS8BjPV0)p^ z1sWN>A9dhsrhZ@m7|0j`@Vf*Cum-e&6TmiL7Fe5JI?FF^TF>cdI{>b9fQrIaH4VDgAW_;f6W`>@Bd` zA%t`EHf1c%atXKxy~QV9n+4!_G_^tq`_%iu*#htma2q(r`o-wSO4`CM^?lO9up6H) z)vmgyaF5eiE3V5r2;fB$R5e3u*abDAm7=Iy*6&-1?LJ@>va z4X9me*K}%%$mXl()&24Lw106b`u3^k)Oph--=&VIqiU17T%AY=OsE}dbIco7d#6HN zQm?6%NOUv$FFP5RV(fOpcS{XL0vA#wTh%(XoFOoz&WL+S;$j~8otZh@YFH-)+z|n%b z|A(M90~<49FGC1JY9}x=r~X$6;gPxsSe+4niq$VA3q1hpSiugy#+;ow@$DsGX-;?J z(bgBdfri>7Iq|j-3UmO^GRS`dYk_yb3MPMz72r*J)ElWK?y!0zK4&cWin`9~QOd(e zTJ;!kJ@LFPgirzQW=!w|=mA_o`+JM3ENt zxbb+XhZA)tqOUDBk%!TO=`uyT)GaArXPh>TA$9X_`8#c?>vXD{00000NkvXXu0mjf D83-{h literal 0 HcmV?d00001 diff --git a/Wino.Mail.WinUI/Assets/NotificationIcons/calendar-join.theme-dark.scale-200.png b/Wino.Mail.WinUI/Assets/NotificationIcons/calendar-join.theme-dark.scale-200.png new file mode 100644 index 0000000000000000000000000000000000000000..445bef6a8abff79e0666e8ed30175f7499e657d6 GIT binary patch literal 887 zcmV--1Bm>IP)mNn-Ojn^`JdeZaj?@ZSV( z0ImiB&RhFfpfe(%6R0uH1#24wt^gB;8+;DXQ4yfkY+ED2JvJI=aYg$Rps8r^*^v=; z1orz?1l$aGl>>MK%+3p54?K@JK5h1?WQ#6^eqf4m&qVAUKz$gqRH5O#qng>Al&1)JXcAKG zCrJ|UsLEf3@i=)A0o@n0C2E^yN&b~Uegl!vCOo`C+*beq N002ovPDHLkV1mSImn{GQ literal 0 HcmV?d00001 diff --git a/Wino.Mail.WinUI/Assets/NotificationIcons/calendar-join.theme-dark.scale-400.png b/Wino.Mail.WinUI/Assets/NotificationIcons/calendar-join.theme-dark.scale-400.png new file mode 100644 index 0000000000000000000000000000000000000000..fb17ae9a217432a648f52c7659644d33748a9f17 GIT binary patch literal 1824 zcmV+*2jBRKP)77OI$kGA}D*6yb5L6IE6oym;nLU-VqOzwZWTscI-uvsroa33Z&z?DZ_RPK7 zVXz61cbk&T-@`dz?>z$3uqp@|{_z$w78R4|u&bj|?=auP5AoaM2* zJf*V~IALg_3IK2{@U9cc3b)$=V}La|!PoICu)Aa10es`=y#pLMw9z&@)lJgXeNXfP zkN$#y;OltQV}FT9ZyWFsFmh<3Za6ay_&US+b-)Nme;=T)Kms-c;~kD&fwdX>tAHbh zD)`wnf5BZW@Yvi_Aox1&_V6ss(eDK=8qB~AxP$zU7{DQpT^I0sL;`$0X=)pr0pQNT zO2GXAPJiUFJ2xWuI?nX)tq8EYx9Z?;3Uv4$kL^p*;lqm_zWIT+w^kMWWd$6b;n1-Tt8+xoSlRxwHG)%FUDax!H<&kqNJ|C ze7$XETOHZ)fwp;Qs`|`qi=_7gZAVCY2^f>5keL8U_eq)<*pM=un&FWZg|F;=yMX-x zN@58I&_hyX6~Ro0V-KLeAcqhA?h^!#kKphYN-aGAFiDR|8eS-C(#OvAR3Co?hDqvi zWM4#ZECO2m@i{n4#k=lLX13Om9pcrDL(_-M%+^R+Q;_2*NvFC(UjnW!NGwUqJ+dkj zFv%k;+6yG<8duPi0H8w_LWiQ)%$mLh!2XI`+t_Mm ztJ6dVY>2GXHn{A-Es(NZG;vG2dMV_$(S8M+~_#%@w00cD1*10ESA__E;hvEI&dN%NGv*PUiIQc}01 z>5}f3 zY5XNM2170X@&ee^BO9s&%r>(>+Zon$=8>#hJf-BpZ;%>2;HMIf`FenF^i~!v2}lPI zoD955vVPbHd`q%;yI)HGX-T)#E`L$V_@ELM+V`$wzyl@tvf!QA1a<+Q$+6oAoSo7i z4txMikQzPUTg4X@dw68)BDwOA#rd$LOLOc-N_rkRR+7xDU(yY#_4;8o;WkO1MmjbM zXF){LZ;@PiXh{IcLhQT%+YU(!>lbFW#LSSIe=RYyD^fBV8|%mhBLTmAWEU#@7v4iM z<=2F?@f$H-)iB<<{G7JS?2d~=0)Xwgs42`*8xiV}mLo$Jp_aAje&M^?0e`{!)8 z3jz5%MtqpIqkXOvBsLp6%Gmgo)kEGkp?1i9~NahEZrUMb<< z^=9^9imyk~TqQF47cvuqHGxM1GTO3h12`}8=}b>?JRix?7KPG9 za@?ieX6cEJO()sg-1D%1isQ2g`ydn=O_|wzNpqAx={eW2*&^w=BJFrE7?Z5=01gMf z%t-1wpv%#pKynBo6q`vEI>2kC9&-+&7DUW!xuhwQo{-e<+#V}upHb~h;FATKc+AYw zvq~-7@OK&jlSoc-rSTcg&=c5`utQU8Y26t*xzfj;LY0Y_3A~l!p6k&$yNy5nz-b;k z1K!`M6OeLtGRXK~y-6jnlhJmthnK@XxD;5Ro*5;?iJJ5#*pE1P$K6XlZR|sOT>! z9Q+Ri6@~tQ7M)#lsXzoTc-tciLR_Mt3u*Z_yyxZj_^9B4!*ibRb8gSMa5{Cw`5eze zzIul4G3v$=#&I7Qe9ROtsaloOkHBAJMOEm@ zLN#G&!M0UBzm_@pgu^7@8U~tGgENFt+{V9%^d#;zZ{b6vUtj{C>t5f$CN8Rmn5 cj_=3pf7%6SrQ6LwA^-pY07*qoM6N<$f{V()O#lD@ literal 0 HcmV?d00001 diff --git a/Wino.Mail.WinUI/Assets/NotificationIcons/calendar-join.theme-light.scale-125.png b/Wino.Mail.WinUI/Assets/NotificationIcons/calendar-join.theme-light.scale-125.png new file mode 100644 index 0000000000000000000000000000000000000000..01a4d0ee80bfe59d37e6906993762c15d324549d GIT binary patch literal 507 zcmVJc6h)%o6;s)1WeSym7HXMb3K0bnLypCs&0bk&?~}$KhQ<7|=3lp&MQ^N) zaWo9ttK@W{g-N_XKPJ!#o4^J<#mSi46Pxiok}qQ&78Aj5!CeXeapcru0CP$5ew;}B z(nhf_@jpav*D+_3NejW>s}Z~#vH66X$&WvhB|QrMbB*Aah&{>pV^lA80Mp3=(~7%# zi`km%S&#eplW@byM*bgK7{{%QAB*upL*DTiA7=c;Huhpu7Fbf0L(Z2N!1tQ?o<8)| zB((6iK@64^m2d!xHTv9Z`9FAgl8*fylkYcfcFJnVEAO0}T z;#!YQtcvaUt*XOwRCRbTQ-6)Cn8MCXXaT1ck1`UwoW*Ubc4^@y4u?OFUATi&ncz*_ zz#-jV*{9UmhWE)42Ce+MI*M}IVPzkuwwx_sYwWax>x%YElfPn1gIH;`n8YhZ0iQ`G xk4OAngV<7&V2L#`jw$}e5<`mnO2vNS!arevi+mvryf^>=002ovPDHLkV1gb!<$M4D literal 0 HcmV?d00001 diff --git a/Wino.Mail.WinUI/Assets/NotificationIcons/calendar-join.theme-light.scale-150.png b/Wino.Mail.WinUI/Assets/NotificationIcons/calendar-join.theme-light.scale-150.png new file mode 100644 index 0000000000000000000000000000000000000000..1a12fe40ae301e9bb28c162c4792dd76ae010153 GIT binary patch literal 615 zcmV-t0+{`YP)ttlxqQ<|_a zC1oKiBuP??KfzwCmBlpduptXCGZf7XqsCCrV{y;ZbLYDE$!JcUPWOA>e&?Lu{T-%9 zoxw9gOK=${ zg4g(3=_7;{N_E(}*?lD-JJy{KgD3i&dFuf*8~eltf+lB>2eNB2rH z$PUad@c)e`Sb@zs`e!6JC9l6-VKiQ#ui{(S94yf9D`9oP=_W$97U+pVMkRUFR#G2y zmTEstku%9D;VXKu6pJK(^$04ZQ07rNXAGNX&MN5F-p&)k&qiPFNK$}2~QhTKP@U_NWFp~^%fJ^2k|z= zk3!d-!PDFwHgm86{gM}WeJybMY3;&;)OSVF+jcz9IrT4W#rp`Dy^R&T$vWLJb%+PT z@r%C)d;{AgOR4A*jAj!w;daWPKk%D5&WGeLqAcgq5qy?B1@p1S)Rp;D(z?F?O#lmV zPJMawrkwf$Yl}k^1s`jaAdfn+CxdlFwRtOb_aE?U;PJ8Ll%oIu002ovPDHLkV1kz} B8IS+~ literal 0 HcmV?d00001 diff --git a/Wino.Mail.WinUI/Assets/NotificationIcons/calendar-join.theme-light.scale-200.png b/Wino.Mail.WinUI/Assets/NotificationIcons/calendar-join.theme-light.scale-200.png new file mode 100644 index 0000000000000000000000000000000000000000..1905dfb0807d2051749dc39ee9ebd99fd07dfc65 GIT binary patch literal 817 zcmV-11J3-3P)zC+RL7in@iD zk|GE^6h>5bCaFpzPiQ+4Zs6!6FiIB!$} zw=4(ObbKW+?g?NVC{|9tj?DoBKt;aJHv>t>f!WqBk8>jjl+)sjKLhG=b-szkD@$_YkfaL*Fbk|x?q!cYsXl@j3>fZE{lSQHBYTy*FQ6X` zId4Of#y6>2IlVaq&};3MPd^8=`vMpaO!#1N9_A3hkj4KT;0zmrIW|?m1aQ|A*r?Ti z7vR{KwE8!Ih5)Y`_>{%gzsE9dS6h7-Dc~ovTe)5+Kadkq0+a?g8Q>ep%{EK;o1W4M zJ0l!d%oW@n;iQ3*1adSfyB=W`#0QZqMWddYtX9y?D zSvA%i;keRj1#{lfjUbTu0gmS3JQx7T=jdbp zsW#hHglwT}Xbf0E_B_cs0E1TK?w(}+uUV(Zkojv?juaY87JxxL3-9A8z}n&WX+<%JBSAJ00000NkvXXu0mjf32Ab) literal 0 HcmV?d00001 diff --git a/Wino.Mail.WinUI/Assets/NotificationIcons/calendar-join.theme-light.scale-400.png b/Wino.Mail.WinUI/Assets/NotificationIcons/calendar-join.theme-light.scale-400.png new file mode 100644 index 0000000000000000000000000000000000000000..3be418e30ab2ad22d4a67a3ddad662a866d778b9 GIT binary patch literal 1681 zcmV;C25$L@P))gcMG%z`^pF%$8Kh%qO81LtUZHWCyECVUJ>Q&t_F4No`|_O` zGXJn1&OU3cZ>{z1%i3%25B}$<=*MS|1Lgxc;3MGAezc`5s04;s{(AsuK{=lTnt|mO z-dbQ_=GK)FmjbT>`;Y_h6nV!@dP3l@2EGAa1g4h3-pp`4u#>zq%LJa=fNtyo=mu^P zfp#^p2o!oullNQ66hp;$iSC zL$(H$<%I^I8MWHznC&5dU##a+6qibbMUN`|AwHt zV0D@T4cmcEqiv3(Y#Pk0uO0Z(QML*-1V`8y(gN@taFOGKuoz_yi4aI>?{*LQ3sAmz zp$?U0`E=E}hK`Xym!}Six+s2wa{_cYCrTBlJlogMQHGvtGjKkk*@o`X0XlXd^mu6q z%*Vg$9z><7I?RM92IfR|w1<2!9k{`4lmf8AQ!zk;(3WKYCJSxf1?X96HkbjZBW$m| zUuerR0F#8ay#ab=q0;GIn0xjP)Mm#Q-wJI{Q=H3(qD^Sqj4F=!q9xLnGdP3O3HrIf zaMCkF8*;$kMq3r`DYPqEDV__)6Lz-I2^`QHDu5=!l9VRl0jmOarP0H}a~cD6o$T?s z_l=Lkeuz;DtwP(dKwW8&3ZIREx`xtIb4&u@v*|G*1)wrQpAAv~q-VQg0^|cQIzo|T zL{{s+4rxy5h|qTqGT0ECWz=-(mGZsBzq8p9wTfRN=cLATJB zi_m9-WMlH22H-)|xUNJ6s}`7ns%D!z)n0vx(wO|%tOJ7m&BQ?J?oGfQs1xbUs1u@u zuLX5x`516v&;L69f&6AjTFYHASZM3304zkU>7{TI)kAgxuc2Oi6Xbiq!3e{o9w6=B zVj%@Ucm6uyLsWO~0DeIo-kz`VypBrJ0RGYyO&~l&`&}?>V}w2%*$SHjfj3g*nt@w2 z{sF+(z*tj>YyDqJD@{CFh5$&ZFsP&SQnDSWdkhJ#LfAv>2sEsl;$d)a83M3GaDF20 zmFL}pe8JKZQe6QR$+L~NBZ0coa9n7+3-=|wu7?Vs3x6D7R08ud!{G>BHb~d#q*`Gb zium=K;HRilln@*;e(#OYWy1lX%{PJjPhGcjLE4QGiR$~u%<^F-?#};#S^`fyyoXx= z7D>X=n5ek9T0t?FFT!K=E3e!+2vP+5U1gcwhX>ALD z55i0X;1S???ROop6t#Pe`Pic!<<}M$X8o#qDVkx(Rug_r?gt7tSk!Z}1XXL7X6D5L|H~dmZ8T(EC*eK~K!VArHC0!-hvKd0DBM1pI!5u$(5V?aooN6P z%mqHt6q|DasPc50F#jO*;m(;eXJ+nP_@_k~s15)tz%=j*Tt-A) zT?Lj?S|cLrm6GH+;0Blnnm_`Kq~R;z99RP0$|{elZFQkj%j&k;C>=pP0v;n`H-jw# zLqH1C+ds3qt^VkTA9GJ+Ly!D)u!6tX{;={@GxqUR@_hhy$M7W%L-kj7RNECRto67@yRXW@h_kKNV96d4$H_uMmQ&Yiux@Q)+i zMo@czCqO%}mr^x}z?ai4Cad>bpCP<9)d7E+Z|eD>-;pf52Jk)4;h1WH`;TfveWf-VDco|I z;6ZHnQXLL#HO^^u!2-VOSQe`_ak_!?y9xqlQB&CQlR96);hefrwD>HJ!B7Rk=TS5G z2g|;#k+?2a7$bndDDVX`e;c(8cnv(rkSButA)aS}ZD2ja`3Wqilp43U*1`C4W+E@t nfhzX%M5okxFW@CKRuo00000NkvXXu0mjfcuL7# literal 0 HcmV?d00001 diff --git a/Wino.Mail.WinUI/Assets/NotificationIcons/calendar-snooze.theme-dark.scale-150.png b/Wino.Mail.WinUI/Assets/NotificationIcons/calendar-snooze.theme-dark.scale-150.png new file mode 100644 index 0000000000000000000000000000000000000000..f9968a2b94b126fa1091f22b619b894845be8af3 GIT binary patch literal 495 zcmVa03NFFK4KT_XcG>oym!YSIy3Cu-OUrGL&y089Fub0oFg`PIC zK7bIyNlDFXV2IXH9Ip~+=kTd&CcmAG;(HR`RHusk>_uyb5JKDC0C$1mVz6{XT_Rr_ zZ{xPQ+-YZZDK5W}BRz<-{cDyr1SVqbWRCPn{i$B31 z1RetSX+6&=o&)Q^$AmWqEEIU>K(k{@>T3M_q4?WXS37Q$5g1huk_&dAj@GHI_0~s` l8~k}1njwUvZp{9B_zev0k4sX%r#%1w002ovPDHLkV1mmA=8*sZ literal 0 HcmV?d00001 diff --git a/Wino.Mail.WinUI/Assets/NotificationIcons/calendar-snooze.theme-dark.scale-200.png b/Wino.Mail.WinUI/Assets/NotificationIcons/calendar-snooze.theme-dark.scale-200.png new file mode 100644 index 0000000000000000000000000000000000000000..7357261aab9595e5bd64aec0b79b990b9995b483 GIT binary patch literal 685 zcmV;e0#f~nP)> zC>$2f8z&V6)i8n{kdp{<(7>ETB@qsy7m;F!+DpF%ci%W(kN2MYs7bBK*^mEUYn^@m zz0W!DuOn2Gq~?GwU^B1;d;ngC5PlZL^#EIo(x*ZQ53A8dJ)quF=Us^}>cymZN=yL< z3vp{R3U302funI~377=l0N;RJKs(TzNE-t#0~=$%8)ySQ0ppe2^)_`PI-gaC)SW4D z&FcD9I9k-H$kAVkc%wQV6Q8LanUk0E+>9J|D^0u*6W^*WRf-=@)X4Tq5}V_aFRA;h z6kn%KMgu3)VoDWZAJ7Ec4fLKUOC0bILY5 zqIRf1Qs!pW-G%%$CAhod^?4buJwQM3G4>w;BR~WBEn1AlGP=L-Y$iJ1kRkSLjGb0@ zlqJssbwM>lTxTIx?W>D;g$AA$J>z$3dt$yz?OZKC(@|Uovqk+J`J=jkQQ#}Er6Sg> zE0BRlbz!yn^40i;bNlKT_*~9^e%4I)so~3(E|oyg=%O zSH*g1E6_^52%A#;1>i(%Ujx3!b`CfW2waKRV$1`>A%uyND^L#Rk6P8<#8__}dr=d4 zMgv1p?0qcQf!J0(_csjW)O#t<_m0|7DPOgJMgcek?2SWDfRPYF&F_x?`0MxuhKH7F T^JMWn00000NkvXXu0mjfsW>JS literal 0 HcmV?d00001 diff --git a/Wino.Mail.WinUI/Assets/NotificationIcons/calendar-snooze.theme-dark.scale-400.png b/Wino.Mail.WinUI/Assets/NotificationIcons/calendar-snooze.theme-dark.scale-400.png new file mode 100644 index 0000000000000000000000000000000000000000..0ad818e13f6ac64f28ce5d84d1987efee6b2dbd7 GIT binary patch literal 1304 zcmV+z1?T#SP)l zm2^=k=*_o!u!kOml0q|U`#W`fJKseBwZtEuB1*$W0Hm?oso1x z(jjBa**bBIq(>#)m_=4nzoebU7z&#&3a}E`3LGaJW5B1t^FU`x%uN|%xjfVCir)hC z6)@_uKPC1{1!BF~tcuSEb~jk@Nxo0fSPh)Z8Eb7)thT_F@0IkH?DL((U$W2Rmy%9N z8j;j4=?X~;B;6qCddJsmNkNP;{lImSZj*G8_xDmsTfE=)7-J6PsY`BvjllVo*6#!E z2QJPK=Mvy{U`;_E?|Rz9!2BYy@`yg3Qt?B;>ZsyVeLR@pVMA=ud$2vX%NX!1Fe9q? zR3BZyY5&fPExH&u>xrHN)`xCDG`lzDGK5hjjJTFhj7G0n4ylsvu zn(SjX@U7?LFfcQ=@KI0neQb)_RInMN%RksxWK_|0p6Get>Zqd0K2}sJ?DAZm7)2AI zhrQ!n#+dJl1ghLMH%q!I<&-f={l=J+Ubz{Pc4%rMG$3hf5g(ZW<^X?qt=`i>yzL2n ziO(oD%XG^<;hi&4xih=G&!vsmda7`*Cw#oYcz$E1vBxR1i0apGExrI2Cg~SRRQ#*` zPJtLMSs$GN=lf>$TwK+=oO@$3RR zVP1>C5%2a2_R7J&)4%rO{|&74&RYU}Rp+)J1%9i14gy61wjJa*xM2+lA6(B zM~+=&7-a?n81f9x3KaJas?*s%N=UA10*ts01I6qFe)1|m1Y8*+eo!JcfIo#c0o)xT zc5p&B0Ps-4b3e|19oVnHd)O)U@`=y@S*OciO)0+=cm;Twlw_wCK_^8cGn(@IUP(7q zzIRLNO*t2fG03@<FcpfK!YeNLy;sqWArsXISySvO~ zN4+w2I||@4N$xI>6OxV=w;7cclH99)#u!s`drX!q+3p=Lt92L6o`)Sq+LZ$YxLmoBggz26QbJ zgVl6r{sDtY8Kh)*GrK0MFu23}sK?v$-uL2Lr=Iic`+Yj+@K5xW#D}nnd3@joEo@;u z)Lfv|pJ-mhBbIQ73}Yd8i%YEHGo?I^HkP~mdN-&iaf`03tI>?uvDB*)#;}M#*u@w0z>|uk z=fUk~81`TrC)hw64snJ{e9NlvRaB6L*+_hyQAkzf8Gen}FAN5^BK7j046{&*oLdws z1nttu)QTVO8JTrym}|uxHme0+NMkTihvCb}Dc%s}Uu!7ti**>1`Z$a|?*46>@D@+Y zxbYCr#PdgNVXaJaF75JVEpIPMoAV*AYiZXXgg4TLY-8e~W{;1*&GJXmLue2Z00000 LNkvXXu0mjfCQrGx literal 0 HcmV?d00001 diff --git a/Wino.Mail.WinUI/Assets/NotificationIcons/calendar-snooze.theme-light.scale-150.png b/Wino.Mail.WinUI/Assets/NotificationIcons/calendar-snooze.theme-light.scale-150.png new file mode 100644 index 0000000000000000000000000000000000000000..daebf99b231d92b73da00eeaa2217a9359e7dab4 GIT binary patch literal 459 zcmV;+0W|)JP)5|BVDN%~mW zq!4U0MM64@{DWYljg4TT!30tm#6~6Hs*NCiG&VM(Db88;?z;EGB~9>!Q{0(%-kCG! zoVnZwJjDz)aEc3T;zNS7g`33Mt2sJz#3%3tWvt;Bt}uYX1n)Cm;2B=ycah3J#%dPP zTYz7}D$dc9M;^j8zQ({Jcoz$LTZH@ryLeDgyj!SzrAR@QSjqbo|F-&J9z@%>_&twL z7|%*D7Ri+q{~IhM1Yuv}E!xdWFd0b?Q~Zx&<%f8jB?KKUY&GG_l$bg630H9_FF`9z z2|Gx`AN5x3B<$P58)!h@Lu-Y!vw4pGW@A>1+Cgq?Noc|MHpJJ2!!Ku%Mugtp>SY1E zim_u^q-7kTtBnL@RI#2#+SB-8+F8d*!RA{uieb0=I4k@QmJ+-{OgHhag?V&m{1mp| z7gsgf{uy54M7<3s(Uyy%vmTzPkA@YT-68fr#$VJ_V%>*(s#X91002ovPDHLkV1n2J B%c}qY literal 0 HcmV?d00001 diff --git a/Wino.Mail.WinUI/Assets/NotificationIcons/calendar-snooze.theme-light.scale-200.png b/Wino.Mail.WinUI/Assets/NotificationIcons/calendar-snooze.theme-light.scale-200.png new file mode 100644 index 0000000000000000000000000000000000000000..3498f1429c0e2b6c61593998d879958d9387e699 GIT binary patch literal 636 zcmV-?0)zdDP)>aM=^lKx|V;q%4`-r0n=SiDt>(A=A6X)s# zCh#2BFpMWcChpg9X5$2gVtW?3Z_t&+`I6|Mf>9j8@)Wx+%x$2tP)L0R+p;*Hg?o|s z0IRZ)>u@$|T*^v37>O^1x5$IdYI|g97Gjr>@=0vS>3j}e!~k|@CGU#F%T4U|scp0& zVdHhixx-Q824-Xp;6fyCZ({e>pT}&AuwTBX%#EVEO8#3^<@o!sNdUdV&VC*H*Kq~y z_?lur(ZugBd=Mg@*MjZ-X!{<^S`lvrpQC6qtgf@&T9orF0o?Wb8jql-ZoV9YOvTJ8 z1X#srqF)k@ZWTB21&gu@x0-=ws6?$)WImhIg_S}Y#|qH;6t%k3CL3j7Kqywu6cE7a zsI|9MLWkNNu%>_jdW6eoOpA5EfZF|C6o#Ybf#gJ5O?U@uaZ zIRcn3l;{1z=XM>A2?gm9+{&Su2_>OQO0MrkIbJC5KchBm!ur_1Eu5Glz8(KDz4!@7 WF{_XBm;~?u0000~AS literal 0 HcmV?d00001 diff --git a/Wino.Mail.WinUI/Assets/NotificationIcons/calendar-snooze.theme-light.scale-400.png b/Wino.Mail.WinUI/Assets/NotificationIcons/calendar-snooze.theme-light.scale-400.png new file mode 100644 index 0000000000000000000000000000000000000000..0bd4607d82eedba0f25c7d532b4b0f6b3f296c89 GIT binary patch literal 1221 zcmV;$1UmbPP)^Q|80p$DO)5Q?BeO?(id5V{bBq?TPMEToGimZD{p6&;V-!#d)gwfEfiS$pQB z^MwVoXJ-F@|F!nI{P%w?di3bg<20tP!+J9?AD3V&s-eeO7y<0G*A)CTeOuek0q~J6RyMN5{_oeraHEtEn(}`#PzGo z`B+!N!J_hA9gQn-xJ_HP78x2djEWYq5U&a2yNJJq@%TCR;t=|A9;V_dT#@nXr8;(Y z;4<8RGos&SVP*8)dc4(Q9ZItdM-;dIX55K0Td*?$H)26aKi-VA4+_1qQXW)X@hw7k z?G$$x_^`BU(Z#~d9na*CV^r1R875($e9xIldht`CMG3&>_!V+02iz3k@ zxVUQ30_F-8&ie91I|j-ILia}3Yw>MKTYb0|7u5NEPzZc}ioPF(HEIK)ox*!ZrHsd) zYFmB&Fzl_CpG)F0AVis29*X{ROz4@DqH^{yd@E#OB)n^w_Tt8@SJr3lnIXUYHY%TC zdXadUKqY?KZp8+pPL`c` zCUZTmgif+$ahuxim2$}$hp!_0{|HHyEEnPnjl2B-ej6%VaZxHK|Xla?crUITR7f&Uwmh1qzd z&H)3M($3B8_JC!=Ufv15Zu9;s$mR+9@o-f_V}!h1w#AoMCDsPk9 zURUd5vI7xQguGnV_#LT?CuD(qPT|rNhF3<0_ZYcvk=xb!x~AC;txOc3s6FMeTi6&K ziOf~|)DLKKJf@W=*&kic)`5cuiHLpA(Mlw^Hi0AEVqFR&qlJ{yQLUw}MoQVJh5dqd zf`w^9$|*jV*N8E~a+K9sieKvde>z^tTpt$>I1aXi`?nR_X)AJ+BY%MgL7QhP%yT`SH0*?UveD#ruNYIBr)7@5@(ipD-FNqVKIi8=kMmgH$8jE~n@0}q zTe;$o6$qh~2lnqhijWBWUlFuyDf|;IuYLvo!BLLx+l^k-;rp>y9=j}eA(S60Ht(_o zelPdgZ%08$q5}IbuFCt_X@uNe5A5A_JmBPTyXb3;Ry&2CB?li}+rHZ_Cua9|!dwm7Zn)kyqWoVzhtF(i((zG83gJPE=1(q|06dVSi_`$o51H)VlM%she+aU)EY%7V${*e`zy zKG`N34|%E>GzN#CT*D;FS7^Fh|eH6(3Mwo4HFxfLUH*-ZbY)1uky&k-l$7sO=BO+CeH^-dq3NI>1tF`AY zG+NEu;yF6v6|~f05#*%=g86pinn3igF}wVq0;;8?`M<$}IMs6U+Uo-E24MuNY^Z!I zkj_Yy<$E*xT~-Eh!~bBf5t$#&6h#B85jtW|m^V?0s*k=VXiQOPdd3U0Tq8KU_Byv^ z0+|{KA#^b6n!w|)v2d6r%TiKiqJy@MEdT=iy@Sw03E;&Oc+>D0=8x@|IAXq7)Sb5qpW zvG5{GNxT!rBa4l!W^8_W?DbzTu}PHot!n}Y&!EolzyN8soMgplc8UVB)rAd2%ZU}v zvB$!z-U@UWVy~3za=14sgXY}<2mElXO&|!{m%extV^~2jYANaI%v~t93i+TVZo=rt zQF~W`BJR&0W$uXb1|Bk7Cs-qs9pTDR^@`WKu3JhXLL|tDebcOkdAsLk{&e^ezc(F~ z#k|Kvp0Pm;txgl!UfpO8|Kp2i?u=5go2RG-ju>sNH$%4K2C(#1ThFrdYdA8|x&AE^ ztggup!Ir4{KdyIe(=$R^&LAK6ZL)&c*lPm+)6(uwd3^l}tq>1g94Q{QUTY7W(UTR> z;w=+%I_7vQD@OZUMX0SnvX*)NX!yl7CTpVw{y_3P%&Qf3SmAotI^as8q$Ey+(;h1WOkxRl!JBZg4HDzQw( zD0YJ&-O{$SV@_ZoUZLV9jU)~t#CpSiD=@a2KTY79kQ#&sKVy1od~WUa1W=VuEg%~yS`6yJ9!RcZf;y}DLwH#Mz5Qa0;86NF@{s}_ zNNl3r;~V4@?(+&Fwf}My$a^nCokw8Gp>|@7q8xkTZ$XK7(8KG7eNXj7EI2sSq7HHo zmJy>JzG?O;_O$fDS*mP!ui{%?+ z4LM1c8!R|C`%CUxqL!^Nm4TdC>bB@>bw#J8U*GO8(GK0mSdI)D7$VfP_iRD4n=~=D zV=e)dZW8#PBMmB}Q#{OZ=6Br);yM$>D~jBu(JPEehbp_ngF0!!{I0|xZY-$KP3!|q z$1deh(@swIofY`(F5?}RzuqMZOE_!EXmD9dlK%N(Ov%3|nPqK4~UT zH7u+_=v8Nh1DSc}5+cd~y$;$jJ*P6J7i{Tmry7J)ZMX|ER;Ayx#KT{KO5a}(bW2CG z1)CpFFOLpyc`<)zVQ*L!>O2lCNIl36{c5SJ!O!iOK;Is4a%k_lf1uPvQ1W9p%|66d z3HAE6iujRcV=Os^oBdHfOZtYNyi&i$CCm=pMlYuJiKO)tJq zpt+{taQ8J_U}Lnd5%Td($03&Q!b7$R-X=^m+^0c^ngI;-Io(4HJ4P@xR!w2yEII6c zgCtAzTD1t?Y{~yLebv@y-bXhg>1SDZx0bkIXA1H;396u}CcE}T<=D%nub~BEi8rUc z%6F8fc*|5>YF&c*zRUg|z;PLq9N!VD_mq1E2rLBx9X}Cc1ReyfHlC!8Zs@+J+;i|E zwM_`I0@;_lL~GMs1jirB!x=x^&Jhcy8aE|2p{48m3$ojjgRQk$aQV zc(HWTfPu82ga;n>*`X?HUqjs(|5!o$zP%r6E4c&h*Ifb*!d3{NL;l-idKB4jN75J{ zaO~Y9Y^!-Me8Xdb|0ye8(J_HzW$~{cR;BwCj%^raJ*QPfjsJM=`=XTcpO1^A#s1kA zZPwQ8cE4ge+LmRswOSw>{n~_cQDaZ4N$kz;vTpqBdsWVer;6yRzE25NGvi=72$s#2 zjxH*?aqXM4$9#(^Zd$w-p3`?hXn1wsqMJTL0#Z((NU!8Ph|Y?R8I? zACwUr{P=5YLQB|A*>l_kOFyns!{u=JZp@*z=%BCHLbfV@c+IlCfy{!mA;(l_rmlF! zoQE{E8&i21v6qK$vs-y?_vNF^S}!^aiVp1~)SV1`Rd9n?uX(duEOT?6UcFe$6(Yx2 zqpkql2D%2zCCV=IzuA+NzoCRs(h^ZECNN08OobsP#`m|a5gD=xc~>7*9}x7Uhg={= zeSDpOQzghQb9NbH8Z^8$iP;uC@Fag!aD5U#-9?RIq;jmuZfo8~a49m92EiomUq3H)tdv$rzq&&}3m)@zou-s?9o z4s9-2ZffO+&>G#C9s~B<&RE6=*~(3Wy;dQ<1b61ChKd7~#WVU=A*WJlxkddh>$~Se z`iOe8WJ?s4FN_|(+E#y0;|9C&{^J1YXhB0w{ix+H9k<|+KHQ1|c>T;5&nYXMDrx<` z#`W&(HY-D8*&LHs{VplpjtecSIFD;BICP}B&*Q_^O4oBM ztU5Zn!~K61gwD;=^^G{8)W<^zsjA8z<^I7wrmJyC&A7@tmi?Ulufpw~>GL^-f;*On zMtsNg`Ma8Ms&9c0mtDKg;V!Khn<@J2hL%Vo873>u$%er^HwRF$Jw5i2{J)|MK6R zPnsRG)w1NxIm|1zOc*4F$u)4dln{-Zg{ZC=p{MaxdY(B(n^W+62s^@6Wm9RXmhM~X z1{H6O&)#Qz(5?(z_({waKy;#~g0u@mg5qK1z4EH=@bXN~#|eXK<*J@!bmRuSG^-Tq zAF(RcikV9r?%dx^nLC`%dTAYmgP46dr?CE`^1ktVL#1e-IJe>JPHhY(e+EBnCtfu*eLY?>vr#PhU0WYC}rfG3mt zv(Y!M)z`nM@&LWTWj#UzVQ;fr_|{~r6ru1naK_soiwHjdyza&fBGmddE5aJ?)roEMBo5yqOHx zBIz2$)K{{CzR9z)g75mHXH#U0b~+hklK1Q4Y*#_({Im6KutXUT!x0{>f4}Z`Osu=< zc_H}4Mx+h_k17*o_K~)4%r8au{B@^O_%P@wPpi=>kYKHNy#$fmTp!IT*eS6+ zetnb`q}E^bvgq5dd*Fo<8r%#Vqw#9*Nku1;?a9u`mc*z1_@ufxPezwL@IeSsC&x~d ze4As~ww37)`Wy<332DtVyP$!yT?a%&-RhZ^&A(H;Bc&IlutU7!K4ZDujx_ZK{rew( zWs*N!w1n`Wz5&*dbMW)#nz%3D*PB{w)Vzi&1F(S}tx@uv$Ik%tabCA;eVbCO?dg)Mp+tL06={uX#QJpAbG2`t-?=5 z3mg_+vQ1Rt`sxmQ+ZS3kKj{B@&l1TV0%@<-J`nC{Qxjd^{jFeyN;f`8zFC$!DFrk{ z9tgU@uD%b6YKG_An-+baE^4|J{0VR4e!rc)&TM07)IC{=J;JO==4Y9tZ)sMcU&4^u zR^uxs>#uhW7c74Y`bm4o%bE}(mY>MIUEew4d#iN`Yd1!nkoK-{&q;RpY!bo6p_+EA zq0sH0cc-PPO8`dFE55ng*%JW%dB#x&Y+h*pW>=)%M+UuPj{DAaIH~n&&U?xLPdDdF zweu;|WD47n@V@8fW|E@hY0YidM9pid){B&Zuh7pajPxkTie!6?&eJQJCOQ=VV2|tO zBzNlsjA)6+zE?(KfPh$U0RXPd+QvWS`%7I`FjRff%d*c_*F5=!c0-|Z3L-oJ?Azt) z>O~$&(lJR;8ag;bsV!Vent_ll)*P(2)r9gxl5y2(Yj{j?6C%)H^h^h_=ANt7uOXMU z>FJg&H~aA^b%mZb*0c7)c}qc!db9bXCgBSn&RH~aWA08AjX4ox92$xQcxwinz-F1+ z10d>gApvI#VaxkmPPB}1U5K#L*cujwL&4Syso7!h!JqH}!)QZIR(g`skohF##q3T| z(r4gBjg8;-j$lEb%Ub>kU6*Z{6t6#d47`@K!)68?PkLid7D6pd zM&HRXvIMIeytXWzr-`Tw>T`H%H_*VwMmqFVeA2-_&E5&uyFwU}Tj@0Q9F2zA*L5vyc(%@*jvE0nb~j54}6JaTDs?5Je0AFD1tb zyGJ^9>#AQ6L$Ebjs;*NoW`_{0;s;;Y#e)}6FIWM*Ya1-%Xk;V8Ehtk_H>;PAFI(gp z)J3T91VS4a7(%8vNChBLn_~ZqmcT4%F)+eEYc^m%s6xQX|HDTQ-98)y+@Wk$O2#L= z8@oZMZ*m~>Vxjh;`ZtdcU`Hipz1OirRf^&jqdY6dQ6bF53ckJT=I`l_UU+0xe#uW5 zGKwSgjeNBxDdyT<%n#HIxhshv^;OQFO7@NIvGclO^YJ!=c1uSp?-MM$e=bWc@J z&6Fl2Mkwz@zVb|k?fno7e0{a1tSQRdP~0m}={EOkg|ZW5`$61>Zb3%->OB0O_*zG( z2yBmfYC8|xq}(Cje_CnZ%Q+vEXn|darW7R$V;q1qIPPK^+ z2oflMztwz#CG4B@iXTcI4lbw@Uyj^80a4xVK0BuL&mguQDLsgrd$T*|y32Hlr6lE) z`An&0Zgbu=ymH^xta-TYW#VQW%L0V7b8JaatS1P&w&UgXq^9kyr`_9xwDyc$o8fdv zj}Jlyf@~jj%*{zujIM7ztt^6cq@5pZjCoqrq!5QOCVDkFIsDenkL%gm?s7VvvecxT z+p7BnTskYwr3lAx};$rkk4V;_*U za?WS&Jfxe1gAcZpoj~FXrvV$vI^)aWg#9ak$vXy<2Y%ULK31@j6Q1lFD!tH9vC;OTf^8Ts zEVKbQWc$RqXxhXO$1j+a2HY=40Uzi%JX+5-URAa`Ls6eCdH+6H@f`-ao^*ZGREZh=`mX!=?L z6)Hq(0_-RX>f@-Jv<|oUDn6(1soUbKAg(t+Tu954u&*qgQ>TTDj4>4}*qP%*;P+V~ zEee>IYsg)wX~1L3#FK`vN`tiz9FVLlzDhE-d!Id-2lX7N@0{c=^qd+KWVD`sCxXPb z8%b}75`47}&W3s_V!1%UInXNPB7q<7-B8iC9LXw|pXS{1jeA`mnVN~#{!8_dB-R%T^LX`wKz-=AEJ=0&BzRI1( zl>1QS*PiCb)5*5eCYKgnpbZIMwa-j@3656U58`Zzv7Hu#t~m^~_rvFdY}Ig!P_RYS zcxQ~{xg4W;PZgMCIS_jI@pP;0boh8?Bt&ldzr>hWa!x2IfO<&s|gB`B8VaBh?2snh-v)D%$O_vTm zw!m}!EYQPZ2Fj#%-lJLGS_XzM!+U#Ulxp zwy7JVw?b;hb(T2WEOg*ozHL}}*L*{*(@b=^rZZe3JkR|xsl}vECD}o4VXv0JY zgaTGwVG~4hfCqUOHQ%lWB_;I*aU1mjDX=xYX|Z7<@F#Tc3ZYbVOB}y19I)3gcx}kB{n)(84zM; zgF~;p@Kx#s_VL9k<|>FZ=Gqk;YLh*Vhs6^Pas=LWAO2W|Y=wEQ*VaA&#Z274}ZOj##kPGI-jL>T=9NyDH#-uKBM>*(R0-qVJ{)oZ}k@UevBeq?CguWYr(Z+dirhk`cAg z=Wx^YJ|M`U*`6XWp;NI(R==t4l%eJc38AL9W`P(_J)O8^vl3J?{sVC0j4&YiWioYI&7N zo}}AcYEE>8Tr1Dk59O`!-4$jDdCS<0m)#OXEKGE8jBjKR_;zAAl)dUoLqUPPeTc*f zcNx_AudA2UERH%h?o6|`1bV!b#M5!;kkXGe zPl^Op^@1<-w`!m+>m6S17PmP80`1&UibFPg5$o&g{ocpJZ6#5jyaHMVrb{~S__v6vyR6EihUGAx_ixO0WA7XN z>aunON`lnQ(Seoi83DbS*2l!`t~KVtPNH@VzN5#>oN97n0JQ||1humJT4DSIcNrTq z#Ikova68*WjPLkI6wVs-5Nickrn=nlC;O7^*$7p2tweddVHeeA!4(i&sP`cb+w6z$ ziqAxLU@?IRsEc$BXpD=Vx_$!Syb2gB{SFwO2dbbU-29jL$?`tLx(m^xG<#X`~ZQ~lsdyM0o5$U6$=msc6+<`avYoh4wLD)b}Q*t!#oeVfs$K$n+FjYT@ zSm!1?oJ#c!MWhgsk+=s^b9E*7+ObqG>*+LNje!;X_W>l8C?;dJ?G653<7$*=pN`90 zMZ1D+mXT;+NX)i&N>QT6@EjQDj7}HQr>RE(u2mxQZ$bLwutfO}g zEwaC5Go~!NwEfjW1>y7a;B@HsfJr6B0LL`z)*})dc$gL)09pJhF!t9{-cS(&)AQ5p zepKk^2Ci4L5)?)o6sT{LLJ+qD+$;VX_;y#2PMw+Ij$Fu;V&47lA&Z-MHk*CrqrBZt zu+S!Z$|?@#gXLr>PlMeHvpn3EXKz8IMpvm|Gn?$}FcU@OvkHLFhHN)D&#VU91WuN9 z%uyKj0HPjY9*FiOTjRY@qO2S&a9lgi(Ku80 zegH@?GFUv0M|IhSQ#a@~y>C9#(-E~1Dlf%$IWJ~k86)a=lzxvGsDl!Ec(r5hwp|X? zUr}f3J6}TCg2|64jM?Df)zahK?4YKE`O6q^G?0QGxfUG+9KQ$3(-yC{n2u)oSaAYQ zg9R5ssRWYHhb!bJ!5TIJ`Tyg|N=aaM9a{oRT}@>)2OjZ8FvptqvMGzB9B@89@0<|I zl0u%CZ%wUPU=W@c+VF2%{R{J5by<5dy>S5B}Er81!lfq`C*0uB*@rSlNkr*w@zNoQdQOKW=P$uZD5{Xb=}%IoA2%(?pDUq9}o< zR3x~`90YEDEGVE`z$a~wXV;?_A673uE3|_RmiU7PV?1Alj@*t8`B}y>$wsCwIfYoP zU%Ax`neNp5^@taC)&@s?>w0JdqV5(!$9pz0F=uLezLB=_wAcQvz*FD5oY4)Yh;+d& z-r6Za>A@$))z$BOOHYt<=Ce^SR}i@NdVP)Z(B4!JjTp(8feGsK$iA_>Z~s2k{yF1o zxUD>)K34GUd05TZ1L8ix#)Gzhuk|+8iqgB)Lvz{cm&pH7t;Rd<8$^c4_?*W zk=}T(yNc-%(svS$-a!<-#}$7nkFA=&Anw=jR{WJ(T@JK3?6OL$%ax3|wqR7xkCeV4 z2be`0@IU)Zbm|t;u4eg;Fx8?sH+mww+XTf0X?aS%{BpC@ zlJK;T7rN&r>C-2j(k)fr=%8mmTkULY7SfoW2P_m6*Hy(n@HX=X9Xe5*nDFK~XnfH7g`XQH_H~?Z zpxBOa1Ikp(H}aiKJ_j=gGv#7(W+f11cQuf9$l`(H(4Iv+7PCe655;xSG5ukEcI~@Y z3(|wD#>ivbxo1O{bCTNJTl>R@}RcP;?izPmDgt>b;H z^3m)A+cWdWbv?H7Lrqo*>gwMsd$KPcvh1^2d=xueCUBW|FwrXMe5R1(X00G@sV{`8 z*Fk>_-9`mAJ^}gT=#tOk)l-9w!@s}q07-xl+1}e z5vLAKm(q8y6G8_E$~cLQ)uk)$L`ShJnX${ei##Z+x;b-`V_ZJtf0fE9+L_$!aazWW z@$X##OMYD5R-^V{6MCrTP(Fk@H@RMz=I19)r+aE1oG)Q&@)u}Hmc;n}wxqg8o|-Y^ zw9UVesp@`YYTfK+mxOt7c16lxV;Lz;+u56bmUQ<`|MYx&*P^fX;>c-AeyRW;aRTk$ z1wKG6{B!JwE{Hot4Z*bZi%`doF(fq<8-4i{g(re#Qk-bO zF;AAkhnlmHNQfCr3VpZnH8$KBHFw@Vd%}85=MUcNG((m0a}D-8`%H?YDUSwNMWprXL;s09iOUVEMQLHQb+*Hr{3bRDgZCF(sMlWIpY$(@`uC8(6o)kn?L4_q-J${C<%wN2Y3(Wc71qntJN^M|FG+iKO=)`oJa zf-T?!9)mL54CfmAuZ}KPFF1H!5#oems?u@ny+syBNEJPVdQDvM^sx@e-#yiXhdJ!Z z`ryF%Hg2kARB~NJzvFv%SpDdvJZe6@ycfck1(I^z6mZt&d4Ep<{hjl!nTG`R3w-GE zSOdYI{==GDq`II$sy;7ZURxric+btOE*#iXe?@DnIWl#FgrFX$dJbR3^U5iMwD2Zv z?qhdfc(muy+KCccU4&V+kdfXXCs^q%^lXshW*2vY)YJ>^TUFzS zDX;F_0jyy%`$!C;eu04K1_9C3DfR;+OVs^h2Pu@Aw3aM2dYI;nLp0dvQaQ=lD~{z)7?DdY&UrV ztw5@l$n;V#NBEolxGXhUA;ry2HsaDu`L4 z`6q=f&w}wtBhTXkGBh3@S!gvG8#gh?J^~2#%XODg%@(OEkM!Vhp?b2Trheg69p#kG zBRFj6Ws|1cAorj}04A`}d^h*S8{MFBroyYG5jFUYGFI+m4tOJnK2t#z_A2L)bLSG8)Y?L7> z!bpR6Y9^{Ln-mhQu@l$SqQytsRiXWmdmkP-Wif}V93?L!q$|Dx*t{Ik_j4B*beqW` z!Xv2mTm{u2_1uM&W$STlaRU4E8OgCE``P)fdiwX zWJ@Fkr6!KFI3gbl_2i|h>=#1&a|#C;_U%t#2kKIkR8hCWzg^aPy;pmn0-dyg_Z~D> zA7rY7kf1AL&b{#O#BXJUY*Q%!!L6HqKo*dv3@HTGM^&T(%!G7pu}1Ma4k5343Iep8 zrwnZ}ML^Z?x-HnxKg#?K5Y+(`XR2CqbxvWhhYYeU$CAyjga`nT-|nxD^u?PqHJ2fq z@1Ph#e(~6H=U+C7p!Km(0J42GfTM~UR-A{PMqPWd;NBuAhXdQ9;(a#eaKik=ZVAY1 zkaN^+ zmSxs|Jm-d)389i0BUy9qfOh0~b2w2Fbk%w0O~ztMOzj;7ZU};kHuM}n z;dD!n%Sqy{jsx3fT5+K3{`DXk@dP)!qqR=eCRNMpK#F~zF+l{#Y(Ru)dBoC(of*20 z{_M(xqAzV%{{bkket1dQ_Cre}rMI#^yk|#bjk1rZ5PGe(oB_qbytVo01%CyL%n+&D z1zGtI1%{3XR^f`TP)8Btpy$_Gah=w?QQj7C;GkQOaQe8MT+)&Ztd9o|kM%?Pxb%wN zU97{zXH2N0EA1&hP=a}_Wq=?`z=olX9P74xt@Z6a7;-wKfj@FC`fz}7))H(=IJkRC zk8cVt0x`&LkY!1}KX+hkTwrb!L4m!SRd(|r#~%7Zz)_Q+mih+6c%COY;&K}iHCo*y zF#ytR!fpspC+{oyD8M?)c=ysSVTKYCxMYJ5V71pbI_4(rG}MiSF=v!S&avj;z$&6) zc6RF_zaO_?GjQ4%<_2XTP4iAe*ply;)4Vl8tksV3fM|u5{a#BEfon|$KU#j!?i}z(@j!JrJ^!>vg=n1?Eeqgb~F;IS0?k&Pt)JBdQr$LHNV>Kx;gkd{fKcVmHrbPN!*Z}Xx%OT`#s z1=C$_vY$a4jIUs2h(y{KoN4W`|15NQ?eUYTjb8van8JS6-7K!Y0zqniUXW_NDEz%; zygo?07a93n;ZqfUxYcfn=5AQR!v`8_SopZGV}~i(%J?KGU%fAL^Kb$up{4l58P^gl zhghpXL2tOi$W(m_B-N~t2OT&mNYY6cL?T2C3C8W_* zW#T4m7=j%k%JGGbWnK+eH-nO{3Vb`%THndXR4Zdb0!f~`o&nmmirx7uxns_ zg{9QaDGTCKAiRF(?@&FX8cI$-f!>Z`YYd^hMv&m&6B5*p;2FIgZ+zkDTIj^JvZ;ag z6LoOB5$xCVH^4Pf3c{<^7S$oMV{V*bk5xWY)*~%ZZ3T{Awi2|S;32HW)R(!lxq6`J zs-X@i$sco)d@MlZ%91JigP0Ks-_(Z<*&pS?;bGMlL_HPt<}U>8jHq_kr0Dnx)R_q6 zhcvs}wPJo+^h6@x7IX-`^$1 zmMW(#D#+<-l{)RwAaH8ffi0j=?|sUtRH#;Gh9J_njR^nmZ-JDi z=r15%1PI!$@F(TREeEK+`DBTrX1C>dsGA=8YXE4E1KQ{MAW-ImBAymOC&2?nUW77^ zk%4*VTI^dPtPL4|v|k?O>@@g2pAZ}oZ^({=;#8;4K`uIzQ%1~YVG43Jh+B_Eh0zW- ze3dyIt_~fj-8HhV$EP(gWPbjYpkg_!^4-&D9Bo1^CAKIbOxP3zlIR1~Y~n^r#t1 znIlqomgp!pEyR{1eCSP z$$nfJsG{wI^aP%OK|DQXjD9Xg)x&Uj=z$&1EDo;Pa|Vdr0mN1TbW>ynhsLv(10OH` z{i(xD9L*gMYCE3;K5B9BKIHQoDwLdMUX3Fuf|e~yFA;eP=6UQ~PT6B#7)3YxA2ndyKG(Xj zPxN?cO3wO7mjE~22x-s^zXu)nYyv^Vb6PPyR~Ytj@(FoMAZ>{G#ru1*LlMgc<`m-G z0F1Oii16Gu6AbAhrurqDff&HO-@2Z^^r*vN#L%Hhy^%!n8`))uWbmSfvE2Z$kv|ko ziBP}yj5vWyhi(mO`*Y*EuQ=oY%+>f==6t`gI?LNqgzEG={4G9Sd%Y_V!gdyToMH7c z;SE3RAuIP;0VLe(2%eO}T)2T06I`6<^tToZs;>@u4A9_E}SgYS8Q#1~F6vd)JcgH>ER*sbTpS1N3&%P6*@O z@YqHBTvZ{e)96w}QpaY0^)yYNaux#5)N#p{B`8k`=uyB?m#;uWyCJZ4fGgVs-z~-` z3_?sjkZ3VFv+fl@Er;#m6*a+JJ?L%BhP?dM7Fm{?Fg4Mk9U!ARV>u?*SJ^?kHGn-D zfKzaGIdI?DH9OO zSq%=AVd$&B;8W;?gOd}x$zT~AoHTRMjp9Zz#tP2}cnz0sO5vo}8aBDrI*jdA`yBG5 zMSheII5cK4bJwC*(6|BT>_;(gBDBaC^@V?u*V4I-kl=&sz8`!%UWpy@wjhpF1I!KW zRkV>7ekBTUr$4Sd=SATU95oLdR*UhKI2Bo8mhOWvMB=umu6ShuyYzR8kHfHm&xJ>e`a2miz( zxPzLDC^j4%2IM~Ls>UY4jpL8qdJHDwair>$Id7Xbq%OT=QNM>F^-*3rAC<4Ioi!C`P=*|e7u;ZZN6k3P$ zP8VXPg@q7Uy3%nV&~C}A{V?llVgJd9!6-1BQ_yOn3Sb3at$38Q4~R5qEPCMt$j(Q+ zhiJnw>$5r70xjKOv60QoV5-yqG4aJ`{pca|2V;4^CF=Z{75Ni1$pBQlT{|F93Ic12 z9!lKv<^}M4pX+G3aduoF>;!*oQV)sbqO0;?Q!$mD!+Z#VsB_D~SQ-`#7m3)c9RP6- zq;db*BG$zwl|P%)-V)5zPqD^ww5k(+^S6o{EVU!EjKeRd!Bk$>hx2lw=0Ut{i#R&6 ztlWf;Q9}=}%7Y}mtix|uPByQ_vGON6au*Y(76@TOHdp{IREMk|{}G~nwZj8aB(T7t zSJAa0IDCOFgyi~gR8}2qATqhR#R8IO(7VrIX|-vjB5Wj9&&8nkDz?z;i#{D#c$HX= zNJWP4-vQL?eD8{LT#%&>NFKSK26RZYzVnL*pA_?A;x*h;qZF)I)RjdmiT~H00y4x~ z-Aa+Hhsfyh&&F(446Mw{@^&kM*xM-tc-ht_`@-OsA?UG%sBj*Y@v?z<#}6{seq()2(|PzGtg?~Wyrc(ci|FR9D@ zz+OuFB6O8^AfGjhc^Gy>Ixkp=3dtIv1kD#0NgWu8i;H_gZDz8=yUzW9_QP)=4!IM4 zqNcTRUQsh|Z^PX^NVw;${`?%X3*aA;lRDMgehL>t^Rzi#wPgtW!c@kr(RnPWCT&-z$J{>(9Aieywj6x=AtW^gRy5c3MwiVwFOKBk$Uct(-r|bO+99Ns zkE4oh#lptH`VVS(d*Jzfz`OC$pAkpwF@AGia2-UgZt3(U$e2i*S zTOJHrx$s;8VKLSx81t@!3=xcvbH@OqLm=&(%8L9BHnBKxt2~z3wFKvumaRf{PbY-Y zsTioHw%2^M`i88{az`zkY003|iMj+humraIUSQ^pk zm?iq%@4(x1;1K|zZT)3T!{4UiZ-dF=wincO;H-X;9_!HP6qv|svn*>5G*-0I-%A{5 z*$j)EfT|$`6Cdc-g)R{58ILV*jA6G-fV7PqiZ~q38lh2S`k%48MzBZ=Pz)lSHz2elSe)Vja6o_ zG(?xFXN7)Fi>JV>LCDeIPWMW?C78g1;XY=V4HQu@RCDsFr(JfzO=#bG+c% z3iY-xUh$KC_PkHqucE)+mIKj(EY2VVXXI@O;7khGJ)n0Hq zMv$`ctrdqbJv&HoNYz8E#cvNv`axlheYGzgF1|wj4z~e_UYw!VdCAXh3dqN1a_o}^ z%JTs66f`BPbfoL|0QMz`LNnxl9)4v)6My>0d)+!%(Q5@32|rl^tlyEs0x5NB9aQPS zC@+YZ-ovoJD}UDqN@&De0}dTvt)|eM0#(hdY7^<@61xzJv@$|43r0AGZFzzU95zLk z$>bEc?T1^6Dge+)0iavkC|U+kftr=Y#Ie*-7s8%l;QOl*fN8xHI7!4r0HcvBF62BE zf1!s>Eql?eih@!JL)mWfHn8pM!PqMmT5yd<0t5gV83-WzmzpV3Q!fDvG1WUQgYh3y zpd4>N1V_G1;8UBv8Wq^xO}pc>0XBjMH}LPpOYzpNd`VHTjEd*R(;z_8G- z6$bt7I<7d6Ri+R2mjw$iUcDx!4qV|tx@Wqx(fbPc7yJ!K>HaSC3xy*Enm`loSMAcp zJzNbH&?{i$T>(Nbz*LSLTg;t+9&GfMrOfb=Mg0#1hb9x(j+3I$Qcg)s-18I)hTvY2 zl}-iU3a3G=*!Snm;D7~Bh0n6#*0?PEd4hFS`9af8v+MTzKszCkK5+O=A#na&7IR6} zg22ZVo)L-=GSzs(!P1Zwro;`fuFWLs`~{MT`qJf(b(H;n*uN`pv0(Qw3cL?U0{fUg z$oOwi**PdZi-O~=$TnVk5*!%aY4X!I&>t319q>dLdE?MSDU9h5 zx4PoOH;ur#)q6EWxBD;SAqGi67ziKu&3G_&nFko-(^4Fu!fe@TDuT2m8@+{Log=$? z9S~e9!S_SuHKa%1yO>f&%(6j>Ci%>Hii))2XBK}tW~fafB$ zW61##hidmsI$*$nG@KQC2_^%e1CMr%flZKd;JE~Zhw&q`Z-@{wraHKAFUmFpu(~Uq zC;oe|sd&`M+o#A|&>)))9Yh1z1l*Tzw9BcU3QvTV!rFb4Z$1MjnzDe~IgrfM zUWFa(K?n^V54tsosr=%TjNh8qRJ|Ti?LezTjw|9Z?9!Aus|m+T*ckW6g*LOxiyIp5 zR{550fj=vtoDMH8!;4KztK@i?qsfA}Ox>wwP|j}q@guQko}wFpiM;gq;rHM+=~lh+ zsJ?dfB9F``pMDPlNR|yZuHl|#oVRbmf}%Tw>2X)!H@zm#&Zbv}s!fKhP?Vw4VkZsy%-)#geoX)WGD4 zxA2V*m%%dfR%mCg%tv8obk+YcHYX`#FB^-h0RXa~rxZhSkX+Y-rw+rqdYax~>;xw> zzYH{Fi9H!YZ*3F^pbA1*E|v4@}Lhf<&oMB7@Ec8bF`wVSKpIjpFG;64bRd-ZAI`7{e&FBnAW>6`#39sDmcpRddK^jMl+`b` zG}F%Z;HX-FLlU136ak9Q3*J`8*iPH!gdMYnK2vZPL!|4#gTsxYmIlbL{yWFxND}t3 z;z6bm=DM-zb^f)_Ha@cg`EkwcY}|3j6UI3+Oi73ci8YYx=xjmMbpvH56nC@>!8t~v!;)^ zC5$iXe!pF7hWFor46rrv@I$wHb3Z6AYE$l)dfbfs`aR7iFT;_ha7U#KBmXoSpUXr;T8Q1vC?0wiN*wCgYT@WU!{M)#P2^RAH-Q z*|Z(gYc{FifNx#6-!o7iV!aof$`eyqwJ!+~>mYaR*S=x=XNrswA&lSWktToh!`Jri z0QZol?68sD^SAUW>jSK@OSwKkkan1W64J!0ci-y!!ZJ50q`^~22buzEQ@){=Vn?Zv zkC}z%oKKBa$mofTVcJFQu(}3p;2E$PNYiw0Y zQ&z}czNgR0y6{)eW?On!BCS)v$^0KX{}iGcMPGZnjn`qaF(q1WfzVL@!1DEmJ`)G< zI9d+apv2PRCDgL$B^9yo*K7h?9qIiZiDB{32}2aLULNQwgyn#0ohJJd&1^{ed^Y6! zOxNdAr%3DNp)K z^cVlUhoA2TI0JoL=+}&us!9NuE=~hT9J`A}(1bs7@(1mYDl&sC+szpt*X~c16&$Y7 zY{@b#>InR^S=VS>D^%_&_xnV9t)@ioL=M^47^-JFDquI#NNYX(fszPY&%@07-nVXc zz@@&(Rf4(j^;K1DX1{Y4v;W=D^|Tw~Lz(@KDRssDZ8alT63c^qLmDQWQp@kRel$F; zSOAs^sZ%0z;9Ec3Xw%9684!kdUfmd3wdwm{_v^rM=c&znUb;+`2m5WGM)!37(DkxJ zY_62LH~o&aBV~!@WZw{{)X=Hqf-QLZv_Y=Ei%jrmo^ih*iz?@;hk4Wmq+fS z1i8-cOc5~Fj|l`O@5YqIn1O+KPFlNYNMxAAK$@jEX=oq8UBD9_GR-z+PRu#OZ}HGTvLUQS{x|LxQ({ z<`lUnQ8{{BsinSr^E+*g*@Y+f**D2k>-WNqpcC)LI*FN-P&M!89Hkh!D($rKV}Uhe zk6$+l&f>$RF3GCC@DEpDe>-nqSXm!NaV+4%-@yUbnTNEKLV_%oDW-jl8j&>-(9;bi zk^h>WNwHI<$-C1p1aSqFwb%8)7as%kP;+EfA89`yg#^G|<6Ty;jnlje!15&!u(t;Q zIH+~#hsq2bsRQhae>D4W0P>sKhhjn9vJ5z>h)T$+74-2Or`r@6pr68?+aTVvn7b4-FDC+`t6k7{_97obC z$66w*T_7n2Af*@ER3hv~L>549ja6uH8i17I)o`B@DDTCpW3~4I(EN{IfVnq8P}3Iy z^0BCQ>H(0s8%Wa@uMmTn{odUSvNck?YltQ!Kw(n}Rrua(@F#ZwVb&bgcY(GSYH^m~ zUvMBsxB>inGPL2FeelBXVp!s}j=6T%TR{Q3>JS(%!!mYRk_jC4j!PHv3@_7mn8RHsln3xk6_$fJ(@_qG7X3o|j|p z4ssGLJ>W0lIuQOh++iUBrlB1B6P`x6VbfP`n2YL|6N8)DFk`J{tIwZ5{=f3h{4c4j zf8f_89Y@O&Q*umO3@w*L&2So{sjMdh%cqSr(?m1FRJ6=ofELpMvuP~DB{gfXn#Q$p z8B3^Ga!JR*%3Xu9Op7Q}3gLb~_-#!%mW<+h4Rtfuw#z4a z_9kxMHxNuQDOl)fN3YJKR|0x@5g8%eiY66^dEm8C6Lr~Ddf@fwbTYf|)0KQfcct1sY$C05eJb$R+r1$9zu!Hl)>}y?C;ueDl z<9CY7`VtpF!5rcug<$6j@YVct=c3=UH_NIZJBPx1cU#>LzNO6nrn^9R&DT2d7K0bo;YFpNlbzl*av z3p#$0?K5gu1=cU6uKe(RD1r!uqLi!{P?|{8r(UBGwKbm-%_)!x@6vA{wf`Fb3G^f` zm%l7pw#YS)=L4++23GCCQ0NBU$^eqTUGdYJ6vaNW`IdGZ5_4g#B1TA2 z4`6A7Nyet2N4S(YFyzu&L)I}*aSS(6@CXF(b%0|XL@Vh{8j2m1FH_tS&)N=P}%ytFQoR5yDD4lA?*3Bpsoi% ziDHxxt3KcB;wd@ztIDPk7l>HB7~>e6c0qHGH4R?DJre z8ef7WFRll&g{%1T3;JxO9M~A8ML{$Lm{EKXdC?QEJQCI4TPZQ3K;ZE12GUNm*7`TA zy^*54>Q~T+Q z<;m%<*50l-pVPG$FsvIXXGG|=nKL5d-AqVgbTB%iCs-_u`qTm*n0?;B9^+Mq+j!P& z^QdQ?pqtJn^~Ik0fyF;Kuq6%01mB$;f*Lxa*RJrHv==cJyx=jJXMP>Z|FMac0lURs z2je5#G>b`?zqvi>kC%EwB2J&GMR- z_xZa7tzg{j#o;`zZdU%rZ6~d$hx(Be%Q(EqQHSX_moV$=^^xv1$23steKC3-ym;eafL+nWnB11& z)+%61&4H@3j7LMgj3ROq-7{HV061}XH!1$ZLJ`W|)-kx&w`e;lq4^l_*8pqcY(}JZku{`_0)J;yEnt;|$*O$39b+H-iZvhh5I+Xq+3cOL$p*=0uXc3c ztli0G)H5omFb`Y7qcw@pE>fZqhe-i%#odyAB*zJtMO=sxO#>p%bZv;VoR;d{*q~^$ zpscKiVk5j>!O)4B=e@7=QxvN?vgMGC^^|OmY`3Hir}`;P@!G*C>EjHcYWf~l-M%pF zH9VX)4&SzVkuBw_3tR#tIZ3a|ojw;Wbz(f0p_B>iIej<zhEie$9lH&J*+EZ70lmespY@()`4CNa?TGkwK&QjmqA1 zKa%@{tu|qYWqmVW=ohrlV-iTCMmssdNGX@=q&Z|Z1u5Y<01RpiOlx;HlaA}_5q@p3 zt0yqL#P=??xaF)|&nL2#6CpJwIzU+W@-bot_eelx-ZxM_hN0#|&@6iNg-s|9S2B-| z8t#N*{+&Br4x%nN^2HXM<9tk~^;Z0Q!`TT?&!_e@ZN+O|qyLi49T&)ZN+j5+o)~>U z*t6H1Dji%Y5`I2SpV>m%OkCN7^i(&DGBzGaWxkLxo!jS>f*aIQ2SZ9#@Gp}Cmg24x zv6z1=VOd;f@uIIXoA$vxDt8xm6pI$J$Rqk1x8vflC0{?dnKHV3orZT1BB54 z=Zf1UKZu4YGjW|>Q^7NvLXx1&3SXTPVfjKVeCJkZSGN?mkB=3-kr!Mdl$xROXC4eC{$uNwF}l3+dT)@p?xx@ znui~j*&l_4j1BAUnw)5Bmg6eLhO|23BGEp{xp5u!v||MzY;$BLc)Rp&Ugj~j^6hz5 zOl7uwP465_*lsMZV)UAjq=ahq1}F^6DURbF7aLvb>!3`uNlK*g6F*vE5il zv?DmWvyzD1#cv-FiEI?`KqmoodX!WBrnZcGP%-@v*}Q4Kyt72o^BLw0k|>b@ z8S!vS4hb_rC?;gMLRx;3!DY`71J7henFu|Im7msyxMLUQRy#^Iw?8@#yiB6KXf3GS zl0rMy2@ZX9@eNfOmbN}k`nWYk)Fpq%JIY5x+L?CMIQDRREfIy{j0F>iR4JjxJ7cYCvZO@@n)nb++(fg^=MOV zi<$7;hn0Z?7Dn7|J>x5fl#}s|(OqZ*K$JITTbC@73js4avKN}%4^Nohg}<$S0yIo~ zBM^{P+kwQaxkX%qOOb}AB1t&$x$Uxo&jIwOr|OR|;=Ao@zpifIHp3{kq(0)e;dJ@b zP!iNK^tg;0J12RBm)XcR8J=AAuw1NocYBvFj@dahW6jF_1wV3$PCg}R;N9QlHB1kh ziPM@UF693Kuk$etbBJd=GGz$at|G&aRO-Le0KQlnZlP*-Dz=d@FAfjamZhh6S62&`=x(z7gOF%yh6Xf>KkhjM=?GqZ#bD2s_?zib)spx zx_oiS)#1?wmv4$iD@?8V{q|WRwEQqem&h#eBV$?!ykNbGb~hvp7oOehEq+@M1de#U z4%!ook^2c7m8S}=5O>d#D5be=29zZKb_mOWW$}HlA#ym(rm!6UV4HY~2r@ z_f3B9qzj=aQ8nO2repLETm}=5o_>HtsA&5UiAQ{_m;<~y@m}zNNgx)!ZmUuaAR0hK zv(kZ>gB8hPR|54x&;^U1ZEyf#=9wNckD4;f7ZKxQV4gRJ%apkfrgf@zl`(#bq4Y8W zAyGg@C~76-40i>kra`{SV(9CnScWFnn9R27hQW!R_hkZ;wxcdA+-L;ix)tJ-B6c$6|;x5yLmOv z1qDTph2e_-jV3+C3HBy`x1M75a!W!-N}{0*l*r z04U6ZL2BTY3f=*gg$mP*=`|$472Qqo_>_wT2AD&?PUy2loa*;;@OA0CZTW>Eh_Ppc zN&HS9e9AOzt?Y-pP8E@hB*UVSB@Cj`InOWw`B%k`SbdfX~w$&5o41#;$I0 zW1WRXn0qC<40bqUp>S*+Op#Tj&0}6Q+&lLNU7!OTx3%G)CWSDj2>{L2!k7ko4Y>

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; diff --git a/Wino.Mail.WinUI/Assets/NotificationIcons/dismiss.png b/Wino.Mail.WinUI/Assets/NotificationIcons/dismiss.png deleted file mode 100644 index 63086036e4a09415db32ac0cd072acf8f41ef15e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 16527 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 aFk8CHmE&qFXKw^r%HZkh=d#Wzp$PyRYd~)R literal 0 HcmV?d00001 diff --git a/Wino.Mail.WinUI/Assets/NotificationIcons/dismiss.theme-dark.scale-125.png b/Wino.Mail.WinUI/Assets/NotificationIcons/dismiss.theme-dark.scale-125.png new file mode 100644 index 0000000000000000000000000000000000000000..679d63f39c74b7bbd3b5dd32a8d9ecdc83a21b87 GIT binary patch literal 234 zcmeAS@N?(olHy`uVBq!ia0vp^A|TAc1|)ksWqE-VTavfC3&Vd9T(EcfWT41=PZ!4! zi{7Ub5Aq%|5McR!U`o42L(-4Nm(4ahs~i^bOLa=f{YZ4(Sls#P^xmBN_cHdX=k9J$ z7HE8Mf$ag`oTx=7_6Kp#O4Q6w=H9_B7x_b`xymG%x&7z{F_ZnJn-f{LoYCYx_c=jy zxn8<8`*pQLUZs?@5+o>{Y=@$4G*bCc{Q f-3x8My+VG;>0-z0Oi~YkPG#_P^>bP0l+XkKB&b}^ literal 0 HcmV?d00001 diff --git a/Wino.Mail.WinUI/Assets/NotificationIcons/dismiss.theme-dark.scale-150.png b/Wino.Mail.WinUI/Assets/NotificationIcons/dismiss.theme-dark.scale-150.png new file mode 100644 index 0000000000000000000000000000000000000000..8ba86ea42cb933f0e56a1d97a60230cb7e6a456f GIT binary patch literal 230 zcmeAS@N?(olHy`uVBq!ia0vp^5+KaM1|%Pp+x`GjY)RhkE)4%caKYZ?lYt_$JzX3_ zJUZV_@#ShZ5NXMMzu?C2`%4}y%g{)>__#)oC&cUG%q3#t=d>o6e}4L0HMI0q0h62q zgVf>64E_olM;jvp8<%{TVbjdCqR~(??!eg%{go=;#~P^*r?} zE=yYbC+fgnk&64bzIN=3UGdrP&4;O${EN0EnH_ogS%)Kae(ZXNcMk7MJeqhMmRI@x a^%pLwzob!+p05FPCWEJ|pUXO@geCyfU0fXi literal 0 HcmV?d00001 diff --git a/Wino.Mail.WinUI/Assets/NotificationIcons/dismiss.theme-dark.scale-200.png b/Wino.Mail.WinUI/Assets/NotificationIcons/dismiss.theme-dark.scale-200.png new file mode 100644 index 0000000000000000000000000000000000000000..735d6c69acd178ab98ce1eeff8d9b0b3924fe94e GIT binary patch literal 283 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE1|*BCs=fdzwj^(N7l!{JxM1({$v}|{o-U3d z5v^~h+440xh_qbnj>vdeEAW=L_udHsA?H16bz)IDW)9!}u8DfH<;mHa-3Iz0p@A3e zxo$8rU$Cf{+rYkII?vt8Y?dhJir*g@BvhJ@Cj_txw)Q`|&2p~spzsc zG8K6DP^cs4p{Bsi!_yV^iOD$}`D%1Elv{A#t&&e$m9L+=m>p+d%Ni^{CoOVktG>ERgxhvc=_U1BfSdo-L|d|S{(U-Axv`GRY0>~ZW1*tdnP eU$jW4igDt+!$;KDX&nIijlt8^&t;ucLK6V2WpX$G literal 0 HcmV?d00001 diff --git a/Wino.Mail.WinUI/Assets/NotificationIcons/dismiss.theme-dark.scale-400.png b/Wino.Mail.WinUI/Assets/NotificationIcons/dismiss.theme-dark.scale-400.png new file mode 100644 index 0000000000000000000000000000000000000000..a6591fd28a5bdd3f207f7e52d971bf7e66a5b756 GIT binary patch literal 521 zcmV+k0`~ohP)!zt9J#6#MNt$*Q52;Uz!10x2C=&sfMehhxR4Hd;g=aO z77gsyX$*W=yz zj--NJ)`LiB883etfh*v%p}+!|mY5yANHXJN6iRMx58Qw4mrudQcacfaV|;lM*yewOEmwX4ObPI%N))<` zw_aP8gg)b~_mm-Fo$=Ot^On$IK?wmYjqb zg_4mFvq*FaZ1V#Wz&`LEbG+51?Gc$niO^AS>+U|T)9C*rGjIxgr!d~?)Fk0dD)0&T zszcs@YmuOSoyPoqdhJ;{@C3L7_C$kv02~0fVpm>K6h%=KMJbRUf5t|)N=Yr-00000 LNkvXXu0mjfxZ~Lg literal 0 HcmV?d00001 diff --git a/Wino.Mail.WinUI/Assets/NotificationIcons/dismiss.theme-light.scale-100.png b/Wino.Mail.WinUI/Assets/NotificationIcons/dismiss.theme-light.scale-100.png new file mode 100644 index 0000000000000000000000000000000000000000..a635bbfab46d1ea479cb479af38db2dd22410061 GIT binary patch literal 174 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`Y)RhkE)4%caKYZ?lYt`1o-U3d z7QJUDIr23q@UW=QyP)6sL3PK^s;^AjxpHSoeBWi7r*uh{&nvPl5D6gJF3Rc`aMw2(MYkn TV3FG?pmhwMu6{1-oD!MCJL|PvDYkn*_Ho1cLX!VJv9UuAR4$pmV@Q6*=X@N+}(#=_yEC0{_w)D^5 zZ5jeXdl=Q2VN)7xyn^TXu?oqCWfhB9f0}QQFmbkI{}%Xr?y7TDMr-sl zgEo~im6&ewzqTm+o%DeuVZP4v$%&g6xL@9XZ{h8=Yi0P~eC%O}-;vZT{chtF`*r5G XuUlNLN>u*}bRvVNtDnm{r-UW|&-Ghm literal 0 HcmV?d00001 diff --git a/Wino.Mail.WinUI/Assets/NotificationIcons/dismiss.theme-light.scale-150.png b/Wino.Mail.WinUI/Assets/NotificationIcons/dismiss.theme-light.scale-150.png new file mode 100644 index 0000000000000000000000000000000000000000..4cdcf55ca137948b837640bb33113ec92f81aa28 GIT binary patch literal 229 zcmeAS@N?(olHy`uVBq!ia0vp^5+KaM1|%Pp+x`GjY)RhkE)4%caKYZ?lYt_$JY5_^ zJUZV_apYFBK}$`z`-ROlZ(KU|vr|<3=W2&%=cSD%H?A^%#pcr> zY{OUKa(|hc0>eFyLPIl##jF>Y&S%VM^y}Cg#SrFER>Zx;qLOP<^rz|9e80%2r(T*A z6|Nh4PsBl=^`80Pubul$Lw>3keTpwPI%3pyQy}%+W(C#L@A4SG7zV^%S2p07x2kyy ZLzkZKe4l9>3V^O;@O1TaS?83{1OTeyS3Cd! literal 0 HcmV?d00001 diff --git a/Wino.Mail.WinUI/Assets/NotificationIcons/dismiss.theme-light.scale-200.png b/Wino.Mail.WinUI/Assets/NotificationIcons/dismiss.theme-light.scale-200.png new file mode 100644 index 0000000000000000000000000000000000000000..24b40c5c5d5a3c5eaea112ec404b825059352fea GIT binary patch literal 275 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE1|*BCs=fdzwj^(N7l!{JxM1({$v}}4o-U3d z5v^~h8FC$R5OAFzcf^VN{o;#pmtOR`un4Y~OipC#R!L0%zb5KU{^2v#yHD~oPMTzY zmTL#|ROj`!9~iDpTO@sfi8p}z!>-pCKiLJ8lsP7@a^cAL*m2hR!UN7ZEw>hnuJhP& zFj(czL$S`B4-%bkK4^BXKlr<*Z@SewPfmZ`xi#-JOpD)`&YZumX(7Mg%^5~DZ)Wax zIkO^l@`f`zce|XLR5&@nY>rOg!v5)BoQnh>Itzt+KV-6CmS(({e*55bzP(;ve?Bu= X_;f#DUHZ8L=qCnGS3j3^P6=MzD^{>ZWai|EWs9j3fxKv?lBwo zwh~4Xq83Kj!;gV|DdDEpLzU1JKFDZ12R)kZpLwDkWqe-q59lV!|7iDWSOV2A2|w4R2^#yiDqA z(PyDon4&a|gkqokJgy}a8Q#!VLh$hGA;o|-PxoX=)33e6Dl#ct!xvdXum1*JCOIKC zRid!W46nEnx=e42DPfhlefA~z*u7152e=KN#?efUjEQh1u!M*i`&K zy>>4xcnF*UThc;HumfBp_~aEuQ4~c{l+ySCi-|h7JYEm+S``q a{$iQ$ktVf<^iqaqdla?}U;=yv2Ed8!DhUUHK?ESFZ@Uc~ z1N$X`8^F1w{sb8G1w2UFD?_t=3-ppYD(J=bGO+!}?j~vSR0sqPfJ=VgtAQinq7qP2 z2k6WgI;EvD&HoQL0%{c)wQx5BdoXF*<)&J+egL^7y@a{Op|k)1002ovPDHLk FV1j+i_(guwic(h=Z0030dK%5FiO0^KClNYnb|wcF2{Q_yG)@=>J(#9^)6`_*eHbW z%2n3_&QMxcL zBsLmI^SPPEaUw%orlcnQH=Rl6{r~qSFC)^ZP69f>1XvJW3t$X%d;pUQf?Zwt0J6?U z72NJ9y9wVR078fR{99Fp<&_H%i--W{p@S^X*mvk=4?}ouXQ~6x6_NMQ-8(u~)n&Fh zaDJ|=^^vN6g-8S<5&8ThqkcnJe*oaoGhk1EZg<%MU`tI@!tX~wWOcKfSx(>oHvKZnKxzGm>L}vF6@ff z%QLBrQTagX1C9$9Ggj(u;_+cFZ?sO^HfyS-F~g*9%)$pI81K!R$#ib^&Gs!kD;YcH z{ZYBS{qt)dM)gbgTDJ8xDd+q@$1KCz#yx$~ml)}t`YZ46ogc08)qUMopJ^*!gs+*j z?EN3BK!L2EGpCtn^Id4`Nh=NSNmE*1e@*6sPz%Eku@Ams4AZiNCw()$aa59Xop-0? zNxlO)I<{&nmv0Gmb?Hmqcsl>`r}t-8WXo8@P2R^5GvUkPJ#nffn|~hcTb_C@ip{z~ z{D7l*+`SpBeKT)*T{>H3@7#Rgv|B{zi3v0JdhL$P7ya=f;u!nP+7q*wFTF6`{9ZLx z%FBeYPCH1gh8<)-M?*g2{Vg>Nr`9mFPAFm9!TLp1=NIRWtTg|-(NA51`ptr0)H__7 z-eUD>lZNK^=%{1cyA&t<;G8vC_MA@83MGca2Vy#liVuhy|9*WVotbw&^O-lC7q(P$ z>h9-)co1v>F6Nb;`*}3V*3RVjde^t~Xq0@=NuGw8e;M~3)05YD7b?lT@k`Q`_K;6J zjpiG_+*EQC6)vBBv#58HTk`B4?z0sEPC@xwI-^dTii`4l{E}V$BXQ#0TW-oLeJ?GZ z@pzSr`Qgw@Z(H6zW1qBZj>!ho?dwjcp7WjF`^96HXGV&hlv4AgTXRh#?k~5^DmE$V zFxFjZ?H{|-zuwD=#fJIY6w&n^tPiHl+;n6gm1)UY|d#!P(5hB>TWMrwGT~*-`A%u zq&ohHoVurup?mIqVDAxbNcT%XtUH`W)k)hR`b2g_qR@M)6UNu REPx(j@O1TaS?83{1OO^JXNmv- literal 0 HcmV?d00001 diff --git a/Wino.Mail.WinUI/Assets/NotificationIcons/mail-archive.theme-light.scale-125.png b/Wino.Mail.WinUI/Assets/NotificationIcons/mail-archive.theme-light.scale-125.png new file mode 100644 index 0000000000000000000000000000000000000000..922eb752b166da0f852270fb112b1e498ba4f1c0 GIT binary patch literal 324 zcmV-K0lWT*P)L_rkC@eixAL9w<`ZN+M|8ZSYqQ?GXrPp}U_L&Sri zQD`(0-oU>QiDZkliaYm`*~>LITlpoYm^0^m=aLkL(dS^oN9s}&wbT|l%0{D(Y^st!-T*5(M6hL^v6*dxq z7qXug1Isjv)hKt9yD3u@a0|!2reTB~9MuJ$g!r?jQ;Po|@B@t+j7I1k1Kwd7%>-Bz zE4a-Q-`CeXu4Qw!CtDW3X%YMAVhwL)MO~a@sCs1$aTaLqQY;;4e{Pp^dIU&{86)tx|{^u(1+SWC3DpZ=>$O z*1{F|gPmP^8&NyaLWE#p6k_ovFupv<%a|tMfnhH9=Nx9{a))V0C9-F+hi0%-@QoXs z1lvp$+{Yo_@tG*Fh+TZ(HXpn|Cy_WtCvbsk6sVy)0fBDd!tc9&#%5S=iR4RI!&OnR zf&PS6V?Y{rQBC%^XE;qfK?^&WLyzKie8hF4Kr`LhQ5> z(ZV+vl!S>+Mul7mN%7vjCo_+L*N>?L^nopKO?hpBo@8j%cM$x%x+Z}5=8>uBO+`Gu zgjO-7E4}#V9fl>+Gr&&vmV>O=b7v|V;(iDRCV(&lfY1aGD20Kk&{A68pBuuz09c~` zzbhc;8o<=^@!a?!^Z*{<>i`$!Tud=X^-?ol0M5Wc&h-=l8nW*t!>B3u2V;)qv#L=J zScvB&Nka`dNy7|i0);n%3(`9iuM<#B+T2kf(pX2JZF_?XFa|c<2gf$_0<3`%P__;C a%1k%Dg|WeoI&KI60000ge9{za-_3qAzCEAM2a2L7 zic-ZSunepL9iW?dbb!aX^TE2s9|N8zP?T>x%WLpra?Fb_Ho@yiSWZAbR4n;4V9iQ$ z2Wa^uicAaRT6BNpljw()WE_g`(W2k|d)bEjDw1>^woQ?d{3jxaB#kyeT0okr26U|P z(I!O#W4qe5jKov=&!o43te#gCGK_1{{Ylxz2PzV+0;db(3&45cTYbkyIn3aZz3P)_ z8hDHRRb1V815Eie0HB>f0d=EYRp791fpy!ov0Uz~&w~MvZOUj#6je7)xNc z#=iT5S(Ff?0hfUdkNq})OTeG7I&Oqm0x?N)2_%g+Kw3Z=ZGg0ZG}-`Z0co@W(gMFU7( zUfW$@Hq-<)n8mo*e%C`zl3~`9J;_JR5@}Q8DGU#$@;O&>2ixl<=24lToCLP^m@Ku} z0#1Z3zQ-c)B7q{yVjVcuRPjA#fNPk4e54ER#SU;acXOi71JLupMc^E!>qm%p9@xdK o{dM30a0~blX>LVP6y=}cFGCt2bKFX+0000007*qoM6N<$g7msN(*OVf literal 0 HcmV?d00001 diff --git a/Wino.Mail.WinUI/Assets/NotificationIcons/mail-delete.theme-dark.scale-100.png b/Wino.Mail.WinUI/Assets/NotificationIcons/mail-delete.theme-dark.scale-100.png new file mode 100644 index 0000000000000000000000000000000000000000..e6ea8428084ac9ff345dea1aea3c38d40615367f GIT binary patch literal 303 zcmV+~0nq-5P)Lyuv0neao7Xu#1E9fqG9uFWv zqXQ;;Axd~|D$tm5P{D--P5u7;|L-nn_^VQD^(9yRQ}a+=suOjZc-W@xrQrm)DEJYu z1}<~I2Cmem(A-AEUA4V5ObS01hHz156@fQ)1vS zHSMJi^4p%OQSg!6N*#2J2z>%07*qoM6N<$f*Q@U5dZ)H literal 0 HcmV?d00001 diff --git a/Wino.Mail.WinUI/Assets/NotificationIcons/mail-delete.theme-dark.scale-150.png b/Wino.Mail.WinUI/Assets/NotificationIcons/mail-delete.theme-dark.scale-150.png new file mode 100644 index 0000000000000000000000000000000000000000..f970df4b3147f647e60e724475078baa9a69b595 GIT binary patch literal 496 zcmV{ z1r_rS)Gzt?g97X+(5@>0ECshx-~?Du?{eyEwUhBX>Ryi59#`NOFatb}V$;A|U^j!= z1>QsswFx{5Zl%C&7mKl$o%Y+@lUPsc2-Mk!r5yMF3iKGBgE|83;G9(oq?Ba1S#>8k z4Q{zWSlzQwcm~E57%;pVt}^+nhz-JTQ}BzzpLbDSU|wycly1})z;P!34)_$g2Cy({ zfj*T}p4wHPMVEO@BXZrqHpdo-0_*Cz)po9~kE&Dp=&N(U7O=wK mKg59HoADu~)T`C~B<(lf;~*pATk56&0000D(=@PSp|?OJe3%2+X;Sk>Ll0|?#}PqB z`uaGR(;UE2L2oCGqpB6SYVE$kbJl0TbGv;twi>)}t!G8|%l1Iev3)hIq&v$?;*NVK3RMG;! z*C+m&wqagU*Ksc4=RETKx}=cQOV5p31I8rwK{mIv|I;>5y8&m~K(+^NjbR`&e^Qn( z(XEm8QzTiiT&#XV+?G!1(BxJ;_gxfukz;+A}~Jo?KPv zNxJ7^?<1n`^FAV?pCy^!l0?Ff^bx8vkgdQ*BKD>zF(O{)sBF%MDuKEdymQamSMdP2TV(`Tbk2e2oC4j}23+($aM9w==LN7imUv>~4zLfLk05;R f+}jfo|L5@wib^vh_;P@C00000NkvXXu0mjfeVz3p literal 0 HcmV?d00001 diff --git a/Wino.Mail.WinUI/Assets/NotificationIcons/mail-delete.theme-dark.scale-400.png b/Wino.Mail.WinUI/Assets/NotificationIcons/mail-delete.theme-dark.scale-400.png new file mode 100644 index 0000000000000000000000000000000000000000..23702da945d3a9e0219fcb9baa47e2f6eb7163f0 GIT binary patch literal 1097 zcmV-P1h)H$P)=RAkYEK!x*)m94?t1U5emKpf|7t} zKtP>e5fUjhG<49IbVzh*NRvcRflwNp7y<-hoDZZJ`#u!ASFDfr?$_*BU?1rgvwLRF zJ7;I+o|(N@8WEQs! zQaW`i!~Rr?{jnA$*9&mgb>@75I_F)Tvu$W?1mKeE%+UgMj=DOR+R)kvz?$pKLj~&W zadoaYsc|kx%&ervfcE#e@;oqKvW*e&NPvdhX0|=;rcJv6ye#Qcg$1Aw+?MpFnWe5j zSpm2%>B**4wal8CJ(YIjznOQJAS(dxOImMBNP}!h`e544sZ&6b0F(4^;?k<5QKI~; zr0+u1)xb!Rt_gP}9ZZxn7s1SL0W(91Q2<<%l-#K;npvl#1UTR>t(MVLb`7}Z%Bc%W z%RKGMUSlRh07^RZSy>+f;5C%W9ETB5(%Gsj7fO_f&H`tPIsxV=em3YILc41~{8c#> z;Dn?+qXRQN^l9m$Xy~^HPjoke_`z1-q-Q|r~V_~Z71^ToQ1`q!_ z0?_4-u@?dO-;IDiB|||;kW?)IJ{RcI2=Ll+8Kyu5r{2kd5?Nc_v>yO7yQS#RVZywm zeP!DT1=ua=(Zr>@Rn8`=KDjV$G`hmiP4OgyeUrQD!g#{ot8H(S^o>a7G{wnEhGaGw5 zXa81gyC&)66#H6|pdf%3-SPNJi@sN!?-#1JRp%Pu=Vg=hVg!tUapEc5Z6g(x$1`EOD*_(#reG2w9hOtr=6G|fX04S2P~!p{d80QiU?W;ww<7_f!dGA zfc?Nl=WCn5KUZYF*)1sSoTPW%<(rbuNcvLI*V$IZ=I0dU{Lf4JP}1Y>{>NtaUd6WS zAzlnG(>|B!YVq>``+zGgcK!+tOtT<>1>g+R{{mA7_koXqg?vTD2wnp`z#&QRNP14v zGm>@(Hu;yN?iF|fTI)E)p2(SHQW{zQJlrkUNVQ_sM_zz+TaI#%Gv59WZOL<5jKr!%f36U zF^i+LQR;Hayk!NV_v9@OeV(PAYV%;j`vmFvx3WcdaOxFE$2?Nrvv-AIrI$~P k#z?9C(Z+NBi`|pB|3=bGS8z`j(1Q#Np00i_>zopr0HH;9UjP6A literal 0 HcmV?d00001 diff --git a/Wino.Mail.WinUI/Assets/NotificationIcons/mail-delete.theme-light.scale-125.png b/Wino.Mail.WinUI/Assets/NotificationIcons/mail-delete.theme-light.scale-125.png new file mode 100644 index 0000000000000000000000000000000000000000..8c1c5cf554a0daf21c06b97e35bb75e90b9f6be9 GIT binary patch literal 408 zcmV;J0cZY+P)(Y}HF(X}lIP47^W&9B~hD|j0@ML|9`rk&tb)!9n$ zx=X>99quI9h^2*H_uj;|SjI)1M=+6b6W+)3B4Rt@E1spfEn!k>#&ngaeT-GZK?v{S zvBD4F8_uvK4MJN%(iE&>PV?x&FX_|R!c+MY{|Ikm6hRNNlZrh60000QSS&0EN?b)kx>yB$fLLf{VUq{2va^!B zfNu~;m6u47R6$zy%st;Z=YI3=%<#k*s}cJO z8}a=WKSw!`ceq9`+I4UvK?{FzfVpS~!L>#qur7^yrNpfSw>~Jjyazkj&cw8^gbr?l zo5C`F<0_N$2_IpiME0V8Ev@mdu&**dxy5mXTf#I>vQsJHI}Qg0W$*<@RdPHNc!u_W z2rNYIK!H=dsQC7zH7~G?_m#YMP9TR}X+LJeo(y}x6tf@PWZ2EHcZZolF^c)<|5fdU zZ!!AQIs$d}VWE=yyaMM^9n=wMN6y7C0zLexDNr2IUe%Ekpnff6YhYM`u5>lrl>9fr zb;E8;v+l!0jtqf0G;oKv_)+qIz_;)%fzoH+*YQ%2U5ok)Mse?B$$|@S+ z>qKm`jsUFT(!(?PSi6kaECxOLGuXsS{Rg5ey&0cl2G4_g`xIRe9NJV)00000NkvXX Hu0mjf9EZ?y literal 0 HcmV?d00001 diff --git a/Wino.Mail.WinUI/Assets/NotificationIcons/mail-delete.theme-light.scale-200.png b/Wino.Mail.WinUI/Assets/NotificationIcons/mail-delete.theme-light.scale-200.png new file mode 100644 index 0000000000000000000000000000000000000000..0a3dc404f8249dad953f83f67e5bd59c51ef6116 GIT binary patch literal 527 zcmV+q0`UEbP)F%VP0l=gEa^WllJZQ8;aziZp+ zb!I0F-oQr^^)14SHi2Ck9(Ew%o?`7ZJ9PCxS$m>-3e$m@{UyMKJm%V-o1CozYfbod zpwNWBRjhm*0V$v+$1#gf11~@w$XI*^GYNzIFs89<{G1zKaFxIVD*9}fAr0iT4_f@7 zR*;`o;xdlz4;w_C=mX!^S^sVeh-|>V7U1{5WC8)c_=?M*uWz6y0>Y5RJUaF>Ji_-| zZN##5@h{@Ct|VbM@Cw{xhRH-c?I52VaHm+Y1pwS=_sj6E)zD4|A2|cSOs+7LfdvJ- zz>L}grX+RCu8w&>coyGM{i6i$Cl1@=z<1y0IwD6XwlTlz5*Ui%Hw;|KcPoj2 z98guDA}}8zWJoqe`BW7n5te`_;{W-40v3}d_c03`0go*tew6J@r;`6|d;%|zo}J6s RmxKTS002ovPDHLkV1ghC=$HTi literal 0 HcmV?d00001 diff --git a/Wino.Mail.WinUI/Assets/NotificationIcons/mail-delete.theme-light.scale-400.png b/Wino.Mail.WinUI/Assets/NotificationIcons/mail-delete.theme-light.scale-400.png new file mode 100644 index 0000000000000000000000000000000000000000..7f66c6fa9d6ea9f25df1a4b0456a19ac39e3f496 GIT binary patch literal 989 zcmV<310wv1P)i1j$kxkf(V@jjTUx>U}>XhBwDKc3Vr}J zN@J^)HppL~(FTZCCWgd>kN8Cbo`43zfyL~_-MPKpov+>H*e97{?%tXAop#a4tVIvG$kXzNB%duQTpJ?HWjyk3h|AvrHWUkDYy!3 z6W-7RFNOWL?Ug<8EKuLL*T6NO%r)Rmh}=Sob~<5<`bJGf$WMjHk2$r_F|!04GoPT$ zyi{h^nRO|!NU$-Z3CfI0Wfq-TmjW9E8`G7bOt(~K-I;YjTg?9@pvR#8ZYkg4B^AoR zc>^1M167@Z_fT8A^O`DNTa;PPf$_Fd!(r64akmY|fi1FsdZy_Y5ksIQ#tAJzuP?uf zn3QVV1U|*o;hHkSt{OYQkS`xO3C67g$B3A`#u~w$T95R977R%FRTOMeodedS{Geia z7hI9@vW<}x4p3AkFDH3$fNXOCtD)8|A>=s1@?XN zhoo@KE^l$KN67Y4ADQ)9lpl~}mAB41dx1Pnghmq}*l|G8iO>bPaKNeS0eK3BjDjH0 zbATKRK+yvV2b_8b=+c3B+2B8j2z$ri>O7zY`0JCY zqW;zy(C+~Uz;|E11YFXrONV}-)0h9|*`$m~2%F_Fu-5$x2N)QUWLvz0csW_4BIR}E ztsRA%I3P(dR0Wu*bBIQhx+0n4P<_+_#=iH@WbcuwO_U~Hs);2FW4 zVD14!K~y-6&5*q=L{St**G57jVKVwDg%OEKBpQ`w-U4sn6+D6lV+v|B zmBNU>ghs;)s5FEp5R-_dImOM*ow+pP>(1V1eS3c!{;kx8daK^3OTPiD>YnE4C-6X>$@C`GZS_^%Qb+S}O}$SmFAfJ`ue&VfqS0N@Om1CD^>v}!}Gs~w;VbbxyLOWuHp_=<=wumGF_ zJ>VL+17;(l9TA^dW~?Y@M0@}{YCFB(2i>I5AY(KT%tv?vn(BBNpiTfy;4xdQr0e%B iS6@9*r^<%?jlKao5b7@y!DWB|0000Kec3=pYDQ7=w3os9i#@?}Haaw&*=hPeZ zLCvUjML-SeqWToIbFp{25cm|&HR^(TAHhp%Z6bdcEiUCQjPT;XM6OX?R-famUd8ir z;e#cC)unb6LU;q#)J-50)9WFG*Rn)LR^A`5E^rEkqR3kh=i8@godUT$A%gj z6qleN+G=rVbZsfxnre!0&_T>4s7RusAoTlw4ISa8_xpUmFSmT)!h6nn&hy;&eb2oS zhd3zUJYM4!rVmnh42x)E1Mkqv+=+h?9>fiN#xFd?2#(?wzT-=-hk6yih`0XW1tuCe z<9L#sRa_|%KABBztl?@w&m}CU(Nmo2M4ZWO|G*s#m+UrskKiW0rpDza(rRAbwNl{* zjq9ng(p22aB0R&n9)vI8W%jnP)yd#)PR{$<1y6Mmp2SjeKjlQ->t?W!>!CFIkQcs$ z(>3ly4nqr@DSRwz3;P<>a-*2Tx2!Mbvz@tljPB|wH>lN)=kfi_kM1$XI&l9o7;GZ# zMpadt5pf$2GX7Z7S8Px-Di+?sz&>$5s3Jm>;6_9g&wdx2jfnM~pngP;BH})tN5q>x z#m_{SKqGC!L@zDr2R#w3(SXji^7(pY(N7R`7EOM7j;$}BHPAnt`hGFKOd(N3} z=6<^=En^u4funeVK^*y)#%&nDw7GbM_N6qg;3B?+;W*CY96rUp&$xg}+2-9CTIgx9 z3D+?d^;bAihVj-|?kZm5cpd(JJf9bIdlBQ+v6R*2{)n?!xrp8toW{H8{egb0U95R8 zhNF2Jcd)U*L$u-=CPQlkry4a~$t~X?4mE3BL$eFda=MomB6gY`tpT+Bt$9v6!`;xH z!nRtZljhT8rslXFTj1QF*5~Yxghtj za}mb7f?Iu^J}~CG^YUJY6fm z`#A4L=^;XMPh5`HB2@4;#^fg2N;L1l?a&^!(EkebgZTge002ovPDHLkV1hFK8fX9j literal 0 HcmV?d00001 diff --git a/Wino.Mail.WinUI/Assets/NotificationIcons/mail-markread.theme-dark.scale-400.png b/Wino.Mail.WinUI/Assets/NotificationIcons/mail-markread.theme-dark.scale-400.png new file mode 100644 index 0000000000000000000000000000000000000000..7ead265fc5007fcc27e74973377aa80de08460a5 GIT binary patch literal 1269 zcmVzxmT3fB8l_Dx45gVelpkyTmK`lrZ zp$n}G7X?2sJ1bZ)qJp4kTcPNt;>JZl7tw_f#nLZ}mO#W>ZH?NP(vmhwo0^}C`$mR0 z@4md5c^@gf9}HyX-FwdeoVj1;W~7pml9G~=l9C(&T7YMOk>J$_Skbz20q6w2qm~0e zSJC=11GpY|7q}b|e1(63Pk%d zM{xw$Sack91Kb=8ctKrec1jRKG65mO?7)j@DR8rt4~^}rV~b_aouEMiJ3 zunjkyCp`lH37)q!>8BSs?(s1Nya6mrE3TxXdT=MWC}wf{{dFn&YX@G5N%l#gFD-v@ zLe>RC&&M~wJsJAHh4|_AHE>rJj+f#VrfHAkF>*Z51CIbddbC`^jlgTua<&=xJ;vFa zz%{8jt4~)e@FM;#cMRCljDtnElbVkq;EohyYE>aydn6qKJ_FV_VW%O04ZxtJVM&`BwUaafJ0Cs)n8WHQg52j=NJF0y=~CTa!$Ix)Mn|ZIxb5B53-&R~{?7PJQcY(1TSRAz92Aqm%f2z{H4jsiLpvuM);054xOklqR zFCXK$lDB5WB=Dao0ZrZ4#bIVMX7-Mx4oUrz&PFs_8@$4tmoy;hb~Ah1%%-!_nOOoV znArt08<4b4(ra?XijPZ@cFP6cZ)V}5CUr7TKm{{9V`e+#5-}iYrt0ymT;LsM_MDmh zotLgfc{!?JX5*6jan;%Ll92R)nH|qti&Q`YDwx@?l3psxe}&wpz(S==K+yt~@nJ~&6rNkD$hmE1W5B19s{gzCtfaNTTau2*6)p>jc1ar~y)5a0 z(6jf=EUFr zWYEUHgvG)Qm@GuEKr|5y&QE@6ye*4(k~eR1&iOv)Is9jpafM4P{05vv9gkSY8Xi!K zUQz>C4R8ljx!xG6c)|vTy5VWuMCAD%OXhHf+hD%59qvoLB8HaH#uf}laRR5&!|m_Y-td0;qk=L$C(K0v0000)l&zf-u^JXeNi(KIu`m{Mhc~bBnkfr8b?e>l`JQv{x%XZE3nno68%F&&zM~NvEk;jVK&Zi6Ocn;d>D4E6+=5UJ#ETFZDQ9Blq3%zqen~odi z!gn*~aUYDA&=RRH1HYK98Ndp zg0qa*MT8$lQ5`FIQ=sMreumKkdRh@*NxyxFaoj2LMSah^HllpW#c?)X plNG5A8zo0wdLo9UZMs1*`~?B_XHFHYl579~002ovPDHLkV1gSr$Zh}t literal 0 HcmV?d00001 diff --git a/Wino.Mail.WinUI/Assets/NotificationIcons/mail-markread.theme-light.scale-200.png b/Wino.Mail.WinUI/Assets/NotificationIcons/mail-markread.theme-light.scale-200.png new file mode 100644 index 0000000000000000000000000000000000000000..5d56de68a0a001352b2c58f1563b2a473c0b2c58 GIT binary patch literal 574 zcmV-E0>S->P)jK~z|U?bf|(Q(+Va@L#P|#1ANl_(dyH6jTIJ6hTA_PGTvzyEr&H zDCmEn;8dMdRP5*?ek_8ElT&dj4i2#{M(_jcN7b6d;ht;Kc$+4d8yEY)%T035d7dXH z?|I*_h(+YbVLZnK4*g5v4H!oiwTAT&1Kkwv!v%Z^!D*bsS$vAmKI44k7K&j^n*ZCb z!!=YQ{u0NE5Z)wdcPjh>M_c6Y#j_@(Tk;4mm$Wi%_eY$;(l%?=Tg*xZd-!$?-*XarxOtiA{COWN2e_Tx!|XgRoRp*638dsrcvf)5Qw z?qXXT!rLP^{W+&`39EyffNI{sXp7^8cfYbY_LWBUj{lIwbwX>t++0^be7=}_C#!|6T)_m z)-0588du`|WKN#k22$h}PEq7(SD1m`F6#Bfvzle#T|9Sm$wV)9#_MucLLc5p#^i?N zzh6-p#I4{iX|eZ4)MvaKYX(Oaa(hs6iKO>H5$io3VE01ei}?TW8(&MlUt_L=E&u=k M07*qoM6N<$g2FltVE_OC literal 0 HcmV?d00001 diff --git a/Wino.Mail.WinUI/Assets/NotificationIcons/mail-markread.theme-light.scale-400.png b/Wino.Mail.WinUI/Assets/NotificationIcons/mail-markread.theme-light.scale-400.png new file mode 100644 index 0000000000000000000000000000000000000000..2ddd86dddd699e66e221bf0192dc881cd5754083 GIT binary patch literal 1147 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 Nc-r(-(Mg9J{|lQ#z;^%u diff --git a/Wino.Mail.WinUI/MailAppShell.xaml.cs b/Wino.Mail.WinUI/MailAppShell.xaml.cs index 049c360a..0c826a5a 100644 --- a/Wino.Mail.WinUI/MailAppShell.xaml.cs +++ b/Wino.Mail.WinUI/MailAppShell.xaml.cs @@ -38,6 +38,8 @@ public sealed partial class MailAppShell : MailAppShellAbstract, IRecipient, IRecipient { + public Frame GetShellFrame() => InnerShellFrame; + [GeneratedDependencyProperty] public partial UIElement? TopShellContent { get; set; } diff --git a/Wino.Mail.WinUI/Services/NavigationService.cs b/Wino.Mail.WinUI/Services/NavigationService.cs index d804245d..61f5d7ea 100644 --- a/Wino.Mail.WinUI/Services/NavigationService.cs +++ b/Wino.Mail.WinUI/Services/NavigationService.cs @@ -129,6 +129,19 @@ public class NavigationService : NavigationServiceBase, INavigationService if (frameType == NavigationReferenceFrame.ShellFrame) return shellWindow.GetMainFrame(); + if (frameType == NavigationReferenceFrame.InnerShellFrame) + { + if (mainFrame.Content is MailAppShell mailAppShell) + { + return mailAppShell.GetShellFrame(); + } + + if (mainFrame.Content is CalendarAppShell calendarAppShell) + { + return calendarAppShell.GetShellFrame(); + } + } + var contentRoot = mainFrame.Content as UIElement; if (contentRoot == null) return mainFrame; diff --git a/Wino.Mail.WinUI/Services/NotificationBuilder.cs b/Wino.Mail.WinUI/Services/NotificationBuilder.cs index 372c9625..c5a44a55 100644 --- a/Wino.Mail.WinUI/Services/NotificationBuilder.cs +++ b/Wino.Mail.WinUI/Services/NotificationBuilder.cs @@ -1,9 +1,11 @@ using System; using System.Collections.Generic; using System.IO; +using System.Linq; using System.Threading.Tasks; using CommunityToolkit.Mvvm.Messaging; using Microsoft.Toolkit.Uwp.Notifications; +using Microsoft.UI.Xaml; using Serilog; using Windows.Data.Xml.Dom; using Windows.UI.Notifications; @@ -12,6 +14,7 @@ using Wino.Core.Domain.Entities.Calendar; using Wino.Core.Domain.Entities.Mail; using Wino.Core.Domain.Entities.Shared; using Wino.Core.Domain.Enums; +using Wino.Core.Domain.Extensions; using Wino.Core.Domain.Interfaces; using Wino.Messaging.UI; @@ -20,21 +23,29 @@ namespace Wino.Mail.WinUI.Services; public class NotificationBuilder : INotificationBuilder { private const string MailApplicationId = "App"; + private const string NotificationIconRootUri = "ms-appx:///Assets/NotificationIcons/"; + private static readonly int[] SupportedIconScales = [100, 125, 150, 200, 400]; private readonly IAccountService _accountService; private readonly IFolderService _folderService; private readonly IMailService _mailService; private readonly IThumbnailService _thumbnailService; + private readonly IPreferencesService _preferencesService; + private readonly IUnderlyingThemeService _underlyingThemeService; public NotificationBuilder(IAccountService accountService, IFolderService folderService, IMailService mailService, - IThumbnailService thumbnailService) + IThumbnailService thumbnailService, + IPreferencesService preferencesService, + IUnderlyingThemeService underlyingThemeService) { _accountService = accountService; _folderService = folderService; _mailService = mailService; _thumbnailService = thumbnailService; + _preferencesService = preferencesService; + _underlyingThemeService = underlyingThemeService; WeakReferenceMessenger.Default.Register(this, (r, msg) => { @@ -156,12 +167,12 @@ public class NotificationBuilder : INotificationBuilder private ToastButton GetDismissButton() => new ToastButton() .SetDismissActivation() - .SetImageUri(new Uri("ms-appx:///Assets/NotificationIcons/dismiss.png")); + .SetImageUri(GetNotificationIconUri("dismiss")); - private static ToastButton GetArchiveButton(Guid mailUniqueId) + private ToastButton GetArchiveButton(Guid mailUniqueId) => new ToastButton() .SetContent(Translator.MailOperation_Archive) - .SetImageUri(new Uri("ms-appx:///Assets/NotificationIcons/archive.png")) + .SetImageUri(GetNotificationIconUri("mail-archive")) .AddArgument(Constants.ToastMailUniqueIdKey, mailUniqueId.ToString()) .AddArgument(Constants.ToastActionKey, MailOperation.Archive) .AddArgument(Constants.ToastModeKey, Constants.ToastModeMail) @@ -170,16 +181,16 @@ public class NotificationBuilder : INotificationBuilder private ToastButton GetDeleteButton(Guid mailUniqueId) => new ToastButton() .SetContent(Translator.MailOperation_Delete) - .SetImageUri(new Uri("ms-appx:///Assets/NotificationIcons/delete.png")) + .SetImageUri(GetNotificationIconUri("mail-delete")) .AddArgument(Constants.ToastMailUniqueIdKey, mailUniqueId.ToString()) .AddArgument(Constants.ToastActionKey, MailOperation.SoftDelete) .AddArgument(Constants.ToastModeKey, Constants.ToastModeMail) .SetBackgroundActivation(); - private static ToastButton GetMarkAsReadButton(Guid mailUniqueId) + private ToastButton GetMarkAsReadButton(Guid mailUniqueId) => new ToastButton() .SetContent(Translator.MailOperation_MarkAsRead) - .SetImageUri(new System.Uri("ms-appx:///Assets/NotificationIcons/markread.png")) + .SetImageUri(GetNotificationIconUri("mail-markread")) .AddArgument(Constants.ToastMailUniqueIdKey, mailUniqueId.ToString()) .AddArgument(Constants.ToastActionKey, MailOperation.MarkAsRead) .AddArgument(Constants.ToastModeKey, Constants.ToastModeMail) @@ -290,11 +301,9 @@ public class NotificationBuilder : INotificationBuilder var builder = new ToastContentBuilder(); builder.SetToastScenario(ToastScenario.Reminder); - var localStart = calendarItem.LocalStartDate; - var reminderMinutes = (int)Math.Max(0, reminderDurationInSeconds / 60); - var reminderContext = reminderMinutes > 0 - ? $"Starts in {reminderMinutes} minute{(reminderMinutes == 1 ? string.Empty : "s")}" - : "Starting now"; + var localStart = calendarItem.GetLocalStartDate(); + var nowLocal = DateTime.Now; + var reminderContext = GetCalendarReminderContext(localStart, nowLocal); builder.AddText(calendarItem.Title); builder.AddText($"{reminderContext} - {localStart:g}"); @@ -305,7 +314,54 @@ public class NotificationBuilder : INotificationBuilder builder.AddArgument(Constants.ToastCalendarActionKey, Constants.ToastCalendarNavigateAction); builder.AddArgument(Constants.ToastCalendarItemIdKey, calendarItem.Id.ToString()); builder.AddArgument(Constants.ToastModeKey, Constants.ToastModeCalendar); - builder.AddButton(GetDismissButton()); + + var allowedSnoozeMinutes = CalendarReminderSnoozeOptions.GetAllowedSnoozeMinutes( + reminderDurationInSeconds, + _preferencesService.DefaultReminderDurationInSeconds); + + if (allowedSnoozeMinutes.Count > 0) + { + var preferredSnoozeMinutes = _preferencesService.DefaultSnoozeDurationInMinutes; + var defaultSnoozeMinutes = allowedSnoozeMinutes.Contains(preferredSnoozeMinutes) + ? preferredSnoozeMinutes + : allowedSnoozeMinutes[0]; + + var selectionBox = new ToastSelectionBox(Constants.ToastCalendarSnoozeDurationInputId) + { + DefaultSelectionBoxItemId = defaultSnoozeMinutes.ToString() + }; + + foreach (var snoozeMinutes in allowedSnoozeMinutes) + { + selectionBox.Items.Add(new ToastSelectionBoxItem( + snoozeMinutes.ToString(), + string.Format(Translator.CalendarReminder_SnoozeMinutesOption, snoozeMinutes))); + } + + builder.AddToastInput(selectionBox); + var snoozeButton = new ToastButton() + .SetContent(Translator.CalendarReminder_SnoozeAction) + .SetImageUri(GetNotificationIconUri("calendar-snooze")) + .SetBackgroundActivation(); + + builder.AddButton(snoozeButton) + .AddArgument(Constants.ToastCalendarActionKey, Constants.ToastCalendarSnoozeAction) + .AddArgument(Constants.ToastCalendarItemIdKey, calendarItem.Id.ToString()) + .AddArgument(Constants.ToastModeKey, Constants.ToastModeCalendar); + } + + builder.AddButton(new ToastButton() + .SetDismissActivation() + .SetImageUri(GetNotificationIconUri("dismiss"))); + + if (Uri.TryCreate(calendarItem.HtmlLink, UriKind.Absolute, out var joinUri)) + { + builder.AddButton(new ToastButton() + .SetContent(Translator.CalendarEventDetails_JoinOnline) + .SetImageUri(GetNotificationIconUri("calendar-join")) + .SetProtocolActivation(joinUri)); + } + builder.AddAudio(new ToastAudio() { Src = new Uri("ms-winsoundevent:Notification.Reminder") @@ -317,6 +373,36 @@ public class NotificationBuilder : INotificationBuilder return Task.CompletedTask; } + private static string GetCalendarReminderContext(DateTime localStart, DateTime nowLocal) + { + var delta = localStart - nowLocal; + var absDelta = delta.Duration(); + + if (absDelta < TimeSpan.FromMinutes(1)) + return delta.TotalSeconds >= 0 ? Translator.CalendarReminder_StartingNow : Translator.CalendarReminder_StartedNow; + + if (delta.TotalSeconds > 0) + { + if (delta.TotalHours >= 1) + { + var hours = Math.Max(1, (int)Math.Floor(delta.TotalHours)); + return string.Format(Translator.CalendarReminder_StartsInHours, hours); + } + + var minutes = Math.Max(1, (int)Math.Floor(delta.TotalMinutes)); + return string.Format(Translator.CalendarReminder_StartsInMinutes, minutes); + } + + if (absDelta.TotalHours >= 1) + { + var hoursAgo = Math.Max(1, (int)Math.Floor(absDelta.TotalHours)); + return string.Format(Translator.CalendarReminder_StartedHoursAgo, hoursAgo); + } + + var minutesAgo = Math.Max(1, (int)Math.Floor(absDelta.TotalMinutes)); + return string.Format(Translator.CalendarReminder_StartedMinutesAgo, minutesAgo); + } + private static void ShowToast(ToastContentBuilder builder, string? tag = null) { var toastNotification = new ToastNotification(builder.GetToastContent().GetXml()); @@ -329,4 +415,25 @@ public class NotificationBuilder : INotificationBuilder var notifier = ToastNotificationManager.CreateToastNotifier(); notifier.Show(toastNotification); } + + private Uri GetNotificationIconUri(string iconName) + { + var theme = _underlyingThemeService.IsUnderlyingThemeDark() ? "dark" : "light"; + var scale = GetClosestAvailableScale(); + return new($"{NotificationIconRootUri}{iconName}.theme-{theme}.scale-{scale}.png"); + } + + private static int GetClosestAvailableScale() + { + var rasterScale = 1.0; + + if (WinoApplication.MainWindow?.Content is FrameworkElement rootElement && + rootElement.XamlRoot != null) + { + rasterScale = rootElement.XamlRoot.RasterizationScale; + } + + var requestedScale = (int)Math.Round(rasterScale * 100); + return SupportedIconScales.OrderBy(s => Math.Abs(s - requestedScale)).First(); + } } diff --git a/Wino.Mail.WinUI/Services/PreferencesService.cs b/Wino.Mail.WinUI/Services/PreferencesService.cs index 9f952022..5c321dd1 100644 --- a/Wino.Mail.WinUI/Services/PreferencesService.cs +++ b/Wino.Mail.WinUI/Services/PreferencesService.cs @@ -284,6 +284,12 @@ public class PreferencesService(IConfigurationService configurationService) : Ob set => SaveProperty(propertyName: nameof(DefaultReminderDurationInSeconds), value); } + public int DefaultSnoozeDurationInMinutes + { + get => _configurationService.Get(nameof(DefaultSnoozeDurationInMinutes), 5); + set => SaveProperty(propertyName: nameof(DefaultSnoozeDurationInMinutes), value); + } + public int EmailSyncIntervalMinutes { get => _configurationService.Get(nameof(EmailSyncIntervalMinutes), 3); diff --git a/Wino.Mail.WinUI/Views/Calendar/CalendarSettingsPage.xaml b/Wino.Mail.WinUI/Views/Calendar/CalendarSettingsPage.xaml index d2990476..cfe95323 100644 --- a/Wino.Mail.WinUI/Views/Calendar/CalendarSettingsPage.xaml +++ b/Wino.Mail.WinUI/Views/Calendar/CalendarSettingsPage.xaml @@ -235,6 +235,17 @@ + + + + + + + + + diff --git a/Wino.Mail.WinUI/Views/Calendar/EventDetailsPage.xaml b/Wino.Mail.WinUI/Views/Calendar/EventDetailsPage.xaml index d07f57d0..86ceaf9b 100644 --- a/Wino.Mail.WinUI/Views/Calendar/EventDetailsPage.xaml +++ b/Wino.Mail.WinUI/Views/Calendar/EventDetailsPage.xaml @@ -207,6 +207,23 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/Wino.Services/CalendarService.cs b/Wino.Services/CalendarService.cs index 9ec43d34..2c46ff2c 100644 --- a/Wino.Services/CalendarService.cs +++ b/Wino.Services/CalendarService.cs @@ -336,6 +336,12 @@ public class CalendarService : BaseDatabaseService, ICalendarService }); } + public Task SnoozeCalendarItemAsync(Guid calendarItemId, DateTime snoozedUntilLocal) + => Connection.ExecuteAsync( + $"UPDATE {nameof(CalendarItem)} SET {nameof(CalendarItem.SnoozedUntil)} = ? WHERE {nameof(CalendarItem.Id)} = ?", + snoozedUntilLocal, + calendarItemId); + public async Task> CheckAndNotifyAsync(DateTime lastCheckLocal, DateTime nowLocal, ISet sentReminderKeys, CancellationToken cancellationToken = default) { if (sentReminderKeys == null) @@ -347,7 +353,8 @@ public class CalendarService : BaseDatabaseService, ICalendarService c.Id AS CalendarItemId, c.StartDate, c.StartTimeZone, - r.DurationInSeconds AS ReminderDurationInSeconds + r.DurationInSeconds AS ReminderDurationInSeconds, + c.SnoozedUntil FROM CalendarItem c INNER JOIN Reminder r ON r.CalendarItemId = c.Id INNER JOIN AccountCalendar ac ON ac.Id = c.CalendarId @@ -367,11 +374,14 @@ public class CalendarService : BaseDatabaseService, ICalendarService var eventStartLocal = candidate.StartDate.ToLocalTimeFromTimeZone(candidate.StartTimeZone); var triggerTimeLocal = eventStartLocal.AddSeconds(-candidate.ReminderDurationInSeconds); + var effectiveTriggerTimeLocal = candidate.SnoozedUntil.HasValue + ? MaxDateTime(triggerTimeLocal, candidate.SnoozedUntil.Value) + : triggerTimeLocal; - if (triggerTimeLocal <= lastCheckLocal || triggerTimeLocal > nowLocal) + if (effectiveTriggerTimeLocal <= lastCheckLocal || effectiveTriggerTimeLocal > nowLocal) continue; - var reminderKey = $"{candidate.CalendarItemId:N}:{candidate.ReminderDurationInSeconds}"; + var reminderKey = $"{candidate.CalendarItemId:N}:{candidate.ReminderDurationInSeconds}:{effectiveTriggerTimeLocal.Ticks}"; if (!sentReminderKeys.Add(reminderKey)) continue; @@ -438,11 +448,15 @@ public class CalendarService : BaseDatabaseService, ICalendarService #endregion + private static DateTime MaxDateTime(DateTime first, DateTime second) + => first >= second ? first : second; + private sealed class CalendarReminderCandidate { public Guid CalendarItemId { get; set; } public DateTime StartDate { get; set; } public string StartTimeZone { get; set; } public long ReminderDurationInSeconds { get; set; } + public DateTime? SnoozedUntil { get; set; } } } diff --git a/Wino.Services/DatabaseService.cs b/Wino.Services/DatabaseService.cs index f9981192..b2dfb7eb 100644 --- a/Wino.Services/DatabaseService.cs +++ b/Wino.Services/DatabaseService.cs @@ -120,6 +120,15 @@ public class DatabaseService : IDatabaseService .ConfigureAwait(false); } + var calendarItemColumns = await Connection.GetTableInfoAsync(nameof(CalendarItem)).ConfigureAwait(false); + + if (!calendarItemColumns.Any(c => c.Name == nameof(CalendarItem.SnoozedUntil))) + { + await Connection + .ExecuteAsync($"ALTER TABLE {nameof(CalendarItem)} ADD COLUMN {nameof(CalendarItem.SnoozedUntil)} TEXT NULL") + .ConfigureAwait(false); + } + var contactColumns = await Connection.GetTableInfoAsync(nameof(AccountContact)).ConfigureAwait(false); if (!contactColumns.Any(c => c.Name == nameof(AccountContact.ContactPictureFileId)))