Merge branch 'developpement'
continuous-integration/drone/push Build is passing Details

master
Matheo THIERRY 2 years ago
commit c321a864d2

@ -0,0 +1,67 @@
kind: pipeline
type: docker
name: pipelinefordeveloppement
trigger:
branch:
- developpement
- master
- upgradeclass
event:
- push
steps:
- name: build
image: mcr.microsoft.com/dotnet/sdk:7.0
commands:
- cd notus/
- dotnet restore notus_without_maui.sln
- dotnet build notus_without_maui.sln -c Release --no-restore /p:AndroidSdkDirectory=$ANDROID_SDK_ROOT -property:Aapt2ToolPath=$ANDROID_SDK_ROOT/build-tools/33.0.0
- dotnet publish notus_without_maui.sln -c Release --no-restore -o $CI_PROJECT_DIR/build/release
- name: tests
image: mcr.microsoft.com/dotnet/sdk:7.0
commands:
- cd notus/
- dotnet restore notus_without_maui.sln
- dotnet test notus_without_maui.sln --no-restore
depends_on: [build]
- name: sonar
image: hub.codefirst.iut.uca.fr/marc.chevaldonne/codefirst-dronesonarplugin-dotnet7
secrets: [ Sonar_Login ]
environment:
sonar_host: https://codefirst.iut.uca.fr/sonar/
sonar_token:
from_secret: Sonar_Login
project_key: notus_ThMo
coverage_exclusions: "Tests/**/**,Notus_Console/**"
commands:
- cd notus/
- dotnet restore notus_without_maui.sln
- dotnet sonarscanner begin /k:$${project_key} /d:sonar.host.url=$${sonar_host} /d:sonar.coverageReportPaths="coveragereport/SonarQube.xml" /d:sonar.coverage.exclusions=$${coverage_exclusions} /d:sonar.login=$${sonar_token}
- dotnet build notus_without_maui.sln -c Release --no-restore
- dotnet test notus_without_maui.sln --logger trx --no-restore /p:CollectCoverage=true /p:CoverletOutputFormat=cobertura --collect "XPlat Code Coverage"
- reportgenerator -reports:'**/coverage.cobertura.xml' -reporttypes:SonarQube -targetdir:"coveragereport" -verbosity:Verbose
- dotnet publish notus_without_maui.sln -c Release --no-restore -o CI_PROJECT_DIR/build/release
- dotnet sonarscanner end /d:sonar.login=$${sonar_token}
branch:
- developpement
depends_on: [build,tests]
- name: generate-and-deploy-docs
image: hub.codefirst.iut.uca.fr/thomas.bellembois/codefirst-docdeployer
failure: ignore
volumes:
- name: docs
path: /docs
commands:
- /entrypoint.sh
when:
branch:
- master
# environment:
# NODOXYGEN: true
volumes:
- name: docs
temp: {}

@ -0,0 +1,12 @@
[![Build Status](https://codefirst.iut.uca.fr/api/badges/matheo.thierry/notus/status.svg)](https://codefirst.iut.uca.fr/matheo.thierry/notus)
[![Quality Gate Status](https://codefirst.iut.uca.fr/sonar/api/project_badges/measure?project=notus_ThMo&metric=alert_status&token=f49680ff7f8cbaaa0872d836ad12346debbf5164)](https://codefirst.iut.uca.fr/sonar/dashboard?id=notus_ThMo)
[![Coverage](https://codefirst.iut.uca.fr/sonar/api/project_badges/measure?project=notus_ThMo&metric=coverage&token=f49680ff7f8cbaaa0872d836ad12346debbf5164)](https://codefirst.iut.uca.fr/sonar/dashboard?id=notus_ThMo)
[![Lines of Code](https://codefirst.iut.uca.fr/sonar/api/project_badges/measure?project=notus_ThMo&metric=ncloc&token=f49680ff7f8cbaaa0872d836ad12346debbf5164)](https://codefirst.iut.uca.fr/sonar/dashboard?id=notus_ThMo)
# SAE 2.01 - Développement d'une application
## Présentation
Dans le cadre de la SAE, notre mission consiste à développer une application de prise de notes. Cette application sera un outil pratique pour les personnes qui cherchent à organiser leurs idées et leurs pensées.
Notre application sera facile à utiliser et intuitive, avec une interface simple et épurée qui permettra à l'utilisateur de s'orienter facilement. Elle permettra de partager les notes avec d'autres utilisateurs et de les gérer avec des tags. Lapplication sera personnalisable grâce à la possibilité de choisir parmi plusieurs thèmes et logos fournis. Les utilisateurs pourront également créer leurs propres thèmes.

File diff suppressed because it is too large Load Diff

@ -6,4 +6,8 @@
<Nullable>enable</Nullable>
</PropertyGroup>
<ItemGroup>
<PackageReference Include="NHibernate" Version="5.4.2" />
</ItemGroup>
</Project>

@ -0,0 +1,34 @@

Microsoft Visual Studio Solution File, Format Version 12.00
# Visual Studio Version 17
VisualStudioVersion = 17.5.33424.131
MinimumVisualStudioVersion = 10.0.40219.1
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Biblioteque_de_Class", "Biblioteque_de_Class.csproj", "{CC2FF847-9D3A-44F7-8672-C70A4FE87C5B}"
EndProject
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Notus_Console", "..\Notus_Console\Notus_Console.csproj", "{F48CF8AB-163E-4D63-B210-BDA22BE5251D}"
ProjectSection(ProjectDependencies) = postProject
{CC2FF847-9D3A-44F7-8672-C70A4FE87C5B} = {CC2FF847-9D3A-44F7-8672-C70A4FE87C5B}
EndProjectSection
EndProject
Global
GlobalSection(SolutionConfigurationPlatforms) = preSolution
Debug|Any CPU = Debug|Any CPU
Release|Any CPU = Release|Any CPU
EndGlobalSection
GlobalSection(ProjectConfigurationPlatforms) = postSolution
{CC2FF847-9D3A-44F7-8672-C70A4FE87C5B}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{CC2FF847-9D3A-44F7-8672-C70A4FE87C5B}.Debug|Any CPU.Build.0 = Debug|Any CPU
{CC2FF847-9D3A-44F7-8672-C70A4FE87C5B}.Release|Any CPU.ActiveCfg = Release|Any CPU
{CC2FF847-9D3A-44F7-8672-C70A4FE87C5B}.Release|Any CPU.Build.0 = Release|Any CPU
{F48CF8AB-163E-4D63-B210-BDA22BE5251D}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{F48CF8AB-163E-4D63-B210-BDA22BE5251D}.Debug|Any CPU.Build.0 = Debug|Any CPU
{F48CF8AB-163E-4D63-B210-BDA22BE5251D}.Release|Any CPU.ActiveCfg = Release|Any CPU
{F48CF8AB-163E-4D63-B210-BDA22BE5251D}.Release|Any CPU.Build.0 = Release|Any CPU
EndGlobalSection
GlobalSection(SolutionProperties) = preSolution
HideSolutionNode = FALSE
EndGlobalSection
GlobalSection(ExtensibilityGlobals) = postSolution
SolutionGuid = {0AA9469C-FA7B-4AF1-9C90-056193DA2415}
EndGlobalSection
EndGlobal

@ -1,13 +0,0 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace Biblioteque_de_Class
{
internal class Category
{
public string nom { get; set; }
}
}

@ -0,0 +1,206 @@
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.ComponentModel.Design;
using System.Data;
using System.Linq;
using System.Runtime.Serialization;
using System.Text;
using System.Threading.Tasks;
using System.Web;
namespace Biblioteque_de_Class
{
[DataContract]
public class Database
{
[DataMember]
public List<Logo> DefaultLogoList { get; private set; }
[DataMember]
public List<Theme> ThemeList { get; private set; }
[DataMember]
public List<User> Users;
public List<User> UserList
{
get => Users; private set
{
Users = value;
}
}
public Database()
{
DefaultLogoList = new List<Logo>();
ThemeList = new List<Theme>();
UserList = new List<User>();
}
public void SetDefaultLogoList(List<Logo> defaultLogoList) { DefaultLogoList = defaultLogoList; }
public void SetDefaultThemeList(List<Theme> defaultThemeList) { ThemeList = defaultThemeList; }
public void SetUserList(List<User> userList) { UserList = userList; }
/// <summary>
/// recherche un utilisateur dans la liste d'utilisateur
/// </summary>
public User SearchUser(string name)
{
foreach(User user in UserList)
{
if (user.Username == name)
{
return user;
}
}
throw new NotFoundException("No user found with this username.");
}
/// <summary>
/// récupérer le lien d'un logo
/// </summary>
public string? GetLogoLink(string name)
{
foreach (Logo logo in DefaultLogoList)
{
if (logo.Name == name) { return logo.LogoLink; }
}
throw new NotFoundException("No logo link found.");
}
/// <summary>
/// récupérer un utilisateur
/// </summary>
public User GetUser(string name)
{
foreach (User user in UserList)
{
if (user.Username == name)
{
return user;
}
}
throw new AlreadyUsedException("No user found with this username.");
}
/// <summary>
/// comparer le mot de passe entré avec celui de l'utilisateur
/// </summary>
public static bool ComparePassword(User user, string? password) => user.Password == password;
/// <summary>
/// rechercher un mail dans la liste d'utilisateur
/// </summary>
public bool FindEmail(string email)
{
foreach (User user in UserList)
{
if (string.Equals(user.Email, email))
{
return true;
}
}
return false;
}
/// <summary>
/// ajouter un utilisateur dans la liste d'utilisateur
/// </summary>
public void AddUser(User user)
{
foreach (User existingUser in UserList)
{
if (existingUser.Username == user.Username)
{
throw new AlreadyUsedException("Username already used.");
}
else if (existingUser.Email == user.Email)
{
throw new AlreadyUsedException("Email already used.");
}
}
UserList.Add(user);
}
/// <summary>
/// supprimer un utilisateur dans la liste d'utilisateur
/// </summary>
public void RemoveUser(User user)
{
if (UserList.Contains(user))
{
UserList.Remove(user);
}
else
{
throw new NotFoundException("User not found.");
}
}
/// <summary>
/// ajouter un theme dans la liste de theme
/// </summary>
public void AddTheme(Theme theme)
{
foreach (Theme existingTheme in ThemeList)
{
if (existingTheme.Name == theme.Name)
{
throw new AlreadyExistException("Theme already Existing.");
}
}
ThemeList.Add(theme);
}
/// <summary>
/// récupérer un theme
/// </summary>
/// <param name="name"></param>
/// <returns></returns>
/// <exception cref="NotFoundException"></exception>
public Theme GetTheme(string name)
{
foreach (Theme theme in ThemeList)
{
if (theme.Name == name)
{
return theme;
}
}
throw new NotFoundException("Theme not found.");
}
/// <summary>
/// changer le pseudo d'un utilisateur
/// </summary>
/// <param name="user"></param>
/// <param name="newUsername"></param>
/// <exception cref="AlreadyUsedException"></exception>
public void ChangeUsername(User user, string newUsername)
{
foreach(User existingUser in UserList)
{
if(existingUser.Username == newUsername)
{
throw new AlreadyUsedException("this username is already used.");
}
}
user.Username = newUsername;
}
/// <summary>
/// vérifier si le nom du theme n'est pas déjà pris
/// </summary>
/// <param name="name"></param>
/// <returns></returns>
public bool VerifThemeNameNotTaken(string name)
{
foreach (Theme theme in ThemeList)
{
if (theme.Name == name)
{
return false;
}
}
return true;
}
}
}

@ -0,0 +1,63 @@
using System;
using System.Collections.Generic;
using System.Diagnostics.CodeAnalysis;
using System.Linq;
using System.Runtime.Serialization;
using System.Text;
using System.Threading.Tasks;
namespace Biblioteque_de_Class
{
[Serializable, ExcludeFromCodeCoverage]
public class NotAllowedException : Exception
{
public NotAllowedException(string message) : base(message)
{
}
protected NotAllowedException(SerializationInfo info, StreamingContext context) : base(info, context)
{
}
}
[Serializable, ExcludeFromCodeCoverage]
public class AlreadyUsedException : Exception
{
public AlreadyUsedException(string message) : base(message)
{
}
protected AlreadyUsedException(SerializationInfo info, StreamingContext context) : base(info, context)
{
}
}
[Serializable, ExcludeFromCodeCoverage]
public class NotFoundException : Exception
{
public NotFoundException(string message) : base(message)
{
}
protected NotFoundException(SerializationInfo info, StreamingContext context) : base(info, context)
{
}
}
[Serializable, ExcludeFromCodeCoverage]
public class AlreadyExistException : Exception
{
public AlreadyExistException(string message) : base(message)
{
}
protected AlreadyExistException(SerializationInfo info, StreamingContext context) : base(info, context)
{
}
}
[Serializable, ExcludeFromCodeCoverage]
public class FileException : Exception
{
public FileException(string message) : base(message)
{
}
protected FileException(SerializationInfo info, StreamingContext context) : base(info, context)
{
}
}
}

@ -0,0 +1,28 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Security.Cryptography;
using System.Text;
using System.Threading.Tasks;
namespace Biblioteque_de_Class
{
public class HashCodeModel
{
public static string GetSHA256Hash(string input)
{
using (SHA256 sha256Hash = SHA256.Create())
{
byte[] bytes = sha256Hash.ComputeHash(Encoding.UTF8.GetBytes(input));
StringBuilder builder = new StringBuilder();
for (int i = 0; i < bytes.Length; i++)
{
builder.Append(bytes[i].ToString("x2"));
}
return builder.ToString();
}
}
}
}

@ -0,0 +1,17 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace Biblioteque_de_Class
{
public interface IManager
{
public void SaveDatabaseData(List<User> UserList);
public void SaveDefaultData(List<Theme> DefaultThemeList, List<Logo> DefaultLogoList);
public List<User> LoadDatabaseData();
public List<Theme> LoadDefaultTheme();
public List<Logo> LoadDefaultLogo();
}
}

@ -0,0 +1,26 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Runtime.Serialization;
using System.Text;
using System.Threading.Tasks;
namespace Biblioteque_de_Class
{
[DataContract]
public class Logo
{
[DataMember]
public string Name { get; set; }
[DataMember]
public string LogoLink { get; set; }
public Logo(string name, string logoLink)
{
Name = name;
LogoLink = logoLink;
}
public override string ToString() => $"Logo -> Name: {Name}\nLink: {LogoLink}";
}
}

@ -1,43 +1,177 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Runtime.Serialization;
using System.Text;
using System.Threading.Tasks;
namespace Biblioteque_de_Class
{
internal class Note
[DataContract(IsReference = true)]
public class Note
{
public string Nom {
get { return Nom; }
set { if (value==null) { Nom = "Note sans nom"; } else { Nom = value; } }
[DataMember]
public int id { get; init; }
[DataMember]
private string name;
[DataMember]
public string Name
{
get { return name; }
set { if (value == null) { name = "Unnamed Note"; } else { name = value; } }
}
[DataMember]
public string Text { get; private set; } = "";
[DataMember]
private string logoPath;
[DataMember]
public string LogoPath
{
get { return logoPath; }
private set { if (value == null) { logoPath = "PATH TO DEFAULT LOGO"; } else { logoPath = value; } }
}
[DataMember]
public DateOnly CreationDate { get; init; }
[DataMember]
public DateOnly ModificationDate { get; private set; }
[DataMember]
public List<NoteImage> ImageList { get; private set; }
[DataMember]
public List<User> Collaborators { get; private set; }
[DataMember]
public List<User> Editors { get; private set; }
[DataMember]
public User Owner { get; private set; }
public Note(int initId,string name, string logoPath, User owner)
{
id = initId;
Name = name;
LogoPath = logoPath;
CreationDate = DateOnly.FromDateTime(DateTime.Now);
ModificationDate = DateOnly.FromDateTime(DateTime.Now);
ImageList = new List<NoteImage>();
Collaborators = new List<User>();
Editors = new List<User>() { owner };
Owner = owner;
}
public string LogoPATH {
get { return LogoPATH; }
set { if (value == null) { LogoPATH = "PATH TO DEFAULT LOGO"; } else { LogoPATH = value; } }
public override string ToString() => $"Note -> Name: {Name}\nLogoPath: {LogoPath}";
/// <summary>
/// vérifier si l'utilisateur est le propriétaire de la note
/// </summary>
public bool VerifyOwner(User user)
{
if (user == Owner) { return true; }
else { throw new NotAllowedException("User is not the owner"); }
}
public List<Category> atributionTag;
public List<String> listeImage;
public List<String> listeLigneTexte;
public List<String> listePosiImage;
public Note(string nom, string logoPATH)
/// <summary>
/// ajouter une image à la note
/// </summary>
/// <param name="imageLink"></param>
/// <param name="position"></param>
public void AddImage(string imageLink, List<int> position)
{
Nom = nom;
LogoPATH = logoPATH;
string newname = (ImageList.Count + 1).ToString();
ImageList.Add(new NoteImage(newname, imageLink, position));
}
public Note RechercherNote(List<Note> listeNote, string nom)
/// <summary>
/// supprimer une image de la note
/// </summary>
/// <param name="name"></param>
/// <exception cref="NotFoundException"></exception>
public void RemoveImage(string name)
{
foreach (Note note in listeNote)
foreach (NoteImage image in ImageList)
{
if (note.Nom == nom)
if (image.Name == name)
{
return note;
ImageList.Remove(image);
return;
}
}
return null;
throw new NotFoundException("Image not found");
}
/// <summary>
/// ajouter du texte à la note
/// </summary>
/// <param name="text"></param>
public void AddText( User user, string text)
{
if (user == Owner || Editors.Contains(user)) { ModificationDate = DateOnly.FromDateTime(DateTime.Now); }
else { throw new NotAllowedException("User is not the owner or an editor"); }
Text = Text + "\n" + text;
}
/// <summary>
/// vérifier si l'utilisateur est un éditeur de la note
/// </summary>
public bool VerifyPrivilege(User user)
{
return Editors.Contains(user);
}
/// <summary>
/// ajouter un utilisateur en tant que coopérateur
/// </summary>
public void AddCollaborator(User owner, User user)
{
if (VerifyOwner(owner)) { Collaborators.Add(user); }
user.NoteList.Add(this);
}
/// <summary>
/// supprimer un utilisateur en tant que coopérateur
/// </summary>
public void RemoveCollaborator(User owner, User user)
{
if (VerifyOwner(owner)) { Collaborators.Remove(user); }
user.NoteList.Remove(this);
}
/// <summary>
/// passer un coopérateur en tant qu'éditeur
/// </summary>
public void AddEditor(User owner, User user)
{
if (Editors.Contains(user)) { throw new AlreadyExistException("user already in editors."); }
if (VerifyOwner(owner)) { Editors.Add(user); }
}
/// <summary>
/// supprimer un coopérateur de la liste des éditeurs
/// </summary>
public void RemoveEditor(User owner, User user)
{
if (!Editors.Contains(user)) { throw new NotFoundException("user not found in editors."); }
if (VerifyOwner(owner)) { Editors.Remove(user); }
}
/// <summary>
/// changer le nom de la note
/// </summary>
/// <param name="user"></param>
/// <param name="newName"></param>
public void ChangeName(User user, string newName)
{
if (VerifyOwner(user)) { Name = newName; }
}
/// <summary>
/// changer le logo de la note
/// </summary>
/// <param name="user"></param>
/// <param name="newLogoPath"></param>
public void ChangeLogo(User user, string newLogoPath)
{
if (VerifyOwner(user)) { LogoPath = newLogoPath; }
}
}
}

@ -0,0 +1,29 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Runtime.Serialization;
using System.Text;
using System.Threading.Tasks;
namespace Biblioteque_de_Class
{
[DataContract]
public class NoteImage
{
[DataMember]
public string Name { get; set; }
[DataMember]
public string ImageLink { get; set; }
[DataMember]
public List<int> Position { get; set; }
public NoteImage(string name, string imageLink, List<int> position)
{
Name = name;
ImageLink = imageLink;
Position = position;
}
public override string ToString() => $"image -> name: {Name}\nlink: {ImageLink}";
}
}

@ -0,0 +1,52 @@
using Microsoft.VisualBasic;
namespace Biblioteque_de_Class
{
public class PersistenceManager
{
private Database db = new Database();
private readonly IManager persistence;
public PersistenceManager(IManager pers)
{
persistence = pers;
}
public void SaveDatabaseData(Database database)
{
persistence.SaveDatabaseData(database.UserList);
}
public void SaveDefaultData(Database database)
{
persistence.SaveDefaultData(database.ThemeList, database.DefaultLogoList);
}
public Database LoadDatabaseData()
{
db.SetUserList(persistence.LoadDatabaseData());
db.SetDefaultThemeList(persistence.LoadDefaultTheme());
db.SetDefaultLogoList(persistence.LoadDefaultLogo());
return db;
}
public Database GetOnlyDatabaseUser()
{
db.SetUserList(persistence.LoadDatabaseData());
return db;
}
public Database GetOnlyDatabaseDefaultTheme()
{
db.SetDefaultThemeList(persistence.LoadDefaultTheme());
return db;
}
public Database GetOnlyDatabaseDefaultLogo()
{
db.SetDefaultLogoList(persistence.LoadDefaultLogo());
return db;
}
}
}

@ -0,0 +1,26 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Runtime.Serialization;
using System.Text;
using System.Threading.Tasks;
namespace Biblioteque_de_Class
{
[DataContract]
public class Tags
{
[DataMember]
public string Name { get; set; }
[DataMember]
public string Color { get; set; }
public Tags(string name, string color)
{
Name = name;
Color = color;
}
public override string ToString() => $"tag -> name: {Name}\ncolor: {Color}";
}
}

@ -0,0 +1,40 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Runtime.Serialization;
using System.Text;
using System.Threading.Tasks;
namespace Biblioteque_de_Class
{
[DataContract]
public class Theme
{
[DataMember]
public string Name { get; set; }
[DataMember]
public List<string> ColorList { get; private set; }
public Theme(string name, List<string> colorList)
{
Name = name;
ColorList = colorList;
}
public override string ToString() => $"name: {Name}\ncolor 1: {ColorList[0]}\ncolor 2: {ColorList[1]}\ncolor 3: {ColorList[2]}\n";
/// <summary>
/// Change a specific color of the theme.
/// </summary>
public void ChangeColor(string color, string newColor)
{
for (int i = 0; i < ColorList.Count; i++)
{
if (ColorList[i] == color)
{
ColorList[i] = newColor;
}
}
}
}
}

@ -0,0 +1,493 @@
using Microsoft.VisualBasic.FileIO;
using System.ComponentModel;
using System.ComponentModel.DataAnnotations.Schema;
using System.Runtime.Serialization;
namespace Biblioteque_de_Class
{
[DataContract]
public class User
{
[DataMember]
public string Username { get; set; }
[DataMember]
public string Email { get; private set; }
[DataMember]
public string Password { get; private set; }
[DataMember]
public string Picture { get; private set; }
[DataMember]
public Theme UseTheme { get; set; }
[DataMember]
public List<Note> NoteList { get; set; }
[DataMember]
public List<Tags> TagList { get; private set; }
[DataMember]
public List<Note> FavList { get; private set; }
[DataMember(EmitDefaultValue = false)]
public bool IsConnected { get; set; }
[DataMember]
public Dictionary<Note, List<Tags>> NoteTagged { get; set; }
public List<Theme> AddedTheme { get; set; }
public User(string username, string email, string password)
{
Username = username;
Email = email;
Password = password;
Picture = "defaultpicture.png";
UseTheme = new("", ",,".Split(',').ToList());
NoteList = new List<Note>();
TagList = new List<Tags>();
FavList = new List<Note>();
NoteTagged = new Dictionary<Note, List<Tags>>();
AddedTheme = new List<Theme>();
}
public override string ToString() => $"username: {Username}\nemail: {Email}\npassword: {Password}\nOwned notes: {NoteList.Count}";
/// <summary>
/// rechercher une note dans la liste de note de l'utilisateur et la liste de note favoris de l'utilisateur
/// </summary>
public List<Note> SearchNoteByName(List<Note> toResearchIntoList, string name)
{
List<Note> searchedNotes = new List<Note>();
string search = name.ToLower();
foreach (Note note in toResearchIntoList)
{
if (note.Name.ToLower().Contains(search))
{
searchedNotes.Add(note);
}
}
return searchedNotes;
}
public List<Note> SearchNoteByTag(List<Note> toResearchIntoList, string name)
{
List<Note> searchedNotes = new();
Tags tagtoresearchby = GetTagByName(name);
foreach(Note note in toResearchIntoList)
{
if (NoteTagged[note].Contains(tagtoresearchby))
{
searchedNotes.Add(note);
}
}
return searchedNotes;
}
/// <summary>
/// rechercher un tag dans la liste de tag de l'utilisateur
/// </summary>
public List<Tags> SearchTagByName(List<Tags> ToResearchIntoList, string name)
{
List<Tags> searchedTags = new List<Tags>();
string search = name.ToLower();
foreach (Tags tag in ToResearchIntoList)
{
if (tag.Name.ToLower().Contains(search))
{
searchedTags.Add(tag);
}
}
return searchedTags;
}
/// <summary>
/// rechercher par date de création ou de modification
/// </summary>
/// <param name="ToResearchIntoList"></param>
/// <param name="name"></param>
/// <param name="FirstDate"></param>
/// <param name="SecondeDate"></param>
/// <returns></returns>
public List<Note> SearchNoteByDate(List<Note> ToResearchIntoList, string name, DateOnly FirstDate, DateOnly SecondeDate)
{
List<Note> searchedNotes = new List<Note>();
string search = name.ToLower();
foreach (Note note in ToResearchIntoList)
{
if (note.Name.ToLower().Contains(search) && note.CreationDate >= FirstDate && note.CreationDate <= SecondeDate || note.Name.ToLower().Contains(search) && note.ModificationDate >= FirstDate && note.ModificationDate <= SecondeDate)
{
searchedNotes.Add(note);
}
}
return searchedNotes;
}
/// <summary>
/// rechercher par nom de la note
/// </summary>
/// <param name="name"></param>
/// <returns></returns>
/// <exception cref="NotFoundException"></exception>
public Note GetNoteByName(string name)
{
foreach (Note note in NoteList)
{
if (note.Name == name)
{
return note;
}
}
throw new NotFoundException("Note not found");
}
/// <summary>
/// rechercher par nom du tag
/// </summary>
/// <param name="name"></param>
/// <returns></returns>
/// <exception cref="NotFoundException"></exception>
public Tags GetTagByName(string name)
{
foreach (Tags tag in TagList)
{
if (tag.Name == name)
{
return tag;
}
}
throw new NotFoundException("Tag not found");
}
/// <summary>
/// ajouter une note dans la liste de note favorite de l'utilisateur
/// </summary>
public void AddFavorite(Note note)
{
if (FavList.Contains(note))
{
throw new AlreadyExistException("Note already in favorites");
}
FavList.Add(note);
}
/// <summary>
/// supprimer une note dans la liste de note favorite de l'utilisateur
/// </summary>
public void RemoveFavorite(Note note)
{
if (FavList.Contains(note))
{
FavList.Remove(note);
}
else
{
throw new NotFoundException("Note not found");
}
}
/// <summary>
///creer une note
/// </summary>
public Note CreateNote(string name, string imagePath)
{
foreach (Note existingNote in NoteList)
{
if (existingNote.Name == name)
{
throw new AlreadyExistException("Note already exists");
}
}
Note note;
if (NoteList.Count == 0) { note = new Note(0, name, imagePath, this); }
else { note = new Note(NoteList[NoteList.Count - 1].id + 1, name, imagePath, this); }
NoteList.Add(note);
NoteTagged.Add(note, new List<Tags>());
return note;
}
/// <summary>
/// supprimer une note
/// </summary>
public void DeleteNote(Note note)
{
note.VerifyOwner(this);
foreach (Note existingNote in NoteList)
{
if (existingNote == note)
{
NoteList.Remove(existingNote);
NoteTagged.Remove(existingNote);
return;
}
}
throw new NotFoundException("Note not found");
}
/// <summary>
/// creer un tag
/// </summary>
public void CreateTag(string name, string color)
{
foreach (Tags tag in TagList)
{
if (tag.Name == name)
{
throw new AlreadyExistException("Tag already exists");
}
}
TagList.Add(new Tags(name, color));
}
/// <summary>
/// supprimer un tag
/// </summary>
public void DeleteTag(Tags tagtodelete)
{
foreach (Tags tag in TagList)
{
if (tag == tagtodelete)
{
TagList.Remove(tag);
return;
}
}
throw new NotFoundException("Tag not found");
}
public void EditTagName(Tags tag, string newName)
{
if (!TagList.Contains(tag))
{
throw new NotFoundException("Tag not found");
}
else
{
foreach (Tags existingTag in TagList)
{
if (existingTag.Name == newName)
{
throw new AlreadyExistException("Tag already exists");
}
}
}
tag.Name = newName;
}
public void EditTagColor(Tags tag, string newColor)
{
if (!TagList.Contains(tag))
{
throw new NotFoundException("Tag not found");
}
tag.Color = newColor;
}
/// <summary>
/// ajouter un tag a une note
/// </summary>
public void AddTagFromNoteList(Note note, Tags tagToAdd)
{
if (!TagList.Contains(tagToAdd))
{
throw new NotFoundException("Tag not found");
}
if (!NoteList.Contains(note))
{
throw new NotFoundException("Note not found");
}
NoteTagged[note].Add(tagToAdd);
}
/// <summary>
/// supprimer un tag a une note
/// </summary>
public void RemoveTagFromNoteList(Note note, Tags tagToRemove)
{
if (!TagList.Contains(tagToRemove))
{
throw new NotFoundException("Tag not found");
}
if (!NoteList.Contains(note))
{
throw new NotFoundException("Note not found");
}
NoteTagged[note].Remove(tagToRemove);
}
/// <summary>
/// modifier le nom d'une note
/// </summary>
/// <param name="note"></param>
/// <param name="newname"></param>
/// <exception cref="AlreadyUsedException"></exception>
public void SetNoteName(Note note, string newname)
{
if (!NoteList.Contains(note))
{
throw new NotFoundException("Note not found");
}
foreach(Note n in NoteList)
{
if(n.Name == newname)
{
throw new AlreadyUsedException("This name is already used");
}
}
note.Name = newname;
}
/// <summary>
/// modifier le mot de passe de l'utilisateur
/// </summary>
/// <param name="newPassword"></param>
/// <exception cref="AlreadyExistException"></exception>
/// <exception cref="NotAllowedException"></exception>
public void ChangePassword(string newPassword)
{
if (newPassword.Length < 8) { throw new NotAllowedException("this password is too short."); }
if (Password == HashCodeModel.GetSHA256Hash(newPassword).ToString())
{
throw new AlreadyUsedException("this password is already used.");
}
else
{
Password = HashCodeModel.GetSHA256Hash(newPassword).ToString();
}
}
/// <summary>
/// modifier le theme de l'utilisateur
/// </summary>
/// <param name="theme"></param>
/// <exception cref="AlreadyExistException"></exception>
public void ChangeTheme(Theme theme)
{
if (UseTheme.Name == theme.Name)
{
throw new AlreadyExistException("this theme is already selected.");
}
UseTheme = theme;
}
public void ChangeThemeName(Theme theme, string newName)
{
foreach (Theme existingTheme in AddedTheme)
{
if (existingTheme.Name == newName)
{
throw new AlreadyExistException("this theme is already existing.");
}
}
if (theme.Name == newName)
{
throw new AlreadyExistException("this theme is already selected.");
}
theme.Name = newName;
}
public void ChangeThemeColors(Theme theme, List<string> newColor)
{
int compteurSameColor = 0;
for(int i = 0; i < theme.ColorList.Count; i++)
{
if (theme.ColorList[i] == newColor[i])
{
compteurSameColor++;
}
}
if (compteurSameColor == theme.ColorList.Count)
{
throw new AlreadyExistException("this theme those colors");
}
if (theme.ColorList.Count != newColor.Count)
{
throw new NotFoundException("this theme doesn't have the same number of colors");
}
for (int i = 0; i < theme.ColorList.Count; i++)
{
theme.ChangeColor(theme.ColorList[i], newColor[i]);
}
}
/// <summary>
/// ajouter un theme dans la liste de theme
/// </summary>
public void AddTheme(Theme theme)
{
foreach (Theme existingTheme in AddedTheme)
{
if (existingTheme.Name == theme.Name)
{
throw new AlreadyExistException("Theme already used.");
}
}
AddedTheme.Add(theme);
}
/// <summary>
/// supprimer un theme dans la liste de theme
/// </summary>
public void RemoveTheme(Theme theme)
{
if (AddedTheme.Contains(theme))
{
AddedTheme.Remove(theme);
}
else
{
throw new NotFoundException("Theme not found.");
}
}
/// <summary>
/// recuperer un theme dans la liste de theme ajouté par l'utilisateur
/// </summary>
/// <param name="name"></param>
/// <returns></returns>
/// <exception cref="NotFoundException"></exception>
public Theme GetTheme(string name)
{
foreach (Theme theme in AddedTheme)
{
if (theme.Name == name)
{
return theme;
}
}
throw new NotFoundException("Theme not found.");
}
/// <summary>
/// modifier l'email de l'utilisateur
/// </summary>
/// <param name="newEmail"></param>
/// <exception cref="AlreadyExistException"></exception>
public void ChangeEmail(string newEmail)
{
if (newEmail.Length < 3 ) { throw new NotAllowedException("this is not a mail address."); }
if (Email == newEmail) { throw new AlreadyUsedException("this email is the same."); }
Email = newEmail;
}
/// <summary>
/// changer la photo de profil de l'utilisateur
/// </summary>
/// <param name="path"></param>
public void ChangeProfilePicture(string path)
{
if (path.Length < 3)
{
Picture = "default.png";
}
else
{
List<string> picture = new();
picture = path.Split('.').ToList();
string extension = picture.Last();
if (extension != "png" && extension != "jpg" && extension != "jpeg")
{
throw new NotFoundException("this extension is not allowed.");
}
Picture = path;
}
}
public void SetDefaultTheme(Theme theme)
{
UseTheme = theme;
}
}
}

@ -1,24 +0,0 @@
namespace Biblioteque_de_Class
{
public class Utilisateur
{
private string Psd { get; set; }
private string Mail { get; set; }
private string Mdp { get; set; }
private List<Note> NoteList;
public Utilisateur(string Upseudo, string Umail, string Upassword)
{
Psd = Upseudo;
Mail=Umail;
Mdp = Upassword;
NoteList = new List<Note>();
}
public override string ToString()
{
return $"pseudo : {Psd}\nmail : {Mail}\npassword : {Mdp}\nNote possédé : { NoteList.Count}";
}
}
}

@ -7,4 +7,9 @@
<Nullable>enable</Nullable>
</PropertyGroup>
<ItemGroup>
<ProjectReference Include="..\Biblioteque_de_Class\Biblioteque_de_Class.csproj" />
<ProjectReference Include="..\Notus_Persistence\Notus_Persistance.csproj" />
</ItemGroup>
</Project>

File diff suppressed because it is too large Load Diff

@ -0,0 +1,13 @@
<Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup>
<TargetFramework>net7.0</TargetFramework>
<ImplicitUsings>enable</ImplicitUsings>
<Nullable>enable</Nullable>
</PropertyGroup>
<ItemGroup>
<ProjectReference Include="..\Biblioteque_de_Class\Biblioteque_de_Class.csproj" />
</ItemGroup>
</Project>

@ -0,0 +1,82 @@
using Biblioteque_de_Class;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Runtime.Serialization.Json;
using System.Text;
using System.Security.Cryptography;
using System.Threading.Tasks;
namespace Notus_Persistance
{
public class Stub : IManager
{
public void SaveDatabaseData(List<User> UserList)
{
throw new NotImplementedException();
}
public void SaveDefaultData(List<Theme> DefaultThemeList, List<Logo> DefaultLogoList)
{
throw new NotImplementedException() ;
}
//Loaders
List<User> IManager.LoadDatabaseData()
{
List<User> userList = new List<User>();
Note nselect;
User uselect;
// add some users
userList.Add(new User("Nicolas", "leHeros@gmail.com", "FeurFeur"));
userList.Add(new User("Benjamin", "labsent@gmail.com", "Moto2005"));
userList.Add(new User("Liam", "liammonchanin@gmail.com", "Baguette"));
userList.Add(new User("Brigitte", "Macroutte@gmail.com", "4949Trois"));
// add some notes and tags to go faster
for (int i = 0; i < userList.Count; i++)
{
userList[i].CreateNote($"Note {i}", "DefaultLogo.png");
userList[i].CreateTag($"Tag {i}", "#5555FF");
}
// add note to user for sharing note test mixed with tag
uselect = userList[0];
nselect = uselect.NoteList[0];
nselect.AddCollaborator(uselect, userList[1]);
nselect.AddCollaborator(uselect, userList[2]);
uselect.AddTagFromNoteList(nselect, uselect.TagList[0]);
nselect.AddEditor(uselect, userList[2]);
// add some default logos and themes
foreach (User user in userList)
{
user.ChangePassword(user.Password);
}
return userList;
}
public List<Theme> LoadDefaultTheme()
{
List<Theme> DefaultThemeList = new List<Theme>();
DefaultThemeList.Add(new("blacktheme", "#000000,#FF00FF,#OOFFOO".Split(',').ToList()));
DefaultThemeList.Add(new("whitetheme", "#FFFFFF,#FF00FF,#OOFFOO".Split(',').ToList()));
return DefaultThemeList;
}
public List<Logo> LoadDefaultLogo()
{
List<Logo> DefaultLogoList = new List<Logo>();
DefaultLogoList.Add(new("default","DefaultLogo.png"));
DefaultLogoList.Add(new("1", "Logo1.png"));
DefaultLogoList.Add(new("2", "Logo2.png"));
return DefaultLogoList;
}
}
}

@ -0,0 +1,107 @@
using Biblioteque_de_Class;
using System.Runtime.Serialization;
using System.Xml;
using System.IO;
using System.Diagnostics.CodeAnalysis;
namespace Notus_Persistance
{
[ExcludeFromCodeCoverage]
public class ToXML : IManager
{
// /../../../..
private string DataFilePath { get; set; } = Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData), "NotusData");
private const string DataFileName = "/Userdata.xml";
private const string DefaultThemeName = "/defaultTheme.xml";
private const string DefaultLogoName = "/defaultLogo.xml";
private static readonly DataContractSerializer DatabaseXmlSerializer = new(typeof(Database), GetKnownTypes());
public void SaveDatabaseData(List<User> UserList)
{
if (!Directory.Exists(DataFilePath))
{
Directory.CreateDirectory(DataFilePath);
}
XmlWriterSettings settings = new() { Indent = true };
using TextWriter tw = File.CreateText(Path.Combine(DataFilePath + DataFileName));
using XmlWriter writer = XmlWriter.Create(tw, settings);
DatabaseXmlSerializer.WriteObject(writer, UserList);
}
public void SaveDefaultData(List<Theme> DefaultThemeList, List<Logo> DefaultLogoList)
{
if (!Directory.Exists(DataFilePath))
{ Directory.CreateDirectory(DataFilePath); }
XmlWriterSettings settings = new() { Indent = true };
using TextWriter tw = File.CreateText(Path.Combine(DataFilePath + DefaultThemeName));
using XmlWriter writer = XmlWriter.Create(tw, settings);
DatabaseXmlSerializer.WriteObject(writer, DefaultThemeList);
using TextWriter tw2 = File.CreateText(Path.Combine(DataFilePath + DefaultLogoName));
using XmlWriter writer2 = XmlWriter.Create(tw2, settings);
DatabaseXmlSerializer.WriteObject(writer2, DefaultLogoList);
}
private static IEnumerable<Type> GetKnownTypes()
{
yield return typeof(User);
yield return typeof(List<User>);
yield return typeof(Theme);
yield return typeof(List<Theme>);
yield return typeof(Logo);
yield return typeof(List<Logo>);
}
public List<User> LoadDatabaseData()
{
if (File.Exists(Path.Combine(DataFilePath + DataFileName)))
{
using (FileStream fileStream = File.OpenRead(Path.Combine(DataFilePath + DataFileName)))
{
return DatabaseXmlSerializer.ReadObject(fileStream) is not List<User> user
? throw new FileException("Failed to load Database. The loaded object is null.")
: user;
}
}
else
{
throw new FileException("No data file found.");
}
}
public List<Theme> LoadDefaultTheme()
{
if (File.Exists(Path.Combine(DataFilePath + DefaultThemeName)))
{
using (FileStream fileStream = File.OpenRead(Path.Combine(DataFilePath + DefaultThemeName)))
{
return DatabaseXmlSerializer.ReadObject(fileStream) is not List<Theme> DefaultThemeList
? throw new FileException("Failed to load Default Theme. The loaded object is null.")
: DefaultThemeList;
}
}
else
{
throw new FileException("No data file found.");
}
}
public List<Logo> LoadDefaultLogo()
{
if (File.Exists(Path.Combine(DataFilePath + DefaultLogoName)))
{
using (FileStream fileStream = File.OpenRead(Path.Combine(DataFilePath + DefaultLogoName)))
{
return DatabaseXmlSerializer.ReadObject(fileStream) is not List<Logo> DefaultLogoList
? throw new FileException("Failed to load Default Logo. The loaded object is null.")
: DefaultLogoList;
}
}
else
{
throw new FileException("No data file found.");
}
}
}
}

@ -0,0 +1,223 @@
using Biblioteque_de_Class;
namespace UnitTests_Model
{
[TestFixture]
public class Database_Tests
{
private Database database;
[SetUp]
public void Setup()
{
database = new Database();
database.UserList.Add(new User("John", "john@example.com", "password123"));
database.UserList.Add(new User("Jane", "jane@example.com", "choco"));
database.UserList.Add(new User("Alice", "alice@example.com", "choco"));
database.DefaultLogoList.Add(new Logo("Logo1", "link1"));
database.DefaultLogoList.Add(new Logo("Logo2", "link2"));
database.DefaultLogoList.Add(new Logo("Logo3", "link3"));
}
// SearchUser tests
[Test]
public void SearchUser_UserDoesNotExist_ThrowsException()
{
string searchName = "Bob";
Assert.Throws<NotFoundException>(() => database.SearchUser(searchName));
}
[Test]
public void SearchUser_CaseInsensitiveSearch_ReturnsMatchingUsers()
{
string searchName = "Alice";
User searchedUser = database.SearchUser(searchName);
Assert.That(searchedUser.Username, Is.EqualTo("Alice"));
}
// GetLogoLink tests
[Test]
public void GetLogoLink_LogoExists_ReturnsLogoLink()
{
Assert.That(database.GetLogoLink("Logo2"), Is.EqualTo("link2"));
}
[Test]
public void GetLogoLink_LogoDoesNotExist_ThrowsException()
{
string logoName = "Logo4";
Assert.Throws<NotFoundException>(() => database.GetLogoLink(logoName));
}
// GetUser tests
[Test]
public void GetUser_UserExists_ReturnsUser()
{
string userName = "Alice";
User user = database.GetUser(userName);
Assert.IsNotNull(user);
Assert.That(user.Username, Is.EqualTo(userName));
}
[Test]
public void GetUser_UserDoesNotExist_ThrowsException()
{
string userName = "Eve";
Assert.Throws<AlreadyUsedException>(() => database.GetUser(userName));
}
// ComparePassword tests
[Test]
public void ComparePassword_CorrectPassword_ReturnsTrue()
{
User user = database.UserList[0];
string password = "password123";
bool result = Database.ComparePassword(user, password);
Assert.That(result, Is.True);
}
[Test]
public void ComparePassword_IncorrectPassword_ReturnsFalse()
{
User user = database.UserList[0];
string password = "incorrectPassword";
bool result = Database.ComparePassword(user, password);
Assert.That(result, Is.False);
}
// FindEmail tests
[Test]
public void FindEmail_ExistingEmail_ReturnsTrue()
{
string email = "john@example.com";
bool result = database.FindEmail(email);
Assert.IsTrue(result);
}
[Test]
public void FindEmail_NonExistingEmail_ReturnsFalse()
{
string email = "olivedecarglass@example.com";
bool result = database.FindEmail(email);
Assert.IsFalse(result);
}
// AddUser tests
[Test]
public void AddUser_ValidUser_AddsUserToList()
{
User user = new User("Bob", "bob@example.com", "password123");
database.AddUser(user);
Assert.That(database.UserList, Contains.Item(user));
}
[Test]
public void AddUser_DuplicateUserName_ThrowsException()
{
User user = new User("John", "johnDae@example.com", "password123");
Assert.Throws<AlreadyUsedException>(() => database.AddUser(user));
}
[Test]
public void AddUser_DuplicateUserEmail_ThrowsException()
{
User user = new User("Bob", "john@example.com", "password123");
Assert.Throws<AlreadyUsedException>(() => database.AddUser(user));
}
// removeUser tests
[Test]
public void RemoveUser_ExistingUser_RemovesUserFromList()
{
User user = database.UserList[0];
database.RemoveUser(user);
Assert.That(database.UserList, !Contains.Item(user));
}
[Test]
public void RemoveUser_NotExistingUser_ThrowsException()
{
User user = new User("Bob", "bob@example.com", "password123");
Assert.Throws<NotFoundException>(() => database.RemoveUser(user));
}
// AddTheme tests
[Test]
public void AddTheme_ValidTheme_AddsThemeToList()
{
Theme theme = new Theme("Theme1", ",,,".Split().ToList());
database.AddTheme(theme);
Assert.That(database.ThemeList, Contains.Item(theme));
}
[Test]
public void AddTheme_DuplicateTheme_ThrowsException()
{
Theme theme = new Theme("Theme1", ",,,".Split().ToList());
database.ThemeList.Add(theme);
Assert.Throws<AlreadyExistException>(() => database.AddTheme(theme));
}
// GetTheme tests
[Test]
public void GetTheme_ExistingTheme_ReturnsTheme()
{
Theme expectedTheme = new Theme("Theme1", ",,,".Split().ToList());
database.ThemeList.Add(expectedTheme);
Theme theme = database.GetTheme("Theme1");
Assert.IsNotNull(theme);
Assert.That(theme, Is.EqualTo(expectedTheme));
}
[Test]
public void GetTheme_NonExistingTheme_ReturnsNull()
{
Theme expectedTheme = new Theme("Theme1", ",,,".Split().ToList());
database.ThemeList.Add(expectedTheme);
Assert.Throws<NotFoundException>(() => database.GetTheme("NonExistingTheme"));
}
// ChangeUsername tests
[Test]
public void ChangeUsername_CorrectReplaceName_ChangesUsername()
{
User userSelected = database.UserList[0];
string newUsername = "duberlute";
database.ChangeUsername(userSelected, newUsername);
User updatedUser = database.UserList.Where(u => u.Username == newUsername).First();
Assert.IsNotNull(updatedUser);
Assert.That(updatedUser.Username, Is.EqualTo(newUsername));
}
[Test]
public void ChangeUsername_UsernameAlreadyUsed_ThrowsException()
{
User userNotSelected = database.UserList[2];
string newUsername = "Jane";
Assert.Throws<AlreadyUsedException>(() => database.ChangeUsername(userNotSelected, newUsername));
}
// VerifThemeNameNotTaken tests
[Test]
public void VerifThemeNameNotTaken_NameNotTaken_ReturnsTrue()
{
string themeName = "NewTheme";
bool result = database.VerifThemeNameNotTaken(themeName);
Assert.IsTrue(result);
}
[Test]
public void VerifThemeNameNotTaken_NameAlreadyTaken_ReturnsFalse()
{
Theme expectedTheme = new Theme("Theme1", ",,,".Split().ToList());
database.ThemeList.Add(expectedTheme);
string themeName = "Theme1";
bool result = database.VerifThemeNameNotTaken(themeName);
Assert.IsFalse(result);
}
}
}

@ -0,0 +1,265 @@
using Biblioteque_de_Class;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace UnitTests_Model
{
[TestFixture]
public class Note_Tests
{
private User owner;
private Note note;
[SetUp]
public void Setup()
{
owner = new User("John", "john@example.com", "password123");
note = new Note(1, "Note 1", "logoPath", owner);
}
[Test]
public void Note_Constructor_InitializesProperties()
{
Assert.That(note.id, Is.EqualTo(1));
Assert.That(note.Name, Is.EqualTo("Note 1"));
Assert.That(note.LogoPath, Is.EqualTo("logoPath"));
Assert.That(note.Owner, Is.EqualTo(owner));
Assert.That(note.ImageList.Count, Is.EqualTo(0));
Assert.That(note.Collaborators.Count, Is.EqualTo(0));
Assert.That(note.Editors.Count, Is.EqualTo(1));
Assert.That(note.Editors[0], Is.EqualTo(owner));
}
[Test]
public void Note_VerifyOwner_UserIsOwner_ReturnsTrue()
{
bool result = note.VerifyOwner(owner);
Assert.IsTrue(result);
}
[Test]
public void Note_VerifyOwner_UserIsNotOwner_ThrowsNotAllowedException()
{
User otherUser = new User("Jane", "jane@example.com", "password123");
Assert.Throws<NotAllowedException>(() => note.VerifyOwner(otherUser));
}
[Test]
public void Note_AddImage_ValidData_AddsImage()
{
string imageLink = "imageLink";
List<int> position = new List<int> { 1, 2, 3 };
note.AddImage(imageLink, position);
Assert.That(note.ImageList.Count, Is.EqualTo(1));
Assert.That(note.ImageList[0].Name, Is.EqualTo("1"));
Assert.That(note.ImageList[0].ImageLink, Is.EqualTo(imageLink));
Assert.That(note.ImageList[0].Position, Is.EqualTo(position));
}
[Test]
public void Note_RemoveImage_ExistingImage_RemovesImage()
{
string imageLink = "imageLink";
List<int> position = new List<int> { 1, 2, 3 };
note.AddImage(imageLink, position);
note.RemoveImage("1");
Assert.That(note.ImageList.Count, Is.EqualTo(0));
}
[Test]
public void Note_RemoveImage_NonExistingImage_ThrowsNotFoundException()
{
string imageLink = "imageLink";
List<int> position = new List<int> { 1, 2, 3 };
note.AddImage(imageLink, position);
Assert.Throws<NotFoundException>(() => note.RemoveImage("2"));
}
[Test]
public void Note_AddText_UserIsOwner_AddsText()
{
User user = owner;
string text = "Some text";
note.AddText(user, text);
Assert.That(note.Text, Is.EqualTo("\n" + text));
Assert.That(note.ModificationDate, Is.EqualTo(DateOnly.FromDateTime(DateTime.Now)));
}
[Test]
public void Note_AddText_UserIsEditor_AddsText()
{
User user = new User("Editor", "editor@example.com", "password123");
note.AddEditor(owner, user);
string text = "Some text";
note.AddText(user, text);
Assert.That(note.Text, Is.EqualTo("\n"+text));
Assert.That(note.ModificationDate, Is.EqualTo(DateOnly.FromDateTime(DateTime.Now)));
}
[Test]
public void Note_AddText_UserIsNotOwnerOrEditor_ThrowsNotAllowedException()
{
User user = new User("Jane", "jane@example.com", "password123");
string text = "Some text";
Assert.Throws<NotAllowedException>(() => note.AddText(user, text));
}
[Test]
public void Note_VerifyPrivilege_UserIsEditor_ReturnsTrue()
{
User editor = new User("Editor", "editor@example.com", "password123");
note.AddEditor(owner, editor);
bool result = note.VerifyPrivilege(editor);
Assert.IsTrue(result);
}
[Test]
public void Note_VerifyPrivilege_UserIsNotEditor_ReturnsFalse()
{
User user = new User("User", "user@example.com", "password123");
bool result = note.VerifyPrivilege(user);
Assert.IsFalse(result);
}
[Test]
public void Note_AddCollaborator_UserIsOwner_AddsCollaborator()
{
User collaborator = new User("Collaborator", "collaborator@example.com", "password123");
note.AddCollaborator(owner, collaborator);
Assert.That(note.Collaborators.Count, Is.EqualTo(1));
Assert.That(note.Collaborators[0], Is.EqualTo(collaborator));
Assert.IsTrue(collaborator.NoteList.Contains(note));
}
[Test]
public void Note_AddCollaborator_UserIsNotOwner_ThrowsNotAllowedException()
{
User otherUser = new User("OtherUser", "otheruser@example.com", "password123");
User collaborator = new User("Collaborator", "collaborator@example.com", "password123");
Assert.Throws<NotAllowedException>(() => note.AddCollaborator(otherUser, collaborator));
}
[Test]
public void Note_RemoveCollaborator_UserIsOwner_RemovesCollaborator()
{
User collaborator = new User("Collaborator", "collaborator@example.com", "password123");
note.AddCollaborator(owner, collaborator);
note.RemoveCollaborator(owner, collaborator);
Assert.That(note.Collaborators.Count, Is.EqualTo(0));
Assert.IsFalse(collaborator.NoteList.Contains(note));
}
[Test]
public void Note_RemoveCollaborator_UserIsNotOwner_ThrowsNotAllowedException()
{
User otherUser = new User("OtherUser", "otheruser@example.com", "password123");
User collaborator = new User("Collaborator", "collaborator@example.com", "password123");
note.AddCollaborator(owner, collaborator);
Assert.Throws<NotAllowedException>(() => note.RemoveCollaborator(otherUser, collaborator));
}
[Test]
public void Note_AddEditor_UserAlreadyEditor_ThrowsAlreadyExistException()
{
User editor = new User("Editor", "editor@example.com", "password123");
note.AddEditor(owner, editor);
Assert.Throws<AlreadyExistException>(() => note.AddEditor(owner, editor));
}
[Test]
public void Note_AddEditor_UserIsOwner_AddsEditor()
{
User editor = new User("Editor", "editor@example.com", "password123");
note.AddEditor(owner, editor);
Assert.That(note.Editors.Count, Is.EqualTo(2));
Assert.That(note.Editors[1], Is.EqualTo(editor));
}
[Test]
public void Note_RemoveEditor_UserNotEditor_ThrowsNotFoundException()
{
User user = new User("User", "user@example.com", "password123");
Assert.Throws<NotFoundException>(() => note.RemoveEditor(owner, user));
}
[Test]
public void Note_RemoveEditor_UserIsOwner_RemovesEditor()
{
User editor = new User("Editor", "editor@example.com", "password123");
note.AddEditor(owner, editor);
note.RemoveEditor(owner, editor);
Assert.That(note.Editors.Count, Is.EqualTo(1));
Assert.IsFalse(note.Editors.Contains(editor));
}
[Test]
public void Note_ChangeName_UserIsOwner_ChangesName()
{
User user = owner;
string newName = "New Note Name";
note.ChangeName(user, newName);
Assert.That(note.Name, Is.EqualTo(newName));
}
[Test]
public void Note_ChangeName_UserIsNotOwner_NameNotChanged()
{
User user = new User("OtherUser", "otheruser@example.com", "password123");
string newName = "New Note Name";
Assert.Throws<NotAllowedException>(() => note.ChangeName(user, newName));
}
[Test]
public void Note_ChangeLogo_UserIsOwner_ChangesLogo()
{
User user = owner;
string newLogoPath = "newLogoPath";
note.ChangeLogo(user, newLogoPath);
Assert.That(note.LogoPath, Is.EqualTo(newLogoPath));
}
[Test]
public void Note_ChangeLogo_UserIsNotOwner_LogoNotChanged()
{
User user = new User("OtherUser", "otheruser@example.com", "password123");
string newLogoPath = "newLogoPath";
Assert.Throws<NotAllowedException>(() => note.ChangeLogo(user, newLogoPath));
}
}
}

@ -0,0 +1,24 @@
<Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup>
<TargetFramework>net7.0</TargetFramework>
<ImplicitUsings>enable</ImplicitUsings>
<Nullable>enable</Nullable>
<IsPackable>false</IsPackable>
<IsTestProject>true</IsTestProject>
</PropertyGroup>
<ItemGroup>
<PackageReference Include="Microsoft.NET.Test.Sdk" Version="17.5.0" />
<PackageReference Include="NUnit" Version="3.13.3" />
<PackageReference Include="NUnit3TestAdapter" Version="4.4.2" />
<PackageReference Include="NUnit.Analyzers" Version="3.6.1" />
<PackageReference Include="coverlet.collector" Version="3.2.0" />
</ItemGroup>
<ItemGroup>
<ProjectReference Include="..\..\Biblioteque_de_Class\Biblioteque_de_Class.csproj" />
</ItemGroup>
</Project>

@ -0,0 +1,481 @@
using Biblioteque_de_Class;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace UnitTests_Model
{
public class User_Tests
{
private User user;
[SetUp]
public void Setup()
{
user = new User("John", "john@example.com", "password123");
user.CreateTag("tag1","#FF0000");
user.CreateTag("tag2", "#00FF00");
user.CreateNote("note1", "default.png");
user.AddTagFromNoteList(user.NoteList[0], user.TagList[0]);
user.CreateNote("note2", "default.png");
user.AddTheme(new Theme("white","#FFAAAA,#000000,#999999".Split(',').ToList()));
}
//test searchnoteByName
[Test]
public void User_SearchNoteByName_ValidData_ReturnsNote()
{
Note note = user.SearchNoteByName(user.NoteList,"note1").First();
Assert.That(note.Name, Is.EqualTo("note1"));
}
[Test]
public void User_SearchNoteByName_InvalidData_ReturnsNull()
{
Assert.That(user.SearchNoteByName(user.NoteList, "note3"), Is.Empty);
}
//test seachNoteBytag
[Test]
public void User_SearchNoteByTag_ValidData_ReturnsNote()
{
Note note = user.SearchNoteByTag(user.NoteList, "tag1").First();
Assert.That(note.Name, Is.EqualTo("note1"));
}
[Test]
public void User_SearchNoteByTag_InvalidData_ReturnsNull()
{
Assert.Throws<NotFoundException>(() => user.SearchNoteByTag(user.NoteList, "tag3"));
}
//test SearchNoteByDate
[Test]
public void User_SearchNoteByDate_ValidData_ReturnsNote()
{
Note note = user.SearchNoteByDate(user.NoteList, "note1", DateOnly.FromDateTime(DateTime.Now), DateOnly.FromDateTime(DateTime.Now)).First();
Assert.That(note.Name, Is.EqualTo("note1"));
}
[Test]
public void User_SearchNoteByDate_InvalidData_ReturnsNull()
{
Assert.That(user.SearchNoteByDate(user.NoteList, "note3", DateOnly.FromDateTime(DateTime.Now), DateOnly.FromDateTime(DateTime.Now)), Is.Empty);
}
//test GetNoteByName
[Test]
public void User_GetNoteByName_ValidData_ReturnsNote()
{
Note note = user.GetNoteByName("note1");
Assert.That(note.Name, Is.EqualTo("note1"));
}
[Test]
public void User_GetNoteByName_InvalidData_ReturnsNull()
{
Assert.Throws<NotFoundException>(() => user.GetNoteByName("note3"));
}
//test searchTagByName
[Test]
public void User_SearchTagByName_ValidData_ReturnsTag()
{
Tags tag = user.SearchTagByName(user.TagList, "tag1").First();
Assert.That(tag.Name, Is.EqualTo("tag1"));
}
[Test]
public void User_SearchTagByName_InvalidData_ReturnsNull()
{
Assert.That(user.SearchTagByName(user.TagList, "tag3"), Is.Empty);
}
//test AddFavorite
[Test]
public void User_AddFavorite_ValidData_AddNote()
{
user.AddFavorite(user.NoteList[0]);
Assert.That(user.FavList.Count, Is.EqualTo(1));
}
[Test]
public void User_AddFavorite_InvalidData_ThrowException()
{
user.AddFavorite(user.NoteList[0]);
Assert.Throws<AlreadyExistException>(() => user.AddFavorite(user.NoteList[0]));
}
//test RemoveFavorite
[Test]
public void User_RemoveFavorite_ValidData_RemoveNote()
{
user.AddFavorite(user.NoteList[0]);
user.RemoveFavorite(user.NoteList[0]);
Assert.That(user.FavList, Is.Empty);
}
[Test]
public void User_RemoveFavorite_InvalidData_ThrowException()
{
Assert.Throws<NotFoundException>(() => user.RemoveFavorite(user.NoteList[0]));
}
//test createNote
[Test]
public void User_CreateNote_ValidData_AddNote()
{
user.CreateNote("note3", "default.png");
Assert.That(user.NoteList.Count, Is.EqualTo(3));
}
[Test]
public void User_CreateNote_InvalidData_ThrowException()
{
user.CreateNote("note3", "default.png");
Assert.Throws<AlreadyExistException>(() => user.CreateNote("note3", "default.png"));
}
[Test]
public void User_CreateNote_ValidData_secondNote_AddNote()
{
User user2 = new User("John", "rien", "choco");
user2.CreateNote("note3", "default.png");
user2.CreateNote("note4", "default.png");
Assert.That(user2.NoteList.Count, Is.EqualTo(2));
Assert.That(user2.NoteList[1].id, Is.EqualTo(1));
}
//test DeleteNote
[Test]
public void User_DeleteNote_ValidData_RemoveNote()
{
Note note = user.NoteList[0];
user.DeleteNote(note);
Assert.That(user.NoteList.Count, Is.EqualTo(1));
}
[Test]
public void User_DeleteNote_InvalidData_ThrowException()
{
Note note = user.NoteList[0];
user.DeleteNote(note);
Assert.Throws<NotFoundException>(() => user.DeleteNote(note));
}
//test CreateTag
[Test]
public void User_CreateTag_ValidData_AddTag()
{
user.CreateTag("tag3", "#FF0000");
Assert.That(user.TagList.Count, Is.EqualTo(3));
}
[Test]
public void User_CreateTag_InvalidData_ThrowException()
{
user.CreateTag("tag3", "#FF0000");
Assert.Throws<AlreadyExistException>(() => user.CreateTag("tag2", "#FF0000"));
}
//test DeleteTag
[Test]
public void User_DeleteTag_ValidData_RemoveTag()
{
Tags tag = user.TagList[0];
user.DeleteTag(tag);
Assert.That(user.TagList.Count, Is.EqualTo(1));
}
[Test]
public void User_DeleteTag_InvalidData_ThrowException()
{
Tags tag = user.TagList[0];
user.DeleteTag(tag);
Assert.Throws<NotFoundException>(() => user.DeleteTag(tag));
}
//test EditTagName
[Test]
public void User_EditTagName_ValidData_EditTag()
{
user.EditTagName(user.TagList[0], "tag3");
Assert.That(user.TagList[0].Name, Is.EqualTo("tag3"));
}
[Test]
public void User_EditTagName_InvalidData_ThrowException()
{
Tags tags = new Tags("tag2", "#FF0000");
Assert.Throws<NotFoundException>(() => user.EditTagName(tags, "tag1"));
}
[Test]
public void User_EditTagName_InvalidData2_ThrowException()
{
Assert.Throws<AlreadyExistException>(() => user.EditTagName(user.TagList[0], "tag1"));
}
//test EditTagColor
[Test]
public void User_EditTagColor_ValidData_EditTag()
{
user.EditTagColor(user.TagList[0], "#FF0000");
Assert.That(user.TagList[0].Color, Is.EqualTo("#FF0000"));
}
[Test]
public void User_EditTagColor_InvalidData_ThrowException()
{
Tags tags = new Tags("tag2", "#FF0000");
Assert.Throws<NotFoundException>(() => user.EditTagColor(tags, "#000000"));
}
//Test AddTagFromNoteList
[Test]
public void User_AddTagFromNoteList_ValidData_AddTag()
{
user.AddTagFromNoteList(user.NoteList[0], user.TagList[1]);
Assert.That(user.NoteTagged[user.NoteList[0]].Count, Is.EqualTo(2));
}
[Test]
public void User_AddTagFromNoteList_InvalidData_ThrowException()
{
Tags tags = new Tags("tag2", "#FF0000");
Assert.Throws<NotFoundException>(() => user.AddTagFromNoteList(user.NoteList[0], tags));
}
[Test]
public void User_AddTagFromNoteList_InvalidData2_ThrowException()
{
User uvide = new User("", "", "");
Note note = new Note(4,"rien", "default.png", uvide);
Assert.Throws<NotFoundException>(() => user.AddTagFromNoteList(note, user.TagList[0]));
}
//Test RemoveTagFromNoteList
[Test]
public void User_RemoveTagFromNoteList_ValidData_RemoveTag()
{
user.RemoveTagFromNoteList(user.NoteList[0], user.TagList[0]);
Assert.That(user.NoteTagged[user.NoteList[0]], Is.Empty);
}
[Test]
public void User_RemoveTagFromNoteList_InvalidData_ThrowException()
{
Tags tags = new Tags("tag2", "#FF0000");
Assert.Throws<NotFoundException>(() => user.RemoveTagFromNoteList(user.NoteList[0], tags));
}
[Test]
public void User_RemoveTagFromNoteList_InvalidData2_ThrowException()
{
User uvide = new User("", "", "");
Note note = new Note(4, "rien", "default.png", uvide);
Assert.Throws<NotFoundException>(() => user.RemoveTagFromNoteList(note, user.TagList[0]));
}
//test SetNoteName
[Test]
public void User_SetNoteName_ValidData_EditNote()
{
user.SetNoteName(user.NoteList[0], "note3");
Assert.That(user.NoteList[0].Name, Is.EqualTo("note3"));
}
[Test]
public void User_SetNoteName_InvalidData_ThrowException()
{
User uvide = new User("", "", "");
Note note = new Note(4, "rien", "default.png", uvide);
Assert.Throws<NotFoundException>(() => user.SetNoteName(note, "note2"));
}
[Test]
public void User_SetNoteName_InvalidData2_ThrowException()
{
Assert.Throws<AlreadyUsedException>(() => user.SetNoteName(user.NoteList[0], "note1"));
}
//test ChangePassword
[Test]
public void User_ChangePassword_ValidData_ChangePassword()
{
user.ChangePassword("chocoChoco");
Assert.That(user.Password, Is.EqualTo(HashCodeModel.GetSHA256Hash("chocoChoco").ToString()));
}
[Test]
public void User_ChangePassword_InvalidData_ThrowException()
{
user.ChangePassword("chocoChoco");
Assert.Throws<AlreadyUsedException>(() => user.ChangePassword("chocoChoco"));
}
[Test]
public void User_ChangePassword_InvalidData1_ThrowException()
{
Assert.Throws<NotAllowedException>(() => user.ChangePassword("choco"));
}
[Test]
public void User_ChangePassword_InvalidData2_ThrowException()
{
Assert.Throws<NotAllowedException>(() => user.ChangePassword(""));
}
//test ChangeTheme
[Test]
public void User_ChangeTheme_ValidData_ChangeTheme()
{
user.ChangeTheme(new Theme("dark", "#0000FF,#FF00FF,#FFFFFF".Split(',').ToList()));
Assert.That(user.UseTheme.Name, Is.EqualTo("dark"));
}
[Test]
public void User_ChangeTheme_InvalidData_ThrowException()
{
user.ChangeTheme(new Theme("dark", "#0000FF,#FF00FF,#FFFFFF".Split(',').ToList()));
Assert.Throws<AlreadyExistException>(() => user.ChangeTheme(new Theme("dark", "#0000FF,#FF00FF,#FFFFFF".Split(',').ToList())));
}
//test ChangeThemeName
[Test]
public void User_ChangeThemeName_ValidData_ChangeThemeName()
{
user.ChangeThemeName(user.AddedTheme[0], "dark");
Assert.That(user.AddedTheme[0].Name, Is.EqualTo("dark"));
}
[Test]
public void User_ChangeThemeName_InvalidData_ThrowException()
{
user.AddTheme(new Theme("dark", "#0000FF,#FF00FF,#FFFFFF".Split(',').ToList()));
Assert.Throws<AlreadyExistException>(() => user.ChangeThemeName(user.AddedTheme[0], "dark"));
}
[Test]
public void User_ChangeThemeName_InvalidData2_ThrowException()
{
Assert.Throws<AlreadyExistException>(() => user.ChangeThemeName(user.AddedTheme[0], "white"));
}
//test ChangeThemeColors
[Test]
public void User_ChangeThemeColors_ValidData_ChangeThemeColors()
{
// Arrange
var theme = new Theme("blacktheme", new List<string> { "#000000", "#FF00FF", "#OOFFOO" });
var newColors = new List<string> { "#111111", "#222222", "#333333" };
// Act
user.ChangeThemeColors(theme, newColors);
// Assert
Assert.That(theme.ColorList[0], Is.EqualTo(newColors[0]));
Assert.That(theme.ColorList[1], Is.EqualTo(newColors[1]));
Assert.That(theme.ColorList[2], Is.EqualTo(newColors[2]));
}
[Test]
public void User_ChangeThemeColors_InvalidData_ThrowException()
{
// Arrange
var theme = new Theme("blacktheme", new List<string> { "#000000", "#FF00FF", "#OOFFOO" });
var sameColors = new List<string> { "#000000", "#FF00FF", "#OOFFOO" };
// Act & Assert
Assert.Throws<AlreadyExistException>(() => user.ChangeThemeColors(theme, sameColors));
}
[Test]
public void User_ChangeThemeColors_InvalidData1_ThrowException()
{
// Arrange
var theme = new Theme("blacktheme", new List<string> { "#000000", "#FF00FF", "#OOFFOO" });
var differentColors = new List<string> { "#111111", "#222222", "#333333", "#444444" };
// Act & Assert
Assert.Throws<NotFoundException>(() => user.ChangeThemeColors(theme, differentColors));
}
//test AddTheme
[Test]
public void User_AddTheme_ValidData_AddTheme()
{
user.AddTheme(new Theme("dark", "#0000FF,#FF00FF,#FFFFFF".Split(',').ToList()));
Assert.That(user.AddedTheme[1].Name, Is.EqualTo("dark"));
}
[Test]
public void User_AddTheme_InvalidData_ThrowException()
{
user.AddTheme(new Theme("dark", "#0000FF,#FF00FF,#FFFFFF".Split(',').ToList()));
Assert.Throws<AlreadyExistException>(() => user.AddTheme(new Theme("dark", "#0000FF,#FF00FF,#FFFFFF".Split(',').ToList())));
}
//test RemoveTheme
[Test]
public void User_RemoveTheme_ValidData_RemoveTheme()
{
user.AddTheme(new Theme("dark", "#0000FF,#FF00FF,#FFFFFF".Split(',').ToList()));
user.RemoveTheme(user.AddedTheme[1]);
Assert.That(user.AddedTheme.Count, Is.EqualTo(1));
}
[Test]
public void User_RemoveTheme_InvalidData_ThrowException()
{
Assert.Throws<NotFoundException>(() => user.RemoveTheme(new Theme("dark", "#0000FF,#FF00FF,#FFFFFF".Split(',').ToList())));
}
//test GetTheme
[Test]
public void User_GetTheme_ValidData_GetTheme()
{
user.AddTheme(new Theme("dark", "#0000FF,#FF00FF,#FFFFFF".Split(',').ToList()));
Assert.That(user.GetTheme("dark").Name, Is.EqualTo("dark"));
}
[Test]
public void User_GetTheme_InvalidData_ThrowException()
{
Assert.Throws<NotFoundException>(() => user.GetTheme("dark"));
}
//test ChangeEmail
[Test]
public void User_ChangeEmail_ValidData_ChangeEmail()
{
user.ChangeEmail("nouvelleEmail@gmail.com");
Assert.That(user.Email, Is.EqualTo("nouvelleEmail@gmail.com"));
}
[Test]
public void User_ChangeEmail_InvalidData_ThrowException()
{
Assert.Throws<NotAllowedException>(() => user.ChangeEmail(""));
}
//test ChangeProfilePicture
[Test]
public void User_ChangeProfilePicture_ValidData_ChangeProfilePicture()
{
user.ChangeProfilePicture("nouvellePhoto.png");
Assert.That(user.Picture, Is.EqualTo("nouvellePhoto.png"));
}
[Test]
public void User_ChangeProfilePicture_InvalidData_ThrowException()
{
Assert.Throws<NotFoundException>(() => user.ChangeProfilePicture("photosansextesion"));
}
[Test]
public void User_ChangeProfilePicture_InvalidData2_ThrowException()
{
user.ChangeProfilePicture("");
Assert.That(user.Picture, Is.EqualTo("default.png"));
}
}
}

@ -0,0 +1 @@
global using NUnit.Framework;

@ -0,0 +1,76 @@
using Biblioteque_de_Class;
using Notus_Persistance;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace UnitTests_Persistance
{
public class Stub_Tests
{
PersistenceManager manager;
Database result;
[SetUp]
public void Setup()
{
manager = new PersistenceManager(new Stub());
result = new Database();
}
[Test]
public void SaveDatabaseData_Test()
{
Assert.Throws<NotImplementedException>(() => manager.SaveDatabaseData(result));
}
[Test]
public void LoadDatabaseData_Test()
{
result = manager.GetOnlyDatabaseUser();
Assert.NotNull(result);
Assert.NotNull(result.UserList);
Assert.That(result.UserList.Count, Is.EqualTo(4));
User user1 = result.UserList[0];
Assert.That(user1.Username, Is.EqualTo("Nicolas"));
Assert.That(user1.Email, Is.EqualTo("leHeros@gmail.com"));
Assert.That(user1.Password, Is.EqualTo(HashCodeModel.GetSHA256Hash("FeurFeur")));
Note user1Note = user1.NoteList[0];
Tags user1Tag = user1.TagList[0];
Assert.That(user1Note.Name, Is.EqualTo("Note 0"));
Assert.That(user1Note.LogoPath, Is.EqualTo("DefaultLogo.png"));
Assert.That(user1Tag.Name, Is.EqualTo("Tag 0"));
Assert.That(user1Tag.Color, Is.EqualTo("#5555FF"));
}
[Test]
public void LoadDefaultTheme_Test()
{
result = manager.GetOnlyDatabaseDefaultTheme();
Assert.NotNull(result);
Assert.That(result.ThemeList.Count, Is.EqualTo(2));
Theme theme1 = result.ThemeList[0];
Assert.That(theme1.Name, Is.EqualTo("blacktheme"));
Assert.That(theme1.ColorList[0], Is.EqualTo("#000000"));
Assert.That(theme1.ColorList[1], Is.EqualTo("#FF00FF"));
Assert.That(theme1.ColorList[2], Is.EqualTo("#OOFFOO"));
}
[Test]
public void LoadDefaultLogo_Test()
{
result = manager.GetOnlyDatabaseDefaultLogo();
Assert.NotNull(result);
Assert.That(result.DefaultLogoList.Count, Is.EqualTo(3));
Logo logo1 = result.DefaultLogoList[0];
Assert.That(logo1.Name, Is.EqualTo("default"));
Assert.That(logo1.LogoLink, Is.EqualTo("DefaultLogo.png"));
}
}
}

@ -0,0 +1,115 @@
using Biblioteque_de_Class;
using Notus_Persistance;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace UnitTests_Persistance
{
public class ToXML_Tests
{
PersistenceManager manager;
Database result;
[SetUp]
public void Setup()
{
manager = new PersistenceManager(new Stub());
result = new Database();
}
[Test]
public void SaveDatabaseData_Test()
{
PersistenceManager manager2 = new PersistenceManager(new ToXML());
Database result2 = manager.LoadDatabaseData();
manager2.SaveDatabaseData(result2);
Database result3 = manager2.GetOnlyDatabaseUser();
Assert.NotNull(result3);
Assert.That(result2.UserList.Count, Is.EqualTo(result3.UserList.Count));
Assert.That(result2.UserList[0].Username, Is.EqualTo(result3.UserList[0].Username));
Assert.That(result2.UserList[0].Email, Is.EqualTo(result3.UserList[0].Email));
Assert.That(result2.UserList[0].Password, Is.EqualTo(result3.UserList[0].Password));
}
[Test]
public void LoadDefaultData_Test()
{
PersistenceManager manager2 = new PersistenceManager(new ToXML());
Database result2 = new();
result2.SetDefaultThemeList(manager.GetOnlyDatabaseDefaultTheme().ThemeList);
result2.SetDefaultLogoList(manager.GetOnlyDatabaseDefaultLogo().DefaultLogoList);
manager2.SaveDefaultData(result2);
Database result3 = new();
result3.SetDefaultThemeList(manager2.GetOnlyDatabaseDefaultTheme().ThemeList);
result3.SetDefaultLogoList(manager2.GetOnlyDatabaseDefaultLogo().DefaultLogoList);
Assert.NotNull(result3);
Assert.That(result2.ThemeList.Count, Is.EqualTo(result3.ThemeList.Count));
Assert.That(result2.DefaultLogoList.Count, Is.EqualTo(result3.DefaultLogoList.Count));
Assert.That(result2.ThemeList[0].Name, Is.EqualTo(result3.ThemeList[0].Name));
Assert.That(result2.ThemeList[0].ColorList[0], Is.EqualTo(result3.ThemeList[0].ColorList[0]));
Assert.That(result2.ThemeList[0].ColorList[1], Is.EqualTo(result3.ThemeList[0].ColorList[1]));
Assert.That(result2.ThemeList[0].ColorList[2], Is.EqualTo(result3.ThemeList[0].ColorList[2]));
Assert.That(result2.DefaultLogoList[0].Name, Is.EqualTo(result3.DefaultLogoList[0].Name));
Assert.That(result2.DefaultLogoList[0].LogoLink, Is.EqualTo(result3.DefaultLogoList[0].LogoLink));
}
[Test]
public void LoadDatabaseData_Test()
{
result = manager.GetOnlyDatabaseUser();
Assert.NotNull(result);
Assert.NotNull(result.UserList);
Assert.That(result.UserList.Count, Is.EqualTo(4));
User user1 = result.UserList[0];
Assert.That(user1.Username, Is.EqualTo("Nicolas"));
Assert.That(user1.Email, Is.EqualTo("leHeros@gmail.com"));
Assert.That(user1.Password, Is.EqualTo(HashCodeModel.GetSHA256Hash("FeurFeur")));
Note user1Note = user1.NoteList[0];
Tags user1Tag = user1.TagList[0];
Assert.That(user1Note.Name, Is.EqualTo("Note 0"));
Assert.That(user1Note.LogoPath, Is.EqualTo("DefaultLogo.png"));
Assert.That(user1Tag.Name, Is.EqualTo("Tag 0"));
Assert.That(user1Tag.Color, Is.EqualTo("#5555FF"));
}
[Test]
public void LoadDefaultTheme_Test()
{
result = manager.GetOnlyDatabaseDefaultTheme();
Assert.NotNull(result);
Assert.That(result.ThemeList.Count, Is.EqualTo(2));
Theme theme1 = result.ThemeList[0];
Assert.That(theme1.Name, Is.EqualTo("blacktheme"));
Assert.That(theme1.ColorList[0], Is.EqualTo("#000000"));
Assert.That(theme1.ColorList[1], Is.EqualTo("#FF00FF"));
Assert.That(theme1.ColorList[2], Is.EqualTo("#OOFFOO"));
}
[Test]
public void LoadDefaultLogo_Test()
{
result = manager.GetOnlyDatabaseDefaultLogo();
Assert.NotNull(result);
Assert.That(result.DefaultLogoList.Count, Is.EqualTo(3));
Logo logo1 = result.DefaultLogoList[0];
Assert.That(logo1.Name, Is.EqualTo("default"));
Assert.That(logo1.LogoLink, Is.EqualTo("DefaultLogo.png"));
}
}
}

@ -0,0 +1,25 @@
<Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup>
<TargetFramework>net7.0</TargetFramework>
<ImplicitUsings>enable</ImplicitUsings>
<Nullable>enable</Nullable>
<IsPackable>false</IsPackable>
<IsTestProject>true</IsTestProject>
</PropertyGroup>
<ItemGroup>
<PackageReference Include="Microsoft.NET.Test.Sdk" Version="17.5.0" />
<PackageReference Include="NUnit" Version="3.13.3" />
<PackageReference Include="NUnit3TestAdapter" Version="4.4.2" />
<PackageReference Include="NUnit.Analyzers" Version="3.6.1" />
<PackageReference Include="coverlet.collector" Version="3.2.0" />
</ItemGroup>
<ItemGroup>
<ProjectReference Include="..\..\Biblioteque_de_Class\Biblioteque_de_Class.csproj" />
<ProjectReference Include="..\..\Notus_Persistence\Notus_Persistance.csproj" />
</ItemGroup>
</Project>

@ -0,0 +1 @@
global using NUnit.Framework;

@ -3,11 +3,24 @@ Microsoft Visual Studio Solution File, Format Version 12.00
# Visual Studio Version 17
VisualStudioVersion = 17.0.31611.283
MinimumVisualStudioVersion = 10.0.40219.1
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "notus", "notus\notus.csproj", "{561264A1-4611-40FB-A662-3EF65550CA71}"
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Notus_Vue", "notus_vue\Notus_Vue.csproj", "{561264A1-4611-40FB-A662-3EF65550CA71}"
ProjectSection(ProjectDependencies) = postProject
{184478A9-E14F-42E0-B963-B3A4474C9C1C} = {184478A9-E14F-42E0-B963-B3A4474C9C1C}
{7B7F1062-9498-44E5-AC77-84BC90A3B730} = {7B7F1062-9498-44E5-AC77-84BC90A3B730}
{92DD50C5-EEAD-44ED-AEFF-E21935725477} = {92DD50C5-EEAD-44ED-AEFF-E21935725477}
{AFCEAA99-3A25-4E9E-B498-72DD76A6B7FF} = {AFCEAA99-3A25-4E9E-B498-72DD76A6B7FF}
{EE443C17-B31D-4AD0-9141-920876E7DF79} = {EE443C17-B31D-4AD0-9141-920876E7DF79}
EndProjectSection
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Biblioteque_de_Class", "Biblioteque_de_Class\Biblioteque_de_Class.csproj", "{92DD50C5-EEAD-44ED-AEFF-E21935725477}"
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Biblioteque_de_Class", "Biblioteque_de_Class\Biblioteque_de_Class.csproj", "{92DD50C5-EEAD-44ED-AEFF-E21935725477}"
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Notus_Console", "Notus_Console\Notus_Console.csproj", "{0A5E5F33-6B39-42BF-A46D-0752EDB666FB}"
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Notus_Console", "Notus_Console\Notus_Console.csproj", "{0A5E5F33-6B39-42BF-A46D-0752EDB666FB}"
EndProject
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Notus_Persistance", "Notus_Persistence\Notus_Persistance.csproj", "{184478A9-E14F-42E0-B963-B3A4474C9C1C}"
EndProject
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "UnitTests_Model", "Tests\UnitTests_Model\UnitTests_Model.csproj", "{CB4664CE-F451-401D-862F-4A74A80B8161}"
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "UnitTests_Persistance", "Tests\UnitTests_Persistance\UnitTests_Persistance.csproj", "{E2BCA278-8741-4116-B0E0-B20849D66739}"
EndProject
Global
GlobalSection(SolutionConfigurationPlatforms) = preSolution
@ -29,6 +42,18 @@ Global
{0A5E5F33-6B39-42BF-A46D-0752EDB666FB}.Debug|Any CPU.Build.0 = Debug|Any CPU
{0A5E5F33-6B39-42BF-A46D-0752EDB666FB}.Release|Any CPU.ActiveCfg = Release|Any CPU
{0A5E5F33-6B39-42BF-A46D-0752EDB666FB}.Release|Any CPU.Build.0 = Release|Any CPU
{184478A9-E14F-42E0-B963-B3A4474C9C1C}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{184478A9-E14F-42E0-B963-B3A4474C9C1C}.Debug|Any CPU.Build.0 = Debug|Any CPU
{184478A9-E14F-42E0-B963-B3A4474C9C1C}.Release|Any CPU.ActiveCfg = Release|Any CPU
{184478A9-E14F-42E0-B963-B3A4474C9C1C}.Release|Any CPU.Build.0 = Release|Any CPU
{CB4664CE-F451-401D-862F-4A74A80B8161}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{CB4664CE-F451-401D-862F-4A74A80B8161}.Debug|Any CPU.Build.0 = Debug|Any CPU
{CB4664CE-F451-401D-862F-4A74A80B8161}.Release|Any CPU.ActiveCfg = Release|Any CPU
{CB4664CE-F451-401D-862F-4A74A80B8161}.Release|Any CPU.Build.0 = Release|Any CPU
{E2BCA278-8741-4116-B0E0-B20849D66739}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{E2BCA278-8741-4116-B0E0-B20849D66739}.Debug|Any CPU.Build.0 = Debug|Any CPU
{E2BCA278-8741-4116-B0E0-B20849D66739}.Release|Any CPU.ActiveCfg = Release|Any CPU
{E2BCA278-8741-4116-B0E0-B20849D66739}.Release|Any CPU.Build.0 = Release|Any CPU
EndGlobalSection
GlobalSection(SolutionProperties) = preSolution
HideSolutionNode = FALSE

@ -1,11 +0,0 @@
namespace notus;
public partial class App : Application
{
public App()
{
InitializeComponent();
MainPage = new AppShell();
}
}

@ -1,9 +0,0 @@
namespace notus;
public partial class ConnecPage : ContentPage
{
public ConnecPage()
{
InitializeComponent();
}
}

@ -1,8 +0,0 @@
namespace notus;
public partial class MainPage : ContentPage{
public MainPage(){
InitializeComponent();
}
}

@ -1,17 +0,0 @@
<?xml version="1.0" encoding="utf-8" ?>
<ContentPage xmlns="http://schemas.microsoft.com/dotnet/2021/maui"
xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml"
xmlns:toolkit="http://schemas.microsoft.com/dodnet/2022/maui/toolkit"
x:Class="notus.RecherPage"
Title="RecherPage"
BackgroundColor="#1C1C1C">
</ContentPage>

@ -1,9 +0,0 @@
namespace notus;
public partial class RecherPage : ContentPage
{
public RecherPage()
{
InitializeComponent();
}
}

@ -1,14 +1,14 @@
<?xml version = "1.0" encoding = "UTF-8" ?>
<Application xmlns="http://schemas.microsoft.com/dotnet/2021/maui"
xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml"
xmlns:local="clr-namespace:notus"
x:Class="notus.App">
<Application.Resources>
<ResourceDictionary>
<ResourceDictionary.MergedDictionaries>
<ResourceDictionary Source="Resources/Styles/Colors.xaml" />
<ResourceDictionary Source="Resources/Styles/Styles.xaml" />
</ResourceDictionary.MergedDictionaries>
</ResourceDictionary>
</Application.Resources>
</Application>
<?xml version = "1.0" encoding = "UTF-8" ?>
<Application xmlns="http://schemas.microsoft.com/dotnet/2021/maui"
xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml"
xmlns:local="clr-namespace:notus"
x:Class="notus.App">
<Application.Resources>
<ResourceDictionary>
<ResourceDictionary.MergedDictionaries>
<ResourceDictionary Source="Resources/Styles/Colors.xaml" />
<ResourceDictionary Source="Resources/Styles/Styles.xaml" />
</ResourceDictionary.MergedDictionaries>
</ResourceDictionary>
</Application.Resources>
</Application>

@ -0,0 +1,20 @@

using Biblioteque_de_Class;
using Notus_Persistance;
namespace notus;
public partial class App : Application
{
public PersistenceManager manager = new PersistenceManager(new Stub());
public Database db = new Database();
public App()
{
InitializeComponent();
db = manager.LoadDatabaseData();
MainPage = new AppShell();
}
}

@ -1,27 +1,37 @@
<?xml version="1.0" encoding="UTF-8" ?>
<Shell
x:Class="notus.AppShell"
xmlns="http://schemas.microsoft.com/dotnet/2021/maui"
xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml"
xmlns:local="clr-namespace:notus"
Shell.FlyoutBehavior="Locked"
Shell.FlyoutWidth="30"
Shell.NavBarIsVisible="False">
<ShellContent
Title="main_page"
ContentTemplate="{DataTemplate local:MainPage}"
Route="MainPage" />
<ShellContent
Title="connexion_page"
ContentTemplate="{DataTemplate local:ConnecPage}"
Route="ConnecPage" />
<ShellContent
Title="recherche_page"
ContentTemplate="{DataTemplate local:RecherPage}"
Route="RecherPage"/>
</Shell>
<?xml version="1.0" encoding="UTF-8" ?>
<Shell
x:Class="notus.AppShell"
xmlns="http://schemas.microsoft.com/dotnet/2021/maui"
xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml"
xmlns:local="clr-namespace:notus"
Shell.FlyoutBehavior="Locked"
Shell.FlyoutWidth="30"
Shell.NavBarIsVisible="True"
Shell.BackgroundColor="Grey">
<ShellContent
Title="main_page"
ContentTemplate="{DataTemplate local:MainPage}"
Route="MainPage" />
<ShellContent
Title="connexion_page"
ContentTemplate="{DataTemplate local:ConnecPage}"
Route="ConnecPage" />
<ShellContent
Title="recherche_page"
ContentTemplate="{DataTemplate local:RecherPage}"
Route="RecherPage"/>
<ShellContent
Title="Inscription_Page"
ContentTemplate="{DataTemplate local:InscrPage}"
Route="InscrPage"/>
<ShellContent
Title="ProfilPage"
ContentTemplate="{DataTemplate local:ProfilPage}"
Route="ProfilPage"/>
</Shell>

@ -1,7 +1,7 @@
namespace notus;
public partial class AppShell : Shell{
public AppShell(){
InitializeComponent();
}
}
namespace notus;
public partial class AppShell : Shell{
public AppShell(){
InitializeComponent();
}
}

@ -1,69 +1,86 @@
<?xml version="1.0" encoding="utf-8" ?>
<ContentPage xmlns="http://schemas.microsoft.com/dotnet/2021/maui"
xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml"
xmlns:toolkit="http://schemas.microsoft.com/dodnet/2022/maui/toolkit"
x:Class="notus.ConnecPage"
Title="ConnecPage"
BackgroundColor="#1C1C1C">
<Grid>
<Grid.RowDefinitions>
<RowDefinition Height="2*"/>
<RowDefinition Height="1.5*"/>
<RowDefinition Height="1*"/>
<RowDefinition Height="1.8*"/>
<RowDefinition Height="1*"/>
<RowDefinition Height="1.8*"/>
<RowDefinition Height="1*"/>
<RowDefinition Height="1*"/>
<RowDefinition Height="4*"/>
</Grid.RowDefinitions>
<Grid.ColumnDefinitions>
<ColumnDefinition Width="4*"/>
<ColumnDefinition Width="4*"/>
<ColumnDefinition Width="0.9*"/>
<ColumnDefinition Width="0.2*"/>
<ColumnDefinition Width="4*"/>
</Grid.ColumnDefinitions>
<Label
Grid.Column="1"
Grid.ColumnSpan="3"
Grid.Row="1"
HorizontalOptions="Center"
VerticalOptions="Center"
Text="Connection"
TextColor="#74fabd"
FontSize="80"
FontFamily="strong"/>
<Entry
Grid.Column="1"
Grid.ColumnSpan="3"
Grid.Row="3"
FontSize="22"
Placeholder="entrer votre e-mail"
PlaceholderColor="#74fabd"
BackgroundColor="#4A4A4A"/>
<Entry
Grid.Column="1"
Grid.ColumnSpan="3"
Grid.Row="5"
FontSize="22"
Placeholder="entrer votre mot de passe"
PlaceholderColor="#74fabd"
BackgroundColor="#4A4A4A"/>
<Button
Grid.Column="2"
Grid.ColumnSpan="1"
Grid.Row="7"
BackgroundColor="#74fabd"/>
</Grid>
<?xml version="1.0" encoding="utf-8" ?>
<ContentPage xmlns="http://schemas.microsoft.com/dotnet/2021/maui"
xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml"
xmlns:toolkit="http://schemas.microsoft.com/dodnet/2022/maui/toolkit"
x:Class="notus.ConnecPage"
Title="ConnecPage"
BackgroundColor="#1C1C1C">
<Grid>
<Grid.RowDefinitions>
<RowDefinition Height="2*"/>
<RowDefinition Height="1.5*"/>
<RowDefinition Height="1*"/>
<RowDefinition Height="1.8*"/>
<RowDefinition Height="1*"/>
<RowDefinition Height="1.8*"/>
<RowDefinition Height="1*"/>
<RowDefinition Height="1*"/>
<RowDefinition Height="4*"/>
</Grid.RowDefinitions>
<Grid.ColumnDefinitions>
<ColumnDefinition Width="4*"/>
<ColumnDefinition Width="4*"/>
<ColumnDefinition Width="0.9*"/>
<ColumnDefinition Width="0.2*"/>
<ColumnDefinition Width="4*"/>
</Grid.ColumnDefinitions>
<Label
Grid.Column="1"
Grid.ColumnSpan="3"
Grid.Row="1"
HorizontalOptions="Center"
VerticalOptions="Center"
Text="Connection"
TextColor="#74fabd"
FontSize="80"
FontFamily="strong"
/>
<Entry x:Name="Mail"
Grid.Column="1"
Grid.ColumnSpan="3"
Grid.Row="3"
FontSize="22"
Placeholder="entrer votre e-mail"
PlaceholderColor="#74fabd"
TextColor="#74fabd"
BackgroundColor="#4A4A4A"
/>
<Entry x:Name="Password"
Grid.Column="1"
Grid.ColumnSpan="3"
Grid.Row="5"
FontSize="22"
Placeholder="entrer votre mot de passe"
PlaceholderColor="#74fabd"
TextColor="#74fabd"
IsPassword="true"
BackgroundColor="#4A4A4A"
/>
<Button
Grid.Column="2"
Grid.ColumnSpan="1"
Grid.Row="7"
Text="Valider"
TextColor="Black"
BackgroundColor="#74fabd"
Clicked="Valid_Clicked"
/>
<Label
x:Name="ResultSearch"
Text="Mail ou mot de passe incorrect."
IsVisible="false"
Grid.Column="2"
Grid.Row="7"
TextColor="Red"
/>
</Grid>
</ContentPage>

@ -0,0 +1,28 @@
using Biblioteque_de_Class;
namespace notus;
public partial class ConnecPage : ContentPage
{
string mail = "";
string MDP = "";
public ConnecPage()
{
InitializeComponent();
}
private async void Valid_Clicked(object sender, EventArgs e)
{
mail = Mail.Text;
MDP = Password.Text;
if ((Application.Current as App).db.SearchUser(mail, MDP))
{
await Navigation.PushAsync(new RecherPage());
}
else
{
ResultSearch.IsVisible = true;
}
}
}

@ -0,0 +1,82 @@
<?xml version="1.0" encoding="utf-8" ?>
<ContentPage xmlns="http://schemas.microsoft.com/dotnet/2021/maui"
xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml"
x:Class="notus.InscrPage"
Title="InscrPage">
<Grid BackgroundColor="#1C1C1C">
<Grid.ColumnDefinitions>
<ColumnDefinition Width="1*"/>
<ColumnDefinition Width="Auto"/>
<ColumnDefinition Width="1*"/>
</Grid.ColumnDefinitions>
<Grid.RowDefinitions>
<RowDefinition Height="1*"/>
<RowDefinition Height="150"/>
<RowDefinition Height="150"/>
<RowDefinition Height="150"/>
<RowDefinition Height="1*"/>
</Grid.RowDefinitions>
<Entry
Placeholder="Pseudo"
HorizontalOptions="Center"
VerticalOptions="Center"
WidthRequest="600"
HeightRequest="100"
FontSize="32"
Grid.Column="1"
Grid.Row="1"
TextColor="#74fabd"
BackgroundColor="#4A4A4A"
PlaceholderColor="#74fabd"
/>
<Entry
Placeholder="Mot de passe"
HorizontalOptions="Center"
VerticalOptions="Center"
WidthRequest="600"
HeightRequest="100"
FontSize="32"
Grid.Column="1"
Grid.Row="2"
IsPassword="true"
TextColor="#74fabd"
BackgroundColor="#4A4A4A"
PlaceholderColor="#74fabd"
/>
<Entry
Placeholder ="Verif mot de passe"
HorizontalOptions="Center"
VerticalOptions="Center"
WidthRequest="600"
HeightRequest="100"
FontSize="32"
Grid.Column="1"
Grid.Row="3"
IsPassword="true"
TextColor="#74fabd"
BackgroundColor="#4A4A4A"
PlaceholderColor="#74fabd"
/>
<Button
Text="Valider"
Grid.Column="1"
Grid.Row="4"
HorizontalOptions="End"
VerticalOptions="Center"
WidthRequest="110"
HeightRequest="70"
BackgroundColor="#74fabd"
TextColor="Black"
CornerRadius="10"
Clicked="Valid_Clicked"
/>
</Grid>
</ContentPage>

@ -0,0 +1,14 @@
namespace notus;
public partial class InscrPage : ContentPage
{
public InscrPage()
{
InitializeComponent();
}
private async void Valid_Clicked(object sender, EventArgs e)
{
await Navigation.PushAsync(new RecherPage());
}
}

@ -1,57 +1,63 @@
<?xml version="1.0" encoding="utf-8" ?>
<ContentPage xmlns="http://schemas.microsoft.com/dotnet/2021/maui"
xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml"
xmlns:toolkit="http://schemas.microsoft.com/dodnet/2022/maui/toolkit"
x:Class="notus.MainPage"
Title="Mainpage"
BackgroundColor="#1C1C1C">
<Grid>
<Grid.RowDefinitions>
<RowDefinition Height="1*"/>
<RowDefinition Height="5*"/>
<RowDefinition Height="2*"/>
<RowDefinition Height="2*"/>
<RowDefinition Height="2*"/>
<RowDefinition Height="2*"/>
</Grid.RowDefinitions>
<Grid.ColumnDefinitions>
<ColumnDefinition Width="3*"/>
<ColumnDefinition Width="4*"/>
<ColumnDefinition Width="3*"/>
</Grid.ColumnDefinitions>
<Label
Grid.Column="1"
Grid.Row="1"
HorizontalOptions="Center"
VerticalOptions="Center"
Text="Notus"
TextColor="#74fabd"
FontSize="120"
FontAttributes="Bold"
FontFamily="strong"/>
<Button
CornerRadius="50"
Text="Connection"
TextColor="#74fabd"
FontSize="30"
Grid.Row="2"
Grid.Column="1"
HeightRequest="75"
BackgroundColor="#4A4A4A"/>
<Button
CornerRadius="50"
Text="Inscription"
TextColor="#74fabd"
FontSize="30"
Grid.Row="3"
Grid.Column="1"
HeightRequest="75"
BackgroundColor="#4A4A4A"/>
</Grid>
</ContentPage>
<?xml version="1.0" encoding="utf-8" ?>
<ContentPage xmlns="http://schemas.microsoft.com/dotnet/2021/maui"
xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml"
xmlns:toolkit="http://schemas.microsoft.com/dodnet/2022/maui/toolkit"
x:Class="notus.MainPage"
Title="Mainpage"
BackgroundColor="#1C1C1C">
<Grid>
<Grid.RowDefinitions>
<RowDefinition Height="1*"/>
<RowDefinition Height="5*"/>
<RowDefinition Height="2*"/>
<RowDefinition Height="2*"/>
<RowDefinition Height="2*"/>
<RowDefinition Height="2*"/>
</Grid.RowDefinitions>
<Grid.ColumnDefinitions>
<ColumnDefinition Width="3*"/>
<ColumnDefinition Width="4*"/>
<ColumnDefinition Width="3*"/>
</Grid.ColumnDefinitions>
<Label
Grid.Column="1"
Grid.Row="1"
HorizontalOptions="Center"
VerticalOptions="Center"
Text="Notus"
TextColor="#74fabd"
FontSize="120"
FontAttributes="Bold"
FontFamily="strong"
/>
<Button
CornerRadius="50"
Text="Connexion"
TextColor="#74fabd"
FontSize="30"
Grid.Row="2"
Grid.Column="1"
HeightRequest="75"
BackgroundColor="#4A4A4A"
Clicked="Connec_Clicked"
/>
<Button
CornerRadius="50"
Text="Inscription"
TextColor="#74fabd"
FontSize="30"
Grid.Row="3"
Grid.Column="1"
HeightRequest="75"
BackgroundColor="#4A4A4A"
Clicked="Inscr_Clicked"
/>
</Grid>
</ContentPage>

@ -0,0 +1,19 @@
namespace notus;
public partial class MainPage : ContentPage{
public MainPage(){
InitializeComponent();
}
private async void Connec_Clicked(object sender, EventArgs e)
{
await Navigation.PushAsync(new ConnecPage());
}
private async void Inscr_Clicked(object sender, EventArgs e)
{
await Navigation.PushAsync(new InscrPage());
}
}

@ -1,26 +1,26 @@
using CommunityToolkit.Maui;
using Microsoft.Extensions.Logging;
namespace notus;
public static class MauiProgram
{
public static MauiApp CreateMauiApp()
{
var builder = MauiApp.CreateBuilder();
builder
.UseMauiApp<App>()
.UseMauiCommunityToolkit()
.ConfigureFonts(fonts =>
{
fonts.AddFont("OpenSans-Regular.ttf", "OpenSansRegular");
fonts.AddFont("OpenSans-Semibold.ttf", "OpenSansSemibold");
});
#if DEBUG
builder.Logging.AddDebug();
#endif
return builder.Build();
}
}
using CommunityToolkit.Maui;
using Microsoft.Extensions.Logging;
namespace notus;
public static class MauiProgram
{
public static MauiApp CreateMauiApp()
{
var builder = MauiApp.CreateBuilder();
builder
.UseMauiApp<App>()
.UseMauiCommunityToolkit()
.ConfigureFonts(fonts =>
{
fonts.AddFont("OpenSans-Regular.ttf", "OpenSansRegular");
fonts.AddFont("OpenSans-Semibold.ttf", "OpenSansSemibold");
});
#if DEBUG
builder.Logging.AddDebug();
#endif
return builder.Build();
}
}

@ -1,6 +1,6 @@
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android">
<application android:allowBackup="true" android:icon="@mipmap/appicon" android:roundIcon="@mipmap/appicon_round" android:supportsRtl="true"></application>
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
<uses-permission android:name="android.permission.INTERNET" />
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android">
<application android:allowBackup="true" android:icon="@mipmap/appicon" android:roundIcon="@mipmap/appicon_round" android:supportsRtl="true"></application>
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
<uses-permission android:name="android.permission.INTERNET" />
</manifest>

@ -1,10 +1,10 @@
using Android.App;
using Android.Content.PM;
using Android.OS;
namespace notus;
[Activity(Theme = "@style/Maui.SplashTheme", MainLauncher = true, ConfigurationChanges = ConfigChanges.ScreenSize | ConfigChanges.Orientation | ConfigChanges.UiMode | ConfigChanges.ScreenLayout | ConfigChanges.SmallestScreenSize | ConfigChanges.Density)]
public class MainActivity : MauiAppCompatActivity
{
}
using Android.App;
using Android.Content.PM;
using Android.OS;
namespace notus;
[Activity(Theme = "@style/Maui.SplashTheme", MainLauncher = true, ConfigurationChanges = ConfigChanges.ScreenSize | ConfigChanges.Orientation | ConfigChanges.UiMode | ConfigChanges.ScreenLayout | ConfigChanges.SmallestScreenSize | ConfigChanges.Density)]
public class MainActivity : MauiAppCompatActivity
{
}

@ -1,15 +1,15 @@
using Android.App;
using Android.Runtime;
namespace notus;
[Application]
public class MainApplication : MauiApplication
{
public MainApplication(IntPtr handle, JniHandleOwnership ownership)
: base(handle, ownership)
{
}
protected override MauiApp CreateMauiApp() => MauiProgram.CreateMauiApp();
}
using Android.App;
using Android.Runtime;
namespace notus;
[Application]
public class MainApplication : MauiApplication
{
public MainApplication(IntPtr handle, JniHandleOwnership ownership)
: base(handle, ownership)
{
}
protected override MauiApp CreateMauiApp() => MauiProgram.CreateMauiApp();
}

@ -1,6 +1,6 @@
<?xml version="1.0" encoding="utf-8"?>
<resources>
<color name="colorPrimary">#512BD4</color>
<color name="colorPrimaryDark">#2B0B98</color>
<color name="colorAccent">#2B0B98</color>
<?xml version="1.0" encoding="utf-8"?>
<resources>
<color name="colorPrimary">#512BD4</color>
<color name="colorPrimaryDark">#2B0B98</color>
<color name="colorAccent">#2B0B98</color>
</resources>

@ -1,9 +1,9 @@
using Foundation;
namespace notus;
[Register("AppDelegate")]
public class AppDelegate : MauiUIApplicationDelegate
{
protected override MauiApp CreateMauiApp() => MauiProgram.CreateMauiApp();
}
using Foundation;
namespace notus;
[Register("AppDelegate")]
public class AppDelegate : MauiUIApplicationDelegate
{
protected override MauiApp CreateMauiApp() => MauiProgram.CreateMauiApp();
}

@ -1,30 +1,30 @@
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>UIDeviceFamily</key>
<array>
<integer>1</integer>
<integer>2</integer>
</array>
<key>UIRequiredDeviceCapabilities</key>
<array>
<string>arm64</string>
</array>
<key>UISupportedInterfaceOrientations</key>
<array>
<string>UIInterfaceOrientationPortrait</string>
<string>UIInterfaceOrientationLandscapeLeft</string>
<string>UIInterfaceOrientationLandscapeRight</string>
</array>
<key>UISupportedInterfaceOrientations~ipad</key>
<array>
<string>UIInterfaceOrientationPortrait</string>
<string>UIInterfaceOrientationPortraitUpsideDown</string>
<string>UIInterfaceOrientationLandscapeLeft</string>
<string>UIInterfaceOrientationLandscapeRight</string>
</array>
<key>XSAppIconAssets</key>
<string>Assets.xcassets/appicon.appiconset</string>
</dict>
</plist>
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>UIDeviceFamily</key>
<array>
<integer>1</integer>
<integer>2</integer>
</array>
<key>UIRequiredDeviceCapabilities</key>
<array>
<string>arm64</string>
</array>
<key>UISupportedInterfaceOrientations</key>
<array>
<string>UIInterfaceOrientationPortrait</string>
<string>UIInterfaceOrientationLandscapeLeft</string>
<string>UIInterfaceOrientationLandscapeRight</string>
</array>
<key>UISupportedInterfaceOrientations~ipad</key>
<array>
<string>UIInterfaceOrientationPortrait</string>
<string>UIInterfaceOrientationPortraitUpsideDown</string>
<string>UIInterfaceOrientationLandscapeLeft</string>
<string>UIInterfaceOrientationLandscapeRight</string>
</array>
<key>XSAppIconAssets</key>
<string>Assets.xcassets/appicon.appiconset</string>
</dict>
</plist>

@ -1,15 +1,15 @@
using ObjCRuntime;
using UIKit;
namespace notus;
public class Program
{
// This is the main entry point of the application.
static void Main(string[] args)
{
// if you want to use a different Application Delegate class from "AppDelegate"
// you can specify it here.
UIApplication.Main(args, null, typeof(AppDelegate));
}
}
using ObjCRuntime;
using UIKit;
namespace notus;
public class Program
{
// This is the main entry point of the application.
static void Main(string[] args)
{
// if you want to use a different Application Delegate class from "AppDelegate"
// you can specify it here.
UIApplication.Main(args, null, typeof(AppDelegate));
}
}

@ -1,16 +1,16 @@
using System;
using Microsoft.Maui;
using Microsoft.Maui.Hosting;
namespace notus;
class Program : MauiApplication
{
protected override MauiApp CreateMauiApp() => MauiProgram.CreateMauiApp();
static void Main(string[] args)
{
var app = new Program();
app.Run(args);
}
}
using System;
using Microsoft.Maui;
using Microsoft.Maui.Hosting;
namespace notus;
class Program : MauiApplication
{
protected override MauiApp CreateMauiApp() => MauiProgram.CreateMauiApp();
static void Main(string[] args)
{
var app = new Program();
app.Run(args);
}
}

@ -1,15 +1,15 @@
<?xml version="1.0" encoding="utf-8"?>
<manifest package="maui-application-id-placeholder" version="0.0.0" api-version="7" xmlns="http://tizen.org/ns/packages">
<profile name="common" />
<ui-application appid="maui-application-id-placeholder" exec="notus.dll" multiple="false" nodisplay="false" taskmanage="true" type="dotnet" launch_mode="single">
<label>maui-application-title-placeholder</label>
<icon>maui-appicon-placeholder</icon>
<metadata key="http://tizen.org/metadata/prefer_dotnet_aot" value="true" />
</ui-application>
<shortcut-list />
<privileges>
<privilege>http://tizen.org/privilege/internet</privilege>
</privileges>
<dependencies />
<provides-appdefined-privileges />
<?xml version="1.0" encoding="utf-8"?>
<manifest package="maui-application-id-placeholder" version="0.0.0" api-version="7" xmlns="http://tizen.org/ns/packages">
<profile name="common" />
<ui-application appid="maui-application-id-placeholder" exec="notus.dll" multiple="false" nodisplay="false" taskmanage="true" type="dotnet" launch_mode="single">
<label>maui-application-title-placeholder</label>
<icon>maui-appicon-placeholder</icon>
<metadata key="http://tizen.org/metadata/prefer_dotnet_aot" value="true" />
</ui-application>
<shortcut-list />
<privileges>
<privilege>http://tizen.org/privilege/internet</privilege>
</privileges>
<dependencies />
<provides-appdefined-privileges />
</manifest>

@ -1,8 +1,8 @@
<maui:MauiWinUIApplication
x:Class="notus.WinUI.App"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:maui="using:Microsoft.Maui"
xmlns:local="using:notus.WinUI">
</maui:MauiWinUIApplication>
<maui:MauiWinUIApplication
x:Class="notus.WinUI.App"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:maui="using:Microsoft.Maui"
xmlns:local="using:notus.WinUI">
</maui:MauiWinUIApplication>

@ -1,24 +1,24 @@
using Microsoft.UI.Xaml;
// To learn more about WinUI, the WinUI project structure,
// and more about our project templates, see: http://aka.ms/winui-project-info.
namespace notus.WinUI;
/// <summary>
/// Provides application-specific behavior to supplement the default Application class.
/// </summary>
public partial class App : MauiWinUIApplication
{
/// <summary>
/// Initializes the singleton application object. This is the first line of authored code
/// executed, and as such is the logical equivalent of main() or WinMain().
/// </summary>
public App()
{
this.InitializeComponent();
}
protected override MauiApp CreateMauiApp() => MauiProgram.CreateMauiApp();
}
using Microsoft.UI.Xaml;
// To learn more about WinUI, the WinUI project structure,
// and more about our project templates, see: http://aka.ms/winui-project-info.
namespace notus.WinUI;
/// <summary>
/// Provides application-specific behavior to supplement the default Application class.
/// </summary>
public partial class App : MauiWinUIApplication
{
/// <summary>
/// Initializes the singleton application object. This is the first line of authored code
/// executed, and as such is the logical equivalent of main() or WinMain().
/// </summary>
public App()
{
this.InitializeComponent();
}
protected override MauiApp CreateMauiApp() => MauiProgram.CreateMauiApp();
}

@ -1,46 +1,46 @@
<?xml version="1.0" encoding="utf-8"?>
<Package
xmlns="http://schemas.microsoft.com/appx/manifest/foundation/windows10"
xmlns:uap="http://schemas.microsoft.com/appx/manifest/uap/windows10"
xmlns:mp="http://schemas.microsoft.com/appx/2014/phone/manifest"
xmlns:rescap="http://schemas.microsoft.com/appx/manifest/foundation/windows10/restrictedcapabilities"
IgnorableNamespaces="uap rescap">
<Identity Name="maui-package-name-placeholder" Publisher="CN=User Name" Version="0.0.0.0" />
<mp:PhoneIdentity PhoneProductId="494D7E06-83EF-4532-A5F2-A2652E51FDBB" PhonePublisherId="00000000-0000-0000-0000-000000000000"/>
<Properties>
<DisplayName>$placeholder$</DisplayName>
<PublisherDisplayName>User Name</PublisherDisplayName>
<Logo>$placeholder$.png</Logo>
</Properties>
<Dependencies>
<TargetDeviceFamily Name="Windows.Universal" MinVersion="10.0.17763.0" MaxVersionTested="10.0.19041.0" />
<TargetDeviceFamily Name="Windows.Desktop" MinVersion="10.0.17763.0" MaxVersionTested="10.0.19041.0" />
</Dependencies>
<Resources>
<Resource Language="x-generate" />
</Resources>
<Applications>
<Application Id="App" Executable="$targetnametoken$.exe" EntryPoint="$targetentrypoint$">
<uap:VisualElements
DisplayName="$placeholder$"
Description="$placeholder$"
Square150x150Logo="$placeholder$.png"
Square44x44Logo="$placeholder$.png"
BackgroundColor="transparent">
<uap:DefaultTile Square71x71Logo="$placeholder$.png" Wide310x150Logo="$placeholder$.png" Square310x310Logo="$placeholder$.png" />
<uap:SplashScreen Image="$placeholder$.png" />
</uap:VisualElements>
</Application>
</Applications>
<Capabilities>
<rescap:Capability Name="runFullTrust" />
</Capabilities>
</Package>
<?xml version="1.0" encoding="utf-8"?>
<Package
xmlns="http://schemas.microsoft.com/appx/manifest/foundation/windows10"
xmlns:uap="http://schemas.microsoft.com/appx/manifest/uap/windows10"
xmlns:mp="http://schemas.microsoft.com/appx/2014/phone/manifest"
xmlns:rescap="http://schemas.microsoft.com/appx/manifest/foundation/windows10/restrictedcapabilities"
IgnorableNamespaces="uap rescap">
<Identity Name="maui-package-name-placeholder" Publisher="CN=User Name" Version="0.0.0.0" />
<mp:PhoneIdentity PhoneProductId="494D7E06-83EF-4532-A5F2-A2652E51FDBB" PhonePublisherId="00000000-0000-0000-0000-000000000000"/>
<Properties>
<DisplayName>$placeholder$</DisplayName>
<PublisherDisplayName>User Name</PublisherDisplayName>
<Logo>$placeholder$.png</Logo>
</Properties>
<Dependencies>
<TargetDeviceFamily Name="Windows.Universal" MinVersion="10.0.17763.0" MaxVersionTested="10.0.19041.0" />
<TargetDeviceFamily Name="Windows.Desktop" MinVersion="10.0.17763.0" MaxVersionTested="10.0.19041.0" />
</Dependencies>
<Resources>
<Resource Language="x-generate" />
</Resources>
<Applications>
<Application Id="App" Executable="$targetnametoken$.exe" EntryPoint="$targetentrypoint$">
<uap:VisualElements
DisplayName="$placeholder$"
Description="$placeholder$"
Square150x150Logo="$placeholder$.png"
Square44x44Logo="$placeholder$.png"
BackgroundColor="transparent">
<uap:DefaultTile Square71x71Logo="$placeholder$.png" Wide310x150Logo="$placeholder$.png" Square310x310Logo="$placeholder$.png" />
<uap:SplashScreen Image="$placeholder$.png" />
</uap:VisualElements>
</Application>
</Applications>
<Capabilities>
<rescap:Capability Name="runFullTrust" />
</Capabilities>
</Package>

@ -1,15 +1,15 @@
<?xml version="1.0" encoding="utf-8"?>
<assembly manifestVersion="1.0" xmlns="urn:schemas-microsoft-com:asm.v1">
<assemblyIdentity version="1.0.0.0" name="notus.WinUI.app"/>
<application xmlns="urn:schemas-microsoft-com:asm.v3">
<windowsSettings>
<!-- The combination of below two tags have the following effect:
1) Per-Monitor for >= Windows 10 Anniversary Update
2) System < Windows 10 Anniversary Update
-->
<dpiAware xmlns="http://schemas.microsoft.com/SMI/2005/WindowsSettings">true/PM</dpiAware>
<dpiAwareness xmlns="http://schemas.microsoft.com/SMI/2016/WindowsSettings">PerMonitorV2, PerMonitor</dpiAwareness>
</windowsSettings>
</application>
</assembly>
<?xml version="1.0" encoding="utf-8"?>
<assembly manifestVersion="1.0" xmlns="urn:schemas-microsoft-com:asm.v1">
<assemblyIdentity version="1.0.0.0" name="notus.WinUI.app"/>
<application xmlns="urn:schemas-microsoft-com:asm.v3">
<windowsSettings>
<!-- The combination of below two tags have the following effect:
1) Per-Monitor for >= Windows 10 Anniversary Update
2) System < Windows 10 Anniversary Update
-->
<dpiAware xmlns="http://schemas.microsoft.com/SMI/2005/WindowsSettings">true/PM</dpiAware>
<dpiAwareness xmlns="http://schemas.microsoft.com/SMI/2016/WindowsSettings">PerMonitorV2, PerMonitor</dpiAwareness>
</windowsSettings>
</application>
</assembly>

@ -1,9 +1,9 @@
using Foundation;
namespace notus;
[Register("AppDelegate")]
public class AppDelegate : MauiUIApplicationDelegate
{
protected override MauiApp CreateMauiApp() => MauiProgram.CreateMauiApp();
}
using Foundation;
namespace notus;
[Register("AppDelegate")]
public class AppDelegate : MauiUIApplicationDelegate
{
protected override MauiApp CreateMauiApp() => MauiProgram.CreateMauiApp();
}

@ -1,32 +1,32 @@
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>LSRequiresIPhoneOS</key>
<true/>
<key>UIDeviceFamily</key>
<array>
<integer>1</integer>
<integer>2</integer>
</array>
<key>UIRequiredDeviceCapabilities</key>
<array>
<string>arm64</string>
</array>
<key>UISupportedInterfaceOrientations</key>
<array>
<string>UIInterfaceOrientationPortrait</string>
<string>UIInterfaceOrientationLandscapeLeft</string>
<string>UIInterfaceOrientationLandscapeRight</string>
</array>
<key>UISupportedInterfaceOrientations~ipad</key>
<array>
<string>UIInterfaceOrientationPortrait</string>
<string>UIInterfaceOrientationPortraitUpsideDown</string>
<string>UIInterfaceOrientationLandscapeLeft</string>
<string>UIInterfaceOrientationLandscapeRight</string>
</array>
<key>XSAppIconAssets</key>
<string>Assets.xcassets/appicon.appiconset</string>
</dict>
</plist>
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>LSRequiresIPhoneOS</key>
<true/>
<key>UIDeviceFamily</key>
<array>
<integer>1</integer>
<integer>2</integer>
</array>
<key>UIRequiredDeviceCapabilities</key>
<array>
<string>arm64</string>
</array>
<key>UISupportedInterfaceOrientations</key>
<array>
<string>UIInterfaceOrientationPortrait</string>
<string>UIInterfaceOrientationLandscapeLeft</string>
<string>UIInterfaceOrientationLandscapeRight</string>
</array>
<key>UISupportedInterfaceOrientations~ipad</key>
<array>
<string>UIInterfaceOrientationPortrait</string>
<string>UIInterfaceOrientationPortraitUpsideDown</string>
<string>UIInterfaceOrientationLandscapeLeft</string>
<string>UIInterfaceOrientationLandscapeRight</string>
</array>
<key>XSAppIconAssets</key>
<string>Assets.xcassets/appicon.appiconset</string>
</dict>
</plist>

@ -1,15 +1,15 @@
using ObjCRuntime;
using UIKit;
namespace notus;
public class Program
{
// This is the main entry point of the application.
static void Main(string[] args)
{
// if you want to use a different Application Delegate class from "AppDelegate"
// you can specify it here.
UIApplication.Main(args, null, typeof(AppDelegate));
}
}
using ObjCRuntime;
using UIKit;
namespace notus;
public class Program
{
// This is the main entry point of the application.
static void Main(string[] args)
{
// if you want to use a different Application Delegate class from "AppDelegate"
// you can specify it here.
UIApplication.Main(args, null, typeof(AppDelegate));
}
}

@ -0,0 +1,74 @@
<?xml version="1.0" encoding="utf-8" ?>
<ContentPage xmlns="http://schemas.microsoft.com/dotnet/2021/maui"
xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml"
xmlns:toolkit="http://schemas.microsoft.com/dodnet/2022/maui/toolkit"
x:Class="notus.ProfilPage"
Title="ProfilPage"
BackgroundColor="#1C1C1C">
<Grid>
<Grid.RowDefinitions>
<RowDefinition Height="Auto"/>
<RowDefinition Height="1.5*"/>
<RowDefinition Height="1.5*"/>
<RowDefinition Height="1.5*"/>
<RowDefinition Height="1.5*"/>
<RowDefinition Height="1.5*"/>
</Grid.RowDefinitions>
<Grid.ColumnDefinitions>
<ColumnDefinition Width="1*"/>
<ColumnDefinition Width="1*"/>
<ColumnDefinition Width="1*"/>
</Grid.ColumnDefinitions>
<Button
Text="Modifier Profil"
TextColor="#74fabd"
BackgroundColor="#4A4A4A"
Grid.Column="1"
Grid.Row="4"
VerticalOptions="Center"
HeightRequest="80"
FontSize="30"
/>
<Button
Text="Modifier Theme"
TextColor="#74fabd"
BackgroundColor="#4A4A4A"
Grid.Column="1"
Grid.Row="5"
FontSize="30"
VerticalOptions="Start"
HeightRequest="80"
/>
<Label
Text="Profil"
FontSize="30"
HorizontalTextAlignment="Center"
VerticalTextAlignment="Center"
TextColor="#74fabd"
BackgroundColor="#4A4A4A"
Grid.Column="1"
Grid.Row="3"
VerticalOptions="End"
HeightRequest="80"
/>
<ImageButton
Source="profil.png"
Aspect="AspectFit"
Grid.Column="1"
Grid.Row="2"
WidthRequest="550"
HeightRequest="250"
BackgroundColor="#6E6E6E"
CornerRadius="10"
Clicked="ProfilClicked"
/>
</Grid>
</ContentPage>

@ -0,0 +1,17 @@
using Microsoft.Maui.Controls;
using Biblioteque_de_Class;
using Notus_Persistance;
namespace notus;
public partial class ProfilPage : ContentPage
{
public ProfilPage()
{
InitializeComponent();
}
void ProfilClicked(System.Object sender, System.EventArgs e)
{
}
}

@ -1,8 +1,8 @@
{
"profiles": {
"Windows Machine": {
"commandName": "MsixPackage",
"nativeDebugging": false
}
}
{
"profiles": {
"Windows Machine": {
"commandName": "MsixPackage",
"nativeDebugging": false
}
}
}

@ -0,0 +1,134 @@
<?xml version="1.0" encoding="utf-8" ?>
<ContentPage xmlns="http://schemas.microsoft.com/dotnet/2021/maui"
xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml"
xmlns:toolkit="http://schemas.microsoft.com/dodnet/2022/maui/toolkit"
x:Class="notus.RecherPage"
Title="RecherPage"
BackgroundColor="#1C1C1C">
<Grid>
<Grid.RowDefinitions>
<RowDefinition Height="Auto"/>
<RowDefinition Height="1.5*"/>
<RowDefinition Height="1*"/>
<RowDefinition Height="1.8*"/>
<RowDefinition Height="1*"/>
<RowDefinition Height="1.8*"/>
<RowDefinition Height="1*"/>
<RowDefinition Height="1*"/>
<RowDefinition Height="4*"/>
</Grid.RowDefinitions>
<Grid.ColumnDefinitions>
<ColumnDefinition Width="Auto"/>
<ColumnDefinition Width="1*"/>
<ColumnDefinition Width="1*"/>
<ColumnDefinition Width="Auto"/>
<ColumnDefinition Width="Auto"/>
</Grid.ColumnDefinitions>
<Border
Background="#6E6E6E"
Grid.Column="0"
Grid.RowSpan="9"
/>
<ImageButton
Source="profl.png"
Aspect="AspectFit"
Grid.Column="4"
Grid.Row="0"
HorizontalOptions="Start"
VerticalOptions="Start"
WidthRequest="200"
HeightRequest="120"
BackgroundColor="#6E6E6E"
CornerRadius="10"
Clicked="Profil_Clicked"
/>
<ImageButton
Source="supp.png"
Aspect="AspectFill"
Grid.Column="2"
Grid.Row="0"
Margin="20"
HorizontalOptions="End"
VerticalOptions="Start"
WidthRequest="50"
HeightRequest="50"
BackgroundColor="#4A4A4A"
CornerRadius="50"
/>
<Label x:Name="NomNote"
Text="{Binding Name}"
Grid.Column="1"
Grid.Row="0"
TextColor="#74fabd"
Margin="20"
FontSize="34"
BackgroundColor="#4A4A4A"
WidthRequest="250"
HeightRequest="50"
HorizontalOptions="Center"
VerticalOptions="Start"
/>
<ImageButton
Source="edit.png"
Aspect="AspectFit"
Grid.Column="1"
Grid.Row="0"
Margin="20"
HorizontalOptions="Start"
VerticalOptions="Start"
WidthRequest="50"
HeightRequest="50"
BackgroundColor="#4A4A4A"
CornerRadius="50"
/>
<Entry
Placeholder="Rechercher"
HorizontalOptions="Start"
Margin="20"
VerticalOptions="Center"
WidthRequest="300"
HeightRequest="50"
FontSize="25"
Grid.Column="0"
Grid.Row="0"
TextColor="#74fabd"
BackgroundColor="#4A4A4A"
PlaceholderColor="#74fabd"
/>
<ListView x:Name="ListNote"
Grid.Column="0"
Grid.Row="2"
Grid.RowSpan="5"
ItemsSource="{Binding NoteList}"
/>
<Editor
Placeholder="Texte"
IsSpellCheckEnabled="True"
FontSize="20"
HorizontalOptions="Start"
VerticalOptions="Center"
Margin="20"
WidthRequest="800"
HeightRequest="750"
Grid.Column="1"
Grid.ColumnSpan="4"
Grid.Row="4"
Grid.RowSpan="3"
TextColor="White"
BackgroundColor="#4A4A4A"
PlaceholderColor="#74fabd"
/>
</Grid>
</ContentPage>

@ -0,0 +1,23 @@
using Microsoft.Maui.Controls;
using Biblioteque_de_Class;
using Notus_Persistance;
namespace notus;
public partial class RecherPage : ContentPage
{
PersistenceManager manager = (Application.Current as App).manager;
public RecherPage()
{
manager.LoadDatabaseData();
InitializeComponent();
ListNote.BindingContext = manager;
NomNote.BindingContext = manager;
}
private async void Profil_Clicked(object sender, EventArgs e)
{
await Navigation.PushAsync(new ProfilPage());
}
}

@ -1,4 +1,4 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<svg width="456" height="456" viewBox="0 0 456 456" version="1.1" xmlns="http://www.w3.org/2000/svg">
<rect x="0" y="0" width="456" height="456" fill="#512BD4" />
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<svg width="456" height="456" viewBox="0 0 456 456" version="1.1" xmlns="http://www.w3.org/2000/svg">
<rect x="0" y="0" width="456" height="456" fill="#512BD4" />
</svg>

Before

Width:  |  Height:  |  Size: 231 B

After

Width:  |  Height:  |  Size: 228 B

@ -1,8 +1,8 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
<svg width="456" height="456" viewBox="0 0 456 456" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" xml:space="preserve" xmlns:serif="http://www.serif.com/" style="fill-rule:evenodd;clip-rule:evenodd;stroke-linejoin:round;stroke-miterlimit:2;">
<path d="m 105.50037,281.60863 c -2.70293,0 -5.00091,-0.90042 -6.893127,-2.70209 -1.892214,-1.84778 -2.837901,-4.04181 -2.837901,-6.58209 0,-2.58722 0.945687,-4.80389 2.837901,-6.65167 1.892217,-1.84778 4.190197,-2.77167 6.893127,-2.77167 2.74819,0 5.06798,0.92389 6.96019,2.77167 1.93749,1.84778 2.90581,4.06445 2.90581,6.65167 0,2.54028 -0.96832,4.73431 -2.90581,6.58209 -1.89221,1.80167 -4.212,2.70209 -6.96019,2.70209 z" style="fill:#ffffff;fill-rule:nonzero;stroke-width:0.838376" />
<path d="M 213.56111,280.08446 H 195.99044 L 149.69953,207.0544 c -1.17121,-1.84778 -2.14037,-3.76515 -2.90581,-5.75126 h -0.40578 c 0.36051,2.12528 0.54076,6.67515 0.54076,13.6496 v 65.13172 h -15.54349 v -99.36009 h 18.71925 l 44.7374,71.29798 c 1.89222,2.95695 3.1087,4.98917 3.64945,6.09751 h 0.26996 c -0.45021,-2.6325 -0.67573,-7.09015 -0.67573,-13.37293 v -64.02256 h 15.47557 z" style="fill:#ffffff;fill-rule:nonzero;stroke-width:0.838376" />
<path d="m 289.25134,280.08446 h -54.40052 v -99.36009 h 52.23835 v 13.99669 h -36.15411 v 28.13085 h 33.31621 v 13.9271 h -33.31621 v 29.37835 h 38.31628 z" style="fill:#ffffff;fill-rule:nonzero;stroke-width:0.838376" />
<path d="M 366.56466,194.72106 H 338.7222 v 85.3634 h -16.08423 v -85.3634 h -27.77455 v -13.99669 h 71.70124 z" style="fill:#ffffff;fill-rule:nonzero;stroke-width:0.838376" />
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
<svg width="456" height="456" viewBox="0 0 456 456" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" xml:space="preserve" xmlns:serif="http://www.serif.com/" style="fill-rule:evenodd;clip-rule:evenodd;stroke-linejoin:round;stroke-miterlimit:2;">
<path d="m 105.50037,281.60863 c -2.70293,0 -5.00091,-0.90042 -6.893127,-2.70209 -1.892214,-1.84778 -2.837901,-4.04181 -2.837901,-6.58209 0,-2.58722 0.945687,-4.80389 2.837901,-6.65167 1.892217,-1.84778 4.190197,-2.77167 6.893127,-2.77167 2.74819,0 5.06798,0.92389 6.96019,2.77167 1.93749,1.84778 2.90581,4.06445 2.90581,6.65167 0,2.54028 -0.96832,4.73431 -2.90581,6.58209 -1.89221,1.80167 -4.212,2.70209 -6.96019,2.70209 z" style="fill:#ffffff;fill-rule:nonzero;stroke-width:0.838376" />
<path d="M 213.56111,280.08446 H 195.99044 L 149.69953,207.0544 c -1.17121,-1.84778 -2.14037,-3.76515 -2.90581,-5.75126 h -0.40578 c 0.36051,2.12528 0.54076,6.67515 0.54076,13.6496 v 65.13172 h -15.54349 v -99.36009 h 18.71925 l 44.7374,71.29798 c 1.89222,2.95695 3.1087,4.98917 3.64945,6.09751 h 0.26996 c -0.45021,-2.6325 -0.67573,-7.09015 -0.67573,-13.37293 v -64.02256 h 15.47557 z" style="fill:#ffffff;fill-rule:nonzero;stroke-width:0.838376" />
<path d="m 289.25134,280.08446 h -54.40052 v -99.36009 h 52.23835 v 13.99669 h -36.15411 v 28.13085 h 33.31621 v 13.9271 h -33.31621 v 29.37835 h 38.31628 z" style="fill:#ffffff;fill-rule:nonzero;stroke-width:0.838376" />
<path d="M 366.56466,194.72106 H 338.7222 v 85.3634 h -16.08423 v -85.3634 h -27.77455 v -13.99669 h 71.70124 z" style="fill:#ffffff;fill-rule:nonzero;stroke-width:0.838376" />
</svg>

Before

Width:  |  Height:  |  Size: 1.8 KiB

After

Width:  |  Height:  |  Size: 1.8 KiB

@ -1,93 +1,93 @@
<svg width="419" height="519" viewBox="0 0 419 519" fill="none" xmlns="http://www.w3.org/2000/svg">
<path d="M284.432 247.568L284.004 221.881C316.359 221.335 340.356 211.735 355.308 193.336C382.408 159.996 372.893 108.183 372.786 107.659L398.013 102.831C398.505 105.432 409.797 167.017 375.237 209.53C355.276 234.093 324.719 246.894 284.432 247.568Z" fill="#8A6FE8"/>
<path d="M331.954 109.36L361.826 134.245C367.145 138.676 375.055 137.959 379.497 132.639C383.928 127.32 383.211 119.41 377.891 114.969L348.019 90.0842C342.7 85.6531 334.79 86.3702 330.348 91.6896C325.917 97.0197 326.634 104.929 331.954 109.36Z" fill="#8A6FE8"/>
<path d="M407.175 118.062L417.92 94.2263C420.735 87.858 417.856 80.4087 411.488 77.5831C405.12 74.7682 397.67 77.6473 394.845 84.0156L383.831 108.461L407.175 118.062Z" fill="#8A6FE8"/>
<path d="M401.363 105.175L401.234 69.117C401.181 62.1493 395.498 56.541 388.53 56.5945C381.562 56.648 375.954 62.3313 376.007 69.2989L376.018 96.11L401.363 105.175Z" fill="#8A6FE8"/>
<path d="M386.453 109.071L378.137 73.9548C376.543 67.169 369.757 62.9628 362.971 64.5575C356.185 66.1523 351.979 72.938 353.574 79.7237L362.04 115.482L386.453 109.071Z" fill="#8A6FE8"/>
<path d="M381.776 142.261C396.359 142.261 408.181 130.44 408.181 115.857C408.181 101.274 396.359 89.4527 381.776 89.4527C367.194 89.4527 355.372 101.274 355.372 115.857C355.372 130.44 367.194 142.261 381.776 142.261Z" fill="url(#paint0_radial)"/>
<path d="M248.267 406.979C248.513 384.727 245.345 339.561 222.376 301.736L199.922 315.372C220.76 349.675 222.323 389.715 221.841 407.182C221.798 408.627 235.263 409.933 248.267 406.979Z" fill="url(#paint1_linear)"/>
<path d="M221.841 406.936L242.637 406.84L262.052 518.065L220.311 518.258C217.132 518.269 214.724 515.711 214.938 512.532L221.841 406.936Z" fill="#522CD5"/>
<path d="M306.566 488.814C310.173 491.661 310.109 495.782 309.831 500.127L308.964 513.452C308.803 515.839 306.727 517.798 304.34 517.809L260.832 518.012C258.125 518.023 256.08 515.839 256.262 513.142L256.551 499.335C256.883 494.315 255.192 492.474 251.307 487.744C244.649 479.663 224.967 435.62 226.84 406.925L248.256 406.829C249.691 423.858 272.167 461.682 306.566 488.814Z" fill="url(#paint2_linear)"/>
<path d="M309.82 500.127C310.023 497.088 310.077 494.176 308.889 491.715L254.635 491.961C256.134 494.166 256.765 496.092 256.562 499.314L256.273 513.121C256.091 515.828 258.146 518.012 260.843 517.99L304.34 517.798C306.727 517.787 308.803 515.828 308.964 513.442L309.82 500.127Z" fill="url(#paint3_radial)"/>
<path d="M133.552 407.471C133.103 385.22 135.864 340.021 158.49 301.993L181.073 315.425C160.545 349.921 159.346 389.972 159.989 407.428C160.042 408.884 146.578 410.318 133.552 407.471Z" fill="url(#paint4_linear)"/>
<path d="M110.798 497.152C110.765 494.187 111.204 491.575 112.457 487.23C131.882 434.132 133.52 407.364 133.52 407.364L159.999 407.246C159.999 407.246 161.819 433.512 181.716 486.427C183.289 490.195 183.471 493.641 183.674 496.831L183.792 513.816C183.803 516.374 181.716 518.483 179.158 518.494L177.873 518.504L116.781 518.782L115.496 518.793C112.927 518.804 110.83 516.728 110.819 514.159L110.798 497.152Z" fill="url(#paint5_linear)"/>
<path d="M110.798 497.152C110.798 496.67 110.808 496.199 110.83 495.739C110.969 494.262 111.643 492.603 114.875 492.582L180.207 492.282C182.561 492.367 183.343 494.176 183.589 495.311C183.621 495.814 183.664 496.328 183.696 496.82L183.813 513.806C183.824 515.411 183.011 516.824 181.769 517.669C181.031 518.172 180.132 518.472 179.179 518.483L177.895 518.494L116.802 518.772L115.528 518.782C114.244 518.793 113.077 518.269 112.232 517.434C111.386 516.599 110.862 515.432 110.851 514.148L110.798 497.152Z" fill="url(#paint6_radial)"/>
<path d="M314.979 246.348C324.162 210.407 318.008 181.777 318.008 181.777L326.452 181.734L326.656 181.574C314.262 115.75 256.326 66.0987 186.949 66.4198C108.796 66.773 45.7233 130.424 46.0765 208.577C46.4297 286.731 110.08 349.803 188.234 349.45C249.905 349.172 302.178 309.474 321.304 254.343C321.872 251.999 321.797 247.804 314.979 246.348Z" fill="url(#paint7_radial)"/>
<path d="M310.237 279.035L65.877 280.148C71.3998 289.428 77.95 298.012 85.3672 305.761L290.972 304.829C298.336 297.005 304.8 288.368 310.237 279.035Z" fill="#D8CFF7"/>
<path d="M235.062 312.794L280.924 312.585L280.74 272.021L234.877 272.23L235.062 312.794Z" fill="#512BD4"/>
<path d="M243.001 297.626C242.691 297.626 242.434 297.53 242.22 297.327C242.006 297.123 241.899 296.866 241.899 296.588C241.899 296.299 242.006 296.042 242.22 295.839C242.434 295.625 242.691 295.528 243.001 295.528C243.312 295.528 243.568 295.635 243.782 295.839C243.996 296.042 244.114 296.299 244.114 296.588C244.114 296.877 244.007 297.123 243.793 297.327C243.568 297.519 243.312 297.626 243.001 297.626Z" fill="white"/>
<path d="M255.192 297.434H253.212L247.967 289.203C247.839 289 247.721 288.775 247.636 288.55H247.593C247.636 288.786 247.657 289.299 247.657 290.091L247.668 297.444H245.912L245.891 286.228H247.999L253.062 294.265C253.276 294.597 253.415 294.833 253.479 294.95H253.511C253.458 294.651 253.437 294.148 253.437 293.441L253.426 286.217H255.17L255.192 297.434Z" fill="white"/>
<path d="M263.733 297.412L257.589 297.423L257.568 286.206L263.465 286.195V287.779L259.387 287.79L259.398 290.969L263.155 290.958V292.532L259.398 292.542L259.409 295.86L263.733 295.85V297.412Z" fill="white"/>
<path d="M272.445 287.758L269.298 287.769L269.32 297.401H267.5L267.479 287.769L264.343 287.779V286.195L272.434 286.174L272.445 287.758Z" fill="white"/>
<path d="M315.279 246.337C324.355 210.836 318.457 182.483 318.308 181.798L171.484 182.462C171.484 182.462 162.226 181.563 162.268 190.018C162.311 198.463 162.761 222.341 162.878 248.746C162.9 254.172 167.363 256.773 170.863 256.751C170.874 256.751 311.618 252.213 315.279 246.337Z" fill="url(#paint8_radial)"/>
<path d="M227.685 246.798C227.685 246.798 250.183 228.827 254.571 225.499C258.959 222.17 262.812 221.977 266.869 225.445C270.925 228.913 293.616 246.498 293.616 246.498L227.685 246.798Z" fill="#A08BE8"/>
<path d="M320.748 256.141C320.748 256.141 324.943 248.414 315.279 246.348C315.289 246.305 170.927 246.894 170.927 246.894C167.566 246.905 163.232 244.925 162.846 241.671C162.857 244.004 162.878 246.369 162.889 248.756C162.91 253.68 166.582 256.27 169.878 256.698C170.21 256.73 170.542 256.773 170.874 256.773L180.742 256.73L320.748 256.141Z" fill="#512BD4"/>
<path d="M206.4 233.214C212.511 233.095 217.302 224.667 217.102 214.39C216.901 204.112 211.785 195.878 205.674 195.997C199.563 196.116 194.772 204.544 194.973 214.821C195.173 225.099 200.289 233.333 206.4 233.214Z" fill="#512BD4"/>
<path d="M306.249 214.267C306.356 203.989 301.488 195.605 295.377 195.541C289.266 195.478 284.225 203.758 284.118 214.037C284.011 224.315 288.878 232.699 294.99 232.763C301.101 232.826 306.142 224.545 306.249 214.267Z" fill="#512BD4"/>
<path d="M205.905 205.291C208.152 203.022 211.192 202.016 214.157 202.262C215.912 205.495 217.014 209.733 217.111 214.389C217.164 217.3 216.811 220.04 216.158 222.513C212.669 223.519 208.752 222.662 205.979 219.922C201.912 215.909 201.88 209.348 205.905 205.291Z" fill="#8065E0"/>
<path d="M294.996 204.285C297.255 202.016 300.294 200.999 303.259 201.256C305.164 204.628 306.309 209.209 306.256 214.239C306.224 216.808 305.892 219.259 305.303 221.485C301.793 222.523 297.843 221.678 295.061 218.916C291.004 214.892 290.972 208.342 294.996 204.285Z" fill="#8065E0"/>
<path d="M11.6342 357.017C10.9171 354.716 -5.72611 300.141 21.3204 258.903C36.9468 235.078 63.3083 221.035 99.6664 217.15L102.449 243.276C74.3431 246.273 54.4676 256.345 43.3579 273.202C23.0971 303.941 36.5722 348.733 36.7113 349.183L11.6342 357.017Z" fill="url(#paint9_linear)"/>
<path d="M95.1498 252.802C109.502 252.802 121.137 241.167 121.137 226.815C121.137 212.463 109.502 200.828 95.1498 200.828C80.7976 200.828 69.1628 212.463 69.1628 226.815C69.1628 241.167 80.7976 252.802 95.1498 252.802Z" fill="url(#paint10_radial)"/>
<path d="M72.0098 334.434L33.4683 329.307C26.597 328.397 20.2929 333.214 19.3725 340.085C18.4627 346.956 23.279 353.26 30.1504 354.181L68.6919 359.308C75.5632 360.217 81.8673 355.401 82.7878 348.53C83.6975 341.658 78.8705 335.344 72.0098 334.434Z" fill="#8A6FE8"/>
<path d="M3.73535 367.185L7.35297 393.076C8.36975 399.968 14.7702 404.731 21.6629 403.725C28.5556 402.708 33.3185 396.308 32.3124 389.415L28.5984 362.861L3.73535 367.185Z" fill="#8A6FE8"/>
<path d="M15.5194 374.988L34.849 405.427C38.6058 411.292 46.4082 413.005 52.2735 409.248C58.1387 405.491 59.8512 397.689 56.0945 391.823L41.7953 369.144L15.5194 374.988Z" fill="#8A6FE8"/>
<path d="M26.0511 363.739L51.8026 389.019C56.7688 393.911 64.7532 393.846 69.6445 388.88C74.5358 383.914 74.4715 375.929 69.516 371.038L43.2937 345.297L26.0511 363.739Z" fill="#8A6FE8"/>
<path d="M26.4043 381.912C40.987 381.912 52.8086 370.091 52.8086 355.508C52.8086 340.925 40.987 329.104 26.4043 329.104C11.8216 329.104 0 340.925 0 355.508C0 370.091 11.8216 381.912 26.4043 381.912Z" fill="url(#paint11_radial)"/>
<path d="M184.73 63.6308L157.819 66.5892L158.561 38.5412L177.888 36.4178L184.73 63.6308Z" fill="#8A6FE8"/>
<path d="M170.018 41.647C180.455 39.521 187.193 29.3363 185.067 18.8988C182.941 8.46126 172.757 1.72345 162.319 3.84944C151.882 5.97543 145.144 16.1601 147.27 26.5976C149.396 37.0351 159.58 43.773 170.018 41.647Z" fill="#D8CFF7"/>
<path d="M196.885 79.385C198.102 79.2464 198.948 78.091 198.684 76.8997C195.851 64.2818 183.923 55.5375 170.773 56.9926C157.622 58.4371 147.886 69.5735 147.865 82.4995C147.863 83.7232 148.949 84.6597 150.168 84.5316L196.885 79.385Z" fill="url(#paint12_radial)"/>
<defs>
<radialGradient id="paint0_radial" cx="0" cy="0" r="1" gradientUnits="userSpaceOnUse" gradientTransform="translate(382.004 103.457) scale(26.4058)">
<stop stop-color="#8065E0"/>
<stop offset="1" stop-color="#512BD4"/>
</radialGradient>
<linearGradient id="paint1_linear" x1="214.439" y1="303.482" x2="236.702" y2="409.505" gradientUnits="userSpaceOnUse">
<stop stop-color="#522CD5"/>
<stop offset="0.4397" stop-color="#8A6FE8"/>
</linearGradient>
<linearGradient id="paint2_linear" x1="231.673" y1="404.144" x2="297.805" y2="522.048" gradientUnits="userSpaceOnUse">
<stop stop-color="#522CD5"/>
<stop offset="0.4397" stop-color="#8A6FE8"/>
</linearGradient>
<radialGradient id="paint3_radial" cx="0" cy="0" r="1" gradientUnits="userSpaceOnUse" gradientTransform="translate(280.957 469.555) rotate(-0.260742) scale(45.8326)">
<stop offset="0.034" stop-color="#522CD5"/>
<stop offset="0.9955" stop-color="#8A6FE8"/>
</radialGradient>
<linearGradient id="paint4_linear" x1="166.061" y1="303.491" x2="144.763" y2="409.709" gradientUnits="userSpaceOnUse">
<stop stop-color="#522CD5"/>
<stop offset="0.4397" stop-color="#8A6FE8"/>
</linearGradient>
<linearGradient id="paint5_linear" x1="146.739" y1="407.302" x2="147.246" y2="518.627" gradientUnits="userSpaceOnUse">
<stop stop-color="#522CD5"/>
<stop offset="0.4397" stop-color="#8A6FE8"/>
</linearGradient>
<radialGradient id="paint6_radial" cx="0" cy="0" r="1" gradientUnits="userSpaceOnUse" gradientTransform="translate(148.63 470.023) rotate(179.739) scale(50.2476)">
<stop offset="0.034" stop-color="#522CD5"/>
<stop offset="0.9955" stop-color="#8A6FE8"/>
</radialGradient>
<radialGradient id="paint7_radial" cx="0" cy="0" r="1" gradientUnits="userSpaceOnUse" gradientTransform="translate(219.219 153.929) rotate(179.739) scale(140.935)">
<stop offset="0.4744" stop-color="#A08BE8"/>
<stop offset="0.8618" stop-color="#8065E0"/>
</radialGradient>
<radialGradient id="paint8_radial" cx="0" cy="0" r="1" gradientUnits="userSpaceOnUse" gradientTransform="translate(314.861 158.738) rotate(179.739) scale(146.053)">
<stop offset="0.0933" stop-color="#E1DFDD"/>
<stop offset="0.6573" stop-color="white"/>
</radialGradient>
<linearGradient id="paint9_linear" x1="54.1846" y1="217.159" x2="54.1846" y2="357.022" gradientUnits="userSpaceOnUse">
<stop offset="0.3344" stop-color="#9780E6"/>
<stop offset="0.8488" stop-color="#8A6FE8"/>
</linearGradient>
<radialGradient id="paint10_radial" cx="0" cy="0" r="1" gradientUnits="userSpaceOnUse" gradientTransform="translate(90.3494 218.071) rotate(-0.260742) scale(25.9924)">
<stop stop-color="#8065E0"/>
<stop offset="1" stop-color="#512BD4"/>
</radialGradient>
<radialGradient id="paint11_radial" cx="0" cy="0" r="1" gradientUnits="userSpaceOnUse" gradientTransform="translate(25.805 345.043) scale(26.4106)">
<stop stop-color="#8065E0"/>
<stop offset="1" stop-color="#512BD4"/>
</radialGradient>
<radialGradient id="paint12_radial" cx="0" cy="0" r="1" gradientUnits="userSpaceOnUse" gradientTransform="translate(169.113 67.3662) rotate(-32.2025) scale(21.0773)">
<stop stop-color="#8065E0"/>
<stop offset="1" stop-color="#512BD4"/>
</radialGradient>
</defs>
</svg>
<svg width="419" height="519" viewBox="0 0 419 519" fill="none" xmlns="http://www.w3.org/2000/svg">
<path d="M284.432 247.568L284.004 221.881C316.359 221.335 340.356 211.735 355.308 193.336C382.408 159.996 372.893 108.183 372.786 107.659L398.013 102.831C398.505 105.432 409.797 167.017 375.237 209.53C355.276 234.093 324.719 246.894 284.432 247.568Z" fill="#8A6FE8"/>
<path d="M331.954 109.36L361.826 134.245C367.145 138.676 375.055 137.959 379.497 132.639C383.928 127.32 383.211 119.41 377.891 114.969L348.019 90.0842C342.7 85.6531 334.79 86.3702 330.348 91.6896C325.917 97.0197 326.634 104.929 331.954 109.36Z" fill="#8A6FE8"/>
<path d="M407.175 118.062L417.92 94.2263C420.735 87.858 417.856 80.4087 411.488 77.5831C405.12 74.7682 397.67 77.6473 394.845 84.0156L383.831 108.461L407.175 118.062Z" fill="#8A6FE8"/>
<path d="M401.363 105.175L401.234 69.117C401.181 62.1493 395.498 56.541 388.53 56.5945C381.562 56.648 375.954 62.3313 376.007 69.2989L376.018 96.11L401.363 105.175Z" fill="#8A6FE8"/>
<path d="M386.453 109.071L378.137 73.9548C376.543 67.169 369.757 62.9628 362.971 64.5575C356.185 66.1523 351.979 72.938 353.574 79.7237L362.04 115.482L386.453 109.071Z" fill="#8A6FE8"/>
<path d="M381.776 142.261C396.359 142.261 408.181 130.44 408.181 115.857C408.181 101.274 396.359 89.4527 381.776 89.4527C367.194 89.4527 355.372 101.274 355.372 115.857C355.372 130.44 367.194 142.261 381.776 142.261Z" fill="url(#paint0_radial)"/>
<path d="M248.267 406.979C248.513 384.727 245.345 339.561 222.376 301.736L199.922 315.372C220.76 349.675 222.323 389.715 221.841 407.182C221.798 408.627 235.263 409.933 248.267 406.979Z" fill="url(#paint1_linear)"/>
<path d="M221.841 406.936L242.637 406.84L262.052 518.065L220.311 518.258C217.132 518.269 214.724 515.711 214.938 512.532L221.841 406.936Z" fill="#522CD5"/>
<path d="M306.566 488.814C310.173 491.661 310.109 495.782 309.831 500.127L308.964 513.452C308.803 515.839 306.727 517.798 304.34 517.809L260.832 518.012C258.125 518.023 256.08 515.839 256.262 513.142L256.551 499.335C256.883 494.315 255.192 492.474 251.307 487.744C244.649 479.663 224.967 435.62 226.84 406.925L248.256 406.829C249.691 423.858 272.167 461.682 306.566 488.814Z" fill="url(#paint2_linear)"/>
<path d="M309.82 500.127C310.023 497.088 310.077 494.176 308.889 491.715L254.635 491.961C256.134 494.166 256.765 496.092 256.562 499.314L256.273 513.121C256.091 515.828 258.146 518.012 260.843 517.99L304.34 517.798C306.727 517.787 308.803 515.828 308.964 513.442L309.82 500.127Z" fill="url(#paint3_radial)"/>
<path d="M133.552 407.471C133.103 385.22 135.864 340.021 158.49 301.993L181.073 315.425C160.545 349.921 159.346 389.972 159.989 407.428C160.042 408.884 146.578 410.318 133.552 407.471Z" fill="url(#paint4_linear)"/>
<path d="M110.798 497.152C110.765 494.187 111.204 491.575 112.457 487.23C131.882 434.132 133.52 407.364 133.52 407.364L159.999 407.246C159.999 407.246 161.819 433.512 181.716 486.427C183.289 490.195 183.471 493.641 183.674 496.831L183.792 513.816C183.803 516.374 181.716 518.483 179.158 518.494L177.873 518.504L116.781 518.782L115.496 518.793C112.927 518.804 110.83 516.728 110.819 514.159L110.798 497.152Z" fill="url(#paint5_linear)"/>
<path d="M110.798 497.152C110.798 496.67 110.808 496.199 110.83 495.739C110.969 494.262 111.643 492.603 114.875 492.582L180.207 492.282C182.561 492.367 183.343 494.176 183.589 495.311C183.621 495.814 183.664 496.328 183.696 496.82L183.813 513.806C183.824 515.411 183.011 516.824 181.769 517.669C181.031 518.172 180.132 518.472 179.179 518.483L177.895 518.494L116.802 518.772L115.528 518.782C114.244 518.793 113.077 518.269 112.232 517.434C111.386 516.599 110.862 515.432 110.851 514.148L110.798 497.152Z" fill="url(#paint6_radial)"/>
<path d="M314.979 246.348C324.162 210.407 318.008 181.777 318.008 181.777L326.452 181.734L326.656 181.574C314.262 115.75 256.326 66.0987 186.949 66.4198C108.796 66.773 45.7233 130.424 46.0765 208.577C46.4297 286.731 110.08 349.803 188.234 349.45C249.905 349.172 302.178 309.474 321.304 254.343C321.872 251.999 321.797 247.804 314.979 246.348Z" fill="url(#paint7_radial)"/>
<path d="M310.237 279.035L65.877 280.148C71.3998 289.428 77.95 298.012 85.3672 305.761L290.972 304.829C298.336 297.005 304.8 288.368 310.237 279.035Z" fill="#D8CFF7"/>
<path d="M235.062 312.794L280.924 312.585L280.74 272.021L234.877 272.23L235.062 312.794Z" fill="#512BD4"/>
<path d="M243.001 297.626C242.691 297.626 242.434 297.53 242.22 297.327C242.006 297.123 241.899 296.866 241.899 296.588C241.899 296.299 242.006 296.042 242.22 295.839C242.434 295.625 242.691 295.528 243.001 295.528C243.312 295.528 243.568 295.635 243.782 295.839C243.996 296.042 244.114 296.299 244.114 296.588C244.114 296.877 244.007 297.123 243.793 297.327C243.568 297.519 243.312 297.626 243.001 297.626Z" fill="white"/>
<path d="M255.192 297.434H253.212L247.967 289.203C247.839 289 247.721 288.775 247.636 288.55H247.593C247.636 288.786 247.657 289.299 247.657 290.091L247.668 297.444H245.912L245.891 286.228H247.999L253.062 294.265C253.276 294.597 253.415 294.833 253.479 294.95H253.511C253.458 294.651 253.437 294.148 253.437 293.441L253.426 286.217H255.17L255.192 297.434Z" fill="white"/>
<path d="M263.733 297.412L257.589 297.423L257.568 286.206L263.465 286.195V287.779L259.387 287.79L259.398 290.969L263.155 290.958V292.532L259.398 292.542L259.409 295.86L263.733 295.85V297.412Z" fill="white"/>
<path d="M272.445 287.758L269.298 287.769L269.32 297.401H267.5L267.479 287.769L264.343 287.779V286.195L272.434 286.174L272.445 287.758Z" fill="white"/>
<path d="M315.279 246.337C324.355 210.836 318.457 182.483 318.308 181.798L171.484 182.462C171.484 182.462 162.226 181.563 162.268 190.018C162.311 198.463 162.761 222.341 162.878 248.746C162.9 254.172 167.363 256.773 170.863 256.751C170.874 256.751 311.618 252.213 315.279 246.337Z" fill="url(#paint8_radial)"/>
<path d="M227.685 246.798C227.685 246.798 250.183 228.827 254.571 225.499C258.959 222.17 262.812 221.977 266.869 225.445C270.925 228.913 293.616 246.498 293.616 246.498L227.685 246.798Z" fill="#A08BE8"/>
<path d="M320.748 256.141C320.748 256.141 324.943 248.414 315.279 246.348C315.289 246.305 170.927 246.894 170.927 246.894C167.566 246.905 163.232 244.925 162.846 241.671C162.857 244.004 162.878 246.369 162.889 248.756C162.91 253.68 166.582 256.27 169.878 256.698C170.21 256.73 170.542 256.773 170.874 256.773L180.742 256.73L320.748 256.141Z" fill="#512BD4"/>
<path d="M206.4 233.214C212.511 233.095 217.302 224.667 217.102 214.39C216.901 204.112 211.785 195.878 205.674 195.997C199.563 196.116 194.772 204.544 194.973 214.821C195.173 225.099 200.289 233.333 206.4 233.214Z" fill="#512BD4"/>
<path d="M306.249 214.267C306.356 203.989 301.488 195.605 295.377 195.541C289.266 195.478 284.225 203.758 284.118 214.037C284.011 224.315 288.878 232.699 294.99 232.763C301.101 232.826 306.142 224.545 306.249 214.267Z" fill="#512BD4"/>
<path d="M205.905 205.291C208.152 203.022 211.192 202.016 214.157 202.262C215.912 205.495 217.014 209.733 217.111 214.389C217.164 217.3 216.811 220.04 216.158 222.513C212.669 223.519 208.752 222.662 205.979 219.922C201.912 215.909 201.88 209.348 205.905 205.291Z" fill="#8065E0"/>
<path d="M294.996 204.285C297.255 202.016 300.294 200.999 303.259 201.256C305.164 204.628 306.309 209.209 306.256 214.239C306.224 216.808 305.892 219.259 305.303 221.485C301.793 222.523 297.843 221.678 295.061 218.916C291.004 214.892 290.972 208.342 294.996 204.285Z" fill="#8065E0"/>
<path d="M11.6342 357.017C10.9171 354.716 -5.72611 300.141 21.3204 258.903C36.9468 235.078 63.3083 221.035 99.6664 217.15L102.449 243.276C74.3431 246.273 54.4676 256.345 43.3579 273.202C23.0971 303.941 36.5722 348.733 36.7113 349.183L11.6342 357.017Z" fill="url(#paint9_linear)"/>
<path d="M95.1498 252.802C109.502 252.802 121.137 241.167 121.137 226.815C121.137 212.463 109.502 200.828 95.1498 200.828C80.7976 200.828 69.1628 212.463 69.1628 226.815C69.1628 241.167 80.7976 252.802 95.1498 252.802Z" fill="url(#paint10_radial)"/>
<path d="M72.0098 334.434L33.4683 329.307C26.597 328.397 20.2929 333.214 19.3725 340.085C18.4627 346.956 23.279 353.26 30.1504 354.181L68.6919 359.308C75.5632 360.217 81.8673 355.401 82.7878 348.53C83.6975 341.658 78.8705 335.344 72.0098 334.434Z" fill="#8A6FE8"/>
<path d="M3.73535 367.185L7.35297 393.076C8.36975 399.968 14.7702 404.731 21.6629 403.725C28.5556 402.708 33.3185 396.308 32.3124 389.415L28.5984 362.861L3.73535 367.185Z" fill="#8A6FE8"/>
<path d="M15.5194 374.988L34.849 405.427C38.6058 411.292 46.4082 413.005 52.2735 409.248C58.1387 405.491 59.8512 397.689 56.0945 391.823L41.7953 369.144L15.5194 374.988Z" fill="#8A6FE8"/>
<path d="M26.0511 363.739L51.8026 389.019C56.7688 393.911 64.7532 393.846 69.6445 388.88C74.5358 383.914 74.4715 375.929 69.516 371.038L43.2937 345.297L26.0511 363.739Z" fill="#8A6FE8"/>
<path d="M26.4043 381.912C40.987 381.912 52.8086 370.091 52.8086 355.508C52.8086 340.925 40.987 329.104 26.4043 329.104C11.8216 329.104 0 340.925 0 355.508C0 370.091 11.8216 381.912 26.4043 381.912Z" fill="url(#paint11_radial)"/>
<path d="M184.73 63.6308L157.819 66.5892L158.561 38.5412L177.888 36.4178L184.73 63.6308Z" fill="#8A6FE8"/>
<path d="M170.018 41.647C180.455 39.521 187.193 29.3363 185.067 18.8988C182.941 8.46126 172.757 1.72345 162.319 3.84944C151.882 5.97543 145.144 16.1601 147.27 26.5976C149.396 37.0351 159.58 43.773 170.018 41.647Z" fill="#D8CFF7"/>
<path d="M196.885 79.385C198.102 79.2464 198.948 78.091 198.684 76.8997C195.851 64.2818 183.923 55.5375 170.773 56.9926C157.622 58.4371 147.886 69.5735 147.865 82.4995C147.863 83.7232 148.949 84.6597 150.168 84.5316L196.885 79.385Z" fill="url(#paint12_radial)"/>
<defs>
<radialGradient id="paint0_radial" cx="0" cy="0" r="1" gradientUnits="userSpaceOnUse" gradientTransform="translate(382.004 103.457) scale(26.4058)">
<stop stop-color="#8065E0"/>
<stop offset="1" stop-color="#512BD4"/>
</radialGradient>
<linearGradient id="paint1_linear" x1="214.439" y1="303.482" x2="236.702" y2="409.505" gradientUnits="userSpaceOnUse">
<stop stop-color="#522CD5"/>
<stop offset="0.4397" stop-color="#8A6FE8"/>
</linearGradient>
<linearGradient id="paint2_linear" x1="231.673" y1="404.144" x2="297.805" y2="522.048" gradientUnits="userSpaceOnUse">
<stop stop-color="#522CD5"/>
<stop offset="0.4397" stop-color="#8A6FE8"/>
</linearGradient>
<radialGradient id="paint3_radial" cx="0" cy="0" r="1" gradientUnits="userSpaceOnUse" gradientTransform="translate(280.957 469.555) rotate(-0.260742) scale(45.8326)">
<stop offset="0.034" stop-color="#522CD5"/>
<stop offset="0.9955" stop-color="#8A6FE8"/>
</radialGradient>
<linearGradient id="paint4_linear" x1="166.061" y1="303.491" x2="144.763" y2="409.709" gradientUnits="userSpaceOnUse">
<stop stop-color="#522CD5"/>
<stop offset="0.4397" stop-color="#8A6FE8"/>
</linearGradient>
<linearGradient id="paint5_linear" x1="146.739" y1="407.302" x2="147.246" y2="518.627" gradientUnits="userSpaceOnUse">
<stop stop-color="#522CD5"/>
<stop offset="0.4397" stop-color="#8A6FE8"/>
</linearGradient>
<radialGradient id="paint6_radial" cx="0" cy="0" r="1" gradientUnits="userSpaceOnUse" gradientTransform="translate(148.63 470.023) rotate(179.739) scale(50.2476)">
<stop offset="0.034" stop-color="#522CD5"/>
<stop offset="0.9955" stop-color="#8A6FE8"/>
</radialGradient>
<radialGradient id="paint7_radial" cx="0" cy="0" r="1" gradientUnits="userSpaceOnUse" gradientTransform="translate(219.219 153.929) rotate(179.739) scale(140.935)">
<stop offset="0.4744" stop-color="#A08BE8"/>
<stop offset="0.8618" stop-color="#8065E0"/>
</radialGradient>
<radialGradient id="paint8_radial" cx="0" cy="0" r="1" gradientUnits="userSpaceOnUse" gradientTransform="translate(314.861 158.738) rotate(179.739) scale(146.053)">
<stop offset="0.0933" stop-color="#E1DFDD"/>
<stop offset="0.6573" stop-color="white"/>
</radialGradient>
<linearGradient id="paint9_linear" x1="54.1846" y1="217.159" x2="54.1846" y2="357.022" gradientUnits="userSpaceOnUse">
<stop offset="0.3344" stop-color="#9780E6"/>
<stop offset="0.8488" stop-color="#8A6FE8"/>
</linearGradient>
<radialGradient id="paint10_radial" cx="0" cy="0" r="1" gradientUnits="userSpaceOnUse" gradientTransform="translate(90.3494 218.071) rotate(-0.260742) scale(25.9924)">
<stop stop-color="#8065E0"/>
<stop offset="1" stop-color="#512BD4"/>
</radialGradient>
<radialGradient id="paint11_radial" cx="0" cy="0" r="1" gradientUnits="userSpaceOnUse" gradientTransform="translate(25.805 345.043) scale(26.4106)">
<stop stop-color="#8065E0"/>
<stop offset="1" stop-color="#512BD4"/>
</radialGradient>
<radialGradient id="paint12_radial" cx="0" cy="0" r="1" gradientUnits="userSpaceOnUse" gradientTransform="translate(169.113 67.3662) rotate(-32.2025) scale(21.0773)">
<stop stop-color="#8065E0"/>
<stop offset="1" stop-color="#512BD4"/>
</radialGradient>
</defs>
</svg>

Before

Width:  |  Height:  |  Size: 13 KiB

After

Width:  |  Height:  |  Size: 12 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 4.6 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 8.1 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 20 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 11 KiB

@ -1,15 +1,15 @@
Any raw assets you want to be deployed with your application can be placed in
this directory (and child directories). Deployment of the asset to your application
is automatically handled by the following `MauiAsset` Build Action within your `.csproj`.
<MauiAsset Include="Resources\Raw\**" LogicalName="%(RecursiveDir)%(Filename)%(Extension)" />
These files will be deployed with you package and will be accessible using Essentials:
async Task LoadMauiAsset()
{
using var stream = await FileSystem.OpenAppPackageFileAsync("AboutAssets.txt");
using var reader = new StreamReader(stream);
var contents = reader.ReadToEnd();
}
Any raw assets you want to be deployed with your application can be placed in
this directory (and child directories). Deployment of the asset to your application
is automatically handled by the following `MauiAsset` Build Action within your `.csproj`.
<MauiAsset Include="Resources\Raw\**" LogicalName="%(RecursiveDir)%(Filename)%(Extension)" />
These files will be deployed with you package and will be accessible using Essentials:
async Task LoadMauiAsset()
{
using var stream = await FileSystem.OpenAppPackageFileAsync("AboutAssets.txt");
using var reader = new StreamReader(stream);
var contents = reader.ReadToEnd();
}

@ -1,8 +1,8 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
<svg width="456" height="456" viewBox="0 0 456 456" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" xml:space="preserve" xmlns:serif="http://www.serif.com/" style="fill-rule:evenodd;clip-rule:evenodd;stroke-linejoin:round;stroke-miterlimit:2;">
<path d="m 105.50037,281.60863 c -2.70293,0 -5.00091,-0.90042 -6.893127,-2.70209 -1.892214,-1.84778 -2.837901,-4.04181 -2.837901,-6.58209 0,-2.58722 0.945687,-4.80389 2.837901,-6.65167 1.892217,-1.84778 4.190197,-2.77167 6.893127,-2.77167 2.74819,0 5.06798,0.92389 6.96019,2.77167 1.93749,1.84778 2.90581,4.06445 2.90581,6.65167 0,2.54028 -0.96832,4.73431 -2.90581,6.58209 -1.89221,1.80167 -4.212,2.70209 -6.96019,2.70209 z" style="fill:#ffffff;fill-rule:nonzero;stroke-width:0.838376" />
<path d="M 213.56111,280.08446 H 195.99044 L 149.69953,207.0544 c -1.17121,-1.84778 -2.14037,-3.76515 -2.90581,-5.75126 h -0.40578 c 0.36051,2.12528 0.54076,6.67515 0.54076,13.6496 v 65.13172 h -15.54349 v -99.36009 h 18.71925 l 44.7374,71.29798 c 1.89222,2.95695 3.1087,4.98917 3.64945,6.09751 h 0.26996 c -0.45021,-2.6325 -0.67573,-7.09015 -0.67573,-13.37293 v -64.02256 h 15.47557 z" style="fill:#ffffff;fill-rule:nonzero;stroke-width:0.838376" />
<path d="m 289.25134,280.08446 h -54.40052 v -99.36009 h 52.23835 v 13.99669 h -36.15411 v 28.13085 h 33.31621 v 13.9271 h -33.31621 v 29.37835 h 38.31628 z" style="fill:#ffffff;fill-rule:nonzero;stroke-width:0.838376" />
<path d="M 366.56466,194.72106 H 338.7222 v 85.3634 h -16.08423 v -85.3634 h -27.77455 v -13.99669 h 71.70124 z" style="fill:#ffffff;fill-rule:nonzero;stroke-width:0.838376" />
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
<svg width="456" height="456" viewBox="0 0 456 456" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" xml:space="preserve" xmlns:serif="http://www.serif.com/" style="fill-rule:evenodd;clip-rule:evenodd;stroke-linejoin:round;stroke-miterlimit:2;">
<path d="m 105.50037,281.60863 c -2.70293,0 -5.00091,-0.90042 -6.893127,-2.70209 -1.892214,-1.84778 -2.837901,-4.04181 -2.837901,-6.58209 0,-2.58722 0.945687,-4.80389 2.837901,-6.65167 1.892217,-1.84778 4.190197,-2.77167 6.893127,-2.77167 2.74819,0 5.06798,0.92389 6.96019,2.77167 1.93749,1.84778 2.90581,4.06445 2.90581,6.65167 0,2.54028 -0.96832,4.73431 -2.90581,6.58209 -1.89221,1.80167 -4.212,2.70209 -6.96019,2.70209 z" style="fill:#ffffff;fill-rule:nonzero;stroke-width:0.838376" />
<path d="M 213.56111,280.08446 H 195.99044 L 149.69953,207.0544 c -1.17121,-1.84778 -2.14037,-3.76515 -2.90581,-5.75126 h -0.40578 c 0.36051,2.12528 0.54076,6.67515 0.54076,13.6496 v 65.13172 h -15.54349 v -99.36009 h 18.71925 l 44.7374,71.29798 c 1.89222,2.95695 3.1087,4.98917 3.64945,6.09751 h 0.26996 c -0.45021,-2.6325 -0.67573,-7.09015 -0.67573,-13.37293 v -64.02256 h 15.47557 z" style="fill:#ffffff;fill-rule:nonzero;stroke-width:0.838376" />
<path d="m 289.25134,280.08446 h -54.40052 v -99.36009 h 52.23835 v 13.99669 h -36.15411 v 28.13085 h 33.31621 v 13.9271 h -33.31621 v 29.37835 h 38.31628 z" style="fill:#ffffff;fill-rule:nonzero;stroke-width:0.838376" />
<path d="M 366.56466,194.72106 H 338.7222 v 85.3634 h -16.08423 v -85.3634 h -27.77455 v -13.99669 h 71.70124 z" style="fill:#ffffff;fill-rule:nonzero;stroke-width:0.838376" />
</svg>

Before

Width:  |  Height:  |  Size: 1.8 KiB

After

Width:  |  Height:  |  Size: 1.8 KiB

@ -1,44 +1,44 @@
<?xml version="1.0" encoding="UTF-8" ?>
<?xaml-comp compile="true" ?>
<ResourceDictionary
xmlns="http://schemas.microsoft.com/dotnet/2021/maui"
xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml">
<Color x:Key="Primary">#512BD4</Color>
<Color x:Key="Secondary">#DFD8F7</Color>
<Color x:Key="Tertiary">#2B0B98</Color>
<Color x:Key="White">White</Color>
<Color x:Key="Black">Black</Color>
<Color x:Key="Gray100">#E1E1E1</Color>
<Color x:Key="Gray200">#C8C8C8</Color>
<Color x:Key="Gray300">#ACACAC</Color>
<Color x:Key="Gray400">#919191</Color>
<Color x:Key="Gray500">#6E6E6E</Color>
<Color x:Key="Gray600">#404040</Color>
<Color x:Key="Gray900">#212121</Color>
<Color x:Key="Gray950">#141414</Color>
<SolidColorBrush x:Key="PrimaryBrush" Color="{StaticResource Primary}"/>
<SolidColorBrush x:Key="SecondaryBrush" Color="{StaticResource Secondary}"/>
<SolidColorBrush x:Key="TertiaryBrush" Color="{StaticResource Tertiary}"/>
<SolidColorBrush x:Key="WhiteBrush" Color="{StaticResource White}"/>
<SolidColorBrush x:Key="BlackBrush" Color="{StaticResource Black}"/>
<SolidColorBrush x:Key="Gray100Brush" Color="{StaticResource Gray100}"/>
<SolidColorBrush x:Key="Gray200Brush" Color="{StaticResource Gray200}"/>
<SolidColorBrush x:Key="Gray300Brush" Color="{StaticResource Gray300}"/>
<SolidColorBrush x:Key="Gray400Brush" Color="{StaticResource Gray400}"/>
<SolidColorBrush x:Key="Gray500Brush" Color="{StaticResource Gray500}"/>
<SolidColorBrush x:Key="Gray600Brush" Color="{StaticResource Gray600}"/>
<SolidColorBrush x:Key="Gray900Brush" Color="{StaticResource Gray900}"/>
<SolidColorBrush x:Key="Gray950Brush" Color="{StaticResource Gray950}"/>
<Color x:Key="Yellow100Accent">#F7B548</Color>
<Color x:Key="Yellow200Accent">#FFD590</Color>
<Color x:Key="Yellow300Accent">#FFE5B9</Color>
<Color x:Key="Cyan100Accent">#28C2D1</Color>
<Color x:Key="Cyan200Accent">#7BDDEF</Color>
<Color x:Key="Cyan300Accent">#C3F2F4</Color>
<Color x:Key="Blue100Accent">#3E8EED</Color>
<Color x:Key="Blue200Accent">#72ACF1</Color>
<Color x:Key="Blue300Accent">#A7CBF6</Color>
<?xml version="1.0" encoding="UTF-8" ?>
<?xaml-comp compile="true" ?>
<ResourceDictionary
xmlns="http://schemas.microsoft.com/dotnet/2021/maui"
xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml">
<Color x:Key="Primary">#512BD4</Color>
<Color x:Key="Secondary">#DFD8F7</Color>
<Color x:Key="Tertiary">#2B0B98</Color>
<Color x:Key="White">White</Color>
<Color x:Key="Black">Black</Color>
<Color x:Key="Gray100">#E1E1E1</Color>
<Color x:Key="Gray200">#C8C8C8</Color>
<Color x:Key="Gray300">#ACACAC</Color>
<Color x:Key="Gray400">#919191</Color>
<Color x:Key="Gray500">#6E6E6E</Color>
<Color x:Key="Gray600">#404040</Color>
<Color x:Key="Gray900">#212121</Color>
<Color x:Key="Gray950">#141414</Color>
<SolidColorBrush x:Key="PrimaryBrush" Color="{StaticResource Primary}"/>
<SolidColorBrush x:Key="SecondaryBrush" Color="{StaticResource Secondary}"/>
<SolidColorBrush x:Key="TertiaryBrush" Color="{StaticResource Tertiary}"/>
<SolidColorBrush x:Key="WhiteBrush" Color="{StaticResource White}"/>
<SolidColorBrush x:Key="BlackBrush" Color="{StaticResource Black}"/>
<SolidColorBrush x:Key="Gray100Brush" Color="{StaticResource Gray100}"/>
<SolidColorBrush x:Key="Gray200Brush" Color="{StaticResource Gray200}"/>
<SolidColorBrush x:Key="Gray300Brush" Color="{StaticResource Gray300}"/>
<SolidColorBrush x:Key="Gray400Brush" Color="{StaticResource Gray400}"/>
<SolidColorBrush x:Key="Gray500Brush" Color="{StaticResource Gray500}"/>
<SolidColorBrush x:Key="Gray600Brush" Color="{StaticResource Gray600}"/>
<SolidColorBrush x:Key="Gray900Brush" Color="{StaticResource Gray900}"/>
<SolidColorBrush x:Key="Gray950Brush" Color="{StaticResource Gray950}"/>
<Color x:Key="Yellow100Accent">#F7B548</Color>
<Color x:Key="Yellow200Accent">#FFD590</Color>
<Color x:Key="Yellow300Accent">#FFE5B9</Color>
<Color x:Key="Cyan100Accent">#28C2D1</Color>
<Color x:Key="Cyan200Accent">#7BDDEF</Color>
<Color x:Key="Cyan300Accent">#C3F2F4</Color>
<Color x:Key="Blue100Accent">#3E8EED</Color>
<Color x:Key="Blue200Accent">#72ACF1</Color>
<Color x:Key="Blue300Accent">#A7CBF6</Color>
</ResourceDictionary>

@ -1,405 +1,405 @@
<?xml version="1.0" encoding="UTF-8" ?>
<?xaml-comp compile="true" ?>
<ResourceDictionary
xmlns="http://schemas.microsoft.com/dotnet/2021/maui"
xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml">
<Style TargetType="ActivityIndicator">
<Setter Property="Color" Value="{AppThemeBinding Light={StaticResource Primary}, Dark={StaticResource White}}" />
</Style>
<Style TargetType="IndicatorView">
<Setter Property="IndicatorColor" Value="{AppThemeBinding Light={StaticResource Gray200}, Dark={StaticResource Gray500}}"/>
<Setter Property="SelectedIndicatorColor" Value="{AppThemeBinding Light={StaticResource Gray950}, Dark={StaticResource Gray100}}"/>
</Style>
<Style TargetType="Border">
<Setter Property="Stroke" Value="{AppThemeBinding Light={StaticResource Gray200}, Dark={StaticResource Gray500}}" />
<Setter Property="StrokeShape" Value="Rectangle"/>
<Setter Property="StrokeThickness" Value="1"/>
</Style>
<Style TargetType="BoxView">
<Setter Property="Color" Value="{AppThemeBinding Light={StaticResource Gray950}, Dark={StaticResource Gray200}}" />
</Style>
<Style TargetType="Button">
<Setter Property="TextColor" Value="{AppThemeBinding Light={StaticResource White}, Dark={StaticResource Primary}}" />
<Setter Property="BackgroundColor" Value="{AppThemeBinding Light={StaticResource Primary}, Dark={StaticResource White}}" />
<Setter Property="FontFamily" Value="OpenSansRegular"/>
<Setter Property="FontSize" Value="14"/>
<Setter Property="CornerRadius" Value="8"/>
<Setter Property="Padding" Value="14,10"/>
<Setter Property="MinimumHeightRequest" Value="44"/>
<Setter Property="MinimumWidthRequest" Value="44"/>
<Setter Property="VisualStateManager.VisualStateGroups">
<VisualStateGroupList>
<VisualStateGroup x:Name="CommonStates">
<VisualState x:Name="Normal" />
<VisualState x:Name="Disabled">
<VisualState.Setters>
<Setter Property="TextColor" Value="{AppThemeBinding Light={StaticResource Gray950}, Dark={StaticResource Gray200}}" />
<Setter Property="BackgroundColor" Value="{AppThemeBinding Light={StaticResource Gray200}, Dark={StaticResource Gray600}}" />
</VisualState.Setters>
</VisualState>
</VisualStateGroup>
</VisualStateGroupList>
</Setter>
</Style>
<Style TargetType="CheckBox">
<Setter Property="Color" Value="{AppThemeBinding Light={StaticResource Primary}, Dark={StaticResource White}}" />
<Setter Property="MinimumHeightRequest" Value="44"/>
<Setter Property="MinimumWidthRequest" Value="44"/>
<Setter Property="VisualStateManager.VisualStateGroups">
<VisualStateGroupList>
<VisualStateGroup x:Name="CommonStates">
<VisualState x:Name="Normal" />
<VisualState x:Name="Disabled">
<VisualState.Setters>
<Setter Property="Color" Value="{AppThemeBinding Light={StaticResource Gray300}, Dark={StaticResource Gray600}}" />
</VisualState.Setters>
</VisualState>
</VisualStateGroup>
</VisualStateGroupList>
</Setter>
</Style>
<Style TargetType="DatePicker">
<Setter Property="TextColor" Value="{AppThemeBinding Light={StaticResource Gray900}, Dark={StaticResource White}}" />
<Setter Property="BackgroundColor" Value="Transparent" />
<Setter Property="FontFamily" Value="OpenSansRegular"/>
<Setter Property="FontSize" Value="14"/>
<Setter Property="MinimumHeightRequest" Value="44"/>
<Setter Property="MinimumWidthRequest" Value="44"/>
<Setter Property="VisualStateManager.VisualStateGroups">
<VisualStateGroupList>
<VisualStateGroup x:Name="CommonStates">
<VisualState x:Name="Normal" />
<VisualState x:Name="Disabled">
<VisualState.Setters>
<Setter Property="TextColor" Value="{AppThemeBinding Light={StaticResource Gray200}, Dark={StaticResource Gray500}}" />
</VisualState.Setters>
</VisualState>
</VisualStateGroup>
</VisualStateGroupList>
</Setter>
</Style>
<Style TargetType="Editor">
<Setter Property="TextColor" Value="{AppThemeBinding Light={StaticResource Black}, Dark={StaticResource White}}" />
<Setter Property="BackgroundColor" Value="Transparent" />
<Setter Property="FontFamily" Value="OpenSansRegular"/>
<Setter Property="FontSize" Value="14" />
<Setter Property="PlaceholderColor" Value="{AppThemeBinding Light={StaticResource Gray200}, Dark={StaticResource Gray500}}" />
<Setter Property="MinimumHeightRequest" Value="44"/>
<Setter Property="MinimumWidthRequest" Value="44"/>
<Setter Property="VisualStateManager.VisualStateGroups">
<VisualStateGroupList>
<VisualStateGroup x:Name="CommonStates">
<VisualState x:Name="Normal" />
<VisualState x:Name="Disabled">
<VisualState.Setters>
<Setter Property="TextColor" Value="{AppThemeBinding Light={StaticResource Gray300}, Dark={StaticResource Gray600}}" />
</VisualState.Setters>
</VisualState>
</VisualStateGroup>
</VisualStateGroupList>
</Setter>
</Style>
<Style TargetType="Entry">
<Setter Property="TextColor" Value="{AppThemeBinding Light={StaticResource Black}, Dark={StaticResource White}}" />
<Setter Property="BackgroundColor" Value="Transparent" />
<Setter Property="FontFamily" Value="OpenSansRegular"/>
<Setter Property="FontSize" Value="14" />
<Setter Property="PlaceholderColor" Value="{AppThemeBinding Light={StaticResource Gray200}, Dark={StaticResource Gray500}}" />
<Setter Property="MinimumHeightRequest" Value="44"/>
<Setter Property="MinimumWidthRequest" Value="44"/>
<Setter Property="VisualStateManager.VisualStateGroups">
<VisualStateGroupList>
<VisualStateGroup x:Name="CommonStates">
<VisualState x:Name="Normal" />
<VisualState x:Name="Disabled">
<VisualState.Setters>
<Setter Property="TextColor" Value="{AppThemeBinding Light={StaticResource Gray300}, Dark={StaticResource Gray600}}" />
</VisualState.Setters>
</VisualState>
</VisualStateGroup>
</VisualStateGroupList>
</Setter>
</Style>
<Style TargetType="Frame">
<Setter Property="HasShadow" Value="False" />
<Setter Property="BorderColor" Value="{AppThemeBinding Light={StaticResource Gray200}, Dark={StaticResource Gray950}}" />
<Setter Property="CornerRadius" Value="8" />
</Style>
<Style TargetType="ImageButton">
<Setter Property="Opacity" Value="1" />
<Setter Property="BorderColor" Value="Transparent"/>
<Setter Property="BorderWidth" Value="0"/>
<Setter Property="CornerRadius" Value="0"/>
<Setter Property="MinimumHeightRequest" Value="44"/>
<Setter Property="MinimumWidthRequest" Value="44"/>
<Setter Property="VisualStateManager.VisualStateGroups">
<VisualStateGroupList>
<VisualStateGroup x:Name="CommonStates">
<VisualState x:Name="Normal" />
<VisualState x:Name="Disabled">
<VisualState.Setters>
<Setter Property="Opacity" Value="0.5" />
</VisualState.Setters>
</VisualState>
</VisualStateGroup>
</VisualStateGroupList>
</Setter>
</Style>
<Style TargetType="Label">
<Setter Property="TextColor" Value="{AppThemeBinding Light={StaticResource Gray900}, Dark={StaticResource White}}" />
<Setter Property="BackgroundColor" Value="Transparent" />
<Setter Property="FontFamily" Value="OpenSansRegular" />
<Setter Property="FontSize" Value="14" />
<Setter Property="VisualStateManager.VisualStateGroups">
<VisualStateGroupList>
<VisualStateGroup x:Name="CommonStates">
<VisualState x:Name="Normal" />
<VisualState x:Name="Disabled">
<VisualState.Setters>
<Setter Property="TextColor" Value="{AppThemeBinding Light={StaticResource Gray300}, Dark={StaticResource Gray600}}" />
</VisualState.Setters>
</VisualState>
</VisualStateGroup>
</VisualStateGroupList>
</Setter>
</Style>
<Style TargetType="ListView">
<Setter Property="SeparatorColor" Value="{AppThemeBinding Light={StaticResource Gray200}, Dark={StaticResource Gray500}}" />
<Setter Property="RefreshControlColor" Value="{AppThemeBinding Light={StaticResource Gray900}, Dark={StaticResource Gray200}}" />
</Style>
<Style TargetType="Picker">
<Setter Property="TextColor" Value="{AppThemeBinding Light={StaticResource Gray900}, Dark={StaticResource White}}" />
<Setter Property="TitleColor" Value="{AppThemeBinding Light={StaticResource Gray900}, Dark={StaticResource Gray200}}" />
<Setter Property="BackgroundColor" Value="Transparent" />
<Setter Property="FontFamily" Value="OpenSansRegular"/>
<Setter Property="FontSize" Value="14"/>
<Setter Property="MinimumHeightRequest" Value="44"/>
<Setter Property="MinimumWidthRequest" Value="44"/>
<Setter Property="VisualStateManager.VisualStateGroups">
<VisualStateGroupList>
<VisualStateGroup x:Name="CommonStates">
<VisualState x:Name="Normal" />
<VisualState x:Name="Disabled">
<VisualState.Setters>
<Setter Property="TextColor" Value="{AppThemeBinding Light={StaticResource Gray300}, Dark={StaticResource Gray600}}" />
<Setter Property="TitleColor" Value="{AppThemeBinding Light={StaticResource Gray300}, Dark={StaticResource Gray600}}" />
</VisualState.Setters>
</VisualState>
</VisualStateGroup>
</VisualStateGroupList>
</Setter>
</Style>
<Style TargetType="ProgressBar">
<Setter Property="ProgressColor" Value="{AppThemeBinding Light={StaticResource Primary}, Dark={StaticResource White}}" />
<Setter Property="VisualStateManager.VisualStateGroups">
<VisualStateGroupList>
<VisualStateGroup x:Name="CommonStates">
<VisualState x:Name="Normal" />
<VisualState x:Name="Disabled">
<VisualState.Setters>
<Setter Property="ProgressColor" Value="{AppThemeBinding Light={StaticResource Gray300}, Dark={StaticResource Gray600}}" />
</VisualState.Setters>
</VisualState>
</VisualStateGroup>
</VisualStateGroupList>
</Setter>
</Style>
<Style TargetType="RadioButton">
<Setter Property="BackgroundColor" Value="Transparent"/>
<Setter Property="TextColor" Value="{AppThemeBinding Light={StaticResource Black}, Dark={StaticResource White}}" />
<Setter Property="FontFamily" Value="OpenSansRegular"/>
<Setter Property="FontSize" Value="14"/>
<Setter Property="MinimumHeightRequest" Value="44"/>
<Setter Property="MinimumWidthRequest" Value="44"/>
<Setter Property="VisualStateManager.VisualStateGroups">
<VisualStateGroupList>
<VisualStateGroup x:Name="CommonStates">
<VisualState x:Name="Normal" />
<VisualState x:Name="Disabled">
<VisualState.Setters>
<Setter Property="TextColor" Value="{AppThemeBinding Light={StaticResource Gray300}, Dark={StaticResource Gray600}}" />
</VisualState.Setters>
</VisualState>
</VisualStateGroup>
</VisualStateGroupList>
</Setter>
</Style>
<Style TargetType="RefreshView">
<Setter Property="RefreshColor" Value="{AppThemeBinding Light={StaticResource Gray900}, Dark={StaticResource Gray200}}" />
</Style>
<Style TargetType="SearchBar">
<Setter Property="TextColor" Value="{AppThemeBinding Light={StaticResource Gray900}, Dark={StaticResource White}}" />
<Setter Property="PlaceholderColor" Value="{StaticResource Gray500}" />
<Setter Property="CancelButtonColor" Value="{StaticResource Gray500}" />
<Setter Property="BackgroundColor" Value="Transparent" />
<Setter Property="FontFamily" Value="OpenSansRegular" />
<Setter Property="FontSize" Value="14" />
<Setter Property="MinimumHeightRequest" Value="44"/>
<Setter Property="MinimumWidthRequest" Value="44"/>
<Setter Property="VisualStateManager.VisualStateGroups">
<VisualStateGroupList>
<VisualStateGroup x:Name="CommonStates">
<VisualState x:Name="Normal" />
<VisualState x:Name="Disabled">
<VisualState.Setters>
<Setter Property="TextColor" Value="{AppThemeBinding Light={StaticResource Gray300}, Dark={StaticResource Gray600}}" />
<Setter Property="PlaceholderColor" Value="{AppThemeBinding Light={StaticResource Gray300}, Dark={StaticResource Gray600}}" />
</VisualState.Setters>
</VisualState>
</VisualStateGroup>
</VisualStateGroupList>
</Setter>
</Style>
<Style TargetType="SearchHandler">
<Setter Property="TextColor" Value="{AppThemeBinding Light={StaticResource Gray900}, Dark={StaticResource White}}" />
<Setter Property="PlaceholderColor" Value="{StaticResource Gray500}" />
<Setter Property="BackgroundColor" Value="Transparent" />
<Setter Property="FontFamily" Value="OpenSansRegular" />
<Setter Property="FontSize" Value="14" />
<Setter Property="VisualStateManager.VisualStateGroups">
<VisualStateGroupList>
<VisualStateGroup x:Name="CommonStates">
<VisualState x:Name="Normal" />
<VisualState x:Name="Disabled">
<VisualState.Setters>
<Setter Property="TextColor" Value="{AppThemeBinding Light={StaticResource Gray300}, Dark={StaticResource Gray600}}" />
<Setter Property="PlaceholderColor" Value="{AppThemeBinding Light={StaticResource Gray300}, Dark={StaticResource Gray600}}" />
</VisualState.Setters>
</VisualState>
</VisualStateGroup>
</VisualStateGroupList>
</Setter>
</Style>
<Style TargetType="Shadow">
<Setter Property="Radius" Value="15" />
<Setter Property="Opacity" Value="0.5" />
<Setter Property="Brush" Value="{AppThemeBinding Light={StaticResource White}, Dark={StaticResource White}}" />
<Setter Property="Offset" Value="10,10" />
</Style>
<Style TargetType="Slider">
<Setter Property="MinimumTrackColor" Value="{AppThemeBinding Light={StaticResource Primary}, Dark={StaticResource White}}" />
<Setter Property="MaximumTrackColor" Value="{AppThemeBinding Light={StaticResource Gray200}, Dark={StaticResource Gray600}}" />
<Setter Property="ThumbColor" Value="{AppThemeBinding Light={StaticResource Primary}, Dark={StaticResource White}}" />
<Setter Property="VisualStateManager.VisualStateGroups">
<VisualStateGroupList>
<VisualStateGroup x:Name="CommonStates">
<VisualState x:Name="Normal" />
<VisualState x:Name="Disabled">
<VisualState.Setters>
<Setter Property="MinimumTrackColor" Value="{AppThemeBinding Light={StaticResource Gray300}, Dark={StaticResource Gray600}}"/>
<Setter Property="MaximumTrackColor" Value="{AppThemeBinding Light={StaticResource Gray300}, Dark={StaticResource Gray600}}"/>
<Setter Property="ThumbColor" Value="{AppThemeBinding Light={StaticResource Gray300}, Dark={StaticResource Gray600}}"/>
</VisualState.Setters>
</VisualState>
</VisualStateGroup>
</VisualStateGroupList>
</Setter>
</Style>
<Style TargetType="SwipeItem">
<Setter Property="BackgroundColor" Value="{AppThemeBinding Light={StaticResource White}, Dark={StaticResource Black}}" />
</Style>
<Style TargetType="Switch">
<Setter Property="OnColor" Value="{AppThemeBinding Light={StaticResource Primary}, Dark={StaticResource White}}" />
<Setter Property="ThumbColor" Value="{StaticResource White}" />
<Setter Property="VisualStateManager.VisualStateGroups">
<VisualStateGroupList>
<VisualStateGroup x:Name="CommonStates">
<VisualState x:Name="Normal" />
<VisualState x:Name="Disabled">
<VisualState.Setters>
<Setter Property="OnColor" Value="{AppThemeBinding Light={StaticResource Gray300}, Dark={StaticResource Gray600}}" />
<Setter Property="ThumbColor" Value="{AppThemeBinding Light={StaticResource Gray300}, Dark={StaticResource Gray600}}" />
</VisualState.Setters>
</VisualState>
<VisualState x:Name="On">
<VisualState.Setters>
<Setter Property="OnColor" Value="{AppThemeBinding Light={StaticResource Secondary}, Dark={StaticResource Gray200}}" />
<Setter Property="ThumbColor" Value="{AppThemeBinding Light={StaticResource Primary}, Dark={StaticResource White}}" />
</VisualState.Setters>
</VisualState>
<VisualState x:Name="Off">
<VisualState.Setters>
<Setter Property="ThumbColor" Value="{AppThemeBinding Light={StaticResource Gray400}, Dark={StaticResource Gray500}}" />
</VisualState.Setters>
</VisualState>
</VisualStateGroup>
</VisualStateGroupList>
</Setter>
</Style>
<Style TargetType="TimePicker">
<Setter Property="TextColor" Value="{AppThemeBinding Light={StaticResource Gray900}, Dark={StaticResource White}}" />
<Setter Property="BackgroundColor" Value="Transparent"/>
<Setter Property="FontFamily" Value="OpenSansRegular"/>
<Setter Property="FontSize" Value="14"/>
<Setter Property="MinimumHeightRequest" Value="44"/>
<Setter Property="MinimumWidthRequest" Value="44"/>
<Setter Property="VisualStateManager.VisualStateGroups">
<VisualStateGroupList>
<VisualStateGroup x:Name="CommonStates">
<VisualState x:Name="Normal" />
<VisualState x:Name="Disabled">
<VisualState.Setters>
<Setter Property="TextColor" Value="{AppThemeBinding Light={StaticResource Gray300}, Dark={StaticResource Gray600}}" />
</VisualState.Setters>
</VisualState>
</VisualStateGroup>
</VisualStateGroupList>
</Setter>
</Style>
<Style TargetType="Page" ApplyToDerivedTypes="True">
<Setter Property="Padding" Value="0"/>
<Setter Property="BackgroundColor" Value="{AppThemeBinding Light={StaticResource White}, Dark={StaticResource Black}}" />
</Style>
<Style TargetType="Shell" ApplyToDerivedTypes="True">
<Setter Property="Shell.BackgroundColor" Value="{AppThemeBinding Light={StaticResource Primary}, Dark={StaticResource Gray950}}" />
<Setter Property="Shell.ForegroundColor" Value="{OnPlatform WinUI={StaticResource Primary}, Default={StaticResource White}}" />
<Setter Property="Shell.TitleColor" Value="{AppThemeBinding Light={StaticResource White}, Dark={StaticResource White}}" />
<Setter Property="Shell.DisabledColor" Value="{AppThemeBinding Light={StaticResource Gray200}, Dark={StaticResource Gray950}}" />
<Setter Property="Shell.UnselectedColor" Value="{AppThemeBinding Light={StaticResource Gray200}, Dark={StaticResource Gray200}}" />
<Setter Property="Shell.NavBarHasShadow" Value="False" />
<Setter Property="Shell.TabBarBackgroundColor" Value="{AppThemeBinding Light={StaticResource White}, Dark={StaticResource Black}}" />
<Setter Property="Shell.TabBarForegroundColor" Value="{AppThemeBinding Light={StaticResource Primary}, Dark={StaticResource White}}" />
<Setter Property="Shell.TabBarTitleColor" Value="{AppThemeBinding Light={StaticResource Primary}, Dark={StaticResource White}}" />
<Setter Property="Shell.TabBarUnselectedColor" Value="{AppThemeBinding Light={StaticResource Gray900}, Dark={StaticResource Gray200}}" />
</Style>
<Style TargetType="NavigationPage">
<Setter Property="BarBackgroundColor" Value="{AppThemeBinding Light={StaticResource Primary}, Dark={StaticResource Gray950}}" />
<Setter Property="BarTextColor" Value="{AppThemeBinding Light={StaticResource Gray200}, Dark={StaticResource White}}" />
<Setter Property="IconColor" Value="{AppThemeBinding Light={StaticResource Gray200}, Dark={StaticResource White}}" />
</Style>
<Style TargetType="TabbedPage">
<Setter Property="BarBackgroundColor" Value="{AppThemeBinding Light={StaticResource White}, Dark={StaticResource Gray950}}" />
<Setter Property="BarTextColor" Value="{AppThemeBinding Light={StaticResource Primary}, Dark={StaticResource White}}" />
<Setter Property="UnselectedTabColor" Value="{AppThemeBinding Light={StaticResource Gray200}, Dark={StaticResource Gray950}}" />
<Setter Property="SelectedTabColor" Value="{AppThemeBinding Light={StaticResource Gray950}, Dark={StaticResource Gray200}}" />
</Style>
</ResourceDictionary>
<?xml version="1.0" encoding="UTF-8" ?>
<?xaml-comp compile="true" ?>
<ResourceDictionary
xmlns="http://schemas.microsoft.com/dotnet/2021/maui"
xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml">
<Style TargetType="ActivityIndicator">
<Setter Property="Color" Value="{AppThemeBinding Light={StaticResource Primary}, Dark={StaticResource White}}" />
</Style>
<Style TargetType="IndicatorView">
<Setter Property="IndicatorColor" Value="{AppThemeBinding Light={StaticResource Gray200}, Dark={StaticResource Gray500}}"/>
<Setter Property="SelectedIndicatorColor" Value="{AppThemeBinding Light={StaticResource Gray950}, Dark={StaticResource Gray100}}"/>
</Style>
<Style TargetType="Border">
<Setter Property="Stroke" Value="{AppThemeBinding Light={StaticResource Gray200}, Dark={StaticResource Gray500}}" />
<Setter Property="StrokeShape" Value="Rectangle"/>
<Setter Property="StrokeThickness" Value="1"/>
</Style>
<Style TargetType="BoxView">
<Setter Property="Color" Value="{AppThemeBinding Light={StaticResource Gray950}, Dark={StaticResource Gray200}}" />
</Style>
<Style TargetType="Button">
<Setter Property="TextColor" Value="{AppThemeBinding Light={StaticResource White}, Dark={StaticResource Primary}}" />
<Setter Property="BackgroundColor" Value="{AppThemeBinding Light={StaticResource Primary}, Dark={StaticResource White}}" />
<Setter Property="FontFamily" Value="OpenSansRegular"/>
<Setter Property="FontSize" Value="14"/>
<Setter Property="CornerRadius" Value="8"/>
<Setter Property="Padding" Value="14,10"/>
<Setter Property="MinimumHeightRequest" Value="44"/>
<Setter Property="MinimumWidthRequest" Value="44"/>
<Setter Property="VisualStateManager.VisualStateGroups">
<VisualStateGroupList>
<VisualStateGroup x:Name="CommonStates">
<VisualState x:Name="Normal" />
<VisualState x:Name="Disabled">
<VisualState.Setters>
<Setter Property="TextColor" Value="{AppThemeBinding Light={StaticResource Gray950}, Dark={StaticResource Gray200}}" />
<Setter Property="BackgroundColor" Value="{AppThemeBinding Light={StaticResource Gray200}, Dark={StaticResource Gray600}}" />
</VisualState.Setters>
</VisualState>
</VisualStateGroup>
</VisualStateGroupList>
</Setter>
</Style>
<Style TargetType="CheckBox">
<Setter Property="Color" Value="{AppThemeBinding Light={StaticResource Primary}, Dark={StaticResource White}}" />
<Setter Property="MinimumHeightRequest" Value="44"/>
<Setter Property="MinimumWidthRequest" Value="44"/>
<Setter Property="VisualStateManager.VisualStateGroups">
<VisualStateGroupList>
<VisualStateGroup x:Name="CommonStates">
<VisualState x:Name="Normal" />
<VisualState x:Name="Disabled">
<VisualState.Setters>
<Setter Property="Color" Value="{AppThemeBinding Light={StaticResource Gray300}, Dark={StaticResource Gray600}}" />
</VisualState.Setters>
</VisualState>
</VisualStateGroup>
</VisualStateGroupList>
</Setter>
</Style>
<Style TargetType="DatePicker">
<Setter Property="TextColor" Value="{AppThemeBinding Light={StaticResource Gray900}, Dark={StaticResource White}}" />
<Setter Property="BackgroundColor" Value="Transparent" />
<Setter Property="FontFamily" Value="OpenSansRegular"/>
<Setter Property="FontSize" Value="14"/>
<Setter Property="MinimumHeightRequest" Value="44"/>
<Setter Property="MinimumWidthRequest" Value="44"/>
<Setter Property="VisualStateManager.VisualStateGroups">
<VisualStateGroupList>
<VisualStateGroup x:Name="CommonStates">
<VisualState x:Name="Normal" />
<VisualState x:Name="Disabled">
<VisualState.Setters>
<Setter Property="TextColor" Value="{AppThemeBinding Light={StaticResource Gray200}, Dark={StaticResource Gray500}}" />
</VisualState.Setters>
</VisualState>
</VisualStateGroup>
</VisualStateGroupList>
</Setter>
</Style>
<Style TargetType="Editor">
<Setter Property="TextColor" Value="{AppThemeBinding Light={StaticResource Black}, Dark={StaticResource White}}" />
<Setter Property="BackgroundColor" Value="Transparent" />
<Setter Property="FontFamily" Value="OpenSansRegular"/>
<Setter Property="FontSize" Value="14" />
<Setter Property="PlaceholderColor" Value="{AppThemeBinding Light={StaticResource Gray200}, Dark={StaticResource Gray500}}" />
<Setter Property="MinimumHeightRequest" Value="44"/>
<Setter Property="MinimumWidthRequest" Value="44"/>
<Setter Property="VisualStateManager.VisualStateGroups">
<VisualStateGroupList>
<VisualStateGroup x:Name="CommonStates">
<VisualState x:Name="Normal" />
<VisualState x:Name="Disabled">
<VisualState.Setters>
<Setter Property="TextColor" Value="{AppThemeBinding Light={StaticResource Gray300}, Dark={StaticResource Gray600}}" />
</VisualState.Setters>
</VisualState>
</VisualStateGroup>
</VisualStateGroupList>
</Setter>
</Style>
<Style TargetType="Entry">
<Setter Property="TextColor" Value="{AppThemeBinding Light={StaticResource Black}, Dark={StaticResource White}}" />
<Setter Property="BackgroundColor" Value="Transparent" />
<Setter Property="FontFamily" Value="OpenSansRegular"/>
<Setter Property="FontSize" Value="14" />
<Setter Property="PlaceholderColor" Value="{AppThemeBinding Light={StaticResource Gray200}, Dark={StaticResource Gray500}}" />
<Setter Property="MinimumHeightRequest" Value="44"/>
<Setter Property="MinimumWidthRequest" Value="44"/>
<Setter Property="VisualStateManager.VisualStateGroups">
<VisualStateGroupList>
<VisualStateGroup x:Name="CommonStates">
<VisualState x:Name="Normal" />
<VisualState x:Name="Disabled">
<VisualState.Setters>
<Setter Property="TextColor" Value="{AppThemeBinding Light={StaticResource Gray300}, Dark={StaticResource Gray600}}" />
</VisualState.Setters>
</VisualState>
</VisualStateGroup>
</VisualStateGroupList>
</Setter>
</Style>
<Style TargetType="Frame">
<Setter Property="HasShadow" Value="False" />
<Setter Property="BorderColor" Value="{AppThemeBinding Light={StaticResource Gray200}, Dark={StaticResource Gray950}}" />
<Setter Property="CornerRadius" Value="8" />
</Style>
<Style TargetType="ImageButton">
<Setter Property="Opacity" Value="1" />
<Setter Property="BorderColor" Value="Transparent"/>
<Setter Property="BorderWidth" Value="0"/>
<Setter Property="CornerRadius" Value="0"/>
<Setter Property="MinimumHeightRequest" Value="44"/>
<Setter Property="MinimumWidthRequest" Value="44"/>
<Setter Property="VisualStateManager.VisualStateGroups">
<VisualStateGroupList>
<VisualStateGroup x:Name="CommonStates">
<VisualState x:Name="Normal" />
<VisualState x:Name="Disabled">
<VisualState.Setters>
<Setter Property="Opacity" Value="0.5" />
</VisualState.Setters>
</VisualState>
</VisualStateGroup>
</VisualStateGroupList>
</Setter>
</Style>
<Style TargetType="Label">
<Setter Property="TextColor" Value="{AppThemeBinding Light={StaticResource Gray900}, Dark={StaticResource White}}" />
<Setter Property="BackgroundColor" Value="Transparent" />
<Setter Property="FontFamily" Value="OpenSansRegular" />
<Setter Property="FontSize" Value="14" />
<Setter Property="VisualStateManager.VisualStateGroups">
<VisualStateGroupList>
<VisualStateGroup x:Name="CommonStates">
<VisualState x:Name="Normal" />
<VisualState x:Name="Disabled">
<VisualState.Setters>
<Setter Property="TextColor" Value="{AppThemeBinding Light={StaticResource Gray300}, Dark={StaticResource Gray600}}" />
</VisualState.Setters>
</VisualState>
</VisualStateGroup>
</VisualStateGroupList>
</Setter>
</Style>
<Style TargetType="ListView">
<Setter Property="SeparatorColor" Value="{AppThemeBinding Light={StaticResource Gray200}, Dark={StaticResource Gray500}}" />
<Setter Property="RefreshControlColor" Value="{AppThemeBinding Light={StaticResource Gray900}, Dark={StaticResource Gray200}}" />
</Style>
<Style TargetType="Picker">
<Setter Property="TextColor" Value="{AppThemeBinding Light={StaticResource Gray900}, Dark={StaticResource White}}" />
<Setter Property="TitleColor" Value="{AppThemeBinding Light={StaticResource Gray900}, Dark={StaticResource Gray200}}" />
<Setter Property="BackgroundColor" Value="Transparent" />
<Setter Property="FontFamily" Value="OpenSansRegular"/>
<Setter Property="FontSize" Value="14"/>
<Setter Property="MinimumHeightRequest" Value="44"/>
<Setter Property="MinimumWidthRequest" Value="44"/>
<Setter Property="VisualStateManager.VisualStateGroups">
<VisualStateGroupList>
<VisualStateGroup x:Name="CommonStates">
<VisualState x:Name="Normal" />
<VisualState x:Name="Disabled">
<VisualState.Setters>
<Setter Property="TextColor" Value="{AppThemeBinding Light={StaticResource Gray300}, Dark={StaticResource Gray600}}" />
<Setter Property="TitleColor" Value="{AppThemeBinding Light={StaticResource Gray300}, Dark={StaticResource Gray600}}" />
</VisualState.Setters>
</VisualState>
</VisualStateGroup>
</VisualStateGroupList>
</Setter>
</Style>
<Style TargetType="ProgressBar">
<Setter Property="ProgressColor" Value="{AppThemeBinding Light={StaticResource Primary}, Dark={StaticResource White}}" />
<Setter Property="VisualStateManager.VisualStateGroups">
<VisualStateGroupList>
<VisualStateGroup x:Name="CommonStates">
<VisualState x:Name="Normal" />
<VisualState x:Name="Disabled">
<VisualState.Setters>
<Setter Property="ProgressColor" Value="{AppThemeBinding Light={StaticResource Gray300}, Dark={StaticResource Gray600}}" />
</VisualState.Setters>
</VisualState>
</VisualStateGroup>
</VisualStateGroupList>
</Setter>
</Style>
<Style TargetType="RadioButton">
<Setter Property="BackgroundColor" Value="Transparent"/>
<Setter Property="TextColor" Value="{AppThemeBinding Light={StaticResource Black}, Dark={StaticResource White}}" />
<Setter Property="FontFamily" Value="OpenSansRegular"/>
<Setter Property="FontSize" Value="14"/>
<Setter Property="MinimumHeightRequest" Value="44"/>
<Setter Property="MinimumWidthRequest" Value="44"/>
<Setter Property="VisualStateManager.VisualStateGroups">
<VisualStateGroupList>
<VisualStateGroup x:Name="CommonStates">
<VisualState x:Name="Normal" />
<VisualState x:Name="Disabled">
<VisualState.Setters>
<Setter Property="TextColor" Value="{AppThemeBinding Light={StaticResource Gray300}, Dark={StaticResource Gray600}}" />
</VisualState.Setters>
</VisualState>
</VisualStateGroup>
</VisualStateGroupList>
</Setter>
</Style>
<Style TargetType="RefreshView">
<Setter Property="RefreshColor" Value="{AppThemeBinding Light={StaticResource Gray900}, Dark={StaticResource Gray200}}" />
</Style>
<Style TargetType="SearchBar">
<Setter Property="TextColor" Value="{AppThemeBinding Light={StaticResource Gray900}, Dark={StaticResource White}}" />
<Setter Property="PlaceholderColor" Value="{StaticResource Gray500}" />
<Setter Property="CancelButtonColor" Value="{StaticResource Gray500}" />
<Setter Property="BackgroundColor" Value="Transparent" />
<Setter Property="FontFamily" Value="OpenSansRegular" />
<Setter Property="FontSize" Value="14" />
<Setter Property="MinimumHeightRequest" Value="44"/>
<Setter Property="MinimumWidthRequest" Value="44"/>
<Setter Property="VisualStateManager.VisualStateGroups">
<VisualStateGroupList>
<VisualStateGroup x:Name="CommonStates">
<VisualState x:Name="Normal" />
<VisualState x:Name="Disabled">
<VisualState.Setters>
<Setter Property="TextColor" Value="{AppThemeBinding Light={StaticResource Gray300}, Dark={StaticResource Gray600}}" />
<Setter Property="PlaceholderColor" Value="{AppThemeBinding Light={StaticResource Gray300}, Dark={StaticResource Gray600}}" />
</VisualState.Setters>
</VisualState>
</VisualStateGroup>
</VisualStateGroupList>
</Setter>
</Style>
<Style TargetType="SearchHandler">
<Setter Property="TextColor" Value="{AppThemeBinding Light={StaticResource Gray900}, Dark={StaticResource White}}" />
<Setter Property="PlaceholderColor" Value="{StaticResource Gray500}" />
<Setter Property="BackgroundColor" Value="Transparent" />
<Setter Property="FontFamily" Value="OpenSansRegular" />
<Setter Property="FontSize" Value="14" />
<Setter Property="VisualStateManager.VisualStateGroups">
<VisualStateGroupList>
<VisualStateGroup x:Name="CommonStates">
<VisualState x:Name="Normal" />
<VisualState x:Name="Disabled">
<VisualState.Setters>
<Setter Property="TextColor" Value="{AppThemeBinding Light={StaticResource Gray300}, Dark={StaticResource Gray600}}" />
<Setter Property="PlaceholderColor" Value="{AppThemeBinding Light={StaticResource Gray300}, Dark={StaticResource Gray600}}" />
</VisualState.Setters>
</VisualState>
</VisualStateGroup>
</VisualStateGroupList>
</Setter>
</Style>
<Style TargetType="Shadow">
<Setter Property="Radius" Value="15" />
<Setter Property="Opacity" Value="0.5" />
<Setter Property="Brush" Value="{AppThemeBinding Light={StaticResource White}, Dark={StaticResource White}}" />
<Setter Property="Offset" Value="10,10" />
</Style>
<Style TargetType="Slider">
<Setter Property="MinimumTrackColor" Value="{AppThemeBinding Light={StaticResource Primary}, Dark={StaticResource White}}" />
<Setter Property="MaximumTrackColor" Value="{AppThemeBinding Light={StaticResource Gray200}, Dark={StaticResource Gray600}}" />
<Setter Property="ThumbColor" Value="{AppThemeBinding Light={StaticResource Primary}, Dark={StaticResource White}}" />
<Setter Property="VisualStateManager.VisualStateGroups">
<VisualStateGroupList>
<VisualStateGroup x:Name="CommonStates">
<VisualState x:Name="Normal" />
<VisualState x:Name="Disabled">
<VisualState.Setters>
<Setter Property="MinimumTrackColor" Value="{AppThemeBinding Light={StaticResource Gray300}, Dark={StaticResource Gray600}}"/>
<Setter Property="MaximumTrackColor" Value="{AppThemeBinding Light={StaticResource Gray300}, Dark={StaticResource Gray600}}"/>
<Setter Property="ThumbColor" Value="{AppThemeBinding Light={StaticResource Gray300}, Dark={StaticResource Gray600}}"/>
</VisualState.Setters>
</VisualState>
</VisualStateGroup>
</VisualStateGroupList>
</Setter>
</Style>
<Style TargetType="SwipeItem">
<Setter Property="BackgroundColor" Value="{AppThemeBinding Light={StaticResource White}, Dark={StaticResource Black}}" />
</Style>
<Style TargetType="Switch">
<Setter Property="OnColor" Value="{AppThemeBinding Light={StaticResource Primary}, Dark={StaticResource White}}" />
<Setter Property="ThumbColor" Value="{StaticResource White}" />
<Setter Property="VisualStateManager.VisualStateGroups">
<VisualStateGroupList>
<VisualStateGroup x:Name="CommonStates">
<VisualState x:Name="Normal" />
<VisualState x:Name="Disabled">
<VisualState.Setters>
<Setter Property="OnColor" Value="{AppThemeBinding Light={StaticResource Gray300}, Dark={StaticResource Gray600}}" />
<Setter Property="ThumbColor" Value="{AppThemeBinding Light={StaticResource Gray300}, Dark={StaticResource Gray600}}" />
</VisualState.Setters>
</VisualState>
<VisualState x:Name="On">
<VisualState.Setters>
<Setter Property="OnColor" Value="{AppThemeBinding Light={StaticResource Secondary}, Dark={StaticResource Gray200}}" />
<Setter Property="ThumbColor" Value="{AppThemeBinding Light={StaticResource Primary}, Dark={StaticResource White}}" />
</VisualState.Setters>
</VisualState>
<VisualState x:Name="Off">
<VisualState.Setters>
<Setter Property="ThumbColor" Value="{AppThemeBinding Light={StaticResource Gray400}, Dark={StaticResource Gray500}}" />
</VisualState.Setters>
</VisualState>
</VisualStateGroup>
</VisualStateGroupList>
</Setter>
</Style>
<Style TargetType="TimePicker">
<Setter Property="TextColor" Value="{AppThemeBinding Light={StaticResource Gray900}, Dark={StaticResource White}}" />
<Setter Property="BackgroundColor" Value="Transparent"/>
<Setter Property="FontFamily" Value="OpenSansRegular"/>
<Setter Property="FontSize" Value="14"/>
<Setter Property="MinimumHeightRequest" Value="44"/>
<Setter Property="MinimumWidthRequest" Value="44"/>
<Setter Property="VisualStateManager.VisualStateGroups">
<VisualStateGroupList>
<VisualStateGroup x:Name="CommonStates">
<VisualState x:Name="Normal" />
<VisualState x:Name="Disabled">
<VisualState.Setters>
<Setter Property="TextColor" Value="{AppThemeBinding Light={StaticResource Gray300}, Dark={StaticResource Gray600}}" />
</VisualState.Setters>
</VisualState>
</VisualStateGroup>
</VisualStateGroupList>
</Setter>
</Style>
<Style TargetType="Page" ApplyToDerivedTypes="True">
<Setter Property="Padding" Value="0"/>
<Setter Property="BackgroundColor" Value="{AppThemeBinding Light={StaticResource White}, Dark={StaticResource Black}}" />
</Style>
<Style TargetType="Shell" ApplyToDerivedTypes="True">
<Setter Property="Shell.BackgroundColor" Value="{AppThemeBinding Light={StaticResource Primary}, Dark={StaticResource Gray950}}" />
<Setter Property="Shell.ForegroundColor" Value="{OnPlatform WinUI={StaticResource Primary}, Default={StaticResource White}}" />
<Setter Property="Shell.TitleColor" Value="{AppThemeBinding Light={StaticResource White}, Dark={StaticResource White}}" />
<Setter Property="Shell.DisabledColor" Value="{AppThemeBinding Light={StaticResource Gray200}, Dark={StaticResource Gray950}}" />
<Setter Property="Shell.UnselectedColor" Value="{AppThemeBinding Light={StaticResource Gray200}, Dark={StaticResource Gray200}}" />
<Setter Property="Shell.NavBarHasShadow" Value="False" />
<Setter Property="Shell.TabBarBackgroundColor" Value="{AppThemeBinding Light={StaticResource White}, Dark={StaticResource Black}}" />
<Setter Property="Shell.TabBarForegroundColor" Value="{AppThemeBinding Light={StaticResource Primary}, Dark={StaticResource White}}" />
<Setter Property="Shell.TabBarTitleColor" Value="{AppThemeBinding Light={StaticResource Primary}, Dark={StaticResource White}}" />
<Setter Property="Shell.TabBarUnselectedColor" Value="{AppThemeBinding Light={StaticResource Gray900}, Dark={StaticResource Gray200}}" />
</Style>
<Style TargetType="NavigationPage">
<Setter Property="BarBackgroundColor" Value="{AppThemeBinding Light={StaticResource Primary}, Dark={StaticResource Gray950}}" />
<Setter Property="BarTextColor" Value="{AppThemeBinding Light={StaticResource Gray200}, Dark={StaticResource White}}" />
<Setter Property="IconColor" Value="{AppThemeBinding Light={StaticResource Gray200}, Dark={StaticResource White}}" />
</Style>
<Style TargetType="TabbedPage">
<Setter Property="BarBackgroundColor" Value="{AppThemeBinding Light={StaticResource White}, Dark={StaticResource Gray950}}" />
<Setter Property="BarTextColor" Value="{AppThemeBinding Light={StaticResource Primary}, Dark={StaticResource White}}" />
<Setter Property="UnselectedTabColor" Value="{AppThemeBinding Light={StaticResource Gray200}, Dark={StaticResource Gray950}}" />
<Setter Property="SelectedTabColor" Value="{AppThemeBinding Light={StaticResource Gray950}, Dark={StaticResource Gray200}}" />
</Style>
</ResourceDictionary>

@ -1,74 +1,91 @@
<Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup>
<TargetFrameworks>net7.0-android;net7.0-ios;net7.0-maccatalyst</TargetFrameworks>
<TargetFrameworks Condition="$([MSBuild]::IsOSPlatform('windows'))">$(TargetFrameworks);net7.0-windows10.0.19041.0</TargetFrameworks>
<!-- Uncomment to also build the tizen app. You will need to install tizen by following this: https://github.com/Samsung/Tizen.NET -->
<!-- <TargetFrameworks>$(TargetFrameworks);net7.0-tizen</TargetFrameworks> -->
<OutputType>Exe</OutputType>
<RootNamespace>notus</RootNamespace>
<UseMaui>true</UseMaui>
<SingleProject>true</SingleProject>
<ImplicitUsings>enable</ImplicitUsings>
<!-- Display name -->
<ApplicationTitle>notus</ApplicationTitle>
<!-- App Identifier -->
<ApplicationId>com.companyname.notus</ApplicationId>
<ApplicationIdGuid>a687bb8a-5777-44d0-996e-4ed7d05f27b4</ApplicationIdGuid>
<!-- Versions -->
<ApplicationDisplayVersion>1.0</ApplicationDisplayVersion>
<ApplicationVersion>1</ApplicationVersion>
<SupportedOSPlatformVersion Condition="$([MSBuild]::GetTargetPlatformIdentifier('$(TargetFramework)')) == 'ios'">11.0</SupportedOSPlatformVersion>
<SupportedOSPlatformVersion Condition="$([MSBuild]::GetTargetPlatformIdentifier('$(TargetFramework)')) == 'maccatalyst'">13.1</SupportedOSPlatformVersion>
<SupportedOSPlatformVersion Condition="$([MSBuild]::GetTargetPlatformIdentifier('$(TargetFramework)')) == 'android'">21.0</SupportedOSPlatformVersion>
<SupportedOSPlatformVersion Condition="$([MSBuild]::GetTargetPlatformIdentifier('$(TargetFramework)')) == 'windows'">10.0.17763.0</SupportedOSPlatformVersion>
<TargetPlatformMinVersion Condition="$([MSBuild]::GetTargetPlatformIdentifier('$(TargetFramework)')) == 'windows'">10.0.17763.0</TargetPlatformMinVersion>
<SupportedOSPlatformVersion Condition="$([MSBuild]::GetTargetPlatformIdentifier('$(TargetFramework)')) == 'tizen'">6.5</SupportedOSPlatformVersion>
</PropertyGroup>
<ItemGroup>
<!-- App Icon -->
<MauiIcon Include="Resources\AppIcon\appicon.svg" ForegroundFile="Resources\AppIcon\appiconfg.svg" Color="#512BD4" />
<!-- Splash Screen -->
<MauiSplashScreen Include="Resources\Splash\splash.svg" Color="#512BD4" BaseSize="128,128" />
<!-- Images -->
<MauiImage Include="Resources\Images\*" />
<MauiImage Update="Resources\Images\dotnet_bot.svg" BaseSize="168,208" />
<!-- Custom Fonts -->
<MauiFont Include="Resources\Fonts\*" />
<!-- Raw Assets (also remove the "Resources\Raw" prefix) -->
<MauiAsset Include="Resources\Raw\**" LogicalName="%(RecursiveDir)%(Filename)%(Extension)" />
</ItemGroup>
<ItemGroup>
<PackageReference Include="CommunityToolkit.Maui" Version="5.0.0" />
<PackageReference Include="Microsoft.Extensions.Logging.Debug" Version="7.0.0" />
</ItemGroup>
<ItemGroup>
<Compile Update="ConnecPage.xaml.cs">
<DependentUpon>ConnecPage.xaml</DependentUpon>
</Compile>
<Compile Update="RecherPage.xaml.cs">
<DependentUpon>RecherPage.xaml</DependentUpon>
</Compile>
</ItemGroup>
<ItemGroup>
<MauiXaml Update="ConnecPage.xaml">
<Generator>MSBuild:Compile</Generator>
</MauiXaml>
<MauiXaml Update="RecherPage.xaml">
<Generator>MSBuild:Compile</Generator>
</MauiXaml>
</ItemGroup>
</Project>
<Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup>
<TargetFrameworks>net7.0-android;net7.0-ios;net7.0-maccatalyst</TargetFrameworks>
<TargetFrameworks Condition="$([MSBuild]::IsOSPlatform('windows'))">$(TargetFrameworks);net7.0-windows10.0.19041.0</TargetFrameworks>
<!-- Uncomment to also build the tizen app. You will need to install tizen by following this: https://github.com/Samsung/Tizen.NET -->
<!-- <TargetFrameworks>$(TargetFrameworks);net7.0-tizen</TargetFrameworks> -->
<OutputType>Exe</OutputType>
<RootNamespace>Notus_Vue</RootNamespace>
<UseMaui>true</UseMaui>
<SingleProject>true</SingleProject>
<ImplicitUsings>enable</ImplicitUsings>
<!-- Display name -->
<ApplicationTitle>notus</ApplicationTitle>
<!-- App Identifier -->
<ApplicationId>com.companyname.notus</ApplicationId>
<ApplicationIdGuid>a687bb8a-5777-44d0-996e-4ed7d05f27b4</ApplicationIdGuid>
<!-- Versions -->
<ApplicationDisplayVersion>1.0</ApplicationDisplayVersion>
<ApplicationVersion>1</ApplicationVersion>
<SupportedOSPlatformVersion Condition="$([MSBuild]::GetTargetPlatformIdentifier('$(TargetFramework)')) == 'ios'">11.0</SupportedOSPlatformVersion>
<SupportedOSPlatformVersion Condition="$([MSBuild]::GetTargetPlatformIdentifier('$(TargetFramework)')) == 'maccatalyst'">13.1</SupportedOSPlatformVersion>
<SupportedOSPlatformVersion Condition="$([MSBuild]::GetTargetPlatformIdentifier('$(TargetFramework)')) == 'android'">21.0</SupportedOSPlatformVersion>
<SupportedOSPlatformVersion Condition="$([MSBuild]::GetTargetPlatformIdentifier('$(TargetFramework)')) == 'windows'">10.0.17763.0</SupportedOSPlatformVersion>
<TargetPlatformMinVersion Condition="$([MSBuild]::GetTargetPlatformIdentifier('$(TargetFramework)')) == 'windows'">10.0.17763.0</TargetPlatformMinVersion>
<SupportedOSPlatformVersion Condition="$([MSBuild]::GetTargetPlatformIdentifier('$(TargetFramework)')) == 'tizen'">6.5</SupportedOSPlatformVersion>
</PropertyGroup>
<ItemGroup>
<!-- App Icon -->
<MauiIcon Include="Resources\AppIcon\appicon.svg" ForegroundFile="Resources\AppIcon\appiconfg.svg" Color="#512BD4" />
<!-- Splash Screen -->
<MauiSplashScreen Include="Resources\Splash\splash.svg" Color="#512BD4" BaseSize="128,128" />
<!-- Images -->
<MauiImage Include="Resources\Images\*" />
<MauiImage Update="Resources\Images\dotnet_bot.svg" BaseSize="168,208" />
<!-- Custom Fonts -->
<MauiFont Include="Resources\Fonts\*" />
<!-- Raw Assets (also remove the "Resources\Raw" prefix) -->
<MauiAsset Include="Resources\Raw\**" LogicalName="%(RecursiveDir)%(Filename)%(Extension)" />
</ItemGroup>
<ItemGroup>
<PackageReference Include="CommunityToolkit.Maui" Version="5.0.0" />
<PackageReference Include="Microsoft.Extensions.Logging.Debug" Version="7.0.0" />
</ItemGroup>
<ItemGroup>
<ProjectReference Include="..\Biblioteque_de_Class\Biblioteque_de_Class.csproj" />
<ProjectReference Include="..\Notus_Persistence\Notus_Persistance.csproj" />
</ItemGroup>
<ItemGroup>
<Compile Update="ConnecPage.xaml.cs">
<DependentUpon>ConnecPage.xaml</DependentUpon>
</Compile>
<Compile Update="InscrPage.xaml.cs">
<DependentUpon>InscrPage.xaml</DependentUpon>
</Compile>
<Compile Update="ProfilPage.xaml.cs">
<DependentUpon>ProfilPage.xaml</DependentUpon>
</Compile>
<Compile Update="RecherPage.xaml.cs">
<DependentUpon>RecherPage.xaml</DependentUpon>
</Compile>
</ItemGroup>
<ItemGroup>
<MauiXaml Update="ConnecPage.xaml">
<Generator>MSBuild:Compile</Generator>
</MauiXaml>
<MauiXaml Update="InscrPage.xaml">
<Generator>MSBuild:Compile</Generator>
</MauiXaml>
<MauiXaml Update="ProfilPage.xaml">
<Generator>MSBuild:Compile</Generator>
</MauiXaml>
<MauiXaml Update="RecherPage.xaml">
<Generator>MSBuild:Compile</Generator>
</MauiXaml>
</ItemGroup>
</Project>

@ -0,0 +1,55 @@

Microsoft Visual Studio Solution File, Format Version 12.00
# Visual Studio Version 17
VisualStudioVersion = 17.0.31611.283
MinimumVisualStudioVersion = 10.0.40219.1
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Notus_Vue", "notus_vue\Notus_Vue.csproj", "{561264A1-4611-40FB-A662-3EF65550CA71}"
ProjectSection(ProjectDependencies) = postProject
{184478A9-E14F-42E0-B963-B3A4474C9C1C} = {184478A9-E14F-42E0-B963-B3A4474C9C1C}
{92DD50C5-EEAD-44ED-AEFF-E21935725477} = {92DD50C5-EEAD-44ED-AEFF-E21935725477}
EndProjectSection
EndProject
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Biblioteque_de_Class", "Biblioteque_de_Class\Biblioteque_de_Class.csproj", "{92DD50C5-EEAD-44ED-AEFF-E21935725477}"
EndProject
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Notus_Console", "Notus_Console\Notus_Console.csproj", "{0A5E5F33-6B39-42BF-A46D-0752EDB666FB}"
EndProject
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Notus_Persistance", "Notus_Persistence\Notus_Persistance.csproj", "{184478A9-E14F-42E0-B963-B3A4474C9C1C}"
EndProject
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "UnitTests_Model", "Tests\UnitTests_Model\UnitTests_Model.csproj", "{CB4664CE-F451-401D-862F-4A74A80B8161}"
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "UnitTests_Persistance", "Tests\UnitTests_Persistance\UnitTests_Persistance.csproj", "{E2BCA278-8741-4116-B0E0-B20849D66739}"
EndProject
Global
GlobalSection(SolutionConfigurationPlatforms) = preSolution
Debug|Any CPU = Debug|Any CPU
Release|Any CPU = Release|Any CPU
EndGlobalSection
GlobalSection(ProjectConfigurationPlatforms) = postSolution
{92DD50C5-EEAD-44ED-AEFF-E21935725477}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{92DD50C5-EEAD-44ED-AEFF-E21935725477}.Debug|Any CPU.Build.0 = Debug|Any CPU
{92DD50C5-EEAD-44ED-AEFF-E21935725477}.Release|Any CPU.ActiveCfg = Release|Any CPU
{92DD50C5-EEAD-44ED-AEFF-E21935725477}.Release|Any CPU.Build.0 = Release|Any CPU
{0A5E5F33-6B39-42BF-A46D-0752EDB666FB}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{0A5E5F33-6B39-42BF-A46D-0752EDB666FB}.Debug|Any CPU.Build.0 = Debug|Any CPU
{0A5E5F33-6B39-42BF-A46D-0752EDB666FB}.Release|Any CPU.ActiveCfg = Release|Any CPU
{0A5E5F33-6B39-42BF-A46D-0752EDB666FB}.Release|Any CPU.Build.0 = Release|Any CPU
{184478A9-E14F-42E0-B963-B3A4474C9C1C}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{184478A9-E14F-42E0-B963-B3A4474C9C1C}.Debug|Any CPU.Build.0 = Debug|Any CPU
{184478A9-E14F-42E0-B963-B3A4474C9C1C}.Release|Any CPU.ActiveCfg = Release|Any CPU
{184478A9-E14F-42E0-B963-B3A4474C9C1C}.Release|Any CPU.Build.0 = Release|Any CPU
{CB4664CE-F451-401D-862F-4A74A80B8161}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{CB4664CE-F451-401D-862F-4A74A80B8161}.Debug|Any CPU.Build.0 = Debug|Any CPU
{CB4664CE-F451-401D-862F-4A74A80B8161}.Release|Any CPU.ActiveCfg = Release|Any CPU
{CB4664CE-F451-401D-862F-4A74A80B8161}.Release|Any CPU.Build.0 = Release|Any CPU
{E2BCA278-8741-4116-B0E0-B20849D66739}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{E2BCA278-8741-4116-B0E0-B20849D66739}.Debug|Any CPU.Build.0 = Debug|Any CPU
{E2BCA278-8741-4116-B0E0-B20849D66739}.Release|Any CPU.ActiveCfg = Release|Any CPU
{E2BCA278-8741-4116-B0E0-B20849D66739}.Release|Any CPU.Build.0 = Release|Any CPU
EndGlobalSection
GlobalSection(SolutionProperties) = preSolution
HideSolutionNode = FALSE
EndGlobalSection
GlobalSection(ExtensibilityGlobals) = postSolution
SolutionGuid = {61F7FB11-1E47-470C-91E2-47F8143E1572}
EndGlobalSection
EndGlobal
Loading…
Cancel
Save